From db9edcc1b7759d4456cdb603360eacd25e68ce6e Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 2 Oct 2013 17:08:28 -0500 Subject: [PATCH] msm: Remove files no longer buildable under arch/arm/mach-msm Removed the files to reduce efforts as we move driver code out of mach-msm. Change-Id: I899cf19477f00026c79f42c6ab5de2d327648233 Signed-off-by: Kumar Gala --- arch/arm/mach-msm/acpuclock-7627.c | 1228 -- arch/arm/mach-msm/acpuclock-7x30.c | 510 - arch/arm/mach-msm/acpuclock-8625q.c | 800 -- arch/arm/mach-msm/acpuclock-8625q.h | 29 - arch/arm/mach-msm/acpuclock-8x50.c | 715 -- arch/arm/mach-msm/acpuclock-8x60.c | 1105 -- arch/arm/mach-msm/acpuclock-9615.c | 367 - arch/arm/mach-msm/acpuclock-9625.c | 163 - arch/arm/mach-msm/acpuclock-fsm9xxx.c | 63 - arch/arm/mach-msm/arch-init-scorpion.S | 483 - arch/arm/mach-msm/audio-7627a-devices.c | 219 - arch/arm/mach-msm/board-8064-bt.c | 557 - arch/arm/mach-msm/board-8064-camera.c | 778 -- arch/arm/mach-msm/board-8064-display.c | 1110 -- arch/arm/mach-msm/board-8064-gpiomux.c | 2003 --- arch/arm/mach-msm/board-8064-gpu.c | 300 - arch/arm/mach-msm/board-8064-pmic.c | 571 - arch/arm/mach-msm/board-8064-regulator.c | 814 -- arch/arm/mach-msm/board-8064-storage.c | 412 - arch/arm/mach-msm/board-8064.c | 3885 ------ arch/arm/mach-msm/board-8064.h | 173 - arch/arm/mach-msm/board-8930-camera.c | 703 - arch/arm/mach-msm/board-8930-display.c | 900 -- arch/arm/mach-msm/board-8930-gpiomux.c | 898 -- arch/arm/mach-msm/board-8930-gpu.c | 191 - arch/arm/mach-msm/board-8930-pmic.c | 614 - .../mach-msm/board-8930-regulator-pm8038.c | 589 - .../mach-msm/board-8930-regulator-pm8917.c | 660 - arch/arm/mach-msm/board-8930-storage.c | 377 - arch/arm/mach-msm/board-8930.c | 2895 ----- arch/arm/mach-msm/board-8930.h | 170 - arch/arm/mach-msm/board-8960-camera.c | 936 -- arch/arm/mach-msm/board-8960-display.c | 1101 -- arch/arm/mach-msm/board-8960-gpiomux.c | 1122 -- arch/arm/mach-msm/board-8960-pmic.c | 629 - arch/arm/mach-msm/board-8960-regulator.c | 656 - arch/arm/mach-msm/board-8960-storage.c | 390 - arch/arm/mach-msm/board-8960.c | 3401 ----- arch/arm/mach-msm/board-8960.h | 96 - arch/arm/mach-msm/board-9615-display.c | 169 - arch/arm/mach-msm/board-9615-gpiomux.c | 402 - arch/arm/mach-msm/board-9615-regulator.c | 362 - arch/arm/mach-msm/board-9615-storage.c | 228 - arch/arm/mach-msm/board-9615.c | 1142 -- arch/arm/mach-msm/board-9615.h | 72 - arch/arm/mach-msm/board-9625-gpiomux.c | 363 - arch/arm/mach-msm/board-9625.c | 267 - arch/arm/mach-msm/board-dt-8660.c | 52 - arch/arm/mach-msm/board-dt-8960.c | 38 - arch/arm/mach-msm/board-fsm9xxx.c | 1017 -- arch/arm/mach-msm/board-halibut-keypad.c | 177 - arch/arm/mach-msm/board-halibut-panel.c | 73 - arch/arm/mach-msm/board-halibut.c | 110 - arch/arm/mach-msm/board-halibut.h | 20 - arch/arm/mach-msm/board-mahimahi-audio.c | 283 - arch/arm/mach-msm/board-mahimahi-flashlight.c | 279 - arch/arm/mach-msm/board-mahimahi-flashlight.h | 20 - arch/arm/mach-msm/board-mahimahi-keypad.c | 265 - arch/arm/mach-msm/board-mahimahi-microp.c | 2261 ---- arch/arm/mach-msm/board-mahimahi-mmc.c | 454 - arch/arm/mach-msm/board-mahimahi-panel.c | 998 -- arch/arm/mach-msm/board-mahimahi-rfkill.c | 122 - arch/arm/mach-msm/board-mahimahi-smb329.c | 177 - arch/arm/mach-msm/board-mahimahi-smb329.h | 32 - arch/arm/mach-msm/board-mahimahi-tpa2018d1.c | 368 - arch/arm/mach-msm/board-mahimahi-tpa2018d1.h | 35 - arch/arm/mach-msm/board-mahimahi-wifi.c | 146 - arch/arm/mach-msm/board-mahimahi.c | 87 - arch/arm/mach-msm/board-mahimahi.h | 175 - arch/arm/mach-msm/board-msm7627-regulator.c | 221 - arch/arm/mach-msm/board-msm7627-regulator.h | 21 - arch/arm/mach-msm/board-msm7627a-bt.c | 1029 -- arch/arm/mach-msm/board-msm7627a-camera.c | 1273 -- arch/arm/mach-msm/board-msm7627a-display.c | 1453 --- arch/arm/mach-msm/board-msm7627a-io.c | 926 -- arch/arm/mach-msm/board-msm7627a-storage.c | 413 - arch/arm/mach-msm/board-msm7627a-wlan.c | 406 - arch/arm/mach-msm/board-msm7627a.h | 114 - arch/arm/mach-msm/board-msm7x27.c | 2027 --- arch/arm/mach-msm/board-msm7x27a-regulator.c | 247 - arch/arm/mach-msm/board-msm7x27a-regulator.h | 21 - arch/arm/mach-msm/board-msm7x27a.c | 1197 -- arch/arm/mach-msm/board-msm7x30-regulator.c | 316 - arch/arm/mach-msm/board-msm7x30-regulator.h | 21 - arch/arm/mach-msm/board-msm7x30.c | 7402 ----------- arch/arm/mach-msm/board-msm8x60-camera.c | 543 - arch/arm/mach-msm/board-msm8x60-vcm.c | 168 - arch/arm/mach-msm/board-msm8x60.c | 10564 ---------------- arch/arm/mach-msm/board-qrd7627a.c | 1215 -- arch/arm/mach-msm/board-qsd8x50.c | 2548 ---- arch/arm/mach-msm/board-sapphire-gpio.c | 326 - arch/arm/mach-msm/board-sapphire-h2w.c | 545 - arch/arm/mach-msm/board-sapphire-keypad.c | 132 - arch/arm/mach-msm/board-sapphire-mmc.c | 486 - arch/arm/mach-msm/board-sapphire-panel.c | 1272 -- arch/arm/mach-msm/board-sapphire-rfkill.c | 105 - arch/arm/mach-msm/board-sapphire-wifi.c | 74 - arch/arm/mach-msm/board-sapphire.c | 117 - arch/arm/mach-msm/board-sapphire.h | 224 - arch/arm/mach-msm/board-storage-common-a.h | 99 - arch/arm/mach-msm/board-swordfish-keypad.c | 177 - arch/arm/mach-msm/board-swordfish-mmc.c | 263 - arch/arm/mach-msm/board-swordfish-panel.c | 116 - arch/arm/mach-msm/board-swordfish.c | 366 - arch/arm/mach-msm/board-swordfish.h | 48 - arch/arm/mach-msm/board-trout-gpio.c | 233 - arch/arm/mach-msm/board-trout-keypad.c | 345 - arch/arm/mach-msm/board-trout-mmc.c | 184 - arch/arm/mach-msm/board-trout-panel.c | 297 - arch/arm/mach-msm/board-trout-rfkill.c | 101 - arch/arm/mach-msm/board-trout-wifi.c | 74 - arch/arm/mach-msm/board-trout.c | 114 - arch/arm/mach-msm/board-trout.h | 162 - arch/arm/mach-msm/btpintest.c | 234 - arch/arm/mach-msm/clock-7x30.c | 3015 ----- arch/arm/mach-msm/clock-7x30.h | 155 - arch/arm/mach-msm/clock-8960.c | 7056 ----------- arch/arm/mach-msm/clock-8x60.c | 3910 ------ arch/arm/mach-msm/clock-9615.c | 1837 --- arch/arm/mach-msm/clock-9625.c | 2068 --- arch/arm/mach-msm/clock-dss-8960.c | 395 - arch/arm/mach-msm/clock-dss-8960.h | 20 - arch/arm/mach-msm/clock-fsm9xxx.c | 34 - arch/arm/mach-msm/clock-local.c | 1000 -- arch/arm/mach-msm/clock-local.h | 290 - arch/arm/mach-msm/clock-pcom-lookup.c | 515 - arch/arm/mach-msm/clock-pcom.c | 218 - arch/arm/mach-msm/clock-pcom.h | 172 - arch/arm/mach-msm/dal.c | 1326 -- arch/arm/mach-msm/dal_axi.c | 173 - arch/arm/mach-msm/dal_remotetest.c | 410 - arch/arm/mach-msm/dal_remotetest.h | 172 - arch/arm/mach-msm/devices-8064.c | 3466 ----- arch/arm/mach-msm/devices-8930.c | 1352 -- arch/arm/mach-msm/devices-8960.c | 4642 ------- arch/arm/mach-msm/devices-9615.c | 1602 --- arch/arm/mach-msm/devices-fsm9xxx.c | 443 - arch/arm/mach-msm/devices-iommu.c | 1093 -- arch/arm/mach-msm/devices-msm7x00.c | 534 - arch/arm/mach-msm/devices-msm7x01a.c | 776 -- arch/arm/mach-msm/devices-msm7x25.c | 990 -- arch/arm/mach-msm/devices-msm7x27.c | 919 -- arch/arm/mach-msm/devices-msm7x27a.c | 2200 ---- arch/arm/mach-msm/devices-msm7x2xa.h | 38 - arch/arm/mach-msm/devices-msm7x30.c | 1388 -- arch/arm/mach-msm/devices-msm8x60.c | 3186 ----- arch/arm/mach-msm/devices-msm8x60.h | 77 - arch/arm/mach-msm/devices-qsd8x50.c | 963 -- arch/arm/mach-msm/devices_htc.c | 450 - arch/arm/mach-msm/dfe-fsm9xxx.c | 433 - arch/arm/mach-msm/etm.c | 1036 -- arch/arm/mach-msm/footswitch-8x60.c | 724 -- arch/arm/mach-msm/footswitch-pcom.c | 325 - arch/arm/mach-msm/footswitch.h | 71 - arch/arm/mach-msm/gpiomux-7x27.c | 20 - arch/arm/mach-msm/gpiomux-7x30.c | 20 - arch/arm/mach-msm/gpiomux-8x50.c | 20 - arch/arm/mach-msm/gpiomux-8x60.c | 1731 --- arch/arm/mach-msm/gpiomux-8x60.h | 22 - arch/arm/mach-msm/gpiomux-v1.c | 47 - arch/arm/mach-msm/gpiomux-v1.h | 62 - arch/arm/mach-msm/gpiomux-v2.h | 56 - arch/arm/mach-msm/htc_35mm_jack.c | 397 - arch/arm/mach-msm/htc_acoustic.c | 239 - arch/arm/mach-msm/htc_acoustic_qsd.c | 315 - arch/arm/mach-msm/htc_akm_cal.c | 64 - arch/arm/mach-msm/htc_battery.c | 771 -- arch/arm/mach-msm/htc_headset.c | 1246 -- arch/arm/mach-msm/htc_power_supply.c | 616 - arch/arm/mach-msm/htc_pwrsink.c | 281 - arch/arm/mach-msm/htc_wifi_nvs.c | 55 - arch/arm/mach-msm/include/mach/bcm_bt_lpm.h | 36 - arch/arm/mach-msm/include/mach/board_htc.h | 78 - arch/arm/mach-msm/include/mach/gpio-tlmm-v1.h | 72 - arch/arm/mach-msm/include/mach/gpio-v1.h | 171 - arch/arm/mach-msm/include/mach/htc_headset.h | 173 - arch/arm/mach-msm/include/mach/irqs-7x00.h | 77 - .../mach-msm/include/mach/mdm-peripheral.h | 19 - arch/arm/mach-msm/include/mach/msm72k_otg.h | 172 - arch/arm/mach-msm/include/mach/msm_gpiomux.h | 38 - arch/arm/mach-msm/include/mach/msm_i2ckbd.h | 27 - .../mach-msm/include/mach/msm_iomap-7x00.h | 136 - arch/arm/mach-msm/include/mach/msm_otg.h | 78 - .../mach-msm/include/mach/msm_qdsp6_audiov2.h | 87 - .../include/mach/msm_serial_debugger.h | 26 - arch/arm/mach-msm/include/mach/msm_touchpad.h | 22 - .../include/mach/qdsp5/acdb_commands.h | 303 - .../include/mach/qdsp5/audio_acdb_def.h | 52 - .../mach-msm/include/mach/qdsp5/audio_acdbi.h | 132 - .../include/mach/qdsp5/qdsp5audplaycmdi.h | 129 - .../include/mach/qdsp5/qdsp5audplaymsg.h | 84 - .../include/mach/qdsp5/qdsp5audpreproc.h | 73 - .../include/mach/qdsp5/qdsp5jpegcmdi.h | 377 - .../include/mach/qdsp5/qdsp5jpegmsg.h | 177 - .../include/mach/qdsp5/qdsp5lpmcmdi.h | 82 - .../mach-msm/include/mach/qdsp5/qdsp5lpmmsg.h | 80 - .../include/mach/qdsp5/qdsp5rmtcmdi.h | 55 - .../mach-msm/include/mach/qdsp5/qdsp5rmtmsg.h | 55 - .../include/mach/qdsp5/qdsp5vdeccmdi.h | 189 - .../include/mach/qdsp5/qdsp5vdecmsg.h | 107 - .../include/mach/qdsp5/qdsp5venccmdi.h | 231 - .../include/mach/qdsp5/qdsp5vfecmdi.h | 910 -- .../mach-msm/include/mach/qdsp5/qdsp5vfemsg.h | 290 - .../mach-msm/include/mach/qdsp5/snd_adie.h | 86 - .../include/mach/qdsp5v2/acdb_commands.h | 303 - .../include/mach/qdsp5v2/audio_acdb_def.h | 51 - .../include/mach/qdsp5v2/audio_interct.h | 29 - .../mach-msm/include/mach/qdsp5v2/aux_pcm.h | 55 - .../include/mach/qdsp5v2/codec_utils.h | 140 - arch/arm/mach-msm/include/mach/qdsp5v2/lpa.h | 36 - .../mach-msm/include/mach/qdsp5v2/lpa_hw.h | 236 - .../include/mach/qdsp5v2/marimba_profile.h | 3201 ----- arch/arm/mach-msm/include/mach/qdsp5v2/mi2s.h | 50 - .../mach-msm/include/mach/qdsp5v2/mp3_funcs.h | 20 - .../mach-msm/include/mach/qdsp5v2/msm_lpa.h | 31 - .../mach-msm/include/mach/qdsp5v2/pcm_funcs.h | 19 - .../include/mach/qdsp5v2/qdsp5afecmdi.h | 125 - .../include/mach/qdsp5v2/qdsp5afemsg.h | 31 - .../include/mach/qdsp5v2/snddev_ecodec.h | 29 - .../include/mach/qdsp5v2/snddev_icodec.h | 41 - .../include/mach/qdsp5v2/snddev_mi2s.h | 36 - .../include/mach/qdsp5v2/snddev_virtual.h | 23 - .../arm/mach-msm/include/mach/qdsp5v2/voice.h | 117 - .../mach-msm/include/mach/qdsp6v2/apr_us_a.h | 98 - arch/arm/mach-msm/irq-vic.c | 723 -- arch/arm/mach-msm/irq.c | 607 - arch/arm/mach-msm/last_radio_log.c | 71 - arch/arm/mach-msm/lpm_resources.c | 1009 -- arch/arm/mach-msm/mdm.c | 489 - arch/arm/mach-msm/memory_topology.c | 171 - arch/arm/mach-msm/mpm-8625.c | 334 - arch/arm/mach-msm/mpm-8625.h | 30 - arch/arm/mach-msm/mpp.c | 96 - arch/arm/mach-msm/msm-keypad-devices.h | 22 - arch/arm/mach-msm/msm7k_fiq.c | 86 - arch/arm/mach-msm/msm7k_fiq_handler.S | 94 - .../arm/mach-msm/msm_bus/msm_bus_board_8064.c | 972 -- .../arm/mach-msm/msm_bus/msm_bus_board_8660.c | 928 -- .../arm/mach-msm/msm_bus/msm_bus_board_8930.c | 877 -- .../arm/mach-msm/msm_bus/msm_bus_board_8960.c | 1117 -- .../arm/mach-msm/msm_bus/msm_bus_board_9615.c | 317 - .../arm/mach-msm/msm_bus/msm_bus_board_9625.c | 1336 -- arch/arm/mach-msm/msm_cpu_pwrctl.c | 43 - arch/arm/mach-msm/msm_dsps.c | 757 -- arch/arm/mach-msm/msm_fault_handlers.c | 84 - arch/arm/mach-msm/msm_smem_iface.c | 46 - arch/arm/mach-msm/msm_smem_iface.h | 58 - arch/arm/mach-msm/msm_vp.c | 244 - arch/arm/mach-msm/msm_watchdog.c | 482 - arch/arm/mach-msm/msm_watchdog_asm.S | 84 - arch/arm/mach-msm/msm_xo.c | 387 - arch/arm/mach-msm/nand_partitions.c | 202 - arch/arm/mach-msm/perf_event_msm_l2.c | 946 -- arch/arm/mach-msm/perf_event_msm_pl310.c | 415 - arch/arm/mach-msm/platsmp-8625.c | 332 - arch/arm/mach-msm/pm2.c | 1768 --- arch/arm/mach-msm/pmic_debugfs.c | 1156 -- arch/arm/mach-msm/pmu.c | 62 - arch/arm/mach-msm/proc_comm.c | 158 - arch/arm/mach-msm/proc_comm_test.c | 125 - arch/arm/mach-msm/proccomm-regulator.c | 389 - arch/arm/mach-msm/proccomm-regulator.h | 77 - arch/arm/mach-msm/qdsp5/Makefile | 20 - arch/arm/mach-msm/qdsp5/adsp.c | 1509 --- arch/arm/mach-msm/qdsp5/adsp.h | 361 - arch/arm/mach-msm/qdsp5/adsp_6210.c | 283 - arch/arm/mach-msm/qdsp5/adsp_6220.c | 284 - arch/arm/mach-msm/qdsp5/adsp_6225.c | 328 - arch/arm/mach-msm/qdsp5/adsp_debug.c | 97 - arch/arm/mach-msm/qdsp5/adsp_driver.c | 744 -- arch/arm/mach-msm/qdsp5/adsp_info.c | 144 - .../mach-msm/qdsp5/adsp_jpeg_patch_event.c | 39 - .../arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c | 201 - arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c | 66 - arch/arm/mach-msm/qdsp5/adsp_rm.c | 194 - .../arm/mach-msm/qdsp5/adsp_vfe_patch_event.c | 54 - arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c | 244 - .../mach-msm/qdsp5/adsp_video_verify_cmd.c | 264 - .../mach-msm/qdsp5/adsp_videoenc_verify_cmd.c | 235 - arch/arm/mach-msm/qdsp5/audio_aac.c | 1972 --- arch/arm/mach-msm/qdsp5/audio_aac_in.c | 1527 --- arch/arm/mach-msm/qdsp5/audio_ac3.c | 1760 --- arch/arm/mach-msm/qdsp5/audio_acdb.c | 2704 ---- arch/arm/mach-msm/qdsp5/audio_amrnb.c | 1708 --- arch/arm/mach-msm/qdsp5/audio_amrnb_in.c | 1521 --- arch/arm/mach-msm/qdsp5/audio_amrwb.c | 1774 --- arch/arm/mach-msm/qdsp5/audio_evrc.c | 1701 --- arch/arm/mach-msm/qdsp5/audio_evrc_in.c | 1463 --- arch/arm/mach-msm/qdsp5/audio_fm.c | 169 - arch/arm/mach-msm/qdsp5/audio_in.c | 997 -- arch/arm/mach-msm/qdsp5/audio_lpa.c | 1520 --- arch/arm/mach-msm/qdsp5/audio_mp3.c | 2463 ---- arch/arm/mach-msm/qdsp5/audio_mvs.c | 1746 --- arch/arm/mach-msm/qdsp5/audio_out.c | 1234 -- arch/arm/mach-msm/qdsp5/audio_pcm.c | 1746 --- arch/arm/mach-msm/qdsp5/audio_pcm_in.c | 1011 -- arch/arm/mach-msm/qdsp5/audio_qcelp.c | 1698 --- arch/arm/mach-msm/qdsp5/audio_qcelp_in.c | 1468 --- arch/arm/mach-msm/qdsp5/audio_voice_lb.c | 369 - arch/arm/mach-msm/qdsp5/audio_voicememo.c | 982 -- arch/arm/mach-msm/qdsp5/audio_wma.c | 1851 --- arch/arm/mach-msm/qdsp5/audio_wmapro.c | 1837 --- arch/arm/mach-msm/qdsp5/audmgr.c | 526 - arch/arm/mach-msm/qdsp5/audmgr.h | 240 - arch/arm/mach-msm/qdsp5/audmgr_new.h | 197 - arch/arm/mach-msm/qdsp5/audpp.c | 1038 -- arch/arm/mach-msm/qdsp5/audpreproc.c | 430 - arch/arm/mach-msm/qdsp5/audrec.c | 273 - arch/arm/mach-msm/qdsp5/dsp_debug.c | 235 - arch/arm/mach-msm/qdsp5/dsp_debug.h | 28 - arch/arm/mach-msm/qdsp5/evlog.h | 125 - arch/arm/mach-msm/qdsp5/snd.c | 675 - arch/arm/mach-msm/qdsp5/snd_adie.c | 490 - arch/arm/mach-msm/qdsp5/snd_cad.c | 608 - arch/arm/mach-msm/qdsp5/snd_pcm_client.c | 522 - arch/arm/mach-msm/qdsp5v2/Makefile | 22 - arch/arm/mach-msm/qdsp5v2/adsp.c | 1225 -- arch/arm/mach-msm/qdsp5v2/adsp.h | 339 - arch/arm/mach-msm/qdsp5v2/adsp_driver.c | 560 - arch/arm/mach-msm/qdsp5v2/adsp_info.c | 121 - arch/arm/mach-msm/qdsp5v2/afe.c | 534 - arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c | 1041 -- arch/arm/mach-msm/qdsp5v2/audio_aac.c | 2036 --- arch/arm/mach-msm/qdsp5v2/audio_aac_in.c | 1482 --- arch/arm/mach-msm/qdsp5v2/audio_acdb.c | 3429 ----- arch/arm/mach-msm/qdsp5v2/audio_adpcm.c | 1753 --- arch/arm/mach-msm/qdsp5v2/audio_amrnb.c | 1644 --- arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c | 950 -- arch/arm/mach-msm/qdsp5v2/audio_amrwb.c | 1726 --- arch/arm/mach-msm/qdsp5v2/audio_dev_ctl.c | 1328 -- arch/arm/mach-msm/qdsp5v2/audio_evrc.c | 1639 --- arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c | 1586 --- arch/arm/mach-msm/qdsp5v2/audio_fm.c | 357 - arch/arm/mach-msm/qdsp5v2/audio_interct.c | 124 - arch/arm/mach-msm/qdsp5v2/audio_lpa.c | 1780 --- arch/arm/mach-msm/qdsp5v2/audio_mp3.c | 2388 ---- arch/arm/mach-msm/qdsp5v2/audio_mvs.c | 1766 --- arch/arm/mach-msm/qdsp5v2/audio_out.c | 775 -- arch/arm/mach-msm/qdsp5v2/audio_pcm.c | 1577 --- arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c | 1027 -- arch/arm/mach-msm/qdsp5v2/audio_qcelp.c | 1638 --- arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c | 1591 --- arch/arm/mach-msm/qdsp5v2/audio_wma.c | 1860 --- arch/arm/mach-msm/qdsp5v2/audio_wmapro.c | 1814 --- arch/arm/mach-msm/qdsp5v2/audpp.c | 1140 -- arch/arm/mach-msm/qdsp5v2/audpreproc.c | 527 - arch/arm/mach-msm/qdsp5v2/aux_pcm.c | 280 - arch/arm/mach-msm/qdsp5v2/lpa.c | 608 - arch/arm/mach-msm/qdsp5v2/mi2s.c | 885 -- arch/arm/mach-msm/qdsp5v2/mp3_funcs.c | 45 - arch/arm/mach-msm/qdsp5v2/pcm_funcs.c | 47 - .../mach-msm/qdsp5v2/snddev_data_marimba.c | 1537 --- .../mach-msm/qdsp5v2/snddev_data_timpani.c | 1006 -- arch/arm/mach-msm/qdsp5v2/snddev_ecodec.c | 484 - arch/arm/mach-msm/qdsp5v2/snddev_icodec.c | 1218 -- arch/arm/mach-msm/qdsp5v2/snddev_mi2s.c | 405 - arch/arm/mach-msm/qdsp5v2/snddev_virtual.c | 122 - .../mach-msm/qdsp5v2/timpani_profile_7x30.h | 623 - arch/arm/mach-msm/qdsp5v2/voice.c | 752 -- arch/arm/mach-msm/qdsp6/Makefile | 19 - arch/arm/mach-msm/qdsp6/aac_in.c | 470 - arch/arm/mach-msm/qdsp6/amrnb_in.c | 277 - arch/arm/mach-msm/qdsp6/analog_audio.c | 94 - arch/arm/mach-msm/qdsp6/audio_ctl.c | 179 - arch/arm/mach-msm/qdsp6/audiov2/Makefile | 12 - arch/arm/mach-msm/qdsp6/audiov2/aac_in.c | 266 - arch/arm/mach-msm/qdsp6/audiov2/amrnb_in.c | 237 - .../arm/mach-msm/qdsp6/audiov2/analog_audio.c | 85 - arch/arm/mach-msm/qdsp6/audiov2/audio_ctl.c | 140 - arch/arm/mach-msm/qdsp6/audiov2/dal_acdb.h | 71 - arch/arm/mach-msm/qdsp6/audiov2/dal_adie.h | 89 - arch/arm/mach-msm/qdsp6/audiov2/dal_audio.h | 546 - .../mach-msm/qdsp6/audiov2/dal_audio_format.h | 284 - arch/arm/mach-msm/qdsp6/audiov2/dal_voice.h | 69 - arch/arm/mach-msm/qdsp6/audiov2/evrc_in.c | 250 - arch/arm/mach-msm/qdsp6/audiov2/mp3.c | 205 - arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c | 208 - arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c | 196 - arch/arm/mach-msm/qdsp6/audiov2/q6audio.c | 1315 -- .../mach-msm/qdsp6/audiov2/q6audio_devices.h | 276 - arch/arm/mach-msm/qdsp6/audiov2/qcelp_in.c | 255 - arch/arm/mach-msm/qdsp6/audiov2/routing.c | 73 - arch/arm/mach-msm/qdsp6/audiov2/voice.c | 188 - arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c | 190 - arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c | 191 - arch/arm/mach-msm/qdsp6/dal.c | 727 -- arch/arm/mach-msm/qdsp6/dal.h | 96 - arch/arm/mach-msm/qdsp6/dal_acdb.h | 69 - arch/arm/mach-msm/qdsp6/dal_adie.h | 104 - arch/arm/mach-msm/qdsp6/dal_audio.h | 604 - arch/arm/mach-msm/qdsp6/dal_audio_format.h | 270 - arch/arm/mach-msm/qdsp6/dsp_debug.c | 179 - arch/arm/mach-msm/qdsp6/dtmf.c | 126 - arch/arm/mach-msm/qdsp6/evrc_in.c | 468 - arch/arm/mach-msm/qdsp6/mp3.c | 249 - arch/arm/mach-msm/qdsp6/msm_q6vdec.c | 1509 --- arch/arm/mach-msm/qdsp6/msm_q6venc.c | 1200 -- arch/arm/mach-msm/qdsp6/pcm_in.c | 264 - arch/arm/mach-msm/qdsp6/pcm_out.c | 276 - arch/arm/mach-msm/qdsp6/q6audio.c | 2157 ---- arch/arm/mach-msm/qdsp6/q6audio_devices.h | 334 - arch/arm/mach-msm/qdsp6/qcelp_in.c | 475 - arch/arm/mach-msm/qdsp6/routing.c | 78 - arch/arm/mach-msm/qdsp6v2/apr_v1.c | 139 - arch/arm/mach-msm/qdsp6v2/audio_acdb.c | 964 -- .../mach-msm/qdsp6v2/board-msm8x60-audio.c | 2718 ---- arch/arm/mach-msm/qdsp6v2/q6audio_v1.c | 92 - arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c | 222 - arch/arm/mach-msm/qdsp6v2/q6core.c | 439 - arch/arm/mach-msm/qdsp6v2/rtac.c | 1049 -- .../arm/mach-msm/qdsp6v2/ultrasound/q6usm_a.c | 1168 -- arch/arm/mach-msm/restart-fsm9xxx.c | 42 - arch/arm/mach-msm/restart_7k.c | 98 - arch/arm/mach-msm/rfic-fsm9xxx.c | 397 - arch/arm/mach-msm/rpcrouter_sdio_xprt.c | 655 - arch/arm/mach-msm/rpm-regulator-8660.c | 294 - arch/arm/mach-msm/rpm-regulator-8930.c | 436 - arch/arm/mach-msm/rpm-regulator-8960.c | 356 - arch/arm/mach-msm/rpm-regulator-9615.c | 259 - arch/arm/mach-msm/rpm-regulator.c | 1940 --- arch/arm/mach-msm/saw-regulator.c | 294 - arch/arm/mach-msm/sdio_al.c | 4365 ------- arch/arm/mach-msm/sdio_al_dloader.c | 2574 ---- arch/arm/mach-msm/sdio_al_private.h | 267 - arch/arm/mach-msm/sdio_al_test.c | 6500 ---------- arch/arm/mach-msm/sdio_cmux.c | 901 -- arch/arm/mach-msm/sdio_ctl.c | 575 - arch/arm/mach-msm/sdio_dmux.c | 925 -- arch/arm/mach-msm/sdio_smem.c | 175 - arch/arm/mach-msm/sdio_tty.c | 824 -- arch/arm/mach-msm/sirc-fsm9xxx.c | 166 - arch/arm/mach-msm/sirc.c | 229 - arch/arm/mach-msm/spm.c | 308 - arch/arm/mach-msm/timer_page.c | 36 - arch/arm/mach-msm/vreg.c | 325 - arch/arm/mach-msm/wallclk.c | 475 - arch/arm/mach-msm/wallclk.h | 46 - arch/arm/mach-msm/wallclk_sysfs.c | 308 - arch/arm/mach-msm/xo-fsm9xxx.c | 289 - 439 files changed, 302537 deletions(-) delete mode 100644 arch/arm/mach-msm/acpuclock-7627.c delete mode 100644 arch/arm/mach-msm/acpuclock-7x30.c delete mode 100644 arch/arm/mach-msm/acpuclock-8625q.c delete mode 100644 arch/arm/mach-msm/acpuclock-8625q.h delete mode 100644 arch/arm/mach-msm/acpuclock-8x50.c delete mode 100644 arch/arm/mach-msm/acpuclock-8x60.c delete mode 100644 arch/arm/mach-msm/acpuclock-9615.c delete mode 100644 arch/arm/mach-msm/acpuclock-9625.c delete mode 100644 arch/arm/mach-msm/acpuclock-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/arch-init-scorpion.S delete mode 100644 arch/arm/mach-msm/audio-7627a-devices.c delete mode 100644 arch/arm/mach-msm/board-8064-bt.c delete mode 100644 arch/arm/mach-msm/board-8064-camera.c delete mode 100644 arch/arm/mach-msm/board-8064-display.c delete mode 100644 arch/arm/mach-msm/board-8064-gpiomux.c delete mode 100644 arch/arm/mach-msm/board-8064-gpu.c delete mode 100644 arch/arm/mach-msm/board-8064-pmic.c delete mode 100644 arch/arm/mach-msm/board-8064-regulator.c delete mode 100644 arch/arm/mach-msm/board-8064-storage.c delete mode 100644 arch/arm/mach-msm/board-8064.c delete mode 100644 arch/arm/mach-msm/board-8064.h delete mode 100644 arch/arm/mach-msm/board-8930-camera.c delete mode 100644 arch/arm/mach-msm/board-8930-display.c delete mode 100644 arch/arm/mach-msm/board-8930-gpiomux.c delete mode 100644 arch/arm/mach-msm/board-8930-gpu.c delete mode 100644 arch/arm/mach-msm/board-8930-pmic.c delete mode 100644 arch/arm/mach-msm/board-8930-regulator-pm8038.c delete mode 100644 arch/arm/mach-msm/board-8930-regulator-pm8917.c delete mode 100644 arch/arm/mach-msm/board-8930-storage.c delete mode 100644 arch/arm/mach-msm/board-8930.c delete mode 100644 arch/arm/mach-msm/board-8930.h delete mode 100644 arch/arm/mach-msm/board-8960-camera.c delete mode 100644 arch/arm/mach-msm/board-8960-display.c delete mode 100644 arch/arm/mach-msm/board-8960-gpiomux.c delete mode 100644 arch/arm/mach-msm/board-8960-pmic.c delete mode 100644 arch/arm/mach-msm/board-8960-regulator.c delete mode 100644 arch/arm/mach-msm/board-8960-storage.c delete mode 100644 arch/arm/mach-msm/board-8960.c delete mode 100644 arch/arm/mach-msm/board-8960.h delete mode 100644 arch/arm/mach-msm/board-9615-display.c delete mode 100644 arch/arm/mach-msm/board-9615-gpiomux.c delete mode 100644 arch/arm/mach-msm/board-9615-regulator.c delete mode 100644 arch/arm/mach-msm/board-9615-storage.c delete mode 100644 arch/arm/mach-msm/board-9615.c delete mode 100644 arch/arm/mach-msm/board-9615.h delete mode 100644 arch/arm/mach-msm/board-9625-gpiomux.c delete mode 100644 arch/arm/mach-msm/board-9625.c delete mode 100644 arch/arm/mach-msm/board-dt-8660.c delete mode 100644 arch/arm/mach-msm/board-dt-8960.c delete mode 100644 arch/arm/mach-msm/board-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/board-halibut-keypad.c delete mode 100644 arch/arm/mach-msm/board-halibut-panel.c delete mode 100644 arch/arm/mach-msm/board-halibut.c delete mode 100644 arch/arm/mach-msm/board-halibut.h delete mode 100644 arch/arm/mach-msm/board-mahimahi-audio.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-flashlight.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-flashlight.h delete mode 100644 arch/arm/mach-msm/board-mahimahi-keypad.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-microp.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-mmc.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-panel.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-rfkill.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-smb329.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-smb329.h delete mode 100644 arch/arm/mach-msm/board-mahimahi-tpa2018d1.c delete mode 100644 arch/arm/mach-msm/board-mahimahi-tpa2018d1.h delete mode 100644 arch/arm/mach-msm/board-mahimahi-wifi.c delete mode 100644 arch/arm/mach-msm/board-mahimahi.c delete mode 100644 arch/arm/mach-msm/board-mahimahi.h delete mode 100644 arch/arm/mach-msm/board-msm7627-regulator.c delete mode 100644 arch/arm/mach-msm/board-msm7627-regulator.h delete mode 100644 arch/arm/mach-msm/board-msm7627a-bt.c delete mode 100644 arch/arm/mach-msm/board-msm7627a-camera.c delete mode 100644 arch/arm/mach-msm/board-msm7627a-display.c delete mode 100644 arch/arm/mach-msm/board-msm7627a-io.c delete mode 100644 arch/arm/mach-msm/board-msm7627a-storage.c delete mode 100644 arch/arm/mach-msm/board-msm7627a-wlan.c delete mode 100644 arch/arm/mach-msm/board-msm7627a.h delete mode 100644 arch/arm/mach-msm/board-msm7x27.c delete mode 100644 arch/arm/mach-msm/board-msm7x27a-regulator.c delete mode 100644 arch/arm/mach-msm/board-msm7x27a-regulator.h delete mode 100644 arch/arm/mach-msm/board-msm7x27a.c delete mode 100644 arch/arm/mach-msm/board-msm7x30-regulator.c delete mode 100644 arch/arm/mach-msm/board-msm7x30-regulator.h delete mode 100644 arch/arm/mach-msm/board-msm7x30.c delete mode 100644 arch/arm/mach-msm/board-msm8x60-camera.c delete mode 100644 arch/arm/mach-msm/board-msm8x60-vcm.c delete mode 100644 arch/arm/mach-msm/board-msm8x60.c delete mode 100644 arch/arm/mach-msm/board-qrd7627a.c delete mode 100644 arch/arm/mach-msm/board-qsd8x50.c delete mode 100644 arch/arm/mach-msm/board-sapphire-gpio.c delete mode 100644 arch/arm/mach-msm/board-sapphire-h2w.c delete mode 100644 arch/arm/mach-msm/board-sapphire-keypad.c delete mode 100644 arch/arm/mach-msm/board-sapphire-mmc.c delete mode 100644 arch/arm/mach-msm/board-sapphire-panel.c delete mode 100644 arch/arm/mach-msm/board-sapphire-rfkill.c delete mode 100644 arch/arm/mach-msm/board-sapphire-wifi.c delete mode 100644 arch/arm/mach-msm/board-sapphire.c delete mode 100644 arch/arm/mach-msm/board-sapphire.h delete mode 100644 arch/arm/mach-msm/board-storage-common-a.h delete mode 100644 arch/arm/mach-msm/board-swordfish-keypad.c delete mode 100644 arch/arm/mach-msm/board-swordfish-mmc.c delete mode 100644 arch/arm/mach-msm/board-swordfish-panel.c delete mode 100644 arch/arm/mach-msm/board-swordfish.c delete mode 100644 arch/arm/mach-msm/board-swordfish.h delete mode 100644 arch/arm/mach-msm/board-trout-gpio.c delete mode 100644 arch/arm/mach-msm/board-trout-keypad.c delete mode 100644 arch/arm/mach-msm/board-trout-mmc.c delete mode 100644 arch/arm/mach-msm/board-trout-panel.c delete mode 100644 arch/arm/mach-msm/board-trout-rfkill.c delete mode 100644 arch/arm/mach-msm/board-trout-wifi.c delete mode 100644 arch/arm/mach-msm/board-trout.c delete mode 100644 arch/arm/mach-msm/board-trout.h delete mode 100644 arch/arm/mach-msm/btpintest.c delete mode 100644 arch/arm/mach-msm/clock-7x30.c delete mode 100644 arch/arm/mach-msm/clock-7x30.h delete mode 100644 arch/arm/mach-msm/clock-8960.c delete mode 100644 arch/arm/mach-msm/clock-8x60.c delete mode 100644 arch/arm/mach-msm/clock-9615.c delete mode 100644 arch/arm/mach-msm/clock-9625.c delete mode 100644 arch/arm/mach-msm/clock-dss-8960.c delete mode 100644 arch/arm/mach-msm/clock-dss-8960.h delete mode 100644 arch/arm/mach-msm/clock-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/clock-local.c delete mode 100644 arch/arm/mach-msm/clock-local.h delete mode 100644 arch/arm/mach-msm/clock-pcom-lookup.c delete mode 100644 arch/arm/mach-msm/clock-pcom.c delete mode 100644 arch/arm/mach-msm/clock-pcom.h delete mode 100644 arch/arm/mach-msm/dal.c delete mode 100644 arch/arm/mach-msm/dal_axi.c delete mode 100644 arch/arm/mach-msm/dal_remotetest.c delete mode 100644 arch/arm/mach-msm/dal_remotetest.h delete mode 100644 arch/arm/mach-msm/devices-8064.c delete mode 100644 arch/arm/mach-msm/devices-8930.c delete mode 100644 arch/arm/mach-msm/devices-8960.c delete mode 100644 arch/arm/mach-msm/devices-9615.c delete mode 100644 arch/arm/mach-msm/devices-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/devices-iommu.c delete mode 100644 arch/arm/mach-msm/devices-msm7x00.c delete mode 100644 arch/arm/mach-msm/devices-msm7x01a.c delete mode 100644 arch/arm/mach-msm/devices-msm7x25.c delete mode 100644 arch/arm/mach-msm/devices-msm7x27.c delete mode 100644 arch/arm/mach-msm/devices-msm7x27a.c delete mode 100644 arch/arm/mach-msm/devices-msm7x2xa.h delete mode 100644 arch/arm/mach-msm/devices-msm7x30.c delete mode 100644 arch/arm/mach-msm/devices-msm8x60.c delete mode 100644 arch/arm/mach-msm/devices-msm8x60.h delete mode 100644 arch/arm/mach-msm/devices-qsd8x50.c delete mode 100644 arch/arm/mach-msm/devices_htc.c delete mode 100644 arch/arm/mach-msm/dfe-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/etm.c delete mode 100644 arch/arm/mach-msm/footswitch-8x60.c delete mode 100644 arch/arm/mach-msm/footswitch-pcom.c delete mode 100644 arch/arm/mach-msm/footswitch.h delete mode 100644 arch/arm/mach-msm/gpiomux-7x27.c delete mode 100644 arch/arm/mach-msm/gpiomux-7x30.c delete mode 100644 arch/arm/mach-msm/gpiomux-8x50.c delete mode 100644 arch/arm/mach-msm/gpiomux-8x60.c delete mode 100644 arch/arm/mach-msm/gpiomux-8x60.h delete mode 100644 arch/arm/mach-msm/gpiomux-v1.c delete mode 100644 arch/arm/mach-msm/gpiomux-v1.h delete mode 100644 arch/arm/mach-msm/gpiomux-v2.h delete mode 100644 arch/arm/mach-msm/htc_35mm_jack.c delete mode 100644 arch/arm/mach-msm/htc_acoustic.c delete mode 100644 arch/arm/mach-msm/htc_acoustic_qsd.c delete mode 100644 arch/arm/mach-msm/htc_akm_cal.c delete mode 100644 arch/arm/mach-msm/htc_battery.c delete mode 100644 arch/arm/mach-msm/htc_headset.c delete mode 100644 arch/arm/mach-msm/htc_power_supply.c delete mode 100644 arch/arm/mach-msm/htc_pwrsink.c delete mode 100644 arch/arm/mach-msm/htc_wifi_nvs.c delete mode 100644 arch/arm/mach-msm/include/mach/bcm_bt_lpm.h delete mode 100644 arch/arm/mach-msm/include/mach/board_htc.h delete mode 100644 arch/arm/mach-msm/include/mach/gpio-tlmm-v1.h delete mode 100644 arch/arm/mach-msm/include/mach/gpio-v1.h delete mode 100644 arch/arm/mach-msm/include/mach/htc_headset.h delete mode 100644 arch/arm/mach-msm/include/mach/irqs-7x00.h delete mode 100644 arch/arm/mach-msm/include/mach/mdm-peripheral.h delete mode 100644 arch/arm/mach-msm/include/mach/msm72k_otg.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_gpiomux.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_i2ckbd.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_iomap-7x00.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_otg.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_qdsp6_audiov2.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_serial_debugger.h delete mode 100644 arch/arm/mach-msm/include/mach/msm_touchpad.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/acdb_commands.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/audio_acdb_def.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/audio_acdbi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaycmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaymsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5audpreproc.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegcmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegmsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmcmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmmsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtcmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtmsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdeccmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdecmsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5venccmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfecmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfemsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5/snd_adie.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/acdb_commands.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/audio_acdb_def.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/audio_interct.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/aux_pcm.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/lpa.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/lpa_hw.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/marimba_profile.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/mi2s.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/mp3_funcs.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/msm_lpa.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/pcm_funcs.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afecmdi.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afemsg.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/snddev_ecodec.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/snddev_icodec.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/snddev_mi2s.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/snddev_virtual.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp5v2/voice.h delete mode 100644 arch/arm/mach-msm/include/mach/qdsp6v2/apr_us_a.h delete mode 100644 arch/arm/mach-msm/irq-vic.c delete mode 100644 arch/arm/mach-msm/irq.c delete mode 100644 arch/arm/mach-msm/last_radio_log.c delete mode 100644 arch/arm/mach-msm/lpm_resources.c delete mode 100644 arch/arm/mach-msm/mdm.c delete mode 100644 arch/arm/mach-msm/memory_topology.c delete mode 100644 arch/arm/mach-msm/mpm-8625.c delete mode 100644 arch/arm/mach-msm/mpm-8625.h delete mode 100644 arch/arm/mach-msm/mpp.c delete mode 100644 arch/arm/mach-msm/msm-keypad-devices.h delete mode 100644 arch/arm/mach-msm/msm7k_fiq.c delete mode 100644 arch/arm/mach-msm/msm7k_fiq_handler.S delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_8064.c delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_8930.c delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_9615.c delete mode 100644 arch/arm/mach-msm/msm_bus/msm_bus_board_9625.c delete mode 100644 arch/arm/mach-msm/msm_cpu_pwrctl.c delete mode 100644 arch/arm/mach-msm/msm_dsps.c delete mode 100644 arch/arm/mach-msm/msm_fault_handlers.c delete mode 100644 arch/arm/mach-msm/msm_smem_iface.c delete mode 100644 arch/arm/mach-msm/msm_smem_iface.h delete mode 100644 arch/arm/mach-msm/msm_vp.c delete mode 100644 arch/arm/mach-msm/msm_watchdog.c delete mode 100644 arch/arm/mach-msm/msm_watchdog_asm.S delete mode 100644 arch/arm/mach-msm/msm_xo.c delete mode 100644 arch/arm/mach-msm/nand_partitions.c delete mode 100644 arch/arm/mach-msm/perf_event_msm_l2.c delete mode 100644 arch/arm/mach-msm/perf_event_msm_pl310.c delete mode 100644 arch/arm/mach-msm/platsmp-8625.c delete mode 100644 arch/arm/mach-msm/pm2.c delete mode 100644 arch/arm/mach-msm/pmic_debugfs.c delete mode 100644 arch/arm/mach-msm/pmu.c delete mode 100644 arch/arm/mach-msm/proc_comm.c delete mode 100644 arch/arm/mach-msm/proc_comm_test.c delete mode 100644 arch/arm/mach-msm/proccomm-regulator.c delete mode 100644 arch/arm/mach-msm/proccomm-regulator.h delete mode 100644 arch/arm/mach-msm/qdsp5/Makefile delete mode 100644 arch/arm/mach-msm/qdsp5/adsp.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp.h delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_6210.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_6220.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_6225.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_debug.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_driver.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_info.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_jpeg_patch_event.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_rm.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_vfe_patch_event.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c delete mode 100644 arch/arm/mach-msm/qdsp5/adsp_videoenc_verify_cmd.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_aac.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_aac_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_ac3.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_acdb.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_amrnb.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_amrnb_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_amrwb.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_evrc.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_evrc_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_fm.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_lpa.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_mp3.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_mvs.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_out.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_pcm.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_pcm_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_qcelp.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_qcelp_in.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_voice_lb.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_voicememo.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_wma.c delete mode 100644 arch/arm/mach-msm/qdsp5/audio_wmapro.c delete mode 100644 arch/arm/mach-msm/qdsp5/audmgr.c delete mode 100644 arch/arm/mach-msm/qdsp5/audmgr.h delete mode 100644 arch/arm/mach-msm/qdsp5/audmgr_new.h delete mode 100644 arch/arm/mach-msm/qdsp5/audpp.c delete mode 100644 arch/arm/mach-msm/qdsp5/audpreproc.c delete mode 100644 arch/arm/mach-msm/qdsp5/audrec.c delete mode 100644 arch/arm/mach-msm/qdsp5/dsp_debug.c delete mode 100644 arch/arm/mach-msm/qdsp5/dsp_debug.h delete mode 100644 arch/arm/mach-msm/qdsp5/evlog.h delete mode 100644 arch/arm/mach-msm/qdsp5/snd.c delete mode 100644 arch/arm/mach-msm/qdsp5/snd_adie.c delete mode 100644 arch/arm/mach-msm/qdsp5/snd_cad.c delete mode 100644 arch/arm/mach-msm/qdsp5/snd_pcm_client.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/Makefile delete mode 100644 arch/arm/mach-msm/qdsp5v2/adsp.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/adsp.h delete mode 100644 arch/arm/mach-msm/qdsp5v2/adsp_driver.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/adsp_info.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/afe.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_aac.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_aac_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_acdb.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_adpcm.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_amrnb.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_amrwb.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_dev_ctl.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_evrc.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_fm.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_interct.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_lpa.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_mp3.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_mvs.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_out.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_pcm.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_qcelp.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_wma.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audio_wmapro.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audpp.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/audpreproc.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/aux_pcm.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/lpa.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/mi2s.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/mp3_funcs.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/pcm_funcs.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_data_marimba.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_data_timpani.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_ecodec.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_icodec.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_mi2s.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/snddev_virtual.c delete mode 100644 arch/arm/mach-msm/qdsp5v2/timpani_profile_7x30.h delete mode 100644 arch/arm/mach-msm/qdsp5v2/voice.c delete mode 100644 arch/arm/mach-msm/qdsp6/Makefile delete mode 100644 arch/arm/mach-msm/qdsp6/aac_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/amrnb_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/analog_audio.c delete mode 100644 arch/arm/mach-msm/qdsp6/audio_ctl.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/Makefile delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/aac_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/amrnb_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/analog_audio.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/audio_ctl.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/dal_acdb.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/dal_adie.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/dal_audio.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/dal_audio_format.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/dal_voice.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/evrc_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/mp3.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/q6audio.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/q6audio_devices.h delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/qcelp_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/routing.c delete mode 100644 arch/arm/mach-msm/qdsp6/audiov2/voice.c delete mode 100644 arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c delete mode 100644 arch/arm/mach-msm/qdsp6/dal.c delete mode 100644 arch/arm/mach-msm/qdsp6/dal.h delete mode 100644 arch/arm/mach-msm/qdsp6/dal_acdb.h delete mode 100644 arch/arm/mach-msm/qdsp6/dal_adie.h delete mode 100644 arch/arm/mach-msm/qdsp6/dal_audio.h delete mode 100644 arch/arm/mach-msm/qdsp6/dal_audio_format.h delete mode 100644 arch/arm/mach-msm/qdsp6/dsp_debug.c delete mode 100644 arch/arm/mach-msm/qdsp6/dtmf.c delete mode 100644 arch/arm/mach-msm/qdsp6/evrc_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/mp3.c delete mode 100644 arch/arm/mach-msm/qdsp6/msm_q6vdec.c delete mode 100644 arch/arm/mach-msm/qdsp6/msm_q6venc.c delete mode 100644 arch/arm/mach-msm/qdsp6/pcm_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/pcm_out.c delete mode 100644 arch/arm/mach-msm/qdsp6/q6audio.c delete mode 100644 arch/arm/mach-msm/qdsp6/q6audio_devices.h delete mode 100644 arch/arm/mach-msm/qdsp6/qcelp_in.c delete mode 100644 arch/arm/mach-msm/qdsp6/routing.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/apr_v1.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/audio_acdb.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/board-msm8x60-audio.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/q6audio_v1.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/q6core.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/rtac.c delete mode 100644 arch/arm/mach-msm/qdsp6v2/ultrasound/q6usm_a.c delete mode 100644 arch/arm/mach-msm/restart-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/restart_7k.c delete mode 100644 arch/arm/mach-msm/rfic-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/rpcrouter_sdio_xprt.c delete mode 100644 arch/arm/mach-msm/rpm-regulator-8660.c delete mode 100644 arch/arm/mach-msm/rpm-regulator-8930.c delete mode 100644 arch/arm/mach-msm/rpm-regulator-8960.c delete mode 100644 arch/arm/mach-msm/rpm-regulator-9615.c delete mode 100644 arch/arm/mach-msm/rpm-regulator.c delete mode 100644 arch/arm/mach-msm/saw-regulator.c delete mode 100644 arch/arm/mach-msm/sdio_al.c delete mode 100644 arch/arm/mach-msm/sdio_al_dloader.c delete mode 100644 arch/arm/mach-msm/sdio_al_private.h delete mode 100644 arch/arm/mach-msm/sdio_al_test.c delete mode 100644 arch/arm/mach-msm/sdio_cmux.c delete mode 100644 arch/arm/mach-msm/sdio_ctl.c delete mode 100644 arch/arm/mach-msm/sdio_dmux.c delete mode 100644 arch/arm/mach-msm/sdio_smem.c delete mode 100644 arch/arm/mach-msm/sdio_tty.c delete mode 100644 arch/arm/mach-msm/sirc-fsm9xxx.c delete mode 100644 arch/arm/mach-msm/sirc.c delete mode 100644 arch/arm/mach-msm/spm.c delete mode 100644 arch/arm/mach-msm/timer_page.c delete mode 100644 arch/arm/mach-msm/vreg.c delete mode 100644 arch/arm/mach-msm/wallclk.c delete mode 100644 arch/arm/mach-msm/wallclk.h delete mode 100644 arch/arm/mach-msm/wallclk_sysfs.c delete mode 100644 arch/arm/mach-msm/xo-fsm9xxx.c diff --git a/arch/arm/mach-msm/acpuclock-7627.c b/arch/arm/mach-msm/acpuclock-7627.c deleted file mode 100644 index 79766c421a08..000000000000 --- a/arch/arm/mach-msm/acpuclock-7627.c +++ /dev/null @@ -1,1228 +0,0 @@ -/* - * MSM architecture clock driver - * - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2007-2012, The Linux Foundation. All rights reserved. - * Author: San Mehat - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "smd_private.h" -#include "acpuclock.h" - -#define A11S_CLK_CNTL_ADDR (MSM_CSR_BASE + 0x100) -#define A11S_CLK_SEL_ADDR (MSM_CSR_BASE + 0x104) -#define A11S_VDD_SVS_PLEVEL_ADDR (MSM_CSR_BASE + 0x124) - -#define PLL4_L_VAL_ADDR (MSM_CLK_CTL_BASE + 0x378) -#define PLL4_M_VAL_ADDR (MSM_CLK_CTL_BASE + 0x37C) -#define PLL4_N_VAL_ADDR (MSM_CLK_CTL_BASE + 0x380) - -#define POWER_COLLAPSE_KHZ 19200 - -/* Max CPU frequency allowed by hardware while in standby waiting for an irq. */ -#define MAX_WAIT_FOR_IRQ_KHZ 128000 - -/** - * enum - For acpuclock PLL IDs - */ -enum { - ACPU_PLL_0 = 0, - ACPU_PLL_1, - ACPU_PLL_2, - ACPU_PLL_3, - ACPU_PLL_4, - ACPU_PLL_TCXO, - ACPU_PLL_END, -}; - -struct acpu_clk_src { - struct clk *clk; - const char *name; -}; - -struct pll_config { - unsigned int l; - unsigned int m; - unsigned int n; -}; - -static struct acpu_clk_src pll_clk[ACPU_PLL_END] = { - [ACPU_PLL_0] = { .name = "pll0_clk" }, - [ACPU_PLL_1] = { .name = "pll1_clk" }, - [ACPU_PLL_2] = { .name = "pll2_clk" }, - [ACPU_PLL_4] = { .name = "pll4_clk" }, -}; - -static struct pll_config pll4_cfg_tbl[] = { - [0] = { 36, 1, 2 }, /* 700.8 MHz */ - [1] = { 52, 1, 2 }, /* 1008 MHz */ - [2] = { 63, 0, 1 }, /* 1209.6 MHz */ - [3] = { 73, 0, 1 }, /* 1401.6 MHz */ - [4] = { 60, 0, 1 }, /* 1152 MHz */ - [5] = { 57, 1, 2 }, /* 1104 MHz */ -}; - -struct clock_state { - struct clkctl_acpu_speed *current_speed; - struct mutex lock; - uint32_t max_speed_delta_khz; - struct clk *ebi1_clk; -}; - -struct clkctl_acpu_speed { - unsigned int use_for_scaling; - unsigned int a11clk_khz; - int pll; - unsigned int a11clk_src_sel; - unsigned int a11clk_src_div; - unsigned int ahbclk_khz; - unsigned int ahbclk_div; - int vdd; - unsigned int axiclk_khz; - struct pll_config *pll_rate; - unsigned long lpj; /* loops_per_jiffy */ - /* Pointers in acpu_freq_tbl[] for max up/down steppings. */ - struct clkctl_acpu_speed *down[ACPU_PLL_END]; - struct clkctl_acpu_speed *up[ACPU_PLL_END]; -}; - -static bool dynamic_reprogram; -static struct clock_state drv_state = { 0 }; -static struct clkctl_acpu_speed *acpu_freq_tbl; - -/* Switch to this when reprogramming PLL4 */ -static struct clkctl_acpu_speed *backup_s; - -/* - * ACPU freq tables used for different PLLs frequency combinations. The - * correct table is selected during init. - * - * Table stepping up/down entries are calculated during boot to choose the - * largest frequency jump that's less than max_speed_delta_khz on each PLL. - */ - -/* 7627 with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, 0, 30720 }, - { 0, 120000, ACPU_PLL_0, 4, 7, 60000, 1, 3, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 1, 61440, 1, 3, 61440 }, - { 0, 200000, ACPU_PLL_2, 2, 5, 66667, 2, 4, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 122880, 1, 4, 61440 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 160000, 1, 5, 160000 }, - { 0, 400000, ACPU_PLL_2, 2, 2, 133333, 2, 5, 160000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 160000, 2, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 200000, 2, 7, 200000 }, - { 0 } -}; - -/* 7627 with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, 0, 24576 }, - { 1, 98304, ACPU_PLL_1, 1, 1, 98304, 0, 3, 49152 }, - { 0, 120000, ACPU_PLL_0, 4, 7, 60000, 1, 3, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 65536, 2, 4, 98304 }, - { 0, 200000, ACPU_PLL_2, 2, 5, 66667, 2, 4, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 160000, 1, 5, 160000 }, - { 0, 400000, ACPU_PLL_2, 2, 2, 133333, 2, 5, 160000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 160000, 2, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 200000, 2, 7, 200000 }, - { 0 } -}; - -/* 7627 with GSM capable modem - PLL2 @ 800 */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_800_pll4_0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, 0, 30720 }, - { 0, 120000, ACPU_PLL_0, 4, 7, 60000, 1, 3, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 1, 61440, 1, 3, 61440 }, - { 0, 200000, ACPU_PLL_2, 2, 3, 66667, 2, 4, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 122880, 1, 4, 61440 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 160000, 1, 5, 160000 }, - { 0, 400000, ACPU_PLL_2, 2, 1, 133333, 2, 5, 160000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 160000, 2, 6, 160000 }, - { 1, 800000, ACPU_PLL_2, 2, 0, 200000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627 with CDMA capable modem - PLL2 @ 800 */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_800_pll4_0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, 0, 24576 }, - { 1, 98304, ACPU_PLL_1, 1, 1, 98304, 0, 3, 49152 }, - { 0, 120000, ACPU_PLL_0, 4, 7, 60000, 1, 3, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 65536, 2, 4, 98304 }, - { 0, 200000, ACPU_PLL_2, 2, 3, 66667, 2, 4, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 160000, 1, 5, 160000 }, - { 0, 400000, ACPU_PLL_2, 2, 1, 133333, 2, 5, 160000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 160000, 2, 6, 160000 }, - { 1, 800000, ACPU_PLL_2, 2, 0, 200000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627a PLL2 @ 1200MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_800[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 0, 400000, ACPU_PLL_4, 6, 1, 50000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 800000, ACPU_PLL_4, 6, 0, 100000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627a PLL2 @ 1200MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_800[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 3, 8192, 3, 1, 49152 }, - { 1, 98304, ACPU_PLL_1, 1, 1, 12288, 3, 2, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 3, 98304 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 120000 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 120000 }, - { 0, 400000, ACPU_PLL_4, 6, 1, 50000, 3, 4, 120000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 120000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 800000, ACPU_PLL_4, 6, 0, 100000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627aa PLL4 @ 1008MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1008[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 0, 504000, ACPU_PLL_4, 6, 1, 63000, 3, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 7, 200000}, - { 0 } -}; - -/* 7627aa PLL4 @ 1008MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1008[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 3, 8192, 3, 1, 49152 }, - { 1, 98304, ACPU_PLL_1, 1, 1, 12288, 3, 2, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 3, 98304 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 0, 504000, ACPU_PLL_4, 6, 1, 63000, 3, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 7, 200000}, - { 0 } -}; - -/* 8625 PLL4 @ 1209MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1209[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 0, 61440 }, - { 0, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 1, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 1, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 2, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1209600, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[2]}, - { 0 } -}; - -/* 8625 PLL4 @ 1209MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1209[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 3, 8192, 3, 1, 49152 }, - { 0, 98304, ACPU_PLL_1, 1, 1, 12288, 3, 1, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 1, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1209600, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[2]}, - { 0 } -}; - -/* 8625 PLL4 @ 1401.6MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1401[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 0, 61440 }, - { 0, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 1, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 1, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 2, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1209600, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[2]}, - { 1, 1401600, ACPU_PLL_4, 6, 0, 175000, 3, 7, 200000, &pll4_cfg_tbl[3]}, - { 0 } -}; - -/* 8625 PLL4 @ 1401.6MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1401[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 3, 8192, 3, 1, 49152 }, - { 0, 98304, ACPU_PLL_1, 1, 1, 12288, 3, 1, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 1, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1209600, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[2]}, - { 1, 1401600, ACPU_PLL_4, 6, 0, 175000, 3, 7, 200000, &pll4_cfg_tbl[3]}, - { 0 } -}; - -/* 8625 PLL4 @ 1008MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1008_2p0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 0, 61440 }, - { 0, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 1, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 1, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 2, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 0 } -}; - -/* 8625 PLL4 @ 1008MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1008_2p0[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 3, 8192, 3, 1, 49152 }, - { 0, 98304, ACPU_PLL_1, 1, 1, 12288, 3, 1, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 1, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 0 } -}; - -/* 8625 PLL4 @ 1104MHz with GSM capable modem with v2.0 plan */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1104[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 1, 61440 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1104000, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[5]}, - { 0 } -}; - -/* 8625 PLL4 @ 1104MHz with CDMA capable modem with v2.0 plan */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1104[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 1, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1104000, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[5]}, - { 0 } -}; - -/* 8625 PLL4 @ 1152MHz with GSM capable modem with v2.0 plan */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_pll4_1152[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 1, 61440 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1152000, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[4]}, - { 0 } -}; - -/* 8625 PLL4 @ 1115MHz with CDMA capable modem with v2.0 plan */ -static struct clkctl_acpu_speed pll0_960_pll1_196_pll2_1200_pll4_1152[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 1, 196608, ACPU_PLL_1, 1, 0, 24576, 3, 1, 98304 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 2, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 3, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 4, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, 4, 160000, &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 5, 200000, &pll4_cfg_tbl[1]}, - { 1, 1152000, ACPU_PLL_4, 6, 0, 151200, 3, 6, 200000, &pll4_cfg_tbl[4]}, - { 0 } -}; - -/* 7625a PLL2 @ 1200MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_245_pll2_1200_25a[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 3, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 1, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 0, 400000, ACPU_PLL_2, 2, 2, 50000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 200000 }, - { 0 } -}; - -/* 7627a PLL2 @ 1200MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_737_pll2_1200_pll4_800[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 11, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 5, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 2, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 0, 400000, ACPU_PLL_4, 6, 1, 50000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 800000, ACPU_PLL_4, 6, 0, 100000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627a PLL2 @ 1200MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_589_pll2_1200_pll4_800[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 8, 8192, 3, 1, 49152 }, - { 1, 98304, ACPU_PLL_1, 1, 5, 12288, 3, 2, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 2, 24576, 3, 3, 98304 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 120000 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 120000 }, - { 0, 400000, ACPU_PLL_4, 6, 1, 50000, 3, 4, 120000 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 120000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 800000, ACPU_PLL_4, 6, 0, 100000, 3, 7, 200000 }, - { 0 } -}; - -/* 7627aa PLL4 @ 1008MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_737_pll2_1200_pll4_1008[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 11, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 5, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 2, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 0, 504000, ACPU_PLL_4, 6, 1, 63000, 3, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 7, 200000}, - { 0 } -}; - -/* 7627aa PLL4 @ 1008MHz with CDMA capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_589_pll2_1200_pll4_1008[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 24576 }, - { 0, 65536, ACPU_PLL_1, 1, 8, 8192, 3, 1, 49152 }, - { 1, 98304, ACPU_PLL_1, 1, 5, 12288, 3, 2, 49152 }, - { 1, 196608, ACPU_PLL_1, 1, 2, 24576, 3, 3, 98304 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 0, 504000, ACPU_PLL_4, 6, 1, 63000, 3, 6, 160000 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 160000 }, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, 7, 200000}, - { 0 } -}; - -/* 7625a PLL2 @ 1200MHz with GSM capable modem */ -static struct clkctl_acpu_speed pll0_960_pll1_737_pll2_1200_25a[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 0, 61440, ACPU_PLL_1, 1, 11, 7680, 3, 1, 61440 }, - { 1, 122880, ACPU_PLL_1, 1, 5, 15360, 3, 2, 61440 }, - { 1, 245760, ACPU_PLL_1, 1, 2, 30720, 3, 3, 61440 }, - { 0, 300000, ACPU_PLL_2, 2, 3, 37500, 3, 4, 122880 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, 4, 122880 }, - { 0, 400000, ACPU_PLL_2, 2, 2, 50000, 3, 4, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, 5, 122880 }, - { 1, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 6, 200000 }, - { 0 } -}; - -#define PLL_CONFIG(m0, m1, m2, m4) { \ - m0, m1, m2, m4, \ - pll0_##m0##_pll1_##m1##_pll2_##m2##_pll4_##m4 \ -} - -struct pll_freq_tbl_map { - unsigned int pll0_rate; - unsigned int pll1_rate; - unsigned int pll2_rate; - unsigned int pll4_rate; - struct clkctl_acpu_speed *tbl; -}; - -static struct pll_freq_tbl_map acpu_freq_tbl_list[] = { - PLL_CONFIG(960, 196, 1200, 0), - PLL_CONFIG(960, 245, 1200, 0), - PLL_CONFIG(960, 196, 800, 0), - PLL_CONFIG(960, 245, 800, 0), - PLL_CONFIG(960, 245, 1200, 800), - PLL_CONFIG(960, 196, 1200, 800), - PLL_CONFIG(960, 245, 1200, 1008), - PLL_CONFIG(960, 196, 1200, 1008), - PLL_CONFIG(960, 737, 1200, 800), - PLL_CONFIG(960, 589, 1200, 800), - PLL_CONFIG(960, 737, 1200, 1008), - PLL_CONFIG(960, 589, 1200, 1008), - PLL_CONFIG(960, 245, 1200, 1209), - PLL_CONFIG(960, 196, 1200, 1209), - PLL_CONFIG(960, 245, 1200, 1152), - PLL_CONFIG(960, 196, 1200, 1152), - PLL_CONFIG(960, 245, 1200, 1104), - PLL_CONFIG(960, 196, 1200, 1104), - PLL_CONFIG(960, 245, 1200, 1401), - PLL_CONFIG(960, 196, 1200, 1401), - { 0, 0, 0, 0, 0 } -}; - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table freq_table[NR_CPUS][20]; - -static void cpufreq_table_init(void) -{ - int cpu; - for_each_possible_cpu(cpu) { - unsigned int i, freq_cnt = 0; - - /* Construct the freq_table table from acpu_freq_tbl since - * the freq_table values need to match frequencies specified - * in acpu_freq_tbl and acpu_freq_tbl needs to be fixed up - * during init. - */ - for (i = 0; acpu_freq_tbl[i].a11clk_khz != 0 - && freq_cnt < ARRAY_SIZE(*freq_table)-1; i++) { - if (acpu_freq_tbl[i].use_for_scaling) { - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency - = acpu_freq_tbl[i].a11clk_khz; - freq_cnt++; - } - } - - /* freq_table not big enough to store all usable freqs. */ - BUG_ON(acpu_freq_tbl[i].a11clk_khz != 0); - - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency = CPUFREQ_TABLE_END; - /* Register table with CPUFreq. */ - cpufreq_frequency_table_get_attr(freq_table[cpu], cpu); - pr_info("CPU%d: %d scaling frequencies supported.\n", - cpu, freq_cnt); - } -} -#endif - -static void update_jiffies(int cpu, unsigned long loops) -{ -#ifdef CONFIG_SMP - for_each_possible_cpu(cpu) { - per_cpu(cpu_data, cpu).loops_per_jiffy = - loops; - } -#endif - /* Adjust the global one */ - loops_per_jiffy = loops; -} - -/* Assumes PLL4 is off and the acpuclock isn't sourced from PLL4 */ -static void acpuclk_config_pll4(struct pll_config *pll) -{ - /* Make sure write to disable PLL_4 has completed - * before reconfiguring that PLL. */ - mb(); - writel_relaxed(pll->l, PLL4_L_VAL_ADDR); - writel_relaxed(pll->m, PLL4_M_VAL_ADDR); - writel_relaxed(pll->n, PLL4_N_VAL_ADDR); - /* Make sure PLL is programmed before returning. */ - mb(); -} - -static int acpuclk_set_vdd_level(int vdd) -{ - uint32_t current_vdd; - - /* - * NOTE: v1.0 of 7x27a/7x25a chip doesn't have working - * VDD switching support. - */ - if ((cpu_is_msm7x27a() || cpu_is_msm7x25a()) && - (SOCINFO_VERSION_MINOR(socinfo_get_version()) < 1)) - return 0; - - current_vdd = readl_relaxed(A11S_VDD_SVS_PLEVEL_ADDR) & 0x07; - - pr_debug("Switching VDD from %u mV -> %d mV\n", - current_vdd, vdd); - - writel_relaxed((1 << 7) | (vdd << 3), A11S_VDD_SVS_PLEVEL_ADDR); - mb(); - udelay(62); - if ((readl_relaxed(A11S_VDD_SVS_PLEVEL_ADDR) & 0x7) != vdd) { - pr_err("VDD set failed\n"); - return -EIO; - } - - pr_debug("VDD switched\n"); - - return 0; -} - -/* Set proper dividers for the given clock speed. */ -static void acpuclk_set_div(const struct clkctl_acpu_speed *hunt_s) -{ - uint32_t reg_clkctl, reg_clksel, clk_div, src_sel; - - reg_clksel = readl_relaxed(A11S_CLK_SEL_ADDR); - - /* AHB_CLK_DIV */ - clk_div = (reg_clksel >> 1) & 0x03; - /* CLK_SEL_SRC1NO */ - src_sel = reg_clksel & 1; - - /* - * If the new clock divider is higher than the previous, then - * program the divider before switching the clock - */ - if (hunt_s->ahbclk_div > clk_div) { - reg_clksel &= ~(0x3 << 1); - reg_clksel |= (hunt_s->ahbclk_div << 1); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - } - - /* Program clock source and divider */ - reg_clkctl = readl_relaxed(A11S_CLK_CNTL_ADDR); - reg_clkctl &= ~(0xFF << (8 * src_sel)); - reg_clkctl |= hunt_s->a11clk_src_sel << (4 + 8 * src_sel); - reg_clkctl |= hunt_s->a11clk_src_div << (0 + 8 * src_sel); - writel_relaxed(reg_clkctl, A11S_CLK_CNTL_ADDR); - - /* Program clock source selection */ - reg_clksel ^= 1; - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - - /* Wait for the clock switch to complete */ - mb(); - udelay(50); - - /* - * If the new clock divider is lower than the previous, then - * program the divider after switching the clock - */ - if (hunt_s->ahbclk_div < clk_div) { - reg_clksel &= ~(0x3 << 1); - reg_clksel |= (hunt_s->ahbclk_div << 1); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - } -} - -static int acpuclk_7627_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - uint32_t reg_clkctl; - struct clkctl_acpu_speed *cur_s, *tgt_s, *strt_s; - int res, rc = 0; - unsigned int plls_enabled = 0, pll; - int delta; - - if (reason == SETRATE_CPUFREQ) - mutex_lock(&drv_state.lock); - - strt_s = cur_s = drv_state.current_speed; - - WARN_ONCE(cur_s == NULL, "%s: not initialized\n", __func__); - if (cur_s == NULL) { - rc = -ENOENT; - goto out; - } - - if (rate == cur_s->a11clk_khz) - goto out; - - for (tgt_s = acpu_freq_tbl; tgt_s->a11clk_khz != 0; tgt_s++) { - if (tgt_s->a11clk_khz == rate) - break; - } - - if (tgt_s->a11clk_khz == 0) { - rc = -EINVAL; - goto out; - } - - /* Choose the highest speed at or below 'rate' with same PLL. */ - if (reason != SETRATE_CPUFREQ - && tgt_s->a11clk_khz < cur_s->a11clk_khz) { - while (tgt_s->pll != ACPU_PLL_TCXO && tgt_s->pll != cur_s->pll) - tgt_s--; - } - - if (strt_s->pll != ACPU_PLL_TCXO) - plls_enabled |= 1 << strt_s->pll; - - if (reason == SETRATE_CPUFREQ) { - if (strt_s->pll != tgt_s->pll && tgt_s->pll != ACPU_PLL_TCXO) { - rc = clk_enable(pll_clk[tgt_s->pll].clk); - if (rc < 0) { - pr_err("PLL%d enable failed (%d)\n", - tgt_s->pll, rc); - goto out; - } - plls_enabled |= 1 << tgt_s->pll; - } - } - /* Need to do this when coming out of power collapse since some modem - * firmwares reset the VDD when the application processor enters power - * collapse. */ - if (reason == SETRATE_CPUFREQ || reason == SETRATE_PC) { - /* Increase VDD if needed. */ - if (tgt_s->vdd > cur_s->vdd) { - rc = acpuclk_set_vdd_level(tgt_s->vdd); - if (rc < 0) { - pr_err("Unable to switch ACPU vdd (%d)\n", rc); - goto out; - } - } - } - - /* Set wait states for CPU inbetween frequency changes */ - reg_clkctl = readl_relaxed(A11S_CLK_CNTL_ADDR); - reg_clkctl |= (100 << 16); /* set WT_ST_CNT */ - writel_relaxed(reg_clkctl, A11S_CLK_CNTL_ADDR); - - pr_debug("Switching from ACPU rate %u KHz -> %u KHz\n", - strt_s->a11clk_khz, tgt_s->a11clk_khz); - - delta = abs((int)(strt_s->a11clk_khz - tgt_s->a11clk_khz)); - - if (dynamic_reprogram) { - if (tgt_s->pll == ACPU_PLL_4) { - if (strt_s->pll == ACPU_PLL_4 || - delta > drv_state.max_speed_delta_khz) { - /* - * Enable the backup PLL if required - * and switch to it. - */ - clk_enable(pll_clk[backup_s->pll].clk); - acpuclk_set_div(backup_s); - update_jiffies(cpu, backup_s->lpj); - } - /* Make sure PLL4 is off before reprogramming */ - if ((plls_enabled & (1 << tgt_s->pll))) { - clk_disable(pll_clk[tgt_s->pll].clk); - plls_enabled &= ~(1 << tgt_s->pll); - } - acpuclk_config_pll4(tgt_s->pll_rate); - pll_clk[tgt_s->pll].clk->rate = tgt_s->a11clk_khz*1000; - - } else if (strt_s->pll == ACPU_PLL_4) { - if (delta > drv_state.max_speed_delta_khz) { - /* - * Enable the bcackup PLL if required - * and switch to it. - */ - clk_enable(pll_clk[backup_s->pll].clk); - acpuclk_set_div(backup_s); - update_jiffies(cpu, backup_s->lpj); - } - } - - if ((tgt_s->pll != ACPU_PLL_TCXO) && - !(plls_enabled & (1 << tgt_s->pll))) { - rc = clk_enable(pll_clk[tgt_s->pll].clk); - if (rc < 0) { - pr_err("PLL%d enable failed (%d)\n", - tgt_s->pll, rc); - goto out; - } - plls_enabled |= 1 << tgt_s->pll; - } - acpuclk_set_div(tgt_s); - drv_state.current_speed = tgt_s; - /* Re-adjust lpj for the new clock speed. */ - update_jiffies(cpu, tgt_s->lpj); - - /* Disable the backup PLL */ - if ((delta > drv_state.max_speed_delta_khz) - || (strt_s->pll == ACPU_PLL_4 && - tgt_s->pll == ACPU_PLL_4)) - clk_disable(pll_clk[backup_s->pll].clk); - - goto done; - } - - while (cur_s != tgt_s) { - /* - * Always jump to target freq if within max_speed_delta_khz, - * regardless of PLL. If differnece is greater, use the - * predefined steppings in the table. - */ - int d = abs((int)(cur_s->a11clk_khz - tgt_s->a11clk_khz)); - if (d > drv_state.max_speed_delta_khz) { - - if (tgt_s->a11clk_khz > cur_s->a11clk_khz) { - /* Step up: jump to target PLL as early as - * possible so indexing using TCXO (up[-1]) - * never occurs. */ - if (likely(cur_s->up[tgt_s->pll])) - cur_s = cur_s->up[tgt_s->pll]; - else - cur_s = cur_s->up[cur_s->pll]; - } else { - /* Step down: stay on current PLL as long as - * possible so indexing using TCXO (down[-1]) - * never occurs. */ - if (likely(cur_s->down[cur_s->pll])) - cur_s = cur_s->down[cur_s->pll]; - else - cur_s = cur_s->down[tgt_s->pll]; - } - - if (cur_s == NULL) { /* This should not happen. */ - pr_err("No stepping frequencies found. " - "strt_s:%u tgt_s:%u\n", - strt_s->a11clk_khz, tgt_s->a11clk_khz); - rc = -EINVAL; - goto out; - } - - } else { - cur_s = tgt_s; - } - - pr_debug("STEP khz = %u, pll = %d\n", - cur_s->a11clk_khz, cur_s->pll); - - if (cur_s->pll != ACPU_PLL_TCXO - && !(plls_enabled & (1 << cur_s->pll))) { - rc = clk_enable(pll_clk[cur_s->pll].clk); - if (rc < 0) { - pr_err("PLL%d enable failed (%d)\n", - cur_s->pll, rc); - goto out; - } - plls_enabled |= 1 << cur_s->pll; - } - - acpuclk_set_div(cur_s); - drv_state.current_speed = cur_s; - /* Re-adjust lpj for the new clock speed. */ - update_jiffies(cpu, cur_s->lpj); - - } -done: - /* Nothing else to do for SWFI. */ - if (reason == SETRATE_SWFI) - goto out; - - /* Change the AXI bus frequency if we can. */ - if (strt_s->axiclk_khz != tgt_s->axiclk_khz) { - res = clk_set_rate(drv_state.ebi1_clk, - tgt_s->axiclk_khz * 1000); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - } - - /* Disable PLLs we are not using anymore. */ - if (tgt_s->pll != ACPU_PLL_TCXO) - plls_enabled &= ~(1 << tgt_s->pll); - for (pll = ACPU_PLL_0; pll < ACPU_PLL_END; pll++) - if (plls_enabled & (1 << pll)) - clk_disable(pll_clk[pll].clk); - - /* Nothing else to do for power collapse. */ - if (reason == SETRATE_PC) - goto out; - - /* Drop VDD level if we can. */ - if (tgt_s->vdd < strt_s->vdd) { - res = acpuclk_set_vdd_level(tgt_s->vdd); - if (res < 0) - pr_warning("Unable to drop ACPU vdd (%d)\n", res); - } - - pr_debug("ACPU speed change complete\n"); -out: - if (reason == SETRATE_CPUFREQ) - mutex_unlock(&drv_state.lock); - return rc; -} - -static void acpuclk_hw_init(void) -{ - struct clkctl_acpu_speed *speed; - uint32_t div, sel, reg_clksel; - int res; - - /* - * Prepare all the PLLs because we enable/disable them - * from atomic context and can't always ensure they're - * all prepared in non-atomic context. Same goes for - * ebi1_acpu_clk. - */ - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_0].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_1].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_2].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_4].clk)); - BUG_ON(clk_prepare(drv_state.ebi1_clk)); - - /* - * Determine the rate of ACPU clock - */ - - if (!(readl_relaxed(A11S_CLK_SEL_ADDR) & 0x01)) { /* CLK_SEL_SRC1N0 */ - /* CLK_SRC0_SEL */ - sel = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 12) & 0x7; - /* CLK_SRC0_DIV */ - div = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 8) & 0x0f; - } else { - /* CLK_SRC1_SEL */ - sel = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 4) & 0x07; - /* CLK_SRC1_DIV */ - div = readl_relaxed(A11S_CLK_CNTL_ADDR) & 0x0f; - } - - for (speed = acpu_freq_tbl; speed->a11clk_khz != 0; speed++) { - if (speed->a11clk_src_sel == sel - && (speed->a11clk_src_div == div)) - break; - } - if (speed->a11clk_khz == 0) { - pr_err("Error - ACPU clock reports invalid speed\n"); - return; - } - - drv_state.current_speed = speed; - if (speed->pll != ACPU_PLL_TCXO) { - if (clk_enable(pll_clk[speed->pll].clk)) - pr_warning("Failed to vote for boot PLL\n"); - } - - /* Fix div2 to 2 for 7x27/5a(aa) targets */ - if (!cpu_is_msm7x27()) { - reg_clksel = readl_relaxed(A11S_CLK_SEL_ADDR); - reg_clksel &= ~(0x3 << 14); - reg_clksel |= (0x1 << 14); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - } - - res = clk_set_rate(drv_state.ebi1_clk, speed->axiclk_khz * 1000); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - res = clk_enable(drv_state.ebi1_clk); - if (res < 0) - pr_warning("Enabling AXI clock failed (%d)\n", res); - - pr_info("ACPU running at %d KHz\n", speed->a11clk_khz); -} - -static unsigned long acpuclk_7627_get_rate(int cpu) -{ - WARN_ONCE(drv_state.current_speed == NULL, - "%s: not initialized\n", __func__); - if (drv_state.current_speed) - return drv_state.current_speed->a11clk_khz; - else - return 0; -} - -/*---------------------------------------------------------------------------- - * Clock driver initialization - *---------------------------------------------------------------------------*/ -#define MHZ 1000000 -static void select_freq_plan(void) -{ - unsigned long pll_mhz[ACPU_PLL_END]; - struct pll_freq_tbl_map *t = acpu_freq_tbl_list; - int i; - - /* Get PLL clocks */ - for (i = 0; i < ACPU_PLL_END; i++) { - if (pll_clk[i].name) { - pll_clk[i].clk = clk_get_sys("acpu", pll_clk[i].name); - if (IS_ERR(pll_clk[i].clk)) { - pll_mhz[i] = 0; - continue; - } - /* Get PLL's Rate */ - pll_mhz[i] = clk_get_rate(pll_clk[i].clk)/MHZ; - } - } - - /* - * For the pll configuration used in acpuclock table e.g. - * pll0_960_pll1_245_pll2_1200" is same for 7627 and - * 7625a (as pll0,pll1,pll2) having same rates, but frequency - * table is different for both targets. - * - * Hence below for loop will not be able to select correct - * table based on PLL rates as rates are same. Hence we need - * to add this cpu check for selecting the correct acpuclock table. - */ - if (cpu_is_msm7x25a()) { - if (pll_mhz[ACPU_PLL_1] == 245) { - acpu_freq_tbl = - pll0_960_pll1_245_pll2_1200_25a; - } else if (pll_mhz[ACPU_PLL_1] == 737) { - acpu_freq_tbl = - pll0_960_pll1_737_pll2_1200_25a; - } - t->tbl = acpu_freq_tbl; - } - - /* - * 1008Mhz table selection based on the Lvalue of the PLL - * is conflicting with the 7627AA 1GHz parts since 8625 chips - * are using different clock plan based reprogramming method. - */ - if (cpu_is_msm8625() && pll_mhz[ACPU_PLL_4] == 1008) { - if (pll_mhz[ACPU_PLL_2] == 245) - acpu_freq_tbl = - pll0_960_pll1_245_pll2_1200_pll4_1008_2p0; - else - acpu_freq_tbl = - pll0_960_pll1_196_pll2_1200_pll4_1008_2p0; - t->tbl = acpu_freq_tbl; - } else { - /* Select the right table to use. */ - for (; t->tbl != 0; t++) { - if (t->pll0_rate == pll_mhz[ACPU_PLL_0] - && t->pll1_rate == pll_mhz[ACPU_PLL_1] - && t->pll2_rate == pll_mhz[ACPU_PLL_2] - && t->pll4_rate == pll_mhz[ACPU_PLL_4]) { - acpu_freq_tbl = t->tbl; - break; - } - } - } - - if (acpu_freq_tbl == NULL) { - pr_crit("Unknown PLL configuration!\n"); - BUG(); - } - - /* - * Turn ON the dynamic reprogramming method - * if one of the table entry has pll_rate defined. - */ - for ( ; t->tbl->a11clk_khz; t->tbl++) { - if (t->tbl->pll_rate) { - if (!dynamic_reprogram) { - dynamic_reprogram = 1; - pr_info("Dynamic reprogramming is ON\n"); - } - } - } - - /* - * Also find the backup pll used during PLL4 reprogramming. - * We are using PLL2@600MHz as backup PLL, since 800MHz jump - * is fine. - */ - if (dynamic_reprogram) { - for (t->tbl = acpu_freq_tbl; t->tbl->a11clk_khz; t->tbl++) { - if (t->tbl->pll == ACPU_PLL_2 && - t->tbl->a11clk_src_div == 1) { - backup_s = t->tbl; - break; - } - } - } -} - -/* - * Hardware requires the CPU to be dropped to less than MAX_WAIT_FOR_IRQ_KHZ - * before entering a wait for irq low-power mode. Find a suitable rate. - */ -static unsigned long find_wait_for_irq_khz(void) -{ - unsigned long found_khz = 0; - int i; - - for (i = 0; acpu_freq_tbl[i].a11clk_khz && - acpu_freq_tbl[i].a11clk_khz <= MAX_WAIT_FOR_IRQ_KHZ; i++) - found_khz = acpu_freq_tbl[i].a11clk_khz; - - return found_khz; -} - -static void lpj_init(void) -{ - int i = 0, cpu; - const struct clkctl_acpu_speed *base_clk = drv_state.current_speed; - unsigned long loops; - - for_each_possible_cpu(cpu) { -#ifdef CONFIG_SMP - loops = per_cpu(cpu_data, cpu).loops_per_jiffy; -#else - loops = loops_per_jiffy; -#endif - for (i = 0; acpu_freq_tbl[i].a11clk_khz; i++) { - acpu_freq_tbl[i].lpj = cpufreq_scale( - loops, - base_clk->a11clk_khz, - acpu_freq_tbl[i].a11clk_khz); - } - } -} - -static void precompute_stepping(void) -{ - int i, step_idx; - -#define cur_freq acpu_freq_tbl[i].a11clk_khz -#define step_freq acpu_freq_tbl[step_idx].a11clk_khz -#define cur_pll acpu_freq_tbl[i].pll -#define step_pll acpu_freq_tbl[step_idx].pll - - for (i = 0; acpu_freq_tbl[i].a11clk_khz; i++) { - - /* Calculate max "up" step for each destination PLL */ - step_idx = i + 1; - while (step_freq && (step_freq - cur_freq) - <= drv_state.max_speed_delta_khz) { - acpu_freq_tbl[i].up[step_pll] = - &acpu_freq_tbl[step_idx]; - step_idx++; - } - if (step_idx == (i + 1) && step_freq) { - pr_crit("Delta between freqs %u KHz and %u KHz is" - " too high!\n", cur_freq, step_freq); - BUG(); - } - - /* Calculate max "down" step for each destination PLL */ - step_idx = i - 1; - while (step_idx >= 0 && (cur_freq - step_freq) - <= drv_state.max_speed_delta_khz) { - acpu_freq_tbl[i].down[step_pll] = - &acpu_freq_tbl[step_idx]; - step_idx--; - } - if (step_idx == (i - 1) && i > 0) { - pr_crit("Delta between freqs %u KHz and %u KHz is" - " too high!\n", cur_freq, step_freq); - BUG(); - } - } -} - -static void print_acpu_freq_tbl(void) -{ - struct clkctl_acpu_speed *t; - short down_idx[ACPU_PLL_END]; - short up_idx[ACPU_PLL_END]; - int i, j; - -#define FREQ_IDX(freq_ptr) (freq_ptr - acpu_freq_tbl) - pr_info("Id CPU-KHz PLL DIV AHB-KHz ADIV AXI-KHz " - "D0 D1 D2 D4 U0 U1 U2 U4\n"); - - t = &acpu_freq_tbl[0]; - for (i = 0; t->a11clk_khz != 0; i++) { - - for (j = 0; j < ACPU_PLL_END; j++) { - down_idx[j] = t->down[j] ? FREQ_IDX(t->down[j]) : -1; - up_idx[j] = t->up[j] ? FREQ_IDX(t->up[j]) : -1; - } - - pr_info("%2d %7d %3d %3d %7d %4d %7d " - "%2d %2d %2d %2d %2d %2d %2d %2d\n", - i, t->a11clk_khz, t->pll, t->a11clk_src_div + 1, - t->ahbclk_khz, t->ahbclk_div + 1, t->axiclk_khz, - down_idx[0], down_idx[1], down_idx[2], down_idx[4], - up_idx[0], up_idx[1], up_idx[2], up_idx[4]); - - t++; - } -} - - -static struct acpuclk_data acpuclk_7627_data = { - .set_rate = acpuclk_7627_set_rate, - .get_rate = acpuclk_7627_get_rate, - .power_collapse_khz = POWER_COLLAPSE_KHZ, - .switch_time_us = 50, -}; - -static int acpuclk_7627_probe(struct platform_device *pdev) -{ - const struct acpuclk_pdata *pdata = pdev->dev.platform_data; - - pr_info("%s()\n", __func__); - - drv_state.ebi1_clk = clk_get(NULL, "ebi1_acpu_clk"); - BUG_ON(IS_ERR(drv_state.ebi1_clk)); - - mutex_init(&drv_state.lock); - drv_state.max_speed_delta_khz = pdata->max_speed_delta_khz; - select_freq_plan(); - acpuclk_7627_data.wait_for_irq_khz = find_wait_for_irq_khz(); - precompute_stepping(); - acpuclk_hw_init(); - lpj_init(); - print_acpu_freq_tbl(); - acpuclk_register(&acpuclk_7627_data); - -#ifdef CONFIG_CPU_FREQ_MSM - cpufreq_table_init(); -#endif - return 0; -} - -static struct platform_driver acpuclk_7627_driver = { - .probe = acpuclk_7627_probe, - .driver = { - .name = "acpuclk-7627", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_7627_init(void) -{ - return platform_driver_register(&acpuclk_7627_driver); -} -postcore_initcall(acpuclk_7627_init); - diff --git a/arch/arm/mach-msm/acpuclock-7x30.c b/arch/arm/mach-msm/acpuclock-7x30.c deleted file mode 100644 index 3f007ca059f3..000000000000 --- a/arch/arm/mach-msm/acpuclock-7x30.c +++ /dev/null @@ -1,510 +0,0 @@ -/* - * - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2007-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "smd_private.h" -#include "acpuclock.h" -#include "spm.h" - -#define SCSS_CLK_CTL_ADDR (MSM_ACC0_BASE + 0x04) -#define SCSS_CLK_SEL_ADDR (MSM_ACC0_BASE + 0x08) - -#define PLL2_L_VAL_ADDR (MSM_CLK_CTL_BASE + 0x33C) -#define PLL2_M_VAL_ADDR (MSM_CLK_CTL_BASE + 0x340) -#define PLL2_N_VAL_ADDR (MSM_CLK_CTL_BASE + 0x344) -#define PLL2_CONFIG_ADDR (MSM_CLK_CTL_BASE + 0x34C) - -#define VREF_SEL 1 /* 0: 0.625V (50mV step), 1: 0.3125V (25mV step). */ -#define V_STEP (25 * (2 - VREF_SEL)) /* Minimum voltage step size. */ -#define VREG_DATA (VREG_CONFIG | (VREF_SEL << 5)) -#define VREG_CONFIG (BIT(7) | BIT(6)) /* Enable VREG, pull-down if disabled. */ -/* Cause a compile error if the voltage is not a multiple of the step size. */ -#define MV(mv) ((mv) / (!((mv) % V_STEP))) -/* mv = (750mV + (raw * 25mV)) * (2 - VREF_SEL) */ -#define VDD_RAW(mv) (((MV(mv) / V_STEP) - 30) | VREG_DATA) - -#define MAX_AXI_KHZ 192000 - -struct clock_state { - struct clkctl_acpu_speed *current_speed; - struct mutex lock; - struct clk *ebi1_clk; -}; - -struct pll { - unsigned int l; - unsigned int m; - unsigned int n; - unsigned int pre_div; -}; - -struct clkctl_acpu_speed { - unsigned int use_for_scaling; - unsigned int acpu_clk_khz; - int src; - unsigned int acpu_src_sel; - unsigned int acpu_src_div; - unsigned int axi_clk_hz; - unsigned int vdd_mv; - unsigned int vdd_raw; - struct pll *pll_rate; - unsigned long lpj; /* loops_per_jiffy */ -}; - -static struct clock_state drv_state = { 0 }; - -/* Switch to this when reprogramming PLL2 */ -static struct clkctl_acpu_speed *backup_s; - -static struct pll pll2_tbl[] = { - { 42, 0, 1, 0 }, /* 806 MHz */ - { 53, 1, 3, 0 }, /* 1024 MHz */ - { 125, 0, 1, 1 }, /* 1200 MHz */ - { 73, 0, 1, 0 }, /* 1401 MHz */ -}; - -/* Use negative numbers for sources that can't be enabled/disabled */ - -enum acpuclk_source { - LPXO = -2, - AXI = -1, - PLL_0 = 0, - PLL_1, - PLL_2, - PLL_3, - MAX_SOURCE -}; - -static struct clk *acpuclk_sources[MAX_SOURCE]; - -/* - * Each ACPU frequency has a certain minimum MSMC1 voltage requirement - * that is implicitly met by voting for a specific minimum AXI frequency. - * Do NOT change the AXI frequency unless you are _absoulutely_ sure you - * know all the h/w requirements. - */ -static struct clkctl_acpu_speed acpu_freq_tbl[] = { - { 0, 24576, LPXO, 0, 0, 30720000, 900, VDD_RAW(900) }, - { 0, 61440, PLL_3, 5, 11, 61440000, 900, VDD_RAW(900) }, - { 1, 122880, PLL_3, 5, 5, 61440000, 900, VDD_RAW(900) }, - { 0, 184320, PLL_3, 5, 4, 61440000, 900, VDD_RAW(900) }, - { 0, MAX_AXI_KHZ, AXI, 1, 0, 61440000, 900, VDD_RAW(900) }, - { 1, 245760, PLL_3, 5, 2, 61440000, 900, VDD_RAW(900) }, - { 1, 368640, PLL_3, 5, 1, 122800000, 900, VDD_RAW(900) }, - /* AXI has MSMC1 implications. See above. */ - { 1, 768000, PLL_1, 2, 0, 153600000, 1050, VDD_RAW(1050) }, - /* - * AXI has MSMC1 implications. See above. - */ - { 1, 806400, PLL_2, 3, 0, UINT_MAX, 1100, VDD_RAW(1100), &pll2_tbl[0]}, - { 1, 1024000, PLL_2, 3, 0, UINT_MAX, 1200, VDD_RAW(1200), &pll2_tbl[1]}, - { 1, 1200000, PLL_2, 3, 0, UINT_MAX, 1200, VDD_RAW(1200), &pll2_tbl[2]}, - { 1, 1401600, PLL_2, 3, 0, UINT_MAX, 1250, VDD_RAW(1250), &pll2_tbl[3]}, - { 0 } -}; - -static int acpuclk_set_acpu_vdd(struct clkctl_acpu_speed *s) -{ - int ret = msm_spm_set_vdd(0, s->vdd_raw); - if (ret) - return ret; - - /* Wait for voltage to stabilize. */ - udelay(62); - return 0; -} - -/* Assumes PLL2 is off and the acpuclock isn't sourced from PLL2 */ -static void acpuclk_config_pll2(struct pll *pll) -{ - uint32_t config = readl_relaxed(PLL2_CONFIG_ADDR); - - /* Make sure write to disable PLL_2 has completed - * before reconfiguring that PLL. */ - mb(); - writel_relaxed(pll->l, PLL2_L_VAL_ADDR); - writel_relaxed(pll->m, PLL2_M_VAL_ADDR); - writel_relaxed(pll->n, PLL2_N_VAL_ADDR); - if (pll->pre_div) - config |= BIT(15); - else - config &= ~BIT(15); - writel_relaxed(config, PLL2_CONFIG_ADDR); - /* Make sure PLL is programmed before returning. */ - mb(); -} - -/* Set clock source and divider given a clock speed */ -static void acpuclk_set_src(const struct clkctl_acpu_speed *s) -{ - uint32_t reg_clksel, reg_clkctl, src_sel; - - reg_clksel = readl_relaxed(SCSS_CLK_SEL_ADDR); - - /* CLK_SEL_SRC1NO */ - src_sel = reg_clksel & 1; - - /* Program clock source and divider. */ - reg_clkctl = readl_relaxed(SCSS_CLK_CTL_ADDR); - reg_clkctl &= ~(0xFF << (8 * src_sel)); - reg_clkctl |= s->acpu_src_sel << (4 + 8 * src_sel); - reg_clkctl |= s->acpu_src_div << (0 + 8 * src_sel); - writel_relaxed(reg_clkctl, SCSS_CLK_CTL_ADDR); - - /* Toggle clock source. */ - reg_clksel ^= 1; - - /* Program clock source selection. */ - writel_relaxed(reg_clksel, SCSS_CLK_SEL_ADDR); - - /* Make sure switch to new source is complete. */ - mb(); -} - -static int acpuclk_7x30_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - struct clkctl_acpu_speed *tgt_s, *strt_s; - int res, rc = 0; - - if (reason == SETRATE_CPUFREQ) - mutex_lock(&drv_state.lock); - - strt_s = drv_state.current_speed; - - if (rate == strt_s->acpu_clk_khz) - goto out; - - for (tgt_s = acpu_freq_tbl; tgt_s->acpu_clk_khz != 0; tgt_s++) { - if (tgt_s->acpu_clk_khz == rate) - break; - } - if (tgt_s->acpu_clk_khz == 0) { - rc = -EINVAL; - goto out; - } - - if (reason == SETRATE_CPUFREQ) { - /* Increase VDD if needed. */ - if (tgt_s->vdd_mv > strt_s->vdd_mv) { - rc = acpuclk_set_acpu_vdd(tgt_s); - if (rc < 0) { - pr_err("ACPU VDD increase to %d mV failed " - "(%d)\n", tgt_s->vdd_mv, rc); - goto out; - } - } - } - - pr_debug("Switching from ACPU rate %u KHz -> %u KHz\n", - strt_s->acpu_clk_khz, tgt_s->acpu_clk_khz); - - /* Increase the AXI bus frequency if needed. This must be done before - * increasing the ACPU frequency, since voting for high AXI rates - * implicitly takes care of increasing the MSMC1 voltage, as needed. */ - if (tgt_s->axi_clk_hz > strt_s->axi_clk_hz) { - rc = clk_set_rate(drv_state.ebi1_clk, tgt_s->axi_clk_hz); - if (rc < 0) { - pr_err("Setting AXI min rate failed (%d)\n", rc); - goto out; - } - } - - /* Move off of PLL2 if we're reprogramming it */ - if (tgt_s->src == PLL_2 && strt_s->src == PLL_2) { - clk_enable(acpuclk_sources[backup_s->src]); - acpuclk_set_src(backup_s); - clk_disable(acpuclk_sources[strt_s->src]); - } - - /* Reconfigure PLL2 if we're moving to it */ - if (tgt_s->src == PLL_2) - acpuclk_config_pll2(tgt_s->pll_rate); - - /* Make sure target PLL is on. */ - if ((strt_s->src != tgt_s->src && tgt_s->src >= 0) || - (tgt_s->src == PLL_2 && strt_s->src == PLL_2)) { - pr_debug("Enabling PLL %d\n", tgt_s->src); - clk_enable(acpuclk_sources[tgt_s->src]); - } - - /* Perform the frequency switch */ - acpuclk_set_src(tgt_s); - drv_state.current_speed = tgt_s; - loops_per_jiffy = tgt_s->lpj; - - if (tgt_s->src == PLL_2 && strt_s->src == PLL_2) - clk_disable(acpuclk_sources[backup_s->src]); - - /* Nothing else to do for SWFI. */ - if (reason == SETRATE_SWFI) - goto out; - - /* Turn off previous PLL if not used. */ - if (strt_s->src != tgt_s->src && strt_s->src >= 0) { - pr_debug("Disabling PLL %d\n", strt_s->src); - clk_disable(acpuclk_sources[strt_s->src]); - } - - /* Decrease the AXI bus frequency if we can. */ - if (tgt_s->axi_clk_hz < strt_s->axi_clk_hz) { - res = clk_set_rate(drv_state.ebi1_clk, tgt_s->axi_clk_hz); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - } - - /* Nothing else to do for power collapse. */ - if (reason == SETRATE_PC) - goto out; - - /* Drop VDD level if we can. */ - if (tgt_s->vdd_mv < strt_s->vdd_mv) { - res = acpuclk_set_acpu_vdd(tgt_s); - if (res) - pr_warning("ACPU VDD decrease to %d mV failed (%d)\n", - tgt_s->vdd_mv, res); - } - - pr_debug("ACPU speed change complete\n"); -out: - if (reason == SETRATE_CPUFREQ) - mutex_unlock(&drv_state.lock); - - return rc; -} - -static unsigned long acpuclk_7x30_get_rate(int cpu) -{ - WARN_ONCE(drv_state.current_speed == NULL, - "acpuclk_get_rate: not initialized\n"); - if (drv_state.current_speed) - return drv_state.current_speed->acpu_clk_khz; - else - return 0; -} - -/*---------------------------------------------------------------------------- - * Clock driver initialization - *---------------------------------------------------------------------------*/ - -static void acpuclk_hw_init(void) -{ - struct clkctl_acpu_speed *s; - uint32_t div, sel, src_num; - uint32_t reg_clksel, reg_clkctl; - int res; - u8 pll2_l = readl_relaxed(PLL2_L_VAL_ADDR) & 0xFF; - - drv_state.ebi1_clk = clk_get(NULL, "ebi1_clk"); - BUG_ON(IS_ERR(drv_state.ebi1_clk)); - - reg_clksel = readl_relaxed(SCSS_CLK_SEL_ADDR); - - /* Determine the ACPU clock rate. */ - switch ((reg_clksel >> 1) & 0x3) { - case 0: /* Running off the output of the raw clock source mux. */ - reg_clkctl = readl_relaxed(SCSS_CLK_CTL_ADDR); - src_num = reg_clksel & 0x1; - sel = (reg_clkctl >> (12 - (8 * src_num))) & 0x7; - div = (reg_clkctl >> (8 - (8 * src_num))) & 0xF; - - /* Check frequency table for matching sel/div pair. */ - for (s = acpu_freq_tbl; s->acpu_clk_khz != 0; s++) { - if (s->acpu_src_sel == sel && s->acpu_src_div == div) - break; - } - if (s->acpu_clk_khz == 0) { - pr_err("Error - ACPU clock reports invalid speed\n"); - return; - } - break; - case 2: /* Running off of the SCPLL selected through the core mux. */ - /* Switch to run off of the SCPLL selected through the raw - * clock source mux. */ - for (s = acpu_freq_tbl; s->acpu_clk_khz != 0 - && s->src != PLL_2 && s->acpu_src_div == 0; s++) - ; - if (s->acpu_clk_khz != 0) { - /* Program raw clock source mux. */ - acpuclk_set_src(s); - - /* Switch to raw clock source input of the core mux. */ - reg_clksel = readl_relaxed(SCSS_CLK_SEL_ADDR); - reg_clksel &= ~(0x3 << 1); - writel_relaxed(reg_clksel, SCSS_CLK_SEL_ADDR); - break; - } - /* else fall through */ - default: - pr_err("Error - ACPU clock reports invalid source\n"); - return; - } - - /* Look at PLL2's L val to determine what speed PLL2 is running at */ - if (s->src == PLL_2) - for ( ; s->acpu_clk_khz; s++) - if (s->pll_rate && s->pll_rate->l == pll2_l) - break; - - /* Set initial ACPU VDD. */ - acpuclk_set_acpu_vdd(s); - - drv_state.current_speed = s; - - /* Initialize current PLL's reference count. */ - if (s->src >= 0) - clk_enable(acpuclk_sources[s->src]); - - res = clk_set_rate(drv_state.ebi1_clk, s->axi_clk_hz); - if (res < 0) - pr_warning("Setting AXI min rate failed!\n"); - - pr_info("ACPU running at %d KHz\n", s->acpu_clk_khz); - - return; -} - -/* Initalize the lpj field in the acpu_freq_tbl. */ -static void lpj_init(void) -{ - int i; - const struct clkctl_acpu_speed *base_clk = drv_state.current_speed; - - for (i = 0; acpu_freq_tbl[i].acpu_clk_khz; i++) { - acpu_freq_tbl[i].lpj = cpufreq_scale(loops_per_jiffy, - base_clk->acpu_clk_khz, - acpu_freq_tbl[i].acpu_clk_khz); - } -} - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table cpufreq_tbl[ARRAY_SIZE(acpu_freq_tbl)]; - -static void setup_cpufreq_table(void) -{ - unsigned i = 0; - const struct clkctl_acpu_speed *speed; - - for (speed = acpu_freq_tbl; speed->acpu_clk_khz; speed++) - if (speed->use_for_scaling) { - cpufreq_tbl[i].index = i; - cpufreq_tbl[i].frequency = speed->acpu_clk_khz; - i++; - } - cpufreq_tbl[i].frequency = CPUFREQ_TABLE_END; - - cpufreq_frequency_table_get_attr(cpufreq_tbl, smp_processor_id()); -} -#else -static inline void setup_cpufreq_table(void) { } -#endif - -/* - * Truncate the frequency table at the current PLL2 rate and determine the - * backup PLL to use when scaling PLL2. - */ -void pll2_fixup(void) -{ - struct clkctl_acpu_speed *speed = acpu_freq_tbl; - u8 pll2_l = readl_relaxed(PLL2_L_VAL_ADDR) & 0xFF; - - for ( ; speed->acpu_clk_khz; speed++) { - if (speed->src != PLL_2) - backup_s = speed; - if (speed->pll_rate && speed->pll_rate->l == pll2_l) { - speed++; - speed->acpu_clk_khz = 0; - return; - } - } - - pr_err("Unknown PLL2 lval %d\n", pll2_l); - BUG(); -} - -#define RPM_BYPASS_MASK (1 << 3) -#define PMIC_MODE_MASK (1 << 4) - -static void populate_plls(void) -{ - acpuclk_sources[PLL_1] = clk_get_sys("acpu", "pll1_clk"); - BUG_ON(IS_ERR(acpuclk_sources[PLL_1])); - acpuclk_sources[PLL_2] = clk_get_sys("acpu", "pll2_clk"); - BUG_ON(IS_ERR(acpuclk_sources[PLL_2])); - acpuclk_sources[PLL_3] = clk_get_sys("acpu", "pll3_clk"); - BUG_ON(IS_ERR(acpuclk_sources[PLL_3])); - /* - * Prepare all the PLLs because we enable/disable them - * from atomic context and can't always ensure they're - * all prepared in non-atomic context. - */ - BUG_ON(clk_prepare(acpuclk_sources[PLL_1])); - BUG_ON(clk_prepare(acpuclk_sources[PLL_2])); - BUG_ON(clk_prepare(acpuclk_sources[PLL_3])); -} - -static struct acpuclk_data acpuclk_7x30_data = { - .set_rate = acpuclk_7x30_set_rate, - .get_rate = acpuclk_7x30_get_rate, - .power_collapse_khz = MAX_AXI_KHZ, - .wait_for_irq_khz = MAX_AXI_KHZ, - .switch_time_us = 50, -}; - -static int acpuclk_7x30_probe(struct platform_device *pdev) -{ - pr_info("%s()\n", __func__); - - mutex_init(&drv_state.lock); - pll2_fixup(); - populate_plls(); - acpuclk_hw_init(); - lpj_init(); - setup_cpufreq_table(); - acpuclk_register(&acpuclk_7x30_data); - - return 0; -} - -static struct platform_driver acpuclk_7x30_driver = { - .probe = acpuclk_7x30_probe, - .driver = { - .name = "acpuclk-7x30", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_7x30_init(void) -{ - return platform_driver_register(&acpuclk_7x30_driver); -} -postcore_initcall(acpuclk_7x30_init); diff --git a/arch/arm/mach-msm/acpuclock-8625q.c b/arch/arm/mach-msm/acpuclock-8625q.c deleted file mode 100644 index 12fad052137a..000000000000 --- a/arch/arm/mach-msm/acpuclock-8625q.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2007-2012, Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "acpuclock.h" -#include "acpuclock-8625q.h" - -#define A11S_CLK_CNTL_ADDR (MSM_CSR_BASE + 0x100) -#define A11S_CLK_SEL_ADDR (MSM_CSR_BASE + 0x104) - -#define PLL4_L_VAL_ADDR (MSM_CLK_CTL_BASE + 0x378) -#define PLL4_M_VAL_ADDR (MSM_CLK_CTL_BASE + 0x37C) -#define PLL4_N_VAL_ADDR (MSM_CLK_CTL_BASE + 0x380) - -#define POWER_COLLAPSE_KHZ 19200 - -/* Max CPU frequency allowed by hardware while in standby waiting for an irq. */ -#define MAX_WAIT_FOR_IRQ_KHZ 128000 - -/** - * enum - For acpuclock PLL IDs - */ -enum { - ACPU_PLL_0 = 0, - ACPU_PLL_1, - ACPU_PLL_2, - ACPU_PLL_3, - ACPU_PLL_4, - ACPU_PLL_TCXO, - ACPU_PLL_END, -}; - -struct acpu_clk_src { - struct clk *clk; - const char *name; -}; - -struct pll_config { - unsigned int l; - unsigned int m; - unsigned int n; -}; - -static struct acpu_clk_src pll_clk[ACPU_PLL_END] = { - [ACPU_PLL_0] = { .name = "pll0_clk" }, - [ACPU_PLL_1] = { .name = "pll1_clk" }, - [ACPU_PLL_2] = { .name = "pll2_clk" }, - [ACPU_PLL_4] = { .name = "pll4_clk" }, -}; - -static struct pll_config pll4_cfg_tbl[] = { - [0] = { 36, 1, 2 }, /* 700.8 MHz */ - [1] = { 52, 1, 2 }, /* 1008 MHz */ - [2] = { 63, 0, 1 }, /* 1209.6 MHz */ - [3] = { 73, 0, 1 }, /* 1401.6 MHz */ -}; - -struct clock_state { - struct clkctl_acpu_speed *current_speed; - struct mutex lock; - uint32_t max_speed_delta_khz; - struct clk *ebi1_clk; - struct regulator *vreg_cpu; -}; - -struct clkctl_acpu_speed { - unsigned int use_for_scaling; - unsigned int a11clk_khz; - int pll; - unsigned int a11clk_src_sel; - unsigned int a11clk_src_div; - unsigned int ahbclk_khz; - unsigned int ahbclk_div; - int vdd; - unsigned int axiclk_khz; - struct pll_config *pll_rate; - unsigned long lpj; -}; - -static struct clock_state drv_state = { 0 }; - -/* PVS MAX Voltage in uV as per frequencies*/ - -# define MAX_14GHZ_VOLTAGE 1350000 -# define MAX_12GHZ_VOLTAGE 1275000 -# define MAX_1GHZ_VOLTAGE 1175000 -# define MAX_NOMINAL_VOLTAGE 1150000 - -/* PVS deltas as per formula*/ -# define DELTA_LEVEL_1_UV 0 -# define DELTA_LEVEL_2_UV 75000 -# define DELTA_LEVEL_3_UV 150000 - -/* - * The default initialization is according to the requirements of - * SKUD_prime. If the target is quad core, we reinitialize this table using - * the reinitalize_freq_table() function. - */ -static struct clkctl_acpu_speed acpu_freq_tbl_cmn[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 2400, 3, 0, 30720 }, - { 1, 245760, ACPU_PLL_1, 1, 0, 30720, 3, MAX_NOMINAL_VOLTAGE, 61440 }, - { 1, 320000, ACPU_PLL_0, 4, 2, 40000, 3, MAX_NOMINAL_VOLTAGE, 122880 }, - { 1, 480000, ACPU_PLL_0, 4, 1, 60000, 3, MAX_NOMINAL_VOLTAGE, 122880 }, - { 0, 600000, ACPU_PLL_2, 2, 1, 75000, 3, 0, 160000 }, - { 1, 700800, ACPU_PLL_4, 6, 0, 87500, 3, MAX_NOMINAL_VOLTAGE, 160000, - &pll4_cfg_tbl[0]}, - { 1, 1008000, ACPU_PLL_4, 6, 0, 126000, 3, MAX_1GHZ_VOLTAGE, 200000, - &pll4_cfg_tbl[1]}, -}; - -static struct clkctl_acpu_speed acpu_freq_tbl_1209[] = { - { 1, 1209600, ACPU_PLL_4, 6, 0, 151200, 3, MAX_12GHZ_VOLTAGE, 200000, - &pll4_cfg_tbl[2]}, -}; - -static struct clkctl_acpu_speed acpu_freq_tbl_1401[] = { - { 1, 1401600, ACPU_PLL_4, 6, 0, 175000, 3, MAX_14GHZ_VOLTAGE, 200000, - &pll4_cfg_tbl[3]}, -}; - -/* Entry corresponding to CDMA build*/ -static struct clkctl_acpu_speed acpu_freq_tbl_196608[] = { - { 1, 196608, ACPU_PLL_1, 1, 0, 65536, 2, MAX_NOMINAL_VOLTAGE, 98304 }, -}; - -static struct clkctl_acpu_speed acpu_freq_tbl_null[] = { - { 0 }, -}; - -static struct clkctl_acpu_speed acpu_freq_tbl[ARRAY_SIZE(acpu_freq_tbl_cmn) - + ARRAY_SIZE(acpu_freq_tbl_1209) - + ARRAY_SIZE(acpu_freq_tbl_1401) - + ARRAY_SIZE(acpu_freq_tbl_null)]; - -/* Switch to this when reprogramming PLL4 */ -static struct clkctl_acpu_speed *backup_s; - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table freq_table[NR_CPUS][20]; - -static void cpufreq_table_init(void) -{ - int cpu; - for_each_possible_cpu(cpu) { - unsigned int i, freq_cnt = 0; - - /* Construct the freq_table table from acpu_freq_tbl since - * the freq_table values need to match frequencies specified - * in acpu_freq_tbl and acpu_freq_tbl needs to be fixed up - * during init. - */ - for (i = 0; acpu_freq_tbl[i].a11clk_khz != 0 - && freq_cnt < ARRAY_SIZE(*freq_table)-1; i++) { - if (acpu_freq_tbl[i].use_for_scaling) { - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency - = acpu_freq_tbl[i].a11clk_khz; - freq_cnt++; - } - } - - /* freq_table not big enough to store all usable freqs. */ - BUG_ON(acpu_freq_tbl[i].a11clk_khz != 0); - - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency = CPUFREQ_TABLE_END; - /* Register table with CPUFreq. */ - cpufreq_frequency_table_get_attr(freq_table[cpu], cpu); - pr_info("CPU%d: %d scaling frequencies supported.\n", - cpu, freq_cnt); - } -} -#else -static void cpufreq_table_init(void) { } -#endif - -static void update_jiffies(int cpu, unsigned long loops) -{ -#ifdef CONFIG_SMP - for_each_possible_cpu(cpu) { - per_cpu(cpu_data, cpu).loops_per_jiffy = - loops; - } -#endif - /* Adjust the global one */ - loops_per_jiffy = loops; -} - -/* Assumes PLL4 is off and the acpuclock isn't sourced from PLL4 */ -static void acpuclk_config_pll4(struct pll_config *pll) -{ - /* - * Make sure write to disable PLL_4 has completed - * before reconfiguring that PLL. - */ - mb(); - writel_relaxed(pll->l, PLL4_L_VAL_ADDR); - writel_relaxed(pll->m, PLL4_M_VAL_ADDR); - writel_relaxed(pll->n, PLL4_N_VAL_ADDR); - /* Make sure PLL is programmed before returning. */ - mb(); -} - -/* Set proper dividers for the given clock speed. */ -static void acpuclk_set_div(const struct clkctl_acpu_speed *hunt_s) -{ - uint32_t reg_clkctl, reg_clksel, clk_div, src_sel; - - reg_clksel = readl_relaxed(A11S_CLK_SEL_ADDR); - - /* AHB_CLK_DIV */ - clk_div = (reg_clksel >> 1) & 0x03; - /* CLK_SEL_SRC1NO */ - src_sel = reg_clksel & 1; - - /* - * If the new clock divider is higher than the previous, then - * program the divider before switching the clock - */ - if (hunt_s->ahbclk_div > clk_div) { - reg_clksel &= ~(0x3 << 1); - reg_clksel |= (hunt_s->ahbclk_div << 1); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - } - - /* Program clock source and divider */ - reg_clkctl = readl_relaxed(A11S_CLK_CNTL_ADDR); - reg_clkctl &= ~(0xFF << (8 * src_sel)); - reg_clkctl |= hunt_s->a11clk_src_sel << (4 + 8 * src_sel); - reg_clkctl |= hunt_s->a11clk_src_div << (0 + 8 * src_sel); - writel_relaxed(reg_clkctl, A11S_CLK_CNTL_ADDR); - - /* Program clock source selection */ - reg_clksel ^= 1; - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - - /* Wait for the clock switch to complete */ - mb(); - udelay(50); - - /* - * If the new clock divider is lower than the previous, then - * program the divider after switching the clock - */ - if (hunt_s->ahbclk_div < clk_div) { - reg_clksel &= ~(0x3 << 1); - reg_clksel |= (hunt_s->ahbclk_div << 1); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - } -} - -static int acpuclk_set_vdd_level(int vdd) -{ - int rc; - - rc = regulator_set_voltage(drv_state.vreg_cpu, vdd, vdd); - if (rc) { - pr_err("failed to set vdd=%d uV\n", vdd); - return rc; - } - - return 0; -} - -static int acpuclk_8625q_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - uint32_t reg_clkctl; - struct clkctl_acpu_speed *cur_s, *tgt_s, *strt_s; - int res, rc = 0; - unsigned int plls_enabled = 0, pll; - int delta; - - - if (reason == SETRATE_CPUFREQ) - mutex_lock(&drv_state.lock); - - strt_s = cur_s = drv_state.current_speed; - - WARN_ONCE(cur_s == NULL, "%s: not initialized\n", __func__); - if (cur_s == NULL) { - rc = -ENOENT; - goto out; - } - - cur_s->vdd = regulator_get_voltage(drv_state.vreg_cpu); - if (cur_s->vdd <= 0) - goto out; - - pr_debug("current freq=%dKhz vdd=%duV\n", - cur_s->a11clk_khz, cur_s->vdd); - - if (rate == cur_s->a11clk_khz) - goto out; - - for (tgt_s = acpu_freq_tbl; tgt_s->a11clk_khz != 0; tgt_s++) { - if (tgt_s->a11clk_khz == rate) - break; - } - - if (tgt_s->a11clk_khz == 0) { - rc = -EINVAL; - goto out; - } - - /* Choose the highest speed at or below 'rate' with same PLL. */ - if (reason != SETRATE_CPUFREQ - && tgt_s->a11clk_khz < cur_s->a11clk_khz) { - while (tgt_s->pll != ACPU_PLL_TCXO && - tgt_s->pll != cur_s->pll) { - pr_debug("Intermediate frequency changes: %u\n", - tgt_s->a11clk_khz); - tgt_s--; - } - } - - if (strt_s->pll != ACPU_PLL_TCXO) - plls_enabled |= 1 << strt_s->pll; - - /* Need to do this when coming out of power collapse since some modem - * firmwares reset the VDD when the application processor enters power - * collapse. - */ - if (reason == SETRATE_CPUFREQ || reason == SETRATE_PC) { - /* Increase VDD if needed. */ - if (tgt_s->vdd > cur_s->vdd) { - rc = acpuclk_set_vdd_level(tgt_s->vdd); - if (rc < 0) { - pr_err("Unable to switch ACPU vdd (%d)\n", rc); - goto out; - } - pr_debug("Increased Vdd to %duV\n", tgt_s->vdd); - } - } - - /* Set wait states for CPU inbetween frequency changes */ - reg_clkctl = readl_relaxed(A11S_CLK_CNTL_ADDR); - reg_clkctl |= (100 << 16); /* set WT_ST_CNT */ - writel_relaxed(reg_clkctl, A11S_CLK_CNTL_ADDR); - - pr_debug("Switching from ACPU rate %u KHz -> %u KHz\n", - strt_s->a11clk_khz, tgt_s->a11clk_khz); - - delta = abs((int)(strt_s->a11clk_khz - tgt_s->a11clk_khz)); - - if (tgt_s->pll == ACPU_PLL_4) { - if (strt_s->pll == ACPU_PLL_4 || - delta > drv_state.max_speed_delta_khz) { - /* - * Enable the backup PLL if required - * and switch to it. - */ - clk_enable(pll_clk[backup_s->pll].clk); - acpuclk_set_div(backup_s); - update_jiffies(cpu, backup_s->lpj); - } - /* Make sure PLL4 is off before reprogramming */ - if ((plls_enabled & (1 << tgt_s->pll))) { - clk_disable(pll_clk[tgt_s->pll].clk); - plls_enabled &= ~(1 << tgt_s->pll); - } - acpuclk_config_pll4(tgt_s->pll_rate); - pll_clk[tgt_s->pll].clk->rate = tgt_s->a11clk_khz*1000; - - } else if (strt_s->pll == ACPU_PLL_4) { - if (delta > drv_state.max_speed_delta_khz) { - /* - * Enable the bcackup PLL if required - * and switch to it. - */ - clk_enable(pll_clk[backup_s->pll].clk); - acpuclk_set_div(backup_s); - update_jiffies(cpu, backup_s->lpj); - } - } - - if ((tgt_s->pll != ACPU_PLL_TCXO) && - !(plls_enabled & (1 << tgt_s->pll))) { - rc = clk_enable(pll_clk[tgt_s->pll].clk); - if (rc < 0) { - pr_err("PLL%d enable failed (%d)\n", - tgt_s->pll, rc); - goto out; - } - plls_enabled |= 1 << tgt_s->pll; - } - acpuclk_set_div(tgt_s); - drv_state.current_speed = tgt_s; - pr_debug("The new clock speed is %u\n", tgt_s->a11clk_khz); - /* Re-adjust lpj for the new clock speed. */ - update_jiffies(cpu, tgt_s->lpj); - - /* Disable the backup PLL */ - if ((delta > drv_state.max_speed_delta_khz) - || (strt_s->pll == ACPU_PLL_4 && - tgt_s->pll == ACPU_PLL_4)) - clk_disable(pll_clk[backup_s->pll].clk); - - /* Nothing else to do for SWFI. */ - if (reason == SETRATE_SWFI) - goto out; - - /* Change the AXI bus frequency if we can. */ - if (reason != SETRATE_PC && - strt_s->axiclk_khz != tgt_s->axiclk_khz) { - res = clk_set_rate(drv_state.ebi1_clk, - tgt_s->axiclk_khz * 1000); - pr_debug("AXI bus set freq %d\n", - tgt_s->axiclk_khz * 1000); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - } - - /* Disable PLLs we are not using anymore. */ - if (tgt_s->pll != ACPU_PLL_TCXO) - plls_enabled &= ~(1 << tgt_s->pll); - for (pll = ACPU_PLL_0; pll < ACPU_PLL_END; pll++) - if (plls_enabled & (1 << pll)) - clk_disable(pll_clk[pll].clk); - - /* Nothing else to do for power collapse. */ - if (reason == SETRATE_PC) - goto out; - - /* Drop VDD level if we can. */ - if (tgt_s->vdd < strt_s->vdd) { - res = acpuclk_set_vdd_level(tgt_s->vdd); - if (res < 0) - pr_warning("Unable to drop ACPU vdd (%d)\n", res); - pr_debug("Decreased Vdd to %duV\n", tgt_s->vdd); - } - - pr_debug("ACPU speed change complete\n"); -out: - if (reason == SETRATE_CPUFREQ) - mutex_unlock(&drv_state.lock); - - return rc; -} - -static int acpuclk_hw_init(void) -{ - struct clkctl_acpu_speed *speed; - uint32_t div, sel, reg_clksel; - int res; - - /* - * Prepare all the PLLs because we enable/disable them - * from atomic context and can't always ensure they're - * all prepared in non-atomic context. Same goes for - * ebi1_acpu_clk. - */ - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_0].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_1].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_2].clk)); - BUG_ON(clk_prepare(pll_clk[ACPU_PLL_4].clk)); - BUG_ON(clk_prepare(drv_state.ebi1_clk)); - - /* - * Determine the rate of ACPU clock - */ - - if (!(readl_relaxed(A11S_CLK_SEL_ADDR) & 0x01)) { /* CLK_SEL_SRC1N0 */ - /* CLK_SRC0_SEL */ - sel = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 12) & 0x7; - /* CLK_SRC0_DIV */ - div = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 8) & 0x0f; - } else { - /* CLK_SRC1_SEL */ - sel = (readl_relaxed(A11S_CLK_CNTL_ADDR) >> 4) & 0x07; - /* CLK_SRC1_DIV */ - div = readl_relaxed(A11S_CLK_CNTL_ADDR) & 0x0f; - } - - for (speed = acpu_freq_tbl; speed->a11clk_khz != 0; speed++) { - if (speed->a11clk_src_sel == sel - && (speed->a11clk_src_div == div)) - break; - } - if (speed->a11clk_khz == 0) { - pr_err("Error - ACPU clock reports invalid speed\n"); - return -EINVAL; - } - - drv_state.current_speed = speed; - if (speed->pll != ACPU_PLL_TCXO) { - if (clk_enable(pll_clk[speed->pll].clk)) { - pr_warning("Failed to vote for boot PLL\n"); - return -ENODEV; - } - } - - reg_clksel = readl_relaxed(A11S_CLK_SEL_ADDR); - reg_clksel &= ~(0x3 << 14); - reg_clksel |= (0x1 << 14); - writel_relaxed(reg_clksel, A11S_CLK_SEL_ADDR); - - res = clk_set_rate(drv_state.ebi1_clk, speed->axiclk_khz * 1000); - if (res < 0) { - pr_warning("Setting AXI min rate failed (%d)\n", res); - return -ENODEV; - } - res = clk_enable(drv_state.ebi1_clk); - if (res < 0) { - pr_warning("Enabling AXI clock failed (%d)\n", res); - return -ENODEV; - } - - drv_state.vreg_cpu = regulator_get(NULL, "vddx_cx"); - if (IS_ERR(drv_state.vreg_cpu)) { - res = PTR_ERR(drv_state.vreg_cpu); - pr_err("could not get regulator: %d\n", res); - } - - pr_info("ACPU running at %d KHz\n", speed->a11clk_khz); - return 0; -} - -static unsigned long acpuclk_8625q_get_rate(int cpu) -{ - WARN_ONCE(drv_state.current_speed == NULL, - "%s: not initialized\n", __func__); - if (drv_state.current_speed) - return drv_state.current_speed->a11clk_khz; - else - return 0; -} - -static int reinitialize_freq_table(bool target_select) -{ - /* - * target_flag is set only if it is a Quad core chip, - * In that case, we modify the initialization - * of the table according to the specific requirement - * for this target. Otherwise the default initialized table is - * used for SKUD_prime. - */ - if (target_select) { - struct clkctl_acpu_speed *tbl; - for (tbl = acpu_freq_tbl; tbl->a11clk_khz; tbl++) { - - if (tbl->a11clk_khz >= 1008000) { - tbl->axiclk_khz = 300000; - if (tbl->a11clk_khz == 1209600) - tbl->vdd = 0; - } else { - if (tbl->a11clk_khz != 600000 - && tbl->a11clk_khz != 19200) - tbl->vdd = 1050000; - if (tbl->a11clk_khz == 700800) - tbl->axiclk_khz = 245000; - } - } - - } - return 0; -} - -#define MHZ 1000000 - -static void select_freq_plan(unsigned int pvs_voltage, - bool target_sel) -{ - unsigned long pll_mhz[ACPU_PLL_END]; - int i; - int size; - int delta[3] = {DELTA_LEVEL_1_UV, DELTA_LEVEL_2_UV, DELTA_LEVEL_3_UV}; - struct clkctl_acpu_speed *tbl; - - /* Get PLL clocks */ - for (i = 0; i < ACPU_PLL_END; i++) { - if (pll_clk[i].name) { - pll_clk[i].clk = clk_get_sys("acpu", pll_clk[i].name); - if (IS_ERR(pll_clk[i].clk)) { - pll_mhz[i] = 0; - continue; - } - /* Get PLL's Rate */ - pll_mhz[i] = clk_get_rate(pll_clk[i].clk)/MHZ; - } - } - - memcpy(acpu_freq_tbl, acpu_freq_tbl_cmn, sizeof(acpu_freq_tbl_cmn)); - size = ARRAY_SIZE(acpu_freq_tbl_cmn); - - i = 0; /* needed if we have a 1Ghz part */ - /* select if it is a 1.2Ghz part */ - if (pll_mhz[ACPU_PLL_4] == 1209) { - memcpy(acpu_freq_tbl + size, acpu_freq_tbl_1209, - sizeof(acpu_freq_tbl_1209)); - size += sizeof(acpu_freq_tbl_1209); - i = 1; /* set the delta index */ - } - /* select if it is a 1.4Ghz part */ - if (pll_mhz[ACPU_PLL_4] == 1401) { - memcpy(acpu_freq_tbl + size, acpu_freq_tbl_1209, - sizeof(acpu_freq_tbl_1209)); - size += ARRAY_SIZE(acpu_freq_tbl_1209); - memcpy(acpu_freq_tbl + size, acpu_freq_tbl_1401, - sizeof(acpu_freq_tbl_1401)); - size += ARRAY_SIZE(acpu_freq_tbl_1401); - i = 2; /* set the delta index */ - } - - memcpy(acpu_freq_tbl + size, acpu_freq_tbl_null, - sizeof(acpu_freq_tbl_null)); - size += sizeof(acpu_freq_tbl_null); - - /* Alter the freq value in freq_tbl if it is a CDMA build*/ - if (pll_mhz[ACPU_PLL_1] == 196) { - - for (tbl = acpu_freq_tbl; tbl->a11clk_khz; tbl++) { - if (tbl->a11clk_khz == 245760 && - tbl->pll == ACPU_PLL_1) { - pr_debug("Upgrading pll1 freq to 196 Mhz\n"); - memcpy(tbl, acpu_freq_tbl_196608, - sizeof(acpu_freq_tbl_196608)); - break; - } - } - } - - reinitialize_freq_table(target_sel); - - /* - *PVS Voltage calculation formula - *1.4 Ghz device - *1.4 Ghz: Max(PVS_voltage,1.35V) - *1.2 Ghz: Max(PVS_volatge - 75mV,1.275V) - *1.0 Ghz: Max(PVS_voltage - 150mV, 1.175V) - *1.2 Ghz device - *1.2 Ghz: Max(PVS_voltage,1.275V) - *1.0 Ghz: Max(PVS_volatge - 75mV,1.175V) - *Nominal Mode: 1.15V - */ - for (tbl = acpu_freq_tbl; tbl->a11clk_khz; tbl++) { - if (tbl->a11clk_khz >= 1008000) { - /* - * Change voltage as per PVS formula, - * i is initialized above with 2 or 1 - * depending upon whether it is a 1.4Ghz - * or 1.2Ghz, so, we get the proper value - * from delta[i] which is to be deducted - * from PVS voltage. - */ - - tbl->vdd = max((int)(pvs_voltage - delta[i]), tbl->vdd); - i--; - } - } - - - /* find the backup PLL entry from the table */ - for (tbl = acpu_freq_tbl; tbl->a11clk_khz; tbl++) { - if (tbl->pll == ACPU_PLL_2 && - tbl->a11clk_src_div == 1) { - backup_s = tbl; - break; - } - } - - BUG_ON(!backup_s); - -} - -/* - * Hardware requires the CPU to be dropped to less than MAX_WAIT_FOR_IRQ_KHZ - * before entering a wait for irq low-power mode. Find a suitable rate. - */ -static unsigned long find_wait_for_irq_khz(void) -{ - unsigned long found_khz = 0; - int i; - - for (i = 0; acpu_freq_tbl[i].a11clk_khz && - acpu_freq_tbl[i].a11clk_khz <= MAX_WAIT_FOR_IRQ_KHZ; i++) - found_khz = acpu_freq_tbl[i].a11clk_khz; - - return found_khz; -} - -static void lpj_init(void) -{ - int i = 0, cpu; - const struct clkctl_acpu_speed *base_clk = drv_state.current_speed; - unsigned long loops; - - for_each_possible_cpu(cpu) { -#ifdef CONFIG_SMP - loops = per_cpu(cpu_data, cpu).loops_per_jiffy; -#else - loops = loops_per_jiffy; -#endif - for (i = 0; acpu_freq_tbl[i].a11clk_khz; i++) { - acpu_freq_tbl[i].lpj = cpufreq_scale( - loops, - base_clk->a11clk_khz, - acpu_freq_tbl[i].a11clk_khz); - } - - } - -} - -static struct acpuclk_data acpuclk_8625q_data = { - .set_rate = acpuclk_8625q_set_rate, - .get_rate = acpuclk_8625q_get_rate, - .power_collapse_khz = POWER_COLLAPSE_KHZ, - .switch_time_us = 50, -}; - -static void print_acpu_freq_tbl(void) -{ - struct clkctl_acpu_speed *t; - int i; - - pr_info("Id CPU-KHz PLL DIV AHB-KHz ADIV AXI-KHz Vdd\n"); - - t = &acpu_freq_tbl[0]; - for (i = 0; t->a11clk_khz != 0; i++) { - pr_info("%2d %7d %3d %3d %7d %4d %7d %3d\n", - i, t->a11clk_khz, t->pll, t->a11clk_src_div + 1, - t->ahbclk_khz, t->ahbclk_div + 1, t->axiclk_khz, - t->vdd); - t++; - } -} - -static int acpuclk_8625q_probe(struct platform_device *pdev) -{ - const struct acpuclk_pdata_8625q *pdata = pdev->dev.platform_data; - unsigned int pvs_voltage = pdata->pvs_voltage_uv; - bool target_sel = pdata->flag; - - drv_state.max_speed_delta_khz = pdata->acpu_clk_data-> - max_speed_delta_khz; - - drv_state.ebi1_clk = clk_get(NULL, "ebi1_acpu_clk"); - BUG_ON(IS_ERR(drv_state.ebi1_clk)); - - mutex_init(&drv_state.lock); - select_freq_plan(pvs_voltage, target_sel); - acpuclk_8625q_data.wait_for_irq_khz = find_wait_for_irq_khz(); - - if (acpuclk_hw_init() < 0) - pr_err("acpuclk_hw_init not successful.\n"); - - print_acpu_freq_tbl(); - lpj_init(); - acpuclk_register(&acpuclk_8625q_data); - - cpufreq_table_init(); - - return 0; -} - -static struct platform_driver acpuclk_8625q_driver = { - .probe = acpuclk_8625q_probe, - .driver = { - .name = "acpuclock-8625q", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_8625q_init(void) -{ - - return platform_driver_register(&acpuclk_8625q_driver); -} -postcore_initcall(acpuclk_8625q_init); diff --git a/arch/arm/mach-msm/acpuclock-8625q.h b/arch/arm/mach-msm/acpuclock-8625q.h deleted file mode 100644 index ced2f706164c..000000000000 --- a/arch/arm/mach-msm/acpuclock-8625q.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * MSM architecture CPU clock driver header - * - * Copyright (c) 2012, Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __ARCH_ARM_MACH_MSM_ACPUCLOCK_8625Q_H -#define __ARCH_ARM_MACH_MSM_ACPUCLOCK_8625Q_H - -# include "acpuclock.h" -/** - * struct acpuclk_pdata_8625q - Platform data for acpuclk - */ -struct acpuclk_pdata_8625q { - struct acpuclk_pdata *acpu_clk_data; - unsigned int pvs_voltage_uv; - bool flag; -}; - -#endif /* __ARCH_ARM_MACH_MSM_ACPUCLOCK_8625Q_H */ diff --git a/arch/arm/mach-msm/acpuclock-8x50.c b/arch/arm/mach-msm/acpuclock-8x50.c deleted file mode 100644 index cb4159b5dfd5..000000000000 --- a/arch/arm/mach-msm/acpuclock-8x50.c +++ /dev/null @@ -1,715 +0,0 @@ -/* Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "acpuclock.h" -#include "avs.h" - -#define SHOT_SWITCH 4 -#define HOP_SWITCH 5 -#define SIMPLE_SLEW 6 -#define COMPLEX_SLEW 7 - -#define SPSS_CLK_CNTL_ADDR (MSM_CSR_BASE + 0x100) -#define SPSS_CLK_SEL_ADDR (MSM_CSR_BASE + 0x104) - -/* Scorpion PLL registers */ -#define SCPLL_CTL_ADDR (MSM_SCPLL_BASE + 0x4) -#define SCPLL_STATUS_ADDR (MSM_SCPLL_BASE + 0x18) -#define SCPLL_FSM_CTL_EXT_ADDR (MSM_SCPLL_BASE + 0x10) - -#ifdef CONFIG_QSD_SVS -#define TPS65023_MAX_DCDC1 1600 -#else -#define TPS65023_MAX_DCDC1 CONFIG_QSD_PMIC_DEFAULT_DCDC1 -#endif - -enum { - ACPU_PLL_TCXO = -1, - ACPU_PLL_0 = 0, - ACPU_PLL_1, - ACPU_PLL_2, - ACPU_PLL_3, - ACPU_PLL_END, -}; - -struct clkctl_acpu_speed { - unsigned int use_for_scaling; - unsigned int acpuclk_khz; - int pll; - unsigned int acpuclk_src_sel; - unsigned int acpuclk_src_div; - unsigned int ahbclk_khz; - unsigned int ahbclk_div; - unsigned int axiclk_khz; - unsigned int sc_core_src_sel_mask; - unsigned int sc_l_value; - int vdd; - unsigned long lpj; /* loops_per_jiffy */ -}; - -struct clkctl_acpu_speed acpu_freq_tbl_998[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 0, 0, 14000, 0, 0, 1000}, - { 0, 128000, ACPU_PLL_1, 1, 5, 0, 0, 14000, 2, 0, 1000}, - { 1, 245760, ACPU_PLL_0, 4, 0, 0, 0, 29000, 0, 0, 1000}, - /* Update AXI_S and PLL0_S macros if above row numbers change. */ - { 1, 384000, ACPU_PLL_3, 0, 0, 0, 0, 58000, 1, 0xA, 1000}, - { 0, 422400, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xB, 1000}, - { 0, 460800, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xC, 1000}, - { 0, 499200, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xD, 1050}, - { 0, 537600, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xE, 1050}, - { 1, 576000, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xF, 1050}, - { 0, 614400, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x10, 1075}, - { 0, 652800, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x11, 1100}, - { 0, 691200, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x12, 1125}, - { 0, 729600, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x13, 1150}, - { 1, 768000, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x14, 1150}, - { 0, 806400, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x15, 1175}, - { 0, 844800, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x16, 1225}, - { 0, 883200, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x17, 1250}, - { 0, 921600, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x18, 1300}, - { 0, 960000, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x19, 1300}, - { 1, 998400, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x1A, 1300}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; - -struct clkctl_acpu_speed acpu_freq_tbl_768[] = { - { 0, 19200, ACPU_PLL_TCXO, 0, 0, 0, 0, 14000, 0, 0, 1000}, - { 0, 128000, ACPU_PLL_1, 1, 5, 0, 0, 14000, 2, 0, 1000}, - { 1, 245760, ACPU_PLL_0, 4, 0, 0, 0, 29000, 0, 0, 1000}, - /* Update AXI_S and PLL0_S macros if above row numbers change. */ - { 1, 384000, ACPU_PLL_3, 0, 0, 0, 0, 58000, 1, 0xA, 1075}, - { 0, 422400, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xB, 1100}, - { 0, 460800, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xC, 1125}, - { 0, 499200, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xD, 1150}, - { 0, 537600, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xE, 1150}, - { 1, 576000, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0xF, 1150}, - { 0, 614400, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x10, 1175}, - { 0, 652800, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x11, 1200}, - { 0, 691200, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x12, 1225}, - { 0, 729600, ACPU_PLL_3, 0, 0, 0, 0, 117000, 1, 0x13, 1250}, - { 1, 768000, ACPU_PLL_3, 0, 0, 0, 0, 128000, 1, 0x14, 1250}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; - -static struct clkctl_acpu_speed *acpu_freq_tbl = acpu_freq_tbl_998; -#define AXI_S (&acpu_freq_tbl[1]) -#define PLL0_S (&acpu_freq_tbl[2]) - -/* Use 128MHz for PC since ACPU will auto-switch to AXI (128MHz) before - * coming back up. This allows detection of return-from-PC, since 128MHz - * is only used for power collapse. */ -#define POWER_COLLAPSE_KHZ 128000 -/* Use 245MHz (not 128MHz) for SWFI to avoid unnecessary steps between - * 128MHz<->245MHz. Jumping to high frequencies from 128MHz directly - * is not allowed. */ -#define WAIT_FOR_IRQ_KHZ 245760 - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table freq_table[20]; - -static void cpufreq_table_init(void) -{ - unsigned int i; - unsigned int freq_cnt = 0; - - /* Construct the freq_table table from acpu_freq_tbl since the - * freq_table values need to match frequencies specified in - * acpu_freq_tbl and acpu_freq_tbl needs to be fixed up during init. - */ - for (i = 0; acpu_freq_tbl[i].acpuclk_khz != 0 - && freq_cnt < ARRAY_SIZE(freq_table)-1; i++) { - if (acpu_freq_tbl[i].use_for_scaling) { - freq_table[freq_cnt].index = freq_cnt; - freq_table[freq_cnt].frequency - = acpu_freq_tbl[i].acpuclk_khz; - freq_cnt++; - } - } - - /* freq_table not big enough to store all usable freqs. */ - BUG_ON(acpu_freq_tbl[i].acpuclk_khz != 0); - - freq_table[freq_cnt].index = freq_cnt; - freq_table[freq_cnt].frequency = CPUFREQ_TABLE_END; - - pr_info("%d scaling frequencies supported.\n", freq_cnt); -} -#endif - -struct clock_state { - struct clkctl_acpu_speed *current_speed; - struct mutex lock; - struct clk *ebi1_clk; - int (*acpu_set_vdd) (int mvolts); -}; - -static struct clock_state drv_state = { 0 }; - -static void scpll_set_freq(uint32_t lval, unsigned freq_switch) -{ - uint32_t regval; - - if (lval > 33) - lval = 33; - if (lval < 10) - lval = 10; - - /* wait for any calibrations or frequency switches to finish */ - while (readl(SCPLL_STATUS_ADDR) & 0x3) - ; - - /* write the new L val and switch mode */ - regval = readl(SCPLL_FSM_CTL_EXT_ADDR); - regval &= ~(0x3f << 3); - regval |= (lval << 3); - if (freq_switch == SIMPLE_SLEW) - regval |= (0x1 << 9); - - regval &= ~(0x3 << 0); - regval |= (freq_switch << 0); - writel(regval, SCPLL_FSM_CTL_EXT_ADDR); - - dmb(); - - /* put in normal mode */ - regval = readl(SCPLL_CTL_ADDR); - regval |= 0x7; - writel(regval, SCPLL_CTL_ADDR); - - dmb(); - - /* wait for frequency switch to finish */ - while (readl(SCPLL_STATUS_ADDR) & 0x1) - ; - - /* status bit seems to clear early, using - * 100us to handle the worst case. */ - udelay(100); -} - -static void scpll_apps_enable(bool state) -{ - uint32_t regval; - - if (state) - pr_debug("Enabling PLL 3\n"); - else - pr_debug("Disabling PLL 3\n"); - - /* Wait for any frequency switches to finish. */ - while (readl(SCPLL_STATUS_ADDR) & 0x1) - ; - - /* put the pll in standby mode */ - regval = readl(SCPLL_CTL_ADDR); - regval &= ~(0x7); - regval |= (0x2); - writel(regval, SCPLL_CTL_ADDR); - - dmb(); - - if (state) { - /* put the pll in normal mode */ - regval = readl(SCPLL_CTL_ADDR); - regval |= (0x7); - writel(regval, SCPLL_CTL_ADDR); - udelay(200); - } else { - /* put the pll in power down mode */ - regval = readl(SCPLL_CTL_ADDR); - regval &= ~(0x7); - writel(regval, SCPLL_CTL_ADDR); - } - udelay(62); - - if (state) - pr_debug("PLL 3 Enabled\n"); - else - pr_debug("PLL 3 Disabled\n"); -} - -static void scpll_init(void) -{ - uint32_t regval; -#define L_VAL_384MHZ 0xA -#define L_VAL_768MHZ 0x14 - - pr_debug("Initializing PLL 3\n"); - - /* power down scpll */ - writel(0x0, SCPLL_CTL_ADDR); - - dmb(); - - /* set bypassnl, put into standby */ - writel(0x00400002, SCPLL_CTL_ADDR); - - /* set bypassnl, reset_n, full calibration */ - writel(0x00600004, SCPLL_CTL_ADDR); - - /* Ensure register write to initiate calibration has taken - effect before reading status flag */ - dmb(); - - /* wait for cal_all_done */ - while (readl(SCPLL_STATUS_ADDR) & 0x2) - ; - - /* Start: Set of experimentally derived steps - * to work around a h/w bug. */ - - /* Put the pll in normal mode */ - scpll_apps_enable(1); - - /* SHOT switch to 384 MHz */ - regval = readl(SCPLL_FSM_CTL_EXT_ADDR); - regval &= ~(0x3f << 3); - regval |= (L_VAL_384MHZ << 3); - - regval &= ~0x7; - regval |= SHOT_SWITCH; - writel(regval, SCPLL_FSM_CTL_EXT_ADDR); - - /* Trigger the freq switch by putting pll in normal mode. */ - regval = readl(SCPLL_CTL_ADDR); - regval |= (0x7); - writel(regval, SCPLL_CTL_ADDR); - - /* Wait for frequency switch to finish */ - while (readl(SCPLL_STATUS_ADDR) & 0x1) - ; - - /* Status bit seems to clear early, using - * 800 microseconds for the worst case. */ - udelay(800); - - /* HOP switch to 768 MHz. */ - regval = readl(SCPLL_FSM_CTL_EXT_ADDR); - regval &= ~(0x3f << 3); - regval |= (L_VAL_768MHZ << 3); - - regval &= ~0x7; - regval |= HOP_SWITCH; - writel(regval, SCPLL_FSM_CTL_EXT_ADDR); - - /* Trigger the freq switch by putting pll in normal mode. */ - regval = readl(SCPLL_CTL_ADDR); - regval |= (0x7); - writel(regval, SCPLL_CTL_ADDR); - - /* Wait for frequency switch to finish */ - while (readl(SCPLL_STATUS_ADDR) & 0x1) - ; - - /* Status bit seems to clear early, using - * 100 microseconds for the worst case. */ - udelay(100); - - /* End: Work around for h/w bug */ - - /* Power down scpll */ - scpll_apps_enable(0); -} - -static void config_pll(struct clkctl_acpu_speed *s) -{ - uint32_t regval; - - if (s->pll == ACPU_PLL_3) - scpll_set_freq(s->sc_l_value, HOP_SWITCH); - /* Configure the PLL divider mux if we plan to use it. */ - else if (s->sc_core_src_sel_mask == 0) { - /* get the current clock source selection */ - regval = readl(SPSS_CLK_SEL_ADDR) & 0x1; - - /* configure the other clock source, then switch to it, - * using the glitch free mux */ - switch (regval) { - case 0x0: - regval = readl(SPSS_CLK_CNTL_ADDR); - regval &= ~(0x7 << 4 | 0xf); - regval |= (s->acpuclk_src_sel << 4); - regval |= (s->acpuclk_src_div << 0); - writel(regval, SPSS_CLK_CNTL_ADDR); - - regval = readl(SPSS_CLK_SEL_ADDR); - regval |= 0x1; - writel(regval, SPSS_CLK_SEL_ADDR); - break; - - case 0x1: - regval = readl(SPSS_CLK_CNTL_ADDR); - regval &= ~(0x7 << 12 | 0xf << 8); - regval |= (s->acpuclk_src_sel << 12); - regval |= (s->acpuclk_src_div << 8); - writel(regval, SPSS_CLK_CNTL_ADDR); - - regval = readl(SPSS_CLK_SEL_ADDR); - regval &= ~0x1; - writel(regval, SPSS_CLK_SEL_ADDR); - break; - } - dmb(); - } - - regval = readl(SPSS_CLK_SEL_ADDR); - regval &= ~(0x3 << 1); - regval |= (s->sc_core_src_sel_mask << 1); - writel(regval, SPSS_CLK_SEL_ADDR); -} - -static int acpuclk_set_vdd_level(int vdd) -{ - if (drv_state.acpu_set_vdd) { - pr_debug("Switching VDD to %d mV\n", vdd); - return drv_state.acpu_set_vdd(vdd); - } else { - /* Assume that the PMIC supports scaling the processor - * to its maximum frequency at its default voltage. - */ - return 0; - } -} - -static int acpuclk_8x50_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - struct clkctl_acpu_speed *tgt_s, *strt_s; - int res, rc = 0; - int freq_index = 0; - - if (reason == SETRATE_CPUFREQ) - mutex_lock(&drv_state.lock); - - strt_s = drv_state.current_speed; - - if (rate == strt_s->acpuclk_khz) - goto out; - - for (tgt_s = acpu_freq_tbl; tgt_s->acpuclk_khz != 0; tgt_s++) { - if (tgt_s->acpuclk_khz == rate) - break; - freq_index++; - } - - if (tgt_s->acpuclk_khz == 0) { - rc = -EINVAL; - goto out; - } - - if (reason == SETRATE_CPUFREQ) { - /* Increase VDD if needed. */ - if (tgt_s->vdd > strt_s->vdd) { - rc = acpuclk_set_vdd_level(tgt_s->vdd); - if (rc) { - pr_err("Unable to increase ACPU vdd (%d)\n", - rc); - goto out; - } - } - } else if (reason == SETRATE_PC - && rate != POWER_COLLAPSE_KHZ) { - /* Returning from PC. ACPU is running on AXI source. - * Step up to PLL0 before ramping up higher. */ - config_pll(PLL0_S); - } - - pr_debug("Switching from ACPU rate %u KHz -> %u KHz\n", - strt_s->acpuclk_khz, tgt_s->acpuclk_khz); - - if (strt_s->pll != ACPU_PLL_3 && tgt_s->pll != ACPU_PLL_3) { - config_pll(tgt_s); - } else if (strt_s->pll != ACPU_PLL_3 && tgt_s->pll == ACPU_PLL_3) { - scpll_apps_enable(1); - config_pll(tgt_s); - } else if (strt_s->pll == ACPU_PLL_3 && tgt_s->pll != ACPU_PLL_3) { - config_pll(tgt_s); - scpll_apps_enable(0); - } else { - /* Temporarily switch to PLL0 while reconfiguring PLL3. */ - config_pll(PLL0_S); - config_pll(tgt_s); - } - - /* Update the driver state with the new clock freq */ - drv_state.current_speed = tgt_s; - - /* Re-adjust lpj for the new clock speed. */ - loops_per_jiffy = tgt_s->lpj; - - /* Nothing else to do for SWFI. */ - if (reason == SETRATE_SWFI) - goto out; - - if (strt_s->axiclk_khz != tgt_s->axiclk_khz) { - res = clk_set_rate(drv_state.ebi1_clk, - tgt_s->axiclk_khz * 1000); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - } - - /* Nothing else to do for power collapse */ - if (reason == SETRATE_PC) - goto out; - - /* Drop VDD level if we can. */ - if (tgt_s->vdd < strt_s->vdd) { - res = acpuclk_set_vdd_level(tgt_s->vdd); - if (res) - pr_warning("Unable to drop ACPU vdd (%d)\n", res); - } - - pr_debug("ACPU speed change complete\n"); -out: - if (reason == SETRATE_CPUFREQ) - mutex_unlock(&drv_state.lock); - return rc; -} - -static void acpuclk_hw_init(void) -{ - struct clkctl_acpu_speed *speed; - uint32_t div, sel, regval; - int res; - - /* Determine the source of the Scorpion clock. */ - regval = readl(SPSS_CLK_SEL_ADDR); - switch ((regval & 0x6) >> 1) { - case 0: /* raw source clock */ - case 3: /* low jitter PLL1 (768Mhz) */ - if (regval & 0x1) { - sel = ((readl(SPSS_CLK_CNTL_ADDR) >> 4) & 0x7); - div = ((readl(SPSS_CLK_CNTL_ADDR) >> 0) & 0xf); - } else { - sel = ((readl(SPSS_CLK_CNTL_ADDR) >> 12) & 0x7); - div = ((readl(SPSS_CLK_CNTL_ADDR) >> 8) & 0xf); - } - - /* Find the matching clock rate. */ - for (speed = acpu_freq_tbl; speed->acpuclk_khz != 0; speed++) { - if (speed->acpuclk_src_sel == sel && - speed->acpuclk_src_div == div) - break; - } - break; - - case 1: /* unbuffered scorpion pll (384Mhz to 998.4Mhz) */ - sel = ((readl(SCPLL_FSM_CTL_EXT_ADDR) >> 3) & 0x3f); - - /* Find the matching clock rate. */ - for (speed = acpu_freq_tbl; speed->acpuclk_khz != 0; speed++) { - if (speed->sc_l_value == sel && - speed->sc_core_src_sel_mask == 1) - break; - } - break; - - case 2: /* AXI bus clock (128Mhz) */ - speed = AXI_S; - break; - default: - BUG(); - } - - /* Initialize scpll only if it wasn't already initialized by the boot - * loader. If the CPU is already running on scpll, then the scpll was - * initialized by the boot loader. */ - if (speed->pll != ACPU_PLL_3) - scpll_init(); - - if (speed->acpuclk_khz == 0) { - pr_err("Error - ACPU clock reports invalid speed\n"); - return; - } - - drv_state.current_speed = speed; - res = clk_set_rate(drv_state.ebi1_clk, speed->axiclk_khz * 1000); - if (res < 0) - pr_warning("Setting AXI min rate failed (%d)\n", res); - res = clk_enable(drv_state.ebi1_clk); - if (res < 0) - pr_warning("Enabling AXI clock failed (%d)\n", res); - - pr_info("ACPU running at %d KHz\n", speed->acpuclk_khz); -} - -static unsigned long acpuclk_8x50_get_rate(int cpu) -{ - return drv_state.current_speed->acpuclk_khz; -} - -/* Spare register populated with efuse data on max ACPU freq. */ -#define CT_CSR_PHYS 0xA8700000 -#define TCSR_SPARE2_ADDR (ct_csr_base + 0x60) - -#define PLL0_M_VAL_ADDR (MSM_CLK_CTL_BASE + 0x308) - -static void acpu_freq_tbl_fixup(void) -{ - void __iomem *ct_csr_base; - uint32_t tcsr_spare2, pll0_m_val; - unsigned int max_acpu_khz; - unsigned int i; - - ct_csr_base = ioremap(CT_CSR_PHYS, PAGE_SIZE); - BUG_ON(ct_csr_base == NULL); - - tcsr_spare2 = readl(TCSR_SPARE2_ADDR); - - /* Check if the register is supported and meaningful. */ - if ((tcsr_spare2 & 0xF000) != 0xA000) { - pr_info("Efuse data on Max ACPU freq not present.\n"); - goto skip_efuse_fixup; - } - - switch (tcsr_spare2 & 0xF0) { - case 0x70: - acpu_freq_tbl = acpu_freq_tbl_768; - max_acpu_khz = 768000; - break; - case 0x30: - case 0x00: - max_acpu_khz = 998400; - break; - case 0x10: - max_acpu_khz = 1267200; - break; - default: - pr_warning("Invalid efuse data (%x) on Max ACPU freq!\n", - tcsr_spare2); - goto skip_efuse_fixup; - } - - pr_info("Max ACPU freq from efuse data is %d KHz\n", max_acpu_khz); - - for (i = 0; acpu_freq_tbl[i].acpuclk_khz != 0; i++) { - if (acpu_freq_tbl[i].acpuclk_khz > max_acpu_khz) { - acpu_freq_tbl[i].acpuclk_khz = 0; - break; - } - } - -skip_efuse_fixup: - iounmap(ct_csr_base); - - /* pll0_m_val will be 36 when PLL0 is run at 235MHz - * instead of the usual 245MHz. */ - pll0_m_val = readl(PLL0_M_VAL_ADDR) & 0x7FFFF; - if (pll0_m_val == 36) - PLL0_S->acpuclk_khz = 235930; - - for (i = 0; acpu_freq_tbl[i].acpuclk_khz != 0; i++) { - if (acpu_freq_tbl[i].vdd > TPS65023_MAX_DCDC1) { - acpu_freq_tbl[i].acpuclk_khz = 0; - break; - } - } -} - -/* Initalize the lpj field in the acpu_freq_tbl. */ -static void lpj_init(void) -{ - int i; - const struct clkctl_acpu_speed *base_clk = drv_state.current_speed; - for (i = 0; acpu_freq_tbl[i].acpuclk_khz; i++) { - acpu_freq_tbl[i].lpj = cpufreq_scale(loops_per_jiffy, - base_clk->acpuclk_khz, - acpu_freq_tbl[i].acpuclk_khz); - } -} - - -static int qsd8x50_tps65023_set_dcdc1(int mVolts) -{ - int rc = 0; -#ifdef CONFIG_QSD_SVS - rc = tps65023_set_dcdc1_level(mVolts); - /* - * By default the TPS65023 will be initialized to 1.225V. - * So we can safely switch to any frequency within this - * voltage even if the device is not probed/ready. - */ - if (rc == -ENODEV && mVolts <= CONFIG_QSD_PMIC_DEFAULT_DCDC1) - rc = 0; -#else - /* - * Disallow frequencies not supported in the default PMIC - * output voltage. - */ - if (mVolts > CONFIG_QSD_PMIC_DEFAULT_DCDC1) - rc = -EFAULT; -#endif - return rc; -} - -static struct acpuclk_data acpuclk_8x50_data = { - .set_rate = acpuclk_8x50_set_rate, - .get_rate = acpuclk_8x50_get_rate, - .power_collapse_khz = POWER_COLLAPSE_KHZ, - .wait_for_irq_khz = WAIT_FOR_IRQ_KHZ, - .switch_time_us = 20, -}; - -static int acpuclk_8x50_probe(struct platform_device *pdev) -{ - mutex_init(&drv_state.lock); - drv_state.acpu_set_vdd = qsd8x50_tps65023_set_dcdc1; - - drv_state.ebi1_clk = clk_get(NULL, "ebi1_acpu_clk"); - BUG_ON(IS_ERR(drv_state.ebi1_clk)); - - acpu_freq_tbl_fixup(); - acpuclk_hw_init(); - lpj_init(); - /* Set a lower bound for ACPU rate for boot. This limits the - * maximum frequency hop caused by the first CPUFREQ switch. */ - if (drv_state.current_speed->acpuclk_khz < PLL0_S->acpuclk_khz) - acpuclk_set_rate(0, PLL0_S->acpuclk_khz, SETRATE_CPUFREQ); - - acpuclk_register(&acpuclk_8x50_data); - -#ifdef CONFIG_CPU_FREQ_MSM - cpufreq_table_init(); - cpufreq_frequency_table_get_attr(freq_table, smp_processor_id()); -#endif - return 0; -} - -static struct platform_driver acpuclk_8x50_driver = { - .probe = acpuclk_8x50_probe, - .driver = { - .name = "acpuclk-8x50", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_8x50_init(void) -{ - return platform_driver_register(&acpuclk_8x50_driver); -} -postcore_initcall(acpuclk_8x50_init); diff --git a/arch/arm/mach-msm/acpuclock-8x60.c b/arch/arm/mach-msm/acpuclock-8x60.c deleted file mode 100644 index de63febfba28..000000000000 --- a/arch/arm/mach-msm/acpuclock-8x60.c +++ /dev/null @@ -1,1105 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -#include "acpuclock.h" -#include "avs.h" - -/* Frequency switch modes. */ -#define SHOT_SWITCH 4 -#define HOP_SWITCH 5 -#define SIMPLE_SLEW 6 -#define COMPLEX_SLEW 7 - -/* PLL calibration limits. - * The PLL hardware has a minimum frequency of 384MHz. - * Calibration should respect this limit. */ -#define L_VAL_SCPLL_CAL_MIN 0x08 /* = 432 MHz with 27MHz source */ - -#define MAX_VDD_SC 1325000 /* uV */ -#define MAX_VDD_MEM 1325000 /* uV */ -#define MAX_VDD_DIG 1200000 /* uV */ -#define MAX_AXI 310500 /* KHz */ -#define SCPLL_LOW_VDD_FMAX 594000 /* KHz */ -#define SCPLL_LOW_VDD 1000000 /* uV */ -#define SCPLL_NOMINAL_VDD 1100000 /* uV */ - -/* SCPLL Modes. */ -#define SCPLL_POWER_DOWN 0 -#define SCPLL_BYPASS 1 -#define SCPLL_STANDBY 2 -#define SCPLL_FULL_CAL 4 -#define SCPLL_HALF_CAL 5 -#define SCPLL_STEP_CAL 6 -#define SCPLL_NORMAL 7 - -#define SCPLL_DEBUG_NONE 0 -#define SCPLL_DEBUG_FULL 3 - -/* SCPLL registers offsets. */ -#define SCPLL_DEBUG_OFFSET 0x0 -#define SCPLL_CTL_OFFSET 0x4 -#define SCPLL_CAL_OFFSET 0x8 -#define SCPLL_STATUS_OFFSET 0x10 -#define SCPLL_CFG_OFFSET 0x1C -#define SCPLL_FSM_CTL_EXT_OFFSET 0x24 -#define SCPLL_LUT_OFFSET(l_val) (0x38 + (((l_val) / 4) * 4)) - -/* Clock registers. */ -#define SPSS0_CLK_CTL_ADDR (MSM_ACC0_BASE + 0x04) -#define SPSS0_CLK_SEL_ADDR (MSM_ACC0_BASE + 0x08) -#define SPSS1_CLK_CTL_ADDR (MSM_ACC1_BASE + 0x04) -#define SPSS1_CLK_SEL_ADDR (MSM_ACC1_BASE + 0x08) -#define SPSS_L2_CLK_SEL_ADDR (MSM_GCC_BASE + 0x38) - -/* PTE EFUSE register. */ -#define QFPROM_PTE_EFUSE_ADDR (MSM_QFPROM_BASE + 0x00C0) - -static const void * const clk_ctl_addr[] = {SPSS0_CLK_CTL_ADDR, - SPSS1_CLK_CTL_ADDR}; -static const void * const clk_sel_addr[] = {SPSS0_CLK_SEL_ADDR, - SPSS1_CLK_SEL_ADDR, SPSS_L2_CLK_SEL_ADDR}; - -static const int rpm_vreg_voter[] = { RPM_VREG_VOTER1, RPM_VREG_VOTER2 }; -static struct regulator *regulator_sc[NR_CPUS]; - -enum scplls { - CPU0 = 0, - CPU1, - L2, -}; - -static const void * const sc_pll_base[] = { - [CPU0] = MSM_SCPLL_BASE + 0x200, - [CPU1] = MSM_SCPLL_BASE + 0x300, - [L2] = MSM_SCPLL_BASE + 0x400, -}; - -enum sc_src { - ACPU_AFAB, - ACPU_PLL_8, - ACPU_SCPLL, -}; - -static struct clock_state { - struct clkctl_acpu_speed *current_speed[NR_CPUS]; - struct clkctl_l2_speed *current_l2_speed; - spinlock_t l2_lock; - struct mutex lock; -} drv_state; - -struct clkctl_l2_speed { - unsigned int khz; - unsigned int src_sel; - unsigned int l_val; - unsigned int vdd_dig; - unsigned int vdd_mem; - unsigned int bw_level; -}; - -static struct clkctl_l2_speed *l2_vote[NR_CPUS]; - -struct clkctl_acpu_speed { - unsigned int use_for_scaling[2]; /* One for each CPU. */ - unsigned int acpuclk_khz; - int pll; - unsigned int acpuclk_src_sel; - unsigned int acpuclk_src_div; - unsigned int core_src_sel; - unsigned int l_val; - struct clkctl_l2_speed *l2_level; - unsigned int vdd_sc; - unsigned int avsdscr_setting; -}; - -/* Instantaneous bandwidth requests in MB/s. */ -#define BW_MBPS(_bw) \ - { \ - .vectors = &(struct msm_bus_vectors){ \ - .src = MSM_BUS_MASTER_AMPSS_M0, \ - .dst = MSM_BUS_SLAVE_EBI_CH0, \ - .ib = (_bw) * 1000000UL, \ - .ab = 0, \ - }, \ - .num_paths = 1, \ - } -static struct msm_bus_paths bw_level_tbl[] = { - [0] = BW_MBPS(824), /* At least 103 MHz on bus. */ - [1] = BW_MBPS(1336), /* At least 167 MHz on bus. */ - [2] = BW_MBPS(2008), /* At least 251 MHz on bus. */ - [3] = BW_MBPS(2480), /* At least 310 MHz on bus. */ -}; - -static struct msm_bus_scale_pdata bus_client_pdata = { - .usecase = bw_level_tbl, - .num_usecases = ARRAY_SIZE(bw_level_tbl), - .active_only = 1, - .name = "acpuclock", -}; - -static uint32_t bus_perf_client; - -/* L2 frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_l2_speed l2_freq_tbl_v2[] = { - [0] = { MAX_AXI, 0, 0, 1000000, 1100000, 0}, - [1] = { 432000, 1, 0x08, 1000000, 1100000, 0}, - [2] = { 486000, 1, 0x09, 1000000, 1100000, 0}, - [3] = { 540000, 1, 0x0A, 1000000, 1100000, 0}, - [4] = { 594000, 1, 0x0B, 1000000, 1100000, 0}, - [5] = { 648000, 1, 0x0C, 1000000, 1100000, 1}, - [6] = { 702000, 1, 0x0D, 1100000, 1100000, 1}, - [7] = { 756000, 1, 0x0E, 1100000, 1100000, 1}, - [8] = { 810000, 1, 0x0F, 1100000, 1100000, 1}, - [9] = { 864000, 1, 0x10, 1100000, 1100000, 1}, - [10] = { 918000, 1, 0x11, 1100000, 1100000, 2}, - [11] = { 972000, 1, 0x12, 1100000, 1100000, 2}, - [12] = {1026000, 1, 0x13, 1100000, 1100000, 2}, - [13] = {1080000, 1, 0x14, 1100000, 1200000, 2}, - [14] = {1134000, 1, 0x15, 1100000, 1200000, 2}, - [15] = {1188000, 1, 0x16, 1200000, 1200000, 3}, - [16] = {1242000, 1, 0x17, 1200000, 1212500, 3}, - [17] = {1296000, 1, 0x18, 1200000, 1225000, 3}, - [18] = {1350000, 1, 0x19, 1200000, 1225000, 3}, - [19] = {1404000, 1, 0x1A, 1200000, 1250000, 3}, -}; - -#define L2(x) (&l2_freq_tbl_v2[(x)]) -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1188mhz[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 812500, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 875000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 875000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 887500, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 912500, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 925000, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 937500, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 950000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 975000, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 1000000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 1012500, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 1037500, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 1062500, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 1087500, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 1125000, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 1137500, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 1162500, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1187500, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1512mhz_slow[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 800000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 825000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 825000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 850000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 850000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 875000, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 875000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 900000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 900000, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 925000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 975000, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 975000, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 1000000, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 1025000, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 1025000, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 1050000, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 1075000, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1100000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 1125000, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1150000, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1150000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1175000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1200000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1225000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1512mhz_nom[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 800000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 825000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 825000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 850000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 850000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 875000, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 875000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 900000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 900000, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 925000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 950000, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 975000, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 975000, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 1000000, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 1000000, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 1025000, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 1025000, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1050000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 1075000, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1100000, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1125000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1150000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1150000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1175000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1512mhz_fast[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 800000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 825000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 825000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 850000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 850000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 875000, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 875000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 900000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 900000, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 925000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 925000, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 950000, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 950000, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 950000, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 975000, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 1000000, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 1000000, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1025000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 1050000, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1075000, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1100000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1100000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1100000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1125000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1674mhz_slower[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 775000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 775000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 775000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 775000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 775000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 787500, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 800000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 825000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 837500, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 850000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 875000, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 900000, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 912500, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 937500, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 962500, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 987500, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 1012500, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1025000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 1062500, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1087500, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1100000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1125000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1150000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1187500, 0x03006000}, - { {1, 1}, 1566000, ACPU_SCPLL, 0, 0, 1, 0x1D, L2(19), 1225000, 0x03006000}, - { {1, 1}, 1620000, ACPU_SCPLL, 0, 0, 1, 0x1E, L2(19), 1262500, 0x03006000}, - { {1, 1}, 1674000, ACPU_SCPLL, 0, 0, 1, 0x1F, L2(19), 1300000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1674mhz_slow[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 775000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 775000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 775000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 775000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 775000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 787500, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 800000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 825000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 837500, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 850000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 862500, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 887500, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 900000, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 925000, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 937500, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 962500, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 987500, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 1000000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 1025000, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1050000, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1062500, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1087500, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1112500, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1150000, 0x03006000}, - { {1, 1}, 1566000, ACPU_SCPLL, 0, 0, 1, 0x1D, L2(19), 1175000, 0x03006000}, - { {1, 1}, 1620000, ACPU_SCPLL, 0, 0, 1, 0x1E, L2(19), 1212500, 0x03006000}, - { {1, 1}, 1674000, ACPU_SCPLL, 0, 0, 1, 0x1F, L2(19), 1250000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1674mhz_nom[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 775000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 775000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 775000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 775000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 775000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 787500, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 800000, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 812500, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 825000, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 837500, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 850000, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 875000, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 887500, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 900000, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 912500, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 937500, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 950000, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 975000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 987500, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 1012500, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1025000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1050000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1075000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1112500, 0x03006000}, - { {1, 1}, 1566000, ACPU_SCPLL, 0, 0, 1, 0x1D, L2(19), 1137500, 0x03006000}, - { {1, 1}, 1620000, ACPU_SCPLL, 0, 0, 1, 0x1E, L2(19), 1175000, 0x03006000}, - { {1, 1}, 1674000, ACPU_SCPLL, 0, 0, 1, 0x1F, L2(19), 1200000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* SCPLL frequencies = 2 * 27 MHz * L_VAL */ -static struct clkctl_acpu_speed acpu_freq_tbl_1674mhz_fast[] = { - { {1, 1}, 192000, ACPU_PLL_8, 3, 1, 0, 0, L2(1), 775000, 0x03006000}, - /* MAX_AXI row is used to source CPU cores and L2 from the AFAB clock. */ - { {0, 0}, MAX_AXI, ACPU_AFAB, 1, 0, 0, 0, L2(0), 775000, 0x03006000}, - { {1, 1}, 384000, ACPU_PLL_8, 3, 0, 0, 0, L2(1), 775000, 0x03006000}, - { {1, 1}, 432000, ACPU_SCPLL, 0, 0, 1, 0x08, L2(1), 775000, 0x03006000}, - { {1, 1}, 486000, ACPU_SCPLL, 0, 0, 1, 0x09, L2(2), 775000, 0x03006000}, - { {1, 1}, 540000, ACPU_SCPLL, 0, 0, 1, 0x0A, L2(3), 775000, 0x03006000}, - { {1, 1}, 594000, ACPU_SCPLL, 0, 0, 1, 0x0B, L2(4), 787500, 0x03006000}, - { {1, 1}, 648000, ACPU_SCPLL, 0, 0, 1, 0x0C, L2(5), 800000, 0x03006000}, - { {1, 1}, 702000, ACPU_SCPLL, 0, 0, 1, 0x0D, L2(6), 812500, 0x03006000}, - { {1, 1}, 756000, ACPU_SCPLL, 0, 0, 1, 0x0E, L2(7), 825000, 0x03006000}, - { {1, 1}, 810000, ACPU_SCPLL, 0, 0, 1, 0x0F, L2(8), 837500, 0x03006000}, - { {1, 1}, 864000, ACPU_SCPLL, 0, 0, 1, 0x10, L2(9), 862500, 0x03006000}, - { {1, 1}, 918000, ACPU_SCPLL, 0, 0, 1, 0x11, L2(10), 875000, 0x03006000}, - { {1, 1}, 972000, ACPU_SCPLL, 0, 0, 1, 0x12, L2(11), 887500, 0x03006000}, - { {1, 1}, 1026000, ACPU_SCPLL, 0, 0, 1, 0x13, L2(12), 900000, 0x03006000}, - { {1, 1}, 1080000, ACPU_SCPLL, 0, 0, 1, 0x14, L2(13), 925000, 0x03006000}, - { {1, 1}, 1134000, ACPU_SCPLL, 0, 0, 1, 0x15, L2(14), 937500, 0x03006000}, - { {1, 1}, 1188000, ACPU_SCPLL, 0, 0, 1, 0x16, L2(15), 950000, 0x03006000}, - { {1, 1}, 1242000, ACPU_SCPLL, 0, 0, 1, 0x17, L2(16), 962500, 0x03006000}, - { {1, 1}, 1296000, ACPU_SCPLL, 0, 0, 1, 0x18, L2(17), 975000, 0x03006000}, - { {1, 1}, 1350000, ACPU_SCPLL, 0, 0, 1, 0x19, L2(18), 1000000, 0x03006000}, - { {1, 1}, 1404000, ACPU_SCPLL, 0, 0, 1, 0x1A, L2(19), 1025000, 0x03006000}, - { {1, 1}, 1458000, ACPU_SCPLL, 0, 0, 1, 0x1B, L2(19), 1050000, 0x03006000}, - { {1, 1}, 1512000, ACPU_SCPLL, 0, 0, 1, 0x1C, L2(19), 1075000, 0x03006000}, - { {1, 1}, 1566000, ACPU_SCPLL, 0, 0, 1, 0x1D, L2(19), 1100000, 0x03006000}, - { {1, 1}, 1620000, ACPU_SCPLL, 0, 0, 1, 0x1E, L2(19), 1125000, 0x03006000}, - { {1, 1}, 1674000, ACPU_SCPLL, 0, 0, 1, 0x1F, L2(19), 1150000, 0x03006000}, - { {0, 0}, 0 }, -}; - -/* acpu_freq_tbl row to use when reconfiguring SC/L2 PLLs. */ -#define CAL_IDX 1 - -static struct clkctl_acpu_speed *acpu_freq_tbl; -static struct clkctl_l2_speed *l2_freq_tbl = l2_freq_tbl_v2; -static unsigned int l2_freq_tbl_size = ARRAY_SIZE(l2_freq_tbl_v2); - -static unsigned long acpuclk_8x60_get_rate(int cpu) -{ - return drv_state.current_speed[cpu]->acpuclk_khz; -} - -static void select_core_source(unsigned int id, unsigned int src) -{ - uint32_t regval; - int shift; - - shift = (id == L2) ? 0 : 1; - regval = readl_relaxed(clk_sel_addr[id]); - regval &= ~(0x3 << shift); - regval |= (src << shift); - writel_relaxed(regval, clk_sel_addr[id]); -} - -static void select_clk_source_div(unsigned int id, struct clkctl_acpu_speed *s) -{ - uint32_t reg_clksel, reg_clkctl, src_sel; - - /* Configure the PLL divider mux if we plan to use it. */ - if (s->core_src_sel == 0) { - - reg_clksel = readl_relaxed(clk_sel_addr[id]); - - /* CLK_SEL_SRC1N0 (bank) bit. */ - src_sel = reg_clksel & 1; - - /* Program clock source and divider. */ - reg_clkctl = readl_relaxed(clk_ctl_addr[id]); - reg_clkctl &= ~(0xFF << (8 * src_sel)); - reg_clkctl |= s->acpuclk_src_sel << (4 + 8 * src_sel); - reg_clkctl |= s->acpuclk_src_div << (0 + 8 * src_sel); - writel_relaxed(reg_clkctl, clk_ctl_addr[id]); - - /* Toggle clock source. */ - reg_clksel ^= 1; - - /* Program clock source selection. */ - writel_relaxed(reg_clksel, clk_sel_addr[id]); - } -} - -static void scpll_enable(int sc_pll, uint32_t l_val) -{ - uint32_t regval; - - /* Power-up SCPLL into standby mode. */ - writel_relaxed(SCPLL_STANDBY, sc_pll_base[sc_pll] + SCPLL_CTL_OFFSET); - mb(); - udelay(10); - - /* Shot-switch to target frequency. */ - regval = (l_val << 3) | SHOT_SWITCH; - writel_relaxed(regval, sc_pll_base[sc_pll] + SCPLL_FSM_CTL_EXT_OFFSET); - writel_relaxed(SCPLL_NORMAL, sc_pll_base[sc_pll] + SCPLL_CTL_OFFSET); - mb(); - udelay(20); -} - -static void scpll_disable(int sc_pll) -{ - /* Power down SCPLL. */ - writel_relaxed(SCPLL_POWER_DOWN, - sc_pll_base[sc_pll] + SCPLL_CTL_OFFSET); -} - -static void scpll_change_freq(int sc_pll, uint32_t l_val) -{ - uint32_t regval; - const void *base_addr = sc_pll_base[sc_pll]; - - /* Complex-slew switch to target frequency. */ - regval = (l_val << 3) | COMPLEX_SLEW; - writel_relaxed(regval, base_addr + SCPLL_FSM_CTL_EXT_OFFSET); - writel_relaxed(SCPLL_NORMAL, base_addr + SCPLL_CTL_OFFSET); - - /* Wait for frequency switch to start. */ - while (((readl_relaxed(base_addr + SCPLL_CTL_OFFSET) >> 3) & 0x3F) - != l_val) - cpu_relax(); - /* Wait for frequency switch to finish. */ - while (readl_relaxed(base_addr + SCPLL_STATUS_OFFSET) & 0x1) - cpu_relax(); -} - -/* Vote for the L2 speed and return the speed that should be applied. */ -static struct clkctl_l2_speed *compute_l2_speed(unsigned int voting_cpu, - struct clkctl_l2_speed *tgt_s) -{ - struct clkctl_l2_speed *new_s; - int cpu; - - /* Bounds check. */ - BUG_ON(tgt_s >= (l2_freq_tbl + l2_freq_tbl_size)); - - /* Find max L2 speed vote. */ - l2_vote[voting_cpu] = tgt_s; - new_s = l2_freq_tbl; - for_each_present_cpu(cpu) - new_s = max(new_s, l2_vote[cpu]); - - return new_s; -} - -/* Set the L2's clock speed. */ -static void set_l2_speed(struct clkctl_l2_speed *tgt_s) -{ - if (tgt_s == drv_state.current_l2_speed) - return; - - if (drv_state.current_l2_speed->src_sel == 1 - && tgt_s->src_sel == 1) - scpll_change_freq(L2, tgt_s->l_val); - else { - if (tgt_s->src_sel == 1) { - scpll_enable(L2, tgt_s->l_val); - mb(); - select_core_source(L2, tgt_s->src_sel); - } else { - select_core_source(L2, tgt_s->src_sel); - mb(); - scpll_disable(L2); - } - } - drv_state.current_l2_speed = tgt_s; -} - -/* Update the bus bandwidth request. */ -static void set_bus_bw(unsigned int bw) -{ - int ret; - - /* Bounds check. */ - if (bw >= ARRAY_SIZE(bw_level_tbl)) { - pr_err("%s: invalid bandwidth request (%d)\n", __func__, bw); - return; - } - - /* Update bandwidth if requst has changed. This may sleep. */ - ret = msm_bus_scale_client_update_request(bus_perf_client, bw); - if (ret) - pr_err("%s: bandwidth request failed (%d)\n", __func__, ret); - - return; -} - -/* Apply any per-cpu voltage increases. */ -static int increase_vdd(int cpu, unsigned int vdd_sc, unsigned int vdd_mem, - unsigned int vdd_dig, enum setrate_reason reason) -{ - int rc = 0; - - /* Increase vdd_mem active-set before vdd_dig and vdd_sc. - * vdd_mem should be >= both vdd_sc and vdd_dig. */ - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S0, rpm_vreg_voter[cpu], - vdd_mem, MAX_VDD_MEM, 0); - if (rc) { - pr_err("%s: vdd_mem (cpu%d) increase failed (%d)\n", - __func__, cpu, rc); - return rc; - } - - /* Increase vdd_dig active-set vote. */ - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S1, rpm_vreg_voter[cpu], - vdd_dig, MAX_VDD_DIG, 0); - if (rc) { - pr_err("%s: vdd_dig (cpu%d) increase failed (%d)\n", - __func__, cpu, rc); - return rc; - } - - /* Don't update the Scorpion voltage in the hotplug path. It should - * already be correct. Attempting to set it is bad because we don't - * know what CPU we are running on at this point, but the Scorpion - * regulator API requires we call it from the affected CPU. */ - if (reason == SETRATE_HOTPLUG) - return rc; - - /* Update per-core Scorpion voltage. */ - rc = regulator_set_voltage(regulator_sc[cpu], vdd_sc, MAX_VDD_SC); - if (rc) { - pr_err("%s: vdd_sc (cpu%d) increase failed (%d)\n", - __func__, cpu, rc); - return rc; - } - - return rc; -} - -/* Apply any per-cpu voltage decreases. */ -static void decrease_vdd(int cpu, unsigned int vdd_sc, unsigned int vdd_mem, - unsigned int vdd_dig, enum setrate_reason reason) -{ - int ret; - - /* Update per-core Scorpion voltage. This must be called on the CPU - * that's being affected. Don't do this in the hotplug remove path, - * where the rail is off and we're executing on the other CPU. */ - if (reason != SETRATE_HOTPLUG) { - ret = regulator_set_voltage(regulator_sc[cpu], vdd_sc, - MAX_VDD_SC); - if (ret) { - pr_err("%s: vdd_sc (cpu%d) decrease failed (%d)\n", - __func__, cpu, ret); - return; - } - } - - /* Decrease vdd_dig active-set vote. */ - ret = rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S1, rpm_vreg_voter[cpu], - vdd_dig, MAX_VDD_DIG, 0); - if (ret) { - pr_err("%s: vdd_dig (cpu%d) decrease failed (%d)\n", - __func__, cpu, ret); - return; - } - - /* Decrease vdd_mem active-set after vdd_dig and vdd_sc. - * vdd_mem should be >= both vdd_sc and vdd_dig. */ - ret = rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S0, rpm_vreg_voter[cpu], - vdd_mem, MAX_VDD_MEM, 0); - if (ret) { - pr_err("%s: vdd_mem (cpu%d) decrease failed (%d)\n", - __func__, cpu, ret); - return; - } -} - -static void switch_sc_speed(int cpu, struct clkctl_acpu_speed *tgt_s) -{ - struct clkctl_acpu_speed *strt_s = drv_state.current_speed[cpu]; - - if (strt_s->pll != ACPU_SCPLL && tgt_s->pll != ACPU_SCPLL) { - select_clk_source_div(cpu, tgt_s); - /* Select core source because target may be AFAB. */ - select_core_source(cpu, tgt_s->core_src_sel); - } else if (strt_s->pll != ACPU_SCPLL && tgt_s->pll == ACPU_SCPLL) { - scpll_enable(cpu, tgt_s->l_val); - mb(); - select_core_source(cpu, tgt_s->core_src_sel); - } else if (strt_s->pll == ACPU_SCPLL && tgt_s->pll != ACPU_SCPLL) { - select_clk_source_div(cpu, tgt_s); - select_core_source(cpu, tgt_s->core_src_sel); - /* Core source switch must complete before disabling SCPLL. */ - mb(); - udelay(1); - scpll_disable(cpu); - } else - scpll_change_freq(cpu, tgt_s->l_val); - - /* Update the driver state with the new clock freq */ - drv_state.current_speed[cpu] = tgt_s; -} - -static int acpuclk_8x60_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - struct clkctl_acpu_speed *tgt_s, *strt_s; - struct clkctl_l2_speed *tgt_l2; - unsigned int vdd_mem, vdd_dig, pll_vdd_dig; - unsigned long flags; - int rc = 0; - - if (cpu > num_possible_cpus()) - return -EINVAL; - - if (reason == SETRATE_CPUFREQ || reason == SETRATE_HOTPLUG) - mutex_lock(&drv_state.lock); - - strt_s = drv_state.current_speed[cpu]; - - /* Return early if rate didn't change. */ - if (rate == strt_s->acpuclk_khz) - goto out; - - /* Find target frequency. */ - for (tgt_s = acpu_freq_tbl; tgt_s->acpuclk_khz != 0; tgt_s++) - if (tgt_s->acpuclk_khz == rate) - break; - if (tgt_s->acpuclk_khz == 0) { - rc = -EINVAL; - goto out; - } - - /* AVS needs SAW_VCTL to be intitialized correctly, before enable, - * and is not initialized during probe. - */ - if (reason == SETRATE_CPUFREQ) - AVS_DISABLE(cpu); - - /* Calculate vdd_mem and vdd_dig requirements. - * vdd_mem must be >= vdd_sc */ - vdd_mem = max(tgt_s->vdd_sc, tgt_s->l2_level->vdd_mem); - /* Factor-in PLL vdd_dig requirements. */ - if ((tgt_s->l2_level->khz > SCPLL_LOW_VDD_FMAX) || - (tgt_s->pll == ACPU_SCPLL - && tgt_s->acpuclk_khz > SCPLL_LOW_VDD_FMAX)) - pll_vdd_dig = SCPLL_NOMINAL_VDD; - else - pll_vdd_dig = SCPLL_LOW_VDD; - vdd_dig = max(tgt_s->l2_level->vdd_dig, pll_vdd_dig); - - /* Increase VDD levels if needed. */ - if ((reason == SETRATE_CPUFREQ || reason == SETRATE_HOTPLUG - || reason == SETRATE_INIT) - && (tgt_s->acpuclk_khz > strt_s->acpuclk_khz)) { - rc = increase_vdd(cpu, tgt_s->vdd_sc, vdd_mem, vdd_dig, reason); - if (rc) - goto out; - } - - pr_debug("Switching from ACPU%d rate %u KHz -> %u KHz\n", - cpu, strt_s->acpuclk_khz, tgt_s->acpuclk_khz); - - /* Switch CPU speed. */ - switch_sc_speed(cpu, tgt_s); - - /* Update the L2 vote and apply the rate change. */ - spin_lock_irqsave(&drv_state.l2_lock, flags); - tgt_l2 = compute_l2_speed(cpu, tgt_s->l2_level); - set_l2_speed(tgt_l2); - spin_unlock_irqrestore(&drv_state.l2_lock, flags); - - /* Nothing else to do for SWFI. */ - if (reason == SETRATE_SWFI) - goto out; - - /* Nothing else to do for power collapse. */ - if (reason == SETRATE_PC) - goto out; - - /* Update bus bandwith request. */ - set_bus_bw(tgt_l2->bw_level); - - /* Drop VDD levels if we can. */ - if (tgt_s->acpuclk_khz < strt_s->acpuclk_khz) - decrease_vdd(cpu, tgt_s->vdd_sc, vdd_mem, vdd_dig, reason); - - pr_debug("ACPU%d speed change complete\n", cpu); - - /* Re-enable AVS */ - if (reason == SETRATE_CPUFREQ) - AVS_ENABLE(cpu, tgt_s->avsdscr_setting); - -out: - if (reason == SETRATE_CPUFREQ || reason == SETRATE_HOTPLUG) - mutex_unlock(&drv_state.lock); - return rc; -} - -static void __init scpll_init(int pll, unsigned int max_l_val) -{ - uint32_t regval; - - pr_debug("Initializing SCPLL%d\n", pll); - - /* Clear calibration LUT registers containing max frequency entry. - * LUT registers are only writeable in debug mode. */ - writel_relaxed(SCPLL_DEBUG_FULL, sc_pll_base[pll] + SCPLL_DEBUG_OFFSET); - writel_relaxed(0x0, sc_pll_base[pll] + SCPLL_LUT_OFFSET(max_l_val)); - writel_relaxed(SCPLL_DEBUG_NONE, sc_pll_base[pll] + SCPLL_DEBUG_OFFSET); - - /* Power-up SCPLL into standby mode. */ - writel_relaxed(SCPLL_STANDBY, sc_pll_base[pll] + SCPLL_CTL_OFFSET); - mb(); - udelay(10); - - /* Calibrate the SCPLL for the frequency range needed. */ - regval = (max_l_val << 24) | (L_VAL_SCPLL_CAL_MIN << 16); - writel_relaxed(regval, sc_pll_base[pll] + SCPLL_CAL_OFFSET); - - /* Start calibration */ - writel_relaxed(SCPLL_FULL_CAL, sc_pll_base[pll] + SCPLL_CTL_OFFSET); - - /* Wait for proof that calibration has started before checking the - * 'calibration done' bit in the status register. Waiting for the - * LUT register we cleared to contain data accomplishes this. - * This is required since the 'calibration done' bit takes time to - * transition from 'done' to 'not done' when starting a calibration. - */ - while (!readl_relaxed(sc_pll_base[pll] + SCPLL_LUT_OFFSET(max_l_val))) - cpu_relax(); - - /* Wait for calibration to complete. */ - while (readl_relaxed(sc_pll_base[pll] + SCPLL_STATUS_OFFSET) & 0x2) - cpu_relax(); - - /* Power-down SCPLL. */ - scpll_disable(pll); -} - -/* Force ACPU core and L2 cache clocks to rates that don't require SCPLLs. */ -static void __init unselect_scplls(void) -{ - int cpu; - - /* Ensure CAL_IDX frequency uses AFAB sources for CPU cores and L2. */ - BUG_ON(acpu_freq_tbl[CAL_IDX].core_src_sel != 0); - BUG_ON(acpu_freq_tbl[CAL_IDX].l2_level->src_sel != 0); - - for_each_possible_cpu(cpu) { - select_clk_source_div(cpu, &acpu_freq_tbl[CAL_IDX]); - select_core_source(cpu, acpu_freq_tbl[CAL_IDX].core_src_sel); - drv_state.current_speed[cpu] = &acpu_freq_tbl[CAL_IDX]; - l2_vote[cpu] = acpu_freq_tbl[CAL_IDX].l2_level; - } - - select_core_source(L2, acpu_freq_tbl[CAL_IDX].l2_level->src_sel); - drv_state.current_l2_speed = acpu_freq_tbl[CAL_IDX].l2_level; -} - -/* Ensure SCPLLs use the 27MHz PXO. */ -static void __init scpll_set_refs(void) -{ - int cpu; - uint32_t regval; - - /* Bit 4 = 0:PXO, 1:MXO. */ - for_each_possible_cpu(cpu) { - regval = readl_relaxed(sc_pll_base[cpu] + SCPLL_CFG_OFFSET); - regval &= ~BIT(4); - writel_relaxed(regval, sc_pll_base[cpu] + SCPLL_CFG_OFFSET); - } - regval = readl_relaxed(sc_pll_base[L2] + SCPLL_CFG_OFFSET); - regval &= ~BIT(4); - writel_relaxed(regval, sc_pll_base[L2] + SCPLL_CFG_OFFSET); -} - -/* Voltage regulator initialization. */ -static void __init regulator_init(void) -{ - struct clkctl_acpu_speed **freq = drv_state.current_speed; - const char *regulator_sc_name[] = {"8901_s0", "8901_s1"}; - int cpu, ret; - - for_each_possible_cpu(cpu) { - /* VDD_SC0, VDD_SC1 */ - regulator_sc[cpu] = regulator_get(NULL, regulator_sc_name[cpu]); - if (IS_ERR(regulator_sc[cpu])) - goto err; - ret = regulator_set_voltage(regulator_sc[cpu], - freq[cpu]->vdd_sc, MAX_VDD_SC); - if (ret) - goto err; - ret = regulator_enable(regulator_sc[cpu]); - if (ret) - goto err; - } - - return; - -err: - pr_err("%s: Failed to initialize voltage regulators\n", __func__); - BUG(); -} - -/* Register with bus driver. */ -static void __init bus_init(void) -{ - bus_perf_client = msm_bus_scale_register_client(&bus_client_pdata); - if (!bus_perf_client) { - pr_err("%s: unable register bus client\n", __func__); - BUG(); - } -} - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table freq_table[NR_CPUS][30]; - -static void __init cpufreq_table_init(void) -{ - int cpu; - - for_each_possible_cpu(cpu) { - int i, freq_cnt = 0; - /* Construct the freq_table tables from acpu_freq_tbl. */ - for (i = 0; acpu_freq_tbl[i].acpuclk_khz != 0 - && freq_cnt < ARRAY_SIZE(*freq_table); i++) { - if (acpu_freq_tbl[i].use_for_scaling[cpu]) { - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency - = acpu_freq_tbl[i].acpuclk_khz; - freq_cnt++; - } - } - /* freq_table not big enough to store all usable freqs. */ - BUG_ON(acpu_freq_tbl[i].acpuclk_khz != 0); - - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency = CPUFREQ_TABLE_END; - - pr_info("CPU%d: %d scaling frequencies supported.\n", - cpu, freq_cnt); - - /* Register table with CPUFreq. */ - cpufreq_frequency_table_get_attr(freq_table[cpu], cpu); - } -} -#else -static void __init cpufreq_table_init(void) {} -#endif - -#define HOT_UNPLUG_KHZ MAX_AXI -static int __cpuinit acpuclock_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - static int prev_khz[NR_CPUS]; - int cpu = (int)hcpu; - - switch (action) { - case CPU_DEAD: - case CPU_DEAD_FROZEN: - prev_khz[cpu] = acpuclk_8x60_get_rate(cpu); - /* Fall through. */ - case CPU_UP_CANCELED: - case CPU_UP_CANCELED_FROZEN: - acpuclk_8x60_set_rate(cpu, HOT_UNPLUG_KHZ, SETRATE_HOTPLUG); - break; - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - if (WARN_ON(!prev_khz[cpu])) - return NOTIFY_BAD; - acpuclk_8x60_set_rate(cpu, prev_khz[cpu], SETRATE_HOTPLUG); - break; - default: - break; - } - - return NOTIFY_OK; -} - -static struct notifier_block __cpuinitdata acpuclock_cpu_notifier = { - .notifier_call = acpuclock_cpu_callback, -}; - -static __init struct clkctl_acpu_speed *select_freq_plan(void) -{ - uint32_t pte_efuse, speed_bin, pvs; - struct clkctl_acpu_speed *f; - - pte_efuse = readl_relaxed(QFPROM_PTE_EFUSE_ADDR); - - speed_bin = pte_efuse & 0xF; - if (speed_bin == 0xF) - speed_bin = (pte_efuse >> 4) & 0xF; - - pvs = (pte_efuse >> 10) & 0x7; - if (pvs == 0x7) - pvs = (pte_efuse >> 13) & 0x7; - - if (speed_bin == 0x2) { - switch (pvs) { - case 0x7: - case 0x4: - acpu_freq_tbl = acpu_freq_tbl_1674mhz_slower; - pr_info("ACPU PVS: Slower\n"); - break; - case 0x0: - acpu_freq_tbl = acpu_freq_tbl_1674mhz_slow; - pr_info("ACPU PVS: Slow\n"); - break; - case 0x1: - acpu_freq_tbl = acpu_freq_tbl_1674mhz_nom; - pr_info("ACPU PVS: Nominal\n"); - break; - case 0x3: - acpu_freq_tbl = acpu_freq_tbl_1674mhz_fast; - pr_info("ACPU PVS: Fast\n"); - break; - default: - acpu_freq_tbl = acpu_freq_tbl_1674mhz_slower; - pr_warn("ACPU PVS: Unknown. Defaulting to slower.\n"); - break; - } - } else if (speed_bin == 0x1) { - switch (pvs) { - case 0x0: - case 0x7: - acpu_freq_tbl = acpu_freq_tbl_1512mhz_slow; - pr_info("ACPU PVS: Slow\n"); - break; - case 0x1: - acpu_freq_tbl = acpu_freq_tbl_1512mhz_nom; - pr_info("ACPU PVS: Nominal\n"); - break; - case 0x3: - acpu_freq_tbl = acpu_freq_tbl_1512mhz_fast; - pr_info("ACPU PVS: Fast\n"); - break; - default: - acpu_freq_tbl = acpu_freq_tbl_1512mhz_slow; - pr_warn("ACPU PVS: Unknown. Defaulting to slow.\n"); - break; - } - } else { - acpu_freq_tbl = acpu_freq_tbl_1188mhz; - } - - for (f = acpu_freq_tbl; f->acpuclk_khz != 0; f++) - ; - f--; - pr_info("Max ACPU freq: %u KHz\n", f->acpuclk_khz); - - return f; -} - -static struct acpuclk_data acpuclk_8x60_data = { - .set_rate = acpuclk_8x60_set_rate, - .get_rate = acpuclk_8x60_get_rate, - .power_collapse_khz = MAX_AXI, - .wait_for_irq_khz = MAX_AXI, -}; - -static int __init acpuclk_8x60_probe(struct platform_device *pdev) -{ - struct clkctl_acpu_speed *max_freq; - int cpu; - - mutex_init(&drv_state.lock); - spin_lock_init(&drv_state.l2_lock); - - /* Configure hardware. */ - max_freq = select_freq_plan(); - unselect_scplls(); - scpll_set_refs(); - for_each_possible_cpu(cpu) - scpll_init(cpu, max_freq->l_val); - scpll_init(L2, max_freq->l2_level->l_val); - regulator_init(); - bus_init(); - - /* Improve boot time by ramping up CPUs immediately. */ - for_each_online_cpu(cpu) - acpuclk_8x60_set_rate(cpu, max_freq->acpuclk_khz, SETRATE_INIT); - - acpuclk_register(&acpuclk_8x60_data); - cpufreq_table_init(); - register_hotcpu_notifier(&acpuclock_cpu_notifier); - - return 0; -} - -static struct platform_driver acpuclk_8x60_driver = { - .driver = { - .name = "acpuclk-8x60", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_8x60_init(void) -{ - return platform_driver_probe(&acpuclk_8x60_driver, acpuclk_8x60_probe); -} -device_initcall(acpuclk_8x60_init); diff --git a/arch/arm/mach-msm/acpuclock-9615.c b/arch/arm/mach-msm/acpuclock-9615.c deleted file mode 100644 index 21638306e6e4..000000000000 --- a/arch/arm/mach-msm/acpuclock-9615.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include "acpuclock.h" - -#define REG_CLKSEL_0 (MSM_APCS_GLB_BASE + 0x08) -#define REG_CLKDIV_0 (MSM_APCS_GLB_BASE + 0x0C) -#define REG_CLKSEL_1 (MSM_APCS_GLB_BASE + 0x10) -#define REG_CLKDIV_1 (MSM_APCS_GLB_BASE + 0x14) -#define REG_CLKOUTSEL (MSM_APCS_GLB_BASE + 0x18) - -#define MAX_VDD_MEM 1150000 - -enum clk_src { - SRC_CXO, - SRC_PLL0, - SRC_PLL8, - SRC_PLL9, - NUM_SRC, -}; - -struct src_clock { - struct clk *clk; - const char *name; -}; - -static struct src_clock clocks[NUM_SRC] = { - [SRC_PLL0].name = "pll0", - [SRC_PLL8].name = "pll8", - [SRC_PLL9].name = "pll9", -}; - -struct clkctl_acpu_speed { - bool use_for_scaling; - unsigned int khz; - int src; - unsigned int src_sel; - unsigned int src_div; - unsigned int vdd_cpu; - unsigned int vdd_mem; - unsigned int bw_level; -}; - -struct acpuclk_state { - struct mutex lock; - struct clkctl_acpu_speed *current_speed; -}; - -static struct acpuclk_state drv_state = { - .current_speed = &(struct clkctl_acpu_speed){ 0 }, -}; - -/* Instantaneous bandwidth requests in MB/s. */ -#define BW_MBPS(_bw) \ - { \ - .vectors = &(struct msm_bus_vectors){ \ - .src = MSM_BUS_MASTER_AMPSS_M0, \ - .dst = MSM_BUS_SLAVE_EBI_CH0, \ - .ib = (_bw) * 1000000UL, \ - .ab = 0, \ - }, \ - .num_paths = 1, \ - } -static struct msm_bus_paths bw_level_tbl[] = { - [0] = BW_MBPS(152), /* At least 19 MHz on bus. */ - [1] = BW_MBPS(368), /* At least 46 MHz on bus. */ - [2] = BW_MBPS(552), /* At least 69 MHz on bus. */ - [3] = BW_MBPS(736), /* At least 92 MHz on bus. */ - [4] = BW_MBPS(1064), /* At least 133 MHz on bus. */ - [5] = BW_MBPS(1536), /* At least 192 MHz on bus. */ -}; - -static struct msm_bus_scale_pdata bus_client_pdata = { - .usecase = bw_level_tbl, - .num_usecases = ARRAY_SIZE(bw_level_tbl), - .active_only = 1, - .name = "acpuclock", -}; - -static uint32_t bus_perf_client; - -static struct clkctl_acpu_speed acpu_freq_tbl[] = { - { 0, 19200, SRC_CXO, 0, 0, RPM_VREG_CORNER_LOW, 1050000, 0 }, - { 1, 138000, SRC_PLL0, 6, 1, RPM_VREG_CORNER_LOW, 1050000, 2 }, - { 1, 276000, SRC_PLL0, 6, 0, RPM_VREG_CORNER_NOMINAL, 1050000, 2 }, - { 1, 384000, SRC_PLL8, 3, 0, RPM_VREG_CORNER_HIGH, 1150000, 4 }, - /* The row below may be changed at runtime depending on hw rev. */ - { 1, 440000, SRC_PLL9, 2, 0, RPM_VREG_CORNER_HIGH, 1150000, 4 }, - { 0 } -}; - -static void select_clk_source_div(struct clkctl_acpu_speed *s) -{ - static void * __iomem const sel_reg[] = {REG_CLKSEL_0, REG_CLKSEL_1}; - static void * __iomem const div_reg[] = {REG_CLKDIV_0, REG_CLKDIV_1}; - uint32_t next_bank; - - next_bank = !(readl_relaxed(REG_CLKOUTSEL) & 1); - writel_relaxed(s->src_sel, sel_reg[next_bank]); - writel_relaxed(s->src_div, div_reg[next_bank]); - writel_relaxed(next_bank, REG_CLKOUTSEL); - - /* Wait for switch to complete. */ - mb(); - udelay(1); -} - -/* Update the bus bandwidth request. */ -static void set_bus_bw(unsigned int bw) -{ - int ret; - - /* Bounds check. */ - if (bw >= ARRAY_SIZE(bw_level_tbl)) { - pr_err("invalid bandwidth request (%d)\n", bw); - return; - } - - /* Update bandwidth if request has changed. This may sleep. */ - ret = msm_bus_scale_client_update_request(bus_perf_client, bw); - if (ret) - pr_err("bandwidth request failed (%d)\n", ret); - - return; -} - -/* Apply any per-cpu voltage increases. */ -static int increase_vdd(unsigned int vdd_cpu, unsigned int vdd_mem) -{ - int rc = 0; - - /* - * Increase vdd_mem active-set before vdd_cpu. - * vdd_mem should be >= vdd_cpu. - */ - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_L9, RPM_VREG_VOTER1, - vdd_mem, MAX_VDD_MEM, 0); - if (rc) { - pr_err("vdd_mem increase failed (%d)\n", rc); - return rc; - } - - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_VDD_DIG_CORNER, - RPM_VREG_VOTER1, vdd_cpu, RPM_VREG_CORNER_HIGH, 0); - if (rc) - pr_err("vdd_cpu increase failed (%d)\n", rc); - - return rc; -} - -/* Apply any per-cpu voltage decreases. */ -static void decrease_vdd(unsigned int vdd_cpu, unsigned int vdd_mem) -{ - int ret; - - /* Update CPU voltage. */ - ret = rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_VDD_DIG_CORNER, - RPM_VREG_VOTER1, vdd_cpu, RPM_VREG_CORNER_HIGH, 0); - - if (ret) { - pr_err("vdd_cpu decrease failed (%d)\n", ret); - return; - } - - /* - * Decrease vdd_mem active-set after vdd_cpu. - * vdd_mem should be >= vdd_cpu. - */ - ret = rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_L9, RPM_VREG_VOTER1, - vdd_mem, MAX_VDD_MEM, 0); - if (ret) - pr_err("vdd_mem decrease failed (%d)\n", ret); -} - -static int acpuclk_9615_set_rate(int cpu, unsigned long rate, - enum setrate_reason reason) -{ - struct clkctl_acpu_speed *tgt_s, *strt_s; - int rc = 0; - - if (reason == SETRATE_CPUFREQ) - mutex_lock(&drv_state.lock); - - strt_s = drv_state.current_speed; - - /* Return early if rate didn't change. */ - if (rate == strt_s->khz) - goto out; - - /* Find target frequency. */ - for (tgt_s = acpu_freq_tbl; tgt_s->khz != 0; tgt_s++) - if (tgt_s->khz == rate) - break; - if (tgt_s->khz == 0) { - rc = -EINVAL; - goto out; - } - - /* Increase VDD levels if needed. */ - if ((reason == SETRATE_CPUFREQ || reason == SETRATE_INIT) - && (tgt_s->khz > strt_s->khz)) { - rc = increase_vdd(tgt_s->vdd_cpu, tgt_s->vdd_mem); - if (rc) - goto out; - } - - pr_debug("Switching from CPU rate %u KHz -> %u KHz\n", - strt_s->khz, tgt_s->khz); - - /* Switch CPU speed. */ - clk_enable(clocks[tgt_s->src].clk); - select_clk_source_div(tgt_s); - clk_disable(clocks[strt_s->src].clk); - - drv_state.current_speed = tgt_s; - pr_debug("CPU speed change complete\n"); - - /* Nothing else to do for SWFI or power-collapse. */ - if (reason == SETRATE_SWFI || reason == SETRATE_PC) - goto out; - - /* Update bus bandwith request. */ - set_bus_bw(tgt_s->bw_level); - - /* Drop VDD levels if we can. */ - if (tgt_s->khz < strt_s->khz) - decrease_vdd(tgt_s->vdd_cpu, tgt_s->vdd_mem); - -out: - if (reason == SETRATE_CPUFREQ) - mutex_unlock(&drv_state.lock); - return rc; -} - -static unsigned long acpuclk_9615_get_rate(int cpu) -{ - return drv_state.current_speed->khz; -} - -#ifdef CONFIG_CPU_FREQ_MSM -static struct cpufreq_frequency_table freq_table[30]; - -static void __init cpufreq_table_init(void) -{ - int i, freq_cnt = 0; - - /* Construct the freq_table tables from acpu_freq_tbl. */ - for (i = 0; acpu_freq_tbl[i].khz != 0 - && freq_cnt < ARRAY_SIZE(freq_table); i++) { - if (acpu_freq_tbl[i].use_for_scaling) { - freq_table[freq_cnt].index = freq_cnt; - freq_table[freq_cnt].frequency - = acpu_freq_tbl[i].khz; - freq_cnt++; - } - } - /* freq_table not big enough to store all usable freqs. */ - BUG_ON(acpu_freq_tbl[i].khz != 0); - - freq_table[freq_cnt].index = freq_cnt; - freq_table[freq_cnt].frequency = CPUFREQ_TABLE_END; - - pr_info("CPU: %d scaling frequencies supported.\n", freq_cnt); - - /* Register table with CPUFreq. */ - cpufreq_frequency_table_get_attr(freq_table, smp_processor_id()); -} -#else -static void __init cpufreq_table_init(void) {} -#endif - -static struct acpuclk_data acpuclk_9615_data = { - .set_rate = acpuclk_9615_set_rate, - .get_rate = acpuclk_9615_get_rate, - .power_collapse_khz = 19200, - .wait_for_irq_khz = 19200, -}; - -static int __init acpuclk_9615_probe(struct platform_device *pdev) -{ - unsigned long max_cpu_khz = 0; - int i; - - mutex_init(&drv_state.lock); - - bus_perf_client = msm_bus_scale_register_client(&bus_client_pdata); - if (!bus_perf_client) { - pr_err("Unable to register bus client\n"); - BUG(); - } - - for (i = 0; i < NUM_SRC; i++) { - if (clocks[i].name) { - clocks[i].clk = clk_get_sys("acpu", clocks[i].name); - BUG_ON(IS_ERR(clocks[i].clk)); - /* - * Prepare the PLLs because we enable/disable them - * in atomic context during power collapse/restore. - */ - BUG_ON(clk_prepare(clocks[i].clk)); - } - } - - /* Determine the rate of PLL9 and fixup tables accordingly */ - if (clk_get_rate(clocks[SRC_PLL9].clk) == 550000000) { - for (i = 0; i < ARRAY_SIZE(acpu_freq_tbl); i++) - if (acpu_freq_tbl[i].src == SRC_PLL9) { - acpu_freq_tbl[i].khz = 550000; - acpu_freq_tbl[i].bw_level = 5; - } - } - - /* Improve boot time by ramping up CPU immediately. */ - for (i = 0; acpu_freq_tbl[i].khz != 0; i++) - max_cpu_khz = acpu_freq_tbl[i].khz; - acpuclk_9615_set_rate(smp_processor_id(), max_cpu_khz, SETRATE_INIT); - - acpuclk_register(&acpuclk_9615_data); - cpufreq_table_init(); - - return 0; -} - -static struct platform_driver acpuclk_9615_driver = { - .driver = { - .name = "acpuclk-9615", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_9615_init(void) -{ - return platform_driver_probe(&acpuclk_9615_driver, acpuclk_9615_probe); -} -device_initcall(acpuclk_9615_init); diff --git a/arch/arm/mach-msm/acpuclock-9625.c b/arch/arm/mach-msm/acpuclock-9625.c deleted file mode 100644 index f2e7602f99fc..000000000000 --- a/arch/arm/mach-msm/acpuclock-9625.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "acpuclock-cortex.h" - -#define RCG_CONFIG_PGM_DATA_BIT BIT(11) -#define RCG_CONFIG_PGM_ENA_BIT BIT(10) -#define GPLL0_TO_A5_ALWAYS_ENABLE BIT(18) - -static struct msm_bus_paths bw_level_tbl[] = { - [0] = BW_MBPS(152), /* At least 19 MHz on bus. */ - [1] = BW_MBPS(264), /* At least 33 MHz on bus. */ - [2] = BW_MBPS(528), /* At least 66 MHz on bus. */ - [3] = BW_MBPS(664), /* At least 83 MHz on bus. */ - [4] = BW_MBPS(1064), /* At least 133 MHz on bus. */ - [5] = BW_MBPS(1328), /* At least 166 MHz on bus. */ - [6] = BW_MBPS(2128), /* At least 266 MHz on bus. */ - [7] = BW_MBPS(2664), /* At least 333 MHz on bus. */ -}; - -static struct msm_bus_scale_pdata bus_client_pdata = { - .usecase = bw_level_tbl, - .num_usecases = ARRAY_SIZE(bw_level_tbl), - .active_only = 1, - .name = "acpuclock", -}; - -/* TODO: - * 1) Update MX voltage when they are avaiable - * 2) Update bus bandwidth - */ -static struct clkctl_acpu_speed acpu_freq_tbl[] = { - { 0, 19200, CXO, 0, 0, LVL_LOW, 950000, 0 }, - { 1, 300000, PLL0, 1, 2, LVL_LOW, 950000, 4 }, - { 1, 600000, PLL0, 1, 0, LVL_NOM, 950000, 4 }, - { 1, 748800, ACPUPLL, 5, 0, LVL_HIGH, 1050000, 7 }, - { 1, 998400, ACPUPLL, 5, 0, LVL_HIGH, 1050000, 7 }, - { 0 } -}; - -static struct acpuclk_drv_data drv_data = { - .freq_tbl = acpu_freq_tbl, - .bus_scale = &bus_client_pdata, - .vdd_max_cpu = LVL_HIGH, - .vdd_max_mem = 1050000, - .src_clocks = { - [PLL0].name = "pll0", - [ACPUPLL].name = "pll14", - }, - .reg_data = { - .cfg_src_mask = BM(2, 0), - .cfg_src_shift = 0, - .cfg_div_mask = BM(7, 3), - .cfg_div_shift = 3, - .update_mask = RCG_CONFIG_PGM_DATA_BIT | RCG_CONFIG_PGM_ENA_BIT, - .poll_mask = RCG_CONFIG_PGM_DATA_BIT, - }, - .power_collapse_khz = 300000, - .wait_for_irq_khz = 300000, -}; - -static int __init acpuclk_9625_probe(struct platform_device *pdev) -{ - struct resource *res; - u32 regval, i; - - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rcg_base"); - if (!res) - return -EINVAL; - - drv_data.apcs_rcg_config = devm_ioremap(&pdev->dev, res->start, - resource_size(res)); - if (!drv_data.apcs_rcg_config) - return -ENOMEM; - - drv_data.apcs_rcg_cmd = drv_data.apcs_rcg_config; - - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwr_base"); - if (!res) - return -EINVAL; - - drv_data.apcs_cpu_pwr_ctl = ioremap(res->start, resource_size(res)); - if (!drv_data.apcs_cpu_pwr_ctl) - return -ENOMEM; - - drv_data.vdd_cpu = devm_regulator_get(&pdev->dev, "a5_cpu"); - if (IS_ERR(drv_data.vdd_cpu)) { - dev_err(&pdev->dev, "regulator for %s get failed\n", "a5_cpu"); - return PTR_ERR(drv_data.vdd_cpu); - } - - drv_data.vdd_mem = devm_regulator_get(&pdev->dev, "a5_mem"); - if (IS_ERR(drv_data.vdd_mem)) { - dev_err(&pdev->dev, "regulator for %s get failed\n", "a5_mem"); - return PTR_ERR(drv_data.vdd_mem); - } - - for (i = 0; i < NUM_SRC; i++) { - if (!drv_data.src_clocks[i].name) - continue; - drv_data.src_clocks[i].clk = - devm_clk_get(&pdev->dev, drv_data.src_clocks[i].name); - if (IS_ERR(drv_data.src_clocks[i].clk)) { - dev_err(&pdev->dev, "Unable to get clock %s\n", - drv_data.src_clocks[i].name); - return -EPROBE_DEFER; - } - } - - /* Disable hardware gating of gpll0 to A5SS */ - regval = readl_relaxed(drv_data.apcs_cpu_pwr_ctl); - regval |= GPLL0_TO_A5_ALWAYS_ENABLE; - writel_relaxed(regval, drv_data.apcs_cpu_pwr_ctl); - - /* Enable the always on source */ - clk_prepare_enable(drv_data.src_clocks[PLL0].clk); - - return acpuclk_cortex_init(pdev, &drv_data); -} - -static struct of_device_id acpuclk_9625_match_table[] = { - {.compatible = "qcom,acpuclk-9625"}, - {} -}; - -static struct platform_driver acpuclk_9625_driver = { - .driver = { - .name = "acpuclk-9625", - .of_match_table = acpuclk_9625_match_table, - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_9625_init(void) -{ - return platform_driver_probe(&acpuclk_9625_driver, acpuclk_9625_probe); -} -device_initcall(acpuclk_9625_init); diff --git a/arch/arm/mach-msm/acpuclock-fsm9xxx.c b/arch/arm/mach-msm/acpuclock-fsm9xxx.c deleted file mode 100644 index 6e1eb7e71da2..000000000000 --- a/arch/arm/mach-msm/acpuclock-fsm9xxx.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include - -#include "acpuclock.h" - -/* Registers */ -#define PLL1_CTL_ADDR (MSM_CLK_CTL_BASE + 0x604) - -static unsigned long acpuclk_9xxx_get_rate(int cpu) -{ - unsigned int pll1_ctl; - unsigned int pll1_l, pll1_div2; - unsigned int pll1_khz; - - pll1_ctl = readl_relaxed(PLL1_CTL_ADDR); - pll1_l = ((pll1_ctl >> 3) & 0x3f) * 2; - pll1_div2 = pll1_ctl & 0x20000; - pll1_khz = 19200 * pll1_l; - if (pll1_div2) - pll1_khz >>= 1; - - return pll1_khz; -} - -static struct acpuclk_data acpuclk_9xxx_data = { - .get_rate = acpuclk_9xxx_get_rate, -}; - -static int __init acpuclk_9xxx_probe(struct platform_device *pdev) -{ - acpuclk_register(&acpuclk_9xxx_data); - pr_info("ACPU running at %lu KHz\n", acpuclk_get_rate(0)); - return 0; -} - -static struct platform_driver acpuclk_9xxx_driver = { - .driver = { - .name = "acpuclk-9xxx", - .owner = THIS_MODULE, - }, -}; - -static int __init acpuclk_9xxx_init(void) -{ - return platform_driver_probe(&acpuclk_9xxx_driver, acpuclk_9xxx_probe); -} -device_initcall(acpuclk_9xxx_init); diff --git a/arch/arm/mach-msm/arch-init-scorpion.S b/arch/arm/mach-msm/arch-init-scorpion.S deleted file mode 100644 index db0a1e6417db..000000000000 --- a/arch/arm/mach-msm/arch-init-scorpion.S +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * Copyright (c) 2008-2009, Google Inc. - * 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 Google, Inc. 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE 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. - */ - - -/* TODO: - * - style cleanup - * - do we need to do *all* of this at boot? - */ - -.text -.code 32 - -#define DSB .byte 0x4f, 0xf0, 0x7f, 0xf5 -#define ISB .byte 0x6f, 0xf0, 0x7f, 0xf5 - -.equ TCSR_SPARE2, 0xA8700060 - -SET_SA: - ldr r0, =TCSR_SPARE2 - ldr r12, [r0] - - /* pack bits 8,2,0 into 2,1,0 */ - and r0, r12, #0x001 - and r1, r12, #0x004 - and r2, r12, #0x100 - orr r0, r1, lsr #1 - orr r0, r2, lsr #6 - - adr r1, table_l1_acc - mov r0, r0, lsl #2 - ldr r3, [r1, r0] - - /* write 3800XXXX to PVR0F0 */ - orr r0, r3, #0x38000000 - mcr p15, 0, r0, c15, c15, 0 - - /* write XXXX0000 to PVR2F0 */ - mov r1, r3, lsl #16 - mcr p15, 2, r1, c15, c15, 0 - - adr r1, table_l2_acc - and r0, r12, #0x008 - and r2, r12, #0x002 - orr r0, r0, r2, lsl #1 - ldr r2, [r1, r0] - - /* write to L2VR3F1 */ - mcr p15, 3, r2, c15, c15, 1 - - bx lr - -table_l1_acc: - .word 0xFC00 - .word 0xFC00 - .word 0x7C00 - .word 0xFC00 - .word 0x3C00 - .word 0x0400 - .word 0x0C00 - .word 0x1C00 - -table_l2_acc: - .word 0x010102 - .word 0x010102 - .word 0x010101 - .word 0x212102 - -.globl __cpu_early_init -__cpu_early_init: - //; Zero out r0 for use throughout this code. All other GPRs - //; (r1-r3) are set throughout this code to help establish - //; a consistent startup state for any code that follows. - //; Users should add code at the end of this routine to establish - //; their own stack address (r13), add translation page tables, enable - //; the caches, etc. - MOV r0, #0x0 - - - //; Remove hardcoded cache settings. appsbl_handler.s calls Set_SA - //; API to dynamically configure cache for slow/nominal/fast parts - - //; DCIALL to invalidate L2 cache bank (needs to be run 4 times, once per bank) - //; This must be done early in code (prior to enabling the caches) - MOV r1, #0x2 - MCR p15, 0, r1, c9, c0, 6 //; DCIALL bank D ([15:14] == 2'b00) - ORR r1, r1, #0x00004000 - MCR p15, 0, r1, c9, c0, 6 //; DCIALL bank C ([15:14] == 2'b01) - ADD r1, r1, #0x00004000 - MCR p15, 0, r1, c9, c0, 6 //; DCIALL bank B ([15:14] == 2'b10) - ADD r1, r1, #0x00004000 - MCR p15, 0, r1, c9, c0, 6 //; DCIALL bank A ([15:14] == 2'b11) - - //; Initialize the BPCR - setup Global History Mask (GHRM) to all 1's - //; and have all address bits (AM) participate. - //; Different settings can be used to improve performance - // MOVW r1, #0x01FF -.word 0xe30011ff // hardcoded MOVW instruction due to lack of compiler support - // MOVT r1, #0x01FF -.word 0xe34011ff // hardcoded MOVT instruction due to lack of compiler support - MCR p15, 7, r1, c15, c0, 2 //; WCP15_BPCR - - - //; Initialize all I$ Victim Registers to 0 for startup - MCR p15, 0, r0, c9, c1, 0 //; WCP15_ICVIC0 r0 - MCR p15, 0, r0, c9, c1, 1 //; WCP15_ICVIC1 r0 - MCR p15, 0, r0, c9, c1, 2 //; WCP15_ICVIC2 r0 - MCR p15, 0, r0, c9, c1, 3 //; WCP15_ICVIC3 r0 - MCR p15, 0, r0, c9, c1, 4 //; WCP15_ICVIC4 r0 - MCR p15, 0, r0, c9, c1, 5 //; WCP15_ICVIC5 r0 - MCR p15, 0, r0, c9, c1, 6 //; WCP15_ICVIC5 r0 - MCR p15, 0, r0, c9, c1, 7 //; WCP15_ICVIC7 r0 - - //; Initialize all I$ Locked Victim Registers (Unlocked Floors) to 0 - MCR p15, 1, r0, c9, c1, 0 //; WCP15_ICFLOOR0 r0 - MCR p15, 1, r0, c9, c1, 1 //; WCP15_ICFLOOR1 r0 - MCR p15, 1, r0, c9, c1, 2 //; WCP15_ICFLOOR2 r0 - MCR p15, 1, r0, c9, c1, 3 //; WCP15_ICFLOOR3 r0 - MCR p15, 1, r0, c9, c1, 4 //; WCP15_ICFLOOR4 r0 - MCR p15, 1, r0, c9, c1, 5 //; WCP15_ICFLOOR5 r0 - MCR p15, 1, r0, c9, c1, 6 //; WCP15_ICFLOOR6 r0 - MCR p15, 1, r0, c9, c1, 7 //; WCP15_ICFLOOR7 r0 - - //; Initialize all D$ Victim Registers to 0 - MCR p15, 2, r0, c9, c1, 0 //; WP15_DCVIC0 r0 - MCR p15, 2, r0, c9, c1, 1 //; WP15_DCVIC1 r0 - MCR p15, 2, r0, c9, c1, 2 //; WP15_DCVIC2 r0 - MCR p15, 2, r0, c9, c1, 3 //; WP15_DCVIC3 r0 - MCR p15, 2, r0, c9, c1, 4 //; WP15_DCVIC4 r0 - MCR p15, 2, r0, c9, c1, 5 //; WP15_DCVIC5 r0 - MCR p15, 2, r0, c9, c1, 6 //; WP15_DCVIC6 r0 - MCR p15, 2, r0, c9, c1, 7 //; WP15_DCVIC7 r0 - - //; Initialize all D$ Locked VDCtim Registers (Unlocked Floors) to 0 - MCR p15, 3, r0, c9, c1, 0 //; WCP15_DCFLOOR0 r0 - MCR p15, 3, r0, c9, c1, 1 //; WCP15_DCFLOOR1 r0 - MCR p15, 3, r0, c9, c1, 2 //; WCP15_DCFLOOR2 r0 - MCR p15, 3, r0, c9, c1, 3 //; WCP15_DCFLOOR3 r0 - MCR p15, 3, r0, c9, c1, 4 //; WCP15_DCFLOOR4 r0 - MCR p15, 3, r0, c9, c1, 5 //; WCP15_DCFLOOR5 r0 - MCR p15, 3, r0, c9, c1, 6 //; WCP15_DCFLOOR6 r0 - MCR p15, 3, r0, c9, c1, 7 //; WCP15_DCFLOOR7 r0 - - //; Initialize ASID to zero - MCR p15, 0, r0, c13, c0, 1 //; WCP15_CONTEXTIDR r0 - - //; ICIALL to invalidate entire I-Cache - MCR p15, 0, r0, c7, c5, 0 //; ICIALLU - - //; DCIALL to invalidate entire D-Cache - MCR p15, 0, r0, c9, c0, 6 //; DCIALL r0 - - - //; The VBAR (Vector Base Address Register) should be initialized - //; early in your code. We are setting it to zero - MCR p15, 0, r0, c12, c0, 0 //; WCP15_VBAR r0 - - //; Ensure the MCR's above have completed their operation before continuing - DSB - ISB - - //;------------------------------------------------------------------- - //; There are a number of registers that must be set prior to enabling - //; the MMU. The DCAR is one of these registers. We are setting - //; it to zero (no access) to easily detect improper setup in subsequent - //; code sequences - //;------------------------------------------------------------------- - //; Setup DACR (Domain Access Control Register) to zero - MCR p15, 0, r0, c3, c0, 0 //; WCP15_DACR r0 - - //; Setup DCLKCR to allow normal D-Cache line fills - MCR p15, 1, r0, c9, c0, 7 //; WCP15_DCLKCR r0 - - //; Initialize the ADFSR and EFSR registers. - MCR p15, 0, r0, c5, c1, 0 //; ADFSR - MCR p15, 7, r0, c15, c0, 1 //; EFSR - - //; Setup the TLBLKCR - //; Victim = 6'b000000; Floor = 6'b000000; - //; IASIDCFG = 2'b00 (State-Machine); IALLCFG = 2'b01 (Flash); BNA = 1'b0; - MOV r1, #0x02 - MCR p15, 0, r1, c10, c1, 3 //; WCP15_TLBLKCR r1 - - //;Make sure TLBLKCR is complete before continuing - ISB - - //; Invalidate the UTLB - MCR p15, 0, r0, c8, c7, 0 //; UTLBIALL - - //; Make sure UTLB request has been presented to macro before continuing - ISB - - //; setup L2CR1 to some default Instruction and data prefetching values - //; Users may want specific settings for various performance enhancements - //; In Halcyon we do not have broadcasting barriers. So we need to turn - // ; on bit 8 of L2CR1; which DBB:( Disable barrier broadcast ) - MOV r2, #0x100 - MCR p15, 3, r2, c15, c0, 3 //; WCP15_L2CR1 r0 - - - //; Enable Z bit to enable branch prediction (default is off) - MRC p15, 0, r2, c1, c0, 0 //; RCP15_SCTLR r2 - ORR r2, r2, #0x00000800 - MCR p15, 0, r2, c1, c0, 0 //; WCP15_SCTLR r2 - -#ifdef CONFIG_ARCH_QSD8X50 - /* disable predecode repair cache for thumb2 (DPRC, set bit 4 in PVR0F2) */ - mrc p15, 0, r2, c15, c15, 2 - orr r2, r2, #0x10 - mcr p15, 0, r2, c15, c15, 2 -#endif - - mov r1, lr - //; Make sure Link stack is initialized with branch and links to sequential addresses - //; This aids in creating a predictable startup environment - BL SEQ1 -SEQ1: BL SEQ2 -SEQ2: BL SEQ3 -SEQ3: BL SEQ4 -SEQ4: BL SEQ5 -SEQ5: BL SEQ6 -SEQ6: BL SEQ7 -SEQ7: BL SEQ8 -SEQ8: - mov lr, r1 - - //; REMOVE FOLLOWING THREE INSTRUCTIONS WHEN POWER COLLAPSE IS ENA - //;Make sure the DBGOSLSR[LOCK] bit is cleared to allow access to the debug registers - //; Writing anything but the "secret code" to the DBGOSLAR clears the DBGOSLSR[LOCK] bit - MCR p14, 0, r0, c1, c0, 4 //; WCP14_DBGOSLAR r0 - - - //; Read the DBGPRSR to clear the DBGPRSR[STICKYPD] - //; Any read to DBGPRSR clear the STICKYPD bit - //; ISB guarantees the read completes before attempting to - //; execute a CP14 instruction. - MRC p14, 0, r3, c1, c5, 4 //; RCP14_DBGPRSR r3 - ISB - - //; Initialize the Watchpoint Control Registers to zero (optional) - //;;; MCR p14, 0, r0, c0, c0, 7 ; WCP14_DBGWCR0 r0 - //;;; MCR p14, 0, r0, c0, c1, 7 ; WCP14_DBGWCR1 r0 - - - //;---------------------------------------------------------------------- - //; The saved Program Status Registers (SPSRs) should be setup - //; prior to any automatic mode switches. The following - //; code sets these registers up to a known state. Users will need to - //; customize these settings to meet their needs. - //;---------------------------------------------------------------------- - MOV r2, #0x1f - MOV r1, #0x17 //;ABT mode - msr cpsr_c, r1 //;ABT mode - msr spsr_cxfs, r2 //;clear the spsr - MOV r1, #0x1b //;UND mode - msr cpsr_c, r1 //;UND mode - msr spsr_cxfs, r2 //;clear the spsr - MOV r1, #0x11 //;FIQ mode - msr cpsr_c, r1 //;FIQ mode - msr spsr_cxfs, r2 //;clear the spsr - MOV r1, #0x12 //;IRQ mode - msr cpsr_c, r1 //;IRQ mode - msr spsr_cxfs, r2 //;clear the spsr - MOV r1, #0x16 //;Monitor mode - msr cpsr_c, r1 //;Monitor mode - msr spsr_cxfs, r2 //;clear the spsr - MOV r1, #0x13 //;SVC mode - msr cpsr_c, r1 //;SVC mode - msr spsr_cxfs, r2 //;clear the spsr - - - //;---------------------------------------------------------------------- - //; Enabling Error reporting is something users may want to do at - //; some other point in time. We have chosen some default settings - //; that should be reviewed. Most of these registers come up in an - //; unpredictable state after reset. - //;---------------------------------------------------------------------- -//;Start of error and control setting - - //; setup L2CR0 with various L2/TCM control settings - //; enable out of order bus attributes and error reporting - //; this register comes up unpredictable after reset - // MOVW r1, #0x0F0F -.word 0xe3001f0f // hardcoded MOVW instruction due to lack of compiler support - // MOVT r1, #0xC005 -.word 0xe34c1005 // hardcoded MOVW instruction due to lack of compiler support - MCR p15, 3, r1, c15, c0, 1 //; WCP15_L2CR0 r1 - - //; setup L2CPUCR - //; MOV r2, #0xFF - //; Enable I and D cache parity - //;L2CPUCR[7:5] = 3~Rh7 ~V enable parity error reporting for modified, - //;tag, and data parity errors - MOV r2, #0xe0 - MCR p15, 3, r2, c15, c0, 2 //; WCP15_L2CPUCR r2 - - //; setup SPCR - //; enable all error reporting (reset value is unpredicatble for most bits) - MOV r3, #0x0F - MCR p15, 0, r3, c9, c7, 0 //; WCP15_SPCR r3 - - //; setup DMACHCRs (reset value unpredictable) - //; control setting and enable all error reporting - MOV r1, #0x0F - - //; DMACHCR0 = 0000000F - MOV r2, #0x00 //; channel 0 - MCR p15, 0, r2, c11, c0, 0 //; WCP15_DMASELR r2 - MCR p15, 0, r1, c11, c0, 2 //; WCP15_DMACHCR r1 - - //; DMACHCR1 = 0000000F - MOV r2, #0x01 //; channel 1 - MCR p15, 0, r2, c11, c0, 0 //; WCP15_DMASELR r2 - MCR p15, 0, r1, c11, c0, 2 //; WCP15_DMACHCR r1 - - //; DMACHCR2 = 0000000F - MOV r2, #0x02 //; channel 2 - MCR p15, 0, r2, c11, c0, 0 //; WCP15_DMASELR r2 - MCR p15, 0, r1, c11, c0, 2 //; WCP15_DMACHCR r1 - - //; DMACHCR3 = 0000000F - MOV r2, #0x03 //; channel 3 - MCR p15, 0, r2, c11, c0, 0 //; WCP15_DMASELR r2 - MCR p15, 0, r1, c11, c0, 2 //; WCP15_DMACHCR r1 - - //; Set ACTLR (reset unpredictable) - //; Set AVIVT control, error reporting, etc. - //; MOV r3, #0x07 - //; Enable I and D cache parity - //;ACTLR[2:0] = 3'h7 - enable parity error reporting from L2/I$/D$) - //;ACTLR[5:4] = 2'h3 - enable parity - //;ACTLR[19:18] =2'h3 - always generate and check parity(when MMU disabled). - //;Value to be written #0xC0037 - // MOVW r3, #0x0037 -.word 0xe3003037 // hardcoded MOVW instruction due to lack of compiler support - // MOVT r3, #0x000C -.word 0xe340300c // hardcoded MOVW instruction due to lack of compiler support - //; read the version_id to determine if d-cache should be disabled - LDR r2, = 0xa8e00270 //;Read HW_REVISION_NUMBER, HWIO_HW_REVISION_NUMBER_ADDR - LDR r2,[r2] - AND r2,r2,#0xf0000000 //;hw_revision mask off bits 28-31 - //;if HW_revision is 1.0 or older, (revision==0) - CMP r2,#0 - //; Disable d-cache on older QSD8650 (Rev 1.0) silicon - orreq r3, r3, #0x4000 //;disable dcache - MCR p15, 0, r3, c1, c0, 1 //; WCP15_ACTLR r3 - -//;End of error and control setting - - //;---------------------------------------------------------------------- - //; Unlock ETM and read StickyPD to halt the ETM clocks from running. - //; This is required for power saving whether the ETM is used or not. - //;---------------------------------------------------------------------- - - //;Clear ETMOSLSR[LOCK] bit - MOV r1, #0x00000000 - MCR p14, 1, r1, c1, c0, 4 //; WCP14_ETMOSLAR r1 - - //;Clear ETMPDSR[STICKYPD] bit - MRC p14, 1, r2, c1, c5, 4 //; RCP14_ETMPDSR r2 - -/* -#ifdef APPSBL_ETM_ENABLE - ;---------------------------------------------------------------------- - ; Optionally Enable the ETM (Embedded Trace Macro) which is used for debug - ;---------------------------------------------------------------------- - - ; enable ETM clock if disabled - MRC p15, 7, r1, c15, c0, 5 ; RCP15_CPMR r1 - ORR r1, r1, #0x00000008 - MCR p15, 7, r1, c15, c0, 5 ; WCP15_CPMR r1 - ISB - - ; set trigger event to counter1 being zero - MOV r3, #0x00000040 - MCR p14, 1, r3, c0, c2, 0 ; WCP14_ETMTRIGGER r3 - - ; clear ETMSR - MOV r2, #0x00000000 - MCR p14, 1, r2, c0, c4, 0 ; WCP14_ETMSR r2 - - ; clear trace enable single address comparator usage - MCR p14, 1, r2, c0, c7, 0 ; WCP14_ETMTECR2 r2 - - ; set trace enable to always - MOV r2, #0x0000006F - MCR p14, 1, r2, c0, c8, 0 ; WCP14_ETMTEEVR r2 - - ; clear trace enable address range comparator usage and exclude nothing - MOV r2, #0x01000000 - MCR p14, 1, r2, c0, c9, 0 ; WCP14_ETMTECR1 r2 - - ; set view data to always - MOV r2, #0x0000006F - MCR p14, 1, r2, c0, c12, 0 ; WCP14_ETMVDEVR r2 - - ; clear view data single address comparator usage - MOV r2, #0x00000000 - MCR p14, 1, r2, c0, c13, 0 ; WCP14_ETMVDCR1 r2 - - ; clear view data address range comparator usage and exclude nothing - MOV r2, #0x00010000 - MCR p14, 1, r2, c0, c15, 0 ; WCP14_ETMVDCR3 r2 - - ; set counter1 to 194 - MOV r2, #0x000000C2 - MCR p14, 1, r2, c0, c0, 5 ; WCP14_ETMCNTRLDVR1 r2 - - ; set counter1 to never reload - MOV r2, #0x0000406F - MCR p14, 1, r2, c0, c8, 5 ; WCP14_ETMCNTRLDEVR1 r2 - - ; set counter1 to decrement every cycle - MOV r2, #0x0000006F - MCR p14, 1, r2, c0, c4, 5 ; WCP14_ETMCNTENR1 r2 - - ; Set trace synchronization frequency 1024 bytes - MOV r2, #0x00000400 - MCR p14, 1, r2, c0, c8, 7 ; WCP14_ETMSYNCFR r2 - - ; Program etm control register - ; - Set the CPU to ETM clock ratio to 1:1 - ; - Set the ETM to perform data address tracing - MOV r2, #0x00002008 - MCR p14, 1, r2, c0, c0, 0 ; WCP14_ETMCR r2 - ISB -#endif *//* APPSBL_ETM_ENABLE */ - -/* -#ifdef APPSBL_VFP_ENABLE - ;---------------------------------------------------------------------- - ; Perform the following operations if you intend to make use of - ; the VFP/Neon unit. Note that the FMXR instruction requires a CPU ID - ; indicating the VFP unit is present (i.e.Cortex-A8). . - ; Some tools will require full double precision floating point support - ; which will become available in Scorpion pass 2 - ;---------------------------------------------------------------------- - ; allow full access to CP 10 and 11 space for VFP/NEON use - MRC p15, 0, r1, c1, c0, 2 ; Read CP Access Control Register - ORR r1, r1, #0x00F00000 ; enable full access for p10,11 - MCR p15, 0, r1, c1, c0, 2 ; Write CPACR - - ;make sure the CPACR is complete before continuing - ISB - - ; Enable VFP itself (certain OSes may want to dynamically set/clear - ; the enable bit based on the application being executed - MOV r1, #0x40000000 - FMXR FPEXC, r1 -#endif *//* APPSBL_VFP_ENABLE */ - - /* we have no stack, so just tail-call into the SET_SA routine... */ - b SET_SA - -.ltorg diff --git a/arch/arm/mach-msm/audio-7627a-devices.c b/arch/arm/mach-msm/audio-7627a-devices.c deleted file mode 100644 index 95727def6622..000000000000 --- a/arch/arm/mach-msm/audio-7627a-devices.c +++ /dev/null @@ -1,219 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - -#include "board-msm7627a.h" - -#define SND(desc, num) { .name = #desc, .id = num } -static struct snd_endpoint snd_endpoints_list[] = { - SND(HANDSET, 0), - SND(MONO_HEADSET, 2), - SND(HEADSET, 3), - SND(SPEAKER, 6), - SND(TTY_HEADSET, 8), - SND(TTY_VCO, 9), - SND(TTY_HCO, 10), - SND(BT, 12), - SND(IN_S_SADC_OUT_HANDSET, 16), - SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25), - SND(FM_DIGITAL_STEREO_HEADSET, 26), - SND(FM_DIGITAL_SPEAKER_PHONE, 27), - SND(FM_DIGITAL_BT_A2DP_HEADSET, 28), - SND(STEREO_HEADSET_AND_SPEAKER, 31), - SND(CURRENT, 0x7FFFFFFE), - SND(FM_ANALOG_STEREO_HEADSET, 35), - SND(FM_ANALOG_STEREO_HEADSET_CODEC, 36), -}; -#undef SND - -static struct msm_snd_endpoints msm_device_snd_endpoints = { - .endpoints = snd_endpoints_list, - .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint) -}; - -struct platform_device msm_device_snd = { - .name = "msm_snd", - .id = -1, - .dev = { - .platform_data = &msm_device_snd_endpoints - }, -}; - -#define DEC0_FORMAT ((1< -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-8064.h" - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - -#define BAHAMA_SLAVE_ID_FM_ADDR 0x2A -#define BAHAMA_SLAVE_ID_QMEMBIST_ADDR 0x7B - -struct bt_vreg_info { - const char *name; - unsigned int pmapp_id; - unsigned int min_level; - unsigned int max_level; - unsigned int is_pin_controlled; - struct regulator *reg; -}; - -struct bahama_config_register { - u8 reg; - u8 value; - u8 mask; -}; -static struct bt_vreg_info bt_vregs[] = { - {"bha_vddxo", 2, 1800000, 1800000, 0, NULL}, - {"bha_vddpx", 21, 1800000, 1800000, 0, NULL}, - {"bha_vddpa", 21, 2900000, 3300000, 0, NULL} -}; - -static struct msm_xo_voter *bt_clock; - -static struct platform_device msm_bt_power_device = { - .name = "bt_power", - .id = -1, -}; - -static unsigned bt_config_pcm_on[] = { - /*PCM_DOUT*/ - GPIO_CFG(43, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_DIN*/ - GPIO_CFG(44, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_SYNC*/ - GPIO_CFG(45, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_CLK*/ - GPIO_CFG(46, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static unsigned bt_config_pcm_off[] = { - /*PCM_DOUT*/ - GPIO_CFG(43, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_DIN*/ - GPIO_CFG(44, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_SYNC*/ - GPIO_CFG(45, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_CLK*/ - GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -static int config_pcm(int mode) -{ - int pin, rc = 0; - - if (mode == BT_PCM_ON) { - pr_err("%s mode =BT_PCM_ON", __func__); - for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_on); - pin++) { - rc = gpio_tlmm_config(bt_config_pcm_on[pin], - GPIO_CFG_ENABLE); - if (rc < 0) - return rc; - } - } else if (mode == BT_PCM_OFF) { - pr_err("%s mode =BT_PCM_OFF", __func__); - for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_off); - pin++) { - rc = gpio_tlmm_config(bt_config_pcm_off[pin], - GPIO_CFG_ENABLE); - if (rc < 0) - return rc; - } - - } - - return rc; -} - -static int bahama_bt(int on) -{ - int rc = 0; - int i; - - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - struct bahama_variant_register { - const size_t size; - const struct bahama_config_register *set; - }; - - const struct bahama_config_register *p; - - int version; - - const struct bahama_config_register v10_bt_on[] = { - { 0xE9, 0x00, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xE4, 0x00, 0xFF }, - { 0xE5, 0x00, 0x0F }, -#ifdef CONFIG_WLAN - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - { 0x01, 0x0C, 0x1F }, - { 0x01, 0x08, 0x1F }, - }; - - const struct bahama_config_register v20_bt_on_fm_off[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xF0, 0x00, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0x8E, 0x15, 0xFF }, - { 0x8F, 0x15, 0xFF }, - { 0x90, 0x15, 0xFF }, - - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v20_bt_on_fm_on[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v10_bt_off[] = { - { 0xE9, 0x00, 0xFF }, - }; - - const struct bahama_config_register v20_bt_off_fm_off[] = { - { 0xF4, 0x84, 0xFF }, - { 0xF0, 0x04, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_config_register v20_bt_off_fm_on[] = { - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_variant_register bt_bahama[2][3] = { - { - { ARRAY_SIZE(v10_bt_off), v10_bt_off }, - { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off }, - { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on } - }, - { - { ARRAY_SIZE(v10_bt_on), v10_bt_on }, - { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off }, - { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on } - } - }; - - u8 offset = 0; /* index into bahama configs */ - on = on ? 1 : 0; - version = marimba_read_bahama_ver(&config); - if (version < 0 || version == BAHAMA_VER_UNSUPPORTED) { - dev_err(&msm_bt_power_device.dev, - "%s : Bahama version read Error, version = %d\n", - __func__, version); - return -EIO; - } - if (version == BAHAMA_VER_2_0) { - if (marimba_get_fm_status(&config)) - offset = 0x01; - } - - p = bt_bahama[on][version + offset].set; - - dev_dbg(&msm_bt_power_device.dev, - "%s: found version %d\n", __func__, version); - - for (i = 0; i < bt_bahama[on][version + offset].size; i++) { - u8 value = (p+i)->value; - rc = marimba_write_bit_mask(&config, - (p+i)->reg, - &value, - sizeof((p+i)->value), - (p+i)->mask); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "%s: reg %x write failed: %d\n", - __func__, (p+i)->reg, rc); - return rc; - } - dev_dbg(&msm_bt_power_device.dev, - "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - value = 0; - if (marimba_read_bit_mask(&config, - (p+i)->reg, &value, - sizeof((p+i)->value), (p+i)->mask) < 0) - dev_err(&msm_bt_power_device.dev, - "%s marimba_read_bit_mask- error", - __func__); - dev_dbg(&msm_bt_power_device.dev, - "%s: reg 0x%02x read value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - } - /* Update BT Status */ - if (on) - marimba_set_bt_status(&config, true); - else - marimba_set_bt_status(&config, false); - return rc; -} - -static int bluetooth_switch_regulators(int on) -{ - int i, rc = 0; - - for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) { - if (IS_ERR_OR_NULL(bt_vregs[i].reg)) { - bt_vregs[i].reg = - regulator_get(&msm_bt_power_device.dev, - bt_vregs[i].name); - if (IS_ERR(bt_vregs[i].reg)) { - rc = PTR_ERR(bt_vregs[i].reg); - dev_err(&msm_bt_power_device.dev, - "%s: invalid regulator handle for %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_disable; - } - } - rc = on ? regulator_set_voltage(bt_vregs[i].reg, - bt_vregs[i].min_level, - bt_vregs[i].max_level) : 0; - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not set voltage for %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_disable; - } - - rc = on ? regulator_enable(bt_vregs[i].reg) : 0; - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not %sable regulator %s: %d\n", - __func__, "en", bt_vregs[i].name, rc); - goto reg_disable; - } - - rc = on ? 0 : regulator_disable(bt_vregs[i].reg); - - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not %sable regulator %s: %d\n", - __func__, "dis", bt_vregs[i].name, rc); - } - } - - return rc; -reg_disable: - pr_err("bluetooth_switch_regulators - FAIL!!!!\n"); - if (on) { - while (i) { - i--; - regulator_disable(bt_vregs[i].reg); - regulator_put(bt_vregs[i].reg); - bt_vregs[i].reg = NULL; - } - } - return rc; -} - -static unsigned int msm_bahama_setup_power(void) -{ - int rc = 0; - int i; - - for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) { - bt_vregs[i].reg = regulator_get(&msm_bt_power_device.dev, - bt_vregs[i].name); - if (IS_ERR(bt_vregs[i].reg)) { - rc = PTR_ERR(bt_vregs[i].reg); - pr_err("%s: could not get regulator %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_fail; - } - rc = regulator_set_voltage(bt_vregs[i].reg, - bt_vregs[i].min_level, - bt_vregs[i].max_level); - if (rc) { - pr_err("%s: could not set voltage for %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_fail; - } - rc = regulator_enable(bt_vregs[i].reg); - if (rc) { - pr_err("%s: could not enable regulator %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_fail; - } - } - return rc; -reg_fail: - pr_err("msm_bahama_setup_power FAILED !!!\n"); - - while (i) { - i--; - regulator_disable(bt_vregs[i].reg); - regulator_put(bt_vregs[i].reg); - bt_vregs[i].reg = NULL; - } - return rc; -} - -static unsigned int msm_bahama_shutdown_power(int value) -{ - int rc = 0; - int i; - - for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) { - rc = regulator_disable(bt_vregs[i].reg); - - if (rc < 0) { - pr_err("%s: could not disable regulator %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto out; - } - - regulator_put(bt_vregs[i].reg); - bt_vregs[i].reg = NULL; - } -out: - return rc; -} - -static unsigned int msm_bahama_core_config(int type) -{ - int rc = 0; - - if (type == BAHAMA_ID) { - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - const struct bahama_config_register v20_init[] = { - /* reg, value, mask */ - { 0xF4, 0x84, 0xFF }, /* AREG */ - { 0xF0, 0x04, 0xFF } /* DREG */ - }; - if (marimba_read_bahama_ver(&config) == BAHAMA_VER_2_0) { - for (i = 0; i < ARRAY_SIZE(v20_init); i++) { - u8 value = v20_init[i].value; - rc = marimba_write_bit_mask(&config, - v20_init[i].reg, - &value, - sizeof(v20_init[i].value), - v20_init[i].mask); - if (rc < 0) { - pr_err("%s: reg %d write failed: %d\n", - __func__, v20_init[i].reg, rc); - return rc; - } - pr_debug("%s: reg 0x%02x value 0x%02x mask 0x%02x\n", - __func__, v20_init[i].reg, - v20_init[i].value, v20_init[i].mask); - } - } - } - pr_debug("core type: %d\n", type); - return rc; -} - -static int bluetooth_power(int on) -{ - int rc = 0; - const char *id = "BTPW"; - int cid = 0; - int bt_state = 0; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - cid = adie_get_detected_connectivity_type(); - if (cid != BAHAMA_ID) { - pr_err("%s: unexpected adie connectivity type: %d\n", - __func__, cid); - return -ENODEV; - } - - if (on) { - pr_debug("%s: Powering up the BT module.\n", __func__); - rc = bluetooth_switch_regulators(on); - if (rc < 0) { - pr_err("%s: bluetooth_switch_regulators rc = %d", - __func__, rc); - goto exit; - } - /* UART GPIO configuration to be done by by UART module*/ - /*Setup BT clocks*/ - pr_debug("%s: Voting for the 19.2MHz clock\n", __func__); - bt_clock = msm_xo_get(MSM_XO_TCXO_A2, id); - if (IS_ERR(bt_clock)) { - rc = PTR_ERR(bt_clock); - pr_err("%s: failed to get the handle for A2(%d)\n", - __func__, rc); - goto fail_power; - } - rc = msm_xo_mode_vote(bt_clock, MSM_XO_MODE_ON); - if (rc < 0) { - pr_err("%s: Failed to vote for TCXO_A2 ON\n", __func__); - goto fail_xo_vote; - } - msleep(20); - - /*I2C config for Bahama*/ - pr_debug("%s: BT Turn On sequence in-progress.\n", __func__); - rc = bahama_bt(1); - if (rc < 0) { - pr_err("%s: bahama_bt rc = %d", __func__, rc); - goto fail_xo_vote; - } - msleep(20); - - /*setup BT PCM lines*/ - pr_debug("%s: Configuring PCM lines.\n", __func__); - rc = config_pcm(BT_PCM_ON); - if (rc < 0) { - pr_err("%s: config_pcm , rc = %d\n", - __func__, rc); - goto fail_i2c; - } - pr_debug("%s: BT Turn On complete.\n", __func__); - /* TO DO - Enable PIN CTRL */ - /* - rc = msm_xo_mode_vote(bt_clock, MSM_XO_MODE_PIN_CTRL); - if (rc < 0) { - pr_err("%s: Failed to vote for TCXO_A2 in PIN_CTRL\n", - __func__); - goto fail_xo_vote; - } */ - } else { - pr_debug("%s: Turning BT Off.\n", __func__); - bt_state = marimba_get_bt_status(&config); - if (!bt_state) { - pr_err("%s: BT is already turned OFF.\n", __func__); - return 0; - } - - rc = config_pcm(BT_PCM_OFF); - if (rc < 0) { - pr_err("%s: msm_bahama_setup_pcm_i2s, rc =%d\n", - __func__, rc); - } -fail_i2c: - rc = bahama_bt(0); - if (rc < 0) - pr_err("%s: bahama_bt rc = %d", __func__, rc); -fail_xo_vote: - pr_debug("%s: Voting off the 19.2MHz clk\n", __func__); - msm_xo_put(bt_clock); -fail_power: - pr_debug("%s: Switching off voltage regulators.\n", __func__); - rc = bluetooth_switch_regulators(0); - if (rc < 0) { - pr_err("%s: switch_regulators : rc = %d",\ - __func__, rc); - goto exit; - } - pr_debug("%s: BT Power Off complete.\n", __func__); - } - return rc; -exit: - pr_err("%s: failed with rc = %d", __func__, rc); - return rc; -} - -static struct marimba_platform_data marimba_pdata = { - .slave_id[SLAVE_ID_BAHAMA_FM] = BAHAMA_SLAVE_ID_FM_ADDR, - .slave_id[SLAVE_ID_BAHAMA_QMEMBIST] = BAHAMA_SLAVE_ID_QMEMBIST_ADDR, - .bahama_setup = msm_bahama_setup_power, - .bahama_shutdown = msm_bahama_shutdown_power, - .bahama_core_config = msm_bahama_core_config, - .fm = NULL, -}; - -static struct i2c_board_info bahama_devices[] = { -{ - I2C_BOARD_INFO("marimba", 0xc), - .platform_data = &marimba_pdata, -}, -}; - -void __init apq8064_bt_power_init(void) -{ - int rc = 0; - struct device *dev; - - rc = i2c_register_board_info(APQ_8064_GSBI5_QUP_I2C_BUS_ID, - bahama_devices, - ARRAY_SIZE(bahama_devices)); - if (rc < 0) { - pr_err("%s: I2C Register failed\n", __func__); - return; - } - rc = platform_device_register(&msm_bt_power_device); - if (rc < 0) { - pr_err("%s: device register failed\n", __func__); - platform_device_unregister(&msm_bt_power_device); - return; - } - - dev = &msm_bt_power_device.dev; - dev->platform_data = &bluetooth_power; - - return; -} -#endif diff --git a/arch/arm/mach-msm/board-8064-camera.c b/arch/arm/mach-msm/board-8064-camera.c deleted file mode 100644 index 6de770841e3a..000000000000 --- a/arch/arm/mach-msm/board-8064-camera.c +++ /dev/null @@ -1,778 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include - -#include -#include -#include - -#include "devices.h" -#include "board-8064.h" - -#ifdef CONFIG_MSM_CAMERA - -static struct gpiomux_setting cam_settings[] = { - { - .func = GPIOMUX_FUNC_GPIO, /*suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - }, - - { - .func = GPIOMUX_FUNC_1, /*active 1*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*active 2*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_2, /*active 3*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_5, /*active 4*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_6, /*active 5*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_2, /*active 6*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_3, /*active 7*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*i2c suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, - }, - - { - .func = GPIOMUX_FUNC_9, /*active 9*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - }, - { - .func = GPIOMUX_FUNC_A, /*active 10*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - }, - { - .func = GPIOMUX_FUNC_6, /*active 11*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - }, - { - .func = GPIOMUX_FUNC_4, /*active 12*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - -}; - -static struct msm_gpiomux_config apq8064_cam_common_configs[] = { - { - .gpio = 1, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 2, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[12], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 3, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 4, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 5, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[1], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 34, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 107, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 10, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[9], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 11, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[10], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 12, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[11], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 13, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[11], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, -}; - - -#define VFE_CAMIF_TIMER1_GPIO 3 -#define VFE_CAMIF_TIMER2_GPIO 1 - -static struct gpio flash_init_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER1"}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER2"}, -}; - -static struct msm_gpio_set_tbl flash_set_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, -}; - -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_EXT, - .init_gpio_tbl = flash_init_gpio, - .init_gpio_tbl_size = ARRAY_SIZE(flash_init_gpio), - .set_gpio_tbl = flash_set_gpio, - .set_gpio_tbl_size = ARRAY_SIZE(flash_set_gpio), - ._fsrc.ext_driver_src.led_en = VFE_CAMIF_TIMER1_GPIO, - ._fsrc.ext_driver_src.led_flash_en = VFE_CAMIF_TIMER2_GPIO, - ._fsrc.ext_driver_src.flash_id = MAM_CAMERA_EXT_LED_FLASH_SC628A, -}; - -static struct msm_gpiomux_config apq8064_cam_2d_configs[] = { -}; - -static struct msm_bus_vectors cam_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_preview_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 27648000, - .ib = 110592000, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 274406400, - .ib = 561807360, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 274423680, - .ib = 1097694720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_zsl_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 302071680, - .ib = 1208286720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_video_ls_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 348192000, - .ib = 617103360, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_dual_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 348192000, - .ib = 1208286720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, -}; - - -static struct msm_bus_paths cam_bus_client_config[] = { - { - ARRAY_SIZE(cam_init_vectors), - cam_init_vectors, - }, - { - ARRAY_SIZE(cam_preview_vectors), - cam_preview_vectors, - }, - { - ARRAY_SIZE(cam_video_vectors), - cam_video_vectors, - }, - { - ARRAY_SIZE(cam_snapshot_vectors), - cam_snapshot_vectors, - }, - { - ARRAY_SIZE(cam_zsl_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_video_ls_vectors), - cam_video_ls_vectors, - }, - { - ARRAY_SIZE(cam_dual_vectors), - cam_dual_vectors, - }, -}; - -static struct msm_bus_scale_pdata cam_bus_client_pdata = { - cam_bus_client_config, - ARRAY_SIZE(cam_bus_client_config), - .name = "msm_camera", -}; - -static struct msm_camera_device_platform_data msm_camera_csi_device_data[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, - { - .csiphy_core = 1, - .csid_core = 1, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, -}; - -static struct camera_vreg_t apq_8064_cam_vreg[] = { - {"cam_vdig", REG_LDO, 1200000, 1200000, 105000}, - {"cam_vio", REG_VS, 0, 0, 0}, - {"cam_vana", REG_LDO, 2800000, 2850000, 85600}, - {"cam_vaf", REG_LDO, 2800000, 2850000, 300000}, -}; - -#define CAML_RSTN PM8921_GPIO_PM_TO_SYS(28) -#define CAMR_RSTN 34 - -static struct gpio apq8064_common_cam_gpio[] = { -}; - -static struct gpio apq8064_back_cam_gpio[] = { - {5, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {CAML_RSTN, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl apq8064_back_cam_gpio_set_tbl[] = { - {CAML_RSTN, GPIOF_OUT_INIT_LOW, 10000}, - {CAML_RSTN, GPIOF_OUT_INIT_HIGH, 10000}, -}; - -static struct msm_camera_gpio_conf apq8064_back_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = apq8064_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(apq8064_cam_2d_configs), - .cam_gpio_common_tbl = apq8064_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(apq8064_common_cam_gpio), - .cam_gpio_req_tbl = apq8064_back_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(apq8064_back_cam_gpio), - .cam_gpio_set_tbl = apq8064_back_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(apq8064_back_cam_gpio_set_tbl), -}; - -static struct gpio apq8064_front_cam_gpio[] = { - {4, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {12, GPIOF_DIR_IN, "CAMIF_I2C_DATA"}, - {13, GPIOF_DIR_IN, "CAMIF_I2C_CLK"}, - {CAMR_RSTN, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl apq8064_front_cam_gpio_set_tbl[] = { - {CAMR_RSTN, GPIOF_OUT_INIT_LOW, 10000}, - {CAMR_RSTN, GPIOF_OUT_INIT_HIGH, 10000}, -}; - -static struct msm_camera_gpio_conf apq8064_front_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = apq8064_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(apq8064_cam_2d_configs), - .cam_gpio_common_tbl = apq8064_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(apq8064_common_cam_gpio), - .cam_gpio_req_tbl = apq8064_front_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(apq8064_front_cam_gpio), - .cam_gpio_set_tbl = apq8064_front_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(apq8064_front_cam_gpio_set_tbl), -}; - -static struct msm_camera_i2c_conf apq8064_back_cam_i2c_conf = { - .use_i2c_mux = 1, - .mux_dev = &msm8960_device_i2c_mux_gsbi4, - .i2c_mux_mode = MODE_L, -}; - -static struct i2c_board_info msm_act_main_cam_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x11), -}; - -static struct msm_actuator_info msm_act_main_cam_0_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_0, - .bus_id = APQ_8064_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct i2c_board_info msm_act_main_cam1_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x18), -}; - -static struct msm_actuator_info msm_act_main_cam_1_info = { - .board_info = &msm_act_main_cam1_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_1, - .bus_id = APQ_8064_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - - -static struct msm_camera_i2c_conf apq8064_front_cam_i2c_conf = { - .use_i2c_mux = 1, - .mux_dev = &msm8960_device_i2c_mux_gsbi4, - .i2c_mux_mode = MODE_L, -}; - -static struct msm_camera_sensor_flash_data flash_imx135 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params imx135_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx135 = { - .mount_angle = 90, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_back_cam_gpio_conf, - .i2c_conf = &apq8064_back_cam_i2c_conf, - .csi_lane_params = &imx135_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx135_data = { - .sensor_name = "imx135", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx135, - .sensor_platform_info = &sensor_board_info_imx135, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_1_info, -}; - -static struct i2c_board_info sc628a_flash_i2c_info = { - I2C_BOARD_INFO("sc628a", 0x6E), -}; - -static struct msm_camera_sensor_flash_data flash_imx074 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src, - .board_info = &sc628a_flash_i2c_info, - .bus_id = APQ_8064_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_csi_lane_params imx074_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = { - .mount_angle = 90, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_back_cam_gpio_conf, - .i2c_conf = &apq8064_back_cam_i2c_conf, - .csi_lane_params = &imx074_csi_lane_params, -}; - -static struct i2c_board_info imx074_eeprom_i2c_info = { - I2C_BOARD_INFO("imx074_eeprom", 0x34 << 1), -}; - -static struct msm_eeprom_info imx074_eeprom_info = { - .board_info = &imx074_eeprom_i2c_info, - .bus_id = APQ_8064_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = { - .sensor_name = "imx074", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx074, - .sensor_platform_info = &sensor_board_info_imx074, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_0_info, - .eeprom_info = &imx074_eeprom_info, -}; - -static struct msm_camera_csi_lane_params imx091_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_flash_data flash_imx091 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx091 = { - .mount_angle = 0, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_back_cam_gpio_conf, - .i2c_conf = &apq8064_back_cam_i2c_conf, - .csi_lane_params = &imx091_csi_lane_params, -}; - -static struct i2c_board_info imx091_eeprom_i2c_info = { - I2C_BOARD_INFO("imx091_eeprom", 0x21), -}; - -static struct msm_eeprom_info imx091_eeprom_info = { - .board_info = &imx091_eeprom_i2c_info, - .bus_id = APQ_8064_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx091_data = { - .sensor_name = "imx091", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx091, - .sensor_platform_info = &sensor_board_info_imx091, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_1_info, - .eeprom_info = &imx091_eeprom_info, -}; - -static struct msm_camera_sensor_flash_data flash_s5k3l1yx = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params s5k3l1yx_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_s5k3l1yx = { - .mount_angle = 90, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_back_cam_gpio_conf, - .i2c_conf = &apq8064_back_cam_i2c_conf, - .csi_lane_params = &s5k3l1yx_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3l1yx_data = { - .sensor_name = "s5k3l1yx", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_s5k3l1yx, - .sensor_platform_info = &sensor_board_info_s5k3l1yx, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; - -static struct msm_camera_sensor_flash_data flash_mt9m114 = { - .flash_type = MSM_CAMERA_FLASH_NONE -}; - -static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x1, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = { - .mount_angle = 90, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_front_cam_gpio_conf, - .i2c_conf = &apq8064_front_cam_i2c_conf, - .csi_lane_params = &mt9m114_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = { - .sensor_name = "mt9m114", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_mt9m114, - .sensor_platform_info = &sensor_board_info_mt9m114, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = YUV_SENSOR, -}; - -static struct msm_camera_sensor_flash_data flash_ov2720 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params ov2720_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x3, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = { - .mount_angle = 0, - .cam_vreg = apq_8064_cam_vreg, - .num_vreg = ARRAY_SIZE(apq_8064_cam_vreg), - .gpio_conf = &apq8064_front_cam_gpio_conf, - .i2c_conf = &apq8064_front_cam_i2c_conf, - .csi_lane_params = &ov2720_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = { - .sensor_name = "ov2720", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_ov2720, - .sensor_platform_info = &sensor_board_info_ov2720, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -void __init apq8064_init_cam(void) -{ - msm_gpiomux_install(apq8064_cam_common_configs, - ARRAY_SIZE(apq8064_cam_common_configs)); - - if (machine_is_apq8064_cdp()) { - sensor_board_info_imx074.mount_angle = 0; - sensor_board_info_mt9m114.mount_angle = 0; - } else if (machine_is_apq8064_liquid()) - sensor_board_info_imx074.mount_angle = 180; - - platform_device_register(&msm_camera_server); - platform_device_register(&msm8960_device_i2c_mux_gsbi4); - platform_device_register(&msm8960_device_csiphy0); - platform_device_register(&msm8960_device_csiphy1); - platform_device_register(&msm8960_device_csid0); - platform_device_register(&msm8960_device_csid1); - platform_device_register(&msm8960_device_ispif); - platform_device_register(&msm8960_device_vfe); - platform_device_register(&msm8960_device_vpe); -} - -#ifdef CONFIG_I2C -static struct i2c_board_info apq8064_camera_i2c_boardinfo[] = { - { - I2C_BOARD_INFO("imx074", 0x1A), - .platform_data = &msm_camera_sensor_imx074_data, - }, - { - I2C_BOARD_INFO("imx135", 0x10), - .platform_data = &msm_camera_sensor_imx135_data, - }, - { - I2C_BOARD_INFO("mt9m114", 0x48), - .platform_data = &msm_camera_sensor_mt9m114_data, - }, - { - I2C_BOARD_INFO("ov2720", 0x6C), - .platform_data = &msm_camera_sensor_ov2720_data, - }, - { - I2C_BOARD_INFO("imx091", 0x34), - .platform_data = &msm_camera_sensor_imx091_data, - }, - { - I2C_BOARD_INFO("s5k3l1yx", 0x20), - .platform_data = &msm_camera_sensor_s5k3l1yx_data, - }, -}; - -struct msm_camera_board_info apq8064_camera_board_info = { - .board_info = apq8064_camera_i2c_boardinfo, - .num_i2c_board_info = ARRAY_SIZE(apq8064_camera_i2c_boardinfo), -}; -#endif -#endif diff --git a/arch/arm/mach-msm/board-8064-display.c b/arch/arm/mach-msm/board-8064-display.c deleted file mode 100644 index 415bc8d59577..000000000000 --- a/arch/arm/mach-msm/board-8064-display.c +++ /dev/null @@ -1,1110 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-8064.h" - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -/* prim = 1366 x 768 x 3(bpp) x 3(pages) */ -#define MSM_FB_PRIM_BUF_SIZE roundup(1920 * 1088 * 4 * 3, 0x10000) -#else -/* prim = 1366 x 768 x 3(bpp) x 2(pages) */ -#define MSM_FB_PRIM_BUF_SIZE roundup(1920 * 1088 * 4 * 2, 0x10000) -#endif - -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE, 4096) - -#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE roundup((1376 * 768 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY0_WRITEBACK */ - -#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE roundup((1920 * 1088 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY1_WRITEBACK */ - -#define AVTIMER_PHYSICAL_ADDRESS 0x28009008 - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -#define LVDS_CHIMEI_PANEL_NAME "lvds_chimei_wxga" -#define LVDS_FRC_PANEL_NAME "lvds_frc_fhd" -#define MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME "mipi_video_toshiba_wsvga" -#define MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME "mipi_video_chimei_wxga" -#define HDMI_PANEL_NAME "hdmi_msm" -#define MHL_PANEL_NAME "hdmi_msm,mhl_8334" -#define TVOUT_PANEL_NAME "tvout_msm" - -#define LVDS_PIXEL_MAP_PATTERN_1 1 -#define LVDS_PIXEL_MAP_PATTERN_2 2 - -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -static unsigned char hdmi_is_primary = 1; -#else -static unsigned char hdmi_is_primary; -#endif - -static unsigned char mhl_display_enabled; - -unsigned char apq8064_hdmi_as_primary_selected(void) -{ - return hdmi_is_primary; -} - -unsigned char apq8064_mhl_display_enabled(void) -{ - return mhl_display_enabled; -} - -static void set_mdp_clocks_for_wuxga(void); - -static int msm_fb_detect_panel(const char *name) -{ - u32 version; - if (machine_is_apq8064_liquid()) { - version = socinfo_get_platform_version(); - if ((SOCINFO_VERSION_MAJOR(version) == 1) && - (SOCINFO_VERSION_MINOR(version) == 1)) { - if (!strncmp(name, MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME, - strnlen(MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } else { - if (!strncmp(name, LVDS_CHIMEI_PANEL_NAME, - strnlen(LVDS_CHIMEI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } - } else if (machine_is_apq8064_mtp()) { - if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } else if (machine_is_apq8064_cdp()) { - if (!strncmp(name, LVDS_CHIMEI_PANEL_NAME, - strnlen(LVDS_CHIMEI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } else if (machine_is_mpq8064_dtv()) { - if (!strncmp(name, LVDS_FRC_PANEL_NAME, - strnlen(LVDS_FRC_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - set_mdp_clocks_for_wuxga(); - return 0; - } - } - - if (!strncmp(name, HDMI_PANEL_NAME, - strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - if (apq8064_hdmi_as_primary_selected()) - set_mdp_clocks_for_wuxga(); - return 0; - } - - - return -ENODEV; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev.platform_data = &msm_fb_pdata, -}; - -void __init apq8064_allocate_fb_region(void) -{ - void *addr; - unsigned long size; - - size = MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); -} - -#define MDP_VSYNC_GPIO 0 - -static struct msm_bus_vectors mdp_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors mdp_ui_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_vga_vectors[] = { - /* VGA and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_720p_vectors[] = { - /* 720p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 230400000 * 2, - .ib = 288000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_1080p_vectors[] = { - /* 1080p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 334080000 * 2, - .ib = 417600000 * 2, - }, -}; - -static struct msm_bus_paths mdp_bus_scale_usecases[] = { - { - ARRAY_SIZE(mdp_init_vectors), - mdp_init_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_vga_vectors), - mdp_vga_vectors, - }, - { - ARRAY_SIZE(mdp_720p_vectors), - mdp_720p_vectors, - }, - { - ARRAY_SIZE(mdp_1080p_vectors), - mdp_1080p_vectors, - }, -}; - -static struct msm_bus_scale_pdata mdp_bus_scale_pdata = { - mdp_bus_scale_usecases, - ARRAY_SIZE(mdp_bus_scale_usecases), - .name = "mdp", -}; - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = MDP_VSYNC_GPIO, - .mdp_max_clk = 266667000, - .mdp_bus_scale_table = &mdp_bus_scale_pdata, - .mdp_rev = MDP_REV_44, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .mem_hid = BIT(ION_CP_MM_HEAP_ID), -#else - .mem_hid = MEMTYPE_EBI1, -#endif - .mdp_iommu_split_domain = 1, - .avtimer_phy = AVTIMER_PHYSICAL_ADDRESS, -}; - -void __init apq8064_mdp_writeback(struct memtype_reserve* reserve_table) -{ - mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE; - mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE; -#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov0_wb_size; - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov1_wb_size; -#endif -} - -static struct resource hdmi_msm_resources[] = { - { - .name = "hdmi_msm_qfprom_addr", - .start = 0x00700000, - .end = 0x007060FF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_hdmi_addr", - .start = 0x04A00000, - .end = 0x04A00FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_irq", - .start = HDMI_IRQ, - .end = HDMI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static int hdmi_enable_5v(int on); -static int hdmi_core_power(int on, int show); -static int hdmi_cec_power(int on); -static int hdmi_gpio_config(int on); -static int hdmi_panel_power(int on); - -static struct msm_hdmi_platform_data hdmi_msm_data = { - .irq = HDMI_IRQ, - .enable_5v = hdmi_enable_5v, - .core_power = hdmi_core_power, - .cec_power = hdmi_cec_power, - .panel_power = hdmi_panel_power, - .gpio_config = hdmi_gpio_config, -}; - -static struct platform_device hdmi_msm_device = { - .name = "hdmi_msm", - .id = 0, - .num_resources = ARRAY_SIZE(hdmi_msm_resources), - .resource = hdmi_msm_resources, - .dev.platform_data = &hdmi_msm_data, -}; - -static char wfd_check_mdp_iommu_split_domain(void) -{ - return mdp_pdata.mdp_iommu_split_domain; -} - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL -static struct msm_wfd_platform_data wfd_pdata = { - .wfd_check_mdp_iommu_split = wfd_check_mdp_iommu_split_domain, -}; - -static struct platform_device wfd_panel_device = { - .name = "wfd_panel", - .id = 0, - .dev.platform_data = NULL, -}; - -static struct platform_device wfd_device = { - .name = "msm_wfd", - .id = -1, - .dev.platform_data = &wfd_pdata, -}; -#endif - -/* HDMI related GPIOs */ -#define HDMI_CEC_VAR_GPIO 69 -#define HDMI_DDC_CLK_GPIO 70 -#define HDMI_DDC_DATA_GPIO 71 -#define HDMI_HPD_GPIO 72 - -static bool dsi_power_on; -static int mipi_dsi_panel_power(int on) -{ - static struct regulator *reg_lvs7, *reg_l2, *reg_l11, *reg_ext_3p3v; - static int gpio36, gpio25, gpio26, mpp3; - int rc; - - pr_debug("%s: on=%d\n", __func__, on); - - if (!dsi_power_on) { - reg_lvs7 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi1_vddio"); - if (IS_ERR_OR_NULL(reg_lvs7)) { - pr_err("could not get 8921_lvs7, rc = %ld\n", - PTR_ERR(reg_lvs7)); - return -ENODEV; - } - - reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi1_pll_vdda"); - if (IS_ERR_OR_NULL(reg_l2)) { - pr_err("could not get 8921_l2, rc = %ld\n", - PTR_ERR(reg_l2)); - return -ENODEV; - } - - rc = regulator_set_voltage(reg_l2, 1200000, 1200000); - if (rc) { - pr_err("set_voltage l2 failed, rc=%d\n", rc); - return -EINVAL; - } - reg_l11 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi1_avdd"); - if (IS_ERR(reg_l11)) { - pr_err("could not get 8921_l11, rc = %ld\n", - PTR_ERR(reg_l11)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_l11, 3000000, 3000000); - if (rc) { - pr_err("set_voltage l11 failed, rc=%d\n", rc); - return -EINVAL; - } - - if (machine_is_apq8064_liquid()) { - reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi1_vccs_3p3v"); - if (IS_ERR_OR_NULL(reg_ext_3p3v)) { - pr_err("could not get reg_ext_3p3v, rc = %ld\n", - PTR_ERR(reg_ext_3p3v)); - reg_ext_3p3v = NULL; - return -ENODEV; - } - mpp3 = PM8921_MPP_PM_TO_SYS(3); - rc = gpio_request(mpp3, "backlight_en"); - if (rc) { - pr_err("request mpp3 failed, rc=%d\n", rc); - return -ENODEV; - } - } - - gpio25 = PM8921_GPIO_PM_TO_SYS(25); - rc = gpio_request(gpio25, "disp_rst_n"); - if (rc) { - pr_err("request gpio 25 failed, rc=%d\n", rc); - return -ENODEV; - } - - gpio26 = PM8921_GPIO_PM_TO_SYS(26); - rc = gpio_request(gpio26, "pwm_backlight_ctrl"); - if (rc) { - pr_err("request gpio 26 failed, rc=%d\n", rc); - return -ENODEV; - } - - gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */ - rc = gpio_request(gpio36, "lcd1_pwr_en_n"); - if (rc) { - pr_err("request gpio 36 failed, rc=%d\n", rc); - return -ENODEV; - } - - dsi_power_on = true; - } - - if (on) { - rc = regulator_enable(reg_lvs7); - if (rc) { - pr_err("enable lvs7 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_set_optimum_mode(reg_l11, 110000); - if (rc < 0) { - pr_err("set_optimum_mode l11 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l11); - if (rc) { - pr_err("enable l11 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_set_optimum_mode(reg_l2, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l2); - if (rc) { - pr_err("enable l2 failed, rc=%d\n", rc); - return -ENODEV; - } - - if (machine_is_apq8064_liquid()) { - rc = regulator_enable(reg_ext_3p3v); - if (rc) { - pr_err("enable reg_ext_3p3v failed, rc=%d\n", - rc); - return -ENODEV; - } - gpio_set_value_cansleep(mpp3, 1); - } - - gpio_set_value_cansleep(gpio36, 0); - gpio_set_value_cansleep(gpio25, 1); - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio_set_value_cansleep(gpio26, 1); - } else { - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio_set_value_cansleep(gpio26, 0); - gpio_set_value_cansleep(gpio25, 0); - gpio_set_value_cansleep(gpio36, 1); - - if (machine_is_apq8064_liquid()) { - gpio_set_value_cansleep(mpp3, 0); - - rc = regulator_disable(reg_ext_3p3v); - if (rc) { - pr_err("disable reg_ext_3p3v failed, rc=%d\n", - rc); - return -ENODEV; - } - } - - rc = regulator_disable(reg_l11); - if (rc) { - pr_err("disable reg_l1 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_disable(reg_lvs7); - if (rc) { - pr_err("disable reg_lvs7 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_disable(reg_l2); - if (rc) { - pr_err("disable reg_l2 failed, rc=%d\n", rc); - return -ENODEV; - } - } - - return 0; -} - -static struct mipi_dsi_platform_data mipi_dsi_pdata = { - .dsi_power_save = mipi_dsi_panel_power, -}; - -static bool lvds_power_on; -static int lvds_panel_power(int on) -{ - static struct regulator *reg_lvs7, *reg_l2, *reg_ext_3p3v; - static int gpio36, gpio26, mpp3; - int rc; - - pr_debug("%s: on=%d\n", __func__, on); - - if (!lvds_power_on) { - reg_lvs7 = regulator_get(&msm_lvds_device.dev, - "lvds_vdda"); - if (IS_ERR_OR_NULL(reg_lvs7)) { - pr_err("could not get 8921_lvs7, rc = %ld\n", - PTR_ERR(reg_lvs7)); - return -ENODEV; - } - - reg_l2 = regulator_get(&msm_lvds_device.dev, - "lvds_pll_vdda"); - if (IS_ERR_OR_NULL(reg_l2)) { - pr_err("could not get 8921_l2, rc = %ld\n", - PTR_ERR(reg_l2)); - return -ENODEV; - } - - rc = regulator_set_voltage(reg_l2, 1200000, 1200000); - if (rc) { - pr_err("set_voltage l2 failed, rc=%d\n", rc); - return -EINVAL; - } - - reg_ext_3p3v = regulator_get(&msm_lvds_device.dev, - "lvds_vccs_3p3v"); - if (IS_ERR_OR_NULL(reg_ext_3p3v)) { - pr_err("could not get reg_ext_3p3v, rc = %ld\n", - PTR_ERR(reg_ext_3p3v)); - return -ENODEV; - } - - gpio26 = PM8921_GPIO_PM_TO_SYS(26); - rc = gpio_request(gpio26, "pwm_backlight_ctrl"); - if (rc) { - pr_err("request gpio 26 failed, rc=%d\n", rc); - return -ENODEV; - } - - gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */ - rc = gpio_request(gpio36, "lcd1_pwr_en_n"); - if (rc) { - pr_err("request gpio 36 failed, rc=%d\n", rc); - return -ENODEV; - } - - mpp3 = PM8921_MPP_PM_TO_SYS(3); - rc = gpio_request(mpp3, "backlight_en"); - if (rc) { - pr_err("request mpp3 failed, rc=%d\n", rc); - return -ENODEV; - } - - lvds_power_on = true; - } - - if (on) { - rc = regulator_enable(reg_lvs7); - if (rc) { - pr_err("enable lvs7 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_set_optimum_mode(reg_l2, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l2); - if (rc) { - pr_err("enable l2 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_enable(reg_ext_3p3v); - if (rc) { - pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc); - return -ENODEV; - } - - gpio_set_value_cansleep(gpio36, 0); - gpio_set_value_cansleep(mpp3, 1); - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio_set_value_cansleep(gpio26, 1); - } else { - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio_set_value_cansleep(gpio26, 0); - gpio_set_value_cansleep(mpp3, 0); - gpio_set_value_cansleep(gpio36, 1); - - rc = regulator_disable(reg_lvs7); - if (rc) { - pr_err("disable reg_lvs7 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_l2); - if (rc) { - pr_err("disable reg_l2 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_ext_3p3v); - if (rc) { - pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc); - return -ENODEV; - } - } - - return 0; -} - -static int lvds_pixel_remap(void) -{ - u32 ver = socinfo_get_version(); - - if (machine_is_apq8064_cdp() || - machine_is_apq8064_liquid()) { - if ((SOCINFO_VERSION_MAJOR(ver) == 1) && - (SOCINFO_VERSION_MINOR(ver) == 0)) - return LVDS_PIXEL_MAP_PATTERN_1; - } else if (machine_is_mpq8064_dtv()) { - if ((SOCINFO_VERSION_MAJOR(ver) == 1) && - (SOCINFO_VERSION_MINOR(ver) == 0)) - return LVDS_PIXEL_MAP_PATTERN_2; - } - return 0; -} - -static struct lcdc_platform_data lvds_pdata = { - .lcdc_power_save = lvds_panel_power, - .lvds_pixel_remap = lvds_pixel_remap -}; - -#define LPM_CHANNEL 2 -static int lvds_chimei_gpio[] = {LPM_CHANNEL}; - -static struct lvds_panel_platform_data lvds_chimei_pdata = { - .gpio = lvds_chimei_gpio, -}; - -static struct platform_device lvds_chimei_panel_device = { - .name = "lvds_chimei_wxga", - .id = 0, - .dev = { - .platform_data = &lvds_chimei_pdata, - } -}; - -#define FRC_GPIO_UPDATE (SX150X_EXP4_GPIO_BASE + 8) -#define FRC_GPIO_RESET (SX150X_EXP4_GPIO_BASE + 9) -#define FRC_GPIO_PWR (SX150X_EXP4_GPIO_BASE + 10) - -static int lvds_frc_gpio[] = {FRC_GPIO_UPDATE, FRC_GPIO_RESET, FRC_GPIO_PWR}; -static struct lvds_panel_platform_data lvds_frc_pdata = { - .gpio = lvds_frc_gpio, -}; - -static struct platform_device lvds_frc_panel_device = { - .name = "lvds_frc_fhd", - .id = 0, - .dev = { - .platform_data = &lvds_frc_pdata, - } -}; - -static int dsi2lvds_gpio[2] = { - LPM_CHANNEL,/* Backlight PWM-ID=0 for PMIC-GPIO#24 */ - 0x1F08 /* DSI2LVDS Bridge GPIO Output, mask=0x1f, out=0x08 */ -}; -static struct msm_panel_common_pdata mipi_dsi2lvds_pdata = { - .gpio_num = dsi2lvds_gpio, -}; - -static struct platform_device mipi_dsi2lvds_bridge_device = { - .name = "mipi_tc358764", - .id = 0, - .dev.platform_data = &mipi_dsi2lvds_pdata, -}; - -static int toshiba_gpio[] = {LPM_CHANNEL}; -static struct mipi_dsi_panel_platform_data toshiba_pdata = { - .gpio = toshiba_gpio, -}; - -static struct platform_device mipi_dsi_toshiba_panel_device = { - .name = "mipi_toshiba", - .id = 0, - .dev = { - .platform_data = &toshiba_pdata, - } -}; - -static struct msm_bus_vectors dtv_bus_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors dtv_bus_def_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 566092800 * 2, - .ib = 707616000 * 2, - }, -}; - -static struct msm_bus_paths dtv_bus_scale_usecases[] = { - { - ARRAY_SIZE(dtv_bus_init_vectors), - dtv_bus_init_vectors, - }, - { - ARRAY_SIZE(dtv_bus_def_vectors), - dtv_bus_def_vectors, - }, -}; -static struct msm_bus_scale_pdata dtv_bus_scale_pdata = { - dtv_bus_scale_usecases, - ARRAY_SIZE(dtv_bus_scale_usecases), - .name = "dtv", -}; - -static struct lcdc_platform_data dtv_pdata = { - .bus_scale_table = &dtv_bus_scale_pdata, - .lcdc_power_save = hdmi_panel_power, -}; - -static int hdmi_panel_power(int on) -{ - int rc; - - pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF")); - rc = hdmi_core_power(on, 1); - if (rc) - rc = hdmi_cec_power(on); - - pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF")); - return rc; -} - -static int hdmi_enable_5v(int on) -{ - /* TBD: PM8921 regulator instead of 8901 */ - static struct regulator *reg_8921_hdmi_mvs; /* HDMI_5V */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8921_hdmi_mvs) { - reg_8921_hdmi_mvs = regulator_get(&hdmi_msm_device.dev, - "hdmi_mvs"); - if (IS_ERR(reg_8921_hdmi_mvs)) { - pr_err("could not get reg_8921_hdmi_mvs, rc = %ld\n", - PTR_ERR(reg_8921_hdmi_mvs)); - reg_8921_hdmi_mvs = NULL; - return -ENODEV; - } - } - - if (on) { - rc = regulator_enable(reg_8921_hdmi_mvs); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8921_hdmi_mvs", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8921_hdmi_mvs); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "8921_hdmi_mvs", rc); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_core_power(int on, int show) -{ - static struct regulator *reg_8921_lvs7, *reg_8921_s4, *reg_ext_3p3v; - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - /* TBD: PM8921 regulator instead of 8901 */ - if (!reg_ext_3p3v && - (!(machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()))) { - reg_ext_3p3v = regulator_get(&hdmi_msm_device.dev, - "hdmi_mux_vdd"); - if (IS_ERR_OR_NULL(reg_ext_3p3v)) { - pr_err("could not get reg_ext_3p3v, rc = %ld\n", - PTR_ERR(reg_ext_3p3v)); - reg_ext_3p3v = NULL; - return -ENODEV; - } - } - - if (!reg_8921_lvs7) { - reg_8921_lvs7 = regulator_get(&hdmi_msm_device.dev, - "hdmi_vdda"); - if (IS_ERR(reg_8921_lvs7)) { - pr_err("could not get reg_8921_lvs7, rc = %ld\n", - PTR_ERR(reg_8921_lvs7)); - reg_8921_lvs7 = NULL; - return -ENODEV; - } - } - if (!reg_8921_s4) { - reg_8921_s4 = regulator_get(&hdmi_msm_device.dev, - "hdmi_lvl_tsl"); - if (IS_ERR(reg_8921_s4)) { - pr_err("could not get reg_8921_s4, rc = %ld\n", - PTR_ERR(reg_8921_s4)); - reg_8921_s4 = NULL; - return -ENODEV; - } - rc = regulator_set_voltage(reg_8921_s4, 1800000, 1800000); - if (rc) { - pr_err("set_voltage failed for 8921_s4, rc=%d\n", rc); - return -EINVAL; - } - } - - if (on) { - /* - * Configure 3P3V_BOOST_EN as GPIO, 8mA drive strength, - * pull none, out-high - */ - if (!(machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv())) { - rc = regulator_set_optimum_mode(reg_ext_3p3v, 290000); - if (rc < 0) { - pr_err("set_optimum_mode ext_3p3v failed," \ - "rc=%d\n", rc); - return -EINVAL; - } - - rc = regulator_enable(reg_ext_3p3v); - if (rc) { - pr_err("enable reg_ext_3p3v failed, rc=%d\n", - rc); - return rc; - } - } - - rc = regulator_enable(reg_8921_lvs7); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "hdmi_vdda", rc); - goto error1; - } - rc = regulator_enable(reg_8921_s4); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "hdmi_lvl_tsl", rc); - goto error2; - } - pr_debug("%s(on): success\n", __func__); - } else { - if (!(machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv())) { - rc = regulator_disable(reg_ext_3p3v); - if (rc) { - pr_err("disable reg_ext_3p3v failed, rc=%d\n", - rc); - return -ENODEV; - } - } - - rc = regulator_disable(reg_8921_lvs7); - if (rc) { - pr_err("disable reg_8921_l23 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_8921_s4); - if (rc) { - pr_err("disable reg_8921_s4 failed, rc=%d\n", rc); - return -ENODEV; - } - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; - -error2: - regulator_disable(reg_8921_lvs7); -error1: - if (!(machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv())) - regulator_disable(reg_ext_3p3v); - return rc; -} - -static int hdmi_gpio_config(int on) -{ - int rc = 0; - static int prev_on; - int pmic_gpio14 = PM8921_GPIO_PM_TO_SYS(14); - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(HDMI_DDC_CLK_GPIO, "HDMI_DDC_CLK"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_CLK", HDMI_DDC_CLK_GPIO, rc); - goto error1; - } - rc = gpio_request(HDMI_DDC_DATA_GPIO, "HDMI_DDC_DATA"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_DATA", HDMI_DDC_DATA_GPIO, rc); - goto error2; - } - rc = gpio_request(HDMI_HPD_GPIO, "HDMI_HPD"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_HPD", HDMI_HPD_GPIO, rc); - goto error3; - } - if (machine_is_apq8064_liquid()) { - rc = gpio_request(pmic_gpio14, "PMIC_HDMI_MUX_SEL"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "PMIC_HDMI_MUX_SEL", 14, rc); - goto error4; - } - gpio_set_value_cansleep(pmic_gpio14, 0); - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(HDMI_DDC_CLK_GPIO); - gpio_free(HDMI_DDC_DATA_GPIO); - gpio_free(HDMI_HPD_GPIO); - - if (machine_is_apq8064_liquid()) { - gpio_set_value_cansleep(pmic_gpio14, 1); - gpio_free(pmic_gpio14); - } - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - return 0; - -error4: - gpio_free(HDMI_HPD_GPIO); -error3: - gpio_free(HDMI_DDC_DATA_GPIO); -error2: - gpio_free(HDMI_DDC_CLK_GPIO); -error1: - return rc; -} - -static int hdmi_cec_power(int on) -{ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(HDMI_CEC_VAR_GPIO, "HDMI_CEC_VAR"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_CEC_VAR", HDMI_CEC_VAR_GPIO, rc); - goto error; - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(HDMI_CEC_VAR_GPIO); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -error: - return rc; -} - -void __init apq8064_init_fb(void) -{ - platform_device_register(&msm_fb_device); - platform_device_register(&lvds_chimei_panel_device); - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL - platform_device_register(&wfd_panel_device); - platform_device_register(&wfd_device); -#endif - - if (machine_is_apq8064_liquid()) - platform_device_register(&mipi_dsi2lvds_bridge_device); - if (machine_is_apq8064_mtp()) - platform_device_register(&mipi_dsi_toshiba_panel_device); - if (machine_is_mpq8064_dtv()) - platform_device_register(&lvds_frc_panel_device); - - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("lvds", &lvds_pdata); - msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); - platform_device_register(&hdmi_msm_device); - msm_fb_register_device("dtv", &dtv_pdata); -} - -/** - * Set MDP clocks to high frequency to avoid DSI underflow - * when using high resolution 1200x1920 WUXGA panels - */ -static void set_mdp_clocks_for_wuxga(void) -{ - mdp_ui_vectors[0].ab = 2000000000; - mdp_ui_vectors[0].ib = 2000000000; - mdp_vga_vectors[0].ab = 2000000000; - mdp_vga_vectors[0].ib = 2000000000; - mdp_720p_vectors[0].ab = 2000000000; - mdp_720p_vectors[0].ib = 2000000000; - mdp_1080p_vectors[0].ab = 2000000000; - mdp_1080p_vectors[0].ib = 2000000000; - - if (apq8064_hdmi_as_primary_selected()) { - dtv_bus_def_vectors[0].ab = 2000000000; - dtv_bus_def_vectors[0].ib = 2000000000; - } -} - -void __init apq8064_set_display_params(char *prim_panel, char *ext_panel, - unsigned char resolution) -{ - /* - * For certain MPQ boards, HDMI should be set as primary display - * by default, with the flexibility to specify any other panel - * as a primary panel through boot parameters. - */ - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_cdp()) { - pr_debug("HDMI is the primary display by default for MPQ\n"); - if (!strnlen(prim_panel, PANEL_NAME_MAX_LEN)) - strlcpy(msm_fb_pdata.prim_panel_name, HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN); - } - - if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.prim_panel_name, prim_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.prim_panel_name %s\n", - msm_fb_pdata.prim_panel_name); - - if (!strncmp((char *)msm_fb_pdata.prim_panel_name, - HDMI_PANEL_NAME, strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - pr_debug("HDMI is the primary display by" - " boot parameter\n"); - hdmi_is_primary = 1; - set_mdp_clocks_for_wuxga(); - } - } - if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.ext_panel_name, ext_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.ext_panel_name %s\n", - msm_fb_pdata.ext_panel_name); - - if (!strncmp((char *)msm_fb_pdata.ext_panel_name, - MHL_PANEL_NAME, strnlen(MHL_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - pr_debug("MHL is external display by boot parameter\n"); - mhl_display_enabled = 1; - } - } - - msm_fb_pdata.ext_resolution = resolution; - hdmi_msm_data.is_mhl_enabled = mhl_display_enabled; -} diff --git a/arch/arm/mach-msm/board-8064-gpiomux.c b/arch/arm/mach-msm/board-8064-gpiomux.c deleted file mode 100644 index ede53bcc2541..000000000000 --- a/arch/arm/mach-msm/board-8064-gpiomux.c +++ /dev/null @@ -1,2003 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8064.h" - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static struct gpiomux_setting gpio_eth_config = { - .pull = GPIOMUX_PULL_NONE, - .drv = GPIOMUX_DRV_8MA, - .func = GPIOMUX_FUNC_GPIO, -}; -#endif - -/* The SPI configurations apply to GSBI 5*/ -static struct gpiomux_setting gpio_spi_config = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -/* The SPI configurations apply to GSBI 5 chip select 2*/ -static struct gpiomux_setting gpio_spi_cs2_config = { - .func = GPIOMUX_FUNC_3, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -/* Chip selects for SPI clients */ -static struct gpiomux_setting gpio_spi_cs_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_UP, -}; - -/* Chip selects for EPM SPI clients */ -static struct gpiomux_setting gpio_epm_spi_cs_config = { - .func = GPIOMUX_FUNC_6, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_UP, -}; - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -struct msm_gpiomux_config apq8064_ethernet_configs[] = { - { - .gpio = 43, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_eth_config, - [GPIOMUX_ACTIVE] = &gpio_eth_config, - } - }, -}; -#endif - -#ifdef CONFIG_MSM_VCAP -static struct gpiomux_setting gpio_vcap_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -struct msm_gpiomux_config vcap_configs[] = { - { - .gpio = 20, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 25, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 24, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 23, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 19, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 22, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 21, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 12, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 18, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 11, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 10, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 9, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 26, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 8, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 7, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 6, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 80, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 86, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 85, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 84, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 5, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 4, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 3, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 2, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 82, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 83, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 87, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, - { - .gpio = 13, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_vcap_config, - [GPIOMUX_ACTIVE] = &gpio_vcap_config, - } - }, -}; -#endif - -static struct gpiomux_setting gpio_i2c_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gpio_i2c_2ma_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - - -static struct gpiomux_setting gpio_i2c_config_sus = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting mbhc_hs_detect = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cdc_mclk = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting audio_auxpcm[] = { -/* Suspended state */ - { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, -/* Active state */ - { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, -}; - - -static struct gpiomux_setting wcnss_5wire_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting wcnss_5wire_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - - -static struct gpiomux_setting slimbus = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting gsbi1_uart_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi2_uart_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi4_uart_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting ext_regulator_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting gsbi7_func1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi7_func2_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi3_suspended_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting gsbi3_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting hdmi_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_active_1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting hdmi_active_2_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_active_3_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_IN, -}; - -static struct gpiomux_setting hdmi_active_4_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_HIGH, -}; - -static struct gpiomux_setting gsbi5_suspended_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi5_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi5_uart_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi6_spi_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sx150x_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sx150x_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -#ifdef CONFIG_USB_EHCI_MSM_HSIC -static struct gpiomux_setting cyts_sleep_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cyts_sleep_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cyts_int_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting cyts_int_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct msm_gpiomux_config cyts_gpio_configs[] __initdata = { - { /* TS INTERRUPT */ - .gpio = 6, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_int_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_int_sus_cfg, - }, - }, - { /* TS SLEEP */ - .gpio = 33, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_sleep_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_sleep_sus_cfg, - }, - }, -}; -static struct msm_gpiomux_config cyts_gpio_alt_config[] __initdata = { - { /* TS INTERRUPT */ - .gpio = 6, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_int_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_int_sus_cfg, - }, - }, - { /* TS SLEEP */ - .gpio = 12, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_sleep_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_sleep_sus_cfg, - }, - }, -}; - -static struct gpiomux_setting hsic_act_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting hsic_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting hsic_wakeup_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_IN, -}; - -static struct gpiomux_setting hsic_wakeup_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_IN, -}; - -static struct msm_gpiomux_config apq8064_hsic_configs[] = { - { - .gpio = 88, /*HSIC_STROBE */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_sus_cfg, - }, - }, - { - .gpio = 89, /* HSIC_DATA */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_sus_cfg, - }, - }, - { - .gpio = 47, /* wake up */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_wakeup_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_wakeup_sus_cfg, - }, - }, -}; -#endif - -static struct gpiomux_setting mxt_reset_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mxt_reset_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting mxt_int_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mxt_int_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config apq8064_hdmi_configs[] __initdata = { - { - .gpio = 69, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 70, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 71, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 72, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_2_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_mhl_configs[] __initdata = { - { - .gpio = 30, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_3_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 35, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_4_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_gsbi_configs[] __initdata = { - { - .gpio = 8, /* GSBI3 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 9, /* GSBI3 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 18, /* GSBI1 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi1_uart_config, - }, - }, - { - .gpio = 19, /* GSBI1 UART RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi1_uart_config, - }, - }, - { - .gpio = 51, /* GSBI5 QUP SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 52, /* GSBI5 QUP SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 53, /* Funny CS0 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 31, /* GSBI5 QUP SPI_CS2_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_cs2_config, - }, - }, - { - .gpio = 54, /* GSBI5 QUP SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 30, /* FP CS */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config, - }, - }, - { - .gpio = 53, /* NOR CS */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config, - }, - }, - { - .gpio = 82, /* GSBI7 UART2 TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi7_func2_cfg, - }, - }, - { - .gpio = 83, /* GSBI7 UART2 RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi7_func1_cfg, - }, - }, -}; - -static struct msm_gpiomux_config fsm8064_ep_gsbi_configs[] __initdata = { - { - .gpio = 10, /* GSBI4 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4_uart_config, - }, - }, - { - .gpio = 11, /* GSBI4 UART RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4_uart_config, - }, - }, - { - .gpio = 18, /* GSBI1 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi1_uart_config, - }, - }, - { - .gpio = 19, /* GSBI1 UART RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi1_uart_config, - }, - }, - { - .gpio = 22, /* GSBI2 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi2_uart_config, - }, - }, - { - .gpio = 23, /* GSBI7 UART2 RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi2_uart_config, - }, - }, - { - .gpio = 51, /* GSBI5 QUP SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 52, /* GSBI5 QUP SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 53, /* Funny CS0 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 54, /* GSBI5 QUP SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 53, /* NOR CS */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_non_mi2s_gsbi_configs[] __initdata = { - { - .gpio = 32, /* EPM CS */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_epm_spi_cs_config, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_gsbi1_i2c_2ma_configs[] __initdata = { - { - .gpio = 21, /* GSBI1 QUP I2C_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config_sus, - [GPIOMUX_ACTIVE] = &gpio_i2c_2ma_config, - }, - }, - { - .gpio = 20, /* GSBI1 QUP I2C_DATA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config_sus, - [GPIOMUX_ACTIVE] = &gpio_i2c_2ma_config, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_gsbi1_i2c_8ma_configs[] __initdata = { - { - .gpio = 21, /* GSBI1 QUP I2C_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config_sus, - [GPIOMUX_ACTIVE] = &gpio_i2c_config, - }, - }, - { - .gpio = 20, /* GSBI1 QUP I2C_DATA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config_sus, - [GPIOMUX_ACTIVE] = &gpio_i2c_config, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_slimbus_config[] __initdata = { - { - .gpio = 40, /* slimbus clk */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, - { - .gpio = 41, /* slimbus data */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, -}; - -static struct gpiomux_setting spkr_i2s = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct msm_gpiomux_config mpq8064_spkr_i2s_config[] __initdata = { - { - .gpio = 47, /* spkr i2c sck */ - .settings = { - [GPIOMUX_SUSPENDED] = &spkr_i2s, - }, - }, - { - .gpio = 48, /* spkr_i2s_ws */ - .settings = { - [GPIOMUX_SUSPENDED] = &spkr_i2s, - }, - }, - { - .gpio = 49, /* spkr_i2s_dout */ - .settings = { - [GPIOMUX_SUSPENDED] = &spkr_i2s, - }, - }, - { - .gpio = 50, /* spkr_i2s_mclk */ - .settings = { - [GPIOMUX_SUSPENDED] = &spkr_i2s, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_audio_codec_configs[] __initdata = { - { - .gpio = 38, - .settings = { - [GPIOMUX_SUSPENDED] = &mbhc_hs_detect, - }, - }, - { - .gpio = 39, - .settings = { - [GPIOMUX_SUSPENDED] = &cdc_mclk, - }, - }, -}; - -static struct msm_gpiomux_config mpq8064_audio_auxpcm_configs[] __initdata = { - { - .gpio = 43, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 44, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 45, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 46, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, -}; - -/* External 3.3 V regulator enable */ -static struct msm_gpiomux_config apq8064_ext_regulator_configs[] __initdata = { - { - .gpio = APQ8064_EXT_3P3V_REG_EN_GPIO, - .settings = { - [GPIOMUX_SUSPENDED] = &ext_regulator_config, - }, - }, -}; - -static struct gpiomux_setting ap2mdm_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_status_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_errfatal_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_pblrdy = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ap2mdm_soft_reset_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ap2mdm_wakeup = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct msm_gpiomux_config mdm_configs[] __initdata = { - /* AP2MDM_STATUS */ - { - .gpio = 48, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_STATUS */ - { - .gpio = 49, - .settings = { - [GPIOMUX_ACTIVE] = &mdm2ap_status_cfg, - [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg, - } - }, - /* MDM2AP_ERRFATAL */ - { - .gpio = 19, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg, - } - }, - /* AP2MDM_ERRFATAL */ - { - .gpio = 18, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* AP2MDM_SOFT_RESET, aka AP2MDM_PON_RESET_N */ - { - .gpio = 27, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_soft_reset_cfg, - } - }, - /* AP2MDM_WAKEUP */ - { - .gpio = 35, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_wakeup, - } - }, - /* MDM2AP_PBL_READY*/ - { - .gpio = 46, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_pblrdy, - } - }, -}; - -static struct msm_gpiomux_config mdm_i2s_configs[] __initdata = { - /* AP2MDM_STATUS */ - { - .gpio = 48, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_STATUS */ - { - .gpio = 49, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg, - } - }, - /* MDM2AP_ERRFATAL */ - { - .gpio = 19, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg, - } - }, - /* AP2MDM_ERRFATAL */ - { - .gpio = 18, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* AP2MDM_SOFT_RESET, aka AP2MDM_PON_RESET_N */ - { - .gpio = 0, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_soft_reset_cfg, - } - }, - /* AP2MDM_WAKEUP */ - { - .gpio = 44, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_wakeup, - } - }, - /* MDM2AP_PBL_READY*/ - { - .gpio = 81, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_pblrdy, - } - }, -}; - -static struct gpiomux_setting i2s_act_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting i2s_act_func_2_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting i2s_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct msm_gpiomux_config mpq8064_mi2s_configs[] __initdata = { - { - .gpio = 27, /* mi2s ws */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 28, /* mi2s sclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 29, /* mi2s dout3 */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 30, /* mi2s dout2 */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - - { - .gpio = 31, /* mi2s dout1 */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 32, /* mi2s dout0 */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - - { - .gpio = 33, /* mi2s mclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_mi2s_configs[] __initdata = { - { - .gpio = 27, /* mi2s ws */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 28, /* mi2s sclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 29, /* mi2s dout3 - TX*/ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 32, /* mi2s dout0 - RX */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - - { - .gpio = 33, /* mi2s mclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, -}; - -static struct msm_gpiomux_config apq8064_mic_i2s_configs[] __initdata = { - { - .gpio = 35, /* mic i2s sclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 36, /* mic i2s ws */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 37, /* mic i2s din0 */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, -}; - - -static struct msm_gpiomux_config apq8064_spkr_i2s_configs[] __initdata = { - { - .gpio = 40, /* spkr i2s sclk */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_func_2_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 41, /* spkr i2s dout */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_func_2_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, - { - .gpio = 42, /* spkr i2s ws */ - .settings = { - [GPIOMUX_ACTIVE] = &i2s_act_cfg, - [GPIOMUX_SUSPENDED] = &i2s_sus_cfg, - }, - }, -}; - - -static struct msm_gpiomux_config apq8064_mxt_configs[] __initdata = { - { /* TS INTERRUPT */ - .gpio = 6, - .settings = { - [GPIOMUX_ACTIVE] = &mxt_int_act_cfg, - [GPIOMUX_SUSPENDED] = &mxt_int_sus_cfg, - }, - }, - { /* TS RESET */ - .gpio = 33, - .settings = { - [GPIOMUX_ACTIVE] = &mxt_reset_act_cfg, - [GPIOMUX_SUSPENDED] = &mxt_reset_sus_cfg, - }, - }, -}; - -static struct msm_gpiomux_config wcnss_5wire_interface[] = { - { - .gpio = 64, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 65, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 66, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 67, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 68, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config mpq8064_gsbi5_i2c_configs[] __initdata = { - { - .gpio = 53, /* GSBI5 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi5_active_cfg, - }, - }, - { - .gpio = 54, /* GSBI5 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi5_active_cfg, - }, - }, -}; - -static struct gpiomux_setting ir_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ir_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config mpq8064_ir_configs[] __initdata = { - { - .gpio = 88, /* GPIO IR */ - .settings = { - [GPIOMUX_SUSPENDED] = &ir_suspended_cfg, - [GPIOMUX_ACTIVE] = &ir_active_cfg, - }, - }, -}; - -static struct msm_gpiomux_config sx150x_int_configs[] __initdata = { - { - .gpio = 81, - .settings = { - [GPIOMUX_SUSPENDED] = &sx150x_suspended_cfg, - [GPIOMUX_ACTIVE] = &sx150x_active_cfg, - }, - }, -}; - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct gpiomux_setting sdc2_clk_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdc2_cmd_data_0_3_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdc2_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdc2_data_1_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config apq8064_sdc2_configs[] __initdata = { - { - .gpio = 59, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_clk_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_suspended_cfg, - }, - }, - { - .gpio = 57, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_suspended_cfg, - }, - - }, - { - .gpio = 62, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_suspended_cfg, - }, - }, - { - .gpio = 61, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_data_1_suspended_cfg, - }, - }, - { - .gpio = 60, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_suspended_cfg, - }, - }, - { - .gpio = 58, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_suspended_cfg, - }, - }, -}; -#endif - - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct gpiomux_setting sdc4_clk_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdc4_cmd_data_0_3_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdc4_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdc4_data_1_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config apq8064_sdc4_configs[] __initdata = { - { - .gpio = 68, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_clk_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_suspended_cfg, - }, - }, - { - .gpio = 67, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_suspended_cfg, - }, - - }, - { - .gpio = 66, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_suspended_cfg, - }, - }, - { - .gpio = 65, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_data_1_suspended_cfg, - }, - }, - { - .gpio = 64, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_suspended_cfg, - }, - }, - { - .gpio = 63, - .settings = { - [GPIOMUX_ACTIVE] = &sdc4_cmd_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc4_suspended_cfg, - }, - }, -}; -#endif - -static struct gpiomux_setting apq8064_sdc3_card_det_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config apq8064_sdc3_configs[] __initdata = { - { - .gpio = 26, - .settings = { - [GPIOMUX_SUSPENDED] = &apq8064_sdc3_card_det_cfg, - [GPIOMUX_ACTIVE] = &apq8064_sdc3_card_det_cfg, - }, - }, -}; - -static struct gpiomux_setting gsbi6_uartdm_active = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi6_uartdm_suspended = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct msm_gpiomux_config mpq8064_uartdm_configs[] __initdata = { - { /* UARTDM_TX */ - .gpio = 14, - .settings = { - [GPIOMUX_ACTIVE] = &gsbi6_uartdm_active, - [GPIOMUX_SUSPENDED] = &gsbi6_uartdm_suspended, - }, - }, - { /* UARTDM_RX */ - .gpio = 15, - .settings = { - [GPIOMUX_ACTIVE] = &gsbi6_uartdm_active, - [GPIOMUX_SUSPENDED] = &gsbi6_uartdm_suspended, - }, - }, - { /* UARTDM_CTS */ - .gpio = 16, - .settings = { - [GPIOMUX_ACTIVE] = &gsbi6_uartdm_active, - [GPIOMUX_SUSPENDED] = &gsbi6_uartdm_suspended, - }, - }, - { /* UARTDM_RFR */ - .gpio = 17, - .settings = { - [GPIOMUX_ACTIVE] = &gsbi6_uartdm_active, - [GPIOMUX_SUSPENDED] = &gsbi6_uartdm_suspended, - }, - }, -}; - -static struct msm_gpiomux_config mpq8064_gsbi6_spi_configs[] __initdata = { - { - .gpio = 17, /* GSBI6_0 SPI CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_spi_cfg, - }, - }, - { - .gpio = 16, /* GSBI6_1 SPI CS */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_spi_cfg, - }, - }, - { - .gpio = 15, /* GSBI6_2 SPI MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_spi_cfg, - }, - }, - { - .gpio = 14, /* GSBI6_3 SPI_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_spi_cfg, - }, - }, -}; - -static struct msm_gpiomux_config mpq8064_gsbi5_uart_configs[] __initdata = { - { - .gpio = 51, /* GSBI5 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5_uart_cfg, - }, - }, - { - .gpio = 52, /* GSBI5 UART RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5_uart_cfg, - }, - }, -}; - -static struct gpiomux_setting boot_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config fsm8064_ep_boot_configs[] __initdata = { - { - .gpio = 2, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 3, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 4, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 5, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 33, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 34, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 39, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 50, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, - { - .gpio = 87, - .settings = { - [GPIOMUX_SUSPENDED] = &boot_cfg, - }, - }, -}; - -static struct gpiomux_setting fsm8064_ep_backup_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct msm_gpiomux_config fsm8064_ep_backup_configs[] __initdata = { - { - .gpio = 45, - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_backup_suspended_cfg, - }, - }, - { - .gpio = 46, - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_backup_suspended_cfg, - }, - }, - { - .gpio = 47, - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_backup_suspended_cfg, - }, - }, - { - .gpio = 62, - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_backup_suspended_cfg, - }, - }, - { - .gpio = 82, - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_backup_suspended_cfg, - }, - }, -}; - -static struct gpiomux_setting fsm8064_ep_uim_rst_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting fsm8064_ep_uim_pwr_sel_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_HIGH, -}; - -static struct msm_gpiomux_config fsm8064_ep_uim_configs[] __initdata = { - { - .gpio = 49, /* UIM_RST */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_uim_rst_cfg, - }, - }, - { - .gpio = 55, /* UIM_PWR_SEL */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_uim_pwr_sel_cfg, - }, - }, -}; - -static struct gpiomux_setting fsm8064_ep_sync_input_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config fsm8064_ep_sync_configs[] __initdata = { - { - .gpio = 6, /* GPSPPSIN_DRSYNC */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_sync_input_cfg, - }, - }, - { - .gpio = 7, /* KRAIT_PPS_INPUT */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_sync_input_cfg, - }, - }, - { - .gpio = 8, /* QDSP_PPS_INPUT */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_sync_input_cfg, - }, - }, - { - .gpio = 9, /* DAN_TTI_INPUT */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_sync_input_cfg, - }, - }, -}; - -static struct gpiomux_setting fsm8064_ep_led_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct msm_gpiomux_config fsm8064_ep_led_configs[] __initdata = { - { - .gpio = 58, /* RED1 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 59, /* GREEN1 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 60, /* RED2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 61, /* GREEN2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 69, /* RED3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 70, /* GREEN3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 71, /* RED4 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 72, /* GREEN4 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 77, /* RED5 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, - { - .gpio = 80, /* GREEN5 */ - .settings = { - [GPIOMUX_SUSPENDED] = &fsm8064_ep_led_cfg, - }, - }, -}; - -void __init apq8064_init_gpiomux(void) -{ - int rc; - int platform_version = socinfo_get_platform_version(); - - rc = msm_gpiomux_init(NR_GPIO_IRQS); - if (rc) { - pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc); - return; - } - if (!(machine_is_mpq8064_hrd())) - msm_gpiomux_install(wcnss_5wire_interface, - ARRAY_SIZE(wcnss_5wire_interface)); - - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) { - msm_gpiomux_install(mpq8064_gsbi5_i2c_configs, - ARRAY_SIZE(mpq8064_gsbi5_i2c_configs)); - msm_gpiomux_install(mpq8064_gsbi5_uart_configs, - ARRAY_SIZE(mpq8064_gsbi5_uart_configs)); -#ifdef CONFIG_MSM_VCAP - msm_gpiomux_install(vcap_configs, - ARRAY_SIZE(vcap_configs)); -#endif - msm_gpiomux_install(sx150x_int_configs, - ARRAY_SIZE(sx150x_int_configs)); - } else { - #if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) - msm_gpiomux_install(apq8064_ethernet_configs, - ARRAY_SIZE(apq8064_ethernet_configs)); - #endif - - if (machine_is_fsm8064_ep()) - msm_gpiomux_install(fsm8064_ep_gsbi_configs, - ARRAY_SIZE(fsm8064_ep_gsbi_configs)); - else - msm_gpiomux_install(apq8064_gsbi_configs, - ARRAY_SIZE(apq8064_gsbi_configs)); - - if (!(machine_is_apq8064_mtp() && - (SOCINFO_VERSION_MINOR(platform_version) == 1))) - msm_gpiomux_install(apq8064_non_mi2s_gsbi_configs, - ARRAY_SIZE(apq8064_non_mi2s_gsbi_configs)); - } - if (machine_is_apq8064_mtp() && - (SOCINFO_VERSION_MINOR(platform_version) == 1)) { - msm_gpiomux_install(apq8064_mic_i2s_configs, - ARRAY_SIZE(apq8064_mic_i2s_configs)); - msm_gpiomux_install(apq8064_spkr_i2s_configs, - ARRAY_SIZE(apq8064_spkr_i2s_configs)); - msm_gpiomux_install(apq8064_mi2s_configs, - ARRAY_SIZE(apq8064_mi2s_configs)); - msm_gpiomux_install(apq8064_gsbi1_i2c_2ma_configs, - ARRAY_SIZE(apq8064_gsbi1_i2c_2ma_configs)); - } else { - if (!machine_is_fsm8064_ep()) { - msm_gpiomux_install(apq8064_slimbus_config, - ARRAY_SIZE(apq8064_slimbus_config)); - } - } - - if (!(machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) && !machine_is_apq8064_mtp()) { - msm_gpiomux_install(apq8064_gsbi1_i2c_8ma_configs, - ARRAY_SIZE(apq8064_gsbi1_i2c_8ma_configs)); - } - - msm_gpiomux_install(apq8064_audio_codec_configs, - ARRAY_SIZE(apq8064_audio_codec_configs)); - - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) { - - msm_gpiomux_install(mpq8064_audio_auxpcm_configs, - ARRAY_SIZE(mpq8064_audio_auxpcm_configs)); - - msm_gpiomux_install(mpq8064_spkr_i2s_config, - ARRAY_SIZE(mpq8064_spkr_i2s_config)); - } - - pr_debug("%s(): audio-auxpcm: Include GPIO configs" - " as audio is not the primary user" - " for these GPIO Pins\n", __func__); - - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) - msm_gpiomux_install(mpq8064_mi2s_configs, - ARRAY_SIZE(mpq8064_mi2s_configs)); - - if (!machine_is_mpq8064_hrd() && !machine_is_fsm8064_ep()) - msm_gpiomux_install(apq8064_ext_regulator_configs, - ARRAY_SIZE(apq8064_ext_regulator_configs)); - - if (machine_is_apq8064_mtp()) { - if (SOCINFO_VERSION_MINOR(platform_version) == 1) - msm_gpiomux_install(mdm_i2s_configs, - ARRAY_SIZE(mdm_i2s_configs)); - else - msm_gpiomux_install(mdm_configs, - ARRAY_SIZE(mdm_configs)); - } - - if (machine_is_apq8064_mtp()) { - if (SOCINFO_VERSION_MINOR(platform_version) == 1) { - msm_gpiomux_install(cyts_gpio_alt_config, - ARRAY_SIZE(cyts_gpio_alt_config)); - } else { - msm_gpiomux_install(cyts_gpio_configs, - ARRAY_SIZE(cyts_gpio_configs)); - } - } - -#ifdef CONFIG_USB_EHCI_MSM_HSIC - if (machine_is_apq8064_mtp()) - msm_gpiomux_install(apq8064_hsic_configs, - ARRAY_SIZE(apq8064_hsic_configs)); -#endif - - if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid()) - msm_gpiomux_install(apq8064_mxt_configs, - ARRAY_SIZE(apq8064_mxt_configs)); - - if (!machine_is_fsm8064_ep()) - msm_gpiomux_install(apq8064_hdmi_configs, - ARRAY_SIZE(apq8064_hdmi_configs)); - - if (apq8064_mhl_display_enabled()) - msm_gpiomux_install(apq8064_mhl_configs, - ARRAY_SIZE(apq8064_mhl_configs)); - - if (machine_is_mpq8064_cdp()) { - msm_gpiomux_install(mpq8064_ir_configs, - ARRAY_SIZE(mpq8064_ir_configs)); - - msm_gpiomux_install(mpq8064_gsbi6_spi_configs, - ARRAY_SIZE(mpq8064_gsbi6_spi_configs)); - } - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - msm_gpiomux_install(apq8064_sdc2_configs, - ARRAY_SIZE(apq8064_sdc2_configs)); -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - msm_gpiomux_install(apq8064_sdc4_configs, - ARRAY_SIZE(apq8064_sdc4_configs)); -#endif - - if (!(machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv())) { - msm_gpiomux_install(apq8064_sdc3_configs, - ARRAY_SIZE(apq8064_sdc3_configs)); - } - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) - msm_gpiomux_install(mpq8064_uartdm_configs, - ARRAY_SIZE(mpq8064_uartdm_configs)); - - if (machine_is_fsm8064_ep()) { - msm_gpiomux_install(fsm8064_ep_boot_configs, - ARRAY_SIZE(fsm8064_ep_boot_configs)); - msm_gpiomux_install(fsm8064_ep_backup_configs, - ARRAY_SIZE(fsm8064_ep_backup_configs)); - msm_gpiomux_install(fsm8064_ep_uim_configs, - ARRAY_SIZE(fsm8064_ep_uim_configs)); - msm_gpiomux_install(fsm8064_ep_sync_configs, - ARRAY_SIZE(fsm8064_ep_sync_configs)); - msm_gpiomux_install(fsm8064_ep_led_configs, - ARRAY_SIZE(fsm8064_ep_led_configs)); - } -} diff --git a/arch/arm/mach-msm/board-8064-gpu.c b/arch/arm/mach-msm/board-8064-gpu.c deleted file mode 100644 index bb0a6ccb0a2a..000000000000 --- a/arch/arm/mach-msm/board-8064-gpu.c +++ /dev/null @@ -1,300 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-8064.h" - -#ifdef CONFIG_MSM_DCVS -static struct msm_dcvs_freq_entry grp3d_freq[] = { - {0, 900, 0, 0, 0}, - {0, 950, 0, 0, 0}, - {0, 950, 0, 0, 0}, - {0, 1200, 1, 100, 100}, -}; - -static struct msm_dcvs_core_info grp3d_core_info = { - .freq_tbl = &grp3d_freq[0], - .num_cores = 1, - .sensors = (int[]){0}, - .thermal_poll_ms = 60000, - .core_param = { - .core_type = MSM_DCVS_CORE_TYPE_GPU, - }, - .algo_param = { - .disable_pc_threshold = 0, - .em_win_size_min_us = 100000, - .em_win_size_max_us = 300000, - .em_max_util_pct = 97, - .group_id = 0, - .max_freq_chg_time_us = 100000, - .slack_mode_dynamic = 0, - .slack_time_min_us = 39000, - .slack_time_max_us = 39000, - .ss_win_size_min_us = 1000000, - .ss_win_size_max_us = 1000000, - .ss_util_pct = 95, - .ss_no_corr_below_freq = 0, - }, - - .energy_coeffs = { - .leakage_coeff_a = -17720, - .leakage_coeff_b = 37, - .leakage_coeff_c = 3329, - .leakage_coeff_d = -277, - - .active_coeff_a = 2492, - .active_coeff_b = 0, - .active_coeff_c = 0 - }, - - .power_param = { - .current_temp = 25, - .num_freq = ARRAY_SIZE(grp3d_freq), - } -}; -#endif /* CONFIG_MSM_DCVS */ - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors grp3d_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp3d_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2000), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2000), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_high_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, -}; - -static struct msm_bus_vectors grp3d_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(4264), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(4264), - }, -}; - -static struct msm_bus_paths grp3d_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp3d_init_vectors), - grp3d_init_vectors, - }, - { - ARRAY_SIZE(grp3d_low_vectors), - grp3d_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_low_vectors), - grp3d_nominal_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_high_vectors), - grp3d_nominal_high_vectors, - }, - { - ARRAY_SIZE(grp3d_max_vectors), - grp3d_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = { - grp3d_bus_scale_usecases, - ARRAY_SIZE(grp3d_bus_scale_usecases), - .name = "grp3d", -}; -#endif - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0x04300000, /* GFX3D address */ - .end = 0x0430ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_SHADER_MEMORY, - .start = 0x04310000, /* Shader Mem Address */ - .end = 0x0431ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = GFX3D_IRQ, - .end = GFX3D_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static const struct kgsl_iommu_ctx kgsl_3d0_iommu0_ctxs[] = { - { "gfx3d_user", 0 }, - { "gfx3d_priv", 1 }, -}; - -static const struct kgsl_iommu_ctx kgsl_3d0_iommu1_ctxs[] = { - { "gfx3d1_user", 0 }, - { "gfx3d1_priv", 1 }, -}; - -static struct kgsl_device_iommu_data kgsl_3d0_iommu_data[] = { - { - .iommu_ctxs = kgsl_3d0_iommu0_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu0_ctxs), - .physstart = 0x07C00000, - .physend = 0x07C00000 + SZ_1M - 1, - }, - { - .iommu_ctxs = kgsl_3d0_iommu1_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu1_ctxs), - .physstart = 0x07D00000, - .physend = 0x07D00000 + SZ_1M - 1, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 400000000, - .bus_freq = 4, - .io_fraction = 0, - }, - { - .gpu_freq = 320000000, - .bus_freq = 3, - .io_fraction = 33, - }, - { - .gpu_freq = 200000000, - .bus_freq = 2, - .io_fraction = 100, - }, - { - .gpu_freq = 128000000, - .bus_freq = 1, - .io_fraction = 100, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 1, - .num_levels = 5, - .set_grp_async = NULL, - .idle_timeout = HZ/10, - .strtstp_sleepwake = true, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp3d_bus_scale_pdata, -#endif - .iommu_data = kgsl_3d0_iommu_data, - .iommu_count = ARRAY_SIZE(kgsl_3d0_iommu_data), -#ifdef CONFIG_MSM_DCVS - .core_info = &grp3d_core_info, -#endif -}; - -struct platform_device device_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -void __init apq8064_init_gpu(void) -{ - unsigned int version = socinfo_get_version(); - - if (cpu_is_apq8064ab()) - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 450000000; - if (SOCINFO_VERSION_MAJOR(version) == 2) { - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 2, 0, 2); - } else { - /* The bootloader has started returning 1.2 for chips that - are either 1.1 or 1.2. To handle that and default any - future revisions to this path, check for minor version >=1 */ - if ((SOCINFO_VERSION_MAJOR(version) == 1) && - (SOCINFO_VERSION_MINOR(version) >= 1)) - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 2, 0, 1); - else - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 2, 0, 0); - } - - platform_device_register(&device_kgsl_3d0); -} diff --git a/arch/arm/mach-msm/board-8064-pmic.c b/arch/arm/mach-msm/board-8064-pmic.c deleted file mode 100644 index e5828ea1eaa9..000000000000 --- a/arch/arm/mach-msm/board-8064-pmic.c +++ /dev/null @@ -1,571 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8064.h" - -struct pm8xxx_gpio_init { - unsigned gpio; - struct pm_gpio config; -}; - -struct pm8xxx_mpp_init { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8921_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \ - _func, _inv, _disable) \ -{ \ - .gpio = PM8921_GPIO_PM_TO_SYS(_gpio), \ - .config = { \ - .direction = _dir, \ - .output_buffer = _buf, \ - .output_value = _val, \ - .pull = _pull, \ - .vin_sel = _vin, \ - .out_strength = _out_strength, \ - .function = _func, \ - .inv_int_pol = _inv, \ - .disable_pin = _disable, \ - } \ -} - -#define PM8921_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8921_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8821_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8821_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8921_GPIO_DISABLE(_gpio) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \ - 0, 0, 0, 1) - -#define PM8921_GPIO_OUTPUT(_gpio, _val, _strength) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_##_strength, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8921_GPIO_OUTPUT_BUFCONF(_gpio, _val, _strength, _bufconf) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT,\ - PM_GPIO_OUT_BUF_##_bufconf, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_##_strength, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8921_GPIO_INPUT(_gpio, _pull) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \ - _pull, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_NO, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8921_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_HIGH, \ - _func, 0, 0) - -#define PM8921_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \ - PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, _vin, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -/* Initial PM8921 GPIO configurations */ -static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = { - PM8921_GPIO_OUTPUT(14, 1, HIGH), /* HDMI Mux Selector */ - PM8921_GPIO_OUTPUT_BUFCONF(25, 0, LOW, CMOS), /* DISP_RESET_N */ - PM8921_GPIO_OUTPUT_FUNC(26, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */ - PM8921_GPIO_OUTPUT_VIN(30, 1, PM_GPIO_VIN_VPH), /* SMB349 susp line */ - PM8921_GPIO_OUTPUT_BUFCONF(36, 1, LOW, OPEN_DRAIN), - PM8921_GPIO_OUTPUT_FUNC(44, 0, PM_GPIO_FUNC_2), - PM8921_GPIO_OUTPUT(33, 0, HIGH), - PM8921_GPIO_OUTPUT(20, 0, HIGH), - PM8921_GPIO_INPUT(35, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(38, PM_GPIO_PULL_UP_30), - /* TABLA CODEC RESET */ - PM8921_GPIO_OUTPUT(34, 1, HIGH), - PM8921_GPIO_OUTPUT(13, 0, HIGH), /* PCIE_CLK_PWR_EN */ - PM8921_GPIO_INPUT(12, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */ -}; - -static struct pm8xxx_gpio_init pm8921_fsm8064_ep_gpios[] __initdata = { - PM8921_GPIO_OUTPUT_VIN(1, 1, PM_GPIO_VIN_VPH), /* 5V reg */ - PM8921_GPIO_OUTPUT_VIN(12, 1, PM_GPIO_VIN_VPH), /* 12V reg */ - /* De-assert CW_GPS_RST_N for CW GPS module to lock to GPS source */ - PM8921_GPIO_OUTPUT_VIN(14, 1, PM_GPIO_VIN_VPH), - /* PPS_SRC_SEL_N, chooses between WGR7640 PPS source (high) or - * CW GPS module PPS source (low) */ - PM8921_GPIO_OUTPUT_VIN(19, 0, PM_GPIO_VIN_VPH), /* PPS_SRC_SEL_N */ - - PM8921_GPIO_OUTPUT_VIN(13, 1, PM_GPIO_VIN_VPH), /* PCIE_CLK_PWR_EN */ - PM8921_GPIO_OUTPUT_VIN(37, 1, PM_GPIO_VIN_VPH), /* PCIE_RST_N */ - PM8921_GPIO_INPUT(11, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */ - - PM8921_GPIO_OUTPUT_VIN(23, 1, PM_GPIO_VIN_VPH), /* USB2_HSIC_RST_N */ - - PM8921_GPIO_OUTPUT_VIN(24, 1, PM_GPIO_VIN_VPH), /* USB3_RST_N */ - PM8921_GPIO_OUTPUT_VIN(34, 1, PM_GPIO_VIN_VPH), /* USB4_RST_N */ -}; - -static struct pm8xxx_gpio_init pm8921_mtp_kp_gpios[] __initdata = { - PM8921_GPIO_INPUT(3, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(4, PM_GPIO_PULL_UP_30), -}; - -static struct pm8xxx_gpio_init pm8921_cdp_kp_gpios[] __initdata = { - PM8921_GPIO_INPUT(27, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(42, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(17, PM_GPIO_PULL_UP_1P5), /* SD_WP */ -}; - -static struct pm8xxx_gpio_init pm8921_mpq8064_hrd_gpios[] __initdata = { - PM8921_GPIO_OUTPUT(37, 0, LOW), /* MUX1_SEL */ - PM8921_GPIO_INPUT(40, PM_GPIO_PULL_UP_30), /* irq for sx150 exp2 */ -}; - -static struct pm8xxx_gpio_init touchscreen_gpios[] __initdata = { - PM8921_GPIO_OUTPUT(23, 0, HIGH), /* touchscreen power FET */ -}; - -/* Initial PM8917 GPIO configurations */ -static struct pm8xxx_gpio_init pm8917_gpios[] __initdata = { - PM8921_GPIO_OUTPUT(14, 1, HIGH), /* HDMI Mux Selector */ - PM8921_GPIO_OUTPUT_BUFCONF(25, 0, LOW, CMOS), /* DISP_RESET_N */ - PM8921_GPIO_OUTPUT(26, 1, HIGH), /* Backlight: on */ - PM8921_GPIO_OUTPUT_BUFCONF(36, 1, LOW, OPEN_DRAIN), - PM8921_GPIO_OUTPUT_FUNC(38, 0, PM_GPIO_FUNC_2), - PM8921_GPIO_OUTPUT(33, 0, HIGH), - PM8921_GPIO_OUTPUT(20, 0, HIGH), - PM8921_GPIO_INPUT(35, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(30, PM_GPIO_PULL_UP_30), - /* TABLA CODEC RESET */ - PM8921_GPIO_OUTPUT(34, 1, MED), - PM8921_GPIO_OUTPUT(13, 0, HIGH), /* PCIE_CLK_PWR_EN */ - PM8921_GPIO_INPUT(12, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */ -}; - -/* PM8921 GPIO 42 remaps to PM8917 GPIO 8 */ -static struct pm8xxx_gpio_init pm8917_cdp_kp_gpios[] __initdata = { - PM8921_GPIO_INPUT(27, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(8, PM_GPIO_PULL_UP_30), - PM8921_GPIO_INPUT(17, PM_GPIO_PULL_UP_1P5), /* SD_WP */ -}; - -static struct pm8xxx_gpio_init pm8921_mpq_gpios[] __initdata = { - PM8921_GPIO_INIT(27, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, - PM_GPIO_PULL_NO, PM_GPIO_VIN_VPH, PM_GPIO_STRENGTH_NO, - PM_GPIO_FUNC_NORMAL, 0, 0), -}; - -/* Initial PM8XXX MPP configurations */ -static struct pm8xxx_mpp_init pm8xxx_mpps[] __initdata = { - PM8921_MPP_INIT(3, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_LOW), - /* External 5V regulator enable; shared by HDMI and USB_OTG switches. */ - PM8921_MPP_INIT(7, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_LOW), - PM8921_MPP_INIT(8, D_OUTPUT, PM8921_MPP_DIG_LEVEL_S4, DOUT_CTRL_LOW), - /*MPP9 is used to detect docking station connection/removal on Liquid*/ - PM8921_MPP_INIT(9, D_INPUT, PM8921_MPP_DIG_LEVEL_S4, DIN_TO_INT), - /* PCIE_RESET_N */ - PM8921_MPP_INIT(1, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_HIGH), -}; - - -void __init apq8064_configure_gpios(struct pm8xxx_gpio_init *data, int len) -{ - int i, rc; - - for (i = 0; i < len; i++) { - rc = pm8xxx_gpio_config(data[i].gpio, &data[i].config); - if (rc) - pr_err("%s: pm8xxx_gpio_config(%u) failed: rc=%d\n", - __func__, data[i].gpio, rc); - } -} - -void __init apq8064_pm8xxx_gpio_mpp_init(void) -{ - int i, rc; - - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) { - /* PCIE_CLK_PWR_EN is 23 and PCIE_WAKE_N is 22 - for MPQ8064 Hybrid */ - if (machine_is_mpq8064_hrd()) { - int size = ARRAY_SIZE(pm8921_gpios); - for (i = 0; i < size; i++) - if (pm8921_gpios[i].gpio == 13) - pm8921_gpios[i].gpio = 23; - else if (pm8921_gpios[i].gpio == 12) - pm8921_gpios[i].gpio = 22; - } - - if (machine_is_fsm8064_ep()) - apq8064_configure_gpios(pm8921_fsm8064_ep_gpios, - ARRAY_SIZE(pm8921_fsm8064_ep_gpios)); - else - apq8064_configure_gpios(pm8921_gpios, - ARRAY_SIZE(pm8921_gpios)); - } else { - apq8064_configure_gpios(pm8917_gpios, ARRAY_SIZE(pm8917_gpios)); - } - - if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid()) { - apq8064_configure_gpios(touchscreen_gpios, - ARRAY_SIZE(touchscreen_gpios)); - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) - apq8064_configure_gpios(pm8921_cdp_kp_gpios, - ARRAY_SIZE(pm8921_cdp_kp_gpios)); - else - apq8064_configure_gpios(pm8917_cdp_kp_gpios, - ARRAY_SIZE(pm8917_cdp_kp_gpios)); - } - - if (machine_is_apq8064_mtp()) - apq8064_configure_gpios(pm8921_mtp_kp_gpios, - ARRAY_SIZE(pm8921_mtp_kp_gpios)); - - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() - || machine_is_mpq8064_dtv()) - apq8064_configure_gpios(pm8921_mpq_gpios, - ARRAY_SIZE(pm8921_mpq_gpios)); - - if (machine_is_mpq8064_hrd()) - apq8064_configure_gpios(pm8921_mpq8064_hrd_gpios, - ARRAY_SIZE(pm8921_mpq8064_hrd_gpios)); - - for (i = 0; i < ARRAY_SIZE(pm8xxx_mpps); i++) { - rc = pm8xxx_mpp_config(pm8xxx_mpps[i].mpp, - &pm8xxx_mpps[i].config); - if (rc) { - pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc); - break; - } - } -} - -static struct pm8xxx_pwrkey_platform_data apq8064_pm8921_pwrkey_pdata = { - .pull_up = 1, - .kpd_trigger_delay_us = 15625, - .wakeup = 1, -}; - -static struct pm8xxx_misc_platform_data apq8064_pm8921_misc_pdata = { - .priority = 0, -}; - -#define PM8921_LC_LED_MAX_CURRENT 12 /* I = 12mA */ -#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */ -#define PM8XXX_LED_PWM_PERIOD 1000 -#define PM8XXX_LED_PWM_DUTY_MS 20 -/** - * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be - * driven using PWM feature. - */ -#define PM8XXX_PWM_CHANNEL_NONE -1 - -static struct led_info pm8921_led_info[] = { - [0] = { - .name = "led:red", - .default_trigger = "ac-online", - }, -}; - -static struct led_platform_data pm8921_led_core_pdata = { - .num_leds = ARRAY_SIZE(pm8921_led_info), - .leds = pm8921_led_info, -}; - -static int pm8921_led0_pwm_duty_pcts[56] = { - 1, 4, 8, 12, 16, 20, 24, 28, 32, 36, - 40, 44, 46, 52, 56, 60, 64, 68, 72, 76, - 80, 84, 88, 92, 96, 100, 100, 100, 98, 95, - 92, 88, 84, 82, 78, 74, 70, 66, 62, 58, - 58, 54, 50, 48, 42, 38, 34, 30, 26, 22, - 14, 10, 6, 4, 1 -}; - -/* - * Note: There is a bug in LPG module that results in incorrect - * behavior of pattern when LUT index 0 is used. So effectively - * there are 63 usable LUT entries. - */ -static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = { - .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts, - .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts), - .duty_ms = PM8XXX_LED_PWM_DUTY_MS, - .start_idx = 1, -}; - -static struct pm8xxx_led_config pm8921_led_configs[] = { - [0] = { - .id = PM8XXX_ID_LED_0, - .mode = PM8XXX_LED_MODE_PWM2, - .max_current = PM8921_LC_LED_MAX_CURRENT, - .pwm_channel = 5, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles, - }, -}; - -static struct pm8xxx_led_platform_data apq8064_pm8921_leds_pdata = { - .led_core = &pm8921_led_core_pdata, - .configs = pm8921_led_configs, - .num_configs = ARRAY_SIZE(pm8921_led_configs), -}; - -static struct pm8xxx_adc_amux apq8064_pm8921_adc_channels_data[] = { - {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM}, - {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM}, - {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0, - ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM}, -}; - -static struct pm8xxx_adc_properties apq8064_pm8921_adc_data = { - .adc_vdd_reference = 1800, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, -}; - -static struct pm8xxx_adc_platform_data apq8064_pm8921_adc_pdata = { - .adc_channel = apq8064_pm8921_adc_channels_data, - .adc_num_board_channel = ARRAY_SIZE(apq8064_pm8921_adc_channels_data), - .adc_prop = &apq8064_pm8921_adc_data, - .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_mpp_platform_data -apq8064_pm8921_mpp_pdata = { - .mpp_base = PM8921_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_gpio_platform_data -apq8064_pm8921_gpio_pdata = { - .gpio_base = PM8921_GPIO_PM_TO_SYS(1), -}; - -static struct pm8xxx_irq_platform_data -apq8064_pm8921_irq_pdata = { - .irq_base = PM8921_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(74), - .irq_trigger_flag = IRQF_TRIGGER_LOW, - .dev_id = 0, -}; - -static struct pm8xxx_rtc_platform_data -apq8064_pm8921_rtc_pdata = { - .rtc_write_enable = false, - .rtc_alarm_powerup = false, -}; - -static int apq8064_pm8921_therm_mitigation[] = { - 1100, - 700, - 600, - 325, -}; - -#define MAX_VOLTAGE_MV 4200 -#define CHG_TERM_MA 100 -static struct pm8921_charger_platform_data -apq8064_pm8921_chg_pdata = { - .update_time = 60000, - .max_voltage = MAX_VOLTAGE_MV, - .min_voltage = 3200, - .uvd_thresh_voltage = 4050, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .resume_voltage_delta = 60, - .resume_charge_percent = 99, - .term_current = CHG_TERM_MA, - .cool_temp = 10, - .warm_temp = 45, - .temp_check_period = 1, - .max_bat_chg_current = 1100, - .cool_bat_chg_current = 350, - .warm_bat_chg_current = 350, - .cool_bat_voltage = 4100, - .warm_bat_voltage = 4100, - .thermal_mitigation = apq8064_pm8921_therm_mitigation, - .thermal_levels = ARRAY_SIZE(apq8064_pm8921_therm_mitigation), - .rconn_mohm = 18, - .enable_tcxo_warmup_delay = true, -}; - -static struct pm8xxx_ccadc_platform_data -apq8064_pm8xxx_ccadc_pdata = { - .r_sense_uohm = 10000, - .calib_delay_ms = 600000, -}; - -static struct pm8921_bms_platform_data -apq8064_pm8921_bms_pdata = { - .battery_type = BATT_UNKNOWN, - .r_sense_uohm = 10000, - .v_cutoff = 3400, - .max_voltage_uv = MAX_VOLTAGE_MV * 1000, - .rconn_mohm = 18, - .shutdown_soc_valid_limit = 20, - .adjust_soc_low_threshold = 25, - .chg_term_ua = CHG_TERM_MA * 1000, - .normal_voltage_calc_ms = 20000, - .low_voltage_calc_ms = 1000, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .high_ocv_correction_limit_uv = 50, - .low_ocv_correction_limit_uv = 100, - .hold_soc_est = 3, - .enable_fcc_learning = 1, - .min_fcc_learning_soc = 20, - .min_fcc_ocv_pc = 30, - .min_fcc_learning_samples = 5, -}; - -static struct pm8921_platform_data -apq8064_pm8921_platform_data = { - .irq_pdata = &apq8064_pm8921_irq_pdata, - .gpio_pdata = &apq8064_pm8921_gpio_pdata, - .mpp_pdata = &apq8064_pm8921_mpp_pdata, - .rtc_pdata = &apq8064_pm8921_rtc_pdata, - .pwrkey_pdata = &apq8064_pm8921_pwrkey_pdata, - .misc_pdata = &apq8064_pm8921_misc_pdata, - .leds_pdata = &apq8064_pm8921_leds_pdata, - .adc_pdata = &apq8064_pm8921_adc_pdata, - .charger_pdata = &apq8064_pm8921_chg_pdata, - .bms_pdata = &apq8064_pm8921_bms_pdata, - .ccadc_pdata = &apq8064_pm8xxx_ccadc_pdata, -}; - -static struct pm8xxx_irq_platform_data -apq8064_pm8821_irq_pdata = { - .irq_base = PM8821_IRQ_BASE, - .devirq = PM8821_SEC_IRQ_N, - .irq_trigger_flag = IRQF_TRIGGER_HIGH, - .dev_id = 1, -}; - -static struct pm8xxx_mpp_platform_data -apq8064_pm8821_mpp_pdata = { - .mpp_base = PM8821_MPP_PM_TO_SYS(1), -}; - -static struct pm8821_platform_data -apq8064_pm8821_platform_data = { - .irq_pdata = &apq8064_pm8821_irq_pdata, - .mpp_pdata = &apq8064_pm8821_mpp_pdata, -}; - -static struct msm_ssbi_platform_data apq8064_ssbi_pm8921_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8921-core", - .platform_data = &apq8064_pm8921_platform_data, - }, -}; - -static struct msm_ssbi_platform_data apq8064_ssbi_pm8821_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8821-core", - .platform_data = &apq8064_pm8821_platform_data, - }, -}; - -void __init apq8064_init_pmic(void) -{ - pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ; - - apq8064_device_ssbi_pmic1.dev.platform_data = - &apq8064_ssbi_pm8921_pdata; - apq8064_device_ssbi_pmic2.dev.platform_data = - &apq8064_ssbi_pm8821_pdata; - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) { - apq8064_pm8921_platform_data.regulator_pdatas - = msm8064_pm8921_regulator_pdata; - apq8064_pm8921_platform_data.num_regulators - = msm8064_pm8921_regulator_pdata_len; - } else { - apq8064_pm8921_platform_data.regulator_pdatas - = msm8064_pm8917_regulator_pdata; - apq8064_pm8921_platform_data.num_regulators - = msm8064_pm8917_regulator_pdata_len; - } - - if (machine_is_apq8064_mtp()) { - apq8064_pm8921_bms_pdata.battery_type = BATT_PALLADIUM; - } else if (machine_is_apq8064_liquid()) { - apq8064_pm8921_bms_pdata.battery_type = BATT_DESAY; - } else if (machine_is_apq8064_cdp()) { - apq8064_pm8921_chg_pdata.has_dc_supply = true; - } - - if (!machine_is_apq8064_mtp() && !machine_is_apq8064_liquid()) - apq8064_pm8921_chg_pdata.battery_less_hardware = 1; - - if (machine_is_mpq8064_hrd()) - apq8064_pm8921_chg_pdata.disable_chg_rmvl_wrkarnd = 1; -} diff --git a/arch/arm/mach-msm/board-8064-regulator.c b/arch/arm/mach-msm/board-8064-regulator.c deleted file mode 100644 index 453095cfe57b..000000000000 --- a/arch/arm/mach-msm/board-8064-regulator.c +++ /dev/null @@ -1,814 +0,0 @@ -/* - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -#include "board-8064.h" - -#define VREG_CONSUMERS(_id) \ - static struct regulator_consumer_supply vreg_consumers_##_id[] - -/* Regulators that are present when using either PM8921 or PM8917 */ -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -VREG_CONSUMERS(L1) = { - REGULATOR_SUPPLY("8921_l1", NULL), -}; -VREG_CONSUMERS(L2) = { - REGULATOR_SUPPLY("8921_l2", NULL), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.1"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.2"), - REGULATOR_SUPPLY("lvds_pll_vdda", "lvds.0"), - REGULATOR_SUPPLY("dsi1_pll_vdda", "mipi_dsi.1"), - REGULATOR_SUPPLY("HRD_VDDD_CDC_D", "tabla2x-slim"), - REGULATOR_SUPPLY("HRD_CDC_VDDA_A_1P2V", "tabla2x-slim"), - REGULATOR_SUPPLY("dsi_pll_vdda", "mdp.0"), -}; -VREG_CONSUMERS(L3) = { - REGULATOR_SUPPLY("8921_l3", NULL), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_ehci_host.0"), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_ehci_host.1"), -}; -VREG_CONSUMERS(L4) = { - REGULATOR_SUPPLY("8921_l4", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"), - REGULATOR_SUPPLY("iris_vddxo", "wcnss_wlan.0"), - REGULATOR_SUPPLY("bha_vddxo", "bt_power"), -}; -VREG_CONSUMERS(L5) = { - REGULATOR_SUPPLY("8921_l5", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.1"), -}; -VREG_CONSUMERS(L6) = { - REGULATOR_SUPPLY("8921_l6", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L7) = { - REGULATOR_SUPPLY("8921_l7", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L8) = { - REGULATOR_SUPPLY("8921_l8", NULL), - REGULATOR_SUPPLY("cam_vana", "4-001a"), - REGULATOR_SUPPLY("cam_vana", "4-0010"), - REGULATOR_SUPPLY("cam_vana", "4-0048"), - REGULATOR_SUPPLY("cam_vana", "4-006c"), - REGULATOR_SUPPLY("cam_vana", "4-0034"), - REGULATOR_SUPPLY("cam_vana", "4-0020"), -}; -VREG_CONSUMERS(L9) = { - REGULATOR_SUPPLY("8921_l9", NULL), - REGULATOR_SUPPLY("vdd", "3-0024"), -}; -VREG_CONSUMERS(L10) = { - REGULATOR_SUPPLY("8921_l10", NULL), - REGULATOR_SUPPLY("iris_vddpa", "wcnss_wlan.0"), - REGULATOR_SUPPLY("bha_vddpa", "bt_power"), -}; -VREG_CONSUMERS(L11) = { - REGULATOR_SUPPLY("8921_l11", NULL), - REGULATOR_SUPPLY("dsi1_avdd", "mipi_dsi.1"), -}; -VREG_CONSUMERS(L12) = { - REGULATOR_SUPPLY("cam_vdig", "4-001a"), - REGULATOR_SUPPLY("cam_vdig", "4-0010"), - REGULATOR_SUPPLY("cam_vdig", "4-0048"), - REGULATOR_SUPPLY("cam_vdig", "4-006c"), - REGULATOR_SUPPLY("cam_vdig", "4-0034"), - REGULATOR_SUPPLY("cam_vdig", "4-0020"), - REGULATOR_SUPPLY("8921_l12", NULL), -}; -VREG_CONSUMERS(L13) = { - REGULATOR_SUPPLY("8921_l13", NULL), -}; -VREG_CONSUMERS(L14) = { - REGULATOR_SUPPLY("8921_l14", NULL), - REGULATOR_SUPPLY("vreg_xoadc", "pm8921-charger"), -}; -VREG_CONSUMERS(L15) = { - REGULATOR_SUPPLY("8921_l15", NULL), -}; -VREG_CONSUMERS(L16) = { - REGULATOR_SUPPLY("8921_l16", NULL), - REGULATOR_SUPPLY("cam_vaf", "4-001a"), - REGULATOR_SUPPLY("cam_vaf", "4-0010"), - REGULATOR_SUPPLY("cam_vaf", "4-0048"), - REGULATOR_SUPPLY("cam_vaf", "4-006c"), - REGULATOR_SUPPLY("cam_vaf", "4-0034"), - REGULATOR_SUPPLY("cam_vaf", "4-0020"), -}; -VREG_CONSUMERS(L17) = { - REGULATOR_SUPPLY("8921_l17", NULL), -}; -VREG_CONSUMERS(L18) = { - REGULATOR_SUPPLY("8921_l18", NULL), -}; -VREG_CONSUMERS(L21) = { - REGULATOR_SUPPLY("8921_l21", NULL), -}; -VREG_CONSUMERS(L22) = { - REGULATOR_SUPPLY("8921_l22", NULL), -}; -VREG_CONSUMERS(L23) = { - REGULATOR_SUPPLY("8921_l23", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_ehci_host.0"), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_ehci_host.1"), -}; -VREG_CONSUMERS(L24) = { - REGULATOR_SUPPLY("8921_l24", NULL), - REGULATOR_SUPPLY("riva_vddmx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L25) = { - REGULATOR_SUPPLY("8921_l25", NULL), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "0-000d"), -}; -VREG_CONSUMERS(L26) = { - REGULATOR_SUPPLY("8921_l26", NULL), - REGULATOR_SUPPLY("core_vdd", "pil-q6v4-lpass"), -}; -VREG_CONSUMERS(L27) = { - REGULATOR_SUPPLY("8921_l27", NULL), -}; -VREG_CONSUMERS(L28) = { - REGULATOR_SUPPLY("8921_l28", NULL), -}; -VREG_CONSUMERS(L29) = { - REGULATOR_SUPPLY("8921_l29", NULL), -}; -VREG_CONSUMERS(S2) = { - REGULATOR_SUPPLY("8921_s2", NULL), - REGULATOR_SUPPLY("iris_vddrfa", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(S3) = { - REGULATOR_SUPPLY("8921_s3", NULL), - REGULATOR_SUPPLY("HSUSB_VDDCX", "msm_otg"), - REGULATOR_SUPPLY("HSUSB_VDDCX", "msm_ehci_host.0"), - REGULATOR_SUPPLY("HSUSB_VDDCX", "msm_ehci_host.1"), - REGULATOR_SUPPLY("HSIC_VDDCX", "msm_hsic_host"), - REGULATOR_SUPPLY("riva_vddcx", "wcnss_wlan.0"), - REGULATOR_SUPPLY("vp_pcie", "msm_pcie"), - REGULATOR_SUPPLY("vptx_pcie", "msm_pcie"), -}; -VREG_CONSUMERS(S4) = { - REGULATOR_SUPPLY("8921_s4", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.1"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "0-000d"), - REGULATOR_SUPPLY("CDC_VDD_CP", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "0-000d"), - REGULATOR_SUPPLY("riva_vddpx", "wcnss_wlan.0"), - REGULATOR_SUPPLY("bha_vddpx", "bt_power"), - REGULATOR_SUPPLY("vcc_i2c", "3-005b"), - REGULATOR_SUPPLY("vcc_i2c", "3-0024"), - REGULATOR_SUPPLY("vddp", "0-0048"), - REGULATOR_SUPPLY("hdmi_lvl_tsl", "hdmi_msm.0"), - REGULATOR_SUPPLY("vdd-io", "spi0.2"), - REGULATOR_SUPPLY("sata_pmp_pwr", "msm_sata.0"), -}; -VREG_CONSUMERS(S5) = { - REGULATOR_SUPPLY("8921_s5", NULL), - REGULATOR_SUPPLY("krait0", "acpuclk-8064"), -}; -VREG_CONSUMERS(S6) = { - REGULATOR_SUPPLY("8921_s6", NULL), - REGULATOR_SUPPLY("krait1", "acpuclk-8064"), -}; -VREG_CONSUMERS(S7) = { - REGULATOR_SUPPLY("8921_s7", NULL), -}; -VREG_CONSUMERS(S8) = { - REGULATOR_SUPPLY("8921_s8", NULL), -}; -VREG_CONSUMERS(LVS1) = { - REGULATOR_SUPPLY("8921_lvs1", NULL), - REGULATOR_SUPPLY("iris_vddio", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(LVS3) = { - REGULATOR_SUPPLY("8921_lvs3", NULL), -}; -VREG_CONSUMERS(LVS4) = { - REGULATOR_SUPPLY("8921_lvs4", NULL), -}; -VREG_CONSUMERS(LVS5) = { - REGULATOR_SUPPLY("8921_lvs5", NULL), - REGULATOR_SUPPLY("cam_vio", "4-001a"), - REGULATOR_SUPPLY("cam_vio", "4-0010"), - REGULATOR_SUPPLY("cam_vio", "4-0048"), - REGULATOR_SUPPLY("cam_vio", "4-006c"), - REGULATOR_SUPPLY("cam_vio", "4-0034"), - REGULATOR_SUPPLY("cam_vio", "4-0020"), -}; -VREG_CONSUMERS(LVS6) = { - REGULATOR_SUPPLY("8921_lvs6", NULL), - REGULATOR_SUPPLY("vdd_pcie_vph", "msm_pcie"), -}; -VREG_CONSUMERS(LVS7) = { - REGULATOR_SUPPLY("8921_lvs7", NULL), - REGULATOR_SUPPLY("pll_vdd", "pil_riva"), - REGULATOR_SUPPLY("lvds_vdda", "lvds.0"), - REGULATOR_SUPPLY("dsi1_vddio", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vddio", "mdp.0"), - REGULATOR_SUPPLY("hdmi_vdda", "hdmi_msm.0"), -}; -VREG_CONSUMERS(USB_OTG) = { - REGULATOR_SUPPLY("8921_usb_otg", NULL), - REGULATOR_SUPPLY("vbus_otg", "msm_otg"), -}; -VREG_CONSUMERS(8821_S0) = { - REGULATOR_SUPPLY("8821_s0", NULL), - REGULATOR_SUPPLY("krait2", "acpuclk-8064"), -}; -VREG_CONSUMERS(8821_S1) = { - REGULATOR_SUPPLY("8821_s1", NULL), - REGULATOR_SUPPLY("krait3", "acpuclk-8064"), -}; -VREG_CONSUMERS(EXT_MPP8) = { - REGULATOR_SUPPLY("ext_mpp8", NULL), - REGULATOR_SUPPLY("vbus", "msm_ehci_host.1"), -}; -VREG_CONSUMERS(EXT_3P3V) = { - REGULATOR_SUPPLY("ext_3p3v", NULL), - REGULATOR_SUPPLY("vdd-phy", "spi0.2"), - REGULATOR_SUPPLY("mhl_usb_hs_switch", "msm_otg"), - REGULATOR_SUPPLY("lvds_vccs_3p3v", "lvds.0"), - REGULATOR_SUPPLY("dsi1_vccs_3p3v", "mipi_dsi.1"), - REGULATOR_SUPPLY("hdmi_mux_vdd", "hdmi_msm.0"), - REGULATOR_SUPPLY("pcie_ext_3p3v", "msm_pcie"), -}; -VREG_CONSUMERS(EXT_TS_SW) = { - REGULATOR_SUPPLY("ext_ts_sw", NULL), - REGULATOR_SUPPLY("vdd_ana", "3-005b"), -}; -VREG_CONSUMERS(EXT_SATA_PWR) = { - REGULATOR_SUPPLY("ext_sata_pwr", NULL), - REGULATOR_SUPPLY("sata_ext_3p3v", "msm_sata.0"), -}; -VREG_CONSUMERS(AVC_1P2V) = { - REGULATOR_SUPPLY("avc_1p2v", NULL), -}; -VREG_CONSUMERS(AVC_1P8V) = { - REGULATOR_SUPPLY("avc_1p8v", NULL), -}; -VREG_CONSUMERS(AVC_2P2V) = { - REGULATOR_SUPPLY("avc_2p2v", NULL), -}; -VREG_CONSUMERS(AVC_5V) = { - REGULATOR_SUPPLY("avc_5v", NULL), -}; -VREG_CONSUMERS(AVC_3P3V) = { - REGULATOR_SUPPLY("avc_3p3v", NULL), -}; - -/* Regulators that are only present when using PM8921 */ -VREG_CONSUMERS(S1) = { - REGULATOR_SUPPLY("8921_s1", NULL), -}; -VREG_CONSUMERS(LVS2) = { - REGULATOR_SUPPLY("8921_lvs2", NULL), - REGULATOR_SUPPLY("iris_vdddig", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(HDMI_MVS) = { - REGULATOR_SUPPLY("8921_hdmi_mvs", NULL), - REGULATOR_SUPPLY("hdmi_mvs", "hdmi_msm.0"), -}; -VREG_CONSUMERS(NCP) = { - REGULATOR_SUPPLY("8921_ncp", NULL), -}; -VREG_CONSUMERS(EXT_5V) = { - REGULATOR_SUPPLY("ext_5v", NULL), - REGULATOR_SUPPLY("vbus", "msm_ehci_host.0"), -}; - -/* Regulators that are only present when using PM8917 */ -VREG_CONSUMERS(8917_S1) = { - REGULATOR_SUPPLY("8921_s1", NULL), - REGULATOR_SUPPLY("iris_vdddig", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L30) = { - REGULATOR_SUPPLY("8917_l30", NULL), -}; -VREG_CONSUMERS(L31) = { - REGULATOR_SUPPLY("8917_l31", NULL), -}; -VREG_CONSUMERS(L32) = { - REGULATOR_SUPPLY("8917_l32", NULL), -}; -VREG_CONSUMERS(L33) = { - REGULATOR_SUPPLY("8917_l33", NULL), -}; -VREG_CONSUMERS(L34) = { - REGULATOR_SUPPLY("8917_l34", NULL), -}; -VREG_CONSUMERS(L35) = { - REGULATOR_SUPPLY("8917_l35", NULL), -}; -VREG_CONSUMERS(L36) = { - REGULATOR_SUPPLY("8917_l36", NULL), -}; -VREG_CONSUMERS(BOOST) = { - REGULATOR_SUPPLY("8917_boost", NULL), - REGULATOR_SUPPLY("ext_ddr3", NULL), - REGULATOR_SUPPLY("vbus", "msm_ehci_host.0"), - REGULATOR_SUPPLY("hdmi_mvs", "hdmi_msm.0"), -}; - -#define PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, _modes, _ops, \ - _apply_uV, _pull_down, _always_on, _supply_regulator, \ - _system_uA, _enable_time, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pull_down_enable = _pull_down, \ - .system_uA = _system_uA, \ - .enable_time = _enable_time, \ - } - -#define PM8XXX_LDO(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_NLDO1200(_id, _name, _always_on, _pull_down, _min_uV, \ - _max_uV, _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_SMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_FTSMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS \ - | REGULATOR_CHANGE_MODE, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_VS(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_VS300(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_NCP(_id, _name, _always_on, _min_uV, _max_uV, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, 0, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, 0, \ - _always_on, _supply_regulator, 0, _enable_time, _reg_id) - -#define PM8XXX_BOOST(_id, _name, _always_on, _min_uV, _max_uV, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, 0, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, 0, \ - _always_on, _supply_regulator, 0, _enable_time, _reg_id) - -/* Pin control initialization */ -#define PM8XXX_PC(_id, _name, _always_on, _pin_fn, _pin_ctrl, \ - _supply_regulator, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pin_fn = PM8XXX_VREG_PIN_FN_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define GPIO_VREG(_id, _reg_name, _gpio_label, _gpio, _supply_regulator, \ - _active_low) \ - [GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .regulator_name = _reg_name, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - .active_low = _active_low, \ - } - -#define FIXED_VREG_INIT(_id, _supply_regulator) \ - { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - } - -#define SAW_VREG_INIT(_id, _name, _min_uV, _max_uV) \ - { \ - .constraints = { \ - .name = _name, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - }, \ - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - } - -#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \ - _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \ - _force_mode, _sleep_set_force_mode, _power_mode, _state, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .power_mode = _power_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - .system_uA = _system_uA, \ - } - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _init_peak_uA) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _freq, _force_mode, \ - _sleep_set_force_mode) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _system_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_##_force_mode, \ - RPM_VREG_FORCE_MODE_8960_##_sleep_set_force_mode, \ - RPM_VREG_POWER_MODE_8960_PWM, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \ - RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_NCP(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _freq) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 1000, 1000, 0, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -/* Pin control initialization */ -#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8921_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_8960_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -/* GPIO regulator constraints */ -struct gpio_regulator_platform_data -apq8064_gpio_regulator_pdata[] = { - /* ID vreg_name gpio_label gpio supply active_low */ - GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en", - PM8921_MPP_PM_TO_SYS(7), NULL, 0), - GPIO_VREG(EXT_3P3V, "ext_3p3v", "ext_3p3v_en", - APQ8064_EXT_3P3V_REG_EN_GPIO, NULL, 0), - GPIO_VREG(EXT_TS_SW, "ext_ts_sw", "ext_ts_sw_en", - PM8921_GPIO_PM_TO_SYS(23), "ext_3p3v", 0), - GPIO_VREG(EXT_MPP8, "ext_mpp8", "ext_mpp8_en", - PM8921_MPP_PM_TO_SYS(8), NULL, 0), - GPIO_VREG(EXT_SATA_PWR, "ext_sata_pwr", "ext_sata_pwr_en", - PM8921_MPP_PM_TO_SYS(4), "ext_3p3v", 1), -}; - -struct gpio_regulator_platform_data -mpq8064_gpio_regulator_pdata[] = { - GPIO_VREG(AVC_1P2V, "avc_1p2v", "avc_1p2v_en", - SX150X_GPIO(4, 2), NULL, 0), - GPIO_VREG(AVC_1P8V, "avc_1p8v", "avc_1p8v_en", - SX150X_GPIO(4, 4), NULL, 0), - GPIO_VREG(AVC_2P2V, "avc_2p2v", "avc_2p2v_en", - SX150X_GPIO(4, 14), NULL, 0), - GPIO_VREG(AVC_5V, "avc_5v", "avc_5v_en", SX150X_GPIO(4, 3), NULL, 0), - GPIO_VREG(AVC_3P3V, "avc_3p3v", "avc_3p3v_en", - SX150X_GPIO(4, 15), "avc_5v", 0), -}; - -/* Fixed regulator constraints */ -static struct regulator_init_data mpq8064_3p3_regulator_init = - /* ID supply */ - FIXED_VREG_INIT(EXT_3P3V, NULL); - -struct fixed_voltage_config mpq8064_3p3_regulator_pdata = { - .supply_name = "ext_3p3v", - .gpio = -EINVAL, - .init_data = &mpq8064_3p3_regulator_init, -}; - -/* SAW regulator constraints */ -struct regulator_init_data msm8064_saw_regulator_pdata_8921_s5 = - /* ID vreg_name min_uV max_uV */ - SAW_VREG_INIT(S5, "8921_s5", 850000, 1300000); -struct regulator_init_data msm8064_saw_regulator_pdata_8921_s6 = - SAW_VREG_INIT(S6, "8921_s6", 850000, 1300000); - -struct regulator_init_data msm8064_saw_regulator_pdata_8821_s0 = - /* ID vreg_name min_uV max_uV */ - SAW_VREG_INIT(8821_S0, "8821_s0", 850000, 1300000); -struct regulator_init_data msm8064_saw_regulator_pdata_8821_s1 = - SAW_VREG_INIT(8821_S1, "8821_s1", 850000, 1300000); - -/* PM8921 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm8064_pm8921_regulator_pdata[] = { - /* - * ID name always_on pd min_uV max_uV en_t supply - * system_uA reg_ID - */ - PM8XXX_NLDO1200(L26, "8921_l26", 0, 1, 375000, 1050000, 200, "8921_s7", - 0, 1), - - /* ID name always_on pd en_t supply reg_ID */ - PM8XXX_VS300(USB_OTG, "8921_usb_otg", 0, 0, 0, "ext_5v", 2), - PM8XXX_VS300(HDMI_MVS, "8921_hdmi_mvs", 0, 1, 0, "ext_5v", 3), -}; - -/* PM8917 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm8064_pm8917_regulator_pdata[] = { - /* - * ID name always_on pd min_uV max_uV en_t supply - * system_uA reg_ID - */ - PM8XXX_NLDO1200(L26, "8921_l26", 0, 1, 375000, 1050000, 200, "8921_s7", - 0, 1), - PM8XXX_LDO(L30, "8917_l30", 0, 1, 1800000, 1800000, 200, NULL, - 0, 2), - PM8XXX_LDO(L31, "8917_l31", 0, 1, 1800000, 1800000, 200, NULL, - 0, 3), - PM8XXX_LDO(L32, "8917_l32", 0, 1, 2800000, 2800000, 200, NULL, - 0, 4), - PM8XXX_LDO(L33, "8917_l33", 0, 1, 2800000, 2800000, 200, NULL, - 0, 5), - PM8XXX_LDO(L34, "8917_l34", 0, 1, 1800000, 1800000, 200, NULL, - 0, 6), - PM8XXX_LDO(L35, "8917_l35", 0, 1, 3000000, 3000000, 200, NULL, - 0, 7), - PM8XXX_LDO(L36, "8917_l36", 0, 1, 1800000, 1800000, 200, NULL, - 0, 8), - - /* - * ID name always_on min_uV max_uV en_t supply reg_ID - */ - PM8XXX_BOOST(BOOST, "8917_boost", 0, 5000000, 5000000, 500, NULL, 9), - - /* ID name always_on pd en_t supply reg_ID */ - PM8XXX_VS300(USB_OTG, "8921_usb_otg", 0, 1, 0, "8917_boost", 10), -}; - -static struct rpm_regulator_init_data -apq8064_rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV supply sys_uA freq fm ss_fm */ - RPM_SMPS(S1, 1, 1, 0, 1225000, 1225000, NULL, 100000, 3p20, NONE, NONE), - RPM_SMPS(S2, 0, 1, 0, 1300000, 1300000, NULL, 0, 1p60, NONE, NONE), - RPM_SMPS(S3, 0, 1, 1, 500000, 1150000, NULL, 100000, 4p80, NONE, NONE), - RPM_SMPS(S4, 1, 1, 0, 1800000, 1800000, NULL, 100000, 1p60, AUTO, AUTO), - RPM_SMPS(S7, 0, 0, 0, 1300000, 1300000, NULL, 100000, 3p20, NONE, NONE), - RPM_SMPS(S8, 0, 1, 0, 2200000, 2200000, NULL, 0, 1p60, NONE, NONE), - - /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */ - RPM_LDO(L1, 1, 1, 0, 1100000, 1100000, "8921_s4", 0, 1000), - RPM_LDO(L2, 0, 1, 0, 1200000, 1200000, "8921_s4", 0, 0), - RPM_LDO(L3, 0, 1, 0, 3075000, 3075000, NULL, 0, 0), - RPM_LDO(L4, 1, 1, 0, 1800000, 1800000, NULL, 0, 10000), - RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L7, 0, 1, 0, 1850000, 2950000, NULL, 0, 0), - RPM_LDO(L8, 0, 1, 0, 2800000, 2800000, NULL, 0, 0), - RPM_LDO(L9, 0, 1, 0, 3000000, 3000000, NULL, 0, 0), - RPM_LDO(L10, 0, 1, 0, 2900000, 2900000, NULL, 0, 0), - RPM_LDO(L11, 0, 1, 0, 3000000, 3000000, NULL, 0, 0), - RPM_LDO(L12, 0, 1, 0, 1200000, 1200000, "8921_s4", 0, 0), - RPM_LDO(L13, 0, 0, 0, 2220000, 2220000, NULL, 0, 0), - RPM_LDO(L14, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L15, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L16, 0, 1, 0, 2800000, 2800000, NULL, 0, 0), - RPM_LDO(L17, 0, 1, 0, 2000000, 2000000, NULL, 0, 0), - RPM_LDO(L18, 0, 1, 0, 1300000, 1800000, "8921_s4", 0, 0), - RPM_LDO(L21, 0, 1, 0, 1050000, 1050000, NULL, 0, 0), - RPM_LDO(L22, 0, 1, 0, 2600000, 2600000, NULL, 0, 0), - RPM_LDO(L23, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L24, 0, 1, 1, 750000, 1150000, "8921_s1", 10000, 10000), - RPM_LDO(L25, 1, 1, 0, 1250000, 1250000, "8921_s1", 10000, 10000), - RPM_LDO(L27, 0, 0, 0, 1100000, 1100000, "8921_s7", 0, 0), - RPM_LDO(L28, 0, 1, 0, 1050000, 1050000, "8921_s7", 0, 0), - RPM_LDO(L29, 0, 1, 0, 2000000, 2000000, NULL, 0, 0), - - /* ID a_on pd ss supply */ - RPM_VS(LVS1, 0, 1, 0, "8921_s4"), - RPM_VS(LVS3, 0, 1, 0, "8921_s4"), - RPM_VS(LVS4, 0, 1, 0, "8921_s4"), - RPM_VS(LVS5, 0, 1, 0, "8921_s4"), - RPM_VS(LVS6, 0, 1, 0, "8921_s4"), - RPM_VS(LVS7, 0, 1, 1, "8921_s4"), -}; - -static struct rpm_regulator_init_data -apq8064_rpm_regulator_pm8921_init_data[] = { - /* ID a_on pd ss supply */ - RPM_VS(LVS2, 0, 1, 0, "8921_s1"), - - /* ID a_on ss min_uV max_uV supply freq */ - RPM_NCP(NCP, 0, 0, 1800000, 1800000, "8921_l6", 1p60), -}; - -int msm8064_pm8921_regulator_pdata_len = - ARRAY_SIZE(msm8064_pm8921_regulator_pdata); -int msm8064_pm8917_regulator_pdata_len = - ARRAY_SIZE(msm8064_pm8917_regulator_pdata); - -#define RPM_REG_MAP(_id, _sleep_also, _voter, _supply, _dev_name) \ - { \ - .vreg_id = RPM_VREG_ID_PM8921_##_id, \ - .sleep_also = _sleep_also, \ - .voter = _voter, \ - .supply = _supply, \ - .dev_name = _dev_name, \ - } -static struct rpm_regulator_consumer_mapping - msm_rpm_regulator_consumer_mapping[] = { - RPM_REG_MAP(LVS7, 0, 1, "krait0_hfpll", "acpuclk-8064"), - RPM_REG_MAP(LVS7, 0, 2, "krait1_hfpll", "acpuclk-8064"), - RPM_REG_MAP(LVS7, 0, 4, "krait2_hfpll", "acpuclk-8064"), - RPM_REG_MAP(LVS7, 0, 5, "krait3_hfpll", "acpuclk-8064"), - RPM_REG_MAP(LVS7, 0, 6, "l2_hfpll", "acpuclk-8064"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8064"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8064"), - RPM_REG_MAP(L24, 0, 4, "krait2_mem", "acpuclk-8064"), - RPM_REG_MAP(L24, 0, 5, "krait3_mem", "acpuclk-8064"), - RPM_REG_MAP(S3, 0, 1, "krait0_dig", "acpuclk-8064"), - RPM_REG_MAP(S3, 0, 2, "krait1_dig", "acpuclk-8064"), - RPM_REG_MAP(S3, 0, 4, "krait2_dig", "acpuclk-8064"), - RPM_REG_MAP(S3, 0, 5, "krait3_dig", "acpuclk-8064"), -}; - -struct rpm_regulator_platform_data apq8064_rpm_regulator_pdata = { - .init_data = apq8064_rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(apq8064_rpm_regulator_init_data), - .version = RPM_VREG_VERSION_8960, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8921_L24, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8921_S3, - .requires_tcxo_workaround = true, - .consumer_map = msm_rpm_regulator_consumer_mapping, - .consumer_map_len = ARRAY_SIZE(msm_rpm_regulator_consumer_mapping), -}; - -/* Regulators that are only present when using PM8921 */ -struct rpm_regulator_platform_data -apq8064_rpm_regulator_pm8921_pdata = { - .init_data = apq8064_rpm_regulator_pm8921_init_data, - .num_regulators = ARRAY_SIZE(apq8064_rpm_regulator_pm8921_init_data), - .version = RPM_VREG_VERSION_8960, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8921_L24, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8921_S3, - .requires_tcxo_workaround = true, -}; - -/* - * Fix up regulator consumer data that moves to a different regulator when - * PM8917 is used. - */ -void __init configure_apq8064_pm8917_power_grid(void) -{ - static struct rpm_regulator_init_data *rpm_data; - int i; - - for (i = 0; i < ARRAY_SIZE(apq8064_rpm_regulator_init_data); i++) { - rpm_data = &apq8064_rpm_regulator_init_data[i]; - if (rpm_data->id == RPM_VREG_ID_PM8921_S1) { - rpm_data->init_data.consumer_supplies - = vreg_consumers_8917_S1; - rpm_data->init_data.num_consumer_supplies - = ARRAY_SIZE(vreg_consumers_8917_S1); - } - } - - /* - * Switch to 8960_PM8917 rpm-regulator version so that TCXO workaround - * is applied to PM8917 regulators L25, L26, L27, and L28. - */ - apq8064_rpm_regulator_pdata.version = RPM_VREG_VERSION_8960_PM8917; -} diff --git a/arch/arm/mach-msm/board-8064-storage.c b/arch/arm/mach-msm/board-8064-storage.c deleted file mode 100644 index d5029537a202..000000000000 --- a/arch/arm/mach-msm/board-8064-storage.c +++ /dev/null @@ -1,412 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8064.h" -#include "board-storage-common-a.h" - - -/* APQ8064 has 4 SDCC controllers */ -enum sdcc_controllers { - SDCC1, - SDCC2, - SDCC3, - SDCC4, - MAX_SDCC_CONTROLLER -}; - -/* All SDCC controllers require VDD/VCC voltage */ -static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .always_on = 1, - .lpm_sup = 1, - .lpm_uA = 9000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .hpm_uA = 800000, /* 800mA */ - } -}; - -/* SDCC controllers may require voting for VDD IO voltage */ -static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd_io", - .always_on = 1, - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd_io", - .high_vol_level = 2950000, - .low_vol_level = 1850000, - .always_on = 1, - .lpm_sup = 1, - /* Max. Active current required is 16 mA */ - .hpm_uA = 16000, - /* - * Sleep current required is ~300 uA. But min. vote can be - * in terms of mA (min. 1 mA). So let's vote for 2 mA - * during sleep. - */ - .lpm_uA = 2000, - } -}; - -static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .vdd_data = &mmc_vdd_reg_data[SDCC1], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1], - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .vdd_data = &mmc_vdd_reg_data[SDCC3], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC3], - } -}; - -/* SDC1 pad data */ -static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA} -}; - -static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -/* SDC3 pad data */ -static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA} -}; - -static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_pull_on_cfg, - .off = sdc1_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_pull_on_cfg, - .off = sdc3_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg) - }, -}; - -static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_drv_on_cfg, - .off = sdc1_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_drv_on_cfg, - .off = sdc3_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg) - }, -}; - -static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pull = &mmc_pad_pull_data[SDCC1], - .drv = &mmc_pad_drv_data[SDCC1] - }, - [SDCC3] = { - .pull = &mmc_pad_pull_data[SDCC3], - .drv = &mmc_pad_drv_data[SDCC3] - }, -}; - -static struct msm_mmc_gpio sdc2_gpio[] = { - {59, "sdc2_clk"}, - {57, "sdc2_cmd"}, - {62, "sdc2_dat_0"}, - {61, "sdc2_dat_1"}, - {60, "sdc2_dat_2"}, - {58, "sdc2_dat_3"}, -}; - -static struct msm_mmc_gpio sdc4_gpio[] = { - {68, "sdc4_clk"}, - {67, "sdc4_cmd"}, - {66, "sdc4_dat_0"}, - {65, "sdc4_dat_1"}, - {64, "sdc4_dat_2"}, - {63, "sdc4_dat_3"}, -}; - -static struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = { - [SDCC2] = { - .gpio = sdc2_gpio, - .size = ARRAY_SIZE(sdc2_gpio), - }, - [SDCC4] = { - .gpio = sdc4_gpio, - .size = ARRAY_SIZE(sdc4_gpio), - } -}; - -static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pad_data = &mmc_pad_data[SDCC1], - }, - [SDCC2] = { - .is_gpio = 1, - .gpio_data = &mmc_gpio_data[SDCC2], - }, - [SDCC3] = { - .pad_data = &mmc_pad_data[SDCC3], - }, - [SDCC4] = { - .is_gpio = 1, - .gpio_data = &mmc_gpio_data[SDCC4], - }, -}; - -#define MSM_MPM_PIN_SDC1_DAT1 17 -#define MSM_MPM_PIN_SDC3_DAT1 21 - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static unsigned int sdc1_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000 -}; - -static unsigned int sdc1_sup_clk_rates_all[] = { - 400000, 24000000, 48000000, 96000000, 192000000 -}; - -static struct mmc_platform_data sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, -#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .sup_clk_table = sdc1_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates), - .nonremovable = 1, - .pin_data = &mmc_slot_pin_data[SDCC1], - .vreg_data = &mmc_slot_vreg_data[SDCC1], - .uhs_caps = MMC_CAP_1_8V_DDR | MMC_CAP_UHS_DDR50, - .uhs_caps2 = MMC_CAP2_HS200_1_8V_SDR, - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *apq8064_sdc1_pdata = &sdc1_data; -#else -static struct mmc_platform_data *apq8064_sdc1_pdata; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static unsigned int sdc2_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data sdc2_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc2_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates), - .pin_data = &mmc_slot_pin_data[SDCC2], - .sdiowakeup_irq = MSM_GPIO_TO_INT(61), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *apq8064_sdc2_pdata = &sdc2_data; -#else -static struct mmc_platform_data *apq8064_sdc2_pdata; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static unsigned int sdc3_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000, 192000000 -}; - -static struct mmc_platform_data sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc3_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates), - .pin_data = &mmc_slot_pin_data[SDCC3], - .vreg_data = &mmc_slot_vreg_data[SDCC3], - .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(17), - .is_wpswitch_active_low = true, - .status_gpio = 26, - .status_irq = MSM_GPIO_TO_INT(26), - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - .is_status_gpio_active_low = 1, - .xpc_cap = 1, - .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 | - MMC_CAP_UHS_SDR104), - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *apq8064_sdc3_pdata = &sdc3_data; -#else -static struct mmc_platform_data *apq8064_sdc3_pdata; -#endif - - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static unsigned int sdc4_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data sdc4_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc4_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc4_sup_clk_rates), - .pin_data = &mmc_slot_pin_data[SDCC4], - .sdiowakeup_irq = MSM_GPIO_TO_INT(65), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *apq8064_sdc4_pdata = &sdc4_data; -#else -static struct mmc_platform_data *apq8064_sdc4_pdata; -#endif - -void __init apq8064_init_mmc(void) -{ - if (apq8064_sdc1_pdata) { - /* 8064 v2 supports upto 200MHz clock on SDC1 slot */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 2) { - apq8064_sdc1_pdata->sup_clk_table = - sdc1_sup_clk_rates_all; - apq8064_sdc1_pdata->sup_clk_cnt = - ARRAY_SIZE(sdc1_sup_clk_rates_all); - } - apq8064_add_sdcc(1, apq8064_sdc1_pdata); - } - - if (apq8064_sdc2_pdata) - apq8064_add_sdcc(2, apq8064_sdc2_pdata); - - if (apq8064_sdc3_pdata) { - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) { - apq8064_sdc3_pdata->uhs_caps &= ~(MMC_CAP_UHS_SDR12 | - MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_DDR50 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104); - } - if (!machine_is_apq8064_cdp()) { - apq8064_sdc3_pdata->wpswitch_gpio = 0; - apq8064_sdc3_pdata->is_wpswitch_active_low = false; - } - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) { - int rc; - struct pm_gpio sd_card_det_init_cfg = { - .direction = PM_GPIO_DIR_IN, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .pull = PM_GPIO_PULL_UP_30, - .vin_sel = PM_GPIO_VIN_S4, - .out_strength = PM_GPIO_STRENGTH_NO, - .function = PM_GPIO_FUNC_NORMAL, - }; - - apq8064_sdc3_pdata->status_gpio = - PM8921_GPIO_PM_TO_SYS(31); - apq8064_sdc3_pdata->status_irq = - PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 31); - rc = pm8xxx_gpio_config(apq8064_sdc3_pdata->status_gpio, - &sd_card_det_init_cfg); - if (rc) { - pr_info("%s: SD_CARD_DET GPIO%d config " - "failed(%d)\n", __func__, - apq8064_sdc3_pdata->status_gpio, rc); - apq8064_sdc3_pdata->status_gpio = 0; - apq8064_sdc3_pdata->status_irq = 0; - } - } - if (machine_is_apq8064_cdp()) { - int i; - - for (i = 0; - i < apq8064_sdc3_pdata->pin_data->pad_data->\ - drv->size; - i++) - apq8064_sdc3_pdata->pin_data->pad_data->\ - drv->on[i].val = GPIO_CFG_10MA; - } - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) { - apq8064_sdc3_pdata->pin_data->pad_data->\ - drv->on[0].val = GPIO_CFG_16MA; - apq8064_sdc3_pdata->pin_data->pad_data->\ - drv->on[1].val = GPIO_CFG_10MA; - apq8064_sdc3_pdata->pin_data->pad_data->\ - drv->on[2].val = GPIO_CFG_10MA; - } - apq8064_add_sdcc(3, apq8064_sdc3_pdata); - } - - if (apq8064_sdc4_pdata) - apq8064_add_sdcc(4, apq8064_sdc4_pdata); -} diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c deleted file mode 100644 index 996874809159..000000000000 --- a/arch/arm/mach-msm/board-8064.c +++ /dev/null @@ -1,3885 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include "timer.h" -#include "devices.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm_watchdog.h" -#include "board-8064.h" -#include "clock.h" -#include "spm.h" -#include -#include "rpm_resources.h" -#include "pm.h" -#include "pm-boot.h" -#include "devices-msm8x60.h" -#include "platsmp.h" - -#define MHL_GPIO_INT 30 -#define MHL_GPIO_RESET 35 -#include "sysmon.h" - -#define MSM_PMEM_ADSP_SIZE 0x7800000 -#define MSM_PMEM_AUDIO_SIZE 0x4CF000 -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */ -#else -#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */ -#endif - -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -#define HOLE_SIZE 0x20000 -#define MSM_ION_MFC_META_SIZE 0x40000 /* 256 Kbytes */ -#define MSM_CONTIG_MEM_SIZE 0x65000 -#ifdef CONFIG_MSM_IOMMU -#define MSM_ION_MM_SIZE 0x3800000 -#define MSM_ION_SF_SIZE 0 -#define MSM_ION_QSECOM_SIZE 0x780000 /* (7.5MB) */ -#define MSM_ION_HEAP_NUM 8 -#else -#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE -#define MSM_ION_SF_SIZE MSM_PMEM_SIZE -#define MSM_ION_QSECOM_SIZE 0x600000 /* (6MB) */ -#define MSM_ION_HEAP_NUM 8 -#endif -#define MSM_ION_MM_FW_SIZE (0x200000 - HOLE_SIZE) /* (2MB - 128KB) */ -#define MSM_ION_MFC_SIZE (SZ_8K + MSM_ION_MFC_META_SIZE) -#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE -#else -#define MSM_CONTIG_MEM_SIZE 0x110C000 -#define MSM_ION_HEAP_NUM 1 -#endif - -#define APQ8064_FIXED_AREA_START (0xa0000000 - (MSM_ION_MM_FW_SIZE + \ - HOLE_SIZE)) -#define MAX_FIXED_AREA_SIZE 0x10000000 -#define MSM_MM_FW_SIZE (0x200000 - HOLE_SIZE) -#define APQ8064_FW_START APQ8064_FIXED_AREA_START -#define MSM_ION_ADSP_SIZE SZ_8M - -#define QFPROM_RAW_FEAT_CONFIG_ROW0_MSB (MSM_QFPROM_BASE + 0x23c) -#define QFPROM_RAW_OEM_CONFIG_ROW0_LSB (MSM_QFPROM_BASE + 0x220) - -/* PCIE AXI address space */ -#define PCIE_AXI_BAR_PHYS 0x08000000 -#define PCIE_AXI_BAR_SIZE SZ_128M - -/* PCIe pmic gpios */ -#define PCIE_WAKE_N_PMIC_GPIO 12 -#define PCIE_PWR_EN_PMIC_GPIO 13 -#define PCIE_RST_N_PMIC_MPP 1 -#define PCIE_WAKE_N_PMIC_GPIO_HRD 22 -#define PCIE_PWR_EN_PMIC_GPIO_HRD 23 - -/* PCIe pmic gpios for fsm8064_ep */ -/* Unused pin. The WAKE feature is not supported on fsm8064_ep */ -#define PCIE_EP_WAKE_N_PMIC_GPIO 11 -#define PCIE_EP_RST_N_PMIC_GPIO 37 - -#ifdef CONFIG_KERNEL_MSM_CONTIG_MEM_REGION -static unsigned msm_contig_mem_size = MSM_CONTIG_MEM_SIZE; -static int __init msm_contig_mem_size_setup(char *p) -{ - msm_contig_mem_size = memparse(p, NULL); - return 0; -} -early_param("msm_contig_mem_size", msm_contig_mem_size_setup); -#endif - -#ifdef CONFIG_BATTERY_BCL -static struct platform_device battery_bcl_device = { - .name = "battery_current_limit", - .id = -1, -}; -#endif - -static struct memtype_reserve apq8064_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static void __init reserve_rtb_memory(void) -{ -#if defined(CONFIG_MSM_RTB) - apq8064_reserve_table[MEMTYPE_EBI1].size += apq8064_rtb_pdata.size; -#endif -} - -static int apq8064_paddr_to_memtype(phys_addr_t paddr) -{ - return MEMTYPE_EBI1; -} - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_cp_heap_pdata cp_mm_apq8064_ion_pdata = { - .permission_type = IPT_TYPE_MM_CARVEOUT, - .align = PAGE_SIZE, - .fixed_position = FIXED_MIDDLE, -}; - -static struct ion_cp_heap_pdata cp_mfc_apq8064_ion_pdata = { - .permission_type = IPT_TYPE_MFC_SHAREDMEM, - .align = PAGE_SIZE, - .fixed_position = FIXED_HIGH, -}; - -static struct ion_co_heap_pdata co_apq8064_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; - -static struct ion_co_heap_pdata fw_co_apq8064_ion_pdata = { - .adjacent_mem_id = ION_CP_MM_HEAP_ID, - .align = SZ_128K, - .fixed_position = FIXED_LOW, -}; -#endif - -static u64 msm_dmamask = DMA_BIT_MASK(32); - -static struct platform_device ion_mm_heap_device = { - .name = "ion-mm-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; - -static struct platform_device ion_adsp_heap_device = { - .name = "ion-adsp-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; -/** - * These heaps are listed in the order they will be allocated. Due to - * video hardware restrictions and content protection the FW heap has to - * be allocated adjacent (below) the MM heap and the MFC heap has to be - * allocated after the MM heap to ensure MFC heap is not more than 256MB - * away from the base address of the FW heap. - * However, the order of FW heap and MM heap doesn't matter since these - * two heaps are taken care of by separate code to ensure they are adjacent - * to each other. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap apq8064_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - { - .id = ION_CP_MM_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MM_HEAP_NAME, - .size = MSM_ION_MM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mm_apq8064_ion_pdata, - .priv = &ion_mm_heap_device.dev - }, - { - .id = ION_MM_FIRMWARE_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_MM_FIRMWARE_HEAP_NAME, - .size = MSM_ION_MM_FW_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &fw_co_apq8064_ion_pdata, - }, - { - .id = ION_CP_MFC_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MFC_HEAP_NAME, - .size = MSM_ION_MFC_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mfc_apq8064_ion_pdata, - }, -#ifndef CONFIG_MSM_IOMMU - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .size = MSM_ION_SF_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_apq8064_ion_pdata, - }, -#endif - { - .id = ION_IOMMU_HEAP_ID, - .type = ION_HEAP_TYPE_IOMMU, - .name = ION_IOMMU_HEAP_NAME, - }, - { - .id = ION_QSECOM_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_QSECOM_HEAP_NAME, - .size = MSM_ION_QSECOM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_apq8064_ion_pdata, - }, - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .size = MSM_ION_AUDIO_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_apq8064_ion_pdata, - }, - { - .id = ION_ADSP_HEAP_ID, - .type = ION_HEAP_TYPE_DMA, - .name = ION_ADSP_HEAP_NAME, - .size = MSM_ION_ADSP_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_apq8064_ion_pdata, - .priv = &ion_adsp_heap_device.dev, - }, -#endif -}; - -static struct ion_platform_data apq8064_ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = apq8064_heaps, -}; - -static struct platform_device apq8064_ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &apq8064_ion_pdata }, -}; -#endif - -static void __init reserve_mem_for_ion(enum ion_memory_types mem_type, - unsigned long size) -{ - apq8064_reserve_table[mem_type].size += size; -} - -static void __init apq8064_reserve_fixed_area(unsigned long fixed_area_size) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - int ret; - - if (fixed_area_size > MAX_FIXED_AREA_SIZE) - panic("fixed area size is larger than %dM\n", - MAX_FIXED_AREA_SIZE >> 20); - - reserve_info->fixed_area_size = fixed_area_size; - reserve_info->fixed_area_start = APQ8064_FW_START; - - ret = memblock_remove(reserve_info->fixed_area_start, - reserve_info->fixed_area_size); - BUG_ON(ret); -#endif -} - -/** - * Reserve memory for ION. Also handle special case - * for video heaps (MM,FW, and MFC). Video requires heaps MM and MFC to be - * at a higher address than FW in addition to not more than 256MB away from the - * base address of the firmware. In addition the MM heap must be - * adjacent to the FW heap for content protection purposes. - */ -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - unsigned int i; - unsigned int ret; - unsigned int fixed_size = 0; - unsigned int fixed_low_size, fixed_middle_size, fixed_high_size; - unsigned long fixed_low_start, fixed_middle_start, fixed_high_start; - unsigned long cma_alignment; - unsigned int low_use_cma = 0; - unsigned int middle_use_cma = 0; - unsigned int high_use_cma = 0; - - - fixed_low_size = 0; - fixed_middle_size = 0; - fixed_high_size = 0; - - cma_alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order); - - for (i = 0; i < apq8064_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = - &(apq8064_ion_pdata.heaps[i]); - int use_cma = 0; - - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - - switch ((int)heap->type) { - case ION_HEAP_TYPE_CP: - if (((struct ion_cp_heap_pdata *) - heap->extra_data)->is_cma) { - heap->size = ALIGN(heap->size, - cma_alignment); - use_cma = 1; - } - fixed_position = ((struct ion_cp_heap_pdata *) - heap->extra_data)->fixed_position; - break; - case ION_HEAP_TYPE_DMA: - use_cma = 1; - /* Purposely fall through here */ - case ION_HEAP_TYPE_CARVEOUT: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - break; - default: - break; - } - - if (fixed_position != NOT_FIXED) - fixed_size += heap->size; - else if (!use_cma) - reserve_mem_for_ion(MEMTYPE_EBI1, heap->size); - - if (fixed_position == FIXED_LOW) { - fixed_low_size += heap->size; - low_use_cma = use_cma; - } else if (fixed_position == FIXED_MIDDLE) { - fixed_middle_size += heap->size; - middle_use_cma = use_cma; - } else if (fixed_position == FIXED_HIGH) { - fixed_high_size += heap->size; - high_use_cma = use_cma; - } else if (use_cma) { - /* - * Heaps that use CMA but are not part of the - * fixed set. Create wherever. - */ - dma_declare_contiguous( - heap->priv, - heap->size, - 0, - 0xb0000000); - - } - } - } - - if (!fixed_size) - return; - - /* - * Given the setup for the fixed area, we can't round up all sizes. - * Some sizes must be set up exactly and aligned correctly. Incorrect - * alignments are considered a configuration issue - */ - - fixed_low_start = APQ8064_FIXED_AREA_START; - if (low_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_low_start, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, SECTION_SIZE)); - ret = memblock_remove(fixed_low_start, - fixed_low_size + HOLE_SIZE); - BUG_ON(ret); - } - - fixed_middle_start = fixed_low_start + fixed_low_size + HOLE_SIZE; - if (middle_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_middle_start, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_middle_size, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_middle_size, SECTION_SIZE)); - ret = memblock_remove(fixed_middle_start, fixed_middle_size); - BUG_ON(ret); - } - - fixed_high_start = fixed_middle_start + fixed_middle_size; - if (high_use_cma) { - fixed_high_size = ALIGN(fixed_high_size, cma_alignment); - BUG_ON(!IS_ALIGNED(fixed_high_start, cma_alignment)); - } else { - /* This is the end of the fixed area so it's okay to round up */ - fixed_high_size = ALIGN(fixed_high_size, SECTION_SIZE); - ret = memblock_remove(fixed_high_start, fixed_high_size); - BUG_ON(ret); - } - - for (i = 0; i < apq8064_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = &(apq8064_ion_pdata.heaps[i]); - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - struct ion_cp_heap_pdata *pdata = NULL; - - switch ((int) heap->type) { - case ION_HEAP_TYPE_CP: - pdata = - (struct ion_cp_heap_pdata *)heap->extra_data; - fixed_position = pdata->fixed_position; - break; - case ION_HEAP_TYPE_CARVEOUT: - case ION_HEAP_TYPE_DMA: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - break; - default: - break; - } - - switch (fixed_position) { - case FIXED_LOW: - heap->base = fixed_low_start; - break; - case FIXED_MIDDLE: - heap->base = fixed_middle_start; - if (middle_use_cma) { - ret = dma_declare_contiguous( - heap->priv, - heap->size, - fixed_middle_start, - 0xa0000000); - WARN_ON(ret); - } - pdata->secure_base = fixed_middle_start - - HOLE_SIZE; - pdata->secure_size = HOLE_SIZE + heap->size; - break; - case FIXED_HIGH: - heap->base = fixed_high_start; - break; - default: - break; - } - } - } -#endif -} - -static void __init reserve_mdp_memory(void) -{ - apq8064_mdp_writeback(apq8064_reserve_table); -} - -static void __init reserve_cache_dump_memory(void) -{ -#ifdef CONFIG_MSM_CACHE_DUMP - unsigned int total; - - total = apq8064_cache_dump_pdata.l1_size + - apq8064_cache_dump_pdata.l2_size; - apq8064_reserve_table[MEMTYPE_EBI1].size += total; -#endif -} - -static void __init reserve_mpdcvs_memory(void) -{ - apq8064_reserve_table[MEMTYPE_EBI1].size += SZ_32K; -} - -static void __init apq8064_calculate_reserve_sizes(void) -{ - reserve_ion_memory(); - reserve_mdp_memory(); - reserve_rtb_memory(); - reserve_cache_dump_memory(); - reserve_mpdcvs_memory(); - apq8064_reserve_table[MEMTYPE_EBI1].size += msm_contig_mem_size; -} - -static struct reserve_info apq8064_reserve_info __initdata = { - .memtype_reserve_table = apq8064_reserve_table, - .calculate_reserve_sizes = apq8064_calculate_reserve_sizes, - .reserve_fixed_area = apq8064_reserve_fixed_area, - .paddr_to_memtype = apq8064_paddr_to_memtype, -}; - -static char prim_panel_name[PANEL_NAME_MAX_LEN]; -static char ext_panel_name[PANEL_NAME_MAX_LEN]; - -static int ext_resolution; - -static int __init prim_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("prim_display", prim_display_setup); - -static int __init ext_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(ext_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("ext_display", ext_display_setup); - -static int __init hdmi_resulution_setup(char *param) -{ - int ret; - ret = kstrtoint(param, 10, &ext_resolution); - return ret; -} -early_param("ext_resolution", hdmi_resulution_setup); - -static void __init apq8064_reserve(void) -{ - apq8064_set_display_params(prim_panel_name, ext_panel_name, - ext_resolution); - msm_reserve(); -} - -static void __init apq8064_early_reserve(void) -{ - reserve_info = &apq8064_reserve_info; -} -#ifdef CONFIG_USB_EHCI_MSM_HSIC -/* Bandwidth requests (zero) if no vote placed */ -static struct msm_bus_vectors hsic_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ab = 0, - .ib = 0, - }, -}; - -/* Bus bandwidth requests in Bytes/sec */ -static struct msm_bus_vectors hsic_max_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ab = 0, - .ib = 256000000, /*vote for 32Mhz dfab clk rate*/ - }, -}; - -static struct msm_bus_paths hsic_bus_scale_usecases[] = { - { - ARRAY_SIZE(hsic_init_vectors), - hsic_init_vectors, - }, - { - ARRAY_SIZE(hsic_max_vectors), - hsic_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata hsic_bus_scale_pdata = { - hsic_bus_scale_usecases, - ARRAY_SIZE(hsic_bus_scale_usecases), - .name = "hsic", -}; - -static struct msm_hsic_host_platform_data msm_hsic_pdata = { - .strobe = 88, - .data = 89, - .phy_sof_workaround = true, - .bus_scale_table = &hsic_bus_scale_pdata, -}; -#else -static struct msm_hsic_host_platform_data msm_hsic_pdata; -#endif - -#define PID_MAGIC_ID 0x71432909 -#define SERIAL_NUM_MAGIC_ID 0x61945374 -#define SERIAL_NUMBER_LENGTH 127 -#define DLOAD_USB_BASE_ADD 0x2A03F0C8 - -struct magic_num_struct { - uint32_t pid; - uint32_t serial_num; -}; - -struct dload_struct { - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint16_t reserved4; - uint16_t pid; - char serial_number[SERIAL_NUMBER_LENGTH]; - uint16_t reserved5; - struct magic_num_struct magic_struct; -}; - -static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum) -{ - struct dload_struct __iomem *dload = 0; - - dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload)); - if (!dload) { - pr_err("%s: cannot remap I/O memory region: %08x\n", - __func__, DLOAD_USB_BASE_ADD); - return -ENXIO; - } - - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", - __func__, dload, pid, snum); - /* update pid */ - dload->magic_struct.pid = PID_MAGIC_ID; - dload->pid = pid; - - /* update serial number */ - dload->magic_struct.serial_num = 0; - if (!snum) { - memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH); - goto out; - } - - dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID; - strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH); -out: - iounmap(dload); - return 0; -} - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -/* Bandwidth requests (zero) if no vote placed */ -static struct msm_bus_vectors usb_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -/* Bus bandwidth requests in Bytes/sec */ -static struct msm_bus_vectors usb_max_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 60000000, /* At least 480Mbps on bus. */ - .ib = 960000000, /* MAX bursts rate */ - }, -}; - -static struct msm_bus_paths usb_bus_scale_usecases[] = { - { - ARRAY_SIZE(usb_init_vectors), - usb_init_vectors, - }, - { - ARRAY_SIZE(usb_max_vectors), - usb_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata usb_bus_scale_pdata = { - usb_bus_scale_usecases, - ARRAY_SIZE(usb_bus_scale_usecases), - .name = "usb", -}; - -static int phy_init_seq[] = { - 0x68, 0x81, /* update DC voltage level */ - 0x24, 0x82, /* set pre-emphasis and rise/fall time */ - -1 -}; - -#define PMIC_GPIO_DP 27 /* PMIC GPIO for D+ change */ -#define PMIC_GPIO_DP_IRQ PM8921_GPIO_IRQ(PM8921_IRQ_BASE, PMIC_GPIO_DP) -#define MSM_MPM_PIN_USB1_OTGSESSVLD 40 - -static struct msm_otg_platform_data msm_otg_pdata = { - .mode = USB_OTG, - .otg_control = OTG_PMIC_CONTROL, - .phy_type = SNPS_28NM_INTEGRATED_PHY, - .pmic_id_irq = PM8921_USB_ID_IN_IRQ(PM8921_IRQ_BASE), - .power_budget = 750, - .bus_scale_table = &usb_bus_scale_pdata, - .phy_init_seq = phy_init_seq, - .mpm_otgsessvld_int = MSM_MPM_PIN_USB1_OTGSESSVLD, -}; - -static struct msm_usb_host_platform_data msm_ehci_host_pdata3 = { - .power_budget = 500, -}; - -#ifdef CONFIG_USB_EHCI_MSM_HOST4 -static struct msm_usb_host_platform_data msm_ehci_host_pdata4; -#endif - -static void __init apq8064_ehci_host_init(void) -{ - if (machine_is_apq8064_liquid() || machine_is_mpq8064_cdp() || - machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv() || - machine_is_apq8064_cdp() || machine_is_fsm8064_ep()) { - if (machine_is_apq8064_liquid()) - msm_ehci_host_pdata3.dock_connect_irq = - PM8921_MPP_IRQ(PM8921_IRQ_BASE, 9); - else - msm_ehci_host_pdata3.pmic_gpio_dp_irq = - PMIC_GPIO_DP_IRQ; - - apq8064_device_ehci_host3.dev.platform_data = - &msm_ehci_host_pdata3; - platform_device_register(&apq8064_device_ehci_host3); - -#ifdef CONFIG_USB_EHCI_MSM_HOST4 - apq8064_device_ehci_host4.dev.platform_data = - &msm_ehci_host_pdata4; - platform_device_register(&apq8064_device_ehci_host4); -#endif - } -} - -static struct smb349_platform_data smb349_data __initdata = { - .en_n_gpio = PM8921_GPIO_PM_TO_SYS(37), - .chg_susp_gpio = PM8921_GPIO_PM_TO_SYS(30), - .chg_current_ma = 2200, -}; - -static struct i2c_board_info smb349_charger_i2c_info[] __initdata = { - { - I2C_BOARD_INFO(SMB349_NAME, 0x1B), - .platform_data = &smb349_data, - }, -}; - -struct sx150x_platform_data apq8064_sx150x_data[] = { - [SX150X_EPM] = { - .gpio_base = GPIO_EPM_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0x0, - .io_open_drain_ena = 0x0, - .io_polarity = 0, - .irq_summary = -1, - }, -}; - -static struct epm_chan_properties ads_adc_channel_data[] = { - {10, 100}, {1000, 1}, {10, 100}, {1000, 1}, - {10, 100}, {1000, 1}, {10, 100}, {1000, 1}, - {10, 100}, {20, 100}, {500, 100}, {5, 100}, - {1000, 1}, {200, 100}, {50, 100}, {10, 100}, - {510, 100}, {50, 100}, {20, 100}, {100, 100}, - {510, 100}, {20, 100}, {50, 100}, {200, 100}, - {10, 100}, {20, 100}, {1000, 1}, {10, 100}, - {200, 100}, {510, 100}, {1000, 100}, {200, 100}, -}; - -static struct epm_adc_platform_data epm_adc_pdata = { - .channel = ads_adc_channel_data, - .bus_id = 0x0, - .epm_i2c_board_info = { - .type = "sx1509q", - .addr = 0x3e, - .platform_data = &apq8064_sx150x_data[SX150X_EPM], - }, - .gpio_expander_base_addr = GPIO_EPM_EXPANDER_BASE, -}; - -static struct platform_device epm_adc_device = { - .name = "epm_adc", - .id = -1, - .dev = { - .platform_data = &epm_adc_pdata, - }, -}; - -static void __init apq8064_epm_adc_init(void) -{ - epm_adc_pdata.num_channels = 32; - epm_adc_pdata.num_adc = 2; - epm_adc_pdata.chan_per_adc = 16; - epm_adc_pdata.chan_per_mux = 8; -}; - -/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement - * 4 micbiases are used to power various analog and digital - * microphones operating at 1800 mV. Technically, all micbiases - * can source from single cfilter since all microphones operate - * at the same voltage level. The arrangement below is to make - * sure all cfilters are exercised. LDO_H regulator ouput level - * does not need to be as high as 2.85V. It is choosen for - * microphone sensitivity purpose. - */ -static struct wcd9xxx_pdata apq8064_tabla_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x10, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(42), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 2700, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device apq8064_slim_tabla = { - .name = "tabla-slim", - .e_addr = {0, 1, 0x10, 0, 0x17, 2}, - .dev = { - .platform_data = &apq8064_tabla_platform_data, - }, -}; - -static struct wcd9xxx_pdata apq8064_tabla20_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x60, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(42), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 2700, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device apq8064_slim_tabla20 = { - .name = "tabla2x-slim", - .e_addr = {0, 1, 0x60, 0, 0x17, 2}, - .dev = { - .platform_data = &apq8064_tabla20_platform_data, - }, -}; - -static struct wcd9xxx_pdata apq8064_tabla_i2c_platform_data = { - .irq = MSM_GPIO_TO_INT(77), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct i2c_board_info apq8064_tabla_i2c_device_info[] __initdata = { - { - I2C_BOARD_INFO("tabla top level", - APQ_8064_TABLA_I2C_SLAVE_ADDR), - .platform_data = &apq8064_tabla_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla analog", - APQ_8064_TABLA_ANALOG_I2C_SLAVE_ADDR), - .platform_data = &apq8064_tabla_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla digital1", - APQ_8064_TABLA_DIGITAL1_I2C_SLAVE_ADDR), - .platform_data = &apq8064_tabla_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla digital2", - APQ_8064_TABLA_DIGITAL2_I2C_SLAVE_ADDR), - .platform_data = &apq8064_tabla_i2c_platform_data, - }, -}; - -static struct wcd9xxx_pdata mpq8064_ashiko20_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x60, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(42), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "HRD_VDDD_CDC_D", - .min_uV = 1200000, - .max_uV = 1200000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "HRD_CDC_VDDA_A_1P2V", - .min_uV = 1200000, - .max_uV = 1200000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device mpq8064_slim_ashiko20 = { - .name = "tabla2x-slim", - .e_addr = {0, 1, 0x60, 0, 0x17, 2}, - .dev = { - .platform_data = &mpq8064_ashiko20_platform_data, - }, -}; - - -/* enable the level shifter for cs8427 to make sure the I2C - * clock is running at 100KHz and voltage levels are at 3.3 - * and 5 volts - */ -static int enable_100KHz_ls(int enable, int gpio) -{ - if (enable) - gpio_direction_output(gpio, 1); - else - gpio_direction_output(gpio, 0); - return 0; -} - -static struct cs8427_platform_data cs8427_i2c_platform_data = { - .irq = SX150X_GPIO(1, 4), - .reset_gpio = SX150X_GPIO(1, 6), - .enable = enable_100KHz_ls, - .ls_gpio = SX150X_GPIO(1, 10), -}; - -static struct i2c_board_info cs8427_device_info[] __initdata = { - { - I2C_BOARD_INFO("cs8427", CS8427_ADDR4), - .platform_data = &cs8427_i2c_platform_data, - }, -}; - -#define HAP_SHIFT_LVL_OE_GPIO PM8921_MPP_PM_TO_SYS(8) -#define ISA1200_HAP_EN_GPIO PM8921_GPIO_PM_TO_SYS(33) -#define ISA1200_HAP_LEN_GPIO PM8921_GPIO_PM_TO_SYS(20) -#define ISA1200_HAP_CLK_PM8921 PM8921_GPIO_PM_TO_SYS(44) -#define ISA1200_HAP_CLK_PM8917 PM8921_GPIO_PM_TO_SYS(38) - -static int isa1200_clk_enable(bool on) -{ - unsigned int gpio = ISA1200_HAP_CLK_PM8921; - int rc = 0; - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio = ISA1200_HAP_CLK_PM8917; - - gpio_set_value_cansleep(gpio, on); - - if (on) { - rc = pm8xxx_aux_clk_control(CLK_MP3_2, XO_DIV_1, true); - if (rc) { - pr_err("%s: unable to write aux clock register(%d)\n", - __func__, rc); - goto err_gpio_dis; - } - } else { - rc = pm8xxx_aux_clk_control(CLK_MP3_2, XO_DIV_NONE, true); - if (rc) - pr_err("%s: unable to write aux clock register(%d)\n", - __func__, rc); - } - - return rc; - -err_gpio_dis: - gpio_set_value_cansleep(gpio, !on); - return rc; -} - -static int isa1200_dev_setup(bool enable) -{ - unsigned int gpio = ISA1200_HAP_CLK_PM8921; - int rc = 0; - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio = ISA1200_HAP_CLK_PM8917; - - if (!enable) - goto free_gpio; - - rc = gpio_request(gpio, "haptics_clk"); - if (rc) { - pr_err("%s: unable to request gpio %d config(%d)\n", - __func__, gpio, rc); - return rc; - } - - rc = gpio_direction_output(gpio, 0); - if (rc) { - pr_err("%s: unable to set direction\n", __func__); - goto free_gpio; - } - - return 0; - -free_gpio: - gpio_free(gpio); - return rc; -} - -static struct isa1200_regulator isa1200_reg_data[] = { - { - .name = "vddp", - .min_uV = ISA_I2C_VTG_MIN_UV, - .max_uV = ISA_I2C_VTG_MAX_UV, - .load_uA = ISA_I2C_CURR_UA, - }, -}; - -static struct isa1200_platform_data isa1200_1_pdata = { - .name = "vibrator", - .dev_setup = isa1200_dev_setup, - .clk_enable = isa1200_clk_enable, - .need_pwm_clk = true, - .hap_en_gpio = ISA1200_HAP_EN_GPIO, - .hap_len_gpio = ISA1200_HAP_LEN_GPIO, - .max_timeout = 15000, - .mode_ctrl = PWM_GEN_MODE, - .pwm_fd = { - .pwm_div = 256, - }, - .is_erm = false, - .smart_en = true, - .ext_clk_en = true, - .chip_en = 1, - .regulator_info = isa1200_reg_data, - .num_regulators = ARRAY_SIZE(isa1200_reg_data), -}; - -static struct i2c_board_info isa1200_board_info[] __initdata = { - { - I2C_BOARD_INFO("isa1200_1", 0x90>>1), - .platform_data = &isa1200_1_pdata, - }, -}; -/* configuration data for mxt1386e using V2.1 firmware */ -static const u8 mxt1386e_config_data_v2_1[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 14, 4, 0, 5, 11, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T7 Object */ - 32, 8, 50, - /* T8 Object */ - 25, 0, 20, 20, 0, 0, 0, 0, 0, 0, - /* T9 Object */ - 139, 0, 0, 26, 42, 0, 32, 80, 2, 5, - 0, 5, 5, 79, 10, 30, 10, 10, 255, 2, - 85, 5, 0, 5, 9, 5, 12, 35, 70, 40, - 20, 5, 0, 0, 0, - /* T18 Object */ - 0, 0, - /* T24 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 1, 0, 60, 115, 156, 99, - /* T27 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 0, 0, 255, 0, 255, 0, 0, 0, 0, 0, - /* T43 Object */ - 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, - 16, - /* T46 Object */ - 68, 0, 16, 16, 0, 0, 0, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 3, 64, 66, 0, - /* T48 Object */ - 1, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 32, 40, 0, 10, 10, 0, 0, 100, 10, 90, - 0, 0, 0, 0, 0, 0, 0, 10, 1, 10, - 52, 10, 12, 0, 33, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T56 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -/* configuration data for mxt1386e using V2.4.AB firmware */ -static const u8 mxt1386e_config_data_v2_4_AB[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* Object 38, Instance = 0 */ - 14, 5, 0, 0, - /* Object 7, Instance = 0 */ - 32, 8, 50, 0, - /* Object 8, Instance = 0 */ - 25, 0, 20, 20, 0, 0, 0, 0, 0, 0, - /* Object 9, Instance = 0 */ - 139, 0, 0, 26, 42, 0, 32, 80, 2, 5, - 0, 5, 5, 79, 10, 30, 10, 10, 255, 2, - 85, 5, 0, 5, 9, 5, 12, 35, 70, 40, - 20, 5, 0, 0, 0, 0, - /* Object 18, Instance = 0 */ - 0, 0, - /* Object 24, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Object 25, Instance = 0 */ - 1, 0, 60, 115, 156, 99, - /* Object 27, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, - /* Object 40, Instance = 0 */ - 0, 0, 0, 0, 0, - /* Object 42, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Object 43, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, - /* Object 46, Instance = 0 */ - 68, 0, 16, 16, 0, 0, 0, 0, 0, - /* Object 47, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* Object 56, Instance = 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, - /* Object 62, Instance = 0 */ - 1, 0, 0, 2, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 40, 10, 52, 10, 100, 10, 10, 10, 90, 0, - 0, 0, 0, 0, 33, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -}; - -#define MXT_TS_GPIO_IRQ 6 -#define MXT_TS_PWR_EN_GPIO PM8921_GPIO_PM_TO_SYS(23) -#define MXT_TS_RESET_GPIO 33 - -static struct mxt_config_info mxt_config_array[] = { - { - .config = mxt1386e_config_data_v2_1, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x21, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - .fw_name = "atmel_8064_liquid_v2_4_AB.hex", - }, - { - /* The config data for V2.2.AA is the same as for V2.1.AA */ - .config = mxt1386e_config_data_v2_1, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x22, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - .fw_name = "atmel_8064_liquid_v2_4_AB.hex", - }, - { - .config = mxt1386e_config_data_v2_4_AB, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_4_AB), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x24, - .build = 0xAB, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - }, -}; - -static struct mxt_platform_data mxt_platform_data = { - .config_array = mxt_config_array, - .config_array_size = ARRAY_SIZE(mxt_config_array), - .panel_minx = 0, - .panel_maxx = 1365, - .panel_miny = 0, - .panel_maxy = 767, - .disp_minx = 0, - .disp_maxx = 1365, - .disp_miny = 0, - .disp_maxy = 767, - .irqflags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - .i2c_pull_up = true, - .reset_gpio = MXT_TS_RESET_GPIO, - .irq_gpio = MXT_TS_GPIO_IRQ, -}; - -static struct i2c_board_info mxt_device_info[] __initdata = { - { - I2C_BOARD_INFO("atmel_mxt_ts", 0x5b), - .platform_data = &mxt_platform_data, - .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ), - }, -}; -#define CYTTSP_TS_GPIO_IRQ 6 -#define CYTTSP_TS_GPIO_SLEEP 33 -#define CYTTSP_TS_GPIO_SLEEP_ALT 12 - -static ssize_t tma340_vkeys_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return snprintf(buf, 200, - __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":73:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":230:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":389:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":544:1120:97:97" - "\n"); -} - -static struct kobj_attribute tma340_vkeys_attr = { - .attr = { - .mode = S_IRUGO, - }, - .show = &tma340_vkeys_show, -}; - -static struct attribute *tma340_properties_attrs[] = { - &tma340_vkeys_attr.attr, - NULL -}; - -static struct attribute_group tma340_properties_attr_group = { - .attrs = tma340_properties_attrs, -}; - -static int cyttsp_platform_init(struct i2c_client *client) -{ - int rc = 0; - static struct kobject *tma340_properties_kobj; - - tma340_vkeys_attr.attr.name = "virtualkeys.cyttsp-i2c"; - tma340_properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (tma340_properties_kobj) - rc = sysfs_create_group(tma340_properties_kobj, - &tma340_properties_attr_group); - if (!tma340_properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", - __func__); - - return 0; -} - -static struct cyttsp_regulator cyttsp_regulator_data[] = { - { - .name = "vdd", - .min_uV = CY_TMA300_VTG_MIN_UV, - .max_uV = CY_TMA300_VTG_MAX_UV, - .hpm_load_uA = CY_TMA300_CURR_24HZ_UA, - .lpm_load_uA = CY_TMA300_CURR_24HZ_UA, - }, - { - .name = "vcc_i2c", - .min_uV = CY_I2C_VTG_MIN_UV, - .max_uV = CY_I2C_VTG_MAX_UV, - .hpm_load_uA = CY_I2C_CURR_UA, - .lpm_load_uA = CY_I2C_CURR_UA, - }, -}; - -static struct cyttsp_platform_data cyttsp_pdata = { - .panel_maxx = 634, - .panel_maxy = 1166, - .disp_minx = 18, - .disp_maxx = 617, - .disp_miny = 18, - .disp_maxy = 1041, - .flags = 0x01, - .gen = CY_GEN3, - .use_st = CY_USE_ST, - .use_mt = CY_USE_MT, - .use_hndshk = CY_SEND_HNDSHK, - .use_trk_id = CY_USE_TRACKING_ID, - .use_sleep = CY_USE_DEEP_SLEEP_SEL, - .use_gestures = CY_USE_GESTURES, - .fw_fname = "cyttsp_8064_mtp.hex", - /* change act_intrvl to customize the Active power state - * scanning/processing refresh interval for Operating mode - */ - .act_intrvl = CY_ACT_INTRVL_DFLT, - /* change tch_tmout to customize the touch timeout for the - * Active power state for Operating mode - */ - .tch_tmout = CY_TCH_TMOUT_DFLT, - /* change lp_intrvl to customize the Low Power power state - * scanning/processing refresh interval for Operating mode - */ - .lp_intrvl = CY_LP_INTRVL_DFLT, - .sleep_gpio = CYTTSP_TS_GPIO_SLEEP, - .resout_gpio = -1, - .irq_gpio = CYTTSP_TS_GPIO_IRQ, - .regulator_info = cyttsp_regulator_data, - .num_regulators = ARRAY_SIZE(cyttsp_regulator_data), - .init = cyttsp_platform_init, - .correct_fw_ver = 17, -}; - -static struct i2c_board_info cyttsp_info[] __initdata = { - { - I2C_BOARD_INFO(CY_I2C_NAME, 0x24), - .platform_data = &cyttsp_pdata, - .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ), - }, -}; - -#define MSM_WCNSS_PHYS 0x03000000 -#define MSM_WCNSS_SIZE 0x280000 - -static struct resource resources_wcnss_wlan[] = { - { - .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .name = "wcnss_wlanrx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .name = "wcnss_wlantx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_WCNSS_PHYS, - .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1, - .name = "wcnss_mmio", - .flags = IORESOURCE_MEM, - }, - { - .start = 64, - .end = 68, - .name = "wcnss_gpios_5wire", - .flags = IORESOURCE_IO, - }, -}; - -static struct qcom_wcnss_opts qcom_wcnss_pdata = { - .has_48mhz_xo = 1, -}; - -static struct platform_device msm_device_wcnss_wlan = { - .name = "wcnss_wlan", - .id = 0, - .num_resources = ARRAY_SIZE(resources_wcnss_wlan), - .resource = resources_wcnss_wlan, - .dev = {.platform_data = &qcom_wcnss_pdata}, -}; - -static struct platform_device msm_device_iris_fm = { - .name = "iris_fm", - .id = -1, -}; - -#ifdef CONFIG_QSEECOM -/* qseecom bus scaling */ -static struct msm_bus_vectors qseecom_clks_init_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 70000000UL, - .ib = 70000000UL, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 2480000000UL, - .ib = 2480000000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 70000000UL, - .ib = 70000000UL, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 2480000000UL, - .ib = 2480000000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(qseecom_clks_init_vectors), - qseecom_clks_init_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_vectors), - qseecom_enable_dfab_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_sfpb_vectors), - qseecom_enable_sfpb_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_sfpb_vectors), - qseecom_enable_dfab_sfpb_vectors, - }, -}; - -static struct msm_bus_scale_pdata qseecom_bus_pdata = { - qseecom_hw_bus_scale_usecases, - ARRAY_SIZE(qseecom_hw_bus_scale_usecases), - .name = "qsee", -}; - -static struct platform_device qseecom_device = { - .name = "qseecom", - .id = 0, - .dev = { - .platform_data = &qseecom_bus_pdata, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0x11000000 - -#define QCE_HW_KEY_SUPPORT 0 -#define QCE_SHA_HMAC_SUPPORT 1 -#define QCE_SHARE_CE_RESOURCE 3 -#define QCE_CE_SHARED 0 - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV8064_CE_IN_CHAN, - .end = DMOV8064_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV8064_CE_IN_CRCI, - .end = DMOV8064_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV8064_CE_OUT_CRCI, - .end = DMOV8064_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV8064_CE_IN_CHAN, - .end = DMOV8064_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV8064_CE_IN_CRCI, - .end = DMOV8064_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV8064_CE_OUT_CRCI, - .end = DMOV8064_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -static struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -static struct mdm_vddmin_resource mdm_vddmin_rscs = { - .rpm_id = MSM_RPM_ID_VDDMIN_GPIO, - .ap2mdm_vddmin_gpio = 30, - .modes = 0x03, - .drive_strength = 8, - .mdm2ap_vddmin_gpio = 80, -}; - -static struct gpiomux_setting mdm2ap_status_gpio_run_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct mdm_platform_data mdm_platform_data = { - .mdm_version = "3.0", - .ramdump_delay_ms = 2000, - .early_power_on = 1, - .sfr_query = 1, - .send_shdn = 1, - .vddmin_resource = &mdm_vddmin_rscs, - .peripheral_platform_device = &apq8064_device_hsic_host, - .ramdump_timeout_ms = 120000, - .mdm2ap_status_gpio_run_cfg = &mdm2ap_status_gpio_run_cfg, - .sysmon_subsys_id_valid = 1, - .sysmon_subsys_id = SYSMON_SS_EXT_MODEM, -}; - -static struct tsens_platform_data apq_tsens_pdata = { - .tsens_factor = 1000, - .hw_type = APQ_8064, - .tsens_num_sensor = 11, - .slope = {1176, 1176, 1154, 1176, 1111, - 1132, 1132, 1199, 1132, 1199, 1132}, -}; - -static struct platform_device msm_tsens_device = { - .name = "tsens8960-tm", - .id = -1, -}; - -static struct msm_thermal_data msm_thermal_pdata = { - .sensor_id = 7, - .poll_ms = 250, - .limit_temp_degC = 60, - .temp_hysteresis_degC = 10, - .freq_step = 2, -}; - -#define MSM_SHARED_RAM_PHYS 0x80000000 -static void __init apq8064_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_apq8064_io(); - if (socinfo_init() < 0) - pr_err("%s: socinfo_init() failed\n", __func__); -} - -static void __init apq8064_init_irq(void) -{ - struct msm_mpm_device_data *data = NULL; - -#ifdef CONFIG_MSM_MPM - data = &apq8064_mpm_dev_data; -#endif - - msm_mpm_irq_extn_init(data); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, - (void *)MSM_QGIC_CPU_BASE); -} - -static struct msm_mhl_platform_data mhl_platform_data = { - .irq = MSM_GPIO_TO_INT(MHL_GPIO_INT), - .gpio_mhl_int = MHL_GPIO_INT, - .gpio_mhl_reset = MHL_GPIO_RESET, - .gpio_mhl_power = 0, - .gpio_hdmi_mhl_mux = 0, -}; - -static struct i2c_board_info sii_device_info[] __initdata = { - { - /* - * keeps SI 8334 as the default - * MHL TX - */ - I2C_BOARD_INFO("sii8334", 0x39), - .platform_data = &mhl_platform_data, - .flags = I2C_CLIENT_WAKE, - }, -}; - -static struct platform_device msm8064_device_saw_regulator_core0 = { - .name = "saw-regulator", - .id = 0, - .dev = { - .platform_data = &msm8064_saw_regulator_pdata_8921_s5, - }, -}; - -static struct platform_device msm8064_device_saw_regulator_core1 = { - .name = "saw-regulator", - .id = 1, - .dev = { - .platform_data = &msm8064_saw_regulator_pdata_8921_s6, - }, -}; - -static struct platform_device msm8064_device_saw_regulator_core2 = { - .name = "saw-regulator", - .id = 2, - .dev = { - .platform_data = &msm8064_saw_regulator_pdata_8821_s0, - }, -}; - -static struct platform_device msm8064_device_saw_regulator_core3 = { - .name = "saw-regulator", - .id = 3, - .dev = { - .platform_data = &msm8064_saw_regulator_pdata_8821_s1, - - }, -}; - -static struct msm_rpmrs_level msm_rpmrs_levels[] = { - { - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1, 784, 180000, 100, - }, - - { - MSM_PM_SLEEP_MODE_RETENTION, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 415, 715, 340827, 475, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1300, 228, 1200000, 2000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE), - false, - 2000, 138, 1208400, 3200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 6000, 119, 1850300, 9000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE), - false, - 9200, 68, 2839200, 16400, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), - false, - 10300, 63, 3128000, 18200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 18000, 10, 4602600, 27000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW), - false, - 20000, 2, 5752000, 32000, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_TZ, -}; - -static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000, - [MSM_RPMRS_VDD_MEM_MAX] = 1150000, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 500000, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 950000, - [MSM_RPMRS_VDD_DIG_MAX] = 1150000, - }, - .vdd_mask = 0x7FFFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_PM8921_S3_0, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_PM8921_S3_1, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8921_L24_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8921_L24_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL, - }, -}; - -static uint8_t spm_wfi_cmd_sequence[] __initdata = { - 0x03, 0x0f, -}; - -static uint8_t spm_power_collapse_without_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x03, 0x01, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static uint8_t spm_retention_cmd_sequence[] __initdata = { - 0x00, 0x05, 0x03, 0x0D, - 0x0B, 0x00, 0x0f, -}; - -static uint8_t spm_retention_with_krait_v3_cmd_sequence[] __initdata = { - 0x42, 0x1B, 0x00, - 0x05, 0x03, 0x01, 0x0B, - 0x00, 0x42, 0x1B, - 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x07, 0x01, 0x0B, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -/* 8064AB has a different command to assert apc_pdn */ -static uint8_t spm_power_collapse_without_rpm_krait_v3[] __initdata = { - 0x00, 0x24, 0x84, 0x10, - 0x09, 0x03, 0x01, - 0x10, 0x84, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm_krait_v3[] __initdata = { - 0x00, 0x24, 0x84, 0x10, - 0x09, 0x07, 0x01, 0x0B, - 0x10, 0x84, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static struct msm_spm_seq_entry msm_spm_boot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; -static struct msm_spm_seq_entry msm_spm_nonboot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x03, 0x20, - 0x00, 0x0f, -}; - -static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x20, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0f, -}; -static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = { - 0x00, 0x10, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x10, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0F, -}; - -static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_L2_MODE_RETENTION, - .notify_rpm = false, - .cmd = l2_spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_L2_MODE_GDHS, - .notify_rpm = true, - .cmd = l2_spm_gdhs_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = l2_spm_power_off_cmd_sequence, - }, -}; - - -static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW_L2_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020, - .modes = msm_spm_l2_seq_list, - .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list), - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x03020004, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0084009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A4001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_boot_cpu_seq_list), - .modes = msm_spm_boot_cpu_seq_list, - }, - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list), - .modes = msm_spm_nonboot_cpu_seq_list, - }, - [2] = { - .reg_base_addr = MSM_SAW2_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list), - .modes = msm_spm_nonboot_cpu_seq_list, - }, - [3] = { - .reg_base_addr = MSM_SAW3_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list), - .modes = msm_spm_nonboot_cpu_seq_list, - }, -}; - -static void __init apq8064ab_update_krait_spm(void) -{ - int i; - - /* Update the SPM sequences for SPC and PC */ - for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) { - int j; - struct msm_spm_platform_data *pdata = &msm_spm_data[i]; - for (j = 0; j < pdata->num_modes; j++) { - if (pdata->modes[j].cmd == - spm_power_collapse_without_rpm) - pdata->modes[j].cmd = - spm_power_collapse_without_rpm_krait_v3; - else if (pdata->modes[j].cmd == - spm_power_collapse_with_rpm) - pdata->modes[j].cmd = - spm_power_collapse_with_rpm_krait_v3; - } - } -} - -static void __init apq8064_init_buses(void) -{ - msm_bus_rpm_set_mt_mask(); - msm_bus_8064_apps_fabric_pdata.rpm_enabled = 1; - msm_bus_8064_sys_fabric_pdata.rpm_enabled = 1; - msm_bus_8064_mm_fabric_pdata.rpm_enabled = 1; - msm_bus_8064_apps_fabric.dev.platform_data = - &msm_bus_8064_apps_fabric_pdata; - msm_bus_8064_sys_fabric.dev.platform_data = - &msm_bus_8064_sys_fabric_pdata; - msm_bus_8064_mm_fabric.dev.platform_data = - &msm_bus_8064_mm_fabric_pdata; - msm_bus_8064_sys_fpb.dev.platform_data = &msm_bus_8064_sys_fpb_pdata; - msm_bus_8064_cpss_fpb.dev.platform_data = &msm_bus_8064_cpss_fpb_pdata; -} - -/* PCIe gpios */ -static struct msm_pcie_gpio_info_t msm_pcie_gpio_info[MSM_PCIE_MAX_GPIO] = { - {"rst_n", PM8921_MPP_PM_TO_SYS(PCIE_RST_N_PMIC_MPP), 0}, - {"pwr_en", PM8921_GPIO_PM_TO_SYS(PCIE_PWR_EN_PMIC_GPIO), 1}, -}; - -static struct msm_pcie_platform msm_pcie_platform_data = { - .axi_addr = PCIE_AXI_BAR_PHYS, - .axi_size = PCIE_AXI_BAR_SIZE, - .parf_deemph = 0x282828, - .parf_swing = 0x7F7F, -}; - -/* FSM8064_EP PCIe gpios */ -static struct msm_pcie_gpio_info_t ep_pcie_gpio_info[MSM_PCIE_MAX_GPIO] = { - {"rst_n", PM8921_GPIO_PM_TO_SYS(PCIE_EP_RST_N_PMIC_GPIO), 0}, - {"pwr_en", PM8921_GPIO_PM_TO_SYS(PCIE_PWR_EN_PMIC_GPIO), 1}, -}; - -static struct msm_pcie_platform ep_pcie_platform_data = { - .gpio = ep_pcie_gpio_info, - .axi_addr = PCIE_AXI_BAR_PHYS, - .axi_size = PCIE_AXI_BAR_SIZE, - .wake_n = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, PCIE_EP_WAKE_N_PMIC_GPIO), - .vreg_n = 4, - .parf_deemph = 0x101010, - .parf_swing = 0x6B6B, -}; - -static int __init mpq8064_pcie_enabled(void) -{ - return !((readl_relaxed(QFPROM_RAW_FEAT_CONFIG_ROW0_MSB) & BIT(21)) || - (readl_relaxed(QFPROM_RAW_OEM_CONFIG_ROW0_LSB) & BIT(4))); -} - -static void __init mpq8064_pcie_init(void) -{ - if (mpq8064_pcie_enabled()) { - if (machine_is_mpq8064_hrd()) { - msm_pcie_platform_data.vreg_n = 3; - msm_pcie_gpio_info[1].num = - PM8921_GPIO_PM_TO_SYS(PCIE_PWR_EN_PMIC_GPIO_HRD); - msm_pcie_platform_data.wake_n = - PM8921_GPIO_IRQ(PM8921_IRQ_BASE, - PCIE_WAKE_N_PMIC_GPIO_HRD); - } else { - msm_pcie_platform_data.vreg_n = 4; - msm_pcie_platform_data.wake_n = - PM8921_GPIO_IRQ(PM8921_IRQ_BASE, - PCIE_WAKE_N_PMIC_GPIO); - } - msm_pcie_platform_data.gpio = msm_pcie_gpio_info; - - msm_device_pcie.dev.platform_data = &msm_pcie_platform_data; - platform_device_register(&msm_device_pcie); - } -} - -static struct platform_device mpq8064_device_ext_3p3v_vreg = { - .name = "reg-fixed-voltage", - .dev = { - .platform_data = &mpq8064_3p3_regulator_pdata, - }, -}; - -static void __init fsm8064_ep_pcie_init(void) -{ - msm_device_pcie.dev.platform_data = &ep_pcie_platform_data; - platform_device_register(&msm_device_pcie); -} - -static struct platform_device apq8064_device_ext_5v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_MPP_PM_TO_SYS(7), - .dev = { - .platform_data - = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V], - }, -}; - -static struct platform_device apq8064_device_ext_mpp8_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_MPP_PM_TO_SYS(8), - .dev = { - .platform_data - = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_MPP8], - }, -}; - -static struct platform_device apq8064_device_ext_3p3v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = APQ8064_EXT_3P3V_REG_EN_GPIO, - .dev = { - .platform_data = - &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_3P3V], - }, -}; - -static struct platform_device apq8064_device_ext_ts_sw_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_GPIO_PM_TO_SYS(23), - .dev = { - .platform_data - = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_TS_SW], - }, -}; - -static struct platform_device -apq8064_device_ext_3p3v_mpp4_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_MPP_PM_TO_SYS(4), - .dev = { - .platform_data = - &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_SATA_PWR], - }, -}; - -static struct platform_device apq8064_device_rpm_regulator = { - .name = "rpm-regulator", - .id = 0, - .dev = { - .platform_data = &apq8064_rpm_regulator_pdata, - }, -}; - -static struct platform_device -apq8064_pm8921_device_rpm_regulator = { - .name = "rpm-regulator", - .id = 1, - .dev = { - .platform_data = &apq8064_rpm_regulator_pm8921_pdata, - }, -}; - -static struct gpio_ir_recv_platform_data gpio_ir_recv_pdata = { - .gpio_nr = 88, - .active_low = 1, - .can_wakeup = true, -}; - -static struct platform_device gpio_ir_recv_pdev = { - .name = "gpio-rc-recv", - .dev = { - .platform_data = &gpio_ir_recv_pdata, - }, -}; - -static struct platform_device *common_not_mpq_devices[] __initdata = { - &apq8064_device_qup_i2c_gsbi1, - &apq8064_device_qup_i2c_gsbi3, - &apq8064_device_qup_i2c_gsbi4, -}; - -static struct platform_device *common_mpq_devices[] __initdata = { - &mpq_cpudai_sec_i2s_rx, - &mpq_cpudai_mi2s_tx, - &mpq_cpudai_pseudo, -}; - -static struct platform_device *ep_devices[] __initdata = { - &msm_device_smd_apq8064, - &apq8064_device_gadget_peripheral, - &apq8064_device_hsusb_host, - &android_usb_device, - &msm_device_wcnss_wlan, -#ifdef CONFIG_ION_MSM - &apq8064_ion_dev, -#endif - &msm8064_device_watchdog, - &msm8064_device_saw_regulator_core0, - &msm8064_device_saw_regulator_core1, - &msm8064_device_saw_regulator_core2, - &msm8064_device_saw_regulator_core3, -#if defined(CONFIG_QSEECOM) - &qseecom_device, -#endif - - &msm_8064_device_tsif[0], - &msm_8064_device_tsif[1], - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif - -#ifdef CONFIG_HW_RANDOM_MSM - &apq8064_device_rng, -#endif - &apq_pcm, - &apq_pcm_routing, - &apq8064_rpm_device, - &apq8064_rpm_log_device, - &apq8064_rpm_stat_device, - &apq8064_rpm_master_stat_device, - &apq_device_tz_log, - &msm_bus_8064_apps_fabric, - &msm_bus_8064_sys_fabric, - &msm_bus_8064_mm_fabric, - &msm_bus_8064_sys_fpb, - &msm_bus_8064_cpss_fpb, - &msm_pil_dsps, - &msm_8960_q6_lpass, - &apq8064_rtb_device, - &apq8064_dcvs_device, - &apq8064_msm_gov_device, - &apq8064_device_cache_erp, - &msm8960_device_ebi1_ch0_erp, - &msm8960_device_ebi1_ch1_erp, - &epm_adc_device, - &coresight_tpiu_device, - &coresight_etb_device, - &apq8064_coresight_funnel_device, - &coresight_etm0_device, - &coresight_etm1_device, - &coresight_etm2_device, - &coresight_etm3_device, -#ifdef CONFIG_MSM_GEMINI - &msm8960_gemini_device, -#endif - &msm_tsens_device, - &apq8064_cache_dump_device, - &msm_8064_device_tspp, -#ifdef CONFIG_BATTERY_BCL - &battery_bcl_device, -#endif - &apq8064_msm_mpd_device, - &apq8064_device_qup_i2c_gsbi1, - &apq8064_device_uart_gsbi2, - &apq8064_device_uart_gsbi1, - &apq8064_device_uart_gsbi4, - &msm_device_sps_apq8064, -}; - -static struct platform_device *common_i2s_devices[] __initdata = { - &apq_cpudai_mi2s, - &apq_cpudai_i2s_rx, - &apq_cpudai_i2s_tx, -}; - -static struct platform_device *early_common_devices[] __initdata = { - &apq8064_device_acpuclk, - &apq8064_device_dmov, - &apq8064_device_qup_spi_gsbi5, -}; - -static struct platform_device *pm8921_common_devices[] __initdata = { - &apq8064_device_ext_5v_vreg, - &apq8064_device_ext_mpp8_vreg, - &apq8064_device_ext_3p3v_vreg, - &apq8064_device_ssbi_pmic1, - &apq8064_device_ssbi_pmic2, -}; - -static struct platform_device *pm8921_mpq_hrd_common_devices[] __initdata = { - &apq8064_device_ext_5v_vreg, - &apq8064_device_ext_mpp8_vreg, - &mpq8064_device_ext_3p3v_vreg, - &apq8064_device_ssbi_pmic1, - &apq8064_device_ssbi_pmic2, -}; - -static struct platform_device *pm8917_common_devices[] __initdata = { - &apq8064_device_ext_mpp8_vreg, - &apq8064_device_ext_3p3v_vreg, - &apq8064_device_ssbi_pmic1, - &apq8064_device_ssbi_pmic2, -}; - -static struct platform_device *common_devices[] __initdata = { - &msm_device_smd_apq8064, - &apq8064_device_otg, - &apq8064_device_gadget_peripheral, - &apq8064_device_hsusb_host, - &android_usb_device, - &msm_device_wcnss_wlan, - &msm_device_iris_fm, -#ifdef CONFIG_ION_MSM - &apq8064_ion_dev, -#endif - &msm8064_device_watchdog, - &msm8064_device_saw_regulator_core0, - &msm8064_device_saw_regulator_core1, - &msm8064_device_saw_regulator_core2, - &msm8064_device_saw_regulator_core3, -#if defined(CONFIG_QSEECOM) - &qseecom_device, -#endif - - &msm_8064_device_tsif[0], - &msm_8064_device_tsif[1], - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif - -#ifdef CONFIG_HW_RANDOM_MSM - &apq8064_device_rng, -#endif - &apq_pcm, - &apq_pcm_routing, - &apq_cpudai0, - &apq_cpudai1, - &apq_cpudai_hdmi_rx, - &apq_cpudai_bt_rx, - &apq_cpudai_bt_tx, - &apq_cpudai_fm_rx, - &apq_cpudai_fm_tx, - &apq_cpu_fe, - &apq_stub_codec, - &apq_voice, - &apq_voip, - &apq_lpa_pcm, - &apq_compr_dsp, - &apq_multi_ch_pcm, - &apq_lowlatency_pcm, - &apq_pcm_hostless, - &apq_cpudai_afe_01_rx, - &apq_cpudai_afe_01_tx, - &apq_cpudai_afe_02_rx, - &apq_cpudai_afe_02_tx, - &apq_pcm_afe, - &apq_cpudai_auxpcm_rx, - &apq_cpudai_auxpcm_tx, - &apq_cpudai_stub, - &apq_cpudai_slimbus_1_rx, - &apq_cpudai_slimbus_1_tx, - &apq_cpudai_slimbus_2_rx, - &apq_cpudai_slimbus_2_tx, - &apq_cpudai_slimbus_3_rx, - &apq_cpudai_slimbus_3_tx, - &apq8064_rpm_device, - &apq8064_rpm_log_device, - &apq8064_rpm_stat_device, - &apq8064_rpm_master_stat_device, - &apq_device_tz_log, - &msm_bus_8064_apps_fabric, - &msm_bus_8064_sys_fabric, - &msm_bus_8064_mm_fabric, - &msm_bus_8064_sys_fpb, - &msm_bus_8064_cpss_fpb, - &apq8064_msm_device_vidc, - &msm_pil_dsps, - &msm_8960_q6_lpass, - &msm_pil_vidc, - &msm_gss, - &apq8064_rtb_device, - &apq8064_dcvs_device, - &apq8064_msm_gov_device, - &apq8064_device_cache_erp, - &msm8960_device_ebi1_ch0_erp, - &msm8960_device_ebi1_ch1_erp, - &epm_adc_device, - &coresight_tpiu_device, - &coresight_etb_device, - &apq8064_coresight_funnel_device, - &coresight_etm0_device, - &coresight_etm1_device, - &coresight_etm2_device, - &coresight_etm3_device, - &apq_cpudai_slim_4_rx, - &apq_cpudai_slim_4_tx, -#ifdef CONFIG_MSM_GEMINI - &msm8960_gemini_device, -#endif - &apq8064_iommu_domain_device, - &msm_tsens_device, - &apq8064_cache_dump_device, - &msm_8064_device_tspp, -#ifdef CONFIG_BATTERY_BCL - &battery_bcl_device, -#endif - &apq8064_msm_mpd_device, -}; - -static struct platform_device *cdp_devices[] __initdata = { - &apq8064_device_uart_gsbi1, - &apq8064_device_uart_gsbi7, - &msm_device_sps_apq8064, -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &msm8064_cpu_slp_status, -}; - -static struct platform_device -mpq8064_device_ext_1p2_buck_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = SX150X_GPIO(4, 2), - .dev = { - .platform_data = - &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_1P2V], - }, -}; - -static struct platform_device -mpq8064_device_ext_1p8_buck_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = SX150X_GPIO(4, 4), - .dev = { - .platform_data = - &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_1P8V], - }, -}; - -static struct platform_device -mpq8064_device_ext_2p2_buck_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = SX150X_GPIO(4, 14), - .dev = { - .platform_data = - &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_2P2V], - }, -}; - -static struct platform_device -mpq8064_device_ext_5v_buck_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = SX150X_GPIO(4, 3), - .dev = { - .platform_data = - &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_5V], - }, -}; - -static struct platform_device -mpq8064_device_ext_3p3v_ldo_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = SX150X_GPIO(4, 15), - .dev = { - .platform_data = - &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_3P3V], - }, -}; - -static struct platform_device rc_input_loopback_pdev = { - .name = "rc-user-input", - .id = -1, -}; - -static struct platform_device sp_input_loopback_pdev = { - .name = "sp-user-input", - .id = -1, -}; - -static int rf4ce_gpio_init(void) -{ - if (!machine_is_mpq8064_cdp() && - !machine_is_mpq8064_hrd() && - !machine_is_mpq8064_dtv()) - return -EINVAL; - - /* CC2533 SRDY Input */ - if (!gpio_request(SX150X_GPIO(4, 6), "rf4ce_srdy")) { - gpio_direction_input(SX150X_GPIO(4, 6)); - gpio_export(SX150X_GPIO(4, 6), true); - } - - /* CC2533 MRDY Output */ - if (!gpio_request(SX150X_GPIO(4, 5), "rf4ce_mrdy")) { - gpio_direction_output(SX150X_GPIO(4, 5), 1); - gpio_export(SX150X_GPIO(4, 5), true); - } - - /* CC2533 Reset Output */ - if (!gpio_request(SX150X_GPIO(4, 7), "rf4ce_reset")) { - gpio_direction_output(SX150X_GPIO(4, 7), 0); - gpio_export(SX150X_GPIO(4, 7), true); - } - - return 0; -} -late_initcall(rf4ce_gpio_init); - -#ifdef CONFIG_SERIAL_MSM_HS -static int configure_uart_gpios(int on) -{ - int ret = 0, i; - int uart_gpios[] = {14, 15, 16, 17}; - - for (i = 0; i < ARRAY_SIZE(uart_gpios); i++) { - if (on) { - ret = gpio_request(uart_gpios[i], NULL); - if (ret) { - pr_err("%s:unable to request uart gpio[%d]\n", - __func__, uart_gpios[i]); - break; - } - } else { - gpio_free(uart_gpios[i]); - } - } - - if (ret && on && i) - for (; i >= 0; i--) - gpio_free(uart_gpios[i]); - return ret; -} - -static struct msm_serial_hs_platform_data mpq8064_gsbi6_uartdm_pdata = { - .inject_rx_on_wakeup = 1, - .rx_to_inject = 0xFD, - .gpio_config = configure_uart_gpios, -}; -#else -static struct msm_serial_hs_platform_data msm_uart_dm9_pdata; -#endif - -static struct platform_device *mpq_devices[] __initdata = { - &mpq8064_device_uart_gsbi5, - &msm_device_sps_apq8064, - &mpq8064_device_qup_i2c_gsbi5, -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &gpio_ir_recv_pdev, - &mpq8064_device_ext_1p2_buck_vreg, - &mpq8064_device_ext_1p8_buck_vreg, - &mpq8064_device_ext_2p2_buck_vreg, - &mpq8064_device_ext_5v_buck_vreg, - &mpq8064_device_ext_3p3v_ldo_vreg, -#ifdef CONFIG_MSM_VCAP - &msm8064_device_vcap, -#endif - &rc_input_loopback_pdev, - &mpq8064_device_qup_spi_gsbi6, - &sp_input_loopback_pdev, -}; - -static struct msm_spi_platform_data apq8064_qup_spi_gsbi5_pdata = { - .max_clock_speed = 1100000, -}; - -static struct msm_spi_platform_data mpq8064_qup_spi_gsbi6_pdata = { - .max_clock_speed = 10800000, -}; - -static struct ci_bridge_platform_data mpq8064_ci_bridge_pdata = { - .reset_pin = 260, - .interrupt_pin = 261, -}; - -#define KS8851_IRQ_GPIO 43 - -static struct spi_board_info spi_board_info[] __initdata = { - { - .modalias = "ks8851", - .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO), - .max_speed_hz = 19200000, - .bus_num = 0, - .chip_select = 2, - .mode = SPI_MODE_0, - }, - { - .modalias = "epm_adc", - .max_speed_hz = 1100000, - .bus_num = 0, - .chip_select = 3, - .mode = SPI_MODE_0, - } -}; - -static struct spi_board_info mpq8064_spi_board_info[] __initdata = { - { - .modalias = "ci_bridge_spi", - .max_speed_hz = 1000000, - .bus_num = 1, - .chip_select = 0, - .mode = SPI_MODE_0, - .platform_data = &mpq8064_ci_bridge_pdata, - }, -}; - -static struct slim_boardinfo apq8064_slim_devices[] = { - { - .bus_num = 1, - .slim_slave = &apq8064_slim_tabla, - }, - { - .bus_num = 1, - .slim_slave = &apq8064_slim_tabla20, - }, - /* add more slimbus slaves as needed */ -}; - -static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi1_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi3_pdata = { - .clk_freq = 384000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi4_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data mpq8064_i2c_qup_gsbi5_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -#define GSBI_DUAL_MODE_CODE 0x60 -#define MSM_GSBI1_PHYS 0x12440000 -#define MSM_GSBI5_PHYS 0x1A200000 -static void __init apq8064_i2c_init(void) -{ - void __iomem *gsbi_mem; - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) { - gsbi_mem = ioremap_nocache(MSM_GSBI5_PHYS, 4); - writel_relaxed(GSBI_DUAL_MODE_CODE, gsbi_mem); - /* Ensure protocol code is written before proceeding */ - wmb(); - iounmap(gsbi_mem); - mpq8064_i2c_qup_gsbi5_pdata.use_gsbi_shared_mode = 1; - mpq8064_device_qup_i2c_gsbi5.dev.platform_data = - &mpq8064_i2c_qup_gsbi5_pdata; - } - apq8064_device_qup_i2c_gsbi1.dev.platform_data = - &apq8064_i2c_qup_gsbi1_pdata; - gsbi_mem = ioremap_nocache(MSM_GSBI1_PHYS, 4); - writel_relaxed(GSBI_DUAL_MODE_CODE, gsbi_mem); - /* Ensure protocol code is written before proceeding */ - wmb(); - iounmap(gsbi_mem); - apq8064_i2c_qup_gsbi1_pdata.use_gsbi_shared_mode = 1; - apq8064_device_qup_i2c_gsbi1.dev.platform_data = - &apq8064_i2c_qup_gsbi1_pdata; - if (!machine_is_fsm8064_ep()) { - apq8064_device_qup_i2c_gsbi3.dev.platform_data = - &apq8064_i2c_qup_gsbi3_pdata; - apq8064_device_qup_i2c_gsbi4.dev.platform_data = - &apq8064_i2c_qup_gsbi4_pdata; - } - mpq8064_device_qup_i2c_gsbi5.dev.platform_data = - &mpq8064_i2c_qup_gsbi5_pdata; -} - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static int ethernet_init(void) -{ - int ret; - ret = gpio_request(KS8851_IRQ_GPIO, "ks8851_irq"); - if (ret) { - pr_err("ks8851 gpio_request failed: %d\n", ret); - goto fail; - } - - return 0; -fail: - return ret; -} -#else -static int ethernet_init(void) -{ - return 0; -} -#endif - -#define GPIO_KEY_HOME PM8921_GPIO_PM_TO_SYS(27) -#define GPIO_KEY_VOLUME_UP PM8921_GPIO_PM_TO_SYS(35) -#define GPIO_KEY_VOLUME_DOWN_PM8921 PM8921_GPIO_PM_TO_SYS(38) -#define GPIO_KEY_VOLUME_DOWN_PM8917 PM8921_GPIO_PM_TO_SYS(30) -#define GPIO_KEY_CAM_FOCUS PM8921_GPIO_PM_TO_SYS(3) -#define GPIO_KEY_CAM_SNAP PM8921_GPIO_PM_TO_SYS(4) -#define GPIO_KEY_ROTATION_PM8921 PM8921_GPIO_PM_TO_SYS(42) -#define GPIO_KEY_ROTATION_PM8917 PM8921_GPIO_PM_TO_SYS(8) - -static struct gpio_keys_button cdp_keys_pm8921[] = { - { - .code = KEY_HOME, - .gpio = GPIO_KEY_HOME, - .desc = "home_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEUP, - .gpio = GPIO_KEY_VOLUME_UP, - .desc = "volume_up_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .gpio = GPIO_KEY_VOLUME_DOWN_PM8921, - .desc = "volume_down_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = SW_ROTATE_LOCK, - .gpio = GPIO_KEY_ROTATION_PM8921, - .desc = "rotate_key", - .active_low = 1, - .type = EV_SW, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_button cdp_keys_pm8917[] = { - { - .code = KEY_HOME, - .gpio = GPIO_KEY_HOME, - .desc = "home_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEUP, - .gpio = GPIO_KEY_VOLUME_UP, - .desc = "volume_up_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .gpio = GPIO_KEY_VOLUME_DOWN_PM8917, - .desc = "volume_down_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = SW_ROTATE_LOCK, - .gpio = GPIO_KEY_ROTATION_PM8917, - .desc = "rotate_key", - .active_low = 1, - .type = EV_SW, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_platform_data cdp_keys_data = { - .buttons = cdp_keys_pm8921, - .nbuttons = ARRAY_SIZE(cdp_keys_pm8921), -}; - -static struct platform_device cdp_kp_pdev = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &cdp_keys_data, - }, -}; - -static struct gpio_keys_button mtp_keys[] = { - { - .code = KEY_CAMERA_FOCUS, - .gpio = GPIO_KEY_CAM_FOCUS, - .desc = "cam_focus_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEUP, - .gpio = GPIO_KEY_VOLUME_UP, - .desc = "volume_up_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .gpio = GPIO_KEY_VOLUME_DOWN_PM8921, - .desc = "volume_down_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_CAMERA_SNAPSHOT, - .gpio = GPIO_KEY_CAM_SNAP, - .desc = "cam_snap_key", - .active_low = 1, - .type = EV_KEY, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_platform_data mtp_keys_data = { - .buttons = mtp_keys, - .nbuttons = ARRAY_SIZE(mtp_keys), -}; - -static struct platform_device mtp_kp_pdev = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &mtp_keys_data, - }, -}; - -#define MPQ_HRD_HOME_GPIO SX150X_EXP2_GPIO_BASE -#define MPQ_HRD_VOL_UP_GPIO (SX150X_EXP2_GPIO_BASE + 1) -#define MPQ_HRD_VOL_DOWN_GPIO (SX150X_EXP2_GPIO_BASE + 2) -#define MPQ_HRD_RIGHT_GPIO (SX150X_EXP2_GPIO_BASE + 3) -#define MPQ_HRD_LEFT_GPIO (SX150X_EXP2_GPIO_BASE + 4) -#define MPQ_HRD_ENTER_GPIO (SX150X_EXP2_GPIO_BASE + 5) - -static struct gpio_keys_button mpq_hrd_keys[] = { - { - .code = KEY_HOME, - .gpio = MPQ_HRD_HOME_GPIO, - .desc = "home_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEUP, - .gpio = MPQ_HRD_VOL_UP_GPIO, - .desc = "volume_up_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .gpio = MPQ_HRD_VOL_DOWN_GPIO, - .desc = "volume_down_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_RIGHT, - .gpio = MPQ_HRD_RIGHT_GPIO, - .desc = "right_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_LEFT, - .gpio = MPQ_HRD_LEFT_GPIO, - .desc = "left_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_ENTER, - .gpio = MPQ_HRD_ENTER_GPIO, - .desc = "enter_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_platform_data mpq_hrd_keys_pdata = { - .buttons = mpq_hrd_keys, - .nbuttons = ARRAY_SIZE(mpq_hrd_keys), -}; - -static struct platform_device mpq_hrd_keys_pdev = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &mpq_hrd_keys_pdata, - }, -}; - -static struct gpio_keys_button mpq_keys[] = { - { - .code = KEY_VOLUMEDOWN, - .gpio = GPIO_KEY_VOLUME_DOWN_PM8921, - .desc = "volume_down_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEUP, - .gpio = GPIO_KEY_VOLUME_UP, - .desc = "volume_up_key", - .active_low = 1, - .type = EV_KEY, - .wakeup = 1, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_platform_data mpq_keys_data = { - .buttons = mpq_keys, - .nbuttons = ARRAY_SIZE(mpq_keys), -}; - -static struct platform_device mpq_gpio_keys_pdev = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &mpq_keys_data, - }, -}; - -#define MPQ_KP_ROW_BASE SX150X_EXP2_GPIO_BASE -#define MPQ_KP_COL_BASE (SX150X_EXP2_GPIO_BASE + 4) - -static unsigned int mpq_row_gpios[] = {MPQ_KP_ROW_BASE, MPQ_KP_ROW_BASE + 1, - MPQ_KP_ROW_BASE + 2, MPQ_KP_ROW_BASE + 3}; -static unsigned int mpq_col_gpios[] = {MPQ_KP_COL_BASE, MPQ_KP_COL_BASE + 1, - MPQ_KP_COL_BASE + 2}; - -static const unsigned int mpq_keymap[] = { - KEY(0, 0, KEY_UP), - KEY(0, 1, KEY_ENTER), - KEY(0, 2, KEY_3), - - KEY(1, 0, KEY_DOWN), - KEY(1, 1, KEY_EXIT), - KEY(1, 2, KEY_4), - - KEY(2, 0, KEY_LEFT), - KEY(2, 1, KEY_1), - KEY(2, 2, KEY_5), - - KEY(3, 0, KEY_RIGHT), - KEY(3, 1, KEY_2), - KEY(3, 2, KEY_6), -}; - -static struct matrix_keymap_data mpq_keymap_data = { - .keymap_size = ARRAY_SIZE(mpq_keymap), - .keymap = mpq_keymap, -}; - -static struct matrix_keypad_platform_data mpq_keypad_data = { - .keymap_data = &mpq_keymap_data, - .row_gpios = mpq_row_gpios, - .col_gpios = mpq_col_gpios, - .num_row_gpios = ARRAY_SIZE(mpq_row_gpios), - .num_col_gpios = ARRAY_SIZE(mpq_col_gpios), - .col_scan_delay_us = 32000, - .debounce_ms = 20, - .wakeup = 1, - .active_low = 1, - .no_autorepeat = 1, -}; - -static struct platform_device mpq_keypad_device = { - .name = "matrix-keypad", - .id = -1, - .dev = { - .platform_data = &mpq_keypad_data, - }, -}; - -static struct platform_device msm_dev_avtimer_device = { - .name = "dev_avtimer", - .dev = { .platform_data = &dev_avtimer_pdata }, -}; - -/* Sensors DSPS platform data */ -#define DSPS_PIL_GENERIC_NAME "dsps" -static void __init apq8064_init_dsps(void) -{ - struct msm_dsps_platform_data *pdata = - msm_dsps_device_8064.dev.platform_data; - pdata->pil_name = DSPS_PIL_GENERIC_NAME; - pdata->gpios = NULL; - pdata->gpios_num = 0; - - platform_device_register(&msm_dsps_device_8064); -} - -#define I2C_SURF 1 -#define I2C_FFA (1 << 1) -#define I2C_RUMI (1 << 2) -#define I2C_SIM (1 << 3) -#define I2C_LIQUID (1 << 4) -#define I2C_MPQ_CDP BIT(5) -#define I2C_MPQ_HRD BIT(6) -#define I2C_MPQ_DTV BIT(7) - -struct i2c_registry { - u8 machs; - int bus; - struct i2c_board_info *info; - int len; -}; - -static struct i2c_registry apq8064_i2c_devices[] __initdata = { - { - I2C_LIQUID, - APQ_8064_GSBI1_QUP_I2C_BUS_ID, - smb349_charger_i2c_info, - ARRAY_SIZE(smb349_charger_i2c_info) - }, - { - I2C_SURF | I2C_LIQUID, - APQ_8064_GSBI3_QUP_I2C_BUS_ID, - mxt_device_info, - ARRAY_SIZE(mxt_device_info), - }, - { - I2C_FFA, - APQ_8064_GSBI3_QUP_I2C_BUS_ID, - cyttsp_info, - ARRAY_SIZE(cyttsp_info), - }, - { - I2C_FFA | I2C_LIQUID, - APQ_8064_GSBI1_QUP_I2C_BUS_ID, - isa1200_board_info, - ARRAY_SIZE(isa1200_board_info), - }, - { - I2C_MPQ_CDP, - APQ_8064_GSBI5_QUP_I2C_BUS_ID, - cs8427_device_info, - ARRAY_SIZE(cs8427_device_info), - }, - { - I2C_SURF | I2C_FFA | I2C_LIQUID, - APQ_8064_GSBI1_QUP_I2C_BUS_ID, - sii_device_info, - ARRAY_SIZE(sii_device_info), - } -}; - -static struct i2c_registry apq8064_tabla_i2c_devices[] __initdata = { - { - .bus = APQ_8064_GSBI1_QUP_I2C_BUS_ID, - .info = apq8064_tabla_i2c_device_info, - .len = ARRAY_SIZE(apq8064_tabla_i2c_device_info), - }, -}; - -#define SX150X_EXP1_INT_N PM8921_MPP_IRQ(PM8921_IRQ_BASE, 9) -#define SX150X_EXP2_INT_N MSM_GPIO_TO_INT(81) - -struct sx150x_platform_data mpq8064_sx150x_pdata[] = { - [SX150X_EXP1] = { - .gpio_base = SX150X_EXP1_GPIO_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0x0, - .io_open_drain_ena = 0x0, - .io_polarity = 0, - .irq_summary = SX150X_EXP1_INT_N, - .irq_base = SX150X_EXP1_IRQ_BASE, - }, - [SX150X_EXP2] = { - .gpio_base = SX150X_EXP2_GPIO_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0f, - .io_pulldn_ena = 0x70, - .io_open_drain_ena = 0x0, - .io_polarity = 0, - .irq_summary = SX150X_EXP2_INT_N, - .irq_base = SX150X_EXP2_IRQ_BASE, - }, - [SX150X_EXP3] = { - .gpio_base = SX150X_EXP3_GPIO_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0x0, - .io_open_drain_ena = 0x0, - .io_polarity = 0, - .irq_summary = -1, - }, - [SX150X_EXP4] = { - .gpio_base = SX150X_EXP4_GPIO_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0x0, - .io_open_drain_ena = 0x0, - .io_polarity = 0, - .irq_summary = -1, - }, -}; - -static struct i2c_board_info sx150x_gpio_exp_info[] = { - { - I2C_BOARD_INFO("sx1509q", 0x70), - .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP1], - }, - { - I2C_BOARD_INFO("sx1508q", 0x23), - .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP2], - }, - { - I2C_BOARD_INFO("sx1508q", 0x22), - .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP3], - }, - { - I2C_BOARD_INFO("sx1509q", 0x3E), - .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP4], - }, -}; - -#define MPQ8064_I2C_GSBI5_BUS_ID 5 - -static struct i2c_registry mpq8064_i2c_devices[] __initdata = { - { - I2C_MPQ_CDP, - MPQ8064_I2C_GSBI5_BUS_ID, - sx150x_gpio_exp_info, - ARRAY_SIZE(sx150x_gpio_exp_info), - }, -}; - -static void __init register_i2c_devices(void) -{ - u8 mach_mask = 0; - int i; - u32 version; - -#ifdef CONFIG_MSM_CAMERA - struct i2c_registry apq8064_camera_i2c_devices = { - I2C_SURF | I2C_FFA | I2C_LIQUID | I2C_RUMI, - APQ_8064_GSBI4_QUP_I2C_BUS_ID, - apq8064_camera_board_info.board_info, - apq8064_camera_board_info.num_i2c_board_info, - }; -#endif - /* Build the matching 'supported_machs' bitmask */ - if (machine_is_apq8064_cdp()) - mach_mask = I2C_SURF; - else if (machine_is_apq8064_mtp()) - mach_mask = I2C_FFA; - else if (machine_is_apq8064_liquid()) - mach_mask = I2C_LIQUID; - else if (PLATFORM_IS_MPQ8064()) - mach_mask = I2C_MPQ_CDP; - else if (machine_is_fsm8064_ep()) - mach_mask = I2C_SURF; - else - pr_err("unmatched machine ID in register_i2c_devices\n"); - - /* Run the array and install devices as appropriate */ - for (i = 0; i < ARRAY_SIZE(apq8064_i2c_devices); ++i) { - if (apq8064_i2c_devices[i].machs & mach_mask) - i2c_register_board_info(apq8064_i2c_devices[i].bus, - apq8064_i2c_devices[i].info, - apq8064_i2c_devices[i].len); - } -#ifdef CONFIG_MSM_CAMERA - if (apq8064_camera_i2c_devices.machs & mach_mask) - i2c_register_board_info(apq8064_camera_i2c_devices.bus, - apq8064_camera_i2c_devices.info, - apq8064_camera_i2c_devices.len); -#endif - - for (i = 0; i < ARRAY_SIZE(mpq8064_i2c_devices); ++i) { - if (mpq8064_i2c_devices[i].machs & mach_mask) - i2c_register_board_info( - mpq8064_i2c_devices[i].bus, - mpq8064_i2c_devices[i].info, - mpq8064_i2c_devices[i].len); - } - - if (machine_is_apq8064_mtp()) { - version = socinfo_get_platform_version(); - if (SOCINFO_VERSION_MINOR(version) == 1) - for (i = 0; i < ARRAY_SIZE(apq8064_tabla_i2c_devices); - ++i) - i2c_register_board_info( - apq8064_tabla_i2c_devices[i].bus, - apq8064_tabla_i2c_devices[i].info, - apq8064_tabla_i2c_devices[i].len); - } - -} - -static void enable_avc_i2c_bus(void) -{ - int avc_i2c_en_mpp = PM8921_MPP_PM_TO_SYS(8); - int rc; - - rc = gpio_request(avc_i2c_en_mpp, "avc_i2c_en"); - if (rc) - pr_err("request for avc_i2c_en mpp failed," - "rc=%d\n", rc); - else - gpio_set_value_cansleep(avc_i2c_en_mpp, 1); -} - -/* Modify platform data values to match requirements for PM8917. */ -static void __init apq8064_pm8917_pdata_fixup(void) -{ - cdp_keys_data.buttons = cdp_keys_pm8917; - cdp_keys_data.nbuttons = ARRAY_SIZE(cdp_keys_pm8917); -} - -static void __init apq8064ab_update_retention_spm(void) -{ - int i; - - /* Update the SPM sequences for krait retention on all cores */ - for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) { - int j; - struct msm_spm_platform_data *pdata = &msm_spm_data[i]; - for (j = 0; j < pdata->num_modes; j++) { - if (pdata->modes[j].cmd == - spm_retention_cmd_sequence) - pdata->modes[j].cmd = - spm_retention_with_krait_v3_cmd_sequence; - } - } -} - -static void __init apq8064_common_init(void) -{ - u32 platform_version = socinfo_get_platform_version(); - struct msm_rpmrs_level rpmrs_level; - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - apq8064_pm8917_pdata_fixup(); - platform_device_register(&msm_gpio_device); - if (cpu_is_apq8064ab()) - apq8064ab_update_krait_spm(); - if (cpu_is_krait_v3()) { - struct msm_pm_init_data_type *pdata = - msm8064_pm_8x60.dev.platform_data; - pdata->retention_calls_tz = false; - apq8064ab_update_retention_spm(); - } - platform_device_register(&msm8064_pm_8x60); - - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); - msm_spm_l2_init(msm_spm_l2_data); - msm_tsens_early_init(&apq_tsens_pdata); - msm_thermal_init(&msm_thermal_pdata); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - BUG_ON(msm_rpm_init(&apq8064_rpm_data)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data)); - regulator_suppress_info_printing(); - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - configure_apq8064_pm8917_power_grid(); - platform_device_register(&apq8064_device_rpm_regulator); - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) - platform_device_register(&apq8064_pm8921_device_rpm_regulator); - if (msm_xo_init()) - pr_err("Failed to initialize XO votes\n"); - msm_clock_init(&apq8064_clock_init_data); - apq8064_init_gpiomux(); - apq8064_i2c_init(); - - /* configure sx150x parameters for HRD */ - if (machine_is_mpq8064_hrd()) { - mpq8064_sx150x_pdata[SX150X_EXP2].irq_summary = - PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 40); - mpq8064_sx150x_pdata[SX150X_EXP2].io_pullup_ena = 0xff; - mpq8064_sx150x_pdata[SX150X_EXP2].io_pulldn_ena = 0x00; - } - - register_i2c_devices(); - - apq8064_device_qup_spi_gsbi5.dev.platform_data = - &apq8064_qup_spi_gsbi5_pdata; - apq8064_init_pmic(); - if (machine_is_apq8064_liquid()) - msm_otg_pdata.mhl_enable = true; - - if (apq8064_mhl_display_enabled()) - mhl_platform_data.mhl_enabled = true; - - android_usb_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; - - apq8064_device_otg.dev.platform_data = &msm_otg_pdata; - apq8064_ehci_host_init(); - apq8064_init_buses(); - - platform_add_devices(early_common_devices, - ARRAY_SIZE(early_common_devices)); - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) { - if (!machine_is_mpq8064_hrd()) - platform_add_devices(pm8921_common_devices, - ARRAY_SIZE(pm8921_common_devices)); - else - platform_add_devices(pm8921_mpq_hrd_common_devices, - ARRAY_SIZE(pm8921_mpq_hrd_common_devices)); - } - else - platform_add_devices(pm8917_common_devices, - ARRAY_SIZE(pm8917_common_devices)); - if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid()) - platform_device_register(&apq8064_device_ext_ts_sw_vreg); - if (!machine_is_fsm8064_ep()) - platform_add_devices(common_devices, - ARRAY_SIZE(common_devices)); - if (!(machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv() || machine_is_fsm8064_ep())) - platform_add_devices(common_not_mpq_devices, - ARRAY_SIZE(common_not_mpq_devices)); - - if ((machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv())) - platform_add_devices(common_mpq_devices, - ARRAY_SIZE(common_mpq_devices)); - - if (machine_is_apq8064_mtp()) { - if (SOCINFO_VERSION_MINOR(platform_version) == 1) - platform_add_devices(common_i2s_devices, - ARRAY_SIZE(common_i2s_devices)); - } - - rpmrs_level = - msm_rpmrs_levels[MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT]; - msm_hsic_pdata.swfi_latency = rpmrs_level.latency_us; - rpmrs_level = - msm_rpmrs_levels[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE]; - msm_hsic_pdata.standalone_latency = rpmrs_level.latency_us; - if (machine_is_apq8064_mtp()) { - msm_hsic_pdata.log2_irq_thresh = 5, - apq8064_device_hsic_host.dev.platform_data = &msm_hsic_pdata; - device_initialize(&apq8064_device_hsic_host.dev); - } - apq8064_pm8xxx_gpio_mpp_init(); - apq8064_init_mmc(); - - if (machine_is_apq8064_mtp()) { - mdm_8064_device.dev.platform_data = &mdm_platform_data; - if (SOCINFO_VERSION_MINOR(platform_version) == 1) { - i2s_mdm_8064_device.dev.platform_data = - &mdm_platform_data; - platform_device_register(&i2s_mdm_8064_device); - } else { - mdm_8064_device.dev.platform_data = &mdm_platform_data; - platform_device_register(&mdm_8064_device); - } - } - platform_device_register(&apq8064_slim_ctrl); - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) { - apq8064_slim_devices[ARRAY_SIZE(apq8064_slim_devices) - 1].\ - slim_slave = &mpq8064_slim_ashiko20; - } - slim_register_board_info(apq8064_slim_devices, - ARRAY_SIZE(apq8064_slim_devices)); - if (!PLATFORM_IS_MPQ8064()) { - apq8064_init_dsps(); - platform_device_register(&msm_8960_riva); - } - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - apq8064_epm_adc_init(); -} - -static void __init apq8064_allocate_memory_regions(void) -{ - apq8064_allocate_fb_region(); -} - -static void __init apq8064_cdp_init(void) -{ - if (meminfo_init(SYS_MEMORY, SZ_256M) < 0) - pr_err("meminfo_init() failed!\n"); - if (machine_is_apq8064_mtp() && - SOCINFO_VERSION_MINOR(socinfo_get_platform_version()) == 1) - cyttsp_pdata.sleep_gpio = CYTTSP_TS_GPIO_SLEEP_ALT; - apq8064_common_init(); - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) { - gpio_ir_recv_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; - enable_avc_i2c_bus(); - msm_rotator_set_split_iommu_domain(); - - mpq8064_device_qup_spi_gsbi6.dev.platform_data = - &mpq8064_qup_spi_gsbi6_pdata; - - platform_add_devices(mpq_devices, ARRAY_SIZE(mpq_devices)); - mpq8064_pcie_init(); - spi_register_board_info(mpq8064_spi_board_info, - ARRAY_SIZE(mpq8064_spi_board_info)); - } else { - ethernet_init(); - msm_rotator_set_split_iommu_domain(); - platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices)); - spi_register_board_info(spi_board_info, - ARRAY_SIZE(spi_board_info)); - } - apq8064_init_fb(); - apq8064_init_gpu(); - platform_add_devices(apq8064_footswitch, apq8064_num_footswitch); -#ifdef CONFIG_MSM_CAMERA - apq8064_init_cam(); -#endif - - if (machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) { - platform_device_register(&mpq8064_device_uartdm_gsbi6); -#ifdef CONFIG_SERIAL_MSM_HS - /* GSBI6(2) - UARTDM_RX */ - mpq8064_gsbi6_uartdm_pdata.wakeup_irq = gpio_to_irq(15); - mpq8064_device_uartdm_gsbi6.dev.platform_data = - &mpq8064_gsbi6_uartdm_pdata; -#endif - } - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - if (machine_is_mpq8064_hrd()) - apq8064_bt_power_init(); -#endif - - if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid()) - platform_device_register(&cdp_kp_pdev); - - if (machine_is_apq8064_mtp()) - platform_device_register(&mtp_kp_pdev); - - if (machine_is_mpq8064_cdp()) { - platform_device_register(&mpq_gpio_keys_pdev); - platform_device_register(&mpq_keypad_device); - } else if (machine_is_mpq8064_hrd()) - platform_device_register(&mpq_hrd_keys_pdev); - if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() || - machine_is_mpq8064_dtv()) - platform_device_register(&msm_dev_avtimer_device); - - if (machine_is_apq8064_cdp() || machine_is_mpq8064_hrd()) { - int ret; - struct pm8xxx_mpp_config_data sata_pwr_cfg = { - .type = PM8XXX_MPP_TYPE_D_OUTPUT, - .level = PM8921_MPP_DIG_LEVEL_VPH, - .control = PM8XXX_MPP_DOUT_CTRL_HIGH, - }; - - /* Apply MPP-4 init only when it is used to control SATA PWR */ - ret = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(4), &sata_pwr_cfg); - if (ret) - pr_err("%s: pm8921 MPP %d init config failed(%d)\n", - __func__, PM8921_MPP_PM_TO_SYS(4), ret); - platform_device_register(&apq8064_device_ext_3p3v_mpp4_vreg); - platform_device_register(&apq8064_device_sata); - } -} - -static void __init fsm8064_ep_init(void) -{ - if (meminfo_init(SYS_MEMORY, SZ_256M) < 0) - pr_err("meminfo_init() failed!\n"); - - msm_thermal_pdata.limit_temp_degC = 80; - - apq8064_common_init(); - ethernet_init(); - fsm8064_ep_pcie_init(); - platform_add_devices(ep_devices, ARRAY_SIZE(ep_devices)); - spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); - apq8064_init_gpu(); - platform_device_register(&cdp_kp_pdev); -#ifdef CONFIG_MSM_CAMERA - apq8064_init_cam(); -#endif -} - -MACHINE_START(APQ8064_CDP, "QCT APQ8064 CDP") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(FSM8064_EP, "QCT FSM8064 EP") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = fsm8064_ep_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(APQ8064_MTP, "QCT APQ8064 MTP") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(APQ8064_LIQUID, "QCT APQ8064 LIQUID") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MPQ8064_CDP, "QCT MPQ8064 CDP") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MPQ8064_HRD, "QCT MPQ8064 HRD") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MPQ8064_DTV, "QCT MPQ8064 DTV") - .map_io = apq8064_map_io, - .reserve = apq8064_reserve, - .init_irq = apq8064_init_irq, - .init_time = msm_timer_init, - .init_machine = apq8064_cdp_init, - .init_early = apq8064_allocate_memory_regions, - .init_very_early = apq8064_early_reserve, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-8064.h b/arch/arm/mach-msm/board-8064.h deleted file mode 100644 index de6ebb2cc5c1..000000000000 --- a/arch/arm/mach-msm/board-8064.h +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_APQ8064_H -#define __ARCH_ARM_MACH_MSM_BOARD_APQ8064_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Macros assume PMIC GPIOs and MPPs start at 1 */ -#define PM8921_GPIO_BASE NR_GPIO_IRQS -#define PM8921_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8921_GPIO_BASE) -#define PM8921_MPP_BASE (PM8921_GPIO_BASE + PM8921_NR_GPIOS) -#define PM8921_MPP_PM_TO_SYS(pm_mpp) (pm_mpp - 1 + PM8921_MPP_BASE) -#define PM8921_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS) - -#define PM8821_MPP_BASE (PM8921_MPP_BASE + PM8921_NR_MPPS) -#define PM8821_MPP_PM_TO_SYS(pm_mpp) (pm_mpp - 1 + PM8821_MPP_BASE) -#define PM8821_IRQ_BASE (PM8921_IRQ_BASE + PM8921_NR_IRQS) - -#define TABLA_INTERRUPT_BASE (PM8821_IRQ_BASE + PM8821_NR_IRQS) - -extern struct pm8xxx_regulator_platform_data - msm8064_pm8921_regulator_pdata[] ; - -extern int msm8064_pm8921_regulator_pdata_len ; - -extern struct pm8xxx_regulator_platform_data - msm8064_pm8917_regulator_pdata[] ; - -extern int msm8064_pm8917_regulator_pdata_len ; - -#define GPIO_VREG_ID_EXT_5V 0 -#define GPIO_VREG_ID_EXT_3P3V 1 -#define GPIO_VREG_ID_EXT_TS_SW 2 -#define GPIO_VREG_ID_EXT_MPP8 3 -#define GPIO_VREG_ID_EXT_SATA_PWR 4 - -#define GPIO_VREG_ID_AVC_1P2V 0 -#define GPIO_VREG_ID_AVC_1P8V 1 -#define GPIO_VREG_ID_AVC_2P2V 2 -#define GPIO_VREG_ID_AVC_5V 3 -#define GPIO_VREG_ID_AVC_3P3V 4 - -#define APQ8064_EXT_3P3V_REG_EN_GPIO 77 - -extern struct gpio_regulator_platform_data - apq8064_gpio_regulator_pdata[] ; - -extern struct gpio_regulator_platform_data - mpq8064_gpio_regulator_pdata[] ; - -extern struct fixed_voltage_config mpq8064_3p3_regulator_pdata; - -extern struct rpm_regulator_platform_data - apq8064_rpm_regulator_pdata ; - -extern struct rpm_regulator_platform_data - apq8064_rpm_regulator_pm8921_pdata ; - -extern struct regulator_init_data msm8064_saw_regulator_pdata_8921_s5; -extern struct regulator_init_data msm8064_saw_regulator_pdata_8921_s6; -extern struct regulator_init_data msm8064_saw_regulator_pdata_8821_s0; -extern struct regulator_init_data msm8064_saw_regulator_pdata_8821_s1; - -struct mmc_platform_data; -int __init apq8064_add_sdcc(unsigned int controller, - struct mmc_platform_data *plat); - -void apq8064_init_mmc(void); -void apq8064_init_gpiomux(void); -void apq8064_init_pmic(void); - -extern struct msm_camera_board_info apq8064_camera_board_info; -void apq8064_init_cam(void); - - -/* Tabla slave address for I2C */ -#define APQ_8064_TABLA_I2C_SLAVE_ADDR 0x0d -#define APQ_8064_TABLA_ANALOG_I2C_SLAVE_ADDR 0x77 -#define APQ_8064_TABLA_DIGITAL1_I2C_SLAVE_ADDR 0x66 -#define APQ_8064_TABLA_DIGITAL2_I2C_SLAVE_ADDR 0x55 - -#define APQ_8064_GSBI1_QUP_I2C_BUS_ID 0 -#define APQ_8064_GSBI3_QUP_I2C_BUS_ID 3 -#define APQ_8064_GSBI4_QUP_I2C_BUS_ID 4 -#define APQ_8064_GSBI5_QUP_I2C_BUS_ID 5 - -unsigned char apq8064_hdmi_as_primary_selected(void); -unsigned char apq8064_mhl_display_enabled(void); -void apq8064_init_fb(void); -void apq8064_allocate_fb_region(void); -void apq8064_mdp_writeback(struct memtype_reserve *reserve_table); -void __init apq8064_set_display_params(char *prim_panel, char *ext_panel, - unsigned char resolution); - -void apq8064_init_gpu(void); -void apq8064_pm8xxx_gpio_mpp_init(void); -void __init configure_apq8064_pm8917_power_grid(void); - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) -void __init apq8064_bt_power_init(void); -#endif - -#define PLATFORM_IS_MPQ8064() \ - (machine_is_mpq8064_hrd() || \ - machine_is_mpq8064_dtv() || \ - machine_is_mpq8064_cdp() \ - ) - - -#define GPIO_EXPANDER_IRQ_BASE (TABLA_INTERRUPT_BASE + \ - NR_TABLA_IRQS) -#define GPIO_EXPANDER_GPIO_BASE (PM8821_MPP_BASE + PM8821_NR_MPPS) - -#define GPIO_EPM_EXPANDER_BASE GPIO_EXPANDER_GPIO_BASE -#define SX150X_EPM_NR_GPIOS 16 -#define SX150X_EPM_NR_IRQS 8 - -#define SX150X_EXP1_GPIO_BASE (GPIO_EPM_EXPANDER_BASE + \ - SX150X_EPM_NR_GPIOS) -#define SX150X_EXP1_IRQ_BASE (GPIO_EXPANDER_IRQ_BASE + \ - SX150X_EPM_NR_IRQS) -#define SX150X_EXP1_NR_IRQS 16 -#define SX150X_EXP1_NR_GPIOS 16 - -#define SX150X_EXP2_GPIO_BASE (SX150X_EXP1_GPIO_BASE + \ - SX150X_EXP1_NR_GPIOS) -#define SX150X_EXP2_IRQ_BASE (SX150X_EXP1_IRQ_BASE + SX150X_EXP1_NR_IRQS) -#define SX150X_EXP2_NR_IRQS 8 -#define SX150X_EXP2_NR_GPIOS 8 - -#define SX150X_EXP3_GPIO_BASE (SX150X_EXP2_GPIO_BASE + \ - SX150X_EXP2_NR_GPIOS) -#define SX150X_EXP3_IRQ_BASE (SX150X_EXP2_IRQ_BASE + SX150X_EXP2_NR_IRQS) -#define SX150X_EXP3_NR_IRQS 8 -#define SX150X_EXP3_NR_GPIOS 8 - -#define SX150X_EXP4_GPIO_BASE (SX150X_EXP3_GPIO_BASE + \ - SX150X_EXP3_NR_GPIOS) -#define SX150X_EXP4_IRQ_BASE (SX150X_EXP3_IRQ_BASE + SX150X_EXP3_NR_IRQS) -#define SX150X_EXP4_NR_IRQS 16 -#define SX150X_EXP4_NR_GPIOS 16 - -#define SX150X_GPIO(_expander, _pin) (SX150X_EXP##_expander##_GPIO_BASE + _pin) - -enum { - SX150X_EPM, - SX150X_EXP1, - SX150X_EXP2, - SX150X_EXP3, - SX150X_EXP4, -}; - -extern struct msm_rtb_platform_data apq8064_rtb_pdata; -extern struct msm_cache_dump_platform_data apq8064_cache_dump_pdata; -#endif diff --git a/arch/arm/mach-msm/board-8930-camera.c b/arch/arm/mach-msm/board-8930-camera.c deleted file mode 100644 index e35b3c19e464..000000000000 --- a/arch/arm/mach-msm/board-8930-camera.c +++ /dev/null @@ -1,703 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8930.h" - -#ifdef CONFIG_MSM_CAMERA - -#if (defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)) && \ - defined(CONFIG_I2C) - -static struct i2c_board_info cam_expander_i2c_info[] = { - { - I2C_BOARD_INFO("sx1508q", 0x22), - .platform_data = &msm8930_sx150x_data[SX150X_CAM] - }, -}; - -static struct msm_cam_expander_info cam_expander_info[] = { - { - cam_expander_i2c_info, - MSM_8930_GSBI4_QUP_I2C_BUS_ID, - }, -}; -#endif - -static struct gpiomux_setting cam_settings[] = { - { - .func = GPIOMUX_FUNC_GPIO, /*suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - }, - - { - .func = GPIOMUX_FUNC_1, /*active 1*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*active 2*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_1, /*active 3*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_5, /*active 4*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_6, /*active 5*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_2, /*active 6*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_3, /*active 7*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*i2c suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, - }, - { - .func = GPIOMUX_FUNC_2, /*active 9*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - -}; - - -static struct msm_gpiomux_config msm8930_cam_common_configs[] = { - { - .gpio = 2, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 3, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[1], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 4, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[9], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 5, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[1], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 76, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 107, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 54, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, -}; - -static struct msm_gpiomux_config msm8930_cam_2d_configs[] = { - { - .gpio = 18, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 19, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 20, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 21, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, -}; - -#define VFE_CAMIF_TIMER1_GPIO 2 -#define VFE_CAMIF_TIMER2_GPIO 3 -#define VFE_CAMIF_TIMER3_GPIO_INT 4 - -static struct gpio flash_init_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER1"}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER2"}, -}; - -static struct msm_gpio_set_tbl flash_set_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, -}; - -static struct msm_camera_sensor_strobe_flash_data strobe_flash_xenon = { - .flash_trigger = VFE_CAMIF_TIMER2_GPIO, - .flash_charge = VFE_CAMIF_TIMER1_GPIO, - .flash_charge_done = VFE_CAMIF_TIMER3_GPIO_INT, - .flash_recharge_duration = 50000, - .irq = MSM_GPIO_TO_INT(VFE_CAMIF_TIMER3_GPIO_INT), -}; - -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_EXT, - .init_gpio_tbl = flash_init_gpio, - .init_gpio_tbl_size = ARRAY_SIZE(flash_init_gpio), - .set_gpio_tbl = flash_set_gpio, - .set_gpio_tbl_size = ARRAY_SIZE(flash_set_gpio), - ._fsrc.ext_driver_src.led_en = VFE_CAMIF_TIMER1_GPIO, - ._fsrc.ext_driver_src.led_flash_en = VFE_CAMIF_TIMER2_GPIO, - ._fsrc.ext_driver_src.flash_id = MAM_CAMERA_EXT_LED_FLASH_TPS61310, -}; - -static struct msm_bus_vectors cam_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_preview_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 27648000, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 600000000, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 600000000, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_zsl_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 600000000, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_video_ls_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 600000000, - .ib = 4264000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_dual_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 302071680, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, -}; - -static struct msm_bus_vectors cam_adv_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 274406400, - .ib = 2656000000UL, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - - -static struct msm_bus_paths cam_bus_client_config[] = { - { - ARRAY_SIZE(cam_init_vectors), - cam_init_vectors, - }, - { - ARRAY_SIZE(cam_preview_vectors), - cam_preview_vectors, - }, - { - ARRAY_SIZE(cam_video_vectors), - cam_video_vectors, - }, - { - ARRAY_SIZE(cam_snapshot_vectors), - cam_snapshot_vectors, - }, - { - ARRAY_SIZE(cam_zsl_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_video_ls_vectors), - cam_video_ls_vectors, - }, - { - ARRAY_SIZE(cam_dual_vectors), - cam_dual_vectors, - }, - { - ARRAY_SIZE(cam_adv_video_vectors), - cam_adv_video_vectors, - }, - -}; - -static struct msm_bus_scale_pdata cam_bus_client_pdata = { - cam_bus_client_config, - ARRAY_SIZE(cam_bus_client_config), - .name = "msm_camera", -}; - -static struct msm_camera_device_platform_data msm_camera_csi_device_data[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, - { - .csiphy_core = 1, - .csid_core = 1, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, -}; - -static struct camera_vreg_t msm_8930_cam_vreg[] = { - {"cam_vdig", REG_LDO, 1200000, 1200000, 105000}, - {"cam_vio", REG_VS, 0, 0, 0}, - {"cam_vana", REG_LDO, 2800000, 2850000, 85600}, - {"cam_vaf", REG_LDO, 2800000, 2850000, 300000}, -}; - -static struct gpio msm8930_common_cam_gpio[] = { - {20, GPIOF_DIR_IN, "CAMIF_I2C_DATA"}, - {21, GPIOF_DIR_IN, "CAMIF_I2C_CLK"}, -}; - -static struct gpio msm8930_front_cam_gpio[] = { - {4, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {76, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct gpio msm8930_back_cam_gpio[] = { - {5, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {107, GPIOF_DIR_OUT, "CAM_RESET"}, - {54, GPIOF_DIR_OUT, "CAM_STBY_N"}, -}; - -static struct msm_gpio_set_tbl msm8930_front_cam_gpio_set_tbl[] = { - {76, GPIOF_OUT_INIT_LOW, 1000}, - {76, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_gpio_set_tbl msm8930_back_cam_gpio_set_tbl[] = { - {54, GPIOF_OUT_INIT_LOW, 1000}, - {54, GPIOF_OUT_INIT_HIGH, 4000}, - {107, GPIOF_OUT_INIT_LOW, 1000}, - {107, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_camera_gpio_conf msm_8930_front_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = msm8930_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(msm8930_cam_2d_configs), - .cam_gpio_common_tbl = msm8930_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8930_common_cam_gpio), - .cam_gpio_req_tbl = msm8930_front_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm8930_front_cam_gpio), - .cam_gpio_set_tbl = msm8930_front_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm8930_front_cam_gpio_set_tbl), -}; - -static struct msm_camera_gpio_conf msm_8930_back_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = msm8930_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(msm8930_cam_2d_configs), - .cam_gpio_common_tbl = msm8930_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8930_common_cam_gpio), - .cam_gpio_req_tbl = msm8930_back_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm8930_back_cam_gpio), - .cam_gpio_set_tbl = msm8930_back_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm8930_back_cam_gpio_set_tbl), -}; - -static struct i2c_board_info msm_act_main_cam_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x11), -}; - -static struct msm_actuator_info msm_act_main_cam_0_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_0, - .bus_id = MSM_8930_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct msm_camera_sensor_flash_data flash_imx074 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_csi_lane_params imx074_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = { - .mount_angle = 90, - .cam_vreg = msm_8930_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8930_cam_vreg), - .gpio_conf = &msm_8930_back_cam_gpio_conf, - .csi_lane_params = &imx074_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = { - .sensor_name = "imx074", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx074, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &sensor_board_info_imx074, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_0_info, -}; - -static struct msm_camera_sensor_flash_data flash_mt9m114 = { - .flash_type = MSM_CAMERA_FLASH_NONE -}; - -static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x1, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = { - .mount_angle = 90, - .cam_vreg = msm_8930_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8930_cam_vreg), - .gpio_conf = &msm_8930_front_cam_gpio_conf, - .csi_lane_params = &mt9m114_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = { - .sensor_name = "mt9m114", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_mt9m114, - .sensor_platform_info = &sensor_board_info_mt9m114, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = YUV_SENSOR, -}; - -static struct msm_camera_sensor_flash_data flash_ov2720 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params ov2720_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x3, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = { - .mount_angle = 0, - .cam_vreg = msm_8930_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8930_cam_vreg), - .gpio_conf = &msm_8930_front_cam_gpio_conf, - .csi_lane_params = &ov2720_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = { - .sensor_name = "ov2720", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_ov2720, - .sensor_platform_info = &sensor_board_info_ov2720, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; - -static struct i2c_board_info tps61310_flash_i2c_info = { - I2C_BOARD_INFO("tps61310", 0x66), -}; - -static struct msm_camera_sensor_flash_data flash_s5k3l1yx = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src, - .board_info = &tps61310_flash_i2c_info, - .bus_id = MSM_8930_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_csi_lane_params s5k3l1yx_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_s5k3l1yx = { - .mount_angle = 90, - .cam_vreg = msm_8930_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8930_cam_vreg), - .gpio_conf = &msm_8930_back_cam_gpio_conf, - .csi_lane_params = &s5k3l1yx_csi_lane_params, -}; - -static struct msm_actuator_info msm_act_main_cam_2_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_2, - .bus_id = MSM_8930_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3l1yx_data = { - .sensor_name = "s5k3l1yx", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_s5k3l1yx, - .sensor_platform_info = &sensor_board_info_s5k3l1yx, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_2_info, -}; - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -void __init msm8930_init_cam(void) -{ - msm_gpiomux_install(msm8930_cam_common_configs, - ARRAY_SIZE(msm8930_cam_common_configs)); - - if (machine_is_msm8930_cdp()) { - struct msm_camera_sensor_info *s_info; - s_info = &msm_camera_sensor_s5k3l1yx_data; - s_info->sensor_platform_info->mount_angle = 0; - msm_flash_src._fsrc.ext_driver_src.led_en = - GPIO_CAM_GP_LED_EN1; - msm_flash_src._fsrc.ext_driver_src.led_flash_en = - GPIO_CAM_GP_LED_EN2; -#if defined(CONFIG_I2C) && (defined(CONFIG_GPIO_SX150X) || \ - defined(CONFIG_GPIO_SX150X_MODULE)) - msm_flash_src._fsrc.ext_driver_src.expander_info = - cam_expander_info; -#endif - } - - platform_device_register(&msm_camera_server); - platform_device_register(&msm8960_device_csiphy0); - platform_device_register(&msm8960_device_csiphy1); - platform_device_register(&msm8960_device_csid0); - platform_device_register(&msm8960_device_csid1); - platform_device_register(&msm8960_device_ispif); - platform_device_register(&msm8960_device_vfe); - platform_device_register(&msm8960_device_vpe); -} - -#ifdef CONFIG_I2C -struct i2c_board_info msm8930_camera_i2c_boardinfo[] = { - { - I2C_BOARD_INFO("imx074", 0x1A), - .platform_data = &msm_camera_sensor_imx074_data, - }, - { - I2C_BOARD_INFO("ov2720", 0x6C), - .platform_data = &msm_camera_sensor_ov2720_data, - }, - { - I2C_BOARD_INFO("mt9m114", 0x48), - .platform_data = &msm_camera_sensor_mt9m114_data, - }, - { - I2C_BOARD_INFO("s5k3l1yx", 0x20), - .platform_data = &msm_camera_sensor_s5k3l1yx_data, - }, -}; - -struct msm_camera_board_info msm8930_camera_board_info = { - .board_info = msm8930_camera_i2c_boardinfo, - .num_i2c_board_info = ARRAY_SIZE(msm8930_camera_i2c_boardinfo), -}; -#endif -#endif diff --git a/arch/arm/mach-msm/board-8930-display.c b/arch/arm/mach-msm/board-8930-display.c deleted file mode 100644 index 61547693ef71..000000000000 --- a/arch/arm/mach-msm/board-8930-display.c +++ /dev/null @@ -1,900 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-8930.h" - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((1920 * 1088 * 4), 4096) * 3) /* 4 bpp x 3 pages */ -#else -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((1920 * 1088 * 4), 4096) * 2) /* 4 bpp x 2 pages */ -#endif -/* Note: must be multiple of 4096 */ -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE, 4096) - -#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE roundup((1376 * 768 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY0_WRITEBACK */ - -#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE roundup((1920 * 1088 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY1_WRITEBACK */ - -#define MDP_VSYNC_GPIO 0 - -#define MIPI_CMD_NOVATEK_QHD_PANEL_NAME "mipi_cmd_novatek_qhd" -#define MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME "mipi_video_novatek_qhd" -#define MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME "mipi_video_toshiba_wsvga" -#define MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME "mipi_video_chimei_wxga" -#define MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME "mipi_video_simulator_vga" -#define MIPI_CMD_RENESAS_FWVGA_PANEL_NAME "mipi_cmd_renesas_fwvga" -#define HDMI_PANEL_NAME "hdmi_msm" -#define MHL_PANEL_NAME "hdmi_msm,mhl_8334" -#define TVOUT_PANEL_NAME "tvout_msm" - -static unsigned char mhl_display_enabled; - -unsigned char msm8930_mhl_display_enabled(void) -{ - return mhl_display_enabled; -} - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -static int msm_fb_detect_panel(const char *name) -{ - if (!strncmp(name, MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - -#if !defined(CONFIG_FB_MSM_LVDS_MIPI_PANEL_DETECT) && \ - !defined(CONFIG_FB_MSM_MIPI_PANEL_DETECT) - if (!strncmp(name, MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME, - strnlen(MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_CMD_RENESAS_FWVGA_PANEL_NAME, - strnlen(MIPI_CMD_RENESAS_FWVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - - if (!strncmp(name, HDMI_PANEL_NAME, - strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, TVOUT_PANEL_NAME, - strnlen(TVOUT_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - pr_warning("%s: not supported '%s'", __func__, name); - return -ENODEV; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev.platform_data = &msm_fb_pdata, -}; - -static bool dsi_power_on; -static struct mipi_dsi_panel_platform_data novatek_pdata; -static void pm8917_gpio_set_backlight(int bl_level) -{ - int gpio24 = PM8917_GPIO_PM_TO_SYS(24); - if (bl_level > 0) - gpio_set_value_cansleep(gpio24, 1); - else - gpio_set_value_cansleep(gpio24, 0); -} - -/* - * TODO: When physical 8930/PM8038 hardware becomes - * available, replace mipi_dsi_cdp_panel_power with - * appropriate function. - */ -#define DISP_RST_GPIO 58 -#define DISP_3D_2D_MODE 1 -static int mipi_dsi_cdp_panel_power(int on) -{ - static struct regulator *reg_l8, *reg_l23, *reg_l2; - /* Control backlight GPIO (24) directly when using PM8917 */ - int gpio24 = PM8917_GPIO_PM_TO_SYS(24); - int rc; - - pr_debug("%s: state : %d\n", __func__, on); - - if (!dsi_power_on) { - - reg_l8 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vdc"); - if (IS_ERR(reg_l8)) { - pr_err("could not get 8038_l8, rc = %ld\n", - PTR_ERR(reg_l8)); - return -ENODEV; - } - reg_l23 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vddio"); - if (IS_ERR(reg_l23)) { - pr_err("could not get 8038_l23, rc = %ld\n", - PTR_ERR(reg_l23)); - return -ENODEV; - } - reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vdda"); - if (IS_ERR(reg_l2)) { - pr_err("could not get 8038_l2, rc = %ld\n", - PTR_ERR(reg_l2)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_l8, 2800000, 3000000); - if (rc) { - pr_err("set_voltage l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_voltage(reg_l23, 1800000, 1800000); - if (rc) { - pr_err("set_voltage l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_voltage(reg_l2, 1200000, 1200000); - if (rc) { - pr_err("set_voltage l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = gpio_request(DISP_RST_GPIO, "disp_rst_n"); - if (rc) { - pr_err("request gpio DISP_RST_GPIO failed, rc=%d\n", - rc); - gpio_free(DISP_RST_GPIO); - return -ENODEV; - } - rc = gpio_request(DISP_3D_2D_MODE, "disp_3d_2d"); - if (rc) { - pr_err("request gpio DISP_3D_2D_MODE failed, rc=%d\n", - rc); - gpio_free(DISP_3D_2D_MODE); - return -ENODEV; - } - rc = gpio_direction_output(DISP_3D_2D_MODE, 0); - if (rc) { - pr_err("gpio_direction_output failed for %d gpio rc=%d\n", - DISP_3D_2D_MODE, rc); - return -ENODEV; - } - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) { - rc = gpio_request(gpio24, "disp_bl"); - if (rc) { - pr_err("request for gpio 24 failed, rc=%d\n", - rc); - return -ENODEV; - } - gpio_set_value_cansleep(gpio24, 0); - novatek_pdata.gpio_set_backlight = - pm8917_gpio_set_backlight; - } - dsi_power_on = true; - } - - if (on) { - rc = regulator_set_optimum_mode(reg_l8, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l23, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l2, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l8); - if (rc) { - pr_err("enable l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_enable(reg_l23); - if (rc) { - pr_err("enable l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_enable(reg_l2); - if (rc) { - pr_err("enable l2 failed, rc=%d\n", rc); - return -ENODEV; - } - usleep(10000); - gpio_set_value(DISP_RST_GPIO, 1); - usleep(10); - gpio_set_value(DISP_RST_GPIO, 0); - usleep(20); - gpio_set_value(DISP_RST_GPIO, 1); - gpio_set_value(DISP_3D_2D_MODE, 1); - usleep(20); - } else { - - gpio_set_value(DISP_RST_GPIO, 0); - - rc = regulator_disable(reg_l2); - if (rc) { - pr_err("disable reg_l2 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_l8); - if (rc) { - pr_err("disable reg_l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_l23); - if (rc) { - pr_err("disable reg_l23 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_set_optimum_mode(reg_l8, 100); - if (rc < 0) { - pr_err("set_optimum_mode l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l23, 100); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l2, 100); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - gpio_set_value(DISP_3D_2D_MODE, 0); - usleep(20); - } - return 0; -} - -static int mipi_dsi_panel_power(int on) -{ - pr_debug("%s: on=%d\n", __func__, on); - - return mipi_dsi_cdp_panel_power(on); -} - -static struct mipi_dsi_platform_data mipi_dsi_pdata = { - .vsync_gpio = MDP_VSYNC_GPIO, - .dsi_power_save = mipi_dsi_panel_power, -}; - -#ifdef CONFIG_MSM_BUS_SCALING - -static struct msm_bus_vectors mdp_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -static struct msm_bus_vectors hdmi_as_primary_vectors[] = { - /* If HDMI is used as primary */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2000000000, - .ib = 2000000000, - }, -}; -static struct msm_bus_paths mdp_bus_scale_usecases[] = { - { - ARRAY_SIZE(mdp_init_vectors), - mdp_init_vectors, - }, - { - ARRAY_SIZE(hdmi_as_primary_vectors), - hdmi_as_primary_vectors, - }, - { - ARRAY_SIZE(hdmi_as_primary_vectors), - hdmi_as_primary_vectors, - }, - { - ARRAY_SIZE(hdmi_as_primary_vectors), - hdmi_as_primary_vectors, - }, - { - ARRAY_SIZE(hdmi_as_primary_vectors), - hdmi_as_primary_vectors, - }, - { - ARRAY_SIZE(hdmi_as_primary_vectors), - hdmi_as_primary_vectors, - }, -}; -#else -static struct msm_bus_vectors mdp_ui_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_vga_vectors[] = { - /* VGA and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_720p_vectors[] = { - /* 720p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 230400000 * 2, - .ib = 288000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_1080p_vectors[] = { - /* 1080p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 334080000 * 2, - .ib = 417600000 * 2, - }, -}; - -static struct msm_bus_paths mdp_bus_scale_usecases[] = { - { - ARRAY_SIZE(mdp_init_vectors), - mdp_init_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_vga_vectors), - mdp_vga_vectors, - }, - { - ARRAY_SIZE(mdp_720p_vectors), - mdp_720p_vectors, - }, - { - ARRAY_SIZE(mdp_1080p_vectors), - mdp_1080p_vectors, - }, -}; -#endif - -static struct msm_bus_scale_pdata mdp_bus_scale_pdata = { - mdp_bus_scale_usecases, - ARRAY_SIZE(mdp_bus_scale_usecases), - .name = "mdp", -}; - -#endif - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = MDP_VSYNC_GPIO, - .mdp_max_clk = 200000000, -#ifdef CONFIG_MSM_BUS_SCALING - .mdp_bus_scale_table = &mdp_bus_scale_pdata, -#endif - .mdp_rev = MDP_REV_43, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .mem_hid = BIT(ION_CP_MM_HEAP_ID), -#else - .mem_hid = MEMTYPE_EBI1, -#endif - .mdp_iommu_split_domain = 0, -}; - -void __init msm8930_mdp_writeback(struct memtype_reserve* reserve_table) -{ - mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE; - mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE; -#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov0_wb_size; - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov1_wb_size; -#endif -} - -#define LPM_CHANNEL0 0 -static int toshiba_gpio[] = {LPM_CHANNEL0}; - -static struct mipi_dsi_panel_platform_data toshiba_pdata = { - .gpio = toshiba_gpio, -}; - -static struct platform_device mipi_dsi_toshiba_panel_device = { - .name = "mipi_toshiba", - .id = 0, - .dev = { - .platform_data = &toshiba_pdata, - } -}; - -#define FPGA_3D_GPIO_CONFIG_ADDR 0xB5 - -static struct mipi_dsi_phy_ctrl dsi_novatek_cmd_mode_phy_db = { - -/* DSI_BIT_CLK at 500MHz, 2 lane, RGB888 */ - {0x09, 0x08, 0x05, 0x00, 0x20}, /* regulator */ - /* timing */ - {0xab, 0x8a, 0x18, 0x00, 0x92, 0x97, 0x1b, 0x8c, - 0x0c, 0x03, 0x04, 0xa0}, - {0x5f, 0x00, 0x00, 0x10}, /* phy ctrl */ - {0xff, 0x00, 0x06, 0x00}, /* strength */ - /* pll control */ - {0x0, 0xe, 0x30, 0xda, 0x00, 0x10, 0x0f, 0x61, - 0x40, 0x07, 0x03, - 0x00, 0x1a, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x02}, -}; - -static struct mipi_dsi_panel_platform_data novatek_pdata = { - .fpga_3d_config_addr = FPGA_3D_GPIO_CONFIG_ADDR, - .fpga_ctrl_mode = FPGA_SPI_INTF, - .phy_ctrl_settings = &dsi_novatek_cmd_mode_phy_db, - .dlane_swap = 0x1, - .enable_wled_bl_ctrl = 0x1, -}; - -static struct platform_device mipi_dsi_novatek_panel_device = { - .name = "mipi_novatek", - .id = 0, - .dev = { - .platform_data = &novatek_pdata, - } -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct resource hdmi_msm_resources[] = { - { - .name = "hdmi_msm_qfprom_addr", - .start = 0x00700000, - .end = 0x007060FF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_hdmi_addr", - .start = 0x04A00000, - .end = 0x04A00FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_irq", - .start = HDMI_IRQ, - .end = HDMI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static int hdmi_enable_5v(int on); -static int hdmi_core_power(int on, int show); -static int hdmi_cec_power(int on); -static int hdmi_gpio_config(int on); -static int hdmi_panel_power(int on); - -static struct msm_hdmi_platform_data hdmi_msm_data = { - .irq = HDMI_IRQ, - .enable_5v = hdmi_enable_5v, - .core_power = hdmi_core_power, - .cec_power = hdmi_cec_power, - .panel_power = hdmi_panel_power, - .gpio_config = hdmi_gpio_config, -}; - -static struct platform_device hdmi_msm_device = { - .name = "hdmi_msm", - .id = 0, - .num_resources = ARRAY_SIZE(hdmi_msm_resources), - .resource = hdmi_msm_resources, - .dev.platform_data = &hdmi_msm_data, -}; -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL -static struct platform_device wfd_panel_device = { - .name = "wfd_panel", - .id = 0, - .dev.platform_data = NULL, -}; - -static struct platform_device wfd_device = { - .name = "msm_wfd", - .id = -1, -}; -#endif - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors dtv_bus_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -static struct msm_bus_vectors dtv_bus_def_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2000000000, - .ib = 2000000000, - }, -}; -#else -static struct msm_bus_vectors dtv_bus_def_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 566092800 * 2, - .ib = 707616000 * 2, - }, -}; -#endif - -static struct msm_bus_paths dtv_bus_scale_usecases[] = { - { - ARRAY_SIZE(dtv_bus_init_vectors), - dtv_bus_init_vectors, - }, - { - ARRAY_SIZE(dtv_bus_def_vectors), - dtv_bus_def_vectors, - }, -}; -static struct msm_bus_scale_pdata dtv_bus_scale_pdata = { - dtv_bus_scale_usecases, - ARRAY_SIZE(dtv_bus_scale_usecases), - .name = "dtv", -}; - -static struct lcdc_platform_data dtv_pdata = { - .bus_scale_table = &dtv_bus_scale_pdata, - .lcdc_power_save = hdmi_panel_power, -}; - -static int hdmi_panel_power(int on) -{ - int rc; - - pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF")); - rc = hdmi_core_power(on, 1); - if (rc) - rc = hdmi_cec_power(on); - - pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF")); - return rc; -} -#endif - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static int hdmi_enable_5v(int on) -{ - static struct regulator *reg_ext_5v; /* HDMI_5V */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_ext_5v) { - reg_ext_5v = regulator_get(&hdmi_msm_device.dev, "hdmi_mvs"); - if (IS_ERR(reg_ext_5v)) { - pr_err("'%s' regulator not found, rc=%ld\n", - "hdmi_mvs", IS_ERR(reg_ext_5v)); - reg_ext_5v = NULL; - return -ENODEV; - } - } - - if (on) { - rc = regulator_enable(reg_ext_5v); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "reg_ext_5v", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_ext_5v); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "reg_ext_5v", rc); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_core_power(int on, int show) -{ - /* Both HDMI "avdd" and "vcc" are powered by 8038_l23 regulator */ - static struct regulator *reg_8038_l23; - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8038_l23) { - reg_8038_l23 = regulator_get(&hdmi_msm_device.dev, "hdmi_avdd"); - if (IS_ERR(reg_8038_l23)) { - pr_err("could not get reg_8038_l23, rc = %ld\n", - PTR_ERR(reg_8038_l23)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_8038_l23, 1800000, 1800000); - if (rc) { - pr_err("set_voltage failed for 8921_l23, rc=%d\n", rc); - return -EINVAL; - } - } - - if (on) { - rc = regulator_set_optimum_mode(reg_8038_l23, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_8038_l23); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "hdmi_avdd", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8038_l23); - if (rc) { - pr_err("disable reg_8038_l23 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_set_optimum_mode(reg_8038_l23, 100); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_gpio_config(int on) -{ - int rc = 0; - static int prev_on; - - if (on == prev_on) - return 0; - - if (on) { - if (!(hdmi_msm_data.is_mhl_enabled)) { - rc = gpio_request(HDMI_MHL_MUX_GPIO, "MHL_HDMI_MUX"); - if (rc < 0) { - pr_err("gpio hdmi_mhl mux req failed:%d\n", - rc); - return rc; - } - rc = gpio_direction_output(HDMI_MHL_MUX_GPIO, 1); - if (rc < 0) { - pr_err("set gpio hdmi_mhl dir failed:%d\n", - rc); - goto error0; - } - gpio_set_value(HDMI_MHL_MUX_GPIO, 1); - pr_debug("set gpio hdmi mhl mux %d to 1\n", - HDMI_MHL_MUX_GPIO); - } - - rc = gpio_request(100, "HDMI_DDC_CLK"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_CLK", 100, rc); - goto error0; - } - rc = gpio_request(101, "HDMI_DDC_DATA"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_DATA", 101, rc); - goto error1; - } - rc = gpio_request(102, "HDMI_HPD"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_HPD", 102, rc); - goto error2; - } - pr_debug("%s(on): success\n", __func__); - } else { - if (!(hdmi_msm_data.is_mhl_enabled)) - gpio_free(HDMI_MHL_MUX_GPIO); - gpio_free(100); - gpio_free(101); - gpio_free(102); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - return 0; - -error2: - gpio_free(101); -error1: - gpio_free(100); -error0: - if (!(hdmi_msm_data.is_mhl_enabled)) - gpio_free(HDMI_MHL_MUX_GPIO); - return rc; -} - -static int hdmi_cec_power(int on) -{ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(99, "HDMI_CEC_VAR"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_CEC_VAR", 99, rc); - goto error; - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(99); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -error: - return rc; -} -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -void __init msm8930_init_fb(void) -{ - platform_device_register(&msm_fb_device); - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL - platform_device_register(&wfd_panel_device); - platform_device_register(&wfd_device); -#endif - - platform_device_register(&mipi_dsi_novatek_panel_device); - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL - platform_device_register(&hdmi_msm_device); -#endif - - platform_device_register(&mipi_dsi_toshiba_panel_device); - - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); -#ifdef CONFIG_MSM_BUS_SCALING - msm_fb_register_device("dtv", &dtv_pdata); -#endif -} - -void __init msm8930_allocate_fb_region(void) -{ - void *addr; - unsigned long size; - - size = MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); -} - -void __init msm8930_set_display_params(char *prim_panel, char *ext_panel) -{ - if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.prim_panel_name, prim_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.prim_panel_name %s\n", - msm_fb_pdata.prim_panel_name); - } - if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.ext_panel_name, ext_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.ext_panel_name %s\n", - msm_fb_pdata.ext_panel_name); - - if (!strncmp((char *)msm_fb_pdata.ext_panel_name, - MHL_PANEL_NAME, strnlen(MHL_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - pr_debug("MHL is external display by boot parameter\n"); - mhl_display_enabled = 1; - } - } - - hdmi_msm_data.is_mhl_enabled = mhl_display_enabled; -} diff --git a/arch/arm/mach-msm/board-8930-gpiomux.c b/arch/arm/mach-msm/board-8930-gpiomux.c deleted file mode 100644 index 62e81222bed7..000000000000 --- a/arch/arm/mach-msm/board-8930-gpiomux.c +++ /dev/null @@ -1,898 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include "devices.h" -#include "board-8930.h" - -/* The SPI configurations apply to GSBI 1*/ -static struct gpiomux_setting spi_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting spi_suspended_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi3_suspended_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting gsbi3_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi5 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi9 = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi10 = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi12 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cdc_mclk = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting audio_auxpcm[] = { - /* Suspended state */ - { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - /* Active state */ - { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, -}; - -static struct gpiomux_setting audio_mbhc = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting audio_spkr_boost = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static struct gpiomux_setting gpio_eth_suspend_1_cfg = { - .pull = GPIOMUX_PULL_DOWN, - .drv = GPIOMUX_DRV_2MA, - .func = GPIOMUX_FUNC_GPIO, -}; - -static struct gpiomux_setting gpio_eth_suspend_2_cfg = { - .pull = GPIOMUX_PULL_NONE, - .drv = GPIOMUX_DRV_2MA, - .func = GPIOMUX_FUNC_GPIO, -}; -#endif - -static struct gpiomux_setting slimbus = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting wcnss_5wire_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting wcnss_5wire_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting atmel_resout_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting atmel_resout_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting atmel_ldo_en_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting atmel_ldo_en_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting atmel_int_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting atmel_int_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; -#ifdef MSM8930_PHASE_2 -static struct gpiomux_setting hsusb_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; -static struct msm_gpiomux_config msm8930_hsusb_configs[] = { - { - .gpio = 63, /* HSUSB_EXTERNAL_5V_LDO_EN */ - .settings = { - [GPIOMUX_SUSPENDED] = &hsusb_sus_cfg, - }, - }, - { - .gpio = 97, /* HSUSB_5V_EN */ - .settings = { - [GPIOMUX_SUSPENDED] = &hsusb_sus_cfg, - }, - }, -}; -#endif - -static struct gpiomux_setting hap_lvl_shft_suspended_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hap_lvl_shft_active_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ap2mdm_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_status_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_errfatal_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ap2mdm_kpdpwr_n_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdp_vsync_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdp_vsync_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct gpiomux_setting hdmi_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_active_1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting hdmi_active_2_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_active_3_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_IN, -}; - -static struct gpiomux_setting hdmi_active_4_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_HIGH, -}; - -static struct gpiomux_setting hdmi_active_5_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_HIGH, -}; - -#endif - -static struct gpiomux_setting sitar_reset = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static struct msm_gpiomux_config msm8960_ethernet_configs[] = { - { - .gpio = 89, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_eth_suspend_1_cfg, - } - }, - { - .gpio = 90, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_eth_suspend_2_cfg, - } - }, -}; -#endif - -static struct msm_gpiomux_config msm8960_gsbi_configs[] __initdata = { - { - .gpio = 6, /* GSBI1 QUP SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 7, /* GSBI1 QUP SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 8, /* GSBI1 QUP SPI_CS_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 9, /* GSBI1 QUP SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 16, /* GSBI3 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 17, /* GSBI3 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 22, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5, - }, - }, - { - .gpio = 23, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5, - }, - }, - { - .gpio = 44, /* GSBI12 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi12, - }, - }, - { - .gpio = 95, /* GSBI9 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9, - }, - }, - { - .gpio = 96, /* GSBI12 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9, - }, - }, - { - .gpio = 45, /* GSBI12 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi12, - }, - }, - { - .gpio = 73, /* GSBI10 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi10, - }, - }, - { - .gpio = 74, /* GSBI10 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi10, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_slimbus_config[] __initdata = { - { - .gpio = 60, /* slimbus data */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, - { - .gpio = 61, /* slimbus clk */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_audio_codec_configs[] __initdata = { - { - .gpio = 59, - .settings = { - [GPIOMUX_SUSPENDED] = &cdc_mclk, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_audio_mbhc_configs[] __initdata = { - { - .gpio = 37, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_mbhc, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_audio_spkr_configs[] __initdata = { - { - .gpio = 15, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_spkr_boost, - }, - }, -}; - - -static struct msm_gpiomux_config msm8960_audio_auxpcm_configs[] __initdata = { - { - .gpio = 63, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 64, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 65, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 66, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, -}; - -static struct msm_gpiomux_config wcnss_5wire_interface[] = { - { - .gpio = 84, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 85, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 86, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 87, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 88, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_atmel_configs[] __initdata = { - { /* TS INTERRUPT */ - .gpio = 11, - .settings = { - [GPIOMUX_ACTIVE] = &atmel_int_act_cfg, - [GPIOMUX_SUSPENDED] = &atmel_int_sus_cfg, - }, - }, - { /* TS LDO ENABLE */ - .gpio = 50, - .settings = { - [GPIOMUX_ACTIVE] = &atmel_ldo_en_act_cfg, - [GPIOMUX_SUSPENDED] = &atmel_ldo_en_sus_cfg, - }, - }, - { /* TS RESOUT */ - .gpio = 52, - .settings = { - [GPIOMUX_ACTIVE] = &atmel_resout_act_cfg, - [GPIOMUX_SUSPENDED] = &atmel_resout_sus_cfg, - }, - }, -}; - -static struct msm_gpiomux_config hap_lvl_shft_config[] __initdata = { - { - .gpio = 47, - .settings = { - [GPIOMUX_SUSPENDED] = &hap_lvl_shft_suspended_config, - [GPIOMUX_ACTIVE] = &hap_lvl_shft_active_config, - }, - }, -}; - -static struct msm_gpiomux_config mdm_configs[] __initdata = { - /* AP2MDM_STATUS */ - { - .gpio = 94, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_STATUS */ - { - .gpio = 69, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg, - } - }, - /* MDM2AP_ERRFATAL */ - { - .gpio = 70, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg, - } - }, - /* AP2MDM_ERRFATAL */ - { - .gpio = 95, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* AP2MDM_KPDPWR_N */ - { - .gpio = 81, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - }, - /* AP2MDM_PMIC_RESET_N */ - { - .gpio = 80, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - } -}; - -static struct msm_gpiomux_config msm8960_mdp_vsync_configs[] __initdata = { - { - .gpio = 0, - .settings = { - [GPIOMUX_ACTIVE] = &mdp_vsync_active_cfg, - [GPIOMUX_SUSPENDED] = &mdp_vsync_suspend_cfg, - }, - } -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct msm_gpiomux_config msm8960_hdmi_configs[] __initdata = { - { - .gpio = 99, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 100, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 101, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 102, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_2_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - -}; - -static struct msm_gpiomux_config msm8930_mhl_configs[] __initdata = { - { - .gpio = 72, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_3_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 71, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_4_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 73, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_5_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - -}; -#endif - -static struct gpiomux_setting haptics_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; -static struct gpiomux_setting haptics_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct msm_gpiomux_config msm8930_haptics_configs[] __initdata = { - { - .gpio = 77, - .settings = { - [GPIOMUX_ACTIVE] = &haptics_active_cfg, - [GPIOMUX_SUSPENDED] = &haptics_suspend_cfg, - }, - }, - { - .gpio = 78, - .settings = { - [GPIOMUX_ACTIVE] = &haptics_active_cfg, - [GPIOMUX_SUSPENDED] = &haptics_suspend_cfg, - }, - }, -}; - -static struct gpiomux_setting sd_det_line = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct msm_gpiomux_config msm8930_sd_det_config[] __initdata = { - { - .gpio = 94, /* SD Card Detect Line */ - .settings = { - [GPIOMUX_SUSPENDED] = &sd_det_line, - [GPIOMUX_ACTIVE] = &sd_det_line, - }, - }, -}; - -static struct gpiomux_setting gyro_int_line = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct msm_gpiomux_config msm8930_gyro_int_config[] __initdata = { - { - .gpio = 69, /* Gyro Interrupt Line */ - .settings = { - [GPIOMUX_SUSPENDED] = &gyro_int_line, - [GPIOMUX_ACTIVE] = &gyro_int_line, - }, - }, -}; - -static struct msm_gpiomux_config msm_sitar_config[] __initdata = { - { - .gpio = 42, /* SYS_RST_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &sitar_reset, - }, - } -}; - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct gpiomux_setting sdcc2_clk_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc2_cmd_data_0_3_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdcc2_data_1_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -/** - * DAT_0 to DAT_3 lines (gpio 89 - 92) are shared with ethernet - * CMD line (gpio 97) is shared with USB - * CLK line (gpio 98) is shared with battery alarm in - */ -static struct msm_gpiomux_config msm8960_sdcc2_configs[] __initdata = { - { - /* DATA_3 */ - .gpio = 92, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* DATA_2 */ - .gpio = 91, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* DATA_1 */ - .gpio = 90, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_data_1_suspend_cfg, - }, - }, - { - /* DATA_0 */ - .gpio = 89, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* CMD */ - .gpio = 97, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* CLK */ - .gpio = 98, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, -}; - -static void msm_gpiomux_sdc2_install(void) -{ - msm_gpiomux_install(msm8960_sdcc2_configs, - ARRAY_SIZE(msm8960_sdcc2_configs)); -} -#else -static void msm_gpiomux_sdc2_install(void) {} -#endif /* CONFIG_MMC_MSM_SDC2_SUPPORT */ - -int __init msm8930_init_gpiomux(void) -{ - int rc = msm_gpiomux_init(NR_GPIO_IRQS); - if (rc) { - pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc); - return rc; - } - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) - msm_gpiomux_install(msm8960_ethernet_configs, - ARRAY_SIZE(msm8960_ethernet_configs)); -#endif - - msm_gpiomux_install(msm8960_gsbi_configs, - ARRAY_SIZE(msm8960_gsbi_configs)); - - msm_gpiomux_install(msm8960_atmel_configs, - ARRAY_SIZE(msm8960_atmel_configs)); - - msm_gpiomux_install(msm8960_slimbus_config, - ARRAY_SIZE(msm8960_slimbus_config)); - - msm_gpiomux_install(msm8960_audio_codec_configs, - ARRAY_SIZE(msm8960_audio_codec_configs)); - - msm_gpiomux_install(msm8960_audio_mbhc_configs, - ARRAY_SIZE(msm8960_audio_mbhc_configs)); - - msm_gpiomux_install(msm8960_audio_spkr_configs, - ARRAY_SIZE(msm8960_audio_spkr_configs)); - - msm_gpiomux_install(msm8960_audio_auxpcm_configs, - ARRAY_SIZE(msm8960_audio_auxpcm_configs)); - - msm_gpiomux_install(wcnss_5wire_interface, - ARRAY_SIZE(wcnss_5wire_interface)); - - if (machine_is_msm8930_mtp() || machine_is_msm8930_fluid() || - machine_is_msm8930_cdp()) { - msm_gpiomux_install(hap_lvl_shft_config, - ARRAY_SIZE(hap_lvl_shft_config)); -#ifdef MSM8930_PHASE_2 - msm_gpiomux_install(msm8930_hsusb_configs, - ARRAY_SIZE(msm8930_hsusb_configs)); -#endif - } - - if (PLATFORM_IS_CHARM25()) - msm_gpiomux_install(mdm_configs, - ARRAY_SIZE(mdm_configs)); - - if (machine_is_msm8930_cdp() || machine_is_msm8930_mtp() - || machine_is_msm8930_fluid()) - msm_gpiomux_install(msm8930_haptics_configs, - ARRAY_SIZE(msm8930_haptics_configs)); - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL - msm_gpiomux_install(msm8960_hdmi_configs, - ARRAY_SIZE(msm8960_hdmi_configs)); - if (msm8930_mhl_display_enabled()) - msm_gpiomux_install(msm8930_mhl_configs, - ARRAY_SIZE(msm8930_mhl_configs)); -#endif - - msm_gpiomux_install(msm8960_mdp_vsync_configs, - ARRAY_SIZE(msm8960_mdp_vsync_configs)); - - msm_gpiomux_install(msm8930_sd_det_config, - ARRAY_SIZE(msm8930_sd_det_config)); - - if (machine_is_msm8930_fluid() || machine_is_msm8930_mtp()) - msm_gpiomux_install(msm8930_gyro_int_config, - ARRAY_SIZE(msm8930_gyro_int_config)); - - msm_gpiomux_install(msm_sitar_config, ARRAY_SIZE(msm_sitar_config)); - - msm_gpiomux_sdc2_install(); - - return 0; -} diff --git a/arch/arm/mach-msm/board-8930-gpu.c b/arch/arm/mach-msm/board-8930-gpu.c deleted file mode 100644 index 12a6ab129a03..000000000000 --- a/arch/arm/mach-msm/board-8930-gpu.c +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-8930.h" - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors grp3d_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp3d_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, -}; - -static struct msm_bus_vectors grp3d_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(4264), - }, -}; - -static struct msm_bus_paths grp3d_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp3d_init_vectors), - grp3d_init_vectors, - }, - { - ARRAY_SIZE(grp3d_low_vectors), - grp3d_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_vectors), - grp3d_nominal_vectors, - }, - { - ARRAY_SIZE(grp3d_max_vectors), - grp3d_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = { - grp3d_bus_scale_usecases, - ARRAY_SIZE(grp3d_bus_scale_usecases), - .name = "grp3d", -}; -#endif - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0x04300000, /* GFX3D address */ - .end = 0x0430ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_SHADER_MEMORY, - .start = 0x04310000, - .end = 0x0431ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = GFX3D_IRQ, - .end = GFX3D_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static const struct kgsl_iommu_ctx kgsl_3d0_iommu0_ctxs[] = { - { "gfx3d_user", 0 }, - { "gfx3d_priv", 1 }, -}; - -static struct kgsl_device_iommu_data kgsl_3d0_iommu_data[] = { - { - .iommu_ctxs = kgsl_3d0_iommu0_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu0_ctxs), - .physstart = 0x07C00000, - .physend = 0x07C00000 + SZ_1M - 1, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 400000000, - .bus_freq = 3, - .io_fraction = 0, - }, - { - .gpu_freq = 320000000, - .bus_freq = 2, - .io_fraction = 33, - }, - { - .gpu_freq = 192000000, - .bus_freq = 1, - .io_fraction = 100, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 1, - .num_levels = 4, - .set_grp_async = NULL, - .idle_timeout = HZ/12, - .strtstp_sleepwake = false, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp3d_bus_scale_pdata, -#endif - .iommu_data = kgsl_3d0_iommu_data, - .iommu_count = ARRAY_SIZE(kgsl_3d0_iommu_data), -}; - -static struct platform_device device_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -void __init msm8930_init_gpu(void) -{ - unsigned int version = socinfo_get_version(); - - /* Set the turbo speed for the AA and AB respectively */ - - if (cpu_is_msm8930aa()) - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 450000000; - else if (cpu_is_msm8930ab()) { - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 500000000; - grp3d_max_vectors[0].ib = KGSL_CONVERT_TO_MBPS(4800); - } - - /* Set up the chip ID based on the SoC version */ - - if (cpu_is_msm8930ab()) - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 0, 5, 3); - else if ((SOCINFO_VERSION_MAJOR(version) == 1) && - (SOCINFO_VERSION_MINOR(version) == 2)) - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 0, 5, 2); - else - kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 0, 5, 0); - - platform_device_register(&device_kgsl_3d0); -} diff --git a/arch/arm/mach-msm/board-8930-pmic.c b/arch/arm/mach-msm/board-8930-pmic.c deleted file mode 100644 index 55d0675f042f..000000000000 --- a/arch/arm/mach-msm/board-8930-pmic.c +++ /dev/null @@ -1,614 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8930.h" - -struct pm8xxx_gpio_init { - unsigned gpio; - struct pm_gpio config; -}; - -struct pm8xxx_mpp_init { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8038_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \ - _func, _inv, _disable) \ -{ \ - .gpio = PM8038_GPIO_PM_TO_SYS(_gpio), \ - .config = { \ - .direction = _dir, \ - .output_buffer = _buf, \ - .output_value = _val, \ - .pull = _pull, \ - .vin_sel = _vin, \ - .out_strength = _out_strength, \ - .function = _func, \ - .inv_int_pol = _inv, \ - .disable_pin = _disable, \ - } \ -} - -#define PM8038_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8038_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8038_GPIO_DISABLE(_gpio) \ - PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM8038_GPIO_VIN_L11, \ - 0, 0, 0, 1) - -#define PM8038_GPIO_OUTPUT(_gpio, _val) \ - PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8038_GPIO_INPUT(_gpio, _pull) \ - PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \ - _pull, PM8038_GPIO_VIN_L11, \ - PM_GPIO_STRENGTH_NO, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8038_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \ - PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \ - PM_GPIO_STRENGTH_HIGH, \ - _func, 0, 0) - -#define PM8038_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \ - PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, _vin, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8917_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \ - _func, _inv, _disable) \ -{ \ - .gpio = PM8917_GPIO_PM_TO_SYS(_gpio), \ - .config = { \ - .direction = _dir, \ - .output_buffer = _buf, \ - .output_value = _val, \ - .pull = _pull, \ - .vin_sel = _vin, \ - .out_strength = _out_strength, \ - .function = _func, \ - .inv_int_pol = _inv, \ - .disable_pin = _disable, \ - } \ -} - -#define PM8917_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8917_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8917_GPIO_DISABLE(_gpio) \ - PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \ - 0, 0, 0, 1) - -#define PM8917_GPIO_OUTPUT(_gpio, _val) \ - PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8917_GPIO_INPUT(_gpio, _pull) \ - PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \ - _pull, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_NO, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8917_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \ - PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_HIGH, \ - _func, 0, 0) - -#define PM8917_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \ - PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, _vin, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -/* GPIO and MPP configurations for MSM8930 + PM8038 targets */ - -/* Initial PM8038 GPIO configurations */ -static struct pm8xxx_gpio_init pm8038_gpios[] __initdata = { - /* keys GPIOs */ - PM8038_GPIO_INPUT(3, PM_GPIO_PULL_UP_30), - PM8038_GPIO_INPUT(8, PM_GPIO_PULL_UP_30), - PM8038_GPIO_INPUT(10, PM_GPIO_PULL_UP_30), - PM8038_GPIO_INPUT(11, PM_GPIO_PULL_UP_30), - /* haptics gpio */ - PM8038_GPIO_OUTPUT_FUNC(7, 0, PM_GPIO_FUNC_1), - /* MHL PWR EN */ - PM8038_GPIO_OUTPUT_VIN(5, 1, PM8038_GPIO_VIN_VPH), -}; - -/* Initial PM8038 MPP configurations */ -static struct pm8xxx_mpp_init pm8038_mpps[] __initdata = { -}; - -/* GPIO and MPP configurations for MSM8930 + PM8917 targets */ - -/* Initial PM8917 GPIO configurations */ -static struct pm8xxx_gpio_init pm8917_gpios[] __initdata = { - /* Backlight enable control */ - PM8917_GPIO_OUTPUT(24, 1), - /* keys GPIOs */ - PM8917_GPIO_INPUT(27, PM_GPIO_PULL_UP_30), - PM8917_GPIO_INPUT(28, PM_GPIO_PULL_UP_30), - PM8917_GPIO_INPUT(36, PM_GPIO_PULL_UP_30), - PM8917_GPIO_INPUT(37, PM_GPIO_PULL_UP_30), - /* haptics gpio */ - PM8917_GPIO_OUTPUT_FUNC(38, 0, PM_GPIO_FUNC_2), - /* MHL PWR EN */ - PM8917_GPIO_OUTPUT_VIN(25, 1, PM_GPIO_VIN_VPH), -}; - -/* Initial PM8917 MPP configurations */ -static struct pm8xxx_mpp_init pm8917_mpps[] __initdata = { - PM8917_MPP_INIT(PM8XXX_AMUX_MPP_3, A_INPUT, - PM8XXX_MPP_AIN_AMUX_CH8, DIN_TO_INT), - /* Configure MPP01 for USB ID detection */ - PM8917_MPP_INIT(1, D_INPUT, PM8921_MPP_DIG_LEVEL_S4, DIN_TO_INT), -}; - -void __init msm8930_pm8038_gpio_mpp_init(void) -{ - int i, rc; - - for (i = 0; i < ARRAY_SIZE(pm8038_gpios); i++) { - rc = pm8xxx_gpio_config(pm8038_gpios[i].gpio, - &pm8038_gpios[i].config); - if (rc) { - pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc); - break; - } - } - - /* Initial MPP configuration. */ - for (i = 0; i < ARRAY_SIZE(pm8038_mpps); i++) { - rc = pm8xxx_mpp_config(pm8038_mpps[i].mpp, - &pm8038_mpps[i].config); - if (rc) { - pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc); - break; - } - } -} - -void __init msm8930_pm8917_gpio_mpp_init(void) -{ - int i, rc; - - for (i = 0; i < ARRAY_SIZE(pm8917_gpios); i++) { - rc = pm8xxx_gpio_config(pm8917_gpios[i].gpio, - &pm8917_gpios[i].config); - if (rc) { - pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc); - break; - } - } - - /* Initial MPP configuration. */ - for (i = 0; i < ARRAY_SIZE(pm8917_mpps); i++) { - rc = pm8xxx_mpp_config(pm8917_mpps[i].mpp, - &pm8917_mpps[i].config); - if (rc) { - pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc); - break; - } - } -} - -static struct pm8xxx_adc_amux pm8038_adc_channels_data[] = { - {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM}, - {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM}, - {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pa_therm1", ADC_MPP_1_AMUX4, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, - {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0, - ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM}, - {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, -}; - -static struct pm8xxx_adc_properties pm8038_adc_data = { - .adc_vdd_reference = 1800, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, -}; - -static struct pm8xxx_adc_platform_data pm8038_adc_pdata = { - .adc_channel = pm8038_adc_channels_data, - .adc_num_board_channel = ARRAY_SIZE(pm8038_adc_channels_data), - .adc_prop = &pm8038_adc_data, - .adc_mpp_base = PM8038_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = { - .irq_base = PM8038_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(104), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = { - .gpio_base = PM8038_GPIO_PM_TO_SYS(1), -}; - -static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = { - .mpp_base = PM8038_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata = { - .rtc_write_enable = false, - .rtc_alarm_powerup = false, -}; - -static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = { - .pull_up = 1, - .kpd_trigger_delay_us = 15625, - .wakeup = 1, -}; - -static int pm8921_therm_mitigation[] = { - 1100, - 700, - 600, - 325, -}; - -#define MAX_VOLTAGE_MV 4200 -#define CHG_TERM_MA 100 -static struct pm8921_charger_platform_data pm8921_chg_pdata = { - .update_time = 60000, - .max_voltage = MAX_VOLTAGE_MV, - .min_voltage = 3200, - .uvd_thresh_voltage = 4050, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .resume_voltage_delta = 60, - .resume_charge_percent = 99, - .term_current = CHG_TERM_MA, - .cool_temp = 10, - .warm_temp = 45, - .temp_check_period = 1, - .max_bat_chg_current = 1100, - .cool_bat_chg_current = 350, - .warm_bat_chg_current = 350, - .cool_bat_voltage = 4100, - .warm_bat_voltage = 4100, - .thermal_mitigation = pm8921_therm_mitigation, - .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation), - .led_src_config = LED_SRC_VPH_PWR, - .rconn_mohm = 18, -}; - -#define PM8038_WLED_MAX_CURRENT 25 -#define PM8XXX_LED_PWM_PERIOD 1000 -#define PM8XXX_LED_PWM_DUTY_MS 20 -#define PM8038_RGB_LED_MAX_CURRENT 12 - -static struct led_info pm8038_led_info[] = { - [0] = { - .name = "wled", - .default_trigger = "bkl_trigger", - }, - [1] = { - .name = "led:rgb_red", - .default_trigger = "battery-charging", - }, - [2] = { - .name = "led:rgb_green", - }, - [3] = { - .name = "led:rgb_blue", - }, -}; - -static struct led_platform_data pm8038_led_core_pdata = { - .num_leds = ARRAY_SIZE(pm8038_led_info), - .leds = pm8038_led_info, -}; - -static struct wled_config_data wled_cfg = { - .dig_mod_gen_en = true, - .cs_out_en = true, - .ctrl_delay_us = 0, - .op_fdbck = true, - .ovp_val = WLED_OVP_32V, - .boost_curr_lim = WLED_CURR_LIMIT_525mA, - .strings = WLED_SECOND_STRING, -}; - -static int pm8038_led0_pwm_duty_pcts[56] = { - 1, 4, 8, 12, 16, 20, 24, 28, 32, 36, - 40, 44, 46, 52, 56, 60, 64, 68, 72, 76, - 80, 84, 88, 92, 96, 100, 100, 100, 98, 95, - 92, 88, 84, 82, 78, 74, 70, 66, 62, 58, - 58, 54, 50, 48, 42, 38, 34, 30, 26, 22, - 14, 10, 6, 4, 1 -}; - -/* - * Note: There is a bug in LPG module that results in incorrect - * behavior of pattern when LUT index 0 is used. So effectively - * there are 63 usable LUT entries. - */ -static struct pm8xxx_pwm_duty_cycles pm8038_led0_pwm_duty_cycles = { - .duty_pcts = (int *)&pm8038_led0_pwm_duty_pcts, - .num_duty_pcts = ARRAY_SIZE(pm8038_led0_pwm_duty_pcts), - .duty_ms = PM8XXX_LED_PWM_DUTY_MS, - .start_idx = 1, -}; - -static struct pm8xxx_led_config pm8038_led_configs[] = { - [0] = { - .id = PM8XXX_ID_WLED, - .mode = PM8XXX_LED_MODE_MANUAL, - .max_current = PM8038_WLED_MAX_CURRENT, - .default_state = 0, - .wled_cfg = &wled_cfg, - }, - [1] = { - .id = PM8XXX_ID_RGB_LED_RED, - .mode = PM8XXX_LED_MODE_PWM1, - .max_current = PM8038_RGB_LED_MAX_CURRENT, - .pwm_channel = 5, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles, - }, - [2] = { - .id = PM8XXX_ID_RGB_LED_GREEN, - .mode = PM8XXX_LED_MODE_PWM1, - .max_current = PM8038_RGB_LED_MAX_CURRENT, - .pwm_channel = 4, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles, - }, - [3] = { - .id = PM8XXX_ID_RGB_LED_BLUE, - .mode = PM8XXX_LED_MODE_PWM1, - .max_current = PM8038_RGB_LED_MAX_CURRENT, - .pwm_channel = 3, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles, - }, -}; - -static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = { - .led_core = &pm8038_led_core_pdata, - .configs = pm8038_led_configs, - .num_configs = ARRAY_SIZE(pm8038_led_configs), -}; - -static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = { - .r_sense_uohm = 10000, - .calib_delay_ms = 600000, -}; - -static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = { - .priority = 0, -}; - -/* - * 0x254=0xC8 (Threshold=110, preamp bias=01) - * 0x255=0xC1 (Hold=110, max attn=0000, mute=1) - * 0x256=0xB0 (decay=101, attack=10, delay=0) - */ - -static struct pm8xxx_spk_platform_data pm8xxx_spk_pdata = { - .spk_add_enable = false, - .cd_ng_threshold = 0x0, - .cd_nf_preamp_bias = 0x1, - .cd_ng_hold = 0x6, - .cd_ng_max_atten = 0x0, - .noise_mute = 1, - .cd_ng_decay_rate = 0x5, - .cd_ng_attack_rate = 0x2, - .cd_delay = 0x0, -}; - -static struct pm8921_bms_platform_data pm8921_bms_pdata = { - .battery_type = BATT_UNKNOWN, - .r_sense_uohm = 10000, - .v_cutoff = 3400, - .max_voltage_uv = MAX_VOLTAGE_MV * 1000, - .shutdown_soc_valid_limit = 20, - .adjust_soc_low_threshold = 25, - .chg_term_ua = CHG_TERM_MA * 1000, - .rconn_mohm = 18, - .normal_voltage_calc_ms = 20000, - .low_voltage_calc_ms = 1000, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .high_ocv_correction_limit_uv = 50, - .low_ocv_correction_limit_uv = 100, - .hold_soc_est = 3, - .enable_fcc_learning = 1, - .min_fcc_learning_soc = 20, - .min_fcc_ocv_pc = 30, - .min_fcc_learning_samples = 5, -}; - -static struct pm8038_platform_data pm8038_platform_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .rtc_pdata = &pm8xxx_rtc_pdata, - .pwrkey_pdata = &pm8xxx_pwrkey_pdata, - .misc_pdata = &pm8xxx_misc_pdata, - .regulator_pdatas = msm8930_pm8038_regulator_pdata, - .charger_pdata = &pm8921_chg_pdata, - .bms_pdata = &pm8921_bms_pdata, - .adc_pdata = &pm8038_adc_pdata, - .leds_pdata = &pm8xxx_leds_pdata, - .ccadc_pdata = &pm8xxx_ccadc_pdata, - .spk_pdata = &pm8xxx_spk_pdata, -}; - -static struct msm_ssbi_platform_data msm8930_ssbi_pm8038_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8038-core", - .platform_data = &pm8038_platform_data, - }, -}; - -/* PM8917 platform data */ - -static struct pm8xxx_adc_amux pm8917_adc_channels_data[] = { - {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM}, - {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM}, - {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0, - ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM}, - {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, - {"pa_therm1", ADC_MPP_1_AMUX8, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, -}; - -static struct pm8xxx_adc_properties pm8917_adc_data = { - .adc_vdd_reference = 1800, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, -}; - -static struct pm8xxx_adc_platform_data pm8917_adc_pdata = { - .adc_channel = pm8917_adc_channels_data, - .adc_num_board_channel = ARRAY_SIZE(pm8917_adc_channels_data), - .adc_prop = &pm8917_adc_data, - .adc_mpp_base = PM8917_MPP_PM_TO_SYS(1), -}; - -static struct pm8921_platform_data pm8917_platform_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .rtc_pdata = &pm8xxx_rtc_pdata, - .pwrkey_pdata = &pm8xxx_pwrkey_pdata, - .misc_pdata = &pm8xxx_misc_pdata, - .regulator_pdatas = msm8930_pm8917_regulator_pdata, - .charger_pdata = &pm8921_chg_pdata, - .bms_pdata = &pm8921_bms_pdata, - .adc_pdata = &pm8917_adc_pdata, - .ccadc_pdata = &pm8xxx_ccadc_pdata, -}; - -static struct msm_ssbi_platform_data msm8930_ssbi_pm8917_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8921-core", - .platform_data = &pm8917_platform_data, - }, -}; - -void __init msm8930_init_pmic(void) -{ - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) { - /* PM8038 configuration */ - pmic_reset_irq = PM8038_IRQ_BASE + PM8038_RESOUT_IRQ; - msm8960_device_ssbi_pmic.dev.platform_data = - &msm8930_ssbi_pm8038_pdata; - pm8038_platform_data.num_regulators - = msm8930_pm8038_regulator_pdata_len; - if (machine_is_msm8930_mtp()) - pm8921_bms_pdata.battery_type = BATT_PALLADIUM; - else if (machine_is_msm8930_cdp()) - pm8921_chg_pdata.has_dc_supply = true; - } else { - /* PM8917 configuration */ - pmic_reset_irq = PM8917_IRQ_BASE + PM8921_RESOUT_IRQ; - msm8960_device_ssbi_pmic.dev.platform_data = - &msm8930_ssbi_pm8917_pdata; - pm8917_platform_data.num_regulators - = msm8930_pm8917_regulator_pdata_len; - if (machine_is_msm8930_mtp()) - pm8921_bms_pdata.battery_type = BATT_PALLADIUM; - else if (machine_is_msm8930_cdp()) - pm8921_chg_pdata.has_dc_supply = true; - } - - if (!machine_is_msm8930_mtp()) - pm8921_chg_pdata.battery_less_hardware = 1; -} diff --git a/arch/arm/mach-msm/board-8930-regulator-pm8038.c b/arch/arm/mach-msm/board-8930-regulator-pm8038.c deleted file mode 100644 index ccf503bdf27d..000000000000 --- a/arch/arm/mach-msm/board-8930-regulator-pm8038.c +++ /dev/null @@ -1,589 +0,0 @@ -/* - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * This file contains regulator configuration and mappings for targets - * consisting of MSM8930 and PM8038. - */ - -#include - -#include "board-8930.h" - -#define VREG_CONSUMERS(_id) \ - static struct regulator_consumer_supply vreg_consumers_##_id[] - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -VREG_CONSUMERS(L1) = { - REGULATOR_SUPPLY("8038_l1", NULL), - REGULATOR_SUPPLY("iris_vddrfa", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L2) = { - REGULATOR_SUPPLY("8038_l2", NULL), - REGULATOR_SUPPLY("iris_vdddig", "wcnss_wlan.0"), - REGULATOR_SUPPLY("dsi_vdda", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vdda", "mdp.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.1"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.2"), -}; -VREG_CONSUMERS(L3) = { - REGULATOR_SUPPLY("8038_l3", NULL), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"), -}; -VREG_CONSUMERS(L4) = { - REGULATOR_SUPPLY("8038_l4", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"), - REGULATOR_SUPPLY("iris_vddxo", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L5) = { - REGULATOR_SUPPLY("8038_l5", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.1"), -}; -VREG_CONSUMERS(L6) = { - REGULATOR_SUPPLY("8038_l6", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L7) = { - REGULATOR_SUPPLY("8038_l7", NULL), -}; -VREG_CONSUMERS(L8) = { - REGULATOR_SUPPLY("8038_l8", NULL), - REGULATOR_SUPPLY("dsi_vdc", "mipi_dsi.1"), -}; -VREG_CONSUMERS(L9) = { - REGULATOR_SUPPLY("8038_l9", NULL), - REGULATOR_SUPPLY("vdd_ana", "3-004a"), - REGULATOR_SUPPLY("vdd", "3-0024"), - REGULATOR_SUPPLY("cam_vana", "4-001a"), - REGULATOR_SUPPLY("cam_vana", "4-006c"), - REGULATOR_SUPPLY("cam_vana", "4-0048"), - REGULATOR_SUPPLY("cam_vaf", "4-001a"), - REGULATOR_SUPPLY("cam_vaf", "4-006c"), - REGULATOR_SUPPLY("cam_vaf", "4-0048"), - REGULATOR_SUPPLY("cam_vana", "4-0020"), - REGULATOR_SUPPLY("cam_vaf", "4-0020"), - REGULATOR_SUPPLY("vdd", "12-0018"), - REGULATOR_SUPPLY("vdd", "12-0068"), -}; -VREG_CONSUMERS(L10) = { - REGULATOR_SUPPLY("8038_l10", NULL), - REGULATOR_SUPPLY("iris_vddpa", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L11) = { - REGULATOR_SUPPLY("8038_l11", NULL), - REGULATOR_SUPPLY("vdd_dig", "3-004a"), - REGULATOR_SUPPLY("iris_vddio", "wcnss_wlan.0"), - REGULATOR_SUPPLY("riva_vddpx", "wcnss_wlan.0"), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.1"), - REGULATOR_SUPPLY("VDDIO_CDC", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "sitar-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "sitar1p1-slim"), - REGULATOR_SUPPLY("vcc_i2c", "0-0048"), - REGULATOR_SUPPLY("mhl_iovcc18", "0-0039"), - REGULATOR_SUPPLY("vdd-io", "spi0.0"), - REGULATOR_SUPPLY("vdd-phy", "spi0.0"), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.2"), -}; -VREG_CONSUMERS(L12) = { - REGULATOR_SUPPLY("8038_l12", NULL), - REGULATOR_SUPPLY("cam_vdig", "4-001a"), - REGULATOR_SUPPLY("cam_vdig", "4-006c"), - REGULATOR_SUPPLY("cam_vdig", "4-0048"), - REGULATOR_SUPPLY("cam_vdig", "4-0020"), -}; -VREG_CONSUMERS(L13) = { - REGULATOR_SUPPLY("8038_l13", NULL), -}; -VREG_CONSUMERS(L14) = { - REGULATOR_SUPPLY("8038_l14", NULL), - REGULATOR_SUPPLY("pa_therm", "pm8xxx-adc"), -}; -VREG_CONSUMERS(L15) = { - REGULATOR_SUPPLY("8038_l15", NULL), -}; -VREG_CONSUMERS(L16) = { - REGULATOR_SUPPLY("8038_l16", NULL), - REGULATOR_SUPPLY("sw_core_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L17) = { - REGULATOR_SUPPLY("8038_l17", NULL), -}; -VREG_CONSUMERS(L18) = { - REGULATOR_SUPPLY("8038_l18", NULL), -}; -VREG_CONSUMERS(L19) = { - REGULATOR_SUPPLY("8038_l19", NULL), - REGULATOR_SUPPLY("fw_core_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L20) = { - REGULATOR_SUPPLY("8038_l20", NULL), - REGULATOR_SUPPLY("VDDD_CDC_D", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "sitar-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "sitar1p1-slim"), - REGULATOR_SUPPLY("mhl_avcc12", "0-0039"), -}; -VREG_CONSUMERS(L21) = { - REGULATOR_SUPPLY("8038_l21", NULL), -}; -VREG_CONSUMERS(L22) = { - REGULATOR_SUPPLY("8038_l22", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L23) = { - REGULATOR_SUPPLY("8038_l23", NULL), - REGULATOR_SUPPLY("dsi_vddio", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vddio", "mdp.0"), - REGULATOR_SUPPLY("hdmi_avdd", "hdmi_msm.0"), - REGULATOR_SUPPLY("hdmi_vcc", "hdmi_msm.0"), - REGULATOR_SUPPLY("pll_vdd", "pil_riva"), - REGULATOR_SUPPLY("pll_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L24) = { - REGULATOR_SUPPLY("8038_l24", NULL), - REGULATOR_SUPPLY("riva_vddmx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L25) = { - REGULATOR_SUPPLY("8038_l25", NULL), -}; -VREG_CONSUMERS(L26) = { - REGULATOR_SUPPLY("8038_l26", NULL), -}; -VREG_CONSUMERS(L27) = { - REGULATOR_SUPPLY("8038_l27", NULL), - REGULATOR_SUPPLY("core_vdd", "pil-q6v4-lpass"), -}; -VREG_CONSUMERS(S1) = { - REGULATOR_SUPPLY("8038_s1", NULL), - REGULATOR_SUPPLY("riva_vddcx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(S2) = { - REGULATOR_SUPPLY("8038_s2", NULL), -}; -VREG_CONSUMERS(S3) = { - REGULATOR_SUPPLY("8038_s3", NULL), -}; -VREG_CONSUMERS(S4) = { - REGULATOR_SUPPLY("8038_s4", NULL), - REGULATOR_SUPPLY("CDC_VDD_CP", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "sitar1p1-slim"), -}; -VREG_CONSUMERS(S5) = { - REGULATOR_SUPPLY("8038_s5", NULL), - REGULATOR_SUPPLY("krait0", "acpuclk-8627"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930aa"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930ab"), -}; -VREG_CONSUMERS(S6) = { - REGULATOR_SUPPLY("8038_s6", NULL), - REGULATOR_SUPPLY("krait1", "acpuclk-8627"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930aa"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930ab"), -}; -VREG_CONSUMERS(LVS1) = { - REGULATOR_SUPPLY("8038_lvs1", NULL), - REGULATOR_SUPPLY("cam_vio", "4-001a"), - REGULATOR_SUPPLY("cam_vio", "4-006c"), - REGULATOR_SUPPLY("cam_vio", "4-0048"), - REGULATOR_SUPPLY("cam_vio", "4-0020"), -}; -VREG_CONSUMERS(LVS2) = { - REGULATOR_SUPPLY("8038_lvs2", NULL), - REGULATOR_SUPPLY("vcc_i2c", "3-004a"), - REGULATOR_SUPPLY("vcc_i2c", "3-0024"), - REGULATOR_SUPPLY("vddio", "12-0018"), - REGULATOR_SUPPLY("vlogic", "12-0068"), -}; -VREG_CONSUMERS(EXT_5V) = { - REGULATOR_SUPPLY("ext_5v", NULL), - REGULATOR_SUPPLY("hdmi_mvs", "hdmi_msm.0"), - REGULATOR_SUPPLY("mhl_usb_hs_switch", "msm_otg"), -}; -VREG_CONSUMERS(EXT_OTG_SW) = { - REGULATOR_SUPPLY("ext_otg_sw", NULL), - REGULATOR_SUPPLY("vbus_otg", "msm_otg"), -}; -VREG_CONSUMERS(VDD_DIG_CORNER) = { - REGULATOR_SUPPLY("vdd_dig_corner", NULL), - REGULATOR_SUPPLY("hsusb_vdd_dig", "msm_otg"), -}; - -#define PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, _modes, _ops, \ - _apply_uV, _pull_down, _always_on, _supply_regulator, \ - _system_uA, _enable_time, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pull_down_enable = _pull_down, \ - .system_uA = _system_uA, \ - .enable_time = _enable_time, \ - } - -#define PM8XXX_LDO(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_NLDO1200(_id, _name, _always_on, _pull_down, _min_uV, \ - _max_uV, _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_SMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_FTSMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS \ - | REGULATOR_CHANGE_MODE, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_VS(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_VS300(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_NCP(_id, _name, _always_on, _min_uV, _max_uV, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, 0, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, 0, \ - _always_on, _supply_regulator, 0, _enable_time, _reg_id) - -/* Pin control initialization */ -#define PM8XXX_PC(_id, _name, _always_on, _pin_fn, _pin_ctrl, \ - _supply_regulator, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pin_fn = PM8XXX_VREG_PIN_FN_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \ - _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \ - _force_mode, _sleep_set_force_mode, _power_mode, _state, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8038_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .power_mode = _power_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - .system_uA = _system_uA, \ - } - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _init_peak_uA) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _freq, _force_mode, \ - _sleep_set_force_mode) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _min_uV, _system_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_##_force_mode, \ - RPM_VREG_FORCE_MODE_8930_##_sleep_set_force_mode, \ - RPM_VREG_POWER_MODE_8930_PWM, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \ - RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_NCP(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _freq) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 1000, 1000, 0, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_CORNER(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 0, 0, 0, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -/* Pin control initialization */ -#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8038_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_8930_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define GPIO_VREG(_id, _reg_name, _gpio_label, _gpio, _supply_regulator) \ - [MSM8930_GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .regulator_name = _reg_name, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -#define SAW_VREG_INIT(_id, _name, _min_uV, _max_uV) \ - { \ - .constraints = { \ - .name = _name, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - }, \ - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - } - -/* GPIO regulator constraints */ -struct gpio_regulator_platform_data -msm8930_pm8038_gpio_regulator_pdata[] = { - /* ID vreg_name gpio_label gpio supply */ - GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en", 63, NULL), - GPIO_VREG(EXT_OTG_SW, "ext_otg_sw", "ext_otg_sw_en", 97, "ext_5v"), -}; - -/* SAW regulator constraints */ -struct regulator_init_data msm8930_pm8038_saw_regulator_core0_pdata = - /* ID vreg_name min_uV max_uV */ - SAW_VREG_INIT(S5, "8038_s5", 850000, 1300000); -struct regulator_init_data msm8930_pm8038_saw_regulator_core1_pdata = - SAW_VREG_INIT(S6, "8038_s6", 850000, 1300000); - -/* PM8038 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm8930_pm8038_regulator_pdata[] = { - /* - * ID name always_on pd min_uV max_uV en_t supply - * system_uA reg_ID - */ - PM8XXX_NLDO1200(L16, "8038_l16", 0, 1, 375000, 1050000, 200, "8038_s3", - 0, 0), - PM8XXX_NLDO1200(L19, "8038_l19", 0, 1, 375000, 1050000, 200, "8038_s3", - 0, 1), - PM8XXX_NLDO1200(L27, "8038_l27", 0, 1, 375000, 1050000, 200, "8038_s3", - 0, 2), -}; - -static struct rpm_regulator_init_data -msm8930_rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV supply sys_uA freq fm ss_fm */ - RPM_SMPS(S1, 0, 1, 1, 500000, 1150000, NULL, 100000, 4p80, AUTO, LPM), - RPM_SMPS(S2, 1, 1, 1, 1400000, 1400000, NULL, 100000, 1p60, AUTO, LPM), - RPM_SMPS(S3, 0, 1, 1, 1150000, 1150000, NULL, 100000, 3p20, AUTO, AUTO), - RPM_SMPS(S4, 1, 1, 1, 1950000, 2200000, NULL, 100000, 1p60, AUTO, LPM), - - /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */ - RPM_LDO(L1, 0, 1, 0, 1300000, 1300000, "8038_s2", 0, 0), - RPM_LDO(L2, 0, 1, 0, 1200000, 1200000, "8038_s2", 0, 0), - RPM_LDO(L3, 0, 1, 0, 3075000, 3075000, NULL, 0, 0), - RPM_LDO(L4, 1, 1, 0, 1800000, 1800000, NULL, 10000, 10000), - RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L7, 0, 1, 0, 2050000, 2050000, "8038_s4", 0, 0), - RPM_LDO(L8, 0, 1, 0, 2800000, 2800000, NULL, 0, 0), - RPM_LDO(L9, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L10, 0, 1, 0, 2900000, 2900000, NULL, 0, 0), - RPM_LDO(L11, 1, 1, 0, 1800000, 1800000, "8038_s4", 10000, 10000), - RPM_LDO(L12, 0, 1, 0, 1200000, 1200000, "8038_s2", 0, 0), - RPM_LDO(L13, 0, 0, 0, 2220000, 2220000, NULL, 0, 0), - RPM_LDO(L14, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L15, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L17, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L18, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L20, 1, 1, 0, 1250000, 1250000, "8038_s2", 10000, 10000), - RPM_LDO(L21, 0, 1, 0, 1900000, 1900000, "8038_s4", 0, 0), - RPM_LDO(L22, 1, 1, 0, 1850000, 2950000, NULL, 10000, 10000), - RPM_LDO(L23, 1, 1, 1, 1800000, 1800000, "8038_s4", 0, 0), - RPM_LDO(L24, 0, 1, 1, 500000, 1150000, "8038_s2", 10000, 10000), - RPM_LDO(L25, 0, 0, 0, 1740000, 1740000, "8038_l13", 0, 0), - RPM_LDO(L26, 1, 1, 0, 1050000, 1050000, "8038_s2", 10000, 10000), - - /* ID a_on pd ss supply */ - RPM_VS(LVS1, 0, 1, 0, "8038_l11"), - RPM_VS(LVS2, 0, 1, 0, "8038_l11"), - - /* ID a_on ss min_corner max_corner supply */ - RPM_CORNER(VDD_DIG_CORNER, 0, 1, RPM_VREG_CORNER_NONE, - RPM_VREG_CORNER_HIGH, NULL), -}; - -int msm8930_pm8038_regulator_pdata_len = - ARRAY_SIZE(msm8930_pm8038_regulator_pdata); - -#define RPM_REG_MAP(_id, _sleep_also, _voter, _supply, _dev_name) \ - { \ - .vreg_id = RPM_VREG_ID_PM8038_##_id, \ - .sleep_also = _sleep_also, \ - .voter = _voter, \ - .supply = _supply, \ - .dev_name = _dev_name, \ - } -static struct rpm_regulator_consumer_mapping - msm_rpm_regulator_consumer_mapping[] = { - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8930"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8930"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8930"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930"), - - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8627"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8627"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8627"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8627"), - - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930aa"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930aa"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930aa"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930aa"), - - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8930ab"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8930ab"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8930ab"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930ab"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930ab"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930ab"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930ab"), -}; - -struct rpm_regulator_platform_data -msm8930_pm8038_rpm_regulator_pdata = { - .init_data = msm8930_rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(msm8930_rpm_regulator_init_data), - .version = RPM_VREG_VERSION_8930, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8038_L24, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8038_VDD_DIG_CORNER, - .consumer_map = msm_rpm_regulator_consumer_mapping, - .consumer_map_len = ARRAY_SIZE(msm_rpm_regulator_consumer_mapping), -}; diff --git a/arch/arm/mach-msm/board-8930-regulator-pm8917.c b/arch/arm/mach-msm/board-8930-regulator-pm8917.c deleted file mode 100644 index ba0946d92dda..000000000000 --- a/arch/arm/mach-msm/board-8930-regulator-pm8917.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * This file contains regulator configuration and mappings for targets - * consisting of MSM8930 and PM8917. - */ - -#include - -#include "board-8930.h" - -#define VREG_CONSUMERS(_id) \ - static struct regulator_consumer_supply vreg_consumers_##_id[] - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -VREG_CONSUMERS(L1) = { - REGULATOR_SUPPLY("8917_l1", NULL), -}; -VREG_CONSUMERS(L2) = { - REGULATOR_SUPPLY("8917_l2", NULL), - REGULATOR_SUPPLY("iris_vdddig", "wcnss_wlan.0"), - REGULATOR_SUPPLY("dsi_vdda", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vdda", "mdp.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.1"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.2"), -}; -VREG_CONSUMERS(L3) = { - REGULATOR_SUPPLY("8917_l3", NULL), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"), -}; -VREG_CONSUMERS(L4) = { - REGULATOR_SUPPLY("8917_l4", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"), - REGULATOR_SUPPLY("iris_vddxo", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L5) = { - REGULATOR_SUPPLY("8917_l5", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.1"), -}; -VREG_CONSUMERS(L6) = { - REGULATOR_SUPPLY("8917_l6", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L7) = { - REGULATOR_SUPPLY("8917_l7", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L8) = { - REGULATOR_SUPPLY("8917_l8", NULL), - REGULATOR_SUPPLY("dsi_vdc", "mipi_dsi.1"), -}; -VREG_CONSUMERS(L9) = { - REGULATOR_SUPPLY("8917_l9", NULL), - REGULATOR_SUPPLY("vdd_ana", "3-004a"), - REGULATOR_SUPPLY("vdd", "3-0024"), - REGULATOR_SUPPLY("vdd", "12-0018"), - REGULATOR_SUPPLY("vdd", "12-0068"), -}; -VREG_CONSUMERS(L10) = { - REGULATOR_SUPPLY("8917_l10", NULL), - REGULATOR_SUPPLY("iris_vddpa", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L11) = { - REGULATOR_SUPPLY("8917_l11", NULL), - REGULATOR_SUPPLY("cam_vana", "4-001a"), - REGULATOR_SUPPLY("cam_vana", "4-006c"), - REGULATOR_SUPPLY("cam_vana", "4-0048"), - REGULATOR_SUPPLY("cam_vana", "4-0020"), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.2"), -}; -VREG_CONSUMERS(L12) = { - REGULATOR_SUPPLY("8917_l12", NULL), - REGULATOR_SUPPLY("cam_vdig", "4-001a"), - REGULATOR_SUPPLY("cam_vdig", "4-006c"), - REGULATOR_SUPPLY("cam_vdig", "4-0048"), - REGULATOR_SUPPLY("cam_vdig", "4-0020"), -}; -VREG_CONSUMERS(L14) = { - REGULATOR_SUPPLY("8917_l14", NULL), - REGULATOR_SUPPLY("pa_therm", "pm8xxx-adc"), -}; -VREG_CONSUMERS(L15) = { - REGULATOR_SUPPLY("8917_l15", NULL), -}; -VREG_CONSUMERS(L16) = { - REGULATOR_SUPPLY("8917_l16", NULL), - REGULATOR_SUPPLY("cam_vaf", "4-001a"), - REGULATOR_SUPPLY("cam_vaf", "4-006c"), - REGULATOR_SUPPLY("cam_vaf", "4-0048"), - REGULATOR_SUPPLY("cam_vaf", "4-0020"), -}; -VREG_CONSUMERS(L17) = { - REGULATOR_SUPPLY("8917_l17", NULL), -}; -VREG_CONSUMERS(L18) = { - REGULATOR_SUPPLY("8917_l18", NULL), -}; -VREG_CONSUMERS(L21) = { - REGULATOR_SUPPLY("8917_l21", NULL), -}; -VREG_CONSUMERS(L22) = { - REGULATOR_SUPPLY("8917_l22", NULL), -}; -VREG_CONSUMERS(L23) = { - REGULATOR_SUPPLY("8917_l23", NULL), - REGULATOR_SUPPLY("dsi_vddio", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vddio", "mdp.0"), - REGULATOR_SUPPLY("hdmi_avdd", "hdmi_msm.0"), - REGULATOR_SUPPLY("hdmi_vcc", "hdmi_msm.0"), - REGULATOR_SUPPLY("pll_vdd", "pil_riva"), - REGULATOR_SUPPLY("pll_vdd", "pil_qdsp6v4.1"), - REGULATOR_SUPPLY("pll_vdd", "pil_qdsp6v4.2"), -}; -VREG_CONSUMERS(L24) = { - REGULATOR_SUPPLY("8917_l24", NULL), - REGULATOR_SUPPLY("riva_vddmx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L25) = { - REGULATOR_SUPPLY("8917_l25", NULL), - REGULATOR_SUPPLY("VDDD_CDC_D", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "sitar-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "sitar1p1-slim"), - REGULATOR_SUPPLY("mhl_avcc12", "0-0039"), -}; -VREG_CONSUMERS(L26) = { - REGULATOR_SUPPLY("8921_l26", NULL), - REGULATOR_SUPPLY("core_vdd", "pil_qdsp6v4.0"), -}; -VREG_CONSUMERS(L27) = { - REGULATOR_SUPPLY("8921_l27", NULL), - REGULATOR_SUPPLY("core_vdd", "pil_qdsp6v4.2"), -}; -VREG_CONSUMERS(L28) = { - REGULATOR_SUPPLY("8921_l28", NULL), - REGULATOR_SUPPLY("core_vdd", "pil_qdsp6v4.1"), -}; -VREG_CONSUMERS(L29) = { - REGULATOR_SUPPLY("8921_l29", NULL), -}; -VREG_CONSUMERS(L30) = { - REGULATOR_SUPPLY("8917_l30", NULL), -}; -VREG_CONSUMERS(L31) = { - REGULATOR_SUPPLY("8917_l31", NULL), -}; -VREG_CONSUMERS(L32) = { - REGULATOR_SUPPLY("8917_l32", NULL), -}; -VREG_CONSUMERS(L33) = { - REGULATOR_SUPPLY("8917_l33", NULL), -}; -VREG_CONSUMERS(L34) = { - REGULATOR_SUPPLY("8917_l34", NULL), -}; -VREG_CONSUMERS(L35) = { - REGULATOR_SUPPLY("8917_l35", NULL), -}; -VREG_CONSUMERS(L36) = { - REGULATOR_SUPPLY("8917_l36", NULL), -}; -VREG_CONSUMERS(S1) = { - REGULATOR_SUPPLY("8917_s1", NULL), -}; -VREG_CONSUMERS(S2) = { - REGULATOR_SUPPLY("8917_s2", NULL), - REGULATOR_SUPPLY("iris_vddrfa", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(S3) = { - REGULATOR_SUPPLY("8917_s3", NULL), - REGULATOR_SUPPLY("riva_vddcx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(S4) = { - REGULATOR_SUPPLY("8917_s4", NULL), - REGULATOR_SUPPLY("vdd_dig", "3-004a"), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.1"), - REGULATOR_SUPPLY("VDDIO_CDC", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "sitar-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "sitar1p1-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "sitar1p1-slim"), - REGULATOR_SUPPLY("vcc_i2c", "0-0048"), - REGULATOR_SUPPLY("mhl_iovcc18", "0-0039"), - REGULATOR_SUPPLY("CDC_VDD_CP", "sitar-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "sitar1p1-slim"), - REGULATOR_SUPPLY("vdd-io", "spi0.0"), - REGULATOR_SUPPLY("vdd-phy", "spi0.0"), -}; -VREG_CONSUMERS(S5) = { - REGULATOR_SUPPLY("8917_s5", NULL), - REGULATOR_SUPPLY("krait0", "acpuclk-8627"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930aa"), - REGULATOR_SUPPLY("krait0", "acpuclk-8930ab"), -}; -VREG_CONSUMERS(S6) = { - REGULATOR_SUPPLY("8917_s6", NULL), - REGULATOR_SUPPLY("krait1", "acpuclk-8627"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930aa"), - REGULATOR_SUPPLY("krait1", "acpuclk-8930ab"), -}; -VREG_CONSUMERS(S7) = { - REGULATOR_SUPPLY("8917_s7", NULL), -}; -VREG_CONSUMERS(S8) = { - REGULATOR_SUPPLY("8917_s8", NULL), -}; -VREG_CONSUMERS(LVS1) = { - REGULATOR_SUPPLY("8917_lvs1", NULL), - REGULATOR_SUPPLY("iris_vddio", "wcnss_wlan.0"), - REGULATOR_SUPPLY("riva_vddpx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(LVS3) = { - REGULATOR_SUPPLY("8917_lvs3", NULL), -}; -VREG_CONSUMERS(LVS4) = { - REGULATOR_SUPPLY("8917_lvs4", NULL), - REGULATOR_SUPPLY("vcc_i2c", "3-004a"), - REGULATOR_SUPPLY("vcc_i2c", "3-0024"), - REGULATOR_SUPPLY("vddio", "12-0018"), - REGULATOR_SUPPLY("vlogic", "12-0068"), -}; -VREG_CONSUMERS(LVS5) = { - REGULATOR_SUPPLY("8917_lvs5", NULL), - REGULATOR_SUPPLY("cam_vio", "4-001a"), - REGULATOR_SUPPLY("cam_vio", "4-006c"), - REGULATOR_SUPPLY("cam_vio", "4-0048"), - REGULATOR_SUPPLY("cam_vio", "4-0020"), -}; -VREG_CONSUMERS(LVS6) = { - REGULATOR_SUPPLY("8917_lvs6", NULL), -}; -VREG_CONSUMERS(LVS7) = { - REGULATOR_SUPPLY("8917_lvs7", NULL), -}; -VREG_CONSUMERS(USB_OTG) = { - REGULATOR_SUPPLY("8921_usb_otg", NULL), - REGULATOR_SUPPLY("vbus_otg", "msm_otg"), -}; -VREG_CONSUMERS(BOOST) = { - REGULATOR_SUPPLY("8917_boost", NULL), - REGULATOR_SUPPLY("hdmi_mvs", "hdmi_msm.0"), - REGULATOR_SUPPLY("mhl_usb_hs_switch", "msm_otg"), -}; -VREG_CONSUMERS(VDD_DIG_CORNER) = { - REGULATOR_SUPPLY("vdd_dig_corner", NULL), - REGULATOR_SUPPLY("hsusb_vdd_dig", "msm_otg"), -}; - - -#define PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, _modes, _ops, \ - _apply_uV, _pull_down, _always_on, _supply_regulator, \ - _system_uA, _enable_time, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pull_down_enable = _pull_down, \ - .system_uA = _system_uA, \ - .enable_time = _enable_time, \ - } - -#define PM8XXX_LDO(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_NLDO1200(_id, _name, _always_on, _pull_down, _min_uV, \ - _max_uV, _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_SMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_FTSMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS \ - | REGULATOR_CHANGE_MODE, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_VS(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_VS300(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_BOOST(_id, _name, _always_on, _min_uV, _max_uV, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, 0, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, 0, \ - _always_on, _supply_regulator, 0, _enable_time, _reg_id) - -/* Pin control initialization */ -#define PM8XXX_PC(_id, _name, _always_on, _pin_fn, _pin_ctrl, \ - _supply_regulator, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pin_fn = PM8XXX_VREG_PIN_FN_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \ - _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \ - _force_mode, _sleep_set_force_mode, _power_mode, _state, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8917_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .power_mode = _power_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - .system_uA = _system_uA, \ - } - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _init_peak_uA) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _freq, _force_mode, \ - _sleep_set_force_mode) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _min_uV, _system_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_##_force_mode, \ - RPM_VREG_FORCE_MODE_8930_##_sleep_set_force_mode, \ - RPM_VREG_POWER_MODE_8930_PWM, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \ - RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_NCP(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _freq) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 1000, 1000, 0, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_CORNER(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 0, 0, 0, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, \ - RPM_VREG_FORCE_MODE_8930_NONE, RPM_VREG_POWER_MODE_8930_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -/* Pin control initialization */ -#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8917_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_8930_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define GPIO_VREG(_id, _reg_name, _gpio_label, _gpio, _supply_regulator) \ - [MSM8930_GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .regulator_name = _reg_name, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -#define SAW_VREG_INIT(_id, _name, _min_uV, _max_uV) \ - { \ - .constraints = { \ - .name = _name, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - }, \ - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - } - -/* GPIO regulator constraints */ -struct gpio_regulator_platform_data -msm8930_pm8917_gpio_regulator_pdata[] = { - /* ID vreg_name gpio_label gpio supply */ -}; - -/* SAW regulator constraints */ -struct regulator_init_data msm8930_pm8917_saw_regulator_core0_pdata = - /* ID vreg_name min_uV max_uV */ - SAW_VREG_INIT(S5, "8917_s5", 850000, 1300000); -struct regulator_init_data msm8930_pm8917_saw_regulator_core1_pdata = - SAW_VREG_INIT(S6, "8917_s6", 850000, 1300000); - -/* PM8917 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm8930_pm8917_regulator_pdata[] = { - /* - * ID name always_on pd min_uV max_uV en_t supply - * system_uA reg_ID - */ - PM8XXX_NLDO1200(L26, "8921_l26", 0, 1, 375000, 1050000, 200, "8917_s7", - 0, 0), - PM8XXX_NLDO1200(L27, "8921_l27", 0, 1, 375000, 1050000, 200, "8917_s7", - 0, 1), - PM8XXX_NLDO1200(L28, "8921_l28", 0, 1, 375000, 1050000, 200, "8917_s7", - 0, 2), - PM8XXX_LDO(L29, "8921_l29", 0, 1, 1800000, 1800000, 200, "8917_s8", - 0, 3), - PM8XXX_LDO(L30, "8917_l30", 0, 1, 1800000, 1800000, 200, NULL, - 0, 4), - PM8XXX_LDO(L31, "8917_l31", 0, 1, 1800000, 1800000, 200, NULL, - 0, 5), - PM8XXX_LDO(L32, "8917_l32", 0, 1, 2800000, 2800000, 200, NULL, - 0, 6), - PM8XXX_LDO(L33, "8917_l33", 0, 1, 2800000, 2800000, 200, NULL, - 0, 7), - PM8XXX_LDO(L34, "8917_l34", 0, 1, 1800000, 1800000, 200, NULL, - 0, 8), - PM8XXX_LDO(L35, "8917_l35", 0, 1, 3000000, 3000000, 200, NULL, - 0, 9), - PM8XXX_LDO(L36, "8917_l36", 0, 1, 1800000, 1800000, 200, NULL, - 0, 10), - /* - * ID name always_on min_uV max_uV en_t supply reg_ID - */ - PM8XXX_BOOST(BOOST, "8917_boost", 0, 5000000, 5000000, 500, NULL, 11), - - /* ID name always_on pd en_t supply reg_ID */ - PM8XXX_VS300(USB_OTG, "8921_usb_otg", 0, 1, 0, "8917_boost", 12), -}; - -static struct rpm_regulator_init_data -msm8930_rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV supply sys_uA freq fm ss_fm */ - RPM_SMPS(S1, 1, 1, 0, 1300000, 1300000, NULL, 100000, 3p20, NONE, NONE), - RPM_SMPS(S2, 0, 1, 0, 1300000, 1300000, NULL, 0, 1p60, NONE, NONE), - RPM_SMPS(S3, 0, 1, 1, 500000, 1150000, NULL, 100000, 4p80, NONE, NONE), - RPM_SMPS(S4, 1, 1, 0, 1800000, 1800000, NULL, 100000, 1p60, NONE, NONE), - RPM_SMPS(S7, 0, 1, 0, 1150000, 1150000, NULL, 100000, 3p20, AUTO, AUTO), - RPM_SMPS(S8, 1, 1, 1, 2050000, 2050000, NULL, 100000, 1p60, NONE, NONE), - - /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */ - RPM_LDO(L1, 0, 1, 0, 1050000, 1050000, "8917_s4", 0, 10000), - RPM_LDO(L2, 0, 1, 0, 1200000, 1200000, "8917_s4", 0, 0), - RPM_LDO(L3, 0, 1, 0, 3075000, 3075000, NULL, 0, 0), - RPM_LDO(L4, 1, 1, 0, 1800000, 1800000, NULL, 10000, 10000), - RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L7, 1, 1, 0, 1850000, 2950000, NULL, 10000, 10000), - RPM_LDO(L8, 0, 1, 0, 2800000, 2800000, NULL, 0, 0), - RPM_LDO(L9, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L10, 0, 1, 0, 2900000, 2900000, NULL, 0, 0), - RPM_LDO(L11, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L12, 0, 1, 0, 1200000, 1200000, "8917_s4", 0, 0), - RPM_LDO(L14, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L15, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L16, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L17, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L18, 0, 1, 0, 1200000, 1200000, "8917_s4", 0, 0), - RPM_LDO(L21, 0, 1, 0, 1900000, 1900000, "8917_s8", 0, 0), - RPM_LDO(L22, 0, 1, 0, 2750000, 2750000, NULL, 0, 0), - RPM_LDO(L23, 1, 1, 1, 1800000, 1800000, "8917_s8", 10000, 10000), - RPM_LDO(L24, 0, 1, 1, 500000, 1150000, "8917_s1", 10000, 10000), - RPM_LDO(L25, 1, 1, 0, 1250000, 1250000, "8917_s1", 10000, 10000), - - /* ID a_on pd ss supply */ - RPM_VS(LVS1, 0, 1, 0, "8917_s4"), - RPM_VS(LVS3, 0, 1, 0, "8917_s4"), - RPM_VS(LVS4, 0, 1, 0, "8917_s4"), - RPM_VS(LVS5, 0, 1, 0, "8917_s4"), - RPM_VS(LVS6, 0, 1, 0, "8917_s4"), - RPM_VS(LVS7, 0, 1, 0, "8917_s4"), - - /* ID a_on ss min_corner max_corner supply */ - RPM_CORNER(VDD_DIG_CORNER, 0, 1, RPM_VREG_CORNER_NONE, - RPM_VREG_CORNER_HIGH, NULL), -}; - -int msm8930_pm8917_regulator_pdata_len = - ARRAY_SIZE(msm8930_pm8917_regulator_pdata); - -#define RPM_REG_MAP(_id, _sleep_also, _voter, _supply, _dev_name) \ - { \ - .vreg_id = RPM_VREG_ID_PM8917_##_id, \ - .sleep_also = _sleep_also, \ - .voter = _voter, \ - .supply = _supply, \ - .dev_name = _dev_name, \ - } - -static struct rpm_regulator_consumer_mapping - msm_rpm_regulator_consumer_mapping[] = { - RPM_REG_MAP(L23, 0, 1, "krait0_l23", "acpuclk-8930"), - RPM_REG_MAP(S8, 0, 1, "krait0_s8", "acpuclk-8930"), - RPM_REG_MAP(L23, 0, 2, "krait1_l23", "acpuclk-8930"), - RPM_REG_MAP(S8, 0, 2, "krait1_s8", "acpuclk-8930"), - RPM_REG_MAP(L23, 0, 6, "l2_l23", "acpuclk-8930"), - RPM_REG_MAP(S8, 0, 6, "l2_s8", "acpuclk-8930"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930"), - - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8627"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8627"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8627"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8627"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8627"), - - RPM_REG_MAP(L23, 0, 1, "krait0_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L23, 0, 2, "krait1_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L23, 0, 6, "l2_hfpll", "acpuclk-8930aa"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930aa"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930aa"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930aa"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930aa"), - - RPM_REG_MAP(L23, 0, 1, "krait0_l23", "acpuclk-8930ab"), - RPM_REG_MAP(S8, 0, 1, "krait0_s8", "acpuclk-8930ab"), - RPM_REG_MAP(L23, 0, 2, "krait1_l23", "acpuclk-8930ab"), - RPM_REG_MAP(S8, 0, 2, "krait1_s8", "acpuclk-8930ab"), - RPM_REG_MAP(L23, 0, 6, "l2_l23", "acpuclk-8930ab"), - RPM_REG_MAP(S8, 0, 6, "l2_s8", "acpuclk-8930ab"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8930ab"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8930ab"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 1, "krait0_dig", "acpuclk-8930ab"), - RPM_REG_MAP(VDD_DIG_CORNER, 0, 2, "krait1_dig", "acpuclk-8930ab"), - -}; - -struct rpm_regulator_platform_data -msm8930_pm8917_rpm_regulator_pdata = { - .init_data = msm8930_rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(msm8930_rpm_regulator_init_data), - .version = RPM_VREG_VERSION_8930_PM8917, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8917_L24, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8917_VDD_DIG_CORNER, - .consumer_map = msm_rpm_regulator_consumer_mapping, - .consumer_map_len = ARRAY_SIZE(msm_rpm_regulator_consumer_mapping), -}; diff --git a/arch/arm/mach-msm/board-8930-storage.c b/arch/arm/mach-msm/board-8930-storage.c deleted file mode 100644 index 866f8da8963c..000000000000 --- a/arch/arm/mach-msm/board-8930-storage.c +++ /dev/null @@ -1,377 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" - -#include "board-8930.h" -#include "board-storage-common-a.h" - -/* MSM8960 has 5 SDCC controllers */ -enum sdcc_controllers { - SDCC1, - SDCC2, - SDCC3, - SDCC4, - SDCC5, - MAX_SDCC_CONTROLLER -}; - -/* All SDCC controllers require VDD/VCC voltage */ -static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .always_on = 1, - .lpm_sup = 1, - .lpm_uA = 9000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC2 : SDIO slot connected */ - [SDCC2] = { - .name = "sdc_vdd", - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - /* - * Normally this is not an always ON regulator. On this - * platform, unfortunately the sd detect line is connected - * to this via esd circuit and so turn this off/on while card - * is not present causes the sd detect line to toggle - * continuously. This is expected to be fixed in the newer - * hardware revisions - maybe once that is done, this can be - * reverted. - */ - .lpm_sup = 1, - .hpm_uA = 800000, /* 800mA */ - .lpm_uA = 9000, - }, -}; - -/* All SDCC controllers may require voting for VDD PAD voltage */ -static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd_io", - .always_on = 1, - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd_io", - .high_vol_level = 2950000, - .low_vol_level = 1850000, - .always_on = 1, - .lpm_sup = 1, - /* Max. Active current required is 16 mA */ - .hpm_uA = 16000, - /* - * Sleep current required is ~300 uA. But min. vote can be - * in terms of mA (min. 1 mA). So let's vote for 2 mA - * during sleep. - */ - .lpm_uA = 2000, - }, -}; - -static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .vdd_data = &mmc_vdd_reg_data[SDCC1], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1], - }, - /* SDCC2 : SDIO card slot connected */ - [SDCC2] = { - .vdd_data = &mmc_vdd_reg_data[SDCC2], - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .vdd_data = &mmc_vdd_reg_data[SDCC3], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC3], - } -}; - -/* SDC1 pad data */ -static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA} -}; - -static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -/* SDC3 pad data */ -static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA} -}; - -static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - /* - * SDC3 CMD line should be PULLed UP otherwise fluid platform will - * see transitions (1 -> 0 and 0 -> 1) on card detection line, - * which would result in false card detection interrupts. - */ - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - /* - * Keeping DATA lines status to PULL UP will make sure that - * there is no current leak during sleep if external pull up - * is connected to DATA lines. - */ - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_gpio sdc2_gpio[] = { - {92, "sdc2_dat_3"}, - {91, "sdc2_dat_2"}, - {90, "sdc2_dat_1"}, - {89, "sdc2_dat_0"}, - {97, "sdc2_cmd"}, - {98, "sdc2_clk"} -}; - -static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_pull_on_cfg, - .off = sdc1_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_pull_on_cfg, - .off = sdc3_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg) - }, -}; - -static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_drv_on_cfg, - .off = sdc1_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_drv_on_cfg, - .off = sdc3_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg) - }, -}; - -static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pull = &mmc_pad_pull_data[SDCC1], - .drv = &mmc_pad_drv_data[SDCC1] - }, - [SDCC3] = { - .pull = &mmc_pad_pull_data[SDCC3], - .drv = &mmc_pad_drv_data[SDCC3] - }, -}; - -static struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = { - [SDCC2] = { - .gpio = sdc2_gpio, - .size = ARRAY_SIZE(sdc2_gpio), - }, -}; - -static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pad_data = &mmc_pad_data[SDCC1], - }, - [SDCC2] = { - .is_gpio = true, - .gpio_data = &mmc_gpio_data[SDCC2], - }, - [SDCC3] = { - .pad_data = &mmc_pad_data[SDCC3], - }, -}; - -#define MSM_MPM_PIN_SDC1_DAT1 17 -#define MSM_MPM_PIN_SDC3_DAT1 21 - -static unsigned int sdc1_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000 -}; - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static unsigned int sdc3_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000, 192000000, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct mmc_platform_data msm8960_sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, -#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .sup_clk_table = sdc1_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates), - .nonremovable = 1, - .vreg_data = &mmc_slot_vreg_data[SDCC1], - .pin_data = &mmc_slot_pin_data[SDCC1], - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, - .uhs_caps2 = MMC_CAP2_HS200_1_8V_SDR, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static unsigned int sdc2_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data msm8960_sdc2_data = { - .ocr_mask = MMC_VDD_165_195 | MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc2_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates), - .vreg_data = &mmc_slot_vreg_data[SDCC2], - .pin_data = &mmc_slot_pin_data[SDCC2], - .sdiowakeup_irq = MSM_GPIO_TO_INT(90), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data msm8960_sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc3_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates), -#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT -/*TODO: Insert right replacement for PM8038 */ -#ifndef MSM8930_PHASE_2 - .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16), -#else - .wpswitch_gpio = 66, - .is_wpswitch_active_low = true, -#endif -#endif - .vreg_data = &mmc_slot_vreg_data[SDCC3], - .pin_data = &mmc_slot_pin_data[SDCC3], -/*TODO: Insert right replacement for PM8038 */ -#ifndef MSM8930_PHASE_2 - .status_gpio = PM8921_GPIO_PM_TO_SYS(26), - .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26), -#else - .status_gpio = 94, - .status_irq = MSM_GPIO_TO_INT(94), -#endif - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - .is_status_gpio_active_low = true, - .xpc_cap = 1, - .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 | - MMC_CAP_UHS_SDR104), - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -void __init msm8930_init_mmc(void) -{ -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - /* - * When eMMC runs in DDR mode on CDP platform, we have - * seen instability due to DATA CRC errors. These errors are - * attributed to long physical path between MSM and eMMC on CDP. - * So let's not enable the DDR mode on CDP platform but let other - * platforms take advantage of eMMC DDR mode. - */ - if (!machine_is_msm8930_cdp()) - msm8960_sdc1_data.uhs_caps |= (MMC_CAP_1_8V_DDR | - MMC_CAP_UHS_DDR50); - /* SDC1 : eMMC card connected */ - msm_add_sdcc(1, &msm8960_sdc1_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - /* SDC2: SDIO slot for WLAN */ - msm_add_sdcc(2, &msm8960_sdc2_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - /* - * All 8930 platform boards using the 1.2 SoC have been reworked so that - * the sd card detect line's esd circuit is no longer powered by the sd - * card's voltage regulator. So this means we can turn the regulator off - * to save power without affecting the sd card detect functionality. - * This change to the boards will be true for newer versions of the SoC - * as well. - */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1 && - SOCINFO_VERSION_MINOR(socinfo_get_version()) < 2) { - msm8960_sdc3_data.vreg_data->vdd_data->always_on = true; - msm8960_sdc3_data.vreg_data->vdd_data->reset_at_init = true; - } - /* SDC3: External card slot */ - if (!machine_is_msm8930_cdp()) { - msm8960_sdc3_data.wpswitch_gpio = 0; - msm8960_sdc3_data.is_wpswitch_active_low = false; - } - - msm_add_sdcc(3, &msm8960_sdc3_data); -#endif -} diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c deleted file mode 100644 index bf7581cfc1be..000000000000 --- a/arch/arm/mach-msm/board-8930.c +++ /dev/null @@ -1,2895 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef CONFIG_STM_LIS3DH -#include -#endif - -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef CONFIG_USB_MSM_OTG_72K -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#ifdef CONFIG_INPUT_MPU3050 -#include -#endif - -#include "timer.h" -#include "devices.h" -#include "devices-msm8x60.h" -#include "spm.h" -#include "pm.h" -#include -#include "rpm_resources.h" -#include -#include "clock.h" -#include "pm-boot.h" -#include "msm_watchdog.h" -#include "board-8930.h" -#include "platsmp.h" - -static struct platform_device msm_fm_platform_init = { - .name = "iris_fm", - .id = -1, -}; - -#define KS8851_RST_GPIO 89 -#define KS8851_IRQ_GPIO 90 -#define HAP_SHIFT_LVL_OE_GPIO 47 - -#define MHL_GPIO_INT 72 -#define MHL_GPIO_RESET 71 -#define MHL_GPIO_PWR_EN 5 - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - -struct sx150x_platform_data msm8930_sx150x_data[] = { - [SX150X_CAM] = { - .gpio_base = GPIO_CAM_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0xc0, - .io_open_drain_ena = 0x0, - .irq_summary = -1, - }, -}; - -#endif - -#define MSM_PMEM_ADSP_SIZE 0x7800000 -#define MSM_PMEM_AUDIO_SIZE 0x408000 -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */ -#else -#define MSM_PMEM_SIZE 0x2800000 /* 40 Mbytes */ -#endif -#define MSM_LIQUID_PMEM_SIZE 0x4000000 /* 64 Mbytes */ - -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -#define HOLE_SIZE 0x20000 -#define MSM_CONTIG_MEM_SIZE 0x65000 -#ifdef CONFIG_MSM_IOMMU -#define MSM_ION_MM_SIZE 0x3800000 /* Need to be multiple of 64K */ -#define MSM_ION_SF_SIZE 0x0 -#define MSM_ION_QSECOM_SIZE 0x780000 /* (7.5MB) */ -#define MSM_ION_HEAP_NUM 8 -#else -#define MSM_ION_SF_SIZE MSM_PMEM_SIZE -#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE -#define MSM_ION_QSECOM_SIZE 0x600000 /* (6MB) */ -#define MSM_ION_HEAP_NUM 8 -#endif -#define MSM_ION_MM_FW_SIZE (0x200000 - HOLE_SIZE) /* 2MB - 128Kb */ -#define MSM_ION_MFC_SIZE SZ_8K -#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE - -#define MSM_LIQUID_ION_MM_SIZE (MSM_ION_MM_SIZE + 0x600000) -#define MSM_LIQUID_ION_SF_SIZE MSM_LIQUID_PMEM_SIZE -#define MSM_HDMI_PRIM_ION_SF_SIZE MSM_HDMI_PRIM_PMEM_SIZE - -#define MSM_MM_FW_SIZE (0x200000 - HOLE_SIZE) /*2MB -128Kb */ -#define MSM8930_FIXED_AREA_START (0xa0000000 - (MSM_ION_MM_FW_SIZE + \ - HOLE_SIZE)) -#define MAX_FIXED_AREA_SIZE 0x10000000 -#define MSM8930_FW_START MSM8930_FIXED_AREA_START -#define MSM_ION_ADSP_SIZE SZ_8M - -#else -#define MSM_CONTIG_MEM_SIZE 0x110C000 -#define MSM_ION_HEAP_NUM 1 -#endif - -#ifdef CONFIG_KERNEL_MSM_CONTIG_MEM_REGION -static unsigned msm_contig_mem_size = MSM_CONTIG_MEM_SIZE; -static int __init msm_contig_mem_size_setup(char *p) -{ - msm_contig_mem_size = memparse(p, NULL); - return 0; -} -early_param("msm_contig_mem_size", msm_contig_mem_size_setup); -#endif - -#define DSP_RAM_BASE_8960 0x8da00000 -#define DSP_RAM_SIZE_8960 0x1800000 -static int dspcrashd_pdata_8960 = 0xDEADDEAD; - -static struct resource resources_dspcrashd_8960[] = { - { - .name = "msm_dspcrashd", - .start = DSP_RAM_BASE_8960, - .end = DSP_RAM_BASE_8960 + DSP_RAM_SIZE_8960, - .flags = IORESOURCE_DMA, - }, -}; - -static struct platform_device msm_device_dspcrashd_8960 = { - .name = "msm_dspcrashd", - .num_resources = ARRAY_SIZE(resources_dspcrashd_8960), - .resource = resources_dspcrashd_8960, - .dev = { .platform_data = &dspcrashd_pdata_8960 }, -}; - -static struct memtype_reserve msm8930_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - - -static void __init reserve_rtb_memory(void) -{ -#if defined(CONFIG_MSM_RTB) - msm8930_reserve_table[MEMTYPE_EBI1].size += msm8930_rtb_pdata.size; -#endif -} - -static int msm8930_paddr_to_memtype(phys_addr_t paddr) -{ - return MEMTYPE_EBI1; -} - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_cp_heap_pdata cp_mm_msm8930_ion_pdata = { - .permission_type = IPT_TYPE_MM_CARVEOUT, - .align = PAGE_SIZE, - .fixed_position = FIXED_MIDDLE, -}; - -static struct ion_cp_heap_pdata cp_mfc_msm8930_ion_pdata = { - .permission_type = IPT_TYPE_MFC_SHAREDMEM, - .align = PAGE_SIZE, - .fixed_position = FIXED_HIGH, -}; - -static struct ion_co_heap_pdata co_msm8930_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; - -static struct ion_co_heap_pdata fw_co_msm8930_ion_pdata = { - .adjacent_mem_id = ION_CP_MM_HEAP_ID, - .align = SZ_128K, - .fixed_position = FIXED_LOW, -}; -#endif - - -static u64 msm_dmamask = DMA_BIT_MASK(32); - -static struct platform_device ion_mm_heap_device = { - .name = "ion-mm-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; - -static struct platform_device ion_adsp_heap_device = { - .name = "ion-adsp-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; -/** - * These heaps are listed in the order they will be allocated. Due to - * video hardware restrictions and content protection the FW heap has to - * be allocated adjacent (below) the MM heap and the MFC heap has to be - * allocated after the MM heap to ensure MFC heap is not more than 256MB - * away from the base address of the FW heap. - * However, the order of FW heap and MM heap doesn't matter since these - * two heaps are taken care of by separate code to ensure they are adjacent - * to each other. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap msm8930_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - { - .id = ION_CP_MM_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MM_HEAP_NAME, - .size = MSM_ION_MM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mm_msm8930_ion_pdata, - .priv = &ion_mm_heap_device.dev - }, - { - .id = ION_MM_FIRMWARE_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_MM_FIRMWARE_HEAP_NAME, - .size = MSM_ION_MM_FW_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &fw_co_msm8930_ion_pdata, - }, - { - .id = ION_CP_MFC_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MFC_HEAP_NAME, - .size = MSM_ION_MFC_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mfc_msm8930_ion_pdata, - }, -#ifndef CONFIG_MSM_IOMMU - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .size = MSM_ION_SF_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8930_ion_pdata, - }, -#endif - { - .id = ION_IOMMU_HEAP_ID, - .type = ION_HEAP_TYPE_IOMMU, - .name = ION_IOMMU_HEAP_NAME, - }, - { - .id = ION_QSECOM_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_QSECOM_HEAP_NAME, - .size = MSM_ION_QSECOM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8930_ion_pdata, - }, - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .size = MSM_ION_AUDIO_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8930_ion_pdata, - }, - { - .id = ION_ADSP_HEAP_ID, - .type = ION_HEAP_TYPE_DMA, - .name = ION_ADSP_HEAP_NAME, - .size = MSM_ION_ADSP_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8930_ion_pdata, - .priv = &ion_adsp_heap_device.dev, - }, -#endif -}; - -static struct ion_platform_data msm8930_ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = msm8930_heaps, - -}; - -static struct platform_device msm8930_ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &msm8930_ion_pdata }, -}; -#endif - -static void __init reserve_mem_for_ion(enum ion_memory_types mem_type, - unsigned long size) -{ - msm8930_reserve_table[mem_type].size += size; -} - -static void __init msm8930_reserve_fixed_area(unsigned long fixed_area_size) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - int ret; - - if (fixed_area_size > MAX_FIXED_AREA_SIZE) - panic("fixed area size is larger than %dM\n", - MAX_FIXED_AREA_SIZE >> 20); - - reserve_info->fixed_area_size = fixed_area_size; - reserve_info->fixed_area_start = MSM8930_FW_START; - - ret = memblock_remove(reserve_info->fixed_area_start, - reserve_info->fixed_area_size); - BUG_ON(ret); -#endif -} - -/** - * Reserve memory for ION. Also handle special case - * for video heaps (MM,FW, and MFC). Video requires heaps MM and MFC to be - * at a higher address than FW in addition to not more than 256MB away from the - * base address of the firmware. In addition the MM heap must be - * adjacent to the FW heap for content protection purposes. - */ -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - unsigned int i; - int ret; - unsigned int fixed_size = 0; - unsigned int fixed_low_size, fixed_middle_size, fixed_high_size; - unsigned long fixed_low_start, fixed_middle_start, fixed_high_start; - unsigned long cma_alignment; - unsigned int low_use_cma = 0; - unsigned int middle_use_cma = 0; - unsigned int high_use_cma = 0; - - fixed_low_size = 0; - fixed_middle_size = 0; - fixed_high_size = 0; - - cma_alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order); - - for (i = 0; i < msm8930_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = - &(msm8930_ion_pdata.heaps[i]); - - int use_cma = 0; - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - - switch ((int) heap->type) { - case ION_HEAP_TYPE_CP: - if (((struct ion_cp_heap_pdata *) - heap->extra_data)->is_cma) { - heap->size = ALIGN(heap->size, - cma_alignment); - use_cma = 1; - } - fixed_position = ((struct ion_cp_heap_pdata *) - heap->extra_data)->fixed_position; - break; - case ION_HEAP_TYPE_DMA: - use_cma = 1; - /* Purposely fall through here */ - case ION_HEAP_TYPE_CARVEOUT: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - break; - default: - break; - } - - if (fixed_position != NOT_FIXED) - fixed_size += heap->size; - else if (!use_cma) - reserve_mem_for_ion(MEMTYPE_EBI1, heap->size); - - if (fixed_position == FIXED_LOW) { - fixed_low_size += heap->size; - low_use_cma = use_cma; - } else if (fixed_position == FIXED_MIDDLE) { - fixed_middle_size += heap->size; - middle_use_cma = use_cma; - } else if (fixed_position == FIXED_HIGH) { - fixed_high_size += heap->size; - high_use_cma = use_cma; - } else if (use_cma) { - /* - * Heaps that use CMA but are not part of the - * fixed set. Create wherever. - */ - dma_declare_contiguous( - heap->priv, - heap->size, - 0, - 0xb0000000); - } - } - } - - if (!fixed_size) - return; - /* - * Given the setup for the fixed area, we can't round up all sizes. - * Some sizes must be set up exactly and aligned correctly. Incorrect - * alignments are considered a configuration issue - */ - - fixed_low_start = MSM8930_FIXED_AREA_START; - if (low_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_low_start, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, SECTION_SIZE)); - ret = memblock_remove(fixed_low_start, - fixed_low_size + HOLE_SIZE); - BUG_ON(ret); - } - - fixed_middle_start = fixed_low_start + fixed_low_size + HOLE_SIZE; - if (middle_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_middle_start, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_middle_size, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_middle_size, SECTION_SIZE)); - ret = memblock_remove(fixed_middle_start, fixed_middle_size); - BUG_ON(ret); - } - - fixed_high_start = fixed_middle_start + fixed_middle_size; - if (high_use_cma) { - fixed_high_size = ALIGN(fixed_high_size, cma_alignment); - BUG_ON(!IS_ALIGNED(fixed_high_start, cma_alignment)); - } else { - /* This is the end of the fixed area so it's okay to round up */ - fixed_high_size = ALIGN(fixed_high_size, SECTION_SIZE); - ret = memblock_remove(fixed_high_start, fixed_high_size); - BUG_ON(ret); - } - - for (i = 0; i < msm8930_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = &(msm8930_ion_pdata.heaps[i]); - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - struct ion_cp_heap_pdata *pdata = NULL; - - switch ((int) heap->type) { - case ION_HEAP_TYPE_CP: - pdata = - (struct ion_cp_heap_pdata *)heap->extra_data; - fixed_position = pdata->fixed_position; - break; - case ION_HEAP_TYPE_DMA: - case ION_HEAP_TYPE_CARVEOUT: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - break; - default: - break; - } - - switch (fixed_position) { - case FIXED_LOW: - heap->base = fixed_low_start; - break; - case FIXED_MIDDLE: - heap->base = fixed_middle_start; - if (middle_use_cma) - dma_declare_contiguous( - &ion_mm_heap_device.dev, - heap->size, - fixed_middle_start, - 0xa0000000); - pdata->secure_base = fixed_middle_start - - HOLE_SIZE; - pdata->secure_size = HOLE_SIZE + heap->size; - break; - case FIXED_HIGH: - heap->base = fixed_high_start; - break; - default: - break; - } - } - } -#endif -} - -static void __init reserve_mdp_memory(void) -{ - msm8930_mdp_writeback(msm8930_reserve_table); -} - -#ifdef CONFIG_MSM_CACHE_DUMP -static void __init reserve_cache_dump_memory(void) -{ - unsigned int total; - - total = msm8930_cache_dump_pdata.l1_size + - msm8930_cache_dump_pdata.l2_size; - msm8930_reserve_table[MEMTYPE_EBI1].size += total; -} -#else -static void __init reserve_cache_dump_memory(void) { } -#endif - -static void __init msm8930_calculate_reserve_sizes(void) -{ - reserve_ion_memory(); - reserve_mdp_memory(); - reserve_rtb_memory(); - reserve_cache_dump_memory(); - msm8930_reserve_table[MEMTYPE_EBI1].size += msm_contig_mem_size; -} - -static struct reserve_info msm8930_reserve_info __initdata = { - .memtype_reserve_table = msm8930_reserve_table, - .calculate_reserve_sizes = msm8930_calculate_reserve_sizes, - .reserve_fixed_area = msm8930_reserve_fixed_area, - .paddr_to_memtype = msm8930_paddr_to_memtype, -}; - -static void __init msm8930_early_memory(void) -{ - reserve_info = &msm8930_reserve_info; -} - -static char prim_panel_name[PANEL_NAME_MAX_LEN]; -static char ext_panel_name[PANEL_NAME_MAX_LEN]; - -static int __init prim_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("prim_display", prim_display_setup); - -static int __init ext_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(ext_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("ext_display", ext_display_setup); - -static void __init msm8930_reserve(void) -{ - msm8930_set_display_params(prim_panel_name, ext_panel_name); - msm_reserve(); -} - -static void __init msm8930_allocate_memory_regions(void) -{ - msm8930_allocate_fb_region(); -} - -#ifdef CONFIG_WCD9304_CODEC - -#define SITAR_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS + NR_PM8921_IRQS) - -/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement - * 4 micbiases are used to power various analog and digital - * microphones operating at 1800 mV. Technically, all micbiases - * can source from single cfilter since all microphones operate - * at the same voltage level. The arrangement below is to make - * sure all cfilters are exercised. LDO_H regulator ouput level - * does not need to be as high as 2.85V. It is choosen for - * microphone sensitivity purpose. - */ -static struct wcd9xxx_pdata sitar_platform_data = { - .slimbus_slave_device = { - .name = "sitar-slave", - .e_addr = {0, 0, 0x00, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(62), - .irq_base = SITAR_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = 42, - .micbias = { - .ldoh_v = SITAR_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .bias1_cfilt_sel = SITAR_CFILT1_SEL, - .bias2_cfilt_sel = SITAR_CFILT2_SEL, - .bias1_cap_mode = MICBIAS_EXT_BYP_CAP, - .bias2_cap_mode = MICBIAS_NO_EXT_BYP_CAP, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 2200000, - .max_uV = 2200000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1200000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1200000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device msm_slim_sitar = { - .name = "sitar-slim", - .e_addr = {0, 1, 0x00, 0, 0x17, 2}, - .dev = { - .platform_data = &sitar_platform_data, - }, -}; - -static struct wcd9xxx_pdata sitar1p1_platform_data = { - .slimbus_slave_device = { - .name = "sitar-slave", - .e_addr = {0, 0, 0x70, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(62), - .irq_base = SITAR_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = 42, - .micbias = { - .ldoh_v = SITAR_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .bias1_cfilt_sel = SITAR_CFILT1_SEL, - .bias2_cfilt_sel = SITAR_CFILT2_SEL, - .bias1_cap_mode = MICBIAS_EXT_BYP_CAP, - .bias2_cap_mode = MICBIAS_NO_EXT_BYP_CAP, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 2200000, - .max_uV = 2200000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1200000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1200000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device msm_slim_sitar1p1 = { - .name = "sitar1p1-slim", - .e_addr = {0, 1, 0x70, 0, 0x17, 2}, - .dev = { - .platform_data = &sitar1p1_platform_data, - }, -}; -#endif - - -static struct slim_boardinfo msm_slim_devices[] = { -#ifdef CONFIG_WCD9304_CODEC - { - .bus_num = 1, - .slim_slave = &msm_slim_sitar, - }, - { - .bus_num = 1, - .slim_slave = &msm_slim_sitar1p1, - }, -#endif - /* add more slimbus slaves as needed */ -}; - -#define MSM_WCNSS_PHYS 0x03000000 -#define MSM_WCNSS_SIZE 0x280000 - -static struct resource resources_wcnss_wlan[] = { - { - .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .name = "wcnss_wlanrx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .name = "wcnss_wlantx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_WCNSS_PHYS, - .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1, - .name = "wcnss_mmio", - .flags = IORESOURCE_MEM, - }, - { - .start = 84, - .end = 88, - .name = "wcnss_gpios_5wire", - .flags = IORESOURCE_IO, - }, -}; - -static struct qcom_wcnss_opts qcom_wcnss_pdata = { - .has_48mhz_xo = 1, -}; - -static struct platform_device msm_device_wcnss_wlan = { - .name = "wcnss_wlan", - .id = 0, - .num_resources = ARRAY_SIZE(resources_wcnss_wlan), - .resource = resources_wcnss_wlan, - .dev = {.platform_data = &qcom_wcnss_pdata}, -}; - -#ifdef CONFIG_QSEECOM -/* qseecom bus scaling */ -static struct msm_bus_vectors qseecom_clks_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(qseecom_clks_init_vectors), - qseecom_clks_init_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_vectors), - qseecom_enable_dfab_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_sfpb_vectors), - qseecom_enable_sfpb_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_sfpb_vectors), - qseecom_enable_dfab_sfpb_vectors, - }, -}; - -static struct msm_bus_scale_pdata qseecom_bus_pdata = { - qseecom_hw_bus_scale_usecases, - ARRAY_SIZE(qseecom_hw_bus_scale_usecases), - .name = "qsee", -}; - -static struct platform_device qseecom_device = { - .name = "qseecom", - .id = 0, - .dev = { - .platform_data = &qseecom_bus_pdata, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0x18500000 - -#define QCE_HW_KEY_SUPPORT 0 -#define QCE_SHA_HMAC_SUPPORT 1 -#define QCE_SHARE_CE_RESOURCE 1 -#define QCE_CE_SHARED 0 - -/* Begin Bus scaling definitions */ -static struct msm_bus_vectors crypto_hw_init_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors crypto_hw_active_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 70000000UL, - .ib = 70000000UL, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 2480000000UL, - .ib = 2480000000UL, - }, -}; - -static struct msm_bus_paths crypto_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(crypto_hw_init_vectors), - crypto_hw_init_vectors, - }, - { - ARRAY_SIZE(crypto_hw_active_vectors), - crypto_hw_active_vectors, - }, -}; - -static struct msm_bus_scale_pdata crypto_hw_bus_scale_pdata = { - crypto_hw_bus_scale_usecases, - ARRAY_SIZE(crypto_hw_bus_scale_usecases), - .name = "cryptohw", -}; -/* End Bus Scaling Definitions*/ - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = &crypto_hw_bus_scale_pdata, -}; - -static struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = &crypto_hw_bus_scale_pdata, -}; - -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -#define MDM2AP_ERRFATAL 70 -#define AP2MDM_ERRFATAL 95 -#define MDM2AP_STATUS 69 -#define AP2MDM_STATUS 94 -#define AP2MDM_PMIC_RESET_N 80 -#define AP2MDM_KPDPWR_N 81 - -static struct resource mdm_resources[] = { - { - .start = MDM2AP_ERRFATAL, - .end = MDM2AP_ERRFATAL, - .name = "MDM2AP_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_ERRFATAL, - .end = AP2MDM_ERRFATAL, - .name = "AP2MDM_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = MDM2AP_STATUS, - .end = MDM2AP_STATUS, - .name = "MDM2AP_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_STATUS, - .end = AP2MDM_STATUS, - .name = "AP2MDM_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_PMIC_RESET_N, - .end = AP2MDM_PMIC_RESET_N, - .name = "AP2MDM_PMIC_RESET_N", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_KPDPWR_N, - .end = AP2MDM_KPDPWR_N, - .name = "AP2MDM_KPDPWR_N", - .flags = IORESOURCE_IO, - }, -}; - -static struct mdm_platform_data mdm_platform_data = { - .mdm_version = "2.5", -}; - -static struct platform_device mdm_device = { - .name = "mdm2_modem", - .id = -1, - .num_resources = ARRAY_SIZE(mdm_resources), - .resource = mdm_resources, - .dev = { - .platform_data = &mdm_platform_data, - }, -}; - -static struct platform_device *mdm_devices[] __initdata = { - &mdm_device, -}; - -#ifdef CONFIG_MSM_MPM -static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = { - [1] = MSM_GPIO_TO_INT(46), - [2] = MSM_GPIO_TO_INT(150), - [4] = MSM_GPIO_TO_INT(103), - [5] = MSM_GPIO_TO_INT(104), - [6] = MSM_GPIO_TO_INT(105), - [7] = MSM_GPIO_TO_INT(106), - [8] = MSM_GPIO_TO_INT(107), - [9] = MSM_GPIO_TO_INT(7), - [10] = MSM_GPIO_TO_INT(11), - [11] = MSM_GPIO_TO_INT(15), - [12] = MSM_GPIO_TO_INT(19), - [13] = MSM_GPIO_TO_INT(23), - [14] = MSM_GPIO_TO_INT(27), - [15] = MSM_GPIO_TO_INT(31), - [16] = MSM_GPIO_TO_INT(35), - [19] = MSM_GPIO_TO_INT(90), - [20] = MSM_GPIO_TO_INT(92), - [23] = MSM_GPIO_TO_INT(85), - [24] = MSM_GPIO_TO_INT(83), - [25] = USB1_HS_IRQ, - [26] = MSM_GPIO_TO_INT(6), - [27] = HDMI_IRQ, - [29] = MSM_GPIO_TO_INT(10), - [30] = MSM_GPIO_TO_INT(102), - [31] = MSM_GPIO_TO_INT(81), - [32] = MSM_GPIO_TO_INT(78), - [33] = MSM_GPIO_TO_INT(94), - [34] = MSM_GPIO_TO_INT(72), - [35] = MSM_GPIO_TO_INT(39), - [36] = MSM_GPIO_TO_INT(43), - [37] = MSM_GPIO_TO_INT(61), - [38] = MSM_GPIO_TO_INT(50), - [39] = MSM_GPIO_TO_INT(42), - [41] = MSM_GPIO_TO_INT(62), - [42] = MSM_GPIO_TO_INT(8), - [43] = MSM_GPIO_TO_INT(33), - [44] = MSM_GPIO_TO_INT(70), - [45] = MSM_GPIO_TO_INT(69), - [46] = MSM_GPIO_TO_INT(67), - [47] = MSM_GPIO_TO_INT(65), - [48] = MSM_GPIO_TO_INT(55), - [49] = MSM_GPIO_TO_INT(74), - [50] = MSM_GPIO_TO_INT(98), - [51] = MSM_GPIO_TO_INT(49), - [52] = MSM_GPIO_TO_INT(40), - [53] = MSM_GPIO_TO_INT(37), - [54] = MSM_GPIO_TO_INT(24), - [55] = MSM_GPIO_TO_INT(14), -}; - -static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = { - TLMM_MSM_SUMMARY_IRQ, - RPM_APCC_CPU0_GP_HIGH_IRQ, - RPM_APCC_CPU0_GP_MEDIUM_IRQ, - RPM_APCC_CPU0_GP_LOW_IRQ, - RPM_APCC_CPU0_WAKE_UP_IRQ, - RPM_APCC_CPU1_GP_HIGH_IRQ, - RPM_APCC_CPU1_GP_MEDIUM_IRQ, - RPM_APCC_CPU1_GP_LOW_IRQ, - RPM_APCC_CPU1_WAKE_UP_IRQ, - MSS_TO_APPS_IRQ_0, - MSS_TO_APPS_IRQ_1, - MSS_TO_APPS_IRQ_2, - MSS_TO_APPS_IRQ_3, - MSS_TO_APPS_IRQ_4, - MSS_TO_APPS_IRQ_5, - MSS_TO_APPS_IRQ_6, - MSS_TO_APPS_IRQ_7, - MSS_TO_APPS_IRQ_8, - MSS_TO_APPS_IRQ_9, - LPASS_SCSS_GP_LOW_IRQ, - LPASS_SCSS_GP_MEDIUM_IRQ, - LPASS_SCSS_GP_HIGH_IRQ, - SPS_MTI_30, - SPS_MTI_31, - RIVA_APSS_SPARE_IRQ, - RIVA_APPS_WLAN_SMSM_IRQ, - RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, -}; - -struct msm_mpm_device_data msm8930_mpm_dev_data __initdata = { - .irqs_m2a = msm_mpm_irqs_m2a, - .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a), - .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs, - .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs), - .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8, - .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8, - .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008, - .mpm_apps_ipc_val = BIT(1), - .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ, - -}; -#endif - -#define MSM_SHARED_RAM_PHYS 0x80000000 - -static void __init msm8930_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_msm8930_io(); - - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - -} - -static void __init msm8930_init_irq(void) -{ - struct msm_mpm_device_data *data = NULL; -#ifdef CONFIG_MSM_MPM - data = &msm8930_mpm_dev_data; -#endif - - msm_mpm_irq_extn_init(data); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, - (void *)MSM_QGIC_CPU_BASE); -} - -static void __init msm8930_init_buses(void) -{ -#ifdef CONFIG_MSM_BUS_SCALING - msm_bus_rpm_set_mt_mask(); - msm_bus_8930_apps_fabric_pdata.rpm_enabled = 1; - msm_bus_8930_sys_fabric_pdata.rpm_enabled = 1; - msm_bus_8930_mm_fabric_pdata.rpm_enabled = 1; - msm_bus_8930_apps_fabric.dev.platform_data = - &msm_bus_8930_apps_fabric_pdata; - msm_bus_8930_sys_fabric.dev.platform_data = - &msm_bus_8930_sys_fabric_pdata; - msm_bus_8930_mm_fabric.dev.platform_data = - &msm_bus_8930_mm_fabric_pdata; - msm_bus_8930_sys_fpb.dev.platform_data = &msm_bus_8930_sys_fpb_pdata; - msm_bus_8930_cpss_fpb.dev.platform_data = &msm_bus_8930_cpss_fpb_pdata; -#endif -} - -static struct msm_spi_platform_data msm8960_qup_spi_gsbi1_pdata = { - .max_clock_speed = 15060000, -}; - -#ifdef CONFIG_USB_MSM_OTG_72K -static struct msm_otg_platform_data msm_otg_pdata; -#else -static int enable_usb_host_mode; -static int __init usb_host_mode_with_pm8917(char *param) -{ - int ret; - - ret = kstrtoint(param, 10, &enable_usb_host_mode); - return ret; -} -early_param("usb_host_mode_pm8917", usb_host_mode_with_pm8917); - -#ifdef CONFIG_MSM_BUS_SCALING -/* Bandwidth requests (zero) if no vote placed */ -static struct msm_bus_vectors usb_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -/* Bus bandwidth requests in Bytes/sec */ -static struct msm_bus_vectors usb_max_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 60000000, /* At least 480Mbps on bus. */ - .ib = 960000000, /* MAX bursts rate */ - }, -}; - -static struct msm_bus_paths usb_bus_scale_usecases[] = { - { - ARRAY_SIZE(usb_init_vectors), - usb_init_vectors, - }, - { - ARRAY_SIZE(usb_max_vectors), - usb_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata usb_bus_scale_pdata = { - usb_bus_scale_usecases, - ARRAY_SIZE(usb_bus_scale_usecases), - .name = "usb", -}; -#endif - -static int hsusb_phy_init_seq[] = { - 0x44, 0x80, /* set VBUS valid threshold - and disconnect valid threshold */ - 0x68, 0x81, /* update DC voltage level */ - 0x24, 0x82, /* set preemphasis and rise/fall time */ - 0x13, 0x83, /* set source impedance adjusment */ - -1}; - -#define MSM_MPM_PIN_USB1_OTGSESSVLD 40 - -static struct msm_otg_platform_data msm_otg_pdata = { - .mode = USB_OTG, - .otg_control = OTG_PMIC_CONTROL, - .phy_type = SNPS_28NM_INTEGRATED_PHY, - .power_budget = 750, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &usb_bus_scale_pdata, -#endif -#ifdef CONFIG_FB_MSM_HDMI_MHL_8334 - .mhl_dev_name = "sii8334", -#endif - .mpm_otgsessvld_int = MSM_MPM_PIN_USB1_OTGSESSVLD, -}; -#endif - -#define PID_MAGIC_ID 0x71432909 -#define SERIAL_NUM_MAGIC_ID 0x61945374 -#define SERIAL_NUMBER_LENGTH 127 -#define DLOAD_USB_BASE_ADD 0x2A03F0C8 - -struct magic_num_struct { - uint32_t pid; - uint32_t serial_num; -}; - -struct dload_struct { - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint16_t reserved4; - uint16_t pid; - char serial_number[SERIAL_NUMBER_LENGTH]; - uint16_t reserved5; - struct magic_num_struct magic_struct; -}; - -static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum) -{ - struct dload_struct __iomem *dload = 0; - - dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload)); - if (!dload) { - pr_err("%s: cannot remap I/O memory region: %08x\n", - __func__, DLOAD_USB_BASE_ADD); - return -ENXIO; - } - - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", - __func__, dload, pid, snum); - /* update pid */ - dload->magic_struct.pid = PID_MAGIC_ID; - dload->pid = pid; - - /* update serial number */ - dload->magic_struct.serial_num = 0; - if (!snum) { - memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH); - goto out; - } - - dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID; - strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH); -out: - iounmap(dload); - return 0; -} - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -static uint8_t spm_wfi_cmd_sequence[] __initdata = { - 0x03, 0x0f, -}; - - -static uint8_t spm_retention_cmd_sequence[] __initdata = { - 0x00, 0x05, 0x03, 0x0D, - 0x0B, 0x00, 0x0f, -}; - -static uint8_t spm_retention_with_krait_v3_cmd_sequence[] __initdata = { - 0x42, 0x1B, 0x00, - 0x05, 0x03, 0x01, 0x0B, - 0x00, 0x42, 0x1B, - 0x0f, -}; -static uint8_t spm_power_collapse_without_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x03, 0x01, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x07, 0x01, 0x0B, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static struct msm_spm_seq_entry msm_spm_boot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static struct msm_spm_seq_entry msm_spm_nonboot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x03020004, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0084009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A4001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_boot_cpu_seq_list), - .modes = msm_spm_boot_cpu_seq_list, - }, - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list), - .modes = msm_spm_nonboot_cpu_seq_list, - }, -}; - -static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x03, 0x20, - 0x00, 0x0f, -}; - -static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x20, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0f, -}; -static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = { - 0x00, 0x10, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x10, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0F, -}; - -static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_L2_MODE_RETENTION, - .notify_rpm = false, - .cmd = l2_spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_L2_MODE_GDHS, - .notify_rpm = true, - .cmd = l2_spm_gdhs_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = l2_spm_power_off_cmd_sequence, - }, -}; - -static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW_L2_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020, - .modes = msm_spm_l2_seq_list, - .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list), - }, -}; - -#define ISA1200_HAP_EN_GPIO 77 -#define ISA1200_HAP_LEN_GPIO 78 -#define ISA1200_HAP_CLK_PM8038 PM8038_GPIO_PM_TO_SYS(7) -#define ISA1200_HAP_CLK_PM8917 PM8917_GPIO_PM_TO_SYS(38) - -static int isa1200_power(int on) -{ - unsigned int gpio = ISA1200_HAP_CLK_PM8038; - enum pm8xxx_aux_clk_id clk_id = CLK_MP3_1; - int rc = 0; - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) { - gpio = ISA1200_HAP_CLK_PM8917; - clk_id = CLK_MP3_2; - } - - gpio_set_value_cansleep(gpio, !!on); - - if (on) - rc = pm8xxx_aux_clk_control(clk_id, XO_DIV_1, true); - else - rc = pm8xxx_aux_clk_control(clk_id, XO_DIV_NONE, true); - - if (rc) { - pr_err("%s: unable to write aux clock register(%d)\n", - __func__, rc); - } - - return rc; -} - -static int isa1200_dev_setup(bool enable) -{ - unsigned int gpio = ISA1200_HAP_CLK_PM8038; - int rc = 0; - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - gpio = ISA1200_HAP_CLK_PM8917; - - if (!enable) - goto fail_gpio_dir; - - rc = gpio_request(gpio, "haptics_clk"); - if (rc) { - pr_err("%s: gpio_request for %d gpio failed rc(%d)\n", - __func__, gpio, rc); - goto fail_gpio_req; - } - - rc = gpio_direction_output(gpio, 0); - if (rc) { - pr_err("%s: gpio_direction_output failed for %d gpio rc(%d)\n", - __func__, gpio, rc); - goto fail_gpio_dir; - } - - return 0; - -fail_gpio_dir: - gpio_free(gpio); -fail_gpio_req: - return rc; - -} - -static struct isa1200_regulator isa1200_reg_data[] = { - { - .name = "vcc_i2c", - .min_uV = ISA_I2C_VTG_MIN_UV, - .max_uV = ISA_I2C_VTG_MAX_UV, - .load_uA = ISA_I2C_CURR_UA, - }, -}; - -static struct isa1200_platform_data isa1200_1_pdata = { - .name = "vibrator", - .dev_setup = isa1200_dev_setup, - .power_on = isa1200_power, - .hap_en_gpio = ISA1200_HAP_EN_GPIO, - .hap_len_gpio = ISA1200_HAP_LEN_GPIO, - .max_timeout = 15000, - .mode_ctrl = PWM_GEN_MODE, - .pwm_fd = { - .pwm_div = 256, - }, - .is_erm = false, - .smart_en = true, - .ext_clk_en = true, - .chip_en = 1, - .regulator_info = isa1200_reg_data, - .num_regulators = ARRAY_SIZE(isa1200_reg_data), -}; - -static struct i2c_board_info msm_isa1200_board_info[] __initdata = { - { - I2C_BOARD_INFO("isa1200_1", 0x90>>1), - .platform_data = &isa1200_1_pdata, - }, -}; - -#define MXT_TS_GPIO_IRQ 11 -#define MXT_TS_RESET_GPIO 52 - -static const u8 mxt_config_data_8930_v1[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 15, 3, 0, 15, 12, 11, 0, 0, - /* T7 Object */ - 32, 16, 50, - /* T8 Object */ - 30, 0, 5, 1, 0, 0, 8, 8, 0, 0, - /* T9 Object */ - 131, 0, 0, 19, 11, 0, 16, 43, 2, 3, - 10, 7, 2, 0, 4, 5, 35, 10, 43, 4, - 54, 2, 15, 32, 38, 38, 143, 40, 143, 80, - 7, 9, 50, 50, 2, - /* T15 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, - /* T18 Object */ - 0, 0, - /* T19 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - /* T23 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - /* T25 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, - /* T46 Object */ - 0, 3, 8, 16, 0, 0, 1, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T48 Object */ - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 4, 64, - 0, 0, 5, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -}; - -static const u8 mxt_config_data_8930_v2[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 15, 4, 0, 9, 7, 12, 0, 0, - /* T7 Object */ - 32, 16, 50, - /* T8 Object */ - 30, 0, 5, 10, 0, 0, 10, 10, 0, 0, - /* T9 Object */ - 131, 0, 0, 19, 11, 0, 16, 50, 1, 3, - 12, 7, 2, 0, 4, 5, 2, 10, 43, 4, - 54, 2, -25, 29, 38, 18, 143, 40, 207, 80, - 17, 5, 50, 50, 0, - /* T18 Object */ - 0, 0, - /* T19 Object */ - 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 0, 0, 0, 0, 0, 0, - /* T42 Object */ - 3, 60, 20, 20, 150, 0, 0, 0, - /* T46 Object */ - 0, 3, 28, 28, 0, 0, 1, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T48 Object */ - 1, 3, 82, 0, 0, 0, 0, 0, 0, 0, - 16, 30, 0, 6, 6, 0, 0, 124, 4, 100, - 0, 0, 0, 5, 0, 42, 0, 1, 0, 40, - 52, 20, 0, 0, 0, 50, 1, 5, 2, 1, - 4, 5, 3, -25, 29, 38, 18, 143, 40, 207, - 80, 10, 5, 2, - /* T55 Object */ - 0, 0, 0, 0, -}; - -static ssize_t mxt224e_vkeys_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return snprintf(buf, 200, - __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":57:1030:90:90" - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":206:1030:90:90" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":366:1030:90:90" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":503:1030:90:90" - "\n"); -} - -static struct kobj_attribute mxt224e_vkeys_attr = { - .attr = { - .mode = S_IRUGO, - }, - .show = &mxt224e_vkeys_show, -}; - -static struct attribute *mxt224e_properties_attrs[] = { - &mxt224e_vkeys_attr.attr, - NULL -}; - -static struct attribute_group mxt224e_properties_attr_group = { - .attrs = mxt224e_properties_attrs, -}; - -static void mxt_init_vkeys_8930(void) -{ - int rc = 0; - static struct kobject *mxt224e_properties_kobj; - - mxt224e_vkeys_attr.attr.name = "virtualkeys.atmel_mxt_ts"; - mxt224e_properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (mxt224e_properties_kobj) - rc = sysfs_create_group(mxt224e_properties_kobj, - &mxt224e_properties_attr_group); - if (!mxt224e_properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", - __func__); - - return; -} - -static struct mxt_config_info mxt_config_array[] = { - { - .config = mxt_config_data_8930_v1, - .config_length = ARRAY_SIZE(mxt_config_data_8930_v1), - .family_id = 0x81, - .variant_id = 0x01, - .version = 0x10, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_224E, - .fw_name = "atmel_8930_fluid_v2_0_AB.hex", - }, - { - .config = mxt_config_data_8930_v2, - .config_length = ARRAY_SIZE(mxt_config_data_8930_v2), - .family_id = 0x81, - .variant_id = 0x15, - .version = 0x11, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_224E, - .fw_name = "atmel_8930_fluid_v2_0_AB.hex", - }, - { - .config = mxt_config_data_8930_v2, - .config_length = ARRAY_SIZE(mxt_config_data_8930_v2), - .family_id = 0x81, - .variant_id = 0x01, - .version = 0x20, - .build = 0xAB, - .bootldr_id = MXT_BOOTLOADER_ID_224E, - }, -}; - -static struct mxt_platform_data mxt_platform_data_8930 = { - .config_array = mxt_config_array, - .config_array_size = ARRAY_SIZE(mxt_config_array), - .panel_minx = 0, - .panel_maxx = 566, - .panel_miny = 0, - .panel_maxy = 1067, - .disp_minx = 0, - .disp_maxx = 540, - .disp_miny = 0, - .disp_maxy = 960, - .irqflags = IRQF_TRIGGER_FALLING, -#ifdef MSM8930_PHASE_2 - .digital_pwr_regulator = true, -#endif - .i2c_pull_up = true, - .reset_gpio = MXT_TS_RESET_GPIO, - .irq_gpio = MXT_TS_GPIO_IRQ, -}; - -static struct i2c_board_info mxt_device_info_8930[] __initdata = { - { - I2C_BOARD_INFO("atmel_mxt_ts", 0x4a), - .platform_data = &mxt_platform_data_8930, - .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ), - }, -}; - -#define MHL_POWER_GPIO_PM8038 PM8038_GPIO_PM_TO_SYS(MHL_GPIO_PWR_EN) -#define MHL_POWER_GPIO_PM8917 PM8917_GPIO_PM_TO_SYS(25) -static struct msm_mhl_platform_data mhl_platform_data = { - .irq = MSM_GPIO_TO_INT(MHL_GPIO_INT), - .gpio_mhl_int = MHL_GPIO_INT, - .gpio_mhl_reset = MHL_GPIO_RESET, - .gpio_mhl_power = MHL_POWER_GPIO_PM8038, - .gpio_hdmi_mhl_mux = HDMI_MHL_MUX_GPIO, -}; - -static struct i2c_board_info sii_device_info[] __initdata = { - { - /* - * keeps SI 8334 as the default - * MHL TX - */ - I2C_BOARD_INFO("sii8334", 0x39), - .platform_data = &mhl_platform_data, - .flags = I2C_CLIENT_WAKE, - }, -}; - - -#ifdef MSM8930_PHASE_2 - -#define GPIO_VOLUME_UP_PM8038 PM8038_GPIO_PM_TO_SYS(3) -#define GPIO_VOLUME_DOWN_PM8038 PM8038_GPIO_PM_TO_SYS(8) -#define GPIO_CAMERA_SNAPSHOT_PM8038 PM8038_GPIO_PM_TO_SYS(10) -#define GPIO_CAMERA_FOCUS_PM8038 PM8038_GPIO_PM_TO_SYS(11) - -#define GPIO_VOLUME_UP_PM8917 PM8917_GPIO_PM_TO_SYS(27) -#define GPIO_VOLUME_DOWN_PM8917 PM8917_GPIO_PM_TO_SYS(28) -#define GPIO_CAMERA_SNAPSHOT_PM8917 PM8917_GPIO_PM_TO_SYS(36) -#define GPIO_CAMERA_FOCUS_PM8917 PM8917_GPIO_PM_TO_SYS(37) - -static struct gpio_keys_button keys_8930_pm8038[] = { - { - .code = KEY_VOLUMEUP, - .type = EV_KEY, - .desc = "volume_up", - .gpio = GPIO_VOLUME_UP_PM8038, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .type = EV_KEY, - .desc = "volume_down", - .gpio = GPIO_VOLUME_DOWN_PM8038, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_CAMERA_FOCUS, - .type = EV_KEY, - .desc = "camera_focus", - .gpio = GPIO_CAMERA_FOCUS_PM8038, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_CAMERA_SNAPSHOT, - .type = EV_KEY, - .desc = "camera_snapshot", - .gpio = GPIO_CAMERA_SNAPSHOT_PM8038, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, -}; - -static struct gpio_keys_button keys_8930_pm8917[] = { - { - .code = KEY_VOLUMEUP, - .type = EV_KEY, - .desc = "volume_up", - .gpio = GPIO_VOLUME_UP_PM8917, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_VOLUMEDOWN, - .type = EV_KEY, - .desc = "volume_down", - .gpio = GPIO_VOLUME_DOWN_PM8917, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_CAMERA_FOCUS, - .type = EV_KEY, - .desc = "camera_focus", - .gpio = GPIO_CAMERA_FOCUS_PM8917, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, - { - .code = KEY_CAMERA_SNAPSHOT, - .type = EV_KEY, - .desc = "camera_snapshot", - .gpio = GPIO_CAMERA_SNAPSHOT_PM8917, - .wakeup = 1, - .active_low = 1, - .debounce_interval = 15, - }, -}; - -/* Add GPIO keys for 8930 */ -static struct gpio_keys_platform_data gpio_keys_8930_pdata = { - .buttons = keys_8930_pm8038, - .nbuttons = ARRAY_SIZE(keys_8930_pm8038), -}; - -static struct platform_device gpio_keys_8930 = { - .name = "gpio-keys", - .id = -1, - .dev = { - .platform_data = &gpio_keys_8930_pdata, - }, -}; -#endif /* MSM8930_PHASE_2 */ - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi3_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi9_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi10_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi12_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - - -static struct ks8851_pdata spi_eth_pdata = { - .irq_gpio = KS8851_IRQ_GPIO, - .rst_gpio = KS8851_RST_GPIO, -}; - -static struct spi_board_info spi_board_info[] __initdata = { - { - .modalias = "ks8851", - .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO), - .max_speed_hz = 19200000, - .bus_num = 0, - .chip_select = 0, - .mode = SPI_MODE_0, - .platform_data = &spi_eth_pdata - }, - { - .modalias = "dsi_novatek_3d_panel_spi", - .max_speed_hz = 10800000, - .bus_num = 0, - .chip_select = 1, - .mode = SPI_MODE_0, - }, -}; - -static struct platform_device msm_device_saw_core0 = { - .name = "saw-regulator", - .id = 0, - .dev = { - .platform_data = &msm8930_pm8038_saw_regulator_core0_pdata, - }, -}; - -static struct platform_device msm_device_saw_core1 = { - .name = "saw-regulator", - .id = 1, - .dev = { - .platform_data = &msm8930_pm8038_saw_regulator_core1_pdata, - }, -}; - -static struct tsens_platform_data msm_tsens_pdata = { - .tsens_factor = 1000, - .hw_type = APQ_8064, - .tsens_num_sensor = 10, - .slope = {1132, 1135, 1137, 1135, 1157, - 1142, 1124, 1153, 1175, 1166}, -}; - -static struct platform_device msm_tsens_device = { - .name = "tsens8960-tm", - .id = -1, -}; - -static struct msm_thermal_data msm_thermal_pdata = { - .sensor_id = 9, - .poll_ms = 250, - .limit_temp_degC = 60, - .temp_hysteresis_degC = 10, - .freq_step = 2, -}; - -#ifdef CONFIG_MSM_FAKE_BATTERY -static struct platform_device fish_battery_device = { - .name = "fish_battery", -}; -#endif - -#ifndef MSM8930_PHASE_2 - -/* 8930 Phase 1 */ -static struct platform_device msm8930_device_ext_5v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_MPP_PM_TO_SYS(7), - .dev = { - .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V], - }, -}; - -static struct platform_device msm8930_device_ext_l2_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 91, - .dev = { - .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_L2], - }, -}; - -#else - -/* 8930 Phase 2 */ -static struct platform_device msm8930_device_ext_5v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 63, - .dev = { - .platform_data = &msm8930_pm8038_gpio_regulator_pdata[ - MSM8930_GPIO_VREG_ID_EXT_5V], - }, -}; - -static struct platform_device msm8930_device_ext_otg_sw_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 97, - .dev = { - .platform_data = &msm8930_pm8038_gpio_regulator_pdata[ - MSM8930_GPIO_VREG_ID_EXT_OTG_SW], - }, -}; - -#endif - -static struct platform_device msm8930_device_rpm_regulator = { - .name = "rpm-regulator", - .id = -1, - .dev = { -#ifndef MSM8930_PHASE_2 - .platform_data = &msm_rpm_regulator_pdata, -#else - .platform_data = &msm8930_pm8038_rpm_regulator_pdata, -#endif - }, -}; - -static struct platform_device *early_common_devices[] __initdata = { - &msm8960_device_dmov, - &msm_device_smd, - &msm8960_device_uart_gsbi5, - &msm_device_uart_dm6, - &msm_device_saw_core0, - &msm_device_saw_core1, -}; - -/* ext_5v and ext_otg_sw are present when using PM8038 */ -static struct platform_device *pmic_pm8038_devices[] __initdata = { - &msm8930_device_ext_5v_vreg, -#ifndef MSM8930_PHASE_2 - &msm8930_device_ext_l2_vreg, -#endif - &msm8960_device_ssbi_pmic, -#ifdef MSM8930_PHASE_2 - &msm8930_device_ext_otg_sw_vreg, -#endif -}; - -/* ext_5v and ext_otg_sw are not present when using PM8917 */ -static struct platform_device *pmic_pm8917_devices[] __initdata = { - &msm8960_device_ssbi_pmic, -}; - -static struct platform_device *common_devices[] __initdata = { - &msm_8960_q6_lpass, - &msm_8960_riva, - &msm_pil_tzapps, - &msm_pil_vidc, - &msm8960_device_qup_spi_gsbi1, - &msm8960_device_qup_i2c_gsbi3, - &msm8960_device_qup_i2c_gsbi4, - &msm8960_device_qup_i2c_gsbi9, - &msm8960_device_qup_i2c_gsbi10, - &msm8960_device_qup_i2c_gsbi12, - &msm_slim_ctrl, - &msm_device_wcnss_wlan, -#if defined(CONFIG_QSEECOM) - &qseecom_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &msm_device_sps, -#ifdef CONFIG_MSM_FAKE_BATTERY - &fish_battery_device, -#endif - &msm_device_bam_dmux, - &msm_fm_platform_init, - -#ifdef CONFIG_HW_RANDOM_MSM - &msm_device_rng, -#endif - &msm8930_rpm_device, - &msm8930_rpm_log_device, - &msm8930_rpm_rbcpr_device, - &msm8930_rpm_stat_device, - &msm8930_rpm_master_stat_device, -#ifdef CONFIG_ION_MSM - &msm8930_ion_dev, -#endif - &msm_device_tz_log, - &coresight_tpiu_device, - &coresight_etb_device, - &coresight_funnel_device, - &coresight_etm0_device, - &coresight_etm1_device, - &msm_device_dspcrashd_8960, - &msm8960_device_watchdog, -#ifdef MSM8930_PHASE_2 - &gpio_keys_8930, -#endif - &msm8930_rtb_device, - &msm_bus_8930_apps_fabric, - &msm_bus_8930_sys_fabric, - &msm_bus_8930_mm_fabric, - &msm_bus_8930_sys_fpb, - &msm_bus_8930_cpss_fpb, - &msm8960_device_cache_erp, - &msm8930_iommu_domain_device, - &msm_tsens_device, - &msm8930_cache_dump_device, - &msm8930_cpu_slp_status, -}; - -static struct platform_device *cdp_devices[] __initdata = { - &msm8960_device_otg, - &msm8960_device_gadget_peripheral, - &msm_device_hsusb_host, - &android_usb_device, - &msm_pcm, - &msm_pcm_routing, - &msm_cpudai0, - &msm_cpudai1, - &msm_cpudai_hdmi_rx, - &msm_cpudai_bt_rx, - &msm_cpudai_bt_tx, - &msm_cpudai_fm_rx, - &msm_cpudai_fm_tx, - &msm_cpudai_auxpcm_rx, - &msm_cpudai_auxpcm_tx, - &msm_cpu_fe, - &msm_stub_codec, -#ifdef CONFIG_MSM_GEMINI - &msm8960_gemini_device, -#endif - &msm_voice, - &msm_voip, - &msm_lpa_pcm, - &msm_cpudai_afe_01_rx, - &msm_cpudai_afe_01_tx, - &msm_cpudai_afe_02_rx, - &msm_cpudai_afe_02_tx, - &msm_pcm_afe, - &msm_compr_dsp, - &msm_cpudai_incall_music_rx, - &msm_cpudai_incall_record_rx, - &msm_cpudai_incall_record_tx, - &msm_pcm_hostless, - &msm_multi_ch_pcm, - &msm_lowlatency_pcm, - &msm_fm_loopback, -}; - -static void __init msm8930_i2c_init(void) -{ - msm8960_device_qup_i2c_gsbi4.dev.platform_data = - &msm8960_i2c_qup_gsbi4_pdata; - - msm8960_device_qup_i2c_gsbi3.dev.platform_data = - &msm8960_i2c_qup_gsbi3_pdata; - - msm8960_device_qup_i2c_gsbi9.dev.platform_data = - &msm8960_i2c_qup_gsbi9_pdata; - - msm8960_device_qup_i2c_gsbi10.dev.platform_data = - &msm8960_i2c_qup_gsbi10_pdata; - - msm8960_device_qup_i2c_gsbi12.dev.platform_data = - &msm8960_i2c_qup_gsbi12_pdata; -} - -static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = { - { - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1, 784, 180000, 100, - }, - - { - MSM_PM_SLEEP_MODE_RETENTION, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 415, 715, 340827, 475, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1300, 228, 1200000, 2000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE), - false, - 2000, 138, 1208400, 3200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 6000, 119, 1850300, 9000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE), - false, - 9200, 68, 2839200, 16400, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), - false, - 10300, 63, 3128000, 18200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 18000, 10, 4602600, 27000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW), - false, - 20000, 2, 5752000, 32000, - }, -}; - -static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000, - [MSM_RPMRS_VDD_MEM_MAX] = 1150000, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 0, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 0, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 1, - [MSM_RPMRS_VDD_DIG_MAX] = 3, - }, - .vdd_mask = 0x7FFFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_VOLTAGE_CORNER, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8038_L24_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8038_L24_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL, - }, -}; - -static struct msm_rpmrs_platform_data msm_rpmrs_data_pm8917 __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000, - [MSM_RPMRS_VDD_MEM_MAX] = 1150000, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 0, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 0, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 1, - [MSM_RPMRS_VDD_DIG_MAX] = 3, - }, - .vdd_mask = 0x7FFFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_VOLTAGE_CORNER, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8917_L24_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8917_L24_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_TZ, -}; - -#ifdef CONFIG_I2C -#define I2C_SURF 1 -#define I2C_FFA (1 << 1) -#define I2C_RUMI (1 << 2) -#define I2C_SIM (1 << 3) -#define I2C_FLUID (1 << 4) -#define I2C_LIQUID (1 << 5) - -struct i2c_registry { - u8 machs; - int bus; - struct i2c_board_info *info; - int len; -}; - -#ifdef CONFIG_INPUT_MPU3050 -#define MPU3050_INT_GPIO 69 - -static struct mpu3050_gyro_platform_data mpu3050_gyro = { - .gpio_int = MPU3050_INT_GPIO, -}; - -static struct i2c_board_info __initdata mpu3050_i2c_boardinfo[] = { - { - I2C_BOARD_INFO("mpu3050", 0x68), - .irq = MSM_GPIO_TO_INT(MPU3050_INT_GPIO), - .platform_data = &mpu3050_gyro, - }, -}; -#endif - -#ifdef CONFIG_ISL9519_CHARGER -static struct isl_platform_data isl_data __initdata = { - .valid_n_gpio = 0, /* Not required when notify-by-pmic */ - .chg_detection_config = NULL, /* Not required when notify-by-pmic */ - .max_system_voltage = 4200, - .min_system_voltage = 3200, - .chgcurrent = 1000, /* 1900, */ - .term_current = 400, /* Need fine tuning */ - .input_current = 2048, -}; - -static struct i2c_board_info isl_charger_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("isl9519q", 0x9), - .irq = 0, /* Not required when notify-by-pmic */ - .platform_data = &isl_data, - }, -}; -#endif /* CONFIG_ISL9519_CHARGER */ - -#ifdef CONFIG_STM_LIS3DH -static struct lis3dh_acc_platform_data lis3dh_accel = { - .poll_interval = 200, - .min_interval = 10, - .g_range = LIS3DH_ACC_G_2G, - .axis_map_x = 1, - .axis_map_y = 0, - .axis_map_z = 2, - .negate_x = 0, - .negate_y = 0, - .negate_z = 1, - .init = NULL, - .exit = NULL, - .gpio_int1 = -EINVAL, - .gpio_int2 = -EINVAL, -}; - -static struct i2c_board_info __initdata lis3dh_i2c_boardinfo[] = { - { - I2C_BOARD_INFO(LIS3DH_ACC_DEV_NAME, 0x18), - .platform_data = &lis3dh_accel, - }, -}; -#endif /* CONFIG_STM_LIS3DH */ - -static struct i2c_registry msm8960_i2c_devices[] __initdata = { -#ifdef CONFIG_ISL9519_CHARGER - { - I2C_LIQUID, - MSM_8930_GSBI10_QUP_I2C_BUS_ID, - isl_charger_i2c_info, - ARRAY_SIZE(isl_charger_i2c_info), - }, -#endif /* CONFIG_ISL9519_CHARGER */ -#ifdef CONFIG_INPUT_MPU3050 - { - I2C_FFA | I2C_FLUID, - MSM_8930_GSBI12_QUP_I2C_BUS_ID, - mpu3050_i2c_boardinfo, - ARRAY_SIZE(mpu3050_i2c_boardinfo), - }, -#endif - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_8930_GSBI9_QUP_I2C_BUS_ID, - msm_isa1200_board_info, - ARRAY_SIZE(msm_isa1200_board_info), - }, - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_8930_GSBI3_QUP_I2C_BUS_ID, - mxt_device_info_8930, - ARRAY_SIZE(mxt_device_info_8930), - }, - { - I2C_SURF | I2C_FFA | I2C_LIQUID | I2C_FLUID, - MSM_8930_GSBI9_QUP_I2C_BUS_ID, - sii_device_info, - ARRAY_SIZE(sii_device_info), - }, -#ifdef CONFIG_STM_LIS3DH - { - I2C_FFA | I2C_FLUID, - MSM_8930_GSBI12_QUP_I2C_BUS_ID, - lis3dh_i2c_boardinfo, - ARRAY_SIZE(lis3dh_i2c_boardinfo), - }, -#endif -}; -#endif /* CONFIG_I2C */ - -static void __init register_i2c_devices(void) -{ -#ifdef CONFIG_I2C - u8 mach_mask = 0; - int i; -#ifdef CONFIG_MSM_CAMERA - struct i2c_registry msm8930_camera_i2c_devices = { - I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI, - MSM_8930_GSBI4_QUP_I2C_BUS_ID, - msm8930_camera_board_info.board_info, - msm8930_camera_board_info.num_i2c_board_info, - }; -#endif - - /* Build the matching 'supported_machs' bitmask */ - if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp()) - mach_mask = I2C_SURF; - else if (machine_is_msm8930_fluid()) - mach_mask = I2C_FLUID; - else if (machine_is_msm8930_mtp() || machine_is_msm8627_mtp()) - mach_mask = I2C_FFA; - else - pr_err("unmatched machine ID in register_i2c_devices\n"); - - /* Run the array and install devices as appropriate */ - for (i = 0; i < ARRAY_SIZE(msm8960_i2c_devices); ++i) { - if (msm8960_i2c_devices[i].machs & mach_mask) - i2c_register_board_info(msm8960_i2c_devices[i].bus, - msm8960_i2c_devices[i].info, - msm8960_i2c_devices[i].len); - } -#ifdef CONFIG_MSM_CAMERA - if (msm8930_camera_i2c_devices.machs & mach_mask) - i2c_register_board_info(msm8930_camera_i2c_devices.bus, - msm8930_camera_i2c_devices.info, - msm8930_camera_i2c_devices.len); -#endif -#endif -} - -/*Modify the WCD9xxx platform data to support supplies from PM8917 */ -static void __init msm8930_pm8917_wcd9xxx_pdata_fixup( - struct wcd9xxx_pdata *cdc_pdata) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(cdc_pdata->regulator); i++) { - - if (cdc_pdata->regulator[i].name != NULL - && strncmp(cdc_pdata->regulator[i].name, - "CDC_VDD_CP", 10) == 0) { - cdc_pdata->regulator[i].min_uV = - cdc_pdata->regulator[i].max_uV = 1800000; - pr_info("%s: CDC_VDD_CP forced to 1.8 volts for PM8917\n", - __func__); - return; - } - } -} - -/* Modify platform data values to match requirements for PM8917. */ -static void __init msm8930_pm8917_pdata_fixup(void) -{ - msm8930_pm8917_wcd9xxx_pdata_fixup(&sitar_platform_data); - msm8930_pm8917_wcd9xxx_pdata_fixup(&sitar1p1_platform_data); - - mhl_platform_data.gpio_mhl_power = MHL_POWER_GPIO_PM8917; - - gpio_keys_8930_pdata.buttons = keys_8930_pm8917; - gpio_keys_8930_pdata.nbuttons = ARRAY_SIZE(keys_8930_pm8917); - - msm_device_saw_core0.dev.platform_data - = &msm8930_pm8038_saw_regulator_core0_pdata; - msm_device_saw_core1.dev.platform_data - = &msm8930_pm8038_saw_regulator_core1_pdata; - - msm8930_device_rpm_regulator.dev.platform_data - = &msm8930_pm8917_rpm_regulator_pdata; -} - -static void __init msm8930ab_update_retention_spm(void) -{ - int i; - - /* Update the SPM sequences for krait retention on all cores */ - for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) { - int j; - struct msm_spm_platform_data *pdata = &msm_spm_data[i]; - for (j = 0; j < pdata->num_modes; j++) { - if (pdata->modes[j].cmd == - spm_retention_cmd_sequence) - pdata->modes[j].cmd = - spm_retention_with_krait_v3_cmd_sequence; - } - } -} - -static void __init msm8930_cdp_init(void) -{ - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - msm8930_pm8917_pdata_fixup(); - if (meminfo_init(SYS_MEMORY, SZ_256M) < 0) - pr_err("meminfo_init() failed!\n"); - - platform_device_register(&msm_gpio_device); - msm_tsens_early_init(&msm_tsens_pdata); - msm_thermal_init(&msm_thermal_pdata); - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) { - BUG_ON(msm_rpm_init(&msm8930_rpm_data)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data)); - } else { - BUG_ON(msm_rpm_init(&msm8930_rpm_data_pm8917)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data_pm8917)); - } - - regulator_suppress_info_printing(); - if (msm_xo_init()) - pr_err("Failed to initialize XO votes\n"); - platform_device_register(&msm8930_device_rpm_regulator); - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - msm_clock_init(&msm8930_pm8917_clock_init_data); - else - msm_clock_init(&msm8930_clock_init_data); - - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) { - /* - * By default, set USB mode as USB Peripheral only due to - * hardware rework requirement for USB Host Mode. - * Provide pmic_id_irq number only if host mode is enable - * by user assuming that hardware rework is available. - */ - if (enable_usb_host_mode) { - /* MPP01 IRQ number */ - msm_otg_pdata.pmic_id_irq = - PM8921_MPP_IRQ(PM8917_IRQ_BASE, 1); - } else { - pr_err("Enabling USB Peripheral Only mode.\n"); - msm_otg_pdata.mode = USB_PERIPHERAL; - } - } else { - msm_otg_pdata.pmic_id_irq = - PM8038_USB_ID_IN_IRQ(PM8038_IRQ_BASE); - } - - msm_otg_pdata.phy_init_seq = hsusb_phy_init_seq; - if (msm8930_mhl_display_enabled()) { - mhl_platform_data.mhl_enabled = true; - msm_otg_pdata.mhl_enable = true; - } - msm8960_device_otg.dev.platform_data = &msm_otg_pdata; - android_usb_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; - msm8930_init_gpiomux(); - msm8960_device_qup_spi_gsbi1.dev.platform_data = - &msm8960_qup_spi_gsbi1_pdata; - spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); - - /* - * TODO: When physical 8930/PM8038 hardware becomes - * available, remove this block or add the config - * option. - */ -#ifndef MSM8930_PHASE_2 - msm8960_init_pmic(); -#else - msm8930_init_pmic(); -#endif - msm8930_i2c_init(); - msm8930_init_gpu(); - if (cpu_is_krait_v3()) { - struct msm_pm_init_data_type *pdata = - msm8930_pm_8x60.dev.platform_data; - pdata->retention_calls_tz = false; - msm8930ab_update_retention_spm(); - } - - platform_device_register(&msm8930_pm_8x60); - - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); - msm_spm_l2_init(msm_spm_l2_data); - msm8930_init_buses(); - if (cpu_is_msm8627()) { - platform_add_devices(msm8627_footswitch, - msm8627_num_footswitch); - } else { - if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917) - platform_add_devices(msm8930_pm8917_footswitch, - msm8930_pm8917_num_footswitch); - else - platform_add_devices(msm8930_footswitch, - msm8930_num_footswitch); - } - if (cpu_is_msm8627()) - platform_device_register(&msm8627_device_acpuclk); - else if (cpu_is_msm8930()) - platform_device_register(&msm8930_device_acpuclk); - else if (cpu_is_msm8930aa()) - platform_device_register(&msm8930aa_device_acpuclk); - else if (cpu_is_msm8930ab()) - platform_device_register(&msm8930ab_device_acpuclk); - platform_add_devices(early_common_devices, - ARRAY_SIZE(early_common_devices)); - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) - platform_add_devices(pmic_pm8038_devices, - ARRAY_SIZE(pmic_pm8038_devices)); - else - platform_add_devices(pmic_pm8917_devices, - ARRAY_SIZE(pmic_pm8917_devices)); - platform_add_devices(common_devices, ARRAY_SIZE(common_devices)); - msm8930_add_vidc_device(); - /* - * TODO: When physical 8930/PM8038 hardware becomes - * available, remove this block or add the config - * option. - */ -#ifndef MSM8930_PHASE_2 - msm8960_pm8921_gpio_mpp_init(); -#else - if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) - msm8930_pm8038_gpio_mpp_init(); - else - msm8930_pm8917_gpio_mpp_init(); -#endif - /* Don't add modem devices on APQ targets */ - if (socinfo_get_id() != 119 && socinfo_get_id() != 157 - && socinfo_get_id() != 160) - platform_device_register(&msm_8960_q6_mss); - platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices)); -#ifdef CONFIG_MSM_CAMERA - msm8930_init_cam(); -#endif - msm8930_init_mmc(); - mxt_init_vkeys_8930(); - register_i2c_devices(); - msm8930_init_fb(); - slim_register_board_info(msm_slim_devices, - ARRAY_SIZE(msm_slim_devices)); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - - if (PLATFORM_IS_CHARM25()) - platform_add_devices(mdm_devices, ARRAY_SIZE(mdm_devices)); -} - -MACHINE_START(MSM8930_CDP, "QCT MSM8930 CDP") - .map_io = msm8930_map_io, - .reserve = msm8930_reserve, - .init_irq = msm8930_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8930_cdp_init, - .init_early = msm8930_allocate_memory_regions, - .init_very_early = msm8930_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8930_MTP, "QCT MSM8930 MTP") - .map_io = msm8930_map_io, - .reserve = msm8930_reserve, - .init_irq = msm8930_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8930_cdp_init, - .init_early = msm8930_allocate_memory_regions, - .init_very_early = msm8930_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8930_FLUID, "QCT MSM8930 FLUID") - .map_io = msm8930_map_io, - .reserve = msm8930_reserve, - .init_irq = msm8930_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8930_cdp_init, - .init_early = msm8930_allocate_memory_regions, - .init_very_early = msm8930_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8627_CDP, "QCT MSM8627 CDP") - .map_io = msm8930_map_io, - .reserve = msm8930_reserve, - .init_irq = msm8930_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8930_cdp_init, - .init_early = msm8930_allocate_memory_regions, - .init_very_early = msm8930_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8627_MTP, "QCT MSM8627 MTP") - .map_io = msm8930_map_io, - .reserve = msm8930_reserve, - .init_irq = msm8930_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8930_cdp_init, - .init_early = msm8930_allocate_memory_regions, - .init_very_early = msm8930_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-8930.h b/arch/arm/mach-msm/board-8930.h deleted file mode 100644 index 4e72acc5945b..000000000000 --- a/arch/arm/mach-msm/board-8930.h +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_MSM8930_H -#define __ARCH_ARM_MACH_MSM_BOARD_MSM8930_H - -#define MSM8930_PHASE_2 - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * TODO: When physical 8930/PM8038 hardware becomes - * available, remove this block. - */ -#ifndef MSM8930_PHASE_2 -#include -#define PM8921_GPIO_BASE NR_GPIO_IRQS -#define PM8921_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8921_GPIO_BASE) -#define PM8921_MPP_BASE (PM8921_GPIO_BASE + PM8921_NR_GPIOS) -#define PM8921_MPP_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8921_MPP_BASE) -#endif - -/* Macros assume PMIC GPIOs and MPPs start at 1 */ -/* - * PM8917 has more GPIOs and MPPs than PM8038; therefore, use PM8038 sizes at - * all times so that PM8038 vs PM8917 can be chosen at runtime. This results in - * the Linux GPIO address space being contiguous for PM8917 and discontiguous - * for PM8038. - */ -#define PM8038_GPIO_BASE NR_GPIO_IRQS -#define PM8038_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8038_GPIO_BASE) -#define PM8038_MPP_BASE (PM8038_GPIO_BASE + PM8917_NR_GPIOS) -#define PM8038_MPP_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8038_MPP_BASE) -#define PM8038_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS) - -/* These PM8917 alias macros are used to provide context in board files. */ -#define PM8917_GPIO_PM_TO_SYS(pm_gpio) PM8038_GPIO_PM_TO_SYS(pm_gpio) -#define PM8917_MPP_PM_TO_SYS(pm_gpio) PM8038_MPP_PM_TO_SYS(pm_gpio) -#define PM8917_IRQ_BASE PM8038_IRQ_BASE - -/* - * TODO: When physical 8930/PM8038 hardware becomes - * available, replace this block with 8930/pm8038 regulator - * declarations. - */ -#ifndef MSM8930_PHASE_2 -extern struct pm8xxx_regulator_platform_data - msm_pm8921_regulator_pdata[] ; - -extern int msm_pm8921_regulator_pdata_len ; - -extern struct gpio_regulator_platform_data - msm_gpio_regulator_pdata[] ; - -extern struct rpm_regulator_platform_data msm_rpm_regulator_pdata ; - -#define GPIO_VREG_ID_EXT_5V 0 -#define GPIO_VREG_ID_EXT_L2 1 -#define GPIO_VREG_ID_EXT_3P3V 2 -#endif - -extern struct regulator_init_data msm8930_pm8038_saw_regulator_core0_pdata; -extern struct regulator_init_data msm8930_pm8038_saw_regulator_core1_pdata; -extern struct regulator_init_data msm8930_pm8917_saw_regulator_core0_pdata; -extern struct regulator_init_data msm8930_pm8917_saw_regulator_core1_pdata; - -extern struct pm8xxx_regulator_platform_data - msm8930_pm8038_regulator_pdata[] ; -extern int msm8930_pm8038_regulator_pdata_len ; - -extern struct pm8xxx_regulator_platform_data - msm8930_pm8917_regulator_pdata[] ; -extern int msm8930_pm8917_regulator_pdata_len ; - -#define MSM8930_GPIO_VREG_ID_EXT_5V 0 -#define MSM8930_GPIO_VREG_ID_EXT_OTG_SW 1 - -extern struct gpio_regulator_platform_data - msm8930_pm8038_gpio_regulator_pdata[] ; -extern struct gpio_regulator_platform_data - msm8930_pm8917_gpio_regulator_pdata[] ; - -extern struct rpm_regulator_platform_data - msm8930_pm8038_rpm_regulator_pdata ; -extern struct rpm_regulator_platform_data - msm8930_pm8917_rpm_regulator_pdata ; - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) -enum { - GPIO_EXPANDER_IRQ_BASE = (PM8038_IRQ_BASE + PM8038_NR_IRQS), - GPIO_EXPANDER_GPIO_BASE = (PM8038_MPP_BASE + PM8917_NR_MPPS), - /* CAM Expander */ - GPIO_CAM_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE, - GPIO_CAM_GP_STROBE_READY = GPIO_CAM_EXPANDER_BASE, - GPIO_CAM_GP_AFBUSY, - GPIO_CAM_GP_STROBE_CE, - GPIO_CAM_GP_CAM1MP_XCLR, - GPIO_CAM_GP_CAMIF_RESET_N, - GPIO_CAM_GP_XMT_FLASH_INT, - GPIO_CAM_GP_LED_EN1, - GPIO_CAM_GP_LED_EN2, - -}; -#endif - -enum { - SX150X_CAM, -}; - -#endif - -extern struct sx150x_platform_data msm8930_sx150x_data[]; -extern struct msm_camera_board_info msm8930_camera_board_info; -void msm8930_init_cam(void); -void msm8930_init_fb(void); -void msm8930_init_pmic(void); -extern void msm8930_add_vidc_device(void); -unsigned char msm8930_mhl_display_enabled(void); - -/* - * TODO: When physical 8930/PM8038 hardware becomes - * available, remove this block or add the config - * option. - */ -#ifndef MSM8930_PHASE_2 -void msm8960_init_pmic(void); -void msm8960_pm8921_gpio_mpp_init(void); -#endif - -void msm8930_init_mmc(void); -int msm8930_init_gpiomux(void); -void msm8930_allocate_fb_region(void); -void msm8930_pm8038_gpio_mpp_init(void); -void msm8930_pm8917_gpio_mpp_init(void); -void msm8930_set_display_params(char *prim_panel, char *ext_panel); -void msm8930_mdp_writeback(struct memtype_reserve *reserve_table); -void __init msm8930_init_gpu(void); - -#define PLATFORM_IS_CHARM25() \ - (machine_is_msm8930_cdp() && \ - (socinfo_get_platform_subtype() == 1) \ - ) - -#define MSM_8930_GSBI3_QUP_I2C_BUS_ID 3 -#define MSM_8930_GSBI4_QUP_I2C_BUS_ID 4 -#define MSM_8930_GSBI9_QUP_I2C_BUS_ID 0 -#define MSM_8930_GSBI10_QUP_I2C_BUS_ID 10 -#define MSM_8930_GSBI12_QUP_I2C_BUS_ID 12 - -#define HDMI_MHL_MUX_GPIO 73 - -extern struct msm_rtb_platform_data msm8930_rtb_pdata; -extern struct msm_cache_dump_platform_data msm8930_cache_dump_pdata; diff --git a/arch/arm/mach-msm/board-8960-camera.c b/arch/arm/mach-msm/board-8960-camera.c deleted file mode 100644 index 836c8f374186..000000000000 --- a/arch/arm/mach-msm/board-8960-camera.c +++ /dev/null @@ -1,936 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8960.h" - -#ifdef CONFIG_MSM_CAMERA - -#if (defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)) && \ - defined(CONFIG_I2C) - -static struct i2c_board_info cam_expander_i2c_info[] = { - { - I2C_BOARD_INFO("sx1508q", 0x22), - .platform_data = &msm8960_sx150x_data[SX150X_CAM] - }, -}; - -static struct msm_cam_expander_info cam_expander_info[] = { - { - cam_expander_i2c_info, - MSM_8960_GSBI4_QUP_I2C_BUS_ID, - }, -}; -#endif - -static struct gpiomux_setting cam_settings[] = { - { - .func = GPIOMUX_FUNC_GPIO, /*suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - }, - - { - .func = GPIOMUX_FUNC_1, /*active 1*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*active 2*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_1, /*active 3*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - }, - - { - .func = GPIOMUX_FUNC_5, /*active 4*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_6, /*active 5*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_2, /*active 6*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_3, /*active 7*/ - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, - }, - - { - .func = GPIOMUX_FUNC_GPIO, /*i2c suspend*/ - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, - }, - -}; - -static struct msm_gpiomux_config msm8960_cdp_flash_configs[] = { - { - .gpio = 3, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[1], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, -}; - -static struct msm_gpiomux_config msm8960_cam_common_configs[] = { - { - .gpio = 2, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 3, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 4, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[1], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 5, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 76, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, - { - .gpio = 107, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[2], - [GPIOMUX_SUSPENDED] = &cam_settings[0], - }, - }, -}; - -static struct msm_gpiomux_config msm8960_cam_2d_configs[] = { - { - .gpio = 18, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 19, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 20, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 21, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, -}; - -static struct msm_gpiomux_config msm8960_cam_2d_configs_sglte[] = { - { - .gpio = 20, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, - { - .gpio = 21, - .settings = { - [GPIOMUX_ACTIVE] = &cam_settings[3], - [GPIOMUX_SUSPENDED] = &cam_settings[8], - }, - }, -}; - -#define VFE_CAMIF_TIMER1_GPIO 2 -#define VFE_CAMIF_TIMER2_GPIO 3 -#define VFE_CAMIF_TIMER3_GPIO_INT 4 - -static struct gpio flash_init_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER1"}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_LOW, "CAMIF_TIMER2"}, -}; - -static struct msm_gpio_set_tbl flash_set_gpio[] = { - {VFE_CAMIF_TIMER1_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, - {VFE_CAMIF_TIMER2_GPIO, GPIOF_OUT_INIT_HIGH, 2000}, -}; - -static struct msm_camera_sensor_strobe_flash_data strobe_flash_xenon = { - .flash_trigger = VFE_CAMIF_TIMER2_GPIO, - .flash_charge = VFE_CAMIF_TIMER1_GPIO, - .flash_charge_done = VFE_CAMIF_TIMER3_GPIO_INT, - .flash_recharge_duration = 50000, - .irq = MSM_GPIO_TO_INT(VFE_CAMIF_TIMER3_GPIO_INT), -}; - -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_EXT, - .init_gpio_tbl = flash_init_gpio, - .init_gpio_tbl_size = ARRAY_SIZE(flash_init_gpio), - .set_gpio_tbl = flash_set_gpio, - .set_gpio_tbl_size = ARRAY_SIZE(flash_set_gpio), - ._fsrc.ext_driver_src.led_en = VFE_CAMIF_TIMER1_GPIO, - ._fsrc.ext_driver_src.led_flash_en = VFE_CAMIF_TIMER2_GPIO, - ._fsrc.ext_driver_src.flash_id = MAM_CAMERA_EXT_LED_FLASH_SC628A, -}; - -static struct msm_bus_vectors cam_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_preview_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 27648000, - .ib = 110592000, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 274406400, - .ib = 617103360, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 274423680, - .ib = 1097694720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, -}; - -static struct msm_bus_vectors cam_zsl_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 302071680, - .ib = 1208286720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, -}; - -static struct msm_bus_vectors cam_video_ls_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 348192000, - .ib = 617103360, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_dual_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 348192000, - .ib = 1208286720, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 206807040, - .ib = 488816640, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 540000000, - .ib = 1350000000, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_MM_IMEM, - .ab = 43200000, - .ib = 69120000, - }, -}; - - - -static struct msm_bus_paths cam_bus_client_config[] = { - { - ARRAY_SIZE(cam_init_vectors), - cam_init_vectors, - }, - { - ARRAY_SIZE(cam_preview_vectors), - cam_preview_vectors, - }, - { - ARRAY_SIZE(cam_video_vectors), - cam_video_vectors, - }, - { - ARRAY_SIZE(cam_snapshot_vectors), - cam_snapshot_vectors, - }, - { - ARRAY_SIZE(cam_zsl_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_video_ls_vectors), - cam_video_ls_vectors, - }, - { - ARRAY_SIZE(cam_dual_vectors), - cam_dual_vectors, - }, -}; - -static struct msm_bus_scale_pdata cam_bus_client_pdata = { - cam_bus_client_config, - ARRAY_SIZE(cam_bus_client_config), - .name = "msm_camera", -}; - -static struct msm_camera_device_platform_data msm_camera_csi_device_data[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, - { - .csiphy_core = 1, - .csid_core = 1, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, - { - .csiphy_core = 2, - .csid_core = 2, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - }, -}; - -static struct camera_vreg_t msm_8960_cam_vreg[] = { - {"cam_vdig", REG_LDO, 1200000, 1200000, 105000}, - {"cam_vio", REG_VS, 0, 0, 0}, - {"cam_vana", REG_LDO, 2800000, 2850000, 85600}, - {"cam_vaf", REG_LDO, 2800000, 2800000, 300000}, -}; - -static struct gpio msm8960_common_cam_gpio[] = { - {5, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {20, GPIOF_DIR_IN, "CAMIF_I2C_DATA"}, - {21, GPIOF_DIR_IN, "CAMIF_I2C_CLK"}, -}; - -static struct gpio msm8960_front_cam_gpio[] = { - {76, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct gpio msm8960_back_cam_gpio[] = { - {107, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl msm8960_front_cam_gpio_set_tbl[] = { - {76, GPIOF_OUT_INIT_LOW, 1000}, - {76, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_gpio_set_tbl msm8960_back_cam_gpio_set_tbl[] = { - {107, GPIOF_OUT_INIT_LOW, 1000}, - {107, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_camera_gpio_conf msm_8960_front_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = msm8960_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(msm8960_cam_2d_configs), - .cam_gpio_common_tbl = msm8960_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8960_common_cam_gpio), - .cam_gpio_req_tbl = msm8960_front_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm8960_front_cam_gpio), - .cam_gpio_set_tbl = msm8960_front_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm8960_front_cam_gpio_set_tbl), -}; - -static struct msm_camera_gpio_conf msm_8960_back_cam_gpio_conf = { - .cam_gpiomux_conf_tbl = msm8960_cam_2d_configs, - .cam_gpiomux_conf_tbl_size = ARRAY_SIZE(msm8960_cam_2d_configs), - .cam_gpio_common_tbl = msm8960_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8960_common_cam_gpio), - .cam_gpio_req_tbl = msm8960_back_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm8960_back_cam_gpio), - .cam_gpio_set_tbl = msm8960_back_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm8960_back_cam_gpio_set_tbl), -}; - -static struct i2c_board_info msm_act_main_cam_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x11), -}; - -static struct msm_actuator_info msm_act_main_cam_0_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_0, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct i2c_board_info msm_act_main_cam1_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x18), -}; - -static struct msm_actuator_info msm_act_main_cam_1_info = { - .board_info = &msm_act_main_cam1_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_1, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct i2c_board_info sc628a_flash_i2c_info = { - I2C_BOARD_INFO("sc628a", 0x6E), -}; - -static struct msm_camera_sensor_flash_data flash_imx074 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src, - .board_info = &sc628a_flash_i2c_info, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_csi_lane_params imx074_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = { - .mount_angle = 90, - .cam_vreg = msm_8960_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8960_cam_vreg), - .gpio_conf = &msm_8960_back_cam_gpio_conf, - .csi_lane_params = &imx074_csi_lane_params, -}; - -static struct i2c_board_info imx074_eeprom_i2c_info = { - I2C_BOARD_INFO("imx074_eeprom", 0x34 << 1), -}; - -static struct msm_eeprom_info imx074_eeprom_info = { - .board_info = &imx074_eeprom_i2c_info, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = { - .sensor_name = "imx074", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx074, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &sensor_board_info_imx074, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_0_info, - .eeprom_info = &imx074_eeprom_info, -}; - -static struct msm_camera_sensor_flash_data flash_mt9m114 = { - .flash_type = MSM_CAMERA_FLASH_NONE -}; - -static struct msm_camera_csi_lane_params mt9m114_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x1, -}; - -static struct camera_vreg_t mt9m114_cam_vreg[] = { - {"cam_vdig", REG_LDO, 1200000, 1200000, 105000, 50}, - {"cam_vio", REG_VS, 0, 0, 0, 50}, - {"cam_vana", REG_LDO, 2800000, 2850000, 85600, 50}, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_mt9m114 = { - .mount_angle = 90, - .cam_vreg = mt9m114_cam_vreg, - .num_vreg = ARRAY_SIZE(mt9m114_cam_vreg), - .gpio_conf = &msm_8960_front_cam_gpio_conf, - .csi_lane_params = &mt9m114_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9m114_data = { - .sensor_name = "mt9m114", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_mt9m114, - .sensor_platform_info = &sensor_board_info_mt9m114, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = YUV_SENSOR, -}; - -static struct msm_camera_sensor_flash_data flash_ov2720 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params ov2720_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0x3, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = { - .mount_angle = 0, - .cam_vreg = msm_8960_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8960_cam_vreg), - .gpio_conf = &msm_8960_front_cam_gpio_conf, - .csi_lane_params = &ov2720_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = { - .sensor_name = "ov2720", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_ov2720, - .sensor_platform_info = &sensor_board_info_ov2720, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; - -static struct msm_camera_sensor_flash_data flash_s5k3l1yx = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params s5k3l1yx_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_s5k3l1yx = { - .mount_angle = 0, - .cam_vreg = msm_8960_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8960_cam_vreg), - .gpio_conf = &msm_8960_back_cam_gpio_conf, - .csi_lane_params = &s5k3l1yx_csi_lane_params, -}; - -static struct msm_actuator_info msm_act_main_cam_2_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_2, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, - .vcm_pwd = 0, - .vcm_enable = 0, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3l1yx_data = { - .sensor_name = "s5k3l1yx", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_s5k3l1yx, - .sensor_platform_info = &sensor_board_info_s5k3l1yx, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_2_info, -}; - -static struct msm_camera_csi_lane_params imx091_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_flash_data flash_imx091 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src, - .board_info = &sc628a_flash_i2c_info, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx091 = { - .mount_angle = 0, - .cam_vreg = msm_8960_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8960_cam_vreg), - .gpio_conf = &msm_8960_back_cam_gpio_conf, - .csi_lane_params = &imx091_csi_lane_params, -}; - -static struct i2c_board_info imx091_eeprom_i2c_info = { - I2C_BOARD_INFO("imx091_eeprom", 0x21), -}; - -static struct msm_eeprom_info imx091_eeprom_info = { - .board_info = &imx091_eeprom_i2c_info, - .bus_id = MSM_8960_GSBI4_QUP_I2C_BUS_ID, - .eeprom_i2c_slave_addr = 0xA1, - .eeprom_reg_addr = 0x05, - .eeprom_read_length = 6, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx091_data = { - .sensor_name = "imx091", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx091, - .sensor_platform_info = &sensor_board_info_imx091, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_1_info, - .eeprom_info = &imx091_eeprom_info, -}; - -static struct msm_camera_sensor_flash_data flash_imx135 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_csi_lane_params imx135_csi_lane_params = { - .csi_lane_assign = 0xE4, - .csi_lane_mask = 0xF, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx135 = { - .mount_angle = 90, - .cam_vreg = msm_8960_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8960_cam_vreg), - .gpio_conf = &msm_8960_back_cam_gpio_conf, - .csi_lane_params = &imx135_csi_lane_params, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx135_data = { - .sensor_name = "imx135", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx135, - .sensor_platform_info = &sensor_board_info_imx135, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_1_info, -}; - -static struct pm8xxx_mpp_config_data privacy_light_on_config = { - .type = PM8XXX_MPP_TYPE_SINK, - .level = PM8XXX_MPP_CS_OUT_5MA, - .control = PM8XXX_MPP_CS_CTRL_MPP_LOW_EN, -}; - -static struct pm8xxx_mpp_config_data privacy_light_off_config = { - .type = PM8XXX_MPP_TYPE_SINK, - .level = PM8XXX_MPP_CS_OUT_5MA, - .control = PM8XXX_MPP_CS_CTRL_DISABLE, -}; - -static int32_t msm_camera_8960_ext_power_ctrl(int enable) -{ - int rc = 0; - if (enable) { - rc = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(12), - &privacy_light_on_config); - } else { - rc = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(12), - &privacy_light_off_config); - } - return rc; -} - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -void __init msm8960_init_cam(void) -{ - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) { - msm_8960_front_cam_gpio_conf.cam_gpiomux_conf_tbl = - msm8960_cam_2d_configs_sglte; - msm_8960_front_cam_gpio_conf.cam_gpiomux_conf_tbl_size = - ARRAY_SIZE(msm8960_cam_2d_configs_sglte); - msm_8960_back_cam_gpio_conf.cam_gpiomux_conf_tbl = - msm8960_cam_2d_configs_sglte; - msm_8960_back_cam_gpio_conf.cam_gpiomux_conf_tbl_size = - ARRAY_SIZE(msm8960_cam_2d_configs_sglte); - } - msm_gpiomux_install(msm8960_cam_common_configs, - ARRAY_SIZE(msm8960_cam_common_configs)); - - if (machine_is_msm8960_cdp()) { - msm_gpiomux_install(msm8960_cdp_flash_configs, - ARRAY_SIZE(msm8960_cdp_flash_configs)); - msm_flash_src._fsrc.ext_driver_src.led_en = - GPIO_CAM_GP_LED_EN1; - msm_flash_src._fsrc.ext_driver_src.led_flash_en = - GPIO_CAM_GP_LED_EN2; - #if defined(CONFIG_I2C) && (defined(CONFIG_GPIO_SX150X) || \ - defined(CONFIG_GPIO_SX150X_MODULE)) - msm_flash_src._fsrc.ext_driver_src.expander_info = - cam_expander_info; - #endif - } - - if (machine_is_msm8960_liquid()) { - struct msm_camera_sensor_info *s_info; - s_info = &msm_camera_sensor_imx074_data; - s_info->sensor_platform_info->mount_angle = 180; - s_info = &msm_camera_sensor_ov2720_data; - s_info->sensor_platform_info->ext_power_ctrl = - msm_camera_8960_ext_power_ctrl; - } - - if (machine_is_msm8960_fluid()) { - msm_camera_sensor_imx091_data.sensor_platform_info-> - mount_angle = 270; - } - - platform_device_register(&msm_camera_server); - platform_device_register(&msm8960_device_csiphy0); - platform_device_register(&msm8960_device_csiphy1); - platform_device_register(&msm8960_device_csiphy2); - platform_device_register(&msm8960_device_csid0); - platform_device_register(&msm8960_device_csid1); - platform_device_register(&msm8960_device_csid2); - platform_device_register(&msm8960_device_ispif); - platform_device_register(&msm8960_device_vfe); - platform_device_register(&msm8960_device_vpe); -} - -#ifdef CONFIG_I2C -static struct i2c_board_info msm8960_camera_i2c_boardinfo[] = { - { - I2C_BOARD_INFO("imx074", 0x1A), - .platform_data = &msm_camera_sensor_imx074_data, - }, - { - I2C_BOARD_INFO("ov2720", 0x6C), - .platform_data = &msm_camera_sensor_ov2720_data, - }, - { - I2C_BOARD_INFO("imx135", 0x10), - .platform_data = &msm_camera_sensor_imx135_data, - }, - { - I2C_BOARD_INFO("mt9m114", 0x48), - .platform_data = &msm_camera_sensor_mt9m114_data, - }, - { - I2C_BOARD_INFO("s5k3l1yx", 0x20), - .platform_data = &msm_camera_sensor_s5k3l1yx_data, - }, - { - I2C_BOARD_INFO("imx091", 0x34), - .platform_data = &msm_camera_sensor_imx091_data, - }, -}; - -struct msm_camera_board_info msm8960_camera_board_info = { - .board_info = msm8960_camera_i2c_boardinfo, - .num_i2c_board_info = ARRAY_SIZE(msm8960_camera_i2c_boardinfo), -}; -#endif -#endif diff --git a/arch/arm/mach-msm/board-8960-display.c b/arch/arm/mach-msm/board-8960-display.c deleted file mode 100644 index c779ab69945a..000000000000 --- a/arch/arm/mach-msm/board-8960-display.c +++ /dev/null @@ -1,1101 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-8960.h" - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((roundup(1920, 32) * roundup(1200, 32) * 4), 4096) * 3) - /* 4 bpp x 3 pages */ -#else -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((roundup(1920, 32) * roundup(1200, 32) * 4), 4096) * 2) - /* 4 bpp x 2 pages */ -#endif - -/* Note: must be multiple of 4096 */ -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE, 4096) - -#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE \ - roundup((roundup(1920, 32) * roundup(1200, 32) * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY0_WRITEBACK */ - -#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE \ - roundup((roundup(1920, 32) * roundup(1080, 32) * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY1_WRITEBACK */ - -#define MDP_VSYNC_GPIO 0 - -#define MIPI_CMD_NOVATEK_QHD_PANEL_NAME "mipi_cmd_novatek_qhd" -#define MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME "mipi_video_novatek_qhd" -#define MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME "mipi_video_toshiba_wsvga" -#define MIPI_VIDEO_TOSHIBA_WUXGA_PANEL_NAME "mipi_video_toshiba_wuxga" -#define MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME "mipi_video_chimei_wxga" -#define MIPI_VIDEO_CHIMEI_WUXGA_PANEL_NAME "mipi_video_chimei_wuxga" -#define MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME "mipi_video_simulator_vga" -#define MIPI_CMD_RENESAS_FWVGA_PANEL_NAME "mipi_cmd_renesas_fwvga" -#define MIPI_VIDEO_ORISE_720P_PANEL_NAME "mipi_video_orise_720p" -#define MIPI_CMD_ORISE_720P_PANEL_NAME "mipi_cmd_orise_720p" -#define HDMI_PANEL_NAME "hdmi_msm" -#define TVOUT_PANEL_NAME "tvout_msm" - -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -static unsigned char hdmi_is_primary = 1; -#else -static unsigned char hdmi_is_primary; -#endif - -unsigned char msm8960_hdmi_as_primary_selected(void) -{ - return hdmi_is_primary; -} - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -static void set_mdp_clocks_for_wuxga(void); - -static int msm_fb_detect_panel(const char *name) -{ - if (machine_is_msm8960_liquid()) { - u32 ver = socinfo_get_platform_version(); - if (SOCINFO_VERSION_MAJOR(ver) == 3) { - if (!strncmp(name, MIPI_VIDEO_CHIMEI_WUXGA_PANEL_NAME, - strnlen(MIPI_VIDEO_CHIMEI_WUXGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - set_mdp_clocks_for_wuxga(); - return 0; - } - } else { - if (!strncmp(name, MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME, - strnlen(MIPI_VIDEO_CHIMEI_WXGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } - } else { - if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - -#if !defined(CONFIG_FB_MSM_LVDS_MIPI_PANEL_DETECT) && \ - !defined(CONFIG_FB_MSM_MIPI_PANEL_DETECT) - if (!strncmp(name, MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME, - strnlen(MIPI_VIDEO_SIMULATOR_VGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_CMD_RENESAS_FWVGA_PANEL_NAME, - strnlen(MIPI_CMD_RENESAS_FWVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WUXGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WUXGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - set_mdp_clocks_for_wuxga(); - return 0; - } - - if (!strncmp(name, MIPI_VIDEO_ORISE_720P_PANEL_NAME, - strnlen(MIPI_VIDEO_ORISE_720P_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_CMD_ORISE_720P_PANEL_NAME, - strnlen(MIPI_CMD_ORISE_720P_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - } - - if (!strncmp(name, HDMI_PANEL_NAME, - strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - if (hdmi_is_primary) - set_mdp_clocks_for_wuxga(); - return 0; - } - - if (!strncmp(name, TVOUT_PANEL_NAME, - strnlen(TVOUT_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - pr_warning("%s: not supported '%s'", __func__, name); - return -ENODEV; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev.platform_data = &msm_fb_pdata, -}; - -static void mipi_dsi_panel_pwm_cfg(void) -{ - int rc; - static int mipi_dsi_panel_gpio_configured; - static struct pm_gpio pwm_enable = { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 1, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM_GPIO_VIN_VPH, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .disable_pin = 0, - }; - static struct pm_gpio pwm_mode = { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM_GPIO_VIN_S4, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_2, - .inv_int_pol = 0, - .disable_pin = 0, - }; - - if (mipi_dsi_panel_gpio_configured == 0) { - /* pm8xxx: gpio-21, Backlight Enable */ - rc = pm8xxx_gpio_config(PM8921_GPIO_PM_TO_SYS(21), - &pwm_enable); - if (rc != 0) - pr_err("%s: pwm_enabled failed\n", __func__); - - /* pm8xxx: gpio-24, Bl: Off, PWM mode */ - rc = pm8xxx_gpio_config(PM8921_GPIO_PM_TO_SYS(24), - &pwm_mode); - if (rc != 0) - pr_err("%s: pwm_mode failed\n", __func__); - - mipi_dsi_panel_gpio_configured++; - } -} - -static bool dsi_power_on; - -/** - * LiQUID panel on/off - * - * @param on - * - * @return int - */ -static int mipi_dsi_liquid_panel_power(int on) -{ - static struct regulator *reg_l2, *reg_ext_3p3v; - static int gpio21, gpio24, gpio43; - int rc; - - mipi_dsi_panel_pwm_cfg(); - pr_debug("%s: on=%d\n", __func__, on); - - gpio21 = PM8921_GPIO_PM_TO_SYS(21); /* disp power enable_n */ - gpio43 = PM8921_GPIO_PM_TO_SYS(43); /* Displays Enable (rst_n)*/ - gpio24 = PM8921_GPIO_PM_TO_SYS(24); /* Backlight PWM */ - - if (!dsi_power_on) { - - reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vdda"); - if (IS_ERR(reg_l2)) { - pr_err("could not get 8921_l2, rc = %ld\n", - PTR_ERR(reg_l2)); - return -ENODEV; - } - - rc = regulator_set_voltage(reg_l2, 1200000, 1200000); - if (rc) { - pr_err("set_voltage l2 failed, rc=%d\n", rc); - return -EINVAL; - } - - reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev, - "vdd_lvds_3p3v"); - if (IS_ERR(reg_ext_3p3v)) { - pr_err("could not get reg_ext_3p3v, rc = %ld\n", - PTR_ERR(reg_ext_3p3v)); - return -ENODEV; - } - - rc = gpio_request(gpio21, "disp_pwr_en_n"); - if (rc) { - pr_err("request gpio 21 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = gpio_request(gpio43, "disp_rst_n"); - if (rc) { - pr_err("request gpio 43 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = gpio_request(gpio24, "disp_backlight_pwm"); - if (rc) { - pr_err("request gpio 24 failed, rc=%d\n", rc); - return -ENODEV; - } - - dsi_power_on = true; - } - - if (on) { - rc = regulator_set_optimum_mode(reg_l2, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l2); - if (rc) { - pr_err("enable l2 failed, rc=%d\n", rc); - return -ENODEV; - } - - rc = regulator_enable(reg_ext_3p3v); - if (rc) { - pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc); - return -ENODEV; - } - - /* set reset pin before power enable */ - gpio_set_value_cansleep(gpio43, 0); /* disp disable (resx=0) */ - - gpio_set_value_cansleep(gpio21, 0); /* disp power enable_n */ - msleep(20); - gpio_set_value_cansleep(gpio43, 1); /* disp enable */ - msleep(20); - gpio_set_value_cansleep(gpio43, 0); /* disp enable */ - msleep(20); - gpio_set_value_cansleep(gpio43, 1); /* disp enable */ - msleep(20); - } else { - gpio_set_value_cansleep(gpio43, 0); - gpio_set_value_cansleep(gpio21, 1); - - rc = regulator_disable(reg_l2); - if (rc) { - pr_err("disable reg_l2 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_ext_3p3v); - if (rc) { - pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_set_optimum_mode(reg_l2, 100); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - } - - return 0; -} - -static int mipi_dsi_cdp_panel_power(int on) -{ - static struct regulator *reg_l8, *reg_l23, *reg_l2; - static int gpio43; - int rc; - - pr_debug("%s: state : %d\n", __func__, on); - - if (!dsi_power_on) { - - reg_l8 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vdc"); - if (IS_ERR(reg_l8)) { - pr_err("could not get 8921_l8, rc = %ld\n", - PTR_ERR(reg_l8)); - return -ENODEV; - } - reg_l23 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vddio"); - if (IS_ERR(reg_l23)) { - pr_err("could not get 8921_l23, rc = %ld\n", - PTR_ERR(reg_l23)); - return -ENODEV; - } - reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev, - "dsi_vdda"); - if (IS_ERR(reg_l2)) { - pr_err("could not get 8921_l2, rc = %ld\n", - PTR_ERR(reg_l2)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_l8, 2800000, 3000000); - if (rc) { - pr_err("set_voltage l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_voltage(reg_l23, 1800000, 1800000); - if (rc) { - pr_err("set_voltage l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_voltage(reg_l2, 1200000, 1200000); - if (rc) { - pr_err("set_voltage l2 failed, rc=%d\n", rc); - return -EINVAL; - } - gpio43 = PM8921_GPIO_PM_TO_SYS(43); - rc = gpio_request(gpio43, "disp_rst_n"); - if (rc) { - pr_err("request gpio 43 failed, rc=%d\n", rc); - return -ENODEV; - } - dsi_power_on = true; - } - if (on) { - rc = regulator_set_optimum_mode(reg_l8, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l23, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l2, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_l8); - if (rc) { - pr_err("enable l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_enable(reg_l23); - if (rc) { - pr_err("enable l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_enable(reg_l2); - if (rc) { - pr_err("enable l2 failed, rc=%d\n", rc); - return -ENODEV; - } - gpio_set_value_cansleep(gpio43, 1); - } else { - rc = regulator_disable(reg_l2); - if (rc) { - pr_err("disable reg_l2 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_l8); - if (rc) { - pr_err("disable reg_l8 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_l23); - if (rc) { - pr_err("disable reg_l23 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_set_optimum_mode(reg_l8, 100); - if (rc < 0) { - pr_err("set_optimum_mode l8 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l23, 100); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_set_optimum_mode(reg_l2, 100); - if (rc < 0) { - pr_err("set_optimum_mode l2 failed, rc=%d\n", rc); - return -EINVAL; - } - gpio_set_value_cansleep(gpio43, 0); - } - return 0; -} - -static char mipi_dsi_splash_is_enabled(void); -static int mipi_dsi_panel_power(int on) -{ - int ret; - - pr_debug("%s: on=%d\n", __func__, on); - - if (machine_is_msm8960_liquid()) - ret = mipi_dsi_liquid_panel_power(on); - else - ret = mipi_dsi_cdp_panel_power(on); - - return ret; -} - -static struct mipi_dsi_platform_data mipi_dsi_pdata = { - .vsync_gpio = MDP_VSYNC_GPIO, - .dsi_power_save = mipi_dsi_panel_power, - .splash_is_enabled = mipi_dsi_splash_is_enabled, -}; - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors mdp_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors mdp_ui_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_vga_vectors[] = { - /* VGA and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000 * 2, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_720p_vectors[] = { - /* 720p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 230400000 * 2, - .ib = 288000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_1080p_vectors[] = { - /* 1080p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 334080000 * 2, - .ib = 417600000 * 2, - }, -}; - -static struct msm_bus_paths mdp_bus_scale_usecases[] = { - { - ARRAY_SIZE(mdp_init_vectors), - mdp_init_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_ui_vectors), - mdp_ui_vectors, - }, - { - ARRAY_SIZE(mdp_vga_vectors), - mdp_vga_vectors, - }, - { - ARRAY_SIZE(mdp_720p_vectors), - mdp_720p_vectors, - }, - { - ARRAY_SIZE(mdp_1080p_vectors), - mdp_1080p_vectors, - }, -}; - -static struct msm_bus_scale_pdata mdp_bus_scale_pdata = { - mdp_bus_scale_usecases, - ARRAY_SIZE(mdp_bus_scale_usecases), - .name = "mdp", -}; - -#endif - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = MDP_VSYNC_GPIO, - .mdp_max_clk = 200000000, -#ifdef CONFIG_MSM_BUS_SCALING - .mdp_bus_scale_table = &mdp_bus_scale_pdata, -#endif - .mdp_rev = MDP_REV_42, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .mem_hid = BIT(ION_CP_MM_HEAP_ID), -#else - .mem_hid = MEMTYPE_EBI1, -#endif - .cont_splash_enabled = 0x01, - .splash_screen_addr = 0x00, - .splash_screen_size = 0x00, - .mdp_iommu_split_domain = 0, -}; - -void __init msm8960_mdp_writeback(struct memtype_reserve* reserve_table) -{ - mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE; - mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE; -#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov0_wb_size; - reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov1_wb_size; -#endif -} - -static char mipi_dsi_splash_is_enabled(void) -{ - return mdp_pdata.cont_splash_enabled; -} - -#define LPM_CHANNEL0 0 -static int toshiba_gpio[] = {LPM_CHANNEL0}; - -static struct mipi_dsi_panel_platform_data toshiba_pdata = { - .gpio = toshiba_gpio, - .dsi_pwm_cfg = mipi_dsi_panel_pwm_cfg, -}; - -static struct platform_device mipi_dsi_toshiba_panel_device = { - .name = "mipi_toshiba", - .id = 0, - .dev = { - .platform_data = &toshiba_pdata, - } -}; - -#define FPGA_3D_GPIO_CONFIG_ADDR 0xB5 -static int dsi2lvds_gpio[4] = { - 0,/* Backlight PWM-ID=0 for PMIC-GPIO#24 */ - 0x1F08, /* DSI2LVDS Bridge GPIO Output, mask=0x1f, out=0x08 */ - GPIO_LIQUID_EXPANDER_BASE+6, /* TN Enable */ - GPIO_LIQUID_EXPANDER_BASE+7, /* TN Mode */ - }; - -static struct msm_panel_common_pdata mipi_dsi2lvds_pdata = { - .gpio_num = dsi2lvds_gpio, -}; - -static struct mipi_dsi_phy_ctrl dsi_novatek_cmd_mode_phy_db = { - -/* DSI_BIT_CLK at 500MHz, 2 lane, RGB888 */ - {0x0F, 0x0a, 0x04, 0x00, 0x20}, /* regulator */ - /* timing */ - {0xab, 0x8a, 0x18, 0x00, 0x92, 0x97, 0x1b, 0x8c, - 0x0c, 0x03, 0x04, 0xa0}, - {0x5f, 0x00, 0x00, 0x10}, /* phy ctrl */ - {0xff, 0x00, 0x06, 0x00}, /* strength */ - /* pll control */ - {0x40, 0xf9, 0x30, 0xda, 0x00, 0x40, 0x03, 0x62, - 0x40, 0x07, 0x03, - 0x00, 0x1a, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x01}, -}; - -static struct mipi_dsi_panel_platform_data novatek_pdata = { - .fpga_3d_config_addr = FPGA_3D_GPIO_CONFIG_ADDR, - .fpga_ctrl_mode = FPGA_SPI_INTF, - .phy_ctrl_settings = &dsi_novatek_cmd_mode_phy_db, -}; - -static struct platform_device mipi_dsi_novatek_panel_device = { - .name = "mipi_novatek", - .id = 0, - .dev = { - .platform_data = &novatek_pdata, - } -}; - -static struct platform_device mipi_dsi2lvds_bridge_device = { - .name = "mipi_tc358764", - .id = 0, - .dev.platform_data = &mipi_dsi2lvds_pdata, -}; - -static struct platform_device mipi_dsi_orise_panel_device = { - .name = "mipi_orise", - .id = 0, -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct resource hdmi_msm_resources[] = { - { - .name = "hdmi_msm_qfprom_addr", - .start = 0x00700000, - .end = 0x007060FF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_hdmi_addr", - .start = 0x04A00000, - .end = 0x04A00FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_irq", - .start = HDMI_IRQ, - .end = HDMI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static int hdmi_enable_5v(int on); -static int hdmi_core_power(int on, int show); -static int hdmi_cec_power(int on); -static int hdmi_gpio_config(int on); -static int hdmi_panel_power(int on); - -static struct msm_hdmi_platform_data hdmi_msm_data = { - .irq = HDMI_IRQ, - .enable_5v = hdmi_enable_5v, - .core_power = hdmi_core_power, - .cec_power = hdmi_cec_power, - .panel_power = hdmi_panel_power, - .gpio_config = hdmi_gpio_config, -}; - -static struct platform_device hdmi_msm_device = { - .name = "hdmi_msm", - .id = 0, - .num_resources = ARRAY_SIZE(hdmi_msm_resources), - .resource = hdmi_msm_resources, - .dev.platform_data = &hdmi_msm_data, -}; -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL -static struct platform_device wfd_panel_device = { - .name = "wfd_panel", - .id = 0, - .dev.platform_data = NULL, -}; - -static struct platform_device wfd_device = { - .name = "msm_wfd", - .id = -1, -}; -#endif - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors dtv_bus_init_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors dtv_bus_def_vectors[] = { - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 566092800 * 2, - .ib = 707616000 * 2, - }, -}; - -static struct msm_bus_paths dtv_bus_scale_usecases[] = { - { - ARRAY_SIZE(dtv_bus_init_vectors), - dtv_bus_init_vectors, - }, - { - ARRAY_SIZE(dtv_bus_def_vectors), - dtv_bus_def_vectors, - }, -}; -static struct msm_bus_scale_pdata dtv_bus_scale_pdata = { - dtv_bus_scale_usecases, - ARRAY_SIZE(dtv_bus_scale_usecases), - .name = "dtv", -}; - -static struct lcdc_platform_data dtv_pdata = { - .bus_scale_table = &dtv_bus_scale_pdata, - .lcdc_power_save = hdmi_panel_power, -}; - -static int hdmi_panel_power(int on) -{ - int rc; - - pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF")); - rc = hdmi_core_power(on, 1); - if (rc) - rc = hdmi_cec_power(on); - - pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF")); - return rc; -} -#endif - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static int hdmi_enable_5v(int on) -{ - /* TBD: PM8921 regulator instead of 8901 */ - static struct regulator *reg_8921_hdmi_mvs; /* HDMI_5V */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8921_hdmi_mvs) { - reg_8921_hdmi_mvs = regulator_get(&hdmi_msm_device.dev, - "hdmi_mvs"); - if (IS_ERR(reg_8921_hdmi_mvs)) { - pr_err("'%s' regulator not found, rc=%ld\n", - "hdmi_mvs", IS_ERR(reg_8921_hdmi_mvs)); - reg_8921_hdmi_mvs = NULL; - return -ENODEV; - } - } - - if (on) { - rc = regulator_enable(reg_8921_hdmi_mvs); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8921_hdmi_mvs", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8921_hdmi_mvs); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "8921_hdmi_mvs", rc); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_core_power(int on, int show) -{ - static struct regulator *reg_8921_l23, *reg_8921_s4; - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - /* TBD: PM8921 regulator instead of 8901 */ - if (!reg_8921_l23) { - reg_8921_l23 = regulator_get(&hdmi_msm_device.dev, "hdmi_avdd"); - if (IS_ERR(reg_8921_l23)) { - pr_err("could not get reg_8921_l23, rc = %ld\n", - PTR_ERR(reg_8921_l23)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_8921_l23, 1800000, 1800000); - if (rc) { - pr_err("set_voltage failed for 8921_l23, rc=%d\n", rc); - return -EINVAL; - } - } - if (!reg_8921_s4) { - reg_8921_s4 = regulator_get(&hdmi_msm_device.dev, "hdmi_vcc"); - if (IS_ERR(reg_8921_s4)) { - pr_err("could not get reg_8921_s4, rc = %ld\n", - PTR_ERR(reg_8921_s4)); - return -ENODEV; - } - rc = regulator_set_voltage(reg_8921_s4, 1800000, 1800000); - if (rc) { - pr_err("set_voltage failed for 8921_s4, rc=%d\n", rc); - return -EINVAL; - } - } - - if (on) { - rc = regulator_set_optimum_mode(reg_8921_l23, 100000); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - rc = regulator_enable(reg_8921_l23); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "hdmi_avdd", rc); - return rc; - } - rc = regulator_enable(reg_8921_s4); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "hdmi_vcc", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8921_l23); - if (rc) { - pr_err("disable reg_8921_l23 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_disable(reg_8921_s4); - if (rc) { - pr_err("disable reg_8921_s4 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = regulator_set_optimum_mode(reg_8921_l23, 100); - if (rc < 0) { - pr_err("set_optimum_mode l23 failed, rc=%d\n", rc); - return -EINVAL; - } - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_gpio_config(int on) -{ - int rc = 0; - static int prev_on; - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(100, "HDMI_DDC_CLK"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_CLK", 100, rc); - return rc; - } - rc = gpio_request(101, "HDMI_DDC_DATA"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_DATA", 101, rc); - goto error1; - } - rc = gpio_request(102, "HDMI_HPD"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_HPD", 102, rc); - goto error2; - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(100); - gpio_free(101); - gpio_free(102); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - return 0; - -error2: - gpio_free(101); -error1: - gpio_free(100); - return rc; -} - -static int hdmi_cec_power(int on) -{ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(99, "HDMI_CEC_VAR"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_CEC_VAR", 99, rc); - goto error; - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(99); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -error: - return rc; -} -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -void __init msm8960_init_fb(void) -{ - uint32_t soc_platform_version = socinfo_get_version(); - - - if (SOCINFO_VERSION_MAJOR(soc_platform_version) >= 3) - mdp_pdata.mdp_rev = MDP_REV_43; - - if (cpu_is_msm8960ab()) - mdp_pdata.mdp_rev = MDP_REV_44; - - platform_device_register(&msm_fb_device); - -#ifdef CONFIG_FB_MSM_WRITEBACK_MSM_PANEL - platform_device_register(&wfd_panel_device); - platform_device_register(&wfd_device); -#endif - - platform_device_register(&mipi_dsi_novatek_panel_device); - platform_device_register(&mipi_dsi_orise_panel_device); - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL - platform_device_register(&hdmi_msm_device); -#endif - - if (machine_is_msm8960_liquid()) - platform_device_register(&mipi_dsi2lvds_bridge_device); - else - platform_device_register(&mipi_dsi_toshiba_panel_device); - - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); -#ifdef CONFIG_MSM_BUS_SCALING - msm_fb_register_device("dtv", &dtv_pdata); -#endif -} - -void __init msm8960_allocate_fb_region(void) -{ - void *addr; - unsigned long size; - - size = MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); -} - -/** - * Set MDP clocks to high frequency to avoid DSI underflow - * when using high resolution 1200x1920 WUXGA panels - */ -static void set_mdp_clocks_for_wuxga(void) -{ - mdp_ui_vectors[0].ab = 2000000000; - mdp_ui_vectors[0].ib = 2000000000; - mdp_vga_vectors[0].ab = 2000000000; - mdp_vga_vectors[0].ib = 2000000000; - mdp_720p_vectors[0].ab = 2000000000; - mdp_720p_vectors[0].ib = 2000000000; - mdp_1080p_vectors[0].ab = 2000000000; - mdp_1080p_vectors[0].ib = 2000000000; - - if (hdmi_is_primary) { - dtv_bus_def_vectors[0].ab = 2000000000; - dtv_bus_def_vectors[0].ib = 2000000000; - } -} - -void __init msm8960_set_display_params(char *prim_panel, char *ext_panel) -{ - int disable_splash = 0; - if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.prim_panel_name, prim_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.prim_panel_name %s\n", - msm_fb_pdata.prim_panel_name); - - if (strncmp((char *)msm_fb_pdata.prim_panel_name, - MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WSVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - /* Disable splash for panels other than Toshiba WSVGA */ - disable_splash = 1; - } - - if (!strncmp((char *)msm_fb_pdata.prim_panel_name, - HDMI_PANEL_NAME, strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - pr_debug("HDMI is the primary display by" - " boot parameter\n"); - hdmi_is_primary = 1; - set_mdp_clocks_for_wuxga(); - } - if (!strncmp((char *)msm_fb_pdata.prim_panel_name, - MIPI_VIDEO_TOSHIBA_WUXGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WUXGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - set_mdp_clocks_for_wuxga(); - } - } - if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.ext_panel_name, ext_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.ext_panel_name %s\n", - msm_fb_pdata.ext_panel_name); - } - - if (disable_splash) - mdp_pdata.cont_splash_enabled = 0; -} diff --git a/arch/arm/mach-msm/board-8960-gpiomux.c b/arch/arm/mach-msm/board-8960-gpiomux.c deleted file mode 100644 index bf8f895c4df0..000000000000 --- a/arch/arm/mach-msm/board-8960-gpiomux.c +++ /dev/null @@ -1,1122 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include "devices.h" -#include "board-8960.h" - -/* The SPI configurations apply to GSBI 1*/ -static struct gpiomux_setting spi_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting spi_suspended_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting spi_active_config2 = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting spi_suspended_config2 = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting gsbi3_suspended_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting gsbi3_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi6_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi6_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - - -static struct gpiomux_setting external_vfr[] = { - /* Suspended state */ - { - .func = GPIOMUX_FUNC_3, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, - }, - /* Active state */ - { - .func = GPIOMUX_FUNC_3, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_KEEPER, - }, -}; - -static struct gpiomux_setting gsbi_uart = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi8_uartdm_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi8_uartdm_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi9_active_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi9_suspended_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi10 = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi12 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cdc_mclk = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting audio_auxpcm[] = { - /* Suspended state */ - { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - }, - /* Active state */ - { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - }, -}; - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static struct gpiomux_setting gpio_eth_config = { - .pull = GPIOMUX_PULL_NONE, - .drv = GPIOMUX_DRV_8MA, - .func = GPIOMUX_FUNC_GPIO, -}; -#endif - -static struct gpiomux_setting slimbus = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting wcnss_5wire_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting wcnss_5wire_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cyts_resout_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting cyts_resout_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting cyts_sleep_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cyts_sleep_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cyts_int_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting cyts_int_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -#ifdef CONFIG_USB_EHCI_MSM_HSIC -static struct gpiomux_setting hsic_act_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting hsic_sus_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting hsic_hub_act_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; -#endif - -static struct gpiomux_setting hap_lvl_shft_suspended_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hap_lvl_shft_active_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ap2mdm_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_status_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_errfatal_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ap2mdm_kpdpwr_n_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting usbsw_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdp_vsync_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdp_vsync_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct gpiomux_setting hdmi_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_active_1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting hdmi_active_2_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -#if defined(CONFIG_FB_MSM_HDMI_MHL_8334) || defined(CONFIG_FB_MSM_HDMI_MHL_9244) -static struct gpiomux_setting hdmi_active_3_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_IN, -}; - -static struct gpiomux_setting hdmi_active_4_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, - .dir = GPIOMUX_OUT_HIGH, -}; -#endif -#endif - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) -static struct msm_gpiomux_config msm8960_ethernet_configs[] = { - { - .gpio = 90, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_eth_config, - } - }, - { - .gpio = 89, - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_eth_config, - } - }, -}; -#endif -/* GSBI8 UART GPIOs for Atheros Bluetooth */ -static struct msm_gpiomux_config msm8960_gsbi8_uartdm_configs[] = { - { - .gpio = 34, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8_uartdm_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi8_uartdm_active_cfg, - } - }, - { - .gpio = 35, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8_uartdm_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi8_uartdm_active_cfg, - } - }, - { - .gpio = 36, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8_uartdm_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi8_uartdm_active_cfg, - } - }, - { - .gpio = 37, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8_uartdm_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi8_uartdm_active_cfg, - } - }, -}; - -static struct msm_gpiomux_config msm8960_fusion_gsbi_configs[] = { - { - .gpio = 93, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi9_active_cfg, - } - }, - { - .gpio = 94, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi9_active_cfg, - } - }, - { - .gpio = 95, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi9_active_cfg, - } - }, - { - .gpio = 96, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi9_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi9_active_cfg, - } - }, -}; - -static struct msm_gpiomux_config msm8960_gsbi_configs[] __initdata = { - { - .gpio = 6, /* GSBI1 QUP SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 7, /* GSBI1 QUP SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 8, /* GSBI1 QUP SPI_CS_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 9, /* GSBI1 QUP SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 14, /* GSBI1 SPI_CS_1 */ - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config2, - [GPIOMUX_ACTIVE] = &spi_active_config2, - }, - }, - { - .gpio = 16, /* GSBI3 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 17, /* GSBI3 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi3_active_cfg, - }, - }, - { - .gpio = 26, /* GSBI6 WLAN_PWD_L for AR6004 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi6_active_cfg, - }, - }, - { - .gpio = 27, /* GSBI6 BT_INT2AP_N for AR3002 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi6_active_cfg, - }, - }, - { - .gpio = 28, /* GSBI6 BT_EN for AR3002 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi6_active_cfg, - }, - }, - { - .gpio = 29, /* GSBI6 BT_WAKE for AR3002 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi6_suspended_cfg, - [GPIOMUX_ACTIVE] = &gsbi6_active_cfg, - }, - }, - { - .gpio = 44, /* GSBI12 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi12, - }, - }, - { - .gpio = 45, /* GSBI12 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi12, - }, - }, - { - .gpio = 73, /* GSBI10 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi10, - }, - }, - { - .gpio = 74, /* GSBI10 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi10, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_gsbi5_uart_configs[] __initdata = { - { - .gpio = 22, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 23, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 24, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 25, /* GSBI5 UART2 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_external_vfr_configs[] __initdata = { - { - .gpio = 23, /* EXTERNAL VFR */ - .settings = { - [GPIOMUX_SUSPENDED] = &external_vfr[0], - [GPIOMUX_ACTIVE] = &external_vfr[1], - }, - }, -}; - -static struct msm_gpiomux_config msm8960_gsbi8_uart_configs[] __initdata = { - { - .gpio = 34, /* GSBI8 UART3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 35, /* GSBI8 UART3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 36, /* GSBI8 UART3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, - { - .gpio = 37, /* GSBI8 UART3 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi_uart, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_slimbus_config[] __initdata = { - { - .gpio = 60, /* slimbus data */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, - { - .gpio = 61, /* slimbus clk */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_audio_codec_configs[] __initdata = { - { - .gpio = 59, - .settings = { - [GPIOMUX_SUSPENDED] = &cdc_mclk, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_audio_auxpcm_configs[] __initdata = { - { - .gpio = 63, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 64, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 65, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, - { - .gpio = 66, - .settings = { - [GPIOMUX_SUSPENDED] = &audio_auxpcm[0], - [GPIOMUX_ACTIVE] = &audio_auxpcm[1], - }, - }, -}; - -static struct msm_gpiomux_config wcnss_5wire_interface[] = { - { - .gpio = 84, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 85, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 86, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 87, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, - { - .gpio = 88, - .settings = { - [GPIOMUX_ACTIVE] = &wcnss_5wire_active_cfg, - [GPIOMUX_SUSPENDED] = &wcnss_5wire_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_cyts_configs[] __initdata = { - { /* TS INTERRUPT */ - .gpio = 11, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_int_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_int_sus_cfg, - }, - }, - { /* TS SLEEP */ - .gpio = 50, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_sleep_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_sleep_sus_cfg, - }, - }, - { /* TS RESOUT */ - .gpio = 52, - .settings = { - [GPIOMUX_ACTIVE] = &cyts_resout_act_cfg, - [GPIOMUX_SUSPENDED] = &cyts_resout_sus_cfg, - }, - }, -}; - -#ifdef CONFIG_USB_EHCI_MSM_HSIC -static struct msm_gpiomux_config msm8960_hsic_configs[] = { - { - .gpio = 150, /*HSIC_STROBE */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_sus_cfg, - }, - }, - { - .gpio = 151, /* HSIC_DATA */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_sus_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8960_hsic_hub_configs[] = { - { - .gpio = 91, /* HSIC_HUB_RESET */ - .settings = { - [GPIOMUX_ACTIVE] = &hsic_hub_act_cfg, - [GPIOMUX_SUSPENDED] = &hsic_sus_cfg, - }, - }, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct gpiomux_setting sdcc4_clk_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc4_cmd_data_0_3_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc4_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdcc4_data_1_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config msm8960_sdcc4_configs[] __initdata = { - { - /* SDC4_DATA_3 */ - .gpio = 83, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_suspend_cfg, - }, - }, - { - /* SDC4_DATA_2 */ - .gpio = 84, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_suspend_cfg, - }, - }, - { - /* SDC4_DATA_1 */ - .gpio = 85, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_data_1_suspend_cfg, - }, - }, - { - /* SDC4_DATA_0 */ - .gpio = 86, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_suspend_cfg, - }, - }, - { - /* SDC4_CMD */ - .gpio = 87, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_suspend_cfg, - }, - }, - { - /* SDC4_CLK */ - .gpio = 88, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc4_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc4_suspend_cfg, - }, - }, -}; -#endif - - -static struct msm_gpiomux_config hap_lvl_shft_config[] __initdata = { - { - .gpio = 47, - .settings = { - [GPIOMUX_SUSPENDED] = &hap_lvl_shft_suspended_config, - [GPIOMUX_ACTIVE] = &hap_lvl_shft_active_config, - }, - }, -}; - -static struct msm_gpiomux_config hap_lvl_shft_config_sglte[] __initdata = { - { - .gpio = 89, - .settings = { - [GPIOMUX_SUSPENDED] = &hap_lvl_shft_suspended_config, - [GPIOMUX_ACTIVE] = &hap_lvl_shft_active_config, - }, - }, -}; - -static struct msm_gpiomux_config sglte_configs[] __initdata = { - /* AP2MDM_STATUS */ - { - .gpio = 77, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_STATUS */ - { - .gpio = 24, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg, - } - }, - /* MDM2AP_ERRFATAL */ - { - .gpio = 40, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg, - } - }, - /* AP2MDM_ERRFATAL */ - { - .gpio = 80, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* AP2MDM_KPDPWR_N */ - { - .gpio = 79, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - }, - /* AP2MDM_PMIC_PWR_EN */ - { - .gpio = 22, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - }, - /* AP2MDM_SOFT_RESET */ - { - .gpio = 78, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* USB_SW */ - { - .gpio = 25, - .settings = { - [GPIOMUX_SUSPENDED] = &usbsw_cfg, - } - } -}; - -static struct msm_gpiomux_config msm8960_mdp_vsync_configs[] __initdata = { - { - .gpio = 0, - .settings = { - [GPIOMUX_ACTIVE] = &mdp_vsync_active_cfg, - [GPIOMUX_SUSPENDED] = &mdp_vsync_suspend_cfg, - }, - } -}; - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct msm_gpiomux_config msm8960_hdmi_configs[] __initdata = { - { - .gpio = 99, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 100, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 101, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 102, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_2_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -#ifdef CONFIG_FB_MSM_HDMI_MHL_9244 - { - .gpio = 15, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_3_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 66, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_4_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -#endif -#ifdef CONFIG_FB_MSM_HDMI_MHL_8334 - { - .gpio = 4, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_3_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 15, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_4_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -#endif /* CONFIG_FB_MSM_HDMI_MHL */ -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct gpiomux_setting sdcc2_clk_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc2_cmd_data_0_3_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdcc2_data_1_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config msm8960_sdcc2_configs[] __initdata = { - { - /* DATA_3 */ - .gpio = 92, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* DATA_2 */ - .gpio = 91, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* DATA_1 */ - .gpio = 90, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_data_1_suspend_cfg, - }, - }, - { - /* DATA_0 */ - .gpio = 89, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* CMD */ - .gpio = 97, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* CLK */ - .gpio = 98, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, -}; -#endif - -int __init msm8960_init_gpiomux(void) -{ - int rc = msm_gpiomux_init(NR_GPIO_IRQS); - if (rc) { - pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc); - return rc; - } - -#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) - if (socinfo_get_platform_subtype() != PLATFORM_SUBTYPE_SGLTE) - msm_gpiomux_install(msm8960_ethernet_configs, - ARRAY_SIZE(msm8960_ethernet_configs)); -#endif - - msm_gpiomux_install(msm8960_gsbi_configs, - ARRAY_SIZE(msm8960_gsbi_configs)); - - msm_gpiomux_install(msm8960_cyts_configs, - ARRAY_SIZE(msm8960_cyts_configs)); - - msm_gpiomux_install(msm8960_slimbus_config, - ARRAY_SIZE(msm8960_slimbus_config)); - - msm_gpiomux_install(msm8960_audio_codec_configs, - ARRAY_SIZE(msm8960_audio_codec_configs)); - - msm_gpiomux_install(msm8960_audio_auxpcm_configs, - ARRAY_SIZE(msm8960_audio_auxpcm_configs)); - - msm_gpiomux_install(wcnss_5wire_interface, - ARRAY_SIZE(wcnss_5wire_interface)); - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - msm_gpiomux_install(msm8960_sdcc4_configs, - ARRAY_SIZE(msm8960_sdcc4_configs)); -#endif - - if (machine_is_msm8960_mtp() || machine_is_msm8960_fluid() || - machine_is_msm8960_liquid() || machine_is_msm8960_cdp()) { - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - msm_gpiomux_install(hap_lvl_shft_config_sglte, - ARRAY_SIZE(hap_lvl_shft_config_sglte)); - - else - msm_gpiomux_install(hap_lvl_shft_config, - ARRAY_SIZE(hap_lvl_shft_config)); - } - -#ifdef CONFIG_USB_EHCI_MSM_HSIC - if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) != 1) && - machine_is_msm8960_liquid()) - msm_gpiomux_install(msm8960_hsic_configs, - ARRAY_SIZE(msm8960_hsic_configs)); - - if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) != 1) && - machine_is_msm8960_liquid()) - msm_gpiomux_install(msm8960_hsic_hub_configs, - ARRAY_SIZE(msm8960_hsic_hub_configs)); -#endif - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL - msm_gpiomux_install(msm8960_hdmi_configs, - ARRAY_SIZE(msm8960_hdmi_configs)); -#endif - - msm_gpiomux_install(msm8960_mdp_vsync_configs, - ARRAY_SIZE(msm8960_mdp_vsync_configs)); - - if (socinfo_get_platform_subtype() != PLATFORM_SUBTYPE_SGLTE) - msm_gpiomux_install(msm8960_gsbi8_uartdm_configs, - ARRAY_SIZE(msm8960_gsbi8_uartdm_configs)); - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - msm_gpiomux_install(msm8960_gsbi8_uart_configs, - ARRAY_SIZE(msm8960_gsbi8_uart_configs)); - else - msm_gpiomux_install(msm8960_gsbi5_uart_configs, - ARRAY_SIZE(msm8960_gsbi5_uart_configs)); - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) { - /* For 8960 Fusion 2.2 Primary IPC */ - msm_gpiomux_install(msm8960_fusion_gsbi_configs, - ARRAY_SIZE(msm8960_fusion_gsbi_configs)); - /* For SGLTE 8960 Fusion External VFR */ - msm_gpiomux_install(msm8960_external_vfr_configs, - ARRAY_SIZE(msm8960_external_vfr_configs)); - } - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - msm_gpiomux_install(msm8960_sdcc2_configs, - ARRAY_SIZE(msm8960_sdcc2_configs)); -#endif - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - msm_gpiomux_install(sglte_configs, - ARRAY_SIZE(sglte_configs)); - - return 0; -} diff --git a/arch/arm/mach-msm/board-8960-pmic.c b/arch/arm/mach-msm/board-8960-pmic.c deleted file mode 100644 index ecd7a08f0dbe..000000000000 --- a/arch/arm/mach-msm/board-8960-pmic.c +++ /dev/null @@ -1,629 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8960.h" - -struct pm8xxx_gpio_init { - unsigned gpio; - struct pm_gpio config; -}; - -struct pm8xxx_mpp_init { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8XXX_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \ - _func, _inv, _disable) \ -{ \ - .gpio = PM8921_GPIO_PM_TO_SYS(_gpio), \ - .config = { \ - .direction = _dir, \ - .output_buffer = _buf, \ - .output_value = _val, \ - .pull = _pull, \ - .vin_sel = _vin, \ - .out_strength = _out_strength, \ - .function = _func, \ - .inv_int_pol = _inv, \ - .disable_pin = _disable, \ - } \ -} - -#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8921_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8XXX_GPIO_DISABLE(_gpio) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \ - 0, 0, 0, 1) - -#define PM8XXX_GPIO_OUTPUT(_gpio, _val) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8XXX_GPIO_INPUT(_gpio, _pull) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \ - _pull, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_NO, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8XXX_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - PM_GPIO_STRENGTH_HIGH, \ - _func, 0, 0) - -#define PM8XXX_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, _vin, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8XXX_GPIO_OUTPUT_STRENGTH(_gpio, _val, _out_strength) \ - PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \ - _out_strength, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -/* Initial PM8921 GPIO configurations */ -static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = { - PM8XXX_GPIO_OUTPUT_VIN(6, 1, PM_GPIO_VIN_VPH), /* MHL power EN_N */ - PM8XXX_GPIO_DISABLE(7), /* Disable NFC */ - PM8XXX_GPIO_INPUT(16, PM_GPIO_PULL_UP_30), /* SD_CARD_WP */ - /* External regulator shared by display and touchscreen on LiQUID */ - PM8XXX_GPIO_OUTPUT(17, 0), /* DISP 3.3 V Boost */ - PM8XXX_GPIO_OUTPUT(18, 0), /* TABLA SPKR_LEFT_EN=off */ - PM8XXX_GPIO_OUTPUT(19, 0), /* TABLA SPKR_RIGHT_EN=off */ - PM8XXX_GPIO_DISABLE(22), /* Disable NFC */ - PM8XXX_GPIO_OUTPUT_FUNC(25, 0, PM_GPIO_FUNC_2), /* TN_CLK */ - PM8XXX_GPIO_INPUT(26, PM_GPIO_PULL_UP_30), /* SD_CARD_DET_N */ - PM8XXX_GPIO_OUTPUT(43, 1), /* DISP_RESET_N */ - PM8XXX_GPIO_OUTPUT(42, 0), /* USB 5V reg enable */ - /* TABLA CODEC RESET */ - PM8XXX_GPIO_OUTPUT_STRENGTH(34, 0, PM_GPIO_STRENGTH_MED) -}; - -/* Initial PM8921 MPP configurations */ -static struct pm8xxx_mpp_init pm8921_mpps[] __initdata = { - /* External 5V regulator enable; shared by HDMI and USB_OTG switches. */ - PM8XXX_MPP_INIT(7, D_INPUT, PM8921_MPP_DIG_LEVEL_VPH, DIN_TO_INT), - PM8XXX_MPP_INIT(PM8XXX_AMUX_MPP_8, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH8, - DOUT_CTRL_LOW), -}; - -void __init msm8960_pm8921_gpio_mpp_init(void) -{ - int i, rc; - - for (i = 0; i < ARRAY_SIZE(pm8921_gpios); i++) { - rc = pm8xxx_gpio_config(pm8921_gpios[i].gpio, - &pm8921_gpios[i].config); - if (rc) { - pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc); - break; - } - } - - for (i = 0; i < ARRAY_SIZE(pm8921_mpps); i++) { - rc = pm8xxx_mpp_config(pm8921_mpps[i].mpp, - &pm8921_mpps[i].config); - if (rc) { - pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc); - break; - } - } -} - -static struct pm8xxx_adc_amux pm8xxx_adc_channels_data[] = { - {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2, - ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM}, - {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM}, - {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pa_therm1", ADC_MPP_1_AMUX8, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, - {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0, - ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM}, - {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, -}; - -static struct pm8xxx_adc_properties pm8xxx_adc_data = { - .adc_vdd_reference = 1800, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, -}; - -static struct pm8xxx_adc_platform_data pm8xxx_adc_pdata = { - .adc_channel = pm8xxx_adc_channels_data, - .adc_num_board_channel = ARRAY_SIZE(pm8xxx_adc_channels_data), - .adc_prop = &pm8xxx_adc_data, - .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = { - .irq_base = PM8921_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(104), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = { - .gpio_base = PM8921_GPIO_PM_TO_SYS(1), -}; - -static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = { - .mpp_base = PM8921_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata = { - .rtc_write_enable = false, - .rtc_alarm_powerup = false, -}; - -static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = { - .pull_up = 1, - .kpd_trigger_delay_us = 15625, - .wakeup = 1, -}; - -/* Rotate lock key is not available so use F1 */ -#define KEY_ROTATE_LOCK KEY_F1 - -static const unsigned int keymap_liquid[] = { - KEY(0, 0, KEY_VOLUMEUP), - KEY(0, 1, KEY_VOLUMEDOWN), - KEY(1, 3, KEY_ROTATE_LOCK), - KEY(1, 4, KEY_HOME), -}; - -static struct matrix_keymap_data keymap_data_liquid = { - .keymap_size = ARRAY_SIZE(keymap_liquid), - .keymap = keymap_liquid, -}; - -static struct pm8xxx_keypad_platform_data keypad_data_liquid = { - .input_name = "keypad_8960_liquid", - .input_phys_device = "keypad_8960/input0", - .num_rows = 2, - .num_cols = 5, - .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9), - .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &keymap_data_liquid, -}; - - -static const unsigned int keymap[] = { - KEY(0, 0, KEY_VOLUMEUP), - KEY(0, 1, KEY_VOLUMEDOWN), - KEY(0, 2, KEY_CAMERA_FOCUS), - KEY(0, 3, KEY_CAMERA_SNAPSHOT), -}; - -static struct matrix_keymap_data keymap_data = { - .keymap_size = ARRAY_SIZE(keymap), - .keymap = keymap, -}; - -static struct pm8xxx_keypad_platform_data keypad_data = { - .input_name = "keypad_8960", - .input_phys_device = "keypad_8960/input0", - .num_rows = 1, - .num_cols = 5, - .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9), - .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &keymap_data, -}; - -static const unsigned int keymap_sim[] = { - KEY(0, 0, KEY_7), - KEY(0, 1, KEY_DOWN), - KEY(0, 2, KEY_UP), - KEY(0, 3, KEY_RIGHT), - KEY(0, 4, KEY_ENTER), - KEY(0, 5, KEY_L), - KEY(0, 6, KEY_BACK), - KEY(0, 7, KEY_M), - - KEY(1, 0, KEY_LEFT), - KEY(1, 1, KEY_SEND), - KEY(1, 2, KEY_1), - KEY(1, 3, KEY_4), - KEY(1, 4, KEY_CLEAR), - KEY(1, 5, KEY_MSDOS), - KEY(1, 6, KEY_SPACE), - KEY(1, 7, KEY_COMMA), - - KEY(2, 0, KEY_6), - KEY(2, 1, KEY_5), - KEY(2, 2, KEY_8), - KEY(2, 3, KEY_3), - KEY(2, 4, KEY_NUMERIC_STAR), - KEY(2, 5, KEY_UP), - KEY(2, 6, KEY_DOWN), - KEY(2, 7, KEY_LEFTSHIFT), - - KEY(3, 0, KEY_9), - KEY(3, 1, KEY_NUMERIC_POUND), - KEY(3, 2, KEY_0), - KEY(3, 3, KEY_2), - KEY(3, 4, KEY_SLEEP), - KEY(3, 5, KEY_F1), - KEY(3, 6, KEY_F2), - KEY(3, 7, KEY_F3), - - KEY(4, 0, KEY_BACK), - KEY(4, 1, KEY_HOME), - KEY(4, 2, KEY_MENU), - KEY(4, 3, KEY_VOLUMEUP), - KEY(4, 4, KEY_VOLUMEDOWN), - KEY(4, 5, KEY_F4), - KEY(4, 6, KEY_F5), - KEY(4, 7, KEY_F6), - - KEY(5, 0, KEY_R), - KEY(5, 1, KEY_T), - KEY(5, 2, KEY_Y), - KEY(5, 3, KEY_LEFTALT), - KEY(5, 4, KEY_KPENTER), - KEY(5, 5, KEY_Q), - KEY(5, 6, KEY_W), - KEY(5, 7, KEY_E), - - KEY(6, 0, KEY_F), - KEY(6, 1, KEY_G), - KEY(6, 2, KEY_H), - KEY(6, 3, KEY_CAPSLOCK), - KEY(6, 4, KEY_PAGEUP), - KEY(6, 5, KEY_A), - KEY(6, 6, KEY_S), - KEY(6, 7, KEY_D), - - KEY(7, 0, KEY_V), - KEY(7, 1, KEY_B), - KEY(7, 2, KEY_N), - KEY(7, 3, KEY_MENU), - KEY(7, 4, KEY_PAGEDOWN), - KEY(7, 5, KEY_Z), - KEY(7, 6, KEY_X), - KEY(7, 7, KEY_C), - - KEY(8, 0, KEY_P), - KEY(8, 1, KEY_J), - KEY(8, 2, KEY_K), - KEY(8, 3, KEY_INSERT), - KEY(8, 4, KEY_LINEFEED), - KEY(8, 5, KEY_U), - KEY(8, 6, KEY_I), - KEY(8, 7, KEY_O), - - KEY(9, 0, KEY_4), - KEY(9, 1, KEY_5), - KEY(9, 2, KEY_6), - KEY(9, 3, KEY_7), - KEY(9, 4, KEY_8), - KEY(9, 5, KEY_1), - KEY(9, 6, KEY_2), - KEY(9, 7, KEY_3), - - KEY(10, 0, KEY_F7), - KEY(10, 1, KEY_F8), - KEY(10, 2, KEY_F9), - KEY(10, 3, KEY_F10), - KEY(10, 4, KEY_FN), - KEY(10, 5, KEY_9), - KEY(10, 6, KEY_0), - KEY(10, 7, KEY_DOT), - - KEY(11, 0, KEY_LEFTCTRL), - KEY(11, 1, KEY_F11), - KEY(11, 2, KEY_ENTER), - KEY(11, 3, KEY_SEARCH), - KEY(11, 4, KEY_DELETE), - KEY(11, 5, KEY_RIGHT), - KEY(11, 6, KEY_LEFT), - KEY(11, 7, KEY_RIGHTSHIFT), - KEY(0, 0, KEY_VOLUMEUP), - KEY(0, 1, KEY_VOLUMEDOWN), - KEY(0, 2, KEY_CAMERA_SNAPSHOT), - KEY(0, 3, KEY_CAMERA_FOCUS), -}; - -static int pm8921_therm_mitigation[] = { - 1100, - 700, - 600, - 325, -}; - -#define MAX_VOLTAGE_MV 4200 -#define CHG_TERM_MA 100 -static struct pm8921_charger_platform_data pm8921_chg_pdata = { - .update_time = 60000, - .max_voltage = MAX_VOLTAGE_MV, - .min_voltage = 3200, - .uvd_thresh_voltage = 4050, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .resume_voltage_delta = 60, - .resume_charge_percent = 99, - .term_current = CHG_TERM_MA, - .cool_temp = 10, - .warm_temp = 45, - .temp_check_period = 1, - .max_bat_chg_current = 1100, - .cool_bat_chg_current = 350, - .warm_bat_chg_current = 350, - .cool_bat_voltage = 4100, - .warm_bat_voltage = 4100, - .thermal_mitigation = pm8921_therm_mitigation, - .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation), - .rconn_mohm = 18, -}; - -static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = { - .priority = 0, -}; - -static struct pm8921_bms_platform_data pm8921_bms_pdata = { - .battery_type = BATT_UNKNOWN, - .r_sense_uohm = 10000, - .v_cutoff = 3400, - .max_voltage_uv = MAX_VOLTAGE_MV * 1000, - .rconn_mohm = 18, - .shutdown_soc_valid_limit = 20, - .adjust_soc_low_threshold = 25, - .chg_term_ua = CHG_TERM_MA * 1000, - .normal_voltage_calc_ms = 20000, - .low_voltage_calc_ms = 1000, - .alarm_low_mv = 3400, - .alarm_high_mv = 4000, - .high_ocv_correction_limit_uv = 50, - .low_ocv_correction_limit_uv = 100, - .hold_soc_est = 3, - .enable_fcc_learning = 1, - .min_fcc_learning_soc = 20, - .min_fcc_ocv_pc = 30, - .min_fcc_learning_samples = 5, -}; - -#define PM8921_LC_LED_MAX_CURRENT 4 /* I = 4mA */ -#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */ -#define PM8XXX_LED_PWM_PERIOD 1000 -#define PM8XXX_LED_PWM_DUTY_MS 20 -/** - * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be - * driven using PWM feature. - */ -#define PM8XXX_PWM_CHANNEL_NONE -1 - -static struct led_info pm8921_led_info_liquid[] = { - { - .name = "led:red", - .flags = PM8XXX_ID_LED_0, - .default_trigger = "battery-charging", - }, - { - .name = "led:green", - .flags = PM8XXX_ID_LED_0, - .default_trigger = "battery-full", - }, - { - .name = "led:blue", - .flags = PM8XXX_ID_LED_2, - .default_trigger = "notification", - }, -}; - -static struct pm8xxx_led_config pm8921_led_configs_liquid[] = { - [0] = { - .id = PM8XXX_ID_LED_0, - .mode = PM8XXX_LED_MODE_MANUAL, - .max_current = PM8921_LC_LED_MAX_CURRENT, - }, - [1] = { - .id = PM8XXX_ID_LED_1, - .mode = PM8XXX_LED_MODE_MANUAL, - .max_current = PM8921_LC_LED_LOW_CURRENT, - }, - [2] = { - .id = PM8XXX_ID_LED_2, - .mode = PM8XXX_LED_MODE_MANUAL, - .max_current = PM8921_LC_LED_MAX_CURRENT, - }, -}; - -static struct led_platform_data pm8xxx_leds_core_liquid = { - .num_leds = ARRAY_SIZE(pm8921_led_info_liquid), - .leds = pm8921_led_info_liquid, -}; - -static struct pm8xxx_led_platform_data pm8xxx_leds_pdata_liquid = { - .led_core = &pm8xxx_leds_core_liquid, - .configs = pm8921_led_configs_liquid, - .num_configs = ARRAY_SIZE(pm8921_led_configs_liquid), -}; - -static struct led_info pm8921_led_info[] = { - [0] = { - .name = "led:battery_charging", - .default_trigger = "battery-charging", - }, - [1] = { - .name = "led:battery_full", - .default_trigger = "battery-full", - }, -}; - -static struct led_platform_data pm8921_led_core_pdata = { - .num_leds = ARRAY_SIZE(pm8921_led_info), - .leds = pm8921_led_info, -}; - -static int pm8921_led0_pwm_duty_pcts[56] = { - 1, 4, 8, 12, 16, 20, 24, 28, 32, 36, - 40, 44, 46, 52, 56, 60, 64, 68, 72, 76, - 80, 84, 88, 92, 96, 100, 100, 100, 98, 95, - 92, 88, 84, 82, 78, 74, 70, 66, 62, 58, - 58, 54, 50, 48, 42, 38, 34, 30, 26, 22, - 14, 10, 6, 4, 1 -}; - -/* - * Note: There is a bug in LPG module that results in incorrect - * behavior of pattern when LUT index 0 is used. So effectively - * there are 63 usable LUT entries. - */ -static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = { - .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts, - .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts), - .duty_ms = PM8XXX_LED_PWM_DUTY_MS, - .start_idx = 1, -}; - -static struct pm8xxx_led_config pm8921_led_configs[] = { - [0] = { - .id = PM8XXX_ID_LED_0, - .mode = PM8XXX_LED_MODE_PWM2, - .max_current = PM8921_LC_LED_MAX_CURRENT, - .pwm_channel = 5, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles, - }, - [1] = { - .id = PM8XXX_ID_LED_1, - .mode = PM8XXX_LED_MODE_PWM1, - .max_current = PM8921_LC_LED_MAX_CURRENT, - .pwm_channel = 4, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD, - }, -}; - -static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = { - .led_core = &pm8921_led_core_pdata, - .configs = pm8921_led_configs, - .num_configs = ARRAY_SIZE(pm8921_led_configs), -}; - -static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = { - .r_sense_uohm = 10000, - .calib_delay_ms = 600000, -}; - -/** - * PM8XXX_PWM_DTEST_CHANNEL_NONE shall be used when no LPG - * channel should be in DTEST mode. - */ - -#define PM8XXX_PWM_DTEST_CHANNEL_NONE (-1) - -static struct pm8xxx_pwm_platform_data pm8xxx_pwm_pdata = { - .dtest_channel = PM8XXX_PWM_DTEST_CHANNEL_NONE, -}; - -static struct pm8921_platform_data pm8921_platform_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .rtc_pdata = &pm8xxx_rtc_pdata, - .pwrkey_pdata = &pm8xxx_pwrkey_pdata, - .keypad_pdata = &keypad_data, - .misc_pdata = &pm8xxx_misc_pdata, - .regulator_pdatas = msm_pm8921_regulator_pdata, - .charger_pdata = &pm8921_chg_pdata, - .bms_pdata = &pm8921_bms_pdata, - .adc_pdata = &pm8xxx_adc_pdata, - .leds_pdata = &pm8xxx_leds_pdata, - .ccadc_pdata = &pm8xxx_ccadc_pdata, - .pwm_pdata = &pm8xxx_pwm_pdata, -}; - -static struct msm_ssbi_platform_data msm8960_ssbi_pm8921_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8921-core", - .platform_data = &pm8921_platform_data, - }, -}; - -void __init msm8960_init_pmic(void) -{ - pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ; - msm8960_device_ssbi_pmic.dev.platform_data = - &msm8960_ssbi_pm8921_pdata; - pm8921_platform_data.num_regulators = msm_pm8921_regulator_pdata_len; - - if (machine_is_msm8960_liquid()) { - pm8921_platform_data.keypad_pdata = &keypad_data_liquid; - pm8921_platform_data.leds_pdata = &pm8xxx_leds_pdata_liquid; - pm8921_platform_data.bms_pdata->battery_type = BATT_DESAY; - } else if (machine_is_msm8960_mtp()) { - pm8921_platform_data.bms_pdata->battery_type = BATT_PALLADIUM; - } else if (machine_is_msm8960_cdp()) { - pm8921_chg_pdata.has_dc_supply = true; - } - - if (machine_is_msm8960_fluid()) - pm8921_bms_pdata.rconn_mohm = 20; - - if (!machine_is_msm8960_fluid() && !machine_is_msm8960_liquid() - && !machine_is_msm8960_mtp()) - pm8921_chg_pdata.battery_less_hardware = 1; -} diff --git a/arch/arm/mach-msm/board-8960-regulator.c b/arch/arm/mach-msm/board-8960-regulator.c deleted file mode 100644 index 94508dfb2fb8..000000000000 --- a/arch/arm/mach-msm/board-8960-regulator.c +++ /dev/null @@ -1,656 +0,0 @@ -/* - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - -#include "board-8960.h" - -#define VREG_CONSUMERS(_id) \ - static struct regulator_consumer_supply vreg_consumers_##_id[] - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -VREG_CONSUMERS(L1) = { - REGULATOR_SUPPLY("8921_l1", NULL), -}; -VREG_CONSUMERS(L2) = { - REGULATOR_SUPPLY("8921_l2", NULL), - REGULATOR_SUPPLY("dsi_vdda", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vdda", "mdp.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.0"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.1"), - REGULATOR_SUPPLY("mipi_csi_vdd", "msm_csid.2"), -}; -VREG_CONSUMERS(L3) = { - REGULATOR_SUPPLY("8921_l3", NULL), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"), -}; -VREG_CONSUMERS(L4) = { - REGULATOR_SUPPLY("8921_l4", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"), - REGULATOR_SUPPLY("iris_vddxo", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L5) = { - REGULATOR_SUPPLY("8921_l5", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.1"), -}; -VREG_CONSUMERS(L6) = { - REGULATOR_SUPPLY("8921_l6", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L7) = { - REGULATOR_SUPPLY("8921_l7", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.3"), -}; -VREG_CONSUMERS(L8) = { - REGULATOR_SUPPLY("8921_l8", NULL), - REGULATOR_SUPPLY("dsi_vdc", "mipi_dsi.1"), -}; -VREG_CONSUMERS(L9) = { - REGULATOR_SUPPLY("8921_l9", NULL), - REGULATOR_SUPPLY("vdd", "3-0024"), - REGULATOR_SUPPLY("vdd_ana", "3-004a"), -}; -VREG_CONSUMERS(L10) = { - REGULATOR_SUPPLY("8921_l10", NULL), - REGULATOR_SUPPLY("iris_vddpa", "wcnss_wlan.0"), - -}; -VREG_CONSUMERS(L11) = { - REGULATOR_SUPPLY("8921_l11", NULL), - REGULATOR_SUPPLY("cam_vana", "4-001a"), - REGULATOR_SUPPLY("cam_vana", "4-006c"), - REGULATOR_SUPPLY("cam_vana", "4-0048"), - REGULATOR_SUPPLY("cam_vana", "4-0020"), - REGULATOR_SUPPLY("cam_vana", "4-0034"), - REGULATOR_SUPPLY("cam_vana", "4-0010"), -}; -VREG_CONSUMERS(L12) = { - REGULATOR_SUPPLY("8921_l12", NULL), - REGULATOR_SUPPLY("cam_vdig", "4-001a"), - REGULATOR_SUPPLY("cam_vdig", "4-006c"), - REGULATOR_SUPPLY("cam_vdig", "4-0048"), - REGULATOR_SUPPLY("cam_vdig", "4-0020"), - REGULATOR_SUPPLY("cam_vdig", "4-0034"), - REGULATOR_SUPPLY("cam_vdig", "4-0010"), -}; -VREG_CONSUMERS(L14) = { - REGULATOR_SUPPLY("8921_l14", NULL), - REGULATOR_SUPPLY("pa_therm", "pm8xxx-adc"), - REGULATOR_SUPPLY("vreg_xoadc", "pm8921-charger"), -}; -VREG_CONSUMERS(L15) = { - REGULATOR_SUPPLY("8921_l15", NULL), -}; -VREG_CONSUMERS(L16) = { - REGULATOR_SUPPLY("8921_l16", NULL), - REGULATOR_SUPPLY("cam_vaf", "4-001a"), - REGULATOR_SUPPLY("cam_vaf", "4-006c"), - REGULATOR_SUPPLY("cam_vaf", "4-0048"), - REGULATOR_SUPPLY("cam_vaf", "4-0020"), - REGULATOR_SUPPLY("cam_vaf", "4-0034"), - REGULATOR_SUPPLY("cam_vaf", "4-0010"), -}; -VREG_CONSUMERS(L17) = { - REGULATOR_SUPPLY("8921_l17", NULL), -}; -VREG_CONSUMERS(L18) = { - REGULATOR_SUPPLY("8921_l18", NULL), -}; -VREG_CONSUMERS(L21) = { - REGULATOR_SUPPLY("8921_l21", NULL), -}; -VREG_CONSUMERS(L22) = { - REGULATOR_SUPPLY("8921_l22", NULL), -}; -VREG_CONSUMERS(L23) = { - REGULATOR_SUPPLY("8921_l23", NULL), - REGULATOR_SUPPLY("dsi_vddio", "mipi_dsi.1"), - REGULATOR_SUPPLY("dsi_pll_vddio", "mdp.0"), - REGULATOR_SUPPLY("hdmi_avdd", "hdmi_msm.0"), - REGULATOR_SUPPLY("pll_vdd", "pil_riva"), - REGULATOR_SUPPLY("pll_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L24) = { - REGULATOR_SUPPLY("8921_l24", NULL), - REGULATOR_SUPPLY("riva_vddmx", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(L25) = { - REGULATOR_SUPPLY("8921_l25", NULL), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla2x-slim"), -}; -VREG_CONSUMERS(L26) = { - REGULATOR_SUPPLY("8921_l26", NULL), - REGULATOR_SUPPLY("core_vdd", "pil-q6v4-lpass"), -}; -VREG_CONSUMERS(L27) = { - REGULATOR_SUPPLY("8921_l27", NULL), - REGULATOR_SUPPLY("sw_core_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L28) = { - REGULATOR_SUPPLY("8921_l28", NULL), - REGULATOR_SUPPLY("fw_core_vdd", "pil-q6v4-modem"), -}; -VREG_CONSUMERS(L29) = { - REGULATOR_SUPPLY("8921_l29", NULL), -}; -VREG_CONSUMERS(S1) = { - REGULATOR_SUPPLY("8921_s1", NULL), -}; -VREG_CONSUMERS(S2) = { - REGULATOR_SUPPLY("8921_s2", NULL), - REGULATOR_SUPPLY("iris_vddrfa", "wcnss_wlan.0"), - -}; -VREG_CONSUMERS(S3) = { - REGULATOR_SUPPLY("8921_s3", NULL), - REGULATOR_SUPPLY("HSUSB_VDDCX", "msm_otg"), - REGULATOR_SUPPLY("riva_vddcx", "wcnss_wlan.0"), - REGULATOR_SUPPLY("HSIC_VDDCX", "msm_hsic_host"), -}; -VREG_CONSUMERS(S4) = { - REGULATOR_SUPPLY("8921_s4", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.1"), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.2"), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.4"), - REGULATOR_SUPPLY("riva_vddpx", "wcnss_wlan.0"), - REGULATOR_SUPPLY("hdmi_vcc", "hdmi_msm.0"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla2x-slim"), - REGULATOR_SUPPLY("vcc_i2c", "3-005b"), - REGULATOR_SUPPLY("EXT_HUB_VDDIO", "msm_smsc_hub"), - REGULATOR_SUPPLY("vcc_i2c", "10-0048"), -}; -VREG_CONSUMERS(S5) = { - REGULATOR_SUPPLY("8921_s5", NULL), - REGULATOR_SUPPLY("krait0", "acpuclk-8960"), - REGULATOR_SUPPLY("krait0", "acpuclk-8960ab"), -}; -VREG_CONSUMERS(S6) = { - REGULATOR_SUPPLY("8921_s6", NULL), - REGULATOR_SUPPLY("krait1", "acpuclk-8960"), - REGULATOR_SUPPLY("krait1", "acpuclk-8960ab"), -}; -VREG_CONSUMERS(S7) = { - REGULATOR_SUPPLY("8921_s7", NULL), -}; -VREG_CONSUMERS(S8) = { - REGULATOR_SUPPLY("8921_s8", NULL), -}; -VREG_CONSUMERS(LVS1) = { - REGULATOR_SUPPLY("8921_lvs1", NULL), - REGULATOR_SUPPLY("iris_vddio", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(LVS2) = { - REGULATOR_SUPPLY("8921_lvs2", NULL), - REGULATOR_SUPPLY("iris_vdddig", "wcnss_wlan.0"), -}; -VREG_CONSUMERS(LVS3) = { - REGULATOR_SUPPLY("8921_lvs3", NULL), -}; -VREG_CONSUMERS(LVS4) = { - REGULATOR_SUPPLY("8921_lvs4", NULL), - REGULATOR_SUPPLY("vcc_i2c", "3-0024"), - REGULATOR_SUPPLY("vcc_i2c", "3-004a"), -}; -VREG_CONSUMERS(LVS5) = { - REGULATOR_SUPPLY("8921_lvs5", NULL), - REGULATOR_SUPPLY("cam_vio", "4-001a"), - REGULATOR_SUPPLY("cam_vio", "4-006c"), - REGULATOR_SUPPLY("cam_vio", "4-0048"), - REGULATOR_SUPPLY("cam_vio", "4-0020"), - REGULATOR_SUPPLY("cam_vio", "4-0034"), - REGULATOR_SUPPLY("cam_vio", "4-0010"), -}; -/* This mapping is used for CDP only. */ -VREG_CONSUMERS(CDP_LVS6) = { - REGULATOR_SUPPLY("8921_lvs6", NULL), - REGULATOR_SUPPLY("vdd-io", "spi0.0"), -}; -/* This mapping is used for non-CDP targets only. */ -VREG_CONSUMERS(LVS6) = { - REGULATOR_SUPPLY("8921_lvs6", NULL), - REGULATOR_SUPPLY("vdd-io", "spi0.0"), - REGULATOR_SUPPLY("vdd-phy", "spi0.0"), -}; -VREG_CONSUMERS(LVS7) = { - REGULATOR_SUPPLY("8921_lvs7", NULL), -}; -VREG_CONSUMERS(USB_OTG) = { - REGULATOR_SUPPLY("8921_usb_otg", NULL), -}; -VREG_CONSUMERS(HDMI_MVS) = { - REGULATOR_SUPPLY("8921_hdmi_mvs", NULL), - REGULATOR_SUPPLY("hdmi_mvs", "hdmi_msm.0"), -}; -VREG_CONSUMERS(NCP) = { - REGULATOR_SUPPLY("8921_ncp", NULL), -}; -VREG_CONSUMERS(EXT_5V) = { - REGULATOR_SUPPLY("ext_5v", NULL), -}; -VREG_CONSUMERS(EXT_L2) = { - REGULATOR_SUPPLY("ext_l2", NULL), - REGULATOR_SUPPLY("vdd-phy", "spi0.0"), -}; -VREG_CONSUMERS(EXT_3P3V) = { - REGULATOR_SUPPLY("ext_3p3v", NULL), - REGULATOR_SUPPLY("vdd_ana", "3-005b"), - REGULATOR_SUPPLY("vdd_lvds_3p3v", "mipi_dsi.1"), - REGULATOR_SUPPLY("mhl_usb_hs_switch", "msm_otg"), -}; -VREG_CONSUMERS(EXT_OTG_SW) = { - REGULATOR_SUPPLY("ext_otg_sw", NULL), - REGULATOR_SUPPLY("vbus_otg", "msm_otg"), -}; - -#define PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, _modes, _ops, \ - _apply_uV, _pull_down, _always_on, _supply_regulator, \ - _system_uA, _enable_time, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pull_down_enable = _pull_down, \ - .system_uA = _system_uA, \ - .enable_time = _enable_time, \ - } - -#define PM8XXX_LDO(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_NLDO1200(_id, _name, _always_on, _pull_down, _min_uV, \ - _max_uV, _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_SMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_FTSMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS \ - | REGULATOR_CHANGE_MODE, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_VS(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_VS300(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -#define PM8XXX_NCP(_id, _name, _always_on, _min_uV, _max_uV, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, 0, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, 0, \ - _always_on, _supply_regulator, 0, _enable_time, _reg_id) - -/* Pin control initialization */ -#define PM8XXX_PC(_id, _name, _always_on, _pin_fn, _pin_ctrl, \ - _supply_regulator, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pin_fn = PM8XXX_VREG_PIN_FN_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define GPIO_VREG(_id, _reg_name, _gpio_label, _gpio, _supply_regulator) \ - [GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .regulator_name = _reg_name, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -#define SAW_VREG_INIT(_id, _name, _min_uV, _max_uV) \ - { \ - .constraints = { \ - .name = _name, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - }, \ - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - } - -#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \ - _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \ - _force_mode, _sleep_set_force_mode, _power_mode, _state, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .power_mode = _power_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - .system_uA = _system_uA, \ - } - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _init_peak_uA) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _freq, _force_mode, \ - _sleep_set_force_mode) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _system_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_##_force_mode, \ - RPM_VREG_FORCE_MODE_8960_##_sleep_set_force_mode, \ - RPM_VREG_POWER_MODE_8960_PWM, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \ - RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_NCP(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _freq) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 1000, 1000, 0, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, \ - RPM_VREG_FORCE_MODE_8960_NONE, RPM_VREG_POWER_MODE_8960_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -/* Pin control initialization */ -#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8921_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_8960_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -/* GPIO regulator constraints */ -struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] = { - /* ID vreg_name gpio_label gpio supply */ - GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en", PM8921_MPP_PM_TO_SYS(7), NULL), - GPIO_VREG(EXT_L2, "ext_l2", "ext_l2_en", 91, NULL), - GPIO_VREG(EXT_3P3V, "ext_3p3v", "ext_3p3v_en", - PM8921_GPIO_PM_TO_SYS(17), NULL), - GPIO_VREG(EXT_OTG_SW, "ext_otg_sw", "ext_otg_sw_en", - PM8921_GPIO_PM_TO_SYS(42), "8921_usb_otg"), -}; - -/* SAW regulator constraints */ -struct regulator_init_data msm_saw_regulator_pdata_s5 = - /* ID vreg_name min_uV max_uV */ - SAW_VREG_INIT(S5, "8921_s5", 850000, 1300000); -struct regulator_init_data msm_saw_regulator_pdata_s6 = - SAW_VREG_INIT(S6, "8921_s6", 850000, 1300000); - -/* PM8921 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm_pm8921_regulator_pdata[] = { - /* - * ID name always_on pd min_uV max_uV en_t supply - * system_uA reg_ID - */ - PM8XXX_NLDO1200(L26, "8921_l26", 0, 1, 375000, 1050000, 200, "8921_s7", - 0, 1), - PM8XXX_NLDO1200(L27, "8921_l27", 0, 1, 375000, 1050000, 200, "8921_s7", - 0, 2), - PM8XXX_NLDO1200(L28, "8921_l28", 0, 1, 375000, 1050000, 200, "8921_s7", - 0, 3), - PM8XXX_LDO(L29, "8921_l29", 0, 1, 2050000, 2100000, 200, "8921_s8", - 0, 4), - - /* ID name always_on pd en_t supply reg_ID */ - PM8XXX_VS300(USB_OTG, "8921_usb_otg", 0, 1, 0, "ext_5v", 5), - PM8XXX_VS300(HDMI_MVS, "8921_hdmi_mvs", 0, 1, 0, "ext_5v", 6), -}; - -static struct rpm_regulator_init_data -msm_rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV supply sys_uA freq fm ss_fm */ - RPM_SMPS(S1, 1, 1, 0, 1225000, 1225000, NULL, 100000, 3p20, NONE, NONE), - RPM_SMPS(S2, 0, 1, 0, 1300000, 1300000, NULL, 0, 1p60, NONE, NONE), - RPM_SMPS(S3, 0, 1, 1, 500000, 1150000, NULL, 100000, 4p80, NONE, NONE), - RPM_SMPS(S4, 1, 1, 0, 1800000, 1800000, NULL, 100000, 1p60, AUTO, AUTO), - RPM_SMPS(S7, 0, 1, 0, 1150000, 1150000, NULL, 100000, 3p20, NONE, NONE), - RPM_SMPS(S8, 1, 1, 1, 2050000, 2050000, NULL, 100000, 1p60, NONE, NONE), - - /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */ - RPM_LDO(L1, 1, 1, 0, 1050000, 1050000, "8921_s4", 0, 10000), - RPM_LDO(L2, 0, 1, 0, 1200000, 1200000, "8921_s4", 0, 0), - RPM_LDO(L3, 0, 1, 0, 3075000, 3075000, NULL, 0, 0), - RPM_LDO(L4, 1, 1, 0, 1800000, 1800000, NULL, 10000, 10000), - RPM_LDO(L5, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L6, 0, 1, 0, 2950000, 2950000, NULL, 0, 0), - RPM_LDO(L7, 1, 1, 0, 1850000, 2950000, NULL, 10000, 10000), - RPM_LDO(L8, 0, 1, 0, 2800000, 3000000, NULL, 0, 0), - RPM_LDO(L9, 0, 1, 0, 3000000, 3000000, NULL, 0, 0), - RPM_LDO(L10, 0, 1, 0, 3000000, 3000000, NULL, 0, 0), - RPM_LDO(L11, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L12, 0, 1, 0, 1200000, 1200000, "8921_s4", 0, 0), - RPM_LDO(L14, 0, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L15, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L16, 0, 1, 0, 2800000, 2800000, NULL, 0, 0), - RPM_LDO(L17, 0, 1, 0, 1800000, 2950000, NULL, 0, 0), - RPM_LDO(L18, 0, 1, 0, 1300000, 1300000, "8921_s4", 0, 0), - RPM_LDO(L21, 0, 1, 0, 1900000, 1900000, "8921_s8", 0, 0), - RPM_LDO(L22, 0, 1, 0, 2750000, 2750000, NULL, 0, 0), - RPM_LDO(L23, 1, 1, 1, 1800000, 1800000, "8921_s8", 10000, 10000), - RPM_LDO(L24, 0, 1, 1, 750000, 1150000, "8921_s1", 10000, 10000), - RPM_LDO(L25, 1, 1, 0, 1250000, 1250000, "8921_s1", 10000, 10000), - - /* ID a_on pd ss supply */ - RPM_VS(LVS1, 0, 1, 0, "8921_s4"), - RPM_VS(LVS2, 0, 1, 0, "8921_s1"), - RPM_VS(LVS3, 0, 1, 0, "8921_s4"), - RPM_VS(LVS4, 0, 1, 0, "8921_s4"), - RPM_VS(LVS5, 0, 1, 0, "8921_s4"), - RPM_VS(LVS6, 0, 1, 0, "8921_s4"), - RPM_VS(LVS7, 0, 1, 0, "8921_s4"), - - /* ID a_on ss min_uV max_uV supply freq */ - RPM_NCP(NCP, 0, 0, 1800000, 1800000, "8921_l6", 1p60), -}; - -int msm_pm8921_regulator_pdata_len = - ARRAY_SIZE(msm_pm8921_regulator_pdata); - -#define RPM_REG_MAP(_id, _sleep_also, _voter, _supply, _dev_name) \ - { \ - .vreg_id = RPM_VREG_ID_PM8921_##_id, \ - .sleep_also = _sleep_also, \ - .voter = _voter, \ - .supply = _supply, \ - .dev_name = _dev_name, \ - } -static struct rpm_regulator_consumer_mapping - msm_rpm_regulator_consumer_mapping[] = { - RPM_REG_MAP(L23, 0, 1, "krait0_l23", "acpuclk-8960"), - RPM_REG_MAP(L23, 0, 2, "krait1_l23", "acpuclk-8960"), - RPM_REG_MAP(L23, 0, 6, "l2_l23", "acpuclk-8960"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8960"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8960"), - RPM_REG_MAP(S3, 0, 1, "krait0_dig", "acpuclk-8960"), - RPM_REG_MAP(S3, 0, 2, "krait1_dig", "acpuclk-8960"), - RPM_REG_MAP(S8, 0, 1, "krait0_s8", "acpuclk-8960"), - RPM_REG_MAP(S8, 0, 2, "krait1_s8", "acpuclk-8960"), - RPM_REG_MAP(S8, 0, 6, "l2_s8", "acpuclk-8960"), - - RPM_REG_MAP(L23, 0, 1, "krait0_l23", "acpuclk-8960ab"), - RPM_REG_MAP(L23, 0, 2, "krait1_l23", "acpuclk-8960ab"), - RPM_REG_MAP(L23, 0, 6, "l2_l23", "acpuclk-8960ab"), - RPM_REG_MAP(L24, 0, 1, "krait0_mem", "acpuclk-8960ab"), - RPM_REG_MAP(L24, 0, 2, "krait1_mem", "acpuclk-8960ab"), - RPM_REG_MAP(S3, 0, 1, "krait0_dig", "acpuclk-8960ab"), - RPM_REG_MAP(S3, 0, 2, "krait1_dig", "acpuclk-8960ab"), - RPM_REG_MAP(S8, 0, 1, "krait0_s8", "acpuclk-8960ab"), - RPM_REG_MAP(S8, 0, 2, "krait1_s8", "acpuclk-8960ab"), - RPM_REG_MAP(S8, 0, 6, "l2_s8", "acpuclk-8960ab"), -}; - -struct rpm_regulator_platform_data msm_rpm_regulator_pdata = { - .init_data = msm_rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(msm_rpm_regulator_init_data), - .version = RPM_VREG_VERSION_8960, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8921_L24, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8921_S3, - .consumer_map = msm_rpm_regulator_consumer_mapping, - .consumer_map_len = ARRAY_SIZE(msm_rpm_regulator_consumer_mapping), -}; - -/* - * Fix up regulator consumer data that moves to a different regulator based on - * the current target. - */ -void __init configure_msm8960_power_grid(void) -{ - static struct rpm_regulator_init_data *rpm_data; - int i; - - if (machine_is_msm8960_cdp() || cpu_is_msm8960ab()) { - /* Only modify LVS6 consumers for CDP targets. */ - for (i = 0; i < ARRAY_SIZE(msm_rpm_regulator_init_data); i++) { - rpm_data = &msm_rpm_regulator_init_data[i]; - if (machine_is_msm8960_cdp() && - rpm_data->id == RPM_VREG_ID_PM8921_LVS6) { - rpm_data->init_data.consumer_supplies - = vreg_consumers_CDP_LVS6; - rpm_data->init_data.num_consumer_supplies - = ARRAY_SIZE(vreg_consumers_CDP_LVS6); - } - if (cpu_is_msm8960ab() && - rpm_data->id == RPM_VREG_ID_PM8921_S7) { - rpm_data->init_data.constraints.min_uV = - 1275000; - rpm_data->init_data.constraints.max_uV = - 1275000; - rpm_data->init_data.constraints.input_uV = - 1275000; - rpm_data->default_uV = 1275000; - } - } - } -} diff --git a/arch/arm/mach-msm/board-8960-storage.c b/arch/arm/mach-msm/board-8960-storage.c deleted file mode 100644 index 3b3ffa41b0b5..000000000000 --- a/arch/arm/mach-msm/board-8960-storage.c +++ /dev/null @@ -1,390 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-8960.h" -#include "board-storage-common-a.h" - -/* MSM8960 has 5 SDCC controllers */ -enum sdcc_controllers { - SDCC1, - SDCC2, - SDCC3, - SDCC4, - SDCC5, - MAX_SDCC_CONTROLLER -}; - -/* All SDCC controllers require VDD/VCC voltage */ -static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .always_on = 1, - .lpm_sup = 1, - .lpm_uA = 9000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC2 : SDIO slot connected */ - [SDCC2] = { - .name = "sdc_vdd", - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .always_on = 1, - .lpm_sup = 1, - .lpm_uA = 9000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd", - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .hpm_uA = 600000, /* 600mA */ - } -}; - -/* SDCC controllers may require voting for IO operating voltage */ -static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .name = "sdc_vdd_io", - .always_on = 1, - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .hpm_uA = 200000, /* 200mA */ - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .name = "sdc_vdd_io", - .high_vol_level = 2950000, - .low_vol_level = 1850000, - .always_on = 1, - .lpm_sup = 1, - /* Max. Active current required is 16 mA */ - .hpm_uA = 16000, - /* - * Sleep current required is ~300 uA. But min. vote can be - * in terms of mA (min. 1 mA). So let's vote for 2 mA - * during sleep. - */ - .lpm_uA = 2000, - }, - /* SDCC4 : SDIO slot connected */ - [SDCC4] = { - .name = "sdc_vdd_io", - .high_vol_level = 1800000, - .low_vol_level = 1800000, - .always_on = 1, - .lpm_sup = 1, - .hpm_uA = 200000, /* 200mA */ - .lpm_uA = 2000, - }, -}; - -static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : eMMC card connected */ - [SDCC1] = { - .vdd_data = &mmc_vdd_reg_data[SDCC1], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1], - }, - /* SDCC2 : SDIO card slot connected */ - [SDCC2] = { - .vdd_data = &mmc_vdd_reg_data[SDCC2], - }, - /* SDCC3 : External card slot connected */ - [SDCC3] = { - .vdd_data = &mmc_vdd_reg_data[SDCC3], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC3], - }, - /* SDCC4 : SDIO card slot connected */ - [SDCC4] = { - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC4], - }, -}; - -/* SDC1 pad data */ -static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA} -}; - -static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -/* SDC3 pad data */ -static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA} -}; - -static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL}, - /* - * SDC3 CMD line should be PULLed UP otherwise fluid platform will - * see transitions (1 -> 0 and 0 -> 1) on card detection line, - * which would result in false card detection interrupts. - */ - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - /* - * Keeping DATA lines status to PULL UP will make sure that - * there is no current leak during sleep if external pull up - * is connected to DATA lines. - */ - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_pull_on_cfg, - .off = sdc1_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_pull_on_cfg, - .off = sdc3_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg) - }, -}; - -static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_drv_on_cfg, - .off = sdc1_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg) - }, - [SDCC3] = { - .on = sdc3_pad_drv_on_cfg, - .off = sdc3_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg) - }, -}; - -struct msm_mmc_gpio sdc2_gpio[] = { - {92, "sdc2_dat_3"}, - {91, "sdc2_dat_2"}, - {90, "sdc2_dat_1"}, - {89, "sdc2_dat_0"}, - {97, "sdc2_cmd"}, - {98, "sdc2_clk"} -}; - -struct msm_mmc_gpio sdc4_gpio[] = { - {83, "sdc4_dat_3"}, - {84, "sdc4_dat_2"}, - {85, "sdc4_dat_1"}, - {86, "sdc4_dat_0"}, - {87, "sdc4_cmd"}, - {88, "sdc4_clk"} -}; - -struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = { - [SDCC2] = { - .gpio = sdc2_gpio, - .size = ARRAY_SIZE(sdc2_gpio), - }, - [SDCC4] = { - .gpio = sdc4_gpio, - .size = ARRAY_SIZE(sdc4_gpio), - }, -}; - -static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pull = &mmc_pad_pull_data[SDCC1], - .drv = &mmc_pad_drv_data[SDCC1] - }, - [SDCC3] = { - .pull = &mmc_pad_pull_data[SDCC3], - .drv = &mmc_pad_drv_data[SDCC3] - }, -}; - -static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pad_data = &mmc_pad_data[SDCC1], - }, - [SDCC2] = { - .is_gpio = 1, - .gpio_data = &mmc_gpio_data[SDCC2], - }, - [SDCC3] = { - .pad_data = &mmc_pad_data[SDCC3], - }, - [SDCC4] = { - .is_gpio = 1, - .gpio_data = &mmc_gpio_data[SDCC4], - }, -}; - -#define MSM_MPM_PIN_SDC1_DAT1 17 -#define MSM_MPM_PIN_SDC3_DAT1 21 - -static unsigned int sdc1_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000 -}; - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static unsigned int sdc3_sup_clk_rates[] = { - 400000, 24000000, 48000000, 96000000, 192000000 -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct mmc_platform_data msm8960_sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, -#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .sup_clk_table = sdc1_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates), - .nonremovable = 1, - .vreg_data = &mmc_slot_vreg_data[SDCC1], - .pin_data = &mmc_slot_pin_data[SDCC1], - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, - .uhs_caps2 = MMC_CAP2_HS200_1_8V_SDR, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static unsigned int sdc2_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data msm8960_sdc2_data = { - .ocr_mask = MMC_VDD_165_195, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc2_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates), - .vreg_data = &mmc_slot_vreg_data[SDCC2], - .pin_data = &mmc_slot_pin_data[SDCC2], - .sdiowakeup_irq = MSM_GPIO_TO_INT(90), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data msm8960_sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc3_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates), -#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT - .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16), -#endif - .vreg_data = &mmc_slot_vreg_data[SDCC3], - .pin_data = &mmc_slot_pin_data[SDCC3], -#ifndef CONFIG_MMC_MSM_SDC3_POLLING - .status_gpio = PM8921_GPIO_PM_TO_SYS(26), - .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26), - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, -#endif - .is_status_gpio_active_low = true, - .xpc_cap = 1, - .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 | - MMC_CAP_UHS_SDR104), - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static unsigned int sdc4_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data msm8960_sdc4_data = { - .ocr_mask = MMC_VDD_165_195, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc4_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc4_sup_clk_rates), - .vreg_data = &mmc_slot_vreg_data[SDCC4], - .pin_data = &mmc_slot_pin_data[SDCC4], - .sdiowakeup_irq = MSM_GPIO_TO_INT(85), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -void __init msm8960_init_mmc(void) -{ -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - /* - * When eMMC runs in DDR mode on CDP platform, we have - * seen instability due to DATA CRC errors. These errors are - * attributed to long physical path between MSM and eMMC on CDP. - * So let's not enable the DDR mode on CDP platform but let other - * platforms take advantage of eMMC DDR mode. - */ - if (!machine_is_msm8960_cdp()) - msm8960_sdc1_data.uhs_caps |= (MMC_CAP_1_8V_DDR | - MMC_CAP_UHS_DDR50); - /* SDC1 : eMMC card connected */ - msm_add_sdcc(1, &msm8960_sdc1_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - /* SDC2: SDIO slot for WLAN*/ - msm_add_sdcc(2, &msm8960_sdc2_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - /* SDC3: External card slot */ - msm_add_sdcc(3, &msm8960_sdc3_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - /* SDC4: SDIO slot for WLAN */ - msm_add_sdcc(4, &msm8960_sdc4_data); -#endif -} diff --git a/arch/arm/mach-msm/board-8960.c b/arch/arm/mach-msm/board-8960.c deleted file mode 100644 index d48a67e47de6..000000000000 --- a/arch/arm/mach-msm/board-8960.c +++ /dev/null @@ -1,3401 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#ifdef CONFIG_USB_MSM_OTG_72K -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_WCD9310_CODEC -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "timer.h" -#include "devices.h" -#include "devices-msm8x60.h" -#include "spm.h" -#include "board-8960.h" -#include "pm.h" -#include -#include "rpm_resources.h" -#include -#include "clock.h" -#include "pm-boot.h" -#include "msm_watchdog.h" -#include "platsmp.h" - -#if defined(CONFIG_BT) && defined(CONFIG_BT_HCIUART_ATH3K) -#include -#include -#endif - -static struct platform_device msm_fm_platform_init = { - .name = "iris_fm", - .id = -1, -}; - -#define KS8851_RST_GPIO 89 -#define KS8851_IRQ_GPIO 90 - -#define MHL_GPIO_INT 4 -#define MHL_GPIO_RESET 15 - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - -struct sx150x_platform_data msm8960_sx150x_data[] = { - [SX150X_CAM] = { - .gpio_base = GPIO_CAM_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0, - .io_pulldn_ena = 0xc0, - .io_open_drain_ena = 0x0, - .irq_summary = -1, - }, - [SX150X_LIQUID] = { - .gpio_base = GPIO_LIQUID_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0c08, - .io_pulldn_ena = 0x4060, - .io_open_drain_ena = 0x000c, - .io_polarity = 0, - .irq_summary = -1, - }, -}; - -#endif - -#define MSM_PMEM_ADSP_SIZE 0x7800000 -#define MSM_PMEM_AUDIO_SIZE 0x4CF000 -#define MSM_PMEM_SIZE 0x2800000 /* 40 Mbytes */ -#define MSM_LIQUID_PMEM_SIZE 0x4000000 /* 64 Mbytes */ -#define MSM_HDMI_PRIM_PMEM_SIZE 0x4000000 /* 64 Mbytes */ - -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -#define HOLE_SIZE 0x20000 -#define MSM_ION_MFC_META_SIZE 0x40000 /* 256 Kbytes */ -#define MSM_CONTIG_MEM_SIZE 0x65000 -#ifdef CONFIG_MSM_IOMMU -#define MSM_ION_MM_SIZE 0x3800000 /* Need to be multiple of 64K */ -#define MSM_ION_SF_SIZE 0x0 -#define MSM_ION_QSECOM_SIZE 0x780000 /* (7.5MB) */ -#define MSM_ION_HEAP_NUM 8 -#else -#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE -#define MSM_ION_SF_SIZE MSM_PMEM_SIZE -#define MSM_ION_QSECOM_SIZE 0x600000 /* (6MB) */ -#define MSM_ION_HEAP_NUM 8 -#endif -#define MSM_ION_MM_FW_SIZE (0x200000 - HOLE_SIZE) /* 128kb */ -#define MSM_ION_MFC_SIZE (SZ_8K + MSM_ION_MFC_META_SIZE) -#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE - -#define MSM_LIQUID_ION_MM_SIZE (MSM_ION_MM_SIZE + 0x600000) -#define MSM_LIQUID_ION_SF_SIZE MSM_LIQUID_PMEM_SIZE -#define MSM_HDMI_PRIM_ION_SF_SIZE MSM_HDMI_PRIM_PMEM_SIZE - -#define MSM_MM_FW_SIZE (0x200000 - HOLE_SIZE) /* 2mb -128kb*/ -#define MSM8960_FIXED_AREA_START (0xa0000000 - (MSM_ION_MM_FW_SIZE + \ - HOLE_SIZE)) -#define MAX_FIXED_AREA_SIZE 0x10000000 -#define MSM8960_FW_START MSM8960_FIXED_AREA_START -#define MSM_ION_ADSP_SIZE SZ_8M - -static unsigned msm_ion_sf_size = MSM_ION_SF_SIZE; -#else -#define MSM_CONTIG_MEM_SIZE 0x110C000 -#define MSM_ION_HEAP_NUM 1 -#endif - -#ifdef CONFIG_KERNEL_MSM_CONTIG_MEM_REGION -static unsigned msm_contig_mem_size = MSM_CONTIG_MEM_SIZE; -static int __init msm_contig_mem_size_setup(char *p) -{ - msm_contig_mem_size = memparse(p, NULL); - return 0; -} -early_param("msm_contig_mem_size", msm_contig_mem_size_setup); -#endif - -#define DSP_RAM_BASE_8960 0x8da00000 -#define DSP_RAM_SIZE_8960 0x1800000 -static int dspcrashd_pdata_8960 = 0xDEADDEAD; - -static struct resource resources_dspcrashd_8960[] = { - { - .name = "msm_dspcrashd", - .start = DSP_RAM_BASE_8960, - .end = DSP_RAM_BASE_8960 + DSP_RAM_SIZE_8960, - .flags = IORESOURCE_DMA, - }, -}; - -static struct platform_device msm_device_dspcrashd_8960 = { - .name = "msm_dspcrashd", - .num_resources = ARRAY_SIZE(resources_dspcrashd_8960), - .resource = resources_dspcrashd_8960, - .dev = { .platform_data = &dspcrashd_pdata_8960 }, -}; - -static struct memtype_reserve msm8960_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static void __init reserve_rtb_memory(void) -{ -#if defined(CONFIG_MSM_RTB) - msm8960_reserve_table[MEMTYPE_EBI1].size += msm8960_rtb_pdata.size; -#endif -} - -static int msm8960_paddr_to_memtype(phys_addr_t paddr) -{ - return MEMTYPE_EBI1; -} - -#define FMEM_ENABLED 0 - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_cp_heap_pdata cp_mm_msm8960_ion_pdata = { - .permission_type = IPT_TYPE_MM_CARVEOUT, - .align = SZ_64K, - .fixed_position = FIXED_MIDDLE, - .iommu_map_all = 1, - .iommu_2x_map_domain = VIDEO_DOMAIN, -}; - -static struct ion_cp_heap_pdata cp_mfc_msm8960_ion_pdata = { - .permission_type = IPT_TYPE_MFC_SHAREDMEM, - .align = PAGE_SIZE, - .fixed_position = FIXED_HIGH, -}; - -static struct ion_co_heap_pdata co_msm8960_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; - -static struct ion_co_heap_pdata fw_co_msm8960_ion_pdata = { - .adjacent_mem_id = ION_CP_MM_HEAP_ID, - .align = SZ_128K, - .fixed_position = FIXED_LOW, -}; -#endif - -static u64 msm_dmamask = DMA_BIT_MASK(32); - -static struct platform_device ion_mm_heap_device = { - .name = "ion-mm-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; - -static struct platform_device ion_adsp_heap_device = { - .name = "ion-adsp-heap-device", - .id = -1, - .dev = { - .dma_mask = &msm_dmamask, - .coherent_dma_mask = DMA_BIT_MASK(32), - } -}; - -/** - * These heaps are listed in the order they will be allocated. Due to - * video hardware restrictions and content protection the FW heap has to - * be allocated adjacent (below) the MM heap and the MFC heap has to be - * allocated after the MM heap to ensure MFC heap is not more than 256MB - * away from the base address of the FW heap. - * However, the order of FW heap and MM heap doesn't matter since these - * two heaps are taken care of by separate code to ensure they are adjacent - * to each other. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap msm8960_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - { - .id = ION_CP_MM_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MM_HEAP_NAME, - .size = MSM_ION_MM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mm_msm8960_ion_pdata, - .priv = &ion_mm_heap_device.dev, - }, - { - .id = ION_MM_FIRMWARE_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_MM_FIRMWARE_HEAP_NAME, - .size = MSM_ION_MM_FW_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &fw_co_msm8960_ion_pdata, - }, - { - .id = ION_CP_MFC_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MFC_HEAP_NAME, - .size = MSM_ION_MFC_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_mfc_msm8960_ion_pdata, - }, -#ifndef CONFIG_MSM_IOMMU - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .size = MSM_ION_SF_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8960_ion_pdata, - }, -#endif - { - .id = ION_IOMMU_HEAP_ID, - .type = ION_HEAP_TYPE_IOMMU, - .name = ION_IOMMU_HEAP_NAME, - }, - { - .id = ION_QSECOM_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_QSECOM_HEAP_NAME, - .size = MSM_ION_QSECOM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8960_ion_pdata, - }, - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .size = MSM_ION_AUDIO_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8960_ion_pdata, - }, - { - .id = ION_ADSP_HEAP_ID, - .type = ION_HEAP_TYPE_DMA, - .name = ION_ADSP_HEAP_NAME, - .size = MSM_ION_ADSP_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_msm8960_ion_pdata, - .priv = &ion_adsp_heap_device.dev, - }, -#endif -}; - -static struct ion_platform_data msm8960_ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = msm8960_heaps, -}; - -static struct platform_device msm8960_ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &msm8960_ion_pdata }, -}; -#endif - -static void __init adjust_mem_for_liquid(void) -{ - unsigned int i; - - if (machine_is_msm8960_liquid()) - msm_ion_sf_size = MSM_LIQUID_ION_SF_SIZE; - - if (msm8960_hdmi_as_primary_selected()) - msm_ion_sf_size = MSM_HDMI_PRIM_ION_SF_SIZE; - - if (machine_is_msm8960_liquid() || - msm8960_hdmi_as_primary_selected()) { - for (i = 0; i < msm8960_ion_pdata.nr; i++) { - if (msm8960_ion_pdata.heaps[i].id == - ION_SF_HEAP_ID) { - msm8960_ion_pdata.heaps[i].size = - msm_ion_sf_size; - pr_debug("msm_ion_sf_size 0x%x\n", - msm_ion_sf_size); - break; - } - } - } -} - -static void __init reserve_mem_for_ion(enum ion_memory_types mem_type, - unsigned long size) -{ - msm8960_reserve_table[mem_type].size += size; -} - -static void __init msm8960_reserve_fixed_area(unsigned long fixed_area_size) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - int ret; - - if (fixed_area_size > MAX_FIXED_AREA_SIZE) - panic("fixed area size is larger than %dM\n", - MAX_FIXED_AREA_SIZE >> 20); - - reserve_info->fixed_area_size = fixed_area_size; - reserve_info->fixed_area_start = MSM8960_FW_START; - - ret = memblock_remove(reserve_info->fixed_area_start, - reserve_info->fixed_area_size); - BUG_ON(ret); -#endif -} - -/** - * Reserve memory for ION. Also handle special case - * for video heaps (MM,FW, and MFC). Video requires heaps MM and MFC to be - * at a higher address than FW in addition to not more than 256MB away from the - * base address of the firmware. In addition the MM heap must be - * adjacent to the FW heap for content protection purposes. - */ -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - unsigned int i; - int ret; - unsigned int fixed_size = 0; - unsigned int fixed_low_size, fixed_middle_size, fixed_high_size; - unsigned long fixed_low_start, fixed_middle_start, fixed_high_start; - unsigned long cma_alignment; - unsigned int low_use_cma = 0; - unsigned int middle_use_cma = 0; - unsigned int high_use_cma = 0; - - adjust_mem_for_liquid(); - fixed_low_size = 0; - fixed_middle_size = 0; - fixed_high_size = 0; - - cma_alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order); - - for (i = 0; i < msm8960_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = - &(msm8960_ion_pdata.heaps[i]); - int align = SZ_4K; - int iommu_map_all = 0; - int adjacent_mem_id = INVALID_HEAP_ID; - int use_cma = 0; - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - - switch ((int) heap->type) { - case ION_HEAP_TYPE_CP: - fixed_position = ((struct ion_cp_heap_pdata *) - heap->extra_data)->fixed_position; - align = ((struct ion_cp_heap_pdata *) - heap->extra_data)->align; - iommu_map_all = - ((struct ion_cp_heap_pdata *) - heap->extra_data)->iommu_map_all; - if (((struct ion_cp_heap_pdata *) - heap->extra_data)->is_cma) { - heap->size = ALIGN(heap->size, - cma_alignment); - use_cma = 1; - } - break; - case ION_HEAP_TYPE_DMA: - use_cma = 1; - /* Purposely fall through here */ - case ION_HEAP_TYPE_CARVEOUT: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - adjacent_mem_id = ((struct ion_co_heap_pdata *) - heap->extra_data)->adjacent_mem_id; - break; - default: - break; - } - - if (iommu_map_all) { - if (heap->size & (SZ_64K-1)) { - heap->size = ALIGN(heap->size, SZ_64K); - pr_info("Heap %s not aligned to 64K. Adjusting size to %x\n", - heap->name, heap->size); - } - } - - if (fixed_position != NOT_FIXED) - fixed_size += heap->size; - else if (!use_cma) - reserve_mem_for_ion(MEMTYPE_EBI1, heap->size); - - if (fixed_position == FIXED_LOW) { - fixed_low_size += heap->size; - low_use_cma = use_cma; - } else if (fixed_position == FIXED_MIDDLE) { - fixed_middle_size += heap->size; - middle_use_cma = use_cma; - } else if (fixed_position == FIXED_HIGH) { - fixed_high_size += heap->size; - high_use_cma = use_cma; - } else if (use_cma) { - /* - * Heaps that use CMA but are not part of the - * fixed set. Create wherever. - */ - dma_declare_contiguous( - heap->priv, - heap->size, - 0, - 0xb0000000); - } - } - } - - if (!fixed_size) - return; - - /* - * Given the setup for the fixed area, we can't round up all sizes. - * Some sizes must be set up exactly and aligned correctly. Incorrect - * alignments are considered a configuration issue - */ - - fixed_low_start = MSM8960_FIXED_AREA_START; - if (low_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_low_start, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, SECTION_SIZE)); - ret = memblock_remove(fixed_low_start, - fixed_low_size + HOLE_SIZE); - BUG_ON(ret); - } - - fixed_middle_start = fixed_low_start + fixed_low_size + HOLE_SIZE; - if (middle_use_cma) { - BUG_ON(!IS_ALIGNED(fixed_middle_start, cma_alignment)); - BUG_ON(!IS_ALIGNED(fixed_middle_size, cma_alignment)); - } else { - BUG_ON(!IS_ALIGNED(fixed_middle_size, SECTION_SIZE)); - ret = memblock_remove(fixed_middle_start, fixed_middle_size); - BUG_ON(ret); - } - - fixed_high_start = fixed_middle_start + fixed_middle_size; - if (high_use_cma) { - fixed_high_size = ALIGN(fixed_high_size, cma_alignment); - BUG_ON(!IS_ALIGNED(fixed_high_start, cma_alignment)); - } else { - /* This is the end of the fixed area so it's okay to round up */ - fixed_high_size = ALIGN(fixed_high_size, SECTION_SIZE); - ret = memblock_remove(fixed_high_start, fixed_high_size); - BUG_ON(ret); - } - - - - for (i = 0; i < msm8960_ion_pdata.nr; ++i) { - struct ion_platform_heap *heap = &(msm8960_ion_pdata.heaps[i]); - - if (heap->extra_data) { - int fixed_position = NOT_FIXED; - struct ion_cp_heap_pdata *pdata = NULL; - - switch ((int) heap->type) { - case ION_HEAP_TYPE_CP: - pdata = - (struct ion_cp_heap_pdata *)heap->extra_data; - fixed_position = pdata->fixed_position; - break; - case ION_HEAP_TYPE_CARVEOUT: - case ION_HEAP_TYPE_DMA: - fixed_position = ((struct ion_co_heap_pdata *) - heap->extra_data)->fixed_position; - break; - default: - break; - } - - switch (fixed_position) { - case FIXED_LOW: - heap->base = fixed_low_start; - break; - case FIXED_MIDDLE: - heap->base = fixed_middle_start; - if (middle_use_cma) { - ret = dma_declare_contiguous( - &ion_mm_heap_device.dev, - heap->size, - fixed_middle_start, - 0xa0000000); - WARN_ON(ret); - } - pdata->secure_base = fixed_middle_start - - HOLE_SIZE; - pdata->secure_size = HOLE_SIZE + heap->size; - break; - case FIXED_HIGH: - heap->base = fixed_high_start; - break; - default: - break; - } - } - } -#endif -} - -static void __init reserve_mdp_memory(void) -{ - msm8960_mdp_writeback(msm8960_reserve_table); -} - -static void __init reserve_cache_dump_memory(void) -{ -#ifdef CONFIG_MSM_CACHE_DUMP - unsigned int total; - - total = msm8960_cache_dump_pdata.l1_size + - msm8960_cache_dump_pdata.l2_size; - msm8960_reserve_table[MEMTYPE_EBI1].size += total; -#endif -} - -static void __init msm8960_calculate_reserve_sizes(void) -{ - reserve_ion_memory(); - reserve_mdp_memory(); - reserve_rtb_memory(); - reserve_cache_dump_memory(); - msm8960_reserve_table[MEMTYPE_EBI1].size += msm_contig_mem_size; -} - -static struct reserve_info msm8960_reserve_info __initdata = { - .memtype_reserve_table = msm8960_reserve_table, - .calculate_reserve_sizes = msm8960_calculate_reserve_sizes, - .reserve_fixed_area = msm8960_reserve_fixed_area, - .paddr_to_memtype = msm8960_paddr_to_memtype, -}; - -static void __init msm8960_early_memory(void) -{ - reserve_info = &msm8960_reserve_info; -} - -static char prim_panel_name[PANEL_NAME_MAX_LEN]; -static char ext_panel_name[PANEL_NAME_MAX_LEN]; -static int __init prim_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("prim_display", prim_display_setup); - -static int __init ext_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(ext_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("ext_display", ext_display_setup); - -static void __init msm8960_reserve(void) -{ - msm8960_set_display_params(prim_panel_name, ext_panel_name); - msm_reserve(); -} - -static void __init msm8960_allocate_memory_regions(void) -{ - msm8960_allocate_fb_region(); -} - -#ifdef CONFIG_WCD9310_CODEC - -#define TABLA_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS + NR_PM8921_IRQS) - -/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement - * 4 micbiases are used to power various analog and digital - * microphones operating at 1800 mV. Technically, all micbiases - * can source from single cfilter since all microphones operate - * at the same voltage level. The arrangement below is to make - * sure all cfilters are exercised. LDO_H regulator ouput level - * does not need to be as high as 2.85V. It is choosen for - * microphone sensitivity purpose. - */ -static struct wcd9xxx_pdata tabla_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x10, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(62), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 2700, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device msm_slim_tabla = { - .name = "tabla-slim", - .e_addr = {0, 1, 0x10, 0, 0x17, 2}, - .dev = { - .platform_data = &tabla_platform_data, - }, -}; - -static struct wcd9xxx_pdata tabla20_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x60, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(62), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = PM8921_GPIO_PM_TO_SYS(34), - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 2700, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1250000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device msm_slim_tabla20 = { - .name = "tabla2x-slim", - .e_addr = {0, 1, 0x60, 0, 0x17, 2}, - .dev = { - .platform_data = &tabla20_platform_data, - }, -}; -#endif - -static struct slim_boardinfo msm_slim_devices[] = { -#ifdef CONFIG_WCD9310_CODEC - { - .bus_num = 1, - .slim_slave = &msm_slim_tabla, - }, - { - .bus_num = 1, - .slim_slave = &msm_slim_tabla20, - }, -#endif - /* add more slimbus slaves as needed */ -}; - -#define MSM_WCNSS_PHYS 0x03000000 -#define MSM_WCNSS_SIZE 0x280000 - -static struct resource resources_wcnss_wlan[] = { - { - .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - .name = "wcnss_wlanrx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - .name = "wcnss_wlantx_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_WCNSS_PHYS, - .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1, - .name = "wcnss_mmio", - .flags = IORESOURCE_MEM, - }, - { - .start = 84, - .end = 88, - .name = "wcnss_gpios_5wire", - .flags = IORESOURCE_IO, - }, -}; - -static struct qcom_wcnss_opts qcom_wcnss_pdata = { - .has_48mhz_xo = 1, -}; - -static struct platform_device msm_device_wcnss_wlan = { - .name = "wcnss_wlan", - .id = 0, - .num_resources = ARRAY_SIZE(resources_wcnss_wlan), - .resource = resources_wcnss_wlan, - .dev = {.platform_data = &qcom_wcnss_pdata}, -}; - -#ifdef CONFIG_QSEECOM -/* qseecom bus scaling */ -static struct msm_bus_vectors qseecom_clks_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_SPS, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(qseecom_clks_init_vectors), - qseecom_clks_init_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_vectors), - qseecom_enable_dfab_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_sfpb_vectors), - qseecom_enable_sfpb_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_sfpb_vectors), - qseecom_enable_dfab_sfpb_vectors, - }, -}; - -static struct msm_bus_scale_pdata qseecom_bus_pdata = { - qseecom_hw_bus_scale_usecases, - ARRAY_SIZE(qseecom_hw_bus_scale_usecases), - .name = "qsee", -}; - -static struct platform_device qseecom_device = { - .name = "qseecom", - .id = 0, - .dev = { - .platform_data = &qseecom_bus_pdata, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0x18500000 - -#define QCE_HW_KEY_SUPPORT 0 -#define QCE_SHA_HMAC_SUPPORT 1 -#define QCE_SHARE_CE_RESOURCE 1 -#define QCE_CE_SHARED 0 - -/* Begin Bus scaling definitions */ -static struct msm_bus_vectors crypto_hw_init_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors crypto_hw_active_vectors[] = { - { - .src = MSM_BUS_MASTER_ADM_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 70000000UL, - .ib = 70000000UL, - }, - { - .src = MSM_BUS_MASTER_ADM_PORT1, - .dst = MSM_BUS_SLAVE_GSBI1_UART, - .ab = 2480000000UL, - .ib = 2480000000UL, - }, -}; - -static struct msm_bus_paths crypto_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(crypto_hw_init_vectors), - crypto_hw_init_vectors, - }, - { - ARRAY_SIZE(crypto_hw_active_vectors), - crypto_hw_active_vectors, - }, -}; - -static struct msm_bus_scale_pdata crypto_hw_bus_scale_pdata = { - crypto_hw_bus_scale_usecases, - ARRAY_SIZE(crypto_hw_bus_scale_usecases), - .name = "cryptohw", -}; -/* End Bus Scaling Definitions*/ - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = &crypto_hw_bus_scale_pdata, -}; - -static struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = &crypto_hw_bus_scale_pdata, -}; - -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -static struct mdm_platform_data sglte_platform_data = { - .mdm_version = "4.0", - .ramdump_delay_ms = 1000, - /* delay between two PS_HOLDs */ - .ps_hold_delay_ms = 500, - .soft_reset_inverted = 1, - .peripheral_platform_device = NULL, - .ramdump_timeout_ms = 600000, - .no_powerdown_after_ramdumps = 1, - .image_upgrade_supported = 1, -}; - -#define MSM_TSIF0_PHYS (0x18200000) -#define MSM_TSIF1_PHYS (0x18201000) -#define MSM_TSIF_SIZE (0x200) -#define MSM_TSPP_PHYS (0x18202000) -#define MSM_TSPP_SIZE (0x1000) -#define MSM_TSPP_BAM_PHYS (0x18204000) -#define MSM_TSPP_BAM_SIZE (0x2000) - -#define TSIF_0_CLK GPIO_CFG(75, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_EN GPIO_CFG(76, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_DATA GPIO_CFG(77, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_SYNC GPIO_CFG(82, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_CLK GPIO_CFG(79, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_EN GPIO_CFG(80, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_DATA GPIO_CFG(81, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_SYNC GPIO_CFG(78, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif_gpios[] = { - { .gpio_cfg = TSIF_0_CLK, .label = "tsif0_clk", }, - { .gpio_cfg = TSIF_0_EN, .label = "tsif0_en", }, - { .gpio_cfg = TSIF_0_DATA, .label = "tsif0_data", }, - { .gpio_cfg = TSIF_0_SYNC, .label = "tsif0_sync", }, - { .gpio_cfg = TSIF_1_CLK, .label = "tsif1_clk", }, - { .gpio_cfg = TSIF_1_EN, .label = "tsif1_en", }, - { .gpio_cfg = TSIF_1_DATA, .label = "tsif1_data", }, - { .gpio_cfg = TSIF_1_SYNC, .label = "tsif1_sync", }, -}; - -static struct resource tspp_resources[] = { - [0] = { - .name = "TSIF_TSPP_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF_TSPP_IRQ, - .end = TSIF_TSPP_IRQ, - }, - [1] = { - .name = "TSIF0_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF1_IRQ, - .end = TSIF1_IRQ, - }, - [2] = { - .name = "TSIF1_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF2_IRQ, - .end = TSIF2_IRQ, - }, - [3] = { - .name = "TSIF_BAM_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF_BAM_IRQ, - .end = TSIF_BAM_IRQ, - }, - [4] = { - .name = "MSM_TSIF0_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSIF0_PHYS, - .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1, - }, - [5] = { - .name = "MSM_TSIF1_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSIF1_PHYS, - .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1, - }, - [6] = { - .name = "MSM_TSPP_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSPP_PHYS, - .end = MSM_TSPP_PHYS + MSM_TSPP_SIZE - 1, - }, - [7] = { - .name = "MSM_TSPP_BAM_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSPP_BAM_PHYS, - .end = MSM_TSPP_BAM_PHYS + MSM_TSPP_BAM_SIZE - 1, - }, -}; - -static struct msm_tspp_platform_data tspp_platform_data = { - .num_gpios = ARRAY_SIZE(tsif_gpios), - .gpios = tsif_gpios, - .tsif_pclk = "tsif_pclk", - .tsif_ref_clk = "tsif_ref_clk", - .tsif_vreg_present = 0, -}; - -static struct platform_device msm_device_tspp = { - .name = "msm_tspp", - .id = 0, - .num_resources = ARRAY_SIZE(tspp_resources), - .resource = tspp_resources, - .dev = { - .platform_data = &tspp_platform_data - }, -}; - -#define MSM_SHARED_RAM_PHYS 0x80000000 - -static void __init msm8960_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_msm8960_io(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - -} - -static void __init msm8960_init_irq(void) -{ - struct msm_mpm_device_data *data = NULL; - -#ifdef CONFIG_MSM_MPM - data = &msm8960_mpm_dev_data; -#endif - - msm_mpm_irq_extn_init(data); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, - (void *)MSM_QGIC_CPU_BASE); -} - -static void __init msm8960_init_buses(void) -{ -#ifdef CONFIG_MSM_BUS_SCALING - msm_bus_rpm_set_mt_mask(); - msm_bus_8960_apps_fabric_pdata.rpm_enabled = 1; - msm_bus_8960_sys_fabric_pdata.rpm_enabled = 1; - msm_bus_apps_fabric.dev.platform_data = - &msm_bus_8960_apps_fabric_pdata; - msm_bus_sys_fabric.dev.platform_data = &msm_bus_8960_sys_fabric_pdata; - if (cpu_is_msm8960ab()) { - msm_bus_8960_sg_mm_fabric_pdata.rpm_enabled = 1; - msm_bus_mm_fabric.dev.platform_data = - &msm_bus_8960_sg_mm_fabric_pdata; - } else { - msm_bus_8960_mm_fabric_pdata.rpm_enabled = 1; - msm_bus_mm_fabric.dev.platform_data = - &msm_bus_8960_mm_fabric_pdata; - } - msm_bus_sys_fpb.dev.platform_data = &msm_bus_8960_sys_fpb_pdata; - msm_bus_cpss_fpb.dev.platform_data = &msm_bus_8960_cpss_fpb_pdata; -#endif -} - -static struct msm_spi_platform_data msm8960_qup_spi_gsbi1_pdata = { - .max_clock_speed = 15060000, - .infinite_mode = 0xFFC0, -}; - -#ifdef CONFIG_USB_MSM_OTG_72K -static struct msm_otg_platform_data msm_otg_pdata; -#else -static int wr_phy_init_seq[] = { - 0x44, 0x80, /* set VBUS valid threshold - and disconnect valid threshold */ - 0x68, 0x81, /* update DC voltage level */ - 0x14, 0x82, /* set preemphasis and rise/fall time */ - 0x13, 0x83, /* set source impedance adjusment */ - -1}; - -static int liquid_v1_phy_init_seq[] = { - 0x44, 0x80,/* set VBUS valid threshold - and disconnect valid threshold */ - 0x6C, 0x81,/* update DC voltage level */ - 0x18, 0x82,/* set preemphasis and rise/fall time */ - 0x23, 0x83,/* set source impedance sdjusment */ - -1}; - -static int sglte_phy_init_seq[] = { - 0x44, 0x80, /* set VBUS valid threshold - and disconnect valid threshold */ - 0x6A, 0x81, /* update DC voltage level */ - 0x24, 0x82, /* set preemphasis and rise/fall time */ - 0x13, 0x83, /* set source impedance adjusment */ - -1}; - -#ifdef CONFIG_MSM_BUS_SCALING -/* Bandwidth requests (zero) if no vote placed */ -static struct msm_bus_vectors usb_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -/* Bus bandwidth requests in Bytes/sec */ -static struct msm_bus_vectors usb_max_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 60000000, /* At least 480Mbps on bus. */ - .ib = 960000000, /* MAX bursts rate */ - }, -}; - -static struct msm_bus_paths usb_bus_scale_usecases[] = { - { - ARRAY_SIZE(usb_init_vectors), - usb_init_vectors, - }, - { - ARRAY_SIZE(usb_max_vectors), - usb_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata usb_bus_scale_pdata = { - usb_bus_scale_usecases, - ARRAY_SIZE(usb_bus_scale_usecases), - .name = "usb", -}; -#endif - -#define MSM_MPM_PIN_USB1_OTGSESSVLD 40 - -static struct msm_otg_platform_data msm_otg_pdata = { - .mode = USB_OTG, - .otg_control = OTG_PMIC_CONTROL, - .phy_type = SNPS_28NM_INTEGRATED_PHY, - .pmic_id_irq = PM8921_USB_ID_IN_IRQ(PM8921_IRQ_BASE), - .power_budget = 750, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &usb_bus_scale_pdata, - .mpm_otgsessvld_int = MSM_MPM_PIN_USB1_OTGSESSVLD, -#endif -#ifdef CONFIG_FB_MSM_HDMI_MHL_8334 - .mhl_dev_name = "sii8334", -#endif -}; -#endif - -#ifdef CONFIG_USB_EHCI_MSM_HSIC -#define HSIC_HUB_RESET_GPIO 91 -static struct msm_hsic_host_platform_data msm_hsic_pdata = { - .strobe = 150, - .data = 151, - .phy_sof_workaround = true, -}; - -static struct smsc_hub_platform_data hsic_hub_pdata = { - .hub_reset = HSIC_HUB_RESET_GPIO, -}; -#else -static struct msm_hsic_host_platform_data msm_hsic_pdata; -static struct smsc_hub_platform_data hsic_hub_pdata; -#endif - -static struct platform_device smsc_hub_device = { - .name = "msm_smsc_hub", - .id = -1, - .dev = { - .platform_data = &hsic_hub_pdata, - }, -}; - -#define PID_MAGIC_ID 0x71432909 -#define SERIAL_NUM_MAGIC_ID 0x61945374 -#define SERIAL_NUMBER_LENGTH 127 -#define DLOAD_USB_BASE_ADD 0x2A03F0C8 - -struct magic_num_struct { - uint32_t pid; - uint32_t serial_num; -}; - -struct dload_struct { - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint16_t reserved4; - uint16_t pid; - char serial_number[SERIAL_NUMBER_LENGTH]; - uint16_t reserved5; - struct magic_num_struct magic_struct; -}; - -static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum) -{ - struct dload_struct __iomem *dload = 0; - - dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload)); - if (!dload) { - pr_err("%s: cannot remap I/O memory region: %08x\n", - __func__, DLOAD_USB_BASE_ADD); - return -ENXIO; - } - - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", - __func__, dload, pid, snum); - /* update pid */ - dload->magic_struct.pid = PID_MAGIC_ID; - dload->pid = pid; - - /* update serial number */ - dload->magic_struct.serial_num = 0; - if (!snum) { - memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH); - goto out; - } - - dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID; - strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH); -out: - iounmap(dload); - return 0; -} - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -static uint8_t spm_wfi_cmd_sequence[] __initdata = { - 0x03, 0x0f, -}; - -static uint8_t spm_retention_cmd_sequence[] __initdata = { - 0x00, 0x05, 0x03, 0x0D, - 0x0B, 0x00, 0x0f, -}; - -static uint8_t spm_retention_with_krait_v3_cmd_sequence[] __initdata = { - 0x42, 0x1B, 0x00, - 0x05, 0x03, 0x01, 0x0B, - 0x00, 0x42, 0x1B, - 0x0f, -}; - -static uint8_t spm_power_collapse_without_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x03, 0x01, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm[] __initdata = { - 0x00, 0x24, 0x54, 0x10, - 0x09, 0x07, 0x01, 0x0B, - 0x10, 0x54, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -/* 8960AB has a different command to assert apc_pdn */ -static uint8_t spm_power_collapse_without_rpm_krait_v3[] __initdata = { - 0x00, 0x24, 0x84, 0x10, - 0x09, 0x03, 0x01, - 0x10, 0x84, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm_krait_v3[] __initdata = { - 0x00, 0x24, 0x84, 0x10, - 0x09, 0x07, 0x01, 0x0B, - 0x10, 0x84, 0x30, 0x0C, - 0x24, 0x30, 0x0f, -}; - -static struct msm_spm_seq_entry msm_spm_boot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static struct msm_spm_seq_entry msm_spm_nonboot_cpu_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - - [1] = { - .mode = MSM_SPM_MODE_POWER_RETENTION, - .notify_rpm = false, - .cmd = spm_retention_cmd_sequence, - }, - - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x58589464, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00020000, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x03020004, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0084009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A4001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_boot_cpu_seq_list), - .modes = msm_spm_boot_cpu_seq_list, - }, - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F, -#if defined(CONFIG_MSM_AVS_HW) - .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x58589464, - .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00020000, -#endif - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C, - .vctl_timeout_us = 50, - .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list), - .modes = msm_spm_nonboot_cpu_seq_list, - }, -}; - -static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x03, 0x20, - 0x00, 0x0f, -}; - -static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = { - 0x00, 0x20, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x20, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0f, -}; -static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = { - 0x00, 0x10, 0x34, 0x64, - 0x48, 0x07, 0x48, 0x10, - 0x50, 0x64, 0x04, 0x34, - 0x50, 0x0F, -}; - -static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_L2_MODE_RETENTION, - .notify_rpm = false, - .cmd = l2_spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_L2_MODE_GDHS, - .notify_rpm = true, - .cmd = l2_spm_gdhs_cmd_sequence, - }, - [2] = { - .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = l2_spm_power_off_cmd_sequence, - }, -}; - -static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW_L2_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE, - .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020, - .modes = msm_spm_l2_seq_list, - .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list), - }, -}; - -#define HAP_SHIFT_LVL_OE_GPIO 47 -#define HAP_SHIFT_LVL_OE_GPIO_SGLTE 89 -#define PM_HAP_EN_GPIO PM8921_GPIO_PM_TO_SYS(33) -#define PM_HAP_LEN_GPIO PM8921_GPIO_PM_TO_SYS(20) - -static struct msm_xo_voter *xo_handle_d1; - -static int isa1200_power(int on) -{ - int rc = 0; - int hap_oe_gpio = HAP_SHIFT_LVL_OE_GPIO; - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - hap_oe_gpio = HAP_SHIFT_LVL_OE_GPIO_SGLTE; - - - gpio_set_value(hap_oe_gpio, !!on); - - rc = on ? msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_ON) : - msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_OFF); - if (rc < 0) { - pr_err("%s: failed to %svote for TCXO D1 buffer%d\n", - __func__, on ? "" : "de-", rc); - goto err_xo_vote; - } - - return 0; - -err_xo_vote: - gpio_set_value(hap_oe_gpio, !on); - return rc; -} - -static int isa1200_dev_setup(bool enable) -{ - int rc = 0; - int hap_oe_gpio = HAP_SHIFT_LVL_OE_GPIO; - - struct pm_gpio hap_gpio_config = { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .vin_sel = 2, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - }; - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - hap_oe_gpio = HAP_SHIFT_LVL_OE_GPIO_SGLTE; - - if (enable == true) { - rc = pm8xxx_gpio_config(PM_HAP_EN_GPIO, &hap_gpio_config); - if (rc) { - pr_err("%s: pm8921 gpio %d config failed(%d)\n", - __func__, PM_HAP_EN_GPIO, rc); - return rc; - } - - rc = pm8xxx_gpio_config(PM_HAP_LEN_GPIO, &hap_gpio_config); - if (rc) { - pr_err("%s: pm8921 gpio %d config failed(%d)\n", - __func__, PM_HAP_LEN_GPIO, rc); - return rc; - } - - rc = gpio_request(hap_oe_gpio, "hap_shft_lvl_oe"); - if (rc) { - pr_err("%s: unable to request gpio %d (%d)\n", - __func__, hap_oe_gpio, rc); - return rc; - } - - rc = gpio_direction_output(hap_oe_gpio, 0); - if (rc) { - pr_err("%s: Unable to set direction\n", __func__); - goto free_gpio; - } - - xo_handle_d1 = msm_xo_get(MSM_XO_TCXO_D1, "isa1200"); - if (IS_ERR(xo_handle_d1)) { - rc = PTR_ERR(xo_handle_d1); - pr_err("%s: failed to get the handle for D1(%d)\n", - __func__, rc); - goto gpio_set_dir; - } - } else { - gpio_free(hap_oe_gpio); - - msm_xo_put(xo_handle_d1); - } - - return 0; - -gpio_set_dir: - gpio_set_value(hap_oe_gpio, 0); -free_gpio: - gpio_free(hap_oe_gpio); - return rc; -} - -static struct isa1200_regulator isa1200_reg_data[] = { - { - .name = "vcc_i2c", - .min_uV = ISA_I2C_VTG_MIN_UV, - .max_uV = ISA_I2C_VTG_MAX_UV, - .load_uA = ISA_I2C_CURR_UA, - }, -}; - -static struct isa1200_platform_data isa1200_1_pdata = { - .name = "vibrator", - .dev_setup = isa1200_dev_setup, - .power_on = isa1200_power, - .hap_en_gpio = PM_HAP_EN_GPIO, - .hap_len_gpio = PM_HAP_LEN_GPIO, - .max_timeout = 15000, - .mode_ctrl = PWM_GEN_MODE, - .pwm_fd = { - .pwm_div = 256, - }, - .is_erm = false, - .smart_en = true, - .ext_clk_en = true, - .chip_en = 1, - .regulator_info = isa1200_reg_data, - .num_regulators = ARRAY_SIZE(isa1200_reg_data), -}; - -static struct i2c_board_info msm_isa1200_board_info[] __initdata = { - { - I2C_BOARD_INFO("isa1200_1", 0x90>>1), - }, -}; - -#define CYTTSP_TS_GPIO_IRQ 11 -#define CYTTSP_TS_SLEEP_GPIO 50 -#define CYTTSP_TS_RESOUT_N_GPIO 52 - -/*virtual key support */ -static ssize_t tma340_vkeys_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return snprintf(buf, 200, - __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":73:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":230:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":389:1120:97:97" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":544:1120:97:97" - "\n"); -} - -static struct kobj_attribute tma340_vkeys_attr = { - .attr = { - .mode = S_IRUGO, - }, - .show = &tma340_vkeys_show, -}; - -static struct attribute *tma340_properties_attrs[] = { - &tma340_vkeys_attr.attr, - NULL -}; - -static struct attribute_group tma340_properties_attr_group = { - .attrs = tma340_properties_attrs, -}; - - -static int cyttsp_platform_init(struct i2c_client *client) -{ - int rc = 0; - static struct kobject *tma340_properties_kobj; - - tma340_vkeys_attr.attr.name = "virtualkeys.cyttsp-i2c"; - tma340_properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (tma340_properties_kobj) - rc = sysfs_create_group(tma340_properties_kobj, - &tma340_properties_attr_group); - if (!tma340_properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", - __func__); - - return 0; -} - -static struct cyttsp_regulator regulator_data[] = { - { - .name = "vdd", - .min_uV = CY_TMA300_VTG_MIN_UV, - .max_uV = CY_TMA300_VTG_MAX_UV, - .hpm_load_uA = CY_TMA300_CURR_24HZ_UA, - .lpm_load_uA = CY_TMA300_SLEEP_CURR_UA, - }, - /* TODO: Remove after runtime PM is enabled in I2C driver */ - { - .name = "vcc_i2c", - .min_uV = CY_I2C_VTG_MIN_UV, - .max_uV = CY_I2C_VTG_MAX_UV, - .hpm_load_uA = CY_I2C_CURR_UA, - .lpm_load_uA = CY_I2C_SLEEP_CURR_UA, - }, -}; - -static struct cyttsp_platform_data cyttsp_pdata = { - .panel_maxx = 634, - .panel_maxy = 1166, - .disp_maxx = 616, - .disp_maxy = 1023, - .disp_minx = 0, - .disp_miny = 16, - .flags = 0x01, - .gen = CY_GEN3, /* or */ - .use_st = CY_USE_ST, - .use_mt = CY_USE_MT, - .use_hndshk = CY_SEND_HNDSHK, - .use_trk_id = CY_USE_TRACKING_ID, - .use_sleep = CY_USE_DEEP_SLEEP_SEL | CY_USE_LOW_POWER_SEL, - .use_gestures = CY_USE_GESTURES, - .fw_fname = "cyttsp_8960_cdp.hex", - /* activate up to 4 groups - * and set active distance - */ - .gest_set = CY_GEST_GRP1 | CY_GEST_GRP2 | - CY_GEST_GRP3 | CY_GEST_GRP4 | - CY_ACT_DIST, - .act_intrvl = 10, - .tch_tmout = 200, - .lp_intrvl = 30, - .sleep_gpio = CYTTSP_TS_SLEEP_GPIO, - .resout_gpio = CYTTSP_TS_RESOUT_N_GPIO, - .irq_gpio = CYTTSP_TS_GPIO_IRQ, - .regulator_info = regulator_data, - .num_regulators = ARRAY_SIZE(regulator_data), - .init = cyttsp_platform_init, - .correct_fw_ver = 9, -}; - -static struct i2c_board_info cyttsp_info[] __initdata = { - { - I2C_BOARD_INFO(CY_I2C_NAME, 0x24), - .platform_data = &cyttsp_pdata, -#ifndef CY_USE_TIMER - .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ), -#endif /* CY_USE_TIMER */ - }, -}; - -/* configuration data for mxt1386 */ -static const u8 mxt1386_config_data[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 11, 2, 0, 11, 11, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T7 Object */ - 100, 16, 50, - /* T8 Object */ - 8, 0, 0, 0, 0, 0, 8, 14, 50, 215, - /* T9 Object */ - 131, 0, 0, 26, 42, 0, 32, 63, 3, 5, - 0, 2, 1, 113, 10, 10, 8, 10, 255, 2, - 85, 5, 0, 0, 20, 20, 75, 25, 202, 29, - 10, 10, 45, 46, - /* T15 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, - /* T18 Object */ - 0, 0, - /* T22 Object */ - 5, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 0, 5, 8, 10, 13, 0, - /* T24 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 3, 0, 188, 52, 52, 33, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T27 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T28 Object */ - 0, 0, 0, 8, 12, 60, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T41 Object */ - 0, 0, 0, 0, 0, 0, - /* T43 Object */ - 0, 0, 0, 0, 0, 0, -}; - -/* configuration data for mxt1386e using V1.0 firmware */ -static const u8 mxt1386e_config_data_v1_0[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 12, 1, 0, 17, 1, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T7 Object */ - 100, 16, 50, - /* T8 Object */ - 25, 0, 20, 20, 0, 0, 20, 50, 0, 0, - /* T9 Object */ - 131, 0, 0, 26, 42, 0, 32, 80, 2, 5, - 0, 5, 5, 0, 10, 30, 10, 10, 255, 2, - 85, 5, 10, 10, 10, 10, 135, 55, 70, 40, - 10, 5, 0, 0, 0, - /* T18 Object */ - 0, 0, - /* T24 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 3, 0, 60, 115, 156, 99, - /* T27 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 2, 0, 255, 0, 255, 0, 0, 0, 0, 0, - /* T43 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T46 Object */ - 64, 0, 20, 20, 0, 0, 0, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 3, 64, 66, 0, - /* T48 Object */ - 31, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 48, 40, 0, 10, 10, 0, 0, 100, 10, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 52, 0, 12, 0, 17, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T56 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 99, 33, -}; - -/* configuration data for mxt1386e using V2.1 firmware */ -static const u8 mxt1386e_config_data_v2_1[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 12, 5, 0, 28, 8, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T7 Object */ - 32, 16, 50, - /* T8 Object */ - 25, 0, 20, 20, 0, 0, 20, 50, 0, 0, - /* T9 Object */ - 139, 0, 0, 26, 42, 0, 32, 80, 2, 5, - 0, 5, 5, 79, 10, 30, 10, 10, 255, 2, - 85, 5, 10, 10, 10, 10, 135, 55, 70, 40, - 10, 5, 0, 0, 0, - /* T18 Object */ - 0, 0, - /* T24 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 1, 0, 60, 115, 156, 99, - /* T27 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 0, 0, 255, 0, 255, 0, 0, 0, 0, 0, - /* T43 Object */ - 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, - 16, - /* T46 Object */ - 64, 0, 16, 16, 0, 0, 0, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 3, 64, 66, 0, - /* T48 Object */ - 1, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 48, 40, 0, 10, 10, 0, 0, 100, 10, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 52, 0, 12, 0, 17, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T56 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 99, 33, 0, 149, 24, 193, 255, 255, 255, - 255, -}; - -/* configuration data for mxt1386e on 3D SKU using V2.1 firmware */ -static const u8 mxt1386e_config_data_3d[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 13, 1, 0, 23, 2, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T7 Object */ - 100, 10, 50, - /* T8 Object */ - 25, 0, 20, 20, 0, 0, 0, 0, 0, 0, - /* T9 Object */ - 131, 0, 0, 26, 42, 0, 32, 80, 2, 5, - 0, 5, 5, 0, 10, 30, 10, 10, 175, 4, - 127, 7, 26, 21, 17, 19, 143, 35, 207, 40, - 20, 5, 54, 49, 0, - /* T18 Object */ - 0, 0, - /* T24 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T25 Object */ - 0, 0, 72, 113, 168, 97, - /* T27 Object */ - 0, 0, 0, 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T43 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, - /* T46 Object */ - 68, 0, 16, 16, 0, 0, 0, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 3, 64, 66, 0, - /* T48 Object */ - 31, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 32, 50, 0, 10, 10, 0, 0, 100, 10, 90, - 0, 0, 0, 0, 0, 0, 0, 10, 1, 30, - 52, 10, 5, 0, 33, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T56 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -#define MXT_TS_GPIO_IRQ 11 -#define MXT_TS_LDO_EN_GPIO 50 -#define MXT_TS_RESET_GPIO 52 - -static void mxt_init_hw_liquid(void) -{ - int rc; - - rc = gpio_request(MXT_TS_LDO_EN_GPIO, "mxt_ldo_en_gpio"); - if (rc) { - pr_err("%s: unable to request mxt_ldo_en_gpio [%d]\n", - __func__, MXT_TS_LDO_EN_GPIO); - return; - } - - rc = gpio_direction_output(MXT_TS_LDO_EN_GPIO, 1); - if (rc) { - pr_err("%s: unable to set_direction for mxt_ldo_en_gpio [%d]\n", - __func__, MXT_TS_LDO_EN_GPIO); - goto err_ldo_gpio_req; - } - - return; - -err_ldo_gpio_req: - gpio_free(MXT_TS_LDO_EN_GPIO); -} - -static struct mxt_config_info mxt_config_array_2d[] = { - { - .config = mxt1386_config_data, - .config_length = ARRAY_SIZE(mxt1386_config_data), - .family_id = 0xA0, - .variant_id = 0x0, - .version = 0x10, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386, - }, - { - .config = mxt1386e_config_data_v1_0, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v1_0), - .family_id = 0xA0, - .variant_id = 0x2, - .version = 0x10, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - .fw_name = "atmel_8960_liquid_v2_2_AA.hex", - }, - { - .config = mxt1386e_config_data_v2_1, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x21, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - .fw_name = "atmel_8960_liquid_v2_2_AA.hex", - }, - { - /* The config data for V2.2.AA is the same as for V2.1.AA */ - .config = mxt1386e_config_data_v2_1, - .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x22, - .build = 0xAA, - .bootldr_id = MXT_BOOTLOADER_ID_1386E, - }, -}; - -static struct mxt_platform_data mxt_platform_data_2d = { - .config_array = mxt_config_array_2d, - .config_array_size = ARRAY_SIZE(mxt_config_array_2d), - .panel_minx = 0, - .panel_maxx = 1365, - .panel_miny = 0, - .panel_maxy = 767, - .disp_minx = 0, - .disp_maxx = 1365, - .disp_miny = 0, - .disp_maxy = 767, - .irqflags = IRQF_TRIGGER_FALLING, - .i2c_pull_up = true, - .reset_gpio = MXT_TS_RESET_GPIO, - .irq_gpio = MXT_TS_GPIO_IRQ, -}; - -static struct mxt_config_info mxt_config_array_3d[] = { - { - .config = mxt1386e_config_data_3d, - .config_length = ARRAY_SIZE(mxt1386e_config_data_3d), - .family_id = 0xA0, - .variant_id = 0x7, - .version = 0x21, - .build = 0xAA, - }, -}; - -static struct mxt_platform_data mxt_platform_data_3d = { - .config_array = mxt_config_array_3d, - .config_array_size = ARRAY_SIZE(mxt_config_array_3d), - .panel_minx = 0, - .panel_maxx = 1919, - .panel_miny = 0, - .panel_maxy = 1199, - .disp_minx = 0, - .disp_maxx = 1919, - .disp_miny = 0, - .disp_maxy = 1199, - .irqflags = IRQF_TRIGGER_FALLING, - .i2c_pull_up = true, - .reset_gpio = MXT_TS_RESET_GPIO, - .irq_gpio = MXT_TS_GPIO_IRQ, -}; - -static struct i2c_board_info mxt_device_info[] __initdata = { - { - I2C_BOARD_INFO("atmel_mxt_ts", 0x5b), - .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ), - }, -}; - -static struct msm_mhl_platform_data mhl_platform_data = { - .irq = MSM_GPIO_TO_INT(4), - .gpio_mhl_int = MHL_GPIO_INT, - .gpio_mhl_reset = MHL_GPIO_RESET, - .gpio_mhl_power = 0, - .gpio_hdmi_mhl_mux = 0, -}; - -static struct i2c_board_info sii_device_info[] __initdata = { - { -#ifdef CONFIG_FB_MSM_HDMI_MHL_8334 - /* - * keeps SI 8334 as the default - * MHL TX - */ - I2C_BOARD_INFO("sii8334", 0x39), - .platform_data = &mhl_platform_data, -#endif -#ifdef CONFIG_FB_MSM_HDMI_MHL_9244 - I2C_BOARD_INFO("Sil-9244", 0x39), - .irq = MSM_GPIO_TO_INT(15), -#endif /* CONFIG_MSM_HDMI_MHL */ - .flags = I2C_CLIENT_WAKE, - }, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi3_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi10_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi12_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -static struct ks8851_pdata spi_eth_pdata = { - .irq_gpio = KS8851_IRQ_GPIO, - .rst_gpio = KS8851_RST_GPIO, -}; - -static struct spi_board_info spi_eth_info[] __initdata = { - { - .modalias = "ks8851", - .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO), - .max_speed_hz = 19200000, - .bus_num = 0, - .chip_select = 0, - .mode = SPI_MODE_0, - .platform_data = &spi_eth_pdata - }, -}; -static struct spi_board_info spi_board_info[] __initdata = { - { - .modalias = "dsi_novatek_3d_panel_spi", - .max_speed_hz = 10800000, - .bus_num = 0, - .chip_select = 1, - .mode = SPI_MODE_0, - }, -}; - -static struct platform_device msm_device_saw_core0 = { - .name = "saw-regulator", - .id = 0, - .dev = { - .platform_data = &msm_saw_regulator_pdata_s5, - }, -}; - -static struct platform_device msm_device_saw_core1 = { - .name = "saw-regulator", - .id = 1, - .dev = { - .platform_data = &msm_saw_regulator_pdata_s6, - }, -}; - -static struct tsens_platform_data msm_tsens_pdata = { - .slope = {910, 910, 910, 910, 910}, - .tsens_factor = 1000, - .hw_type = MSM_8960, - .tsens_num_sensor = 5, -}; - -static struct platform_device msm_tsens_device = { - .name = "tsens8960-tm", - .id = -1, -}; - -static struct msm_thermal_data msm_thermal_pdata = { - .sensor_id = 0, - .poll_ms = 250, - .limit_temp_degC = 60, - .temp_hysteresis_degC = 10, - .freq_step = 2, -}; - -#ifdef CONFIG_MSM_FAKE_BATTERY -static struct platform_device fish_battery_device = { - .name = "fish_battery", -}; -#endif - -#ifdef CONFIG_BATTERY_BCL -static struct platform_device battery_bcl_device = { - .name = "battery_current_limit", - .id = -1, -}; -#endif - -static struct platform_device msm8960_device_ext_5v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_MPP_PM_TO_SYS(7), - .dev = { - .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V], - }, -}; - -static struct platform_device msm8960_device_ext_l2_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 91, - .dev = { - .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_L2], - }, -}; - -static struct platform_device msm8960_device_ext_3p3v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_GPIO_PM_TO_SYS(17), - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_3P3V], - }, -}; - -static struct platform_device msm8960_device_ext_otg_sw_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8921_GPIO_PM_TO_SYS(42), - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_OTG_SW], - }, -}; - -static struct platform_device msm8960_device_rpm_regulator = { - .name = "rpm-regulator", - .id = -1, - .dev = { - .platform_data = &msm_rpm_regulator_pdata, - }, -}; -#ifdef CONFIG_SERIAL_MSM_HS -static int configure_uart_gpios(int on) -{ - int ret = 0, i; - int uart_gpios[] = {93, 94, 95, 96}; - - for (i = 0; i < ARRAY_SIZE(uart_gpios); i++) { - if (on) { - ret = gpio_request(uart_gpios[i], NULL); - if (ret) { - pr_err("%s: unable to request uart gpio[%d]\n", - __func__, uart_gpios[i]); - break; - } - } else { - gpio_free(uart_gpios[i]); - } - } - - if (ret && on && i) - for (; i >= 0; i--) - gpio_free(uart_gpios[i]); - return ret; -} - -static struct msm_serial_hs_platform_data msm_uart_dm9_pdata = { - .gpio_config = configure_uart_gpios, -}; - -static int configure_gsbi8_uart_gpios(int on) -{ - int ret = 0, i; - int uart_gpios[] = {34, 35, 36, 37}; - - for (i = 0; i < ARRAY_SIZE(uart_gpios); i++) { - if (on) { - ret = gpio_request(uart_gpios[i], NULL); - if (ret) { - pr_err("%s: unable to request uart gpio[%d]\n", - __func__, uart_gpios[i]); - break; - } - } else { - gpio_free(uart_gpios[i]); - } - } - - if (ret && on && i) - for (; i >= 0; i--) - gpio_free(uart_gpios[i]); - return ret; -} - -static struct msm_serial_hs_platform_data msm_uart_dm8_pdata = { - .gpio_config = configure_gsbi8_uart_gpios, -}; -#else -static struct msm_serial_hs_platform_data msm_uart_dm8_pdata; -static struct msm_serial_hs_platform_data msm_uart_dm9_pdata; -#endif - -#if defined(CONFIG_BT) && defined(CONFIG_BT_HCIUART_ATH3K) -enum WLANBT_STATUS { - WLANOFF_BTOFF = 1, - WLANOFF_BTON, - WLANON_BTOFF, - WLANON_BTON -}; - -static DEFINE_MUTEX(ath_wlanbt_mutex); -static int gpio_wlan_sys_rest_en = 26; -static int ath_wlanbt_status = WLANOFF_BTOFF; - -static int ath6kl_power_control(int on) -{ - int rc; - - if (on) { - rc = gpio_request(gpio_wlan_sys_rest_en, "wlan sys_rst_n"); - if (rc) { - pr_err("%s: unable to request gpio %d (%d)\n", - __func__, gpio_wlan_sys_rest_en, rc); - return rc; - } - rc = gpio_direction_output(gpio_wlan_sys_rest_en, 0); - msleep(200); - rc = gpio_direction_output(gpio_wlan_sys_rest_en, 1); - msleep(100); - } else { - gpio_set_value(gpio_wlan_sys_rest_en, 0); - rc = gpio_direction_input(gpio_wlan_sys_rest_en); - msleep(100); - gpio_free(gpio_wlan_sys_rest_en); - } - return 0; -}; - -static int ath6kl_wlan_power(int on) -{ - int ret = 0; - - mutex_lock(&ath_wlanbt_mutex); - if (on) { - if (ath_wlanbt_status == WLANOFF_BTOFF) { - ret = ath6kl_power_control(1); - ath_wlanbt_status = WLANON_BTOFF; - } else if (ath_wlanbt_status == WLANOFF_BTON) - ath_wlanbt_status = WLANON_BTON; - } else { - if (ath_wlanbt_status == WLANON_BTOFF) { - ret = ath6kl_power_control(0); - ath_wlanbt_status = WLANOFF_BTOFF; - } else if (ath_wlanbt_status == WLANON_BTON) - ath_wlanbt_status = WLANOFF_BTON; - } - mutex_unlock(&ath_wlanbt_mutex); - pr_debug("%s on= %d, wlan_status= %d\n", - __func__, on, ath_wlanbt_status); - return ret; -}; - -static struct wifi_platform_data ath6kl_wifi_control = { - .set_power = ath6kl_wlan_power, -}; - -static struct platform_device msm_wlan_power_device = { - .name = "ath6kl_power", - .dev = { - .platform_data = &ath6kl_wifi_control, - }, -}; - -static struct resource bluesleep_resources[] = { - { - .name = "gpio_host_wake", - .start = 27, - .end = 27, - .flags = IORESOURCE_IO, - }, - { - .name = "gpio_ext_wake", - .start = 29, - .end = 29, - .flags = IORESOURCE_IO, - }, - { - .name = "host_wake", - .start = MSM_GPIO_TO_INT(27), - .end = MSM_GPIO_TO_INT(27), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_bluesleep_device = { - .name = "bluesleep", - .id = -1, - .num_resources = ARRAY_SIZE(bluesleep_resources), - .resource = bluesleep_resources, -}; - -static struct platform_device msm_bt_power_device = { - .name = "bt_power", -}; - -static int gpio_bt_sys_rest_en = 28; - -static int bluetooth_power(int on) -{ - int rc; - - mutex_lock(&ath_wlanbt_mutex); - if (on) { - if (ath_wlanbt_status == WLANOFF_BTOFF) { - ath6kl_power_control(1); - ath_wlanbt_status = WLANOFF_BTON; - } else if (ath_wlanbt_status == WLANON_BTOFF) - ath_wlanbt_status = WLANON_BTON; - - rc = gpio_request(gpio_bt_sys_rest_en, "bt sys_rst_n"); - if (rc) { - pr_err("%s: unable to request gpio %d (%d)\n", - __func__, gpio_bt_sys_rest_en, rc); - mutex_unlock(&ath_wlanbt_mutex); - return rc; - } - rc = gpio_direction_output(gpio_bt_sys_rest_en, 0); - msleep(20); - rc = gpio_direction_output(gpio_bt_sys_rest_en, 1); - msleep(100); - } else { - gpio_set_value(gpio_bt_sys_rest_en, 0); - rc = gpio_direction_input(gpio_bt_sys_rest_en); - msleep(100); - gpio_free(gpio_bt_sys_rest_en); - - if (ath_wlanbt_status == WLANOFF_BTON) { - ath6kl_power_control(0); - ath_wlanbt_status = WLANOFF_BTOFF; - } else if (ath_wlanbt_status == WLANON_BTON) - ath_wlanbt_status = WLANON_BTOFF; - } - mutex_unlock(&ath_wlanbt_mutex); - pr_debug("%s on= %d, wlan_status= %d\n", - __func__, on, ath_wlanbt_status); - return 0; -}; - -static void __init bt_power_init(void) -{ - msm_bt_power_device.dev.platform_data = &bluetooth_power; - return; -}; -#else -#define bt_power_init(x) do {} while (0) -#endif - -static struct platform_device *common_devices[] __initdata = { - &msm8960_device_dmov, - &msm_device_smd, - &msm_device_uart_dm6, - &msm_device_saw_core0, - &msm_device_saw_core1, - &msm8960_device_ext_5v_vreg, - &msm8960_device_ssbi_pmic, - &msm8960_device_ext_otg_sw_vreg, - &msm8960_device_qup_spi_gsbi1, - &msm8960_device_qup_i2c_gsbi3, - &msm8960_device_qup_i2c_gsbi4, - &msm8960_device_qup_i2c_gsbi10, -#ifndef CONFIG_MSM_DSPS - &msm8960_device_qup_i2c_gsbi12, -#endif - &msm_slim_ctrl, - &msm_device_wcnss_wlan, -#if defined(CONFIG_BT) && defined(CONFIG_BT_HCIUART_ATH3K) - &msm_bluesleep_device, - &msm_bt_power_device, - &msm_wlan_power_device, -#endif -#if defined(CONFIG_QSEECOM) - &qseecom_device, -#endif -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &msm_device_sps, -#ifdef CONFIG_MSM_FAKE_BATTERY - &fish_battery_device, -#endif -#ifdef CONFIG_BATTERY_BCL - &battery_bcl_device, -#endif - &msm_device_bam_dmux, - &msm_fm_platform_init, -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) -#ifdef CONFIG_MSM_USE_TSIF1 - &msm_device_tsif[1], -#else - &msm_device_tsif[0], -#endif -#endif - &msm_device_tspp, -#ifdef CONFIG_HW_RANDOM_MSM - &msm_device_rng, -#endif -#ifdef CONFIG_ION_MSM - &msm8960_ion_dev, -#endif - &msm8960_rpm_device, - &msm8960_rpm_log_device, - &msm8960_rpm_stat_device, - &msm8960_rpm_master_stat_device, - &msm_device_tz_log, - &coresight_tpiu_device, - &coresight_etb_device, - &coresight_funnel_device, - &coresight_etm0_device, - &coresight_etm1_device, - &msm_device_dspcrashd_8960, - &msm8960_device_watchdog, - &msm8960_rtb_device, - &msm8960_device_cache_erp, - &msm8960_device_ebi1_ch0_erp, - &msm8960_device_ebi1_ch1_erp, - &msm8960_cache_dump_device, - &msm8960_iommu_domain_device, - &msm_tsens_device, - &msm8960_cpu_slp_status, -}; - -static struct platform_device *cdp_devices[] __initdata = { - &msm_8960_q6_lpass, - &msm_8960_riva, - &msm_pil_tzapps, - &msm_pil_dsps, - &msm_pil_vidc, - &msm8960_device_otg, - &msm8960_device_gadget_peripheral, - &msm_device_hsusb_host, - &android_usb_device, - &msm_pcm, - &msm_multi_ch_pcm, - &msm_lowlatency_pcm, - &msm_pcm_routing, - &msm_cpudai0, - &msm_cpudai1, - &msm8960_cpudai_slimbus_2_rx, - &msm8960_cpudai_slimbus_2_tx, - &msm_cpudai_hdmi_rx, - &msm_cpudai_bt_rx, - &msm_cpudai_bt_tx, - &msm_cpudai_fm_rx, - &msm_cpudai_fm_tx, - &msm_cpudai_auxpcm_rx, - &msm_cpudai_auxpcm_tx, - &msm_cpu_fe, - &msm_stub_codec, -#ifdef CONFIG_MSM_GEMINI - &msm8960_gemini_device, -#endif -#ifdef CONFIG_MSM_MERCURY - &msm8960_mercury_device, -#endif - &msm_voice, - &msm_voip, - &msm_lpa_pcm, - &msm_cpudai_afe_01_rx, - &msm_cpudai_afe_01_tx, - &msm_cpudai_afe_02_rx, - &msm_cpudai_afe_02_tx, - &msm_pcm_afe, - &msm_compr_dsp, - &msm_cpudai_incall_music_rx, - &msm_cpudai_incall_record_rx, - &msm_cpudai_incall_record_tx, - &msm_pcm_hostless, - &msm_bus_apps_fabric, - &msm_bus_sys_fabric, - &msm_bus_mm_fabric, - &msm_bus_sys_fpb, - &msm_bus_cpss_fpb, -}; - -static void __init msm8960_i2c_init(void) -{ - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - msm8960_i2c_qup_gsbi4_pdata.keep_ahb_clk_on = 1; - - msm8960_device_qup_i2c_gsbi4.dev.platform_data = - &msm8960_i2c_qup_gsbi4_pdata; - - msm8960_device_qup_i2c_gsbi3.dev.platform_data = - &msm8960_i2c_qup_gsbi3_pdata; - - msm8960_device_qup_i2c_gsbi10.dev.platform_data = - &msm8960_i2c_qup_gsbi10_pdata; - - msm8960_device_qup_i2c_gsbi12.dev.platform_data = - &msm8960_i2c_qup_gsbi12_pdata; -} - -static void __init msm8960_gfx_init(void) -{ - struct kgsl_device_platform_data *kgsl_3d0_pdata = - msm_kgsl_3d0.dev.platform_data; - uint32_t soc_platform_version = socinfo_get_version(); - - /* Fixup data that needs to change based on GPU ID */ - if (cpu_is_msm8960ab()) { - if (SOCINFO_VERSION_MINOR(soc_platform_version) == 0) - kgsl_3d0_pdata->chipid = ADRENO_CHIPID(3, 2, 1, 0); - else - kgsl_3d0_pdata->chipid = ADRENO_CHIPID(3, 2, 1, 1); - /* 8960PRO nominal clock rate is 320Mhz */ - kgsl_3d0_pdata->pwrlevel[1].gpu_freq = 320000000; -#ifdef CONFIG_MSM_BUS_SCALING - kgsl_3d0_pdata->bus_scale_table = &grp3d_bus_scale_pdata_ab; -#endif - - /* - * If this an A320 GPU device (MSM8960AB), then - * switch the resource table to 8960AB, to reflect the - * separate register and shader memory mapping used in A320. - */ - - msm_kgsl_3d0.num_resources = kgsl_num_resources_8960ab; - msm_kgsl_3d0.resource = kgsl_3d0_resources_8960ab; - } else { - kgsl_3d0_pdata->iommu_count = 1; - - if (SOCINFO_VERSION_MAJOR(soc_platform_version) == 1) { - kgsl_3d0_pdata->pwrlevel[0].gpu_freq = 320000000; - kgsl_3d0_pdata->pwrlevel[1].gpu_freq = 266667000; - } - if (SOCINFO_VERSION_MAJOR(soc_platform_version) >= 3) { - /* 8960v3 GPU registers returns 5 for patch release - * but it should be 6, so dummy up the chipid here - * based the platform type - */ - kgsl_3d0_pdata->chipid = ADRENO_CHIPID(2, 2, 0, 6); - } - } - - /* Register the 3D core */ - platform_device_register(&msm_kgsl_3d0); - - /* Register the 2D cores if we are not 8960PRO */ - if (!cpu_is_msm8960ab()) { - platform_device_register(&msm_kgsl_2d0); - platform_device_register(&msm_kgsl_2d1); - } -} - -static struct msm_rpmrs_level msm_rpmrs_levels[] = { - { - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1, 784, 180000, 100, - }, - - { - MSM_PM_SLEEP_MODE_RETENTION, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 415, 715, 340827, 475, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1300, 228, 1200000, 2000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE), - false, - 2000, 138, 1208400, 3200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 6000, 119, 1850300, 9000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE), - false, - 9200, 68, 2839200, 16400, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), - false, - 10300, 63, 3128000, 18200, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 18000, 10, 4602600, 27000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW), - false, - 20000, 2, 5752000, 32000, - }, -}; - - -static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000, - [MSM_RPMRS_VDD_MEM_MAX] = 1150000, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 500000, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 950000, - [MSM_RPMRS_VDD_DIG_MAX] = 1150000, - }, - .vdd_mask = 0x7FFFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_PM8921_S3_0, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_PM8921_S3_1, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8921_L24_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8921_L24_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_TZ, -}; - -#ifdef CONFIG_I2C -#define I2C_SURF 1 -#define I2C_FFA (1 << 1) -#define I2C_RUMI (1 << 2) -#define I2C_SIM (1 << 3) -#define I2C_FLUID (1 << 4) -#define I2C_LIQUID (1 << 5) - -struct i2c_registry { - u8 machs; - int bus; - struct i2c_board_info *info; - int len; -}; - -/* Sensors DSPS platform data */ -#ifdef CONFIG_MSM_DSPS -#define DSPS_PIL_GENERIC_NAME "dsps" -#endif /* CONFIG_MSM_DSPS */ - -static void __init msm8960_init_dsps(void) -{ -#ifdef CONFIG_MSM_DSPS - struct msm_dsps_platform_data *pdata = - msm_dsps_device.dev.platform_data; - pdata->pil_name = DSPS_PIL_GENERIC_NAME; - pdata->gpios = NULL; - pdata->gpios_num = 0; - - platform_device_register(&msm_dsps_device); -#endif /* CONFIG_MSM_DSPS */ -} - -static int hsic_peripheral_status = 1; -static DEFINE_MUTEX(hsic_status_lock); - -void peripheral_connect() -{ - mutex_lock(&hsic_status_lock); - if (hsic_peripheral_status) - goto out; - platform_device_add(&msm_device_hsic_host); - hsic_peripheral_status = 1; -out: - mutex_unlock(&hsic_status_lock); -} -EXPORT_SYMBOL(peripheral_connect); - -void peripheral_disconnect() -{ - mutex_lock(&hsic_status_lock); - if (!hsic_peripheral_status) - goto out; - platform_device_del(&msm_device_hsic_host); - hsic_peripheral_status = 0; -out: - mutex_unlock(&hsic_status_lock); -} -EXPORT_SYMBOL(peripheral_disconnect); - -static void __init msm8960_init_smsc_hub(void) -{ - uint32_t version = socinfo_get_version(); - - if (SOCINFO_VERSION_MAJOR(version) == 1) - return; - - if (machine_is_msm8960_liquid()) - platform_device_register(&smsc_hub_device); -} - -static void __init msm8960_init_hsic(void) -{ -#ifdef CONFIG_USB_EHCI_MSM_HSIC - uint32_t version = socinfo_get_version(); - - if (SOCINFO_VERSION_MAJOR(version) == 1) - return; - - if (machine_is_msm8960_liquid()) - platform_device_register(&msm_device_hsic_host); -#endif -} - -#ifdef CONFIG_ISL9519_CHARGER -static struct isl_platform_data isl_data __initdata = { - .valid_n_gpio = 0, /* Not required when notify-by-pmic */ - .chg_detection_config = NULL, /* Not required when notify-by-pmic */ - .max_system_voltage = 4200, - .min_system_voltage = 3200, - .chgcurrent = 1900, - .term_current = 0, - .input_current = 2048, -}; - -static struct i2c_board_info isl_charger_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("isl9519q", 0x9), - .irq = 0, /* Not required when notify-by-pmic */ - .platform_data = &isl_data, - }, -}; -#endif /* CONFIG_ISL9519_CHARGER */ - -static struct i2c_board_info liquid_io_expander_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1508q", 0x20), - .platform_data = &msm8960_sx150x_data[SX150X_LIQUID] - }, -}; - -static struct i2c_registry msm8960_i2c_devices[] __initdata = { -#ifdef CONFIG_ISL9519_CHARGER - { - I2C_LIQUID, - MSM_8960_GSBI10_QUP_I2C_BUS_ID, - isl_charger_i2c_info, - ARRAY_SIZE(isl_charger_i2c_info), - }, -#endif /* CONFIG_ISL9519_CHARGER */ - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_8960_GSBI3_QUP_I2C_BUS_ID, - cyttsp_info, - ARRAY_SIZE(cyttsp_info), - }, - { - I2C_LIQUID, - MSM_8960_GSBI3_QUP_I2C_BUS_ID, - mxt_device_info, - ARRAY_SIZE(mxt_device_info), - }, - { - I2C_SURF | I2C_FFA | I2C_LIQUID, - MSM_8960_GSBI10_QUP_I2C_BUS_ID, - sii_device_info, - ARRAY_SIZE(sii_device_info), - }, - { - I2C_LIQUID | I2C_FFA, - MSM_8960_GSBI10_QUP_I2C_BUS_ID, - msm_isa1200_board_info, - ARRAY_SIZE(msm_isa1200_board_info), - }, - { - I2C_LIQUID, - MSM_8960_GSBI10_QUP_I2C_BUS_ID, - liquid_io_expander_i2c_info, - ARRAY_SIZE(liquid_io_expander_i2c_info), - }, -}; -#endif /* CONFIG_I2C */ - -static void __init register_i2c_devices(void) -{ -#ifdef CONFIG_I2C - u8 mach_mask = 0; - int i; -#ifdef CONFIG_MSM_CAMERA - struct i2c_registry msm8960_camera_i2c_devices = { - I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI, - MSM_8960_GSBI4_QUP_I2C_BUS_ID, - msm8960_camera_board_info.board_info, - msm8960_camera_board_info.num_i2c_board_info, - }; -#endif - - /* Build the matching 'supported_machs' bitmask */ - if (machine_is_msm8960_cdp()) - mach_mask = I2C_SURF; - else if (machine_is_msm8960_fluid()) - mach_mask = I2C_FLUID; - else if (machine_is_msm8960_liquid()) - mach_mask = I2C_LIQUID; - else if (machine_is_msm8960_mtp()) - mach_mask = I2C_FFA; - else - pr_err("unmatched machine ID in register_i2c_devices\n"); - - if (machine_is_msm8960_liquid()) { - if (SOCINFO_VERSION_MAJOR(socinfo_get_platform_version()) == 3) - mxt_device_info[0].platform_data = - &mxt_platform_data_3d; - else - mxt_device_info[0].platform_data = - &mxt_platform_data_2d; - } - - /* Run the array and install devices as appropriate */ - for (i = 0; i < ARRAY_SIZE(msm8960_i2c_devices); ++i) { - if (msm8960_i2c_devices[i].machs & mach_mask) - i2c_register_board_info(msm8960_i2c_devices[i].bus, - msm8960_i2c_devices[i].info, - msm8960_i2c_devices[i].len); - } - - if (!mhl_platform_data.gpio_mhl_power) - pr_debug("mhl device configured for ext debug board\n"); - -#ifdef CONFIG_MSM_CAMERA - if (msm8960_camera_i2c_devices.machs & mach_mask) - i2c_register_board_info(msm8960_camera_i2c_devices.bus, - msm8960_camera_i2c_devices.info, - msm8960_camera_i2c_devices.len); -#endif -#endif -} - -static void __init msm8960_tsens_init(void) -{ - if (cpu_is_msm8960()) - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1) - return; - - msm_tsens_early_init(&msm_tsens_pdata); -} - -static void __init msm8960ab_update_krait_spm(void) -{ - int i; - - /* Update the SPM sequences for SPC and PC */ - for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) { - int j; - struct msm_spm_platform_data *pdata = &msm_spm_data[i]; - for (j = 0; j < pdata->num_modes; j++) { - if (pdata->modes[j].cmd == - spm_power_collapse_without_rpm) - pdata->modes[j].cmd = - spm_power_collapse_without_rpm_krait_v3; - else if (pdata->modes[j].cmd == - spm_power_collapse_with_rpm) - pdata->modes[j].cmd = - spm_power_collapse_with_rpm_krait_v3; - } - } -} - -static void __init msm8960ab_update_retention_spm(void) -{ - int i; - - /* Update the SPM sequences for krait retention on all cores */ - for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) { - int j; - struct msm_spm_platform_data *pdata = &msm_spm_data[i]; - for (j = 0; j < pdata->num_modes; j++) { - if (pdata->modes[j].cmd == - spm_retention_cmd_sequence) - pdata->modes[j].cmd = - spm_retention_with_krait_v3_cmd_sequence; - } - } -} - -static void __init msm8960_cdp_init(void) -{ - if (meminfo_init(SYS_MEMORY, SZ_256M) < 0) - pr_err("meminfo_init() failed!\n"); - - platform_device_register(&msm_gpio_device); - msm8960_tsens_init(); - msm_thermal_init(&msm_thermal_pdata); - BUG_ON(msm_rpm_init(&msm8960_rpm_data)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data)); - - regulator_suppress_info_printing(); - if (msm_xo_init()) - pr_err("Failed to initialize XO votes\n"); - configure_msm8960_power_grid(); - platform_device_register(&msm8960_device_rpm_regulator); - msm_clock_init(&msm8960_clock_init_data); - if (machine_is_msm8960_liquid()) - msm_otg_pdata.mhl_enable = true; - msm8960_device_otg.dev.platform_data = &msm_otg_pdata; - if (machine_is_msm8960_mtp() || machine_is_msm8960_fluid() || - machine_is_msm8960_cdp()) { - /* Due to availability of USB Switch in SGLTE Platform - * it requires different HSUSB PHY settings compare to - * 8960 MTP/CDP platform. - */ - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - msm_otg_pdata.phy_init_seq = sglte_phy_init_seq; - else - msm_otg_pdata.phy_init_seq = wr_phy_init_seq; - } else if (machine_is_msm8960_liquid()) { - msm_otg_pdata.phy_init_seq = - liquid_v1_phy_init_seq; - } - android_usb_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; - msm_device_hsic_host.dev.platform_data = &msm_hsic_pdata; - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 2 && - machine_is_msm8960_liquid()) - msm_device_hsic_host.dev.parent = &smsc_hub_device.dev; - msm8960_init_gpiomux(); - msm8960_device_qup_spi_gsbi1.dev.platform_data = - &msm8960_qup_spi_gsbi1_pdata; - spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); - if (socinfo_get_platform_subtype() != PLATFORM_SUBTYPE_SGLTE) - spi_register_board_info(spi_eth_info, ARRAY_SIZE(spi_eth_info)); - - msm8960_init_pmic(); - if (machine_is_msm8960_liquid() || (machine_is_msm8960_mtp() && - (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE || - cpu_is_msm8960ab()))) - msm_isa1200_board_info[0].platform_data = &isa1200_1_pdata; - msm8960_i2c_init(); - msm8960_gfx_init(); - - if (cpu_is_msm8960ab()) - msm8960ab_update_krait_spm(); - if (cpu_is_krait_v3()) { - struct msm_pm_init_data_type *pdata = - msm8960_pm_8x60.dev.platform_data; - pdata->retention_calls_tz = false; - msm8960ab_update_retention_spm(); - } - platform_device_register(&msm8960_pm_8x60); - - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); - msm_spm_l2_init(msm_spm_l2_data); - - msm8960_init_buses(); - if (cpu_is_msm8960ab()) { - platform_add_devices(msm8960ab_footswitch, - msm8960ab_num_footswitch); - } else { - platform_add_devices(msm8960_footswitch, - msm8960_num_footswitch); - } - if (machine_is_msm8960_liquid()) - platform_device_register(&msm8960_device_ext_3p3v_vreg); - if (machine_is_msm8960_cdp()) - platform_device_register(&msm8960_device_ext_l2_vreg); - - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) - platform_device_register(&msm8960_device_uart_gsbi8); - else - platform_device_register(&msm8960_device_uart_gsbi5); - - /* For 8960 Fusion 2.2 Primary IPC */ - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) { - msm_uart_dm9_pdata.wakeup_irq = gpio_to_irq(94); /* GSBI9(2) */ - msm_device_uart_dm9.dev.platform_data = &msm_uart_dm9_pdata; - platform_device_register(&msm_device_uart_dm9); - } - - /* For 8960 Standalone External Bluetooth Interface */ - if (socinfo_get_platform_subtype() != PLATFORM_SUBTYPE_SGLTE) { - msm_device_uart_dm8.dev.platform_data = &msm_uart_dm8_pdata; - platform_device_register(&msm_device_uart_dm8); - } - if (cpu_is_msm8960ab()) - platform_device_register(&msm8960ab_device_acpuclk); - else - platform_device_register(&msm8960_device_acpuclk); - platform_add_devices(common_devices, ARRAY_SIZE(common_devices)); - msm8960_add_vidc_device(); - - msm8960_pm8921_gpio_mpp_init(); - /* Don't add modem devices on APQ targets */ - if (socinfo_get_id() != 124) - platform_device_register(&msm_8960_q6_mss); - platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices)); - msm8960_init_smsc_hub(); - msm8960_init_hsic(); -#ifdef CONFIG_MSM_CAMERA - msm8960_init_cam(); -#endif - msm8960_init_mmc(); - if (machine_is_msm8960_liquid()) - mxt_init_hw_liquid(); - register_i2c_devices(); - msm8960_init_fb(); - slim_register_board_info(msm_slim_devices, - ARRAY_SIZE(msm_slim_devices)); - msm8960_init_dsps(); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - bt_power_init(); - if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE) { - mdm_sglte_device.dev.platform_data = &sglte_platform_data; - platform_device_register(&mdm_sglte_device); - } -} - -MACHINE_START(MSM8960_CDP, "QCT MSM8960 CDP") - .map_io = msm8960_map_io, - .reserve = msm8960_reserve, - .init_irq = msm8960_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8960_cdp_init, - .init_early = msm8960_allocate_memory_regions, - .init_very_early = msm8960_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8960_MTP, "QCT MSM8960 MTP") - .map_io = msm8960_map_io, - .reserve = msm8960_reserve, - .init_irq = msm8960_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8960_cdp_init, - .init_early = msm8960_allocate_memory_regions, - .init_very_early = msm8960_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8960_FLUID, "QCT MSM8960 FLUID") - .map_io = msm8960_map_io, - .reserve = msm8960_reserve, - .init_irq = msm8960_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8960_cdp_init, - .init_early = msm8960_allocate_memory_regions, - .init_very_early = msm8960_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END - -MACHINE_START(MSM8960_LIQUID, "QCT MSM8960 LIQUID") - .map_io = msm8960_map_io, - .reserve = msm8960_reserve, - .init_irq = msm8960_init_irq, - .init_time = msm_timer_init, - .init_machine = msm8960_cdp_init, - .init_early = msm8960_allocate_memory_regions, - .init_very_early = msm8960_early_memory, - .restart = msm_restart, - .smp = &msm8960_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-8960.h b/arch/arm/mach-msm/board-8960.h deleted file mode 100644 index 9c8d1ec745ee..000000000000 --- a/arch/arm/mach-msm/board-8960.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_MSM8960_H -#define __ARCH_ARM_MACH_MSM_BOARD_MSM8960_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Macros assume PMIC GPIOs and MPPs start at 1 */ -#define PM8921_GPIO_BASE NR_GPIO_IRQS -#define PM8921_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8921_GPIO_BASE) -#define PM8921_MPP_BASE (PM8921_GPIO_BASE + PM8921_NR_GPIOS) -#define PM8921_MPP_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8921_MPP_BASE) -#define PM8921_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS) - -extern struct pm8xxx_regulator_platform_data - msm_pm8921_regulator_pdata[] ; - -extern int msm_pm8921_regulator_pdata_len ; - -#define GPIO_VREG_ID_EXT_5V 0 -#define GPIO_VREG_ID_EXT_L2 1 -#define GPIO_VREG_ID_EXT_3P3V 2 -#define GPIO_VREG_ID_EXT_OTG_SW 3 - -extern struct gpio_regulator_platform_data - msm_gpio_regulator_pdata[] ; - -extern struct regulator_init_data msm_saw_regulator_pdata_s5; -extern struct regulator_init_data msm_saw_regulator_pdata_s6; - -extern struct rpm_regulator_platform_data msm_rpm_regulator_pdata ; - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) -enum { - GPIO_EXPANDER_IRQ_BASE = (PM8921_IRQ_BASE + PM8921_NR_IRQS), - GPIO_EXPANDER_GPIO_BASE = (PM8921_MPP_BASE + PM8921_NR_MPPS), - /* CAM Expander */ - GPIO_CAM_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE, - GPIO_CAM_GP_STROBE_READY = GPIO_CAM_EXPANDER_BASE, - GPIO_CAM_GP_AFBUSY, - GPIO_CAM_GP_STROBE_CE, - GPIO_CAM_GP_CAM1MP_XCLR, - GPIO_CAM_GP_CAMIF_RESET_N, - GPIO_CAM_GP_XMT_FLASH_INT, - GPIO_CAM_GP_LED_EN1, - GPIO_CAM_GP_LED_EN2, - GPIO_LIQUID_EXPANDER_BASE = GPIO_CAM_EXPANDER_BASE + 8, -}; -#endif - -enum { - SX150X_CAM, - SX150X_LIQUID, -}; - -#endif - -extern struct sx150x_platform_data msm8960_sx150x_data[]; -extern struct msm_camera_board_info msm8960_camera_board_info; - -void msm8960_init_cam(void); -void msm8960_init_fb(void); -void msm8960_init_pmic(void); -void msm8960_init_mmc(void); -int msm8960_init_gpiomux(void); -void __init configure_msm8960_power_grid(void); -unsigned char msm8960_hdmi_as_primary_selected(void); -void msm8960_allocate_fb_region(void); -void msm8960_set_display_params(char *prim_panel, char *ext_panel); -void msm8960_pm8921_gpio_mpp_init(void); -void msm8960_mdp_writeback(struct memtype_reserve *reserve_table); -#define MSM_8960_GSBI4_QUP_I2C_BUS_ID 4 -#define MSM_8960_GSBI3_QUP_I2C_BUS_ID 3 -#define MSM_8960_GSBI10_QUP_I2C_BUS_ID 10 - -extern struct msm_rtb_platform_data msm8960_rtb_pdata; -extern struct msm_cache_dump_platform_data msm8960_cache_dump_pdata; -extern void msm8960_add_vidc_device(void); diff --git a/arch/arm/mach-msm/board-9615-display.c b/arch/arm/mach-msm/board-9615-display.c deleted file mode 100644 index 4b355d0ce033..000000000000 --- a/arch/arm/mach-msm/board-9615-display.c +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-9615.h" - -/* prim = 240 x 320 x 4(bpp) x 2(pages) */ -#define MSM_FB_PRIM_BUF_SIZE roundup(240 * 320 * 4 * 2, 0x10000) -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE, 4096) - -#define GPIO_PIN_EBI2_LCD_A_D 21 -#define GPIO_PIN_EBI2_LCD_CS 22 -#define GPIO_PIN_EBI2_LCD_RS 24 - - -#ifdef CONFIG_FB_MSM - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_MEM, - } -}; - -static int msm_fb_detect_panel(const char *name) -{ - return 0; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev.platform_data = &msm_fb_pdata, -}; - -void __init mdm9615_allocate_fb_region(void) -{ - void *addr; - unsigned long size; - - size = MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); -} - - -static bool ebi2_power_init; -static int ebi2_panel_power(int on) -{ - static struct regulator *panel_power; - int rc; - - pr_debug("%s: on=%d\n", __func__, on); - - if (!ebi2_power_init) { - panel_power = regulator_get(&msm_ebi2_lcdc_device.dev, - "VDDI2"); - if (IS_ERR_OR_NULL(panel_power)) { - pr_err("could not get L14, rc = %ld\n", - PTR_ERR(panel_power)); - return -ENODEV; - } - - rc = regulator_set_voltage(panel_power, 2800000, 3800000); - if (rc) { - pr_err("set_voltage L14 failed, rc=%d\n", rc); - return -EINVAL; - } - - ebi2_power_init = true; - } - - if (on) { - rc = regulator_enable(panel_power); - if (rc) { - pr_err("enable L14 failed, rc=%d\n", rc); - return -ENODEV; - } - rc = gpio_request(GPIO_PIN_EBI2_LCD_A_D, "disp_a_d"); - if (rc) { - pr_err("request gpio EBI2_LCD_A_D failed, rc=%d\n", rc); - goto error1; - } - rc = gpio_request(GPIO_PIN_EBI2_LCD_CS, "disp_cs"); - if (rc) { - pr_err("request gpio EBI2_LCD_CS failed, rc=%d\n", rc); - goto error2; - } - rc = gpio_request(GPIO_PIN_EBI2_LCD_RS, "disp_rs"); - if (rc) { - pr_err("request gpio EBI2_LCD_RS failed, rc=%d\n", rc); - goto error3; - } - } else { - gpio_free(GPIO_PIN_EBI2_LCD_RS); - gpio_free(GPIO_PIN_EBI2_LCD_CS); - gpio_free(GPIO_PIN_EBI2_LCD_A_D); - - rc = regulator_disable(panel_power); - if (rc) { - pr_err("disable L14 failed, rc=%d\n", rc); - return -ENODEV; - } - } - - return 0; -error3: - gpio_free(GPIO_PIN_EBI2_LCD_CS); -error2: - gpio_free(GPIO_PIN_EBI2_LCD_A_D); -error1: - regulator_disable(panel_power); - return rc; - -} - -static struct lcdc_platform_data ebi2_lcdc_pdata = { - .lcdc_power_save = ebi2_panel_power, -}; - -static struct lvds_panel_platform_data ebi2_epson_s1d_pdata; - -static struct platform_device ebi2_epson_s1d_panel_device = { - .name = "ebi2_epson_s1d_qvga", - .id = 0, - .dev = { - .platform_data = &ebi2_epson_s1d_pdata, - } -}; - -void __init mdm9615_init_fb(void) -{ - platform_device_register(&msm_fb_device); - platform_device_register(&ebi2_epson_s1d_panel_device); - - msm_fb_register_device("ebi2_lcd", &ebi2_lcdc_pdata); -} -#endif diff --git a/arch/arm/mach-msm/board-9615-gpiomux.c b/arch/arm/mach-msm/board-9615-gpiomux.c deleted file mode 100644 index 402e7f4a44d3..000000000000 --- a/arch/arm/mach-msm/board-9615-gpiomux.c +++ /dev/null @@ -1,402 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include "board-9615.h" - -static struct gpiomux_setting ps_hold = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting slimbus = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_KEEPER, -}; - -static struct gpiomux_setting gsbi4 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi5 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi3 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi3_cs1_config = { - .func = GPIOMUX_FUNC_4, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -#ifdef CONFIG_LTC4088_CHARGER -static struct gpiomux_setting ltc4088_chg_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; -#endif - -static struct gpiomux_setting sdcc2_clk_actv_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc2_cmd_data_0_3_actv_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_suspend_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cdc_mclk = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -#ifdef CONFIG_FB_MSM_EBI2 -static struct gpiomux_setting ebi2_lcdc_a_d = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ebi2_lcdc_cs = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ebi2_lcdc_rs = { - .func = GPIOMUX_FUNC_3, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_DOWN, -}; -#endif - -static struct gpiomux_setting wlan_active_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting wlan_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_IN, -}; - -static struct gpiomux_setting tabla_reset = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct msm_gpiomux_config msm9615_audio_codec_configs[] __initdata = { - { - .gpio = 24, - .settings = { - [GPIOMUX_SUSPENDED] = &cdc_mclk, - }, - }, - { - .gpio = 84, /* SYS_RST_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &tabla_reset, - }, - } -}; - -static struct msm_gpiomux_config msm9615_sdcc2_configs[] __initdata = { - { - /* SDC2_DATA_0 */ - .gpio = 25, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* SDC2_DATA_1 */ - .gpio = 26, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_cmd_data_0_3_actv_cfg, - }, - }, - { - /* SDC2_DATA_2 */ - .gpio = 27, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* SDC2_DATA_3 */ - .gpio = 28, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* SDC2_CMD */ - .gpio = 29, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, - { - /* SDC2_CLK */ - .gpio = 30, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg, - }, - }, -}; - -struct msm_gpiomux_config msm9615_ps_hold_config[] __initdata = { - { - .gpio = 83, - .settings = { - [GPIOMUX_SUSPENDED] = &ps_hold, - }, - }, -}; - -static struct gpiomux_setting sd_card_det = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_IN, -}; - -struct msm_gpiomux_config sd_card_det_config[] __initdata = { - { - .gpio = 80, - .settings = { - [GPIOMUX_ACTIVE] = &sd_card_det, - [GPIOMUX_SUSPENDED] = &sd_card_det, - }, - }, -}; - -#ifdef CONFIG_LTC4088_CHARGER -static struct msm_gpiomux_config - msm9615_ltc4088_charger_config[] __initdata = { - { - .gpio = 4, - .settings = { - [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, - }, - }, - { - .gpio = 6, - .settings = { - [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, - }, - }, - { - .gpio = 7, - .settings = { - [GPIOMUX_SUSPENDED] = <c4088_chg_cfg, - }, - }, -}; -#endif - -struct msm_gpiomux_config msm9615_gsbi_configs[] __initdata = { - { - .gpio = 8, /* GSBI3 QUP SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3, - }, - }, - { - .gpio = 9, /* GSBI3 QUP SPI_CS_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3, - }, - }, - { - .gpio = 10, /* GSBI3 QUP SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3, - }, - }, - { - .gpio = 11, /* GSBI3 QUP SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3, - }, - }, - { - .gpio = 12, /* GSBI4 UART */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4, - }, - }, - { - .gpio = 13, /* GSBI4 UART */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4, - }, - }, - { - .gpio = 14, /* GSBI4 UART */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4, - }, - }, - { - .gpio = 15, /* GSBI4 UART */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi4, - }, - }, - { - .gpio = 16, /* GSBI5 I2C QUP SCL */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5, - [GPIOMUX_ACTIVE] = &gsbi5, - }, - }, - { - .gpio = 17, /* GSBI5 I2C QUP SDA */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi5, - }, - }, - { - /* GPIO 19 can be used for I2C/UART on GSBI5 */ - .gpio = 19, /* GSBI3 QUP SPI_CS_1 */ - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi3_cs1_config, - }, - }, -}; - -static struct msm_gpiomux_config msm9615_slimbus_configs[] __initdata = { - { - .gpio = 20, /* Slimbus data */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, - { - .gpio = 23, /* Slimbus clk */ - .settings = { - [GPIOMUX_SUSPENDED] = &slimbus, - }, - }, -}; - -#ifdef CONFIG_FB_MSM_EBI2 -static struct msm_gpiomux_config msm9615_ebi2_lcdc_configs[] __initdata = { - { - .gpio = 21, /* a_d */ - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_lcdc_a_d, - }, - }, - { - .gpio = 22, /* cs */ - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_lcdc_cs, - }, - }, - { - .gpio = 24, /* rs */ - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_lcdc_rs, - }, - }, -}; -#endif - -static struct msm_gpiomux_config msm9615_wlan_configs[] __initdata = { - { - .gpio = 21,/* WLAN_RESET_N */ - .settings = { - [GPIOMUX_ACTIVE] = &wlan_active_config, - [GPIOMUX_SUSPENDED] = &wlan_suspend_config, - }, - }, -}; - - -int __init msm9615_init_gpiomux(void) -{ - int rc; - - rc = msm_gpiomux_init(NR_GPIO_IRQS); - if (rc) { - pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc); - return rc; - } - msm_gpiomux_install(msm9615_gsbi_configs, - ARRAY_SIZE(msm9615_gsbi_configs)); - - msm_gpiomux_install(msm9615_slimbus_configs, - ARRAY_SIZE(msm9615_slimbus_configs)); - - msm_gpiomux_install(msm9615_ps_hold_config, - ARRAY_SIZE(msm9615_ps_hold_config)); - msm_gpiomux_install(sd_card_det_config, - ARRAY_SIZE(sd_card_det_config)); - msm_gpiomux_install(msm9615_sdcc2_configs, - ARRAY_SIZE(msm9615_sdcc2_configs)); -#ifdef CONFIG_LTC4088_CHARGER - msm_gpiomux_install(msm9615_ltc4088_charger_config, - ARRAY_SIZE(msm9615_ltc4088_charger_config)); -#endif - msm_gpiomux_install(msm9615_audio_codec_configs, - ARRAY_SIZE(msm9615_audio_codec_configs)); - - msm_gpiomux_install(msm9615_wlan_configs, - ARRAY_SIZE(msm9615_wlan_configs)); - -#ifdef CONFIG_FB_MSM_EBI2 - msm_gpiomux_install(msm9615_ebi2_lcdc_configs, - ARRAY_SIZE(msm9615_ebi2_lcdc_configs)); -#endif - - return 0; -} diff --git a/arch/arm/mach-msm/board-9615-regulator.c b/arch/arm/mach-msm/board-9615-regulator.c deleted file mode 100644 index 0b551155cede..000000000000 --- a/arch/arm/mach-msm/board-9615-regulator.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include "board-9615.h" - -#define VREG_CONSUMERS(_id) \ - static struct regulator_consumer_supply vreg_consumers_##_id[] - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -VREG_CONSUMERS(L2) = { - REGULATOR_SUPPLY("8018_l2", NULL), - REGULATOR_SUPPLY("HSUSB_1p8", "msm_otg"), -}; -VREG_CONSUMERS(L3) = { - REGULATOR_SUPPLY("8018_l3", NULL), -}; -VREG_CONSUMERS(L4) = { - REGULATOR_SUPPLY("8018_l4", NULL), - REGULATOR_SUPPLY("HSUSB_3p3", "msm_otg"), -}; -VREG_CONSUMERS(L5) = { - REGULATOR_SUPPLY("8018_l5", NULL), -}; -VREG_CONSUMERS(L6) = { - REGULATOR_SUPPLY("8018_l6", NULL), -}; -VREG_CONSUMERS(L7) = { - REGULATOR_SUPPLY("8018_l7", NULL), -}; -VREG_CONSUMERS(L8) = { - REGULATOR_SUPPLY("8018_l8", NULL), -}; -VREG_CONSUMERS(L9) = { - REGULATOR_SUPPLY("8018_l9", NULL), -}; -VREG_CONSUMERS(L10) = { - REGULATOR_SUPPLY("8018_l10", NULL), -}; -VREG_CONSUMERS(L11) = { - REGULATOR_SUPPLY("8018_l11", NULL), -}; -VREG_CONSUMERS(L12) = { - REGULATOR_SUPPLY("8018_l12", NULL), -}; -VREG_CONSUMERS(L13) = { - REGULATOR_SUPPLY("8018_l13", NULL), - REGULATOR_SUPPLY("sdc_vdd_io", "msm_sdcc.1"), -}; -VREG_CONSUMERS(L14) = { - REGULATOR_SUPPLY("8018_l14", NULL), - REGULATOR_SUPPLY("VDDI2", "ebi2_lcd.0"), -}; -VREG_CONSUMERS(S1) = { - REGULATOR_SUPPLY("8018_s1", NULL), -}; -VREG_CONSUMERS(S2) = { - REGULATOR_SUPPLY("8018_s2", NULL), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDD_CDC_D", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "0-000d"), - REGULATOR_SUPPLY("VDDD_CDC_D", "tabla top level"), - REGULATOR_SUPPLY("CDC_VDDA_A_1P2V", "tabla top level"), -}; -VREG_CONSUMERS(S3) = { - REGULATOR_SUPPLY("8018_s3", NULL), - REGULATOR_SUPPLY("wlan_vreg", "wlan_ar6000_pm_dev"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla2x-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla-slim"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla2x-slim"), - REGULATOR_SUPPLY("VDDIO_CDC", "tabla top level"), - REGULATOR_SUPPLY("CDC_VDD_CP", "tabla top level"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "tabla top level"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "tabla top level"), - REGULATOR_SUPPLY("VDDIO_CDC", "0-000d"), - REGULATOR_SUPPLY("CDC_VDD_CP", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_TX", "0-000d"), - REGULATOR_SUPPLY("CDC_VDDA_RX", "0-000d"), -}; -VREG_CONSUMERS(S4) = { - REGULATOR_SUPPLY("8018_s4", NULL), -}; -VREG_CONSUMERS(S5) = { - REGULATOR_SUPPLY("8018_s5", NULL), -}; -VREG_CONSUMERS(LVS1) = { - REGULATOR_SUPPLY("8018_lvs1", NULL), -}; -VREG_CONSUMERS(EXT_2P95V) = { - REGULATOR_SUPPLY("ext_2p95v", NULL), - REGULATOR_SUPPLY("sdc_vdd", "msm_sdcc.1"), -}; -VREG_CONSUMERS(VDD_DIG_CORNER) = { - REGULATOR_SUPPLY("hsusb_vdd_dig", "msm_otg"), - REGULATOR_SUPPLY("hsic_vdd_dig", "msm_hsic_peripheral"), - REGULATOR_SUPPLY("hsic_vdd_dig", "msm_hsic_host"), -}; - -#define PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, _modes, _ops, \ - _apply_uV, _pull_down, _always_on, _supply_regulator, \ - _system_uA, _enable_time, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pull_down_enable = _pull_down, \ - .system_uA = _system_uA, \ - .enable_time = _enable_time, \ - } - -#define PM8XXX_LDO(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_NLDO1200(_id, _name, _always_on, _pull_down, _min_uV, \ - _max_uV, _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_SMPS(_id, _name, _always_on, _pull_down, _min_uV, _max_uV, \ - _enable_time, _supply_regulator, _system_uA, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _pull_down, _always_on, \ - _supply_regulator, _system_uA, _enable_time, _reg_id) - -#define PM8XXX_VS(_id, _name, _always_on, _pull_down, _enable_time, \ - _supply_regulator, _reg_id) \ - PM8XXX_VREG_INIT(_id, _name, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, \ - _pull_down, _always_on, _supply_regulator, 0, _enable_time, \ - _reg_id) - -/* Pin control initialization */ -#define PM8XXX_PC(_id, _name, _always_on, _pin_fn, _pin_ctrl, \ - _supply_regulator, _reg_id) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - .name = _name, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = _reg_id, \ - .pin_fn = PM8XXX_VREG_PIN_FN_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define RPM_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, _default_uV, \ - _peak_uA, _avg_uA, _pull_down, _pin_ctrl, _freq, _pin_fn, \ - _force_mode, _sleep_set_force_mode, _power_mode, _state, \ - _sleep_selectable, _always_on, _supply_regulator, _system_uA) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8018_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .power_mode = _power_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - .system_uA = _system_uA, \ - } - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _init_peak_uA) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _init_peak_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator, _system_uA, _freq) \ - RPM_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL \ - | REGULATOR_MODE_IDLE, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE \ - | REGULATOR_CHANGE_DRMS, 0, _max_uV, _system_uA, 0, _pd, \ - RPM_VREG_PIN_CTRL_NONE, _freq, RPM_VREG_PIN_FN_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, _system_uA) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable, _supply_regulator) \ - RPM_INIT(_id, 0, 0, 0, REGULATOR_CHANGE_STATUS, 0, 0, 1000, 1000, _pd, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -#define RPM_CORNER(_id, _always_on, _sleep_selectable, _min_uV, _max_uV, \ - _supply_regulator) \ - RPM_INIT(_id, _min_uV, _max_uV, 0, REGULATOR_CHANGE_VOLTAGE \ - | REGULATOR_CHANGE_STATUS, 0, _max_uV, 0, 0, 0, \ - RPM_VREG_PIN_CTRL_NONE, NONE, RPM_VREG_PIN_FN_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, \ - RPM_VREG_FORCE_MODE_9615_NONE, RPM_VREG_POWER_MODE_9615_PWM, \ - RPM_VREG_STATE_OFF, _sleep_selectable, _always_on, \ - _supply_regulator, 0) - -/* Pin control initialization */ -#define RPM_PC_INIT(_id, _always_on, _pin_fn, _pin_ctrl, _supply_regulator) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - .supply_regulator = _supply_regulator, \ - }, \ - .id = RPM_VREG_ID_PM8018_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_9615_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -#define GPIO_VREG_INIT(_id, _reg_name, _gpio_label, _gpio) \ - [GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - }, \ - .regulator_name = _reg_name, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -/* GPIO regulator constraints */ -struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] = { - GPIO_VREG_INIT(EXT_2P95V, "ext_2p95v", "ext_2p95_en", 18), -}; - -/* PM8018 regulator constraints */ -struct pm8xxx_regulator_platform_data -msm_pm8018_regulator_pdata[] = { -}; - -static struct rpm_regulator_init_data -msm_rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV supply sys_uA freq */ - RPM_SMPS(S1, 0, 1, 1, 500000, 1150000, NULL, 100000, 1p60), - RPM_SMPS(S2, 0, 1, 0, 1225000, 1300000, NULL, 0, 1p60), - RPM_SMPS(S3, 1, 1, 0, 1800000, 1800000, NULL, 100000, 1p60), - RPM_SMPS(S4, 0, 1, 0, 2100000, 2200000, NULL, 0, 1p60), - RPM_SMPS(S5, 1, 1, 0, 1350000, 1350000, NULL, 100000, 1p60), - - /* ID a_on pd ss min_uV max_uV supply sys_uA init_ip */ - RPM_LDO(L2, 1, 1, 0, 1800000, 1800000, NULL, 0, 10000), - RPM_LDO(L3, 1, 1, 0, 1800000, 1800000, NULL, 0, 0), - RPM_LDO(L4, 0, 1, 0, 3075000, 3075000, NULL, 0, 0), - RPM_LDO(L5, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - RPM_LDO(L6, 0, 1, 0, 1800000, 2850000, NULL, 0, 0), - RPM_LDO(L7, 0, 1, 0, 1850000, 1900000, "8018_s4", 0, 0), - RPM_LDO(L8, 0, 1, 0, 1200000, 1200000, "8018_s3", 0, 0), - RPM_LDO(L9, 0, 1, 1, 750000, 1150000, "8018_s5", 10000, 10000), - RPM_LDO(L10, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0), - RPM_LDO(L11, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0), - RPM_LDO(L12, 0, 1, 0, 1050000, 1050000, "8018_s5", 0, 0), - RPM_LDO(L13, 0, 1, 0, 1850000, 2950000, NULL, 0, 0), - RPM_LDO(L14, 0, 1, 0, 2850000, 2850000, NULL, 0, 0), - - /* ID a_on pd ss supply */ - RPM_VS(LVS1, 0, 1, 0, "8018_s3"), - - /* ID a_on ss min_corner max_corner supply */ - RPM_CORNER(VDD_DIG_CORNER, 0, 1, RPM_VREG_CORNER_NONE, - RPM_VREG_CORNER_HIGH, NULL), -}; - -int msm_pm8018_regulator_pdata_len = - ARRAY_SIZE(msm_pm8018_regulator_pdata); - -struct rpm_regulator_platform_data -msm_rpm_regulator_9615_pdata = { - .init_data = msm_rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(msm_rpm_regulator_init_data), - .version = RPM_VREG_VERSION_9615, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8018_L9, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8018_VDD_DIG_CORNER, -}; diff --git a/arch/arm/mach-msm/board-9615-storage.c b/arch/arm/mach-msm/board-9615-storage.c deleted file mode 100644 index 1a05c084f1de..000000000000 --- a/arch/arm/mach-msm/board-9615-storage.c +++ /dev/null @@ -1,228 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" - -#include "board-9615.h" -#include "board-storage-common-a.h" - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT) \ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)) - -#define GPIO_SDC1_HW_DET 80 -#define GPIO_SDC2_DAT1_WAKEUP 26 - -/* MDM9x15 has 2 SDCC controllers */ -enum sdcc_controllers { - SDCC1, - SDCC2, - MAX_SDCC_CONTROLLER -}; - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -/* All SDCC controllers requires VDD/VCC voltage */ -static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : External card slot connected */ - [SDCC1] = { - .name = "sdc_vdd", - /* - * This is a gpio-regulator and does not support - * regulator_set_voltage and regulator_set_optimum_mode - */ - .high_vol_level = 2950000, - .low_vol_level = 2950000, - .hpm_uA = 600000, /* 600mA */ - } -}; - -/* All SDCC controllers may require voting for VDD PAD voltage */ -static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : External card slot connected */ - [SDCC1] = { - .name = "sdc_vdd_io", - .high_vol_level = 2950000, - .low_vol_level = 1850000, - .always_on = true, - .lpm_sup = true, - /* Max. Active current required is 16 mA */ - .hpm_uA = 16000, - /* - * Sleep current required is ~300 uA. But min. vote can be - * in terms of mA (min. 1 mA). So let's vote for 2 mA - * during sleep. - */ - .lpm_uA = 2000, - } -}; - -static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = { - /* SDCC1 : External card slot connected */ - [SDCC1] = { - .vdd_data = &mmc_vdd_reg_data[SDCC1], - .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1], - } -}; - -/* SDC1 pad data */ -static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA} -}; - -static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = { - {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = { - {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL}, - {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_DOWN}, - {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_DOWN} -}; - -static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_pull_on_cfg, - .off = sdc1_pad_pull_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg) - }, -}; - -static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .on = sdc1_pad_drv_on_cfg, - .off = sdc1_pad_drv_off_cfg, - .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg) - }, -}; - -static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = { - [SDCC1] = { - .pull = &mmc_pad_pull_data[SDCC1], - .drv = &mmc_pad_drv_data[SDCC1] - }, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - -static struct msm_mmc_gpio sdc2_gpio_cfg[] = { - {25, "sdc2_dat_0"}, - {26, "sdc2_dat_1"}, - {27, "sdc2_dat_2"}, - {28, "sdc2_dat_3"}, - {29, "sdc2_cmd"}, - {30, "sdc2_clk"}, -}; - -static struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = { - [SDCC2] = { - .gpio = sdc2_gpio_cfg, - .size = ARRAY_SIZE(sdc2_gpio_cfg), - }, -}; -#endif - -static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = { -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - [SDCC1] = { - .is_gpio = 0, - .pad_data = &mmc_pad_data[SDCC1], - }, -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - [SDCC2] = { - .is_gpio = 1, - .gpio_data = &mmc_gpio_data[SDCC2], - }, -#endif -}; - -#define MSM_MPM_PIN_SDC1_DAT1 17 - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static unsigned int sdc1_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc1_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates), - .vreg_data = &mmc_slot_vreg_data[SDCC1], - .pin_data = &mmc_slot_pin_data[SDCC1], - .status_gpio = GPIO_SDC1_HW_DET, - .status_irq = MSM_GPIO_TO_INT(GPIO_SDC1_HW_DET), - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - .xpc_cap = 1, - .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_MAX_CURRENT_400), - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *msm9615_sdc1_pdata = &sdc1_data; -#else -static struct mmc_platform_data *msm9615_sdc1_pdata; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static unsigned int sdc2_sup_clk_rates[] = { - 400000, 24000000, 48000000 -}; - -static struct mmc_platform_data sdc2_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sup_clk_table = sdc2_sup_clk_rates, - .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates), - .pin_data = &mmc_slot_pin_data[SDCC2], - .sdiowakeup_irq = MSM_GPIO_TO_INT(GPIO_SDC2_DAT1_WAKEUP), - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -static struct mmc_platform_data *msm9615_sdc2_pdata = &sdc2_data; -#else -static struct mmc_platform_data *msm9615_sdc2_pdata; -#endif - -void __init msm9615_init_mmc(void) -{ - if (msm9615_sdc1_pdata) - /* SDC1: External card slot for SD/MMC cards */ - msm_add_sdcc(1, msm9615_sdc1_pdata); - - if (msm9615_sdc2_pdata) - /* SDC2: External card slot used for WLAN */ - msm_add_sdcc(2, msm9615_sdc2_pdata); -} -#else -void __init msm9615_init_mmc(void) -{ -} -#endif diff --git a/arch/arm/mach-msm/board-9615.c b/arch/arm/mach-msm/board-9615.c deleted file mode 100644 index dd20458ad445..000000000000 --- a/arch/arm/mach-msm/board-9615.c +++ /dev/null @@ -1,1142 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#ifdef CONFIG_WCD9310_CODEC -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "timer.h" -#include "devices.h" -#include "board-9615.h" -#include "pm.h" -#include "clock.h" -#include "pm-boot.h" -#include -#include "ci13xxx_udc.h" - -#ifdef CONFIG_ION_MSM -#define MSM_ION_AUDIO_SIZE 0xAF000 -#define MSM_ION_HEAP_NUM 3 -#define MSM_KERNEL_EBI_SIZE 0x51000 - -static struct memtype_reserve msm9615_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static int msm9615_paddr_to_memtype(unsigned int paddr) -{ - return MEMTYPE_EBI1; -} - -static struct ion_co_heap_pdata co_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; - -static struct ion_platform_heap msm9615_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, - { - .id = ION_IOMMU_HEAP_ID, - .type = ION_HEAP_TYPE_IOMMU, - .name = ION_IOMMU_HEAP_NAME, - }, - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .size = MSM_ION_AUDIO_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_ion_pdata, - }, -}; - -static struct ion_platform_data ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = msm9615_heaps, -}; - -static struct platform_device ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &ion_pdata }, -}; - -static void __init reserve_ion_memory(void) -{ - msm9615_reserve_table[MEMTYPE_EBI1].size += MSM_ION_AUDIO_SIZE; -} - -static void __init msm9615_calculate_reserve_sizes(void) -{ - reserve_ion_memory(); - msm9615_reserve_table[MEMTYPE_EBI1].size += MSM_KERNEL_EBI_SIZE; -} - -static struct reserve_info msm9615_reserve_info __initdata = { - .memtype_reserve_table = msm9615_reserve_table, - .calculate_reserve_sizes = msm9615_calculate_reserve_sizes, - .paddr_to_memtype = msm9615_paddr_to_memtype, -}; -#endif - -struct pm8xxx_gpio_init { - unsigned gpio; - struct pm_gpio config; -}; - -struct pm8xxx_mpp_init { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8018_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \ - _func, _inv, _disable) \ -{ \ - .gpio = PM8018_GPIO_PM_TO_SYS(_gpio), \ - .config = { \ - .direction = _dir, \ - .output_buffer = _buf, \ - .output_value = _val, \ - .pull = _pull, \ - .vin_sel = _vin, \ - .out_strength = _out_strength, \ - .function = _func, \ - .inv_int_pol = _inv, \ - .disable_pin = _disable, \ - } \ -} - -#define PM8018_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8018_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8018_GPIO_DISABLE(_gpio) \ - PM8018_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM8018_GPIO_VIN_S3, \ - 0, 0, 0, 1) - -#define PM8018_GPIO_OUTPUT(_gpio, _val, _strength) \ - PM8018_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM8018_GPIO_VIN_S3, \ - PM_GPIO_STRENGTH_##_strength, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8018_GPIO_INPUT(_gpio, _pull) \ - PM8018_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \ - _pull, PM8018_GPIO_VIN_S3, \ - PM_GPIO_STRENGTH_NO, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -#define PM8018_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \ - PM8018_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, PM8018_GPIO_VIN_S3, \ - PM_GPIO_STRENGTH_HIGH, \ - _func, 0, 0) - -#define PM8018_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \ - PM8018_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \ - PM_GPIO_PULL_NO, _vin, \ - PM_GPIO_STRENGTH_HIGH, \ - PM_GPIO_FUNC_NORMAL, 0, 0) - -/* Initial PM8018 GPIO configurations */ -static struct pm8xxx_gpio_init pm8018_gpios[] __initdata = { - PM8018_GPIO_OUTPUT(2, 0, HIGH), /* EXT_LDO_EN_WLAN */ - PM8018_GPIO_OUTPUT(6, 0, LOW), /* WLAN_CLK_PWR_REQ */ -}; - -/* Initial PM8018 MPP configurations */ -static struct pm8xxx_mpp_init pm8018_mpps[] __initdata = { -}; - -void __init msm9615_pm8xxx_gpio_mpp_init(void) -{ - int i, rc; - - for (i = 0; i < ARRAY_SIZE(pm8018_gpios); i++) { - rc = pm8xxx_gpio_config(pm8018_gpios[i].gpio, - &pm8018_gpios[i].config); - if (rc) { - pr_err("%s: pm8018_gpio_config: rc=%d\n", __func__, rc); - break; - } - } - - for (i = 0; i < ARRAY_SIZE(pm8018_mpps); i++) { - rc = pm8xxx_mpp_config(pm8018_mpps[i].mpp, - &pm8018_mpps[i].config); - if (rc) { - pr_err("%s: pm8018_mpp_config: rc=%d\n", __func__, rc); - break; - } - } -} - -static struct pm8xxx_adc_amux pm8018_adc_channels_data[] = { - {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - /* AMUX8 is used to read either Batt_id/Batt_therm. - * Current configuration is to support Batt_id. If clients - * want to read the Batt_therm, the scaling function needs to be - * updated to use ADC_SCALE_BATT_THERM instead of ADC_SCALE_DEFAULT. - * E.g. - * {"batt_therm", CHANNEL_BATT_ID_THERM, CHAN_PATH_SCALING1, - * AMUX_RSV2, ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM}, - */ - {"batt_id", CHANNEL_BATT_ID_THERM, CHAN_PATH_SCALING1, - AMUX_RSV2, ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM}, - {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT}, - {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1, - ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM}, - {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0, - ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM}, -}; - -static struct pm8xxx_adc_properties pm8018_adc_data = { - .adc_vdd_reference = 1800, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, -}; - -static struct pm8xxx_adc_platform_data pm8018_adc_pdata = { - .adc_channel = pm8018_adc_channels_data, - .adc_num_board_channel = ARRAY_SIZE(pm8018_adc_channels_data), - .adc_prop = &pm8018_adc_data, -}; - -static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = { - .irq_base = PM8018_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(87), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = { - .gpio_base = PM8018_GPIO_PM_TO_SYS(1), -}; - -static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = { - .mpp_base = PM8018_MPP_PM_TO_SYS(1), -}; - -static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata = { - .rtc_write_enable = false, - .rtc_alarm_powerup = false, -}; - -static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = { - .pull_up = 1, - .kpd_trigger_delay_us = 15625, - .wakeup = 1, -}; - -static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = { - .priority = 0, -}; - -#define PM8018_LED_KB_MAX_CURRENT 20 /* I = 20mA */ -#define PM8XXX_LED_PWM_PERIOD_US 1000 - -/** - * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be - * driven using PWM feature. - */ -#define PM8XXX_PWM_CHANNEL_NONE -1 - -static struct led_info pm8018_led_info[] = { - [0] = { - .name = "led:kb", - }, -}; - -static struct led_platform_data pm8018_led_core_pdata = { - .num_leds = ARRAY_SIZE(pm8018_led_info), - .leds = pm8018_led_info, -}; - -static struct pm8xxx_led_config pm8018_led_configs[] = { - [0] = { - .id = PM8XXX_ID_LED_KB_LIGHT, - .mode = PM8XXX_LED_MODE_PWM3, - .max_current = PM8018_LED_KB_MAX_CURRENT, - .pwm_channel = 2, - .pwm_period_us = PM8XXX_LED_PWM_PERIOD_US, - }, -}; - -static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = { - .led_core = &pm8018_led_core_pdata, - .configs = pm8018_led_configs, - .num_configs = ARRAY_SIZE(pm8018_led_configs), -}; - -#ifdef CONFIG_LTC4088_CHARGER -static struct ltc4088_charger_platform_data ltc4088_chg_pdata = { - .gpio_mode_select_d0 = 7, - .gpio_mode_select_d1 = 6, - .gpio_mode_select_d2 = 4, -}; -#endif - -static struct pm8018_platform_data pm8018_platform_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .rtc_pdata = &pm8xxx_rtc_pdata, - .pwrkey_pdata = &pm8xxx_pwrkey_pdata, - .misc_pdata = &pm8xxx_misc_pdata, - .regulator_pdatas = msm_pm8018_regulator_pdata, - .adc_pdata = &pm8018_adc_pdata, - .leds_pdata = &pm8xxx_leds_pdata, -}; - -static struct msm_ssbi_platform_data msm9615_ssbi_pm8018_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = PM8018_CORE_DEV_NAME, - .platform_data = &pm8018_platform_data, - }, -}; - -static struct platform_device msm9615_device_rpm_regulator = { - .name = "rpm-regulator", - .id = -1, - .dev = { - .platform_data = &msm_rpm_regulator_9615_pdata, - }, -}; - -static struct platform_device msm9615_device_ext_2p95v_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 18, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_2P95V], - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_REMAP_BOOT_ADDR, - .v_addr = MSM_APCS_GLB_BASE + 0x24, -}; - -static void __init msm9615_init_buses(void) -{ -#ifdef CONFIG_MSM_BUS_SCALING - msm_bus_rpm_set_mt_mask(); - msm_bus_9615_sys_fabric_pdata.rpm_enabled = 1; - msm_bus_9615_sys_fabric.dev.platform_data = - &msm_bus_9615_sys_fabric_pdata; - msm_bus_def_fab.dev.platform_data = &msm_bus_9615_def_fab_pdata; -#endif -} - -#ifdef CONFIG_WCD9310_CODEC - -#define TABLA_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS) - -/* - * MDM9x15 I2S. - */ -static struct wcd9xxx_pdata wcd9xxx_i2c_platform_data = { - .irq = MSM_GPIO_TO_INT(85), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_TABLA_IRQS, - .reset_gpio = 84, - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1225000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1225000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - } - }, -}; - -static struct i2c_board_info wcd9xxx_device_info[] __initdata = { - { - I2C_BOARD_INFO("tabla top level", TABLA_I2C_SLAVE_ADDR), - .platform_data = &wcd9xxx_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla analog", TABLA_ANALOG_I2C_SLAVE_ADDR), - .platform_data = &wcd9xxx_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla digital1", TABLA_DIGITAL1_I2C_SLAVE_ADDR), - .platform_data = &wcd9xxx_i2c_platform_data, - }, - { - I2C_BOARD_INFO("tabla digital2", TABLA_DIGITAL2_I2C_SLAVE_ADDR), - .platform_data = &wcd9xxx_i2c_platform_data, - }, -}; - -/* - * MDM9x15 I2S. - */ - -/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement - * 4 micbiases are used to power various analog and digital - * microphones operating at 1800 mV. Technically, all micbiases - * can source from single cfilter since all microphones operate - * at the same voltage level. The arrangement below is to make - * sure all cfilters are exercised. LDO_H regulator ouput level - * does not need to be as high as 2.85V. It is choosen for - * microphone sensitivity purpose. - */ - -static struct wcd9xxx_pdata tabla20_platform_data = { - .slimbus_slave_device = { - .name = "tabla-slave", - .e_addr = {0, 0, 0x60, 0, 0x17, 2}, - }, - .irq = MSM_GPIO_TO_INT(85), - .irq_base = TABLA_INTERRUPT_BASE, - .num_irqs = NR_WCD9XXX_IRQS, - .reset_gpio = 84, - .micbias = { - .ldoh_v = TABLA_LDOH_2P85_V, - .cfilt1_mv = 1800, - .cfilt2_mv = 1800, - .cfilt3_mv = 1800, - .bias1_cfilt_sel = TABLA_CFILT1_SEL, - .bias2_cfilt_sel = TABLA_CFILT2_SEL, - .bias3_cfilt_sel = TABLA_CFILT3_SEL, - .bias4_cfilt_sel = TABLA_CFILT3_SEL, - }, - .regulator = { - { - .name = "CDC_VDD_CP", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX, - }, - { - .name = "CDC_VDDA_RX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX, - }, - { - .name = "CDC_VDDA_TX", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX, - }, - { - .name = "VDDIO_CDC", - .min_uV = 1800000, - .max_uV = 1800000, - .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX, - }, - { - .name = "VDDD_CDC_D", - .min_uV = 1225000, - .max_uV = 1225000, - .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX, - }, - { - .name = "CDC_VDDA_A_1P2V", - .min_uV = 1225000, - .max_uV = 1225000, - .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX, - }, - }, -}; - -static struct slim_device msm_slim_tabla20 = { - .name = "tabla2x-slim", - .e_addr = {0, 1, 0x60, 0, 0x17, 2}, - .dev = { - .platform_data = &tabla20_platform_data, - }, -}; -#endif - -static struct i2c_registry msm9615_i2c_devices[] __initdata = { -#ifdef CONFIG_WCD9310_CODEC - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_9615_GSBI5_QUP_I2C_BUS_ID, - wcd9xxx_device_info, - ARRAY_SIZE(wcd9xxx_device_info), - }, -#endif -}; - -static struct slim_boardinfo msm_slim_devices[] = { - /* add slimbus slaves as needed */ -#ifdef CONFIG_WCD9310_CODEC - { - .bus_num = 1, - .slim_slave = &msm_slim_tabla20, - }, -#endif -}; - -static struct msm_spi_platform_data msm9615_qup_spi_gsbi3_pdata = { - .max_clock_speed = 24000000, -}; - -static struct msm_i2c_platform_data msm9615_i2c_qup_gsbi5_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, -}; - -#define USB_5V_EN 3 -#define PM_USB_5V_EN PM8018_GPIO_PM_TO_SYS(USB_5V_EN) - -static int msm_hsusb_vbus_power(bool on) -{ - int rc; - struct pm_gpio usb_vbus = { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .vin_sel = 2, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }; - - usb_vbus.output_value = on; - - rc = pm8xxx_gpio_config(PM_USB_5V_EN, &usb_vbus); - if (rc) - pr_err("failed to config usb_5v_en gpio\n"); - - return rc; -} - -static int shelby_phy_init_seq[] = { - 0x44, 0x80,/* set VBUS valid threshold and - disconnect valid threshold */ - 0x68, 0x81, /* update DC voltage level */ - 0x24, 0x82,/* set preemphasis and rise/fall time */ - 0x13, 0x83,/* set source impedance adjustment */ - -1}; - -#define USB_BAM_PHY_BASE 0x12502000 -#define HSIC_BAM_PHY_BASE 0x12542000 -#define A2_BAM_PHY_BASE 0x124C2000 -static struct usb_bam_pipe_connect msm_usb_bam_connections[] = { - { - .name = "hsusb-a2-out-0", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 0, - .src_phy_addr = USB_BAM_PHY_BASE, - .src_pipe_index = 11, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 0, - .data_fifo_base_offset = 0x1100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x1700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsusb-a2-in-0", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 0, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 1, - .dst_phy_addr = USB_BAM_PHY_BASE, - .dst_pipe_index = 10, - .data_fifo_base_offset = 0xa00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x1000, - .desc_fifo_size = 0x100, - }, - { - .name = "hsusb-a2-out-1", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 1, - .src_phy_addr = USB_BAM_PHY_BASE, - .src_pipe_index = 13, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 2, - .data_fifo_base_offset = 0x2100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x2700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsusb-a2-in-1", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 1, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 3, - .dst_phy_addr = USB_BAM_PHY_BASE, - .dst_pipe_index = 12, - .data_fifo_base_offset = 0x1a00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x2000, - .desc_fifo_size = 0x100, - }, - { - .name = "hsusb-a2-out-2", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 2, - .src_phy_addr = USB_BAM_PHY_BASE, - .src_pipe_index = 15, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 4, - .data_fifo_base_offset = 0x3100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x3700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsusb-a2-in-2", - .bam_type = HSUSB_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 2, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 5, - .dst_phy_addr = USB_BAM_PHY_BASE, - .dst_pipe_index = 14, - .data_fifo_base_offset = 0x2a00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x3000, - .desc_fifo_size = 0x100, - }, - { - .name = "hsic-a2-out-0", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 0, - .src_phy_addr = HSIC_BAM_PHY_BASE, - .src_pipe_index = 1, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 0, - .data_fifo_base_offset = 0x1100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x1700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsic-a2-in-0", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 0, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 1, - .dst_phy_addr = HSIC_BAM_PHY_BASE, - .dst_pipe_index = 0, - .data_fifo_base_offset = 0xa00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x1000, - .desc_fifo_size = 0x100, - }, - { - .name = "hsic-a2-out-1", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 1, - .src_phy_addr = HSIC_BAM_PHY_BASE, - .src_pipe_index = 3, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 2, - .data_fifo_base_offset = 0x2100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x2700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsic-a2-in-1", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 1, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 3, - .dst_phy_addr = HSIC_BAM_PHY_BASE, - .dst_pipe_index = 2, - .data_fifo_base_offset = 0x1a00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x2000, - .desc_fifo_size = 0x100, - }, - { - .name = "hsic-a2-out-2", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = USB_TO_PEER_PERIPHERAL, - .pipe_num = 2, - .src_phy_addr = HSIC_BAM_PHY_BASE, - .src_pipe_index = 5, - .dst_phy_addr = A2_BAM_PHY_BASE, - .dst_pipe_index = 4, - .data_fifo_base_offset = 0x3100, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x3700, - .desc_fifo_size = 0x300, - }, - { - .name = "hsic-a2-in-2", - .bam_type = HSIC_BAM, - .peer_bam = A2_P_BAM, - .dir = PEER_PERIPHERAL_TO_USB, - .pipe_num = 2, - .src_phy_addr = A2_BAM_PHY_BASE, - .src_pipe_index = 5, - .dst_phy_addr = HSIC_BAM_PHY_BASE, - .dst_pipe_index = 4, - .data_fifo_base_offset = 0x2a00, - .data_fifo_size = 0x600, - .desc_fifo_base_offset = 0x3000, - .desc_fifo_size = 0x100, - } -}; - -static struct msm_usb_bam_platform_data msm_usb_bam_pdata = { - .connections = &msm_usb_bam_connections[0], - .max_connections = sizeof(msm_usb_bam_connections) / - sizeof(struct usb_bam_pipe_connect), - .usb_bam_num_pipes = 16, -}; - -static struct msm_otg_platform_data msm_otg_pdata = { - .mode = USB_OTG, - .otg_control = OTG_PHY_CONTROL, - .phy_type = SNPS_28NM_INTEGRATED_PHY, - .vbus_power = msm_hsusb_vbus_power, - .disable_reset_on_disconnect = true, - .enable_lpm_on_dev_suspend = true, - .core_clk_always_on_workaround = true, - .delay_lpm_on_disconnect = true, - .rw_during_lpm_workaround = true, -}; - - -static struct ci13xxx_platform_data msm_peripheral_pdata = { - .usb_core_id = 0, -}; - -static struct msm_hsic_peripheral_platform_data - msm_hsic_peripheral_pdata_private = { - .core_clk_always_on_workaround = true, -}; - -static struct ci13xxx_platform_data msm_hsic_peripheral_pdata = { - .usb_core_id = 1, - .prv_data = &msm_hsic_peripheral_pdata_private, -}; - -static struct msm_hsic_host_platform_data msm_hsic_pdata = { - .phy_sof_workaround = true, -}; - -#define PID_MAGIC_ID 0x71432909 -#define SERIAL_NUM_MAGIC_ID 0x61945374 -#define SERIAL_NUMBER_LENGTH 127 -#define DLOAD_USB_BASE_ADD 0x2B0000C8 - -struct magic_num_struct { - uint32_t pid; - uint32_t serial_num; -}; - -struct dload_struct { - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint16_t reserved4; - uint16_t pid; - char serial_number[SERIAL_NUMBER_LENGTH]; - uint16_t reserved5; - struct magic_num_struct magic_struct; -}; - -static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum) -{ - struct dload_struct __iomem *dload = 0; - - dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload)); - if (!dload) { - pr_err("%s: cannot remap I/O memory region: %08x\n", - __func__, DLOAD_USB_BASE_ADD); - return -ENXIO; - } - - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", - __func__, dload, pid, snum); - /* update pid */ - dload->magic_struct.pid = PID_MAGIC_ID; - dload->pid = pid; - - /* update serial number */ - dload->magic_struct.serial_num = 0; - if (!snum) { - memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH); - goto out; - } - - dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID; - strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH); -out: - iounmap(dload); - return 0; -} - -static struct platform_device msm_wlan_ar6000_pm_device = { - .name = "wlan_ar6000_pm_dev", - .id = -1, -}; - -static int __init msm9615_init_ar6000pm(void) -{ - return platform_device_register(&msm_wlan_ar6000_pm_device); -} - -#ifdef CONFIG_LTC4088_CHARGER -static struct platform_device msm_device_charger = { - .name = LTC4088_CHARGER_DEV_NAME, - .id = -1, - .dev = { - .platform_data = <c4088_chg_pdata, - }, -}; -#endif - -static struct tsens_platform_data msm_tsens_pdata = { - .tsens_factor = 1000, - .hw_type = MDM_9615, - .tsens_num_sensor = 5, - .slope = {1176, 1162, 1162, 1149, 1176}, -}; - -static struct platform_device msm_tsens_device = { - .name = "tsens8960-tm", - .id = -1, -}; - -static struct platform_device *common_devices[] = { - &msm9615_device_acpuclk, - &msm9615_device_dmov, - &msm_device_smd, -#ifdef CONFIG_LTC4088_CHARGER - &msm_device_charger, -#endif - &msm_9615_q6_lpass, - &msm_9615_q6_mss, - &msm_device_otg, - &msm_device_hsic_peripheral, - &msm_device_gadget_peripheral, - &msm_device_hsusb_host, - &msm_device_hsic_host, - &msm_device_usb_bam, - &msm_android_usb_device, -#ifdef CONFIG_USB_CI13XXX_MSM_HSIC - &msm_android_usb_hsic_device, -#endif - &msm9615_device_uart_gsbi4, - &msm9615_device_ext_2p95v_vreg, - &msm9615_device_ssbi_pmic1, - &msm9615_device_qup_i2c_gsbi5, - &msm9615_device_qup_spi_gsbi3, - &msm_device_sps, - &msm9615_slim_ctrl, - &msm_device_nand, - &msm_device_bam_dmux, - &msm9615_rpm_device, -#ifdef CONFIG_HW_RANDOM_MSM - &msm_device_rng, -#endif -#ifdef CONFIG_ION_MSM - &ion_dev, -#endif - - &msm_pcm, - &msm_multi_ch_pcm, - &msm_pcm_routing, - &msm_cpudai0, - &msm_cpudai1, - &msm_cpudai_bt_rx, - &msm_cpudai_bt_tx, - &msm_cpu_fe, - &msm_stub_codec, - &msm_voice, - &msm_dtmf, - &msm_host_pcm_voice, - &msm_voip, - &msm_i2s_cpudai0, - &msm_i2s_cpudai1, - &msm_i2s_cpudai4, - &msm_i2s_cpudai5, - &msm_pcm_hostless, - &msm_cpudai_afe_01_rx, - &msm_cpudai_afe_01_tx, - &msm_cpudai_afe_02_rx, - &msm_cpudai_afe_02_tx, - &msm_pcm_afe, - &msm_cpudai_auxpcm_rx, - &msm_cpudai_auxpcm_tx, - &msm_cpudai_sec_auxpcm_rx, - &msm_cpudai_sec_auxpcm_tx, - &msm_cpudai_stub, - &msm_cpudai_incall_music_rx, - &msm_cpudai_incall_record_rx, - &msm_cpudai_incall_record_tx, - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &msm9615_qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &msm9615_qcedev_device, -#endif - &msm9615_device_watchdog, - &msm_bus_9615_sys_fabric, - &msm_bus_def_fab, - &msm9615_rpm_log_device, - &msm9615_rpm_stat_device, - &msm9615_rpm_master_stat_device, - &msm_tsens_device, - &msm9615_pm_8x60, -}; - -static void __init msm9615_i2c_init(void) -{ - u8 mach_mask = 0; - int i; - /* Mask is hardcoded to SURF (CDP). - * works on MTP with same configuration. - */ - mach_mask = I2C_SURF; - if (machine_is_msm9615_cdp()) - mach_mask = I2C_SURF; - else if (machine_is_msm9615_mtp()) - mach_mask = I2C_FFA; - else - pr_err("unmatched machine ID in register_i2c_devices\n"); - msm9615_device_qup_i2c_gsbi5.dev.platform_data = - &msm9615_i2c_qup_gsbi5_pdata; - for (i = 0; i < ARRAY_SIZE(msm9615_i2c_devices); ++i) { - if (msm9615_i2c_devices[i].machs & mach_mask) { - i2c_register_board_info(msm9615_i2c_devices[i].bus, - msm9615_i2c_devices[i].info, - msm9615_i2c_devices[i].len); - } - } -} - -static void __init msm9615_reserve(void) -{ -#ifdef CONFIG_ION_MSM - reserve_info = &msm9615_reserve_info; - msm_reserve(); -#endif -} - -static void __init msm9615_common_init(void) -{ - struct android_usb_platform_data *android_pdata = - msm_android_usb_device.dev.platform_data; - struct android_usb_platform_data *android_hsic_pdata = - msm_android_usb_hsic_device.dev.platform_data; - - msm9615_device_init(); - platform_device_register(&msm_gpio_device); - msm9615_init_gpiomux(); - msm9615_i2c_init(); - regulator_suppress_info_printing(); - platform_device_register(&msm9615_device_rpm_regulator); - msm_xo_init(); - msm_clock_init(&msm9615_clock_init_data); - msm9615_init_buses(); - msm9615_device_qup_spi_gsbi3.dev.platform_data = - &msm9615_qup_spi_gsbi3_pdata; - msm9615_device_ssbi_pmic1.dev.platform_data = - &msm9615_ssbi_pm8018_pdata; - pm8018_platform_data.num_regulators = msm_pm8018_regulator_pdata_len; - - msm_device_otg.dev.platform_data = &msm_otg_pdata; - msm_otg_pdata.phy_init_seq = shelby_phy_init_seq; - msm_device_gadget_peripheral.dev.platform_data = - &msm_peripheral_pdata; - msm_device_hsic_peripheral.dev.platform_data = - &msm_hsic_peripheral_pdata; - msm_device_hsic_host.dev.platform_data = &msm_hsic_pdata; - msm_device_usb_bam.dev.platform_data = &msm_usb_bam_pdata; - platform_add_devices(common_devices, ARRAY_SIZE(common_devices)); - msm9615_pm8xxx_gpio_mpp_init(); - - /* Ensure ar6000pm device is registered before MMC/SDC */ - msm9615_init_ar6000pm(); - - msm9615_init_mmc(); - slim_register_board_info(msm_slim_devices, - ARRAY_SIZE(msm_slim_devices)); - - android_pdata->update_pid_and_serial_num = - usb_diag_update_pid_and_serial_num; - android_hsic_pdata->update_pid_and_serial_num = - usb_diag_update_pid_and_serial_num; - - msm_pm_boot_pdata.p_addr = allocate_contiguous_ebi_nomap(SZ_8, SZ_64K); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - msm_tsens_early_init(&msm_tsens_pdata); -} - -static void __init msm9615_cdp_init(void) -{ - msm9615_common_init(); -#ifdef CONFIG_FB_MSM - mdm9615_init_fb(); -#endif -} - -static void __init msm9615_mtp_init(void) -{ - msm9615_common_init(); -} - -#ifdef CONFIG_FB_MSM -static void __init mdm9615_allocate_memory_regions(void) -{ - mdm9615_allocate_fb_region(); -} -#endif - -MACHINE_START(MSM9615_CDP, "QCT MSM9615 CDP") - .map_io = msm9615_map_io, - .init_irq = msm9615_init_irq, - .timer = &msm_timer, - .init_machine = msm9615_cdp_init, - .reserve = msm9615_reserve, -#ifdef CONFIG_FB_MSM - .init_early = mdm9615_allocate_memory_regions, -#endif - .restart = msm_restart, -MACHINE_END - -MACHINE_START(MSM9615_MTP, "QCT MSM9615 MTP") - .map_io = msm9615_map_io, - .init_irq = msm9615_init_irq, - .timer = &msm_timer, - .init_machine = msm9615_mtp_init, - .reserve = msm9615_reserve, - .restart = msm_restart, -MACHINE_END diff --git a/arch/arm/mach-msm/board-9615.h b/arch/arm/mach-msm/board-9615.h deleted file mode 100644 index 44e560dfa545..000000000000 --- a/arch/arm/mach-msm/board-9615.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_9615_H -#define __ARCH_ARM_MACH_MSM_BOARD_9615_H - -#include -#include -#include - -/* - * MDM9x15 I2S. - */ -#ifdef CONFIG_I2C -#define I2C_SURF 1 -#define I2C_FFA (1 << 1) -#define I2C_RUMI (1 << 2) -#define I2C_SIM (1 << 3) -#define I2C_FLUID (1 << 4) -#define I2C_LIQUID (1 << 5) - -struct i2c_registry { - u8 machs; - int bus; - struct i2c_board_info *info; - int len; -}; -#endif -/* Tabla slave address for I2C */ -#define TABLA_I2C_SLAVE_ADDR 0x0d -#define TABLA_ANALOG_I2C_SLAVE_ADDR 0x77 -#define TABLA_DIGITAL1_I2C_SLAVE_ADDR 0x66 -#define TABLA_DIGITAL2_I2C_SLAVE_ADDR 0x55 -#define MSM_9615_GSBI5_QUP_I2C_BUS_ID 0 -/* - * MDM9x15 I2S. - */ - -/* Macros assume PMIC GPIOs and MPPs start at 1 */ -#define PM8018_GPIO_BASE NR_GPIO_IRQS -#define PM8018_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8018_GPIO_BASE) -#define PM8018_MPP_BASE (PM8018_GPIO_BASE + PM8018_NR_GPIOS) -#define PM8018_MPP_PM_TO_SYS(pm_gpio) (pm_gpio - 1 + PM8018_MPP_BASE) -#define PM8018_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS) -#define PM8018_MPP_IRQ_BASE (PM8018_IRQ_BASE + NR_GPIO_IRQS) - -extern struct pm8xxx_regulator_platform_data - msm_pm8018_regulator_pdata[] ; - -extern int msm_pm8018_regulator_pdata_len ; - -extern struct rpm_regulator_platform_data -msm_rpm_regulator_9615_pdata ; - -#define GPIO_VREG_ID_EXT_2P95V 0 - -extern struct gpio_regulator_platform_data msm_gpio_regulator_pdata[]; -uint32_t msm9615_rpm_get_swfi_latency(void); -int msm9615_init_gpiomux(void); -void msm9615_init_mmc(void); -void mdm9615_allocate_fb_region(void); -void mdm9615_init_fb(void); -#endif diff --git a/arch/arm/mach-msm/board-9625-gpiomux.c b/arch/arm/mach-msm/board-9625-gpiomux.c deleted file mode 100644 index a6ac986d7303..000000000000 --- a/arch/arm/mach-msm/board-9625-gpiomux.c +++ /dev/null @@ -1,363 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -static struct gpiomux_setting gpio_uart_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_HIGH, -}; - -static struct gpiomux_setting gpio_spi_cs_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gpio_spi_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gpio_i2c_config = { - .func = GPIOMUX_FUNC_3, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct msm_gpiomux_config msm_blsp_configs[] __initdata = { - { - .gpio = 4, /* BLSP1 QUP2 SPI_DATA_MOSI */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 5, /* BLSP1 QUP2 SPI_DATA_MISO */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 6, /* BLSP1 QUP2 SPI_CS_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config, - }, - }, - { - .gpio = 7, /* BLSP1 QUP2 SPI_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_spi_config, - }, - }, - { - .gpio = 8, /* BLSP1 UART TX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_uart_config, - }, - }, - { - .gpio = 9, /* BLSP1 UART RX */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_uart_config, - }, - }, - { - .gpio = 10, /* BLSP1 QUP3 I2C_DAT */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config, - }, - }, - { - .gpio = 11, /* BLSP1 QUP3 I2C_CLK */ - .settings = { - [GPIOMUX_SUSPENDED] = &gpio_i2c_config, - }, - }, -}; - -static struct gpiomux_setting mi2s_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mi2s_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting codec_reset = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct msm_gpiomux_config mdm9625_mi2s_configs[] __initdata = { - { - .gpio = 12, /* mi2s ws */ - .settings = { - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - }, - }, - { - .gpio = 15, /* mi2s sclk */ - .settings = { - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - }, - }, - { - .gpio = 14, /* mi2s dout */ - .settings = { - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - }, - }, - { - .gpio = 13, /* mi2s din */ - .settings = { - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - }, - }, - { - .gpio = 71, /* mi2s mclk */ - .settings = { - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - }, - }, -}; - -static struct msm_gpiomux_config mdm9625_cdc_reset_config[] __initdata = { - { - .gpio = 22, /* SYS_RST_N */ - .settings = { - [GPIOMUX_SUSPENDED] = &codec_reset, - }, - } -}; - -static struct gpiomux_setting sdc3_clk_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdc3_cmd_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdc3_data_0_3_active_cfg = { - .func = GPIOMUX_FUNC_6, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdc3_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting sdc3_data_1_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct msm_gpiomux_config sdc3_configs[] __initdata = { - { - .gpio = 25, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_clk_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_suspended_cfg, - }, - }, - { - .gpio = 24, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_cmd_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_suspended_cfg, - }, - - }, - { - .gpio = 16, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_suspended_cfg, - }, - }, - { - .gpio = 17, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_data_1_suspended_cfg, - }, - }, - { - .gpio = 18, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_suspended_cfg, - }, - }, - { - .gpio = 19, - .settings = { - [GPIOMUX_ACTIVE] = &sdc3_data_0_3_active_cfg, - [GPIOMUX_SUSPENDED] = &sdc3_suspended_cfg, - }, - }, -}; - -static struct gpiomux_setting wlan_ath6kl_active_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_OUT_LOW, -}; - -static struct gpiomux_setting wlan_ath6kl_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, - .dir = GPIOMUX_IN, -}; - -static struct msm_gpiomux_config wlan_ath6kl_configs[] __initdata = { - { - .gpio = 62,/* CHIP_PWD_L */ - .settings = { - [GPIOMUX_ACTIVE] = &wlan_ath6kl_active_config, - [GPIOMUX_SUSPENDED] = &wlan_ath6kl_suspend_config, - }, - }, -}; - -static struct gpiomux_setting sdc2_card_det_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, - .dir = GPIOMUX_IN, -}; - -struct msm_gpiomux_config sdc2_card_det_config[] __initdata = { - { - .gpio = 66, - .settings = { - [GPIOMUX_ACTIVE] = &sdc2_card_det_cfg, - [GPIOMUX_SUSPENDED] = &sdc2_card_det_cfg, - }, - }, -}; - -#ifdef CONFIG_FB_MSM_QPIC -static struct gpiomux_setting qpic_lcdc_a_d = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting qpic_lcdc_cs = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting qpic_lcdc_rs = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting qpic_lcdc_te = { - .func = GPIOMUX_FUNC_7, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct msm_gpiomux_config msm9625_qpic_lcdc_configs[] __initdata = { - { - .gpio = 20, /* a_d */ - .settings = { - [GPIOMUX_SUSPENDED] = &qpic_lcdc_a_d, - }, - }, - { - .gpio = 21, /* cs */ - .settings = { - [GPIOMUX_SUSPENDED] = &qpic_lcdc_cs, - }, - }, - { - .gpio = 22, /* te */ - .settings = { - [GPIOMUX_SUSPENDED] = &qpic_lcdc_te, - }, - }, - { - .gpio = 23, /* rs */ - .settings = { - [GPIOMUX_SUSPENDED] = &qpic_lcdc_rs, - }, - }, -}; - -static void msm9625_disp_init_gpiomux(void) -{ - msm_gpiomux_install(msm9625_qpic_lcdc_configs, - ARRAY_SIZE(msm9625_qpic_lcdc_configs)); -} -#else -static void msm9625_disp_init_gpiomux(void) -{ -} -#endif /* CONFIG_FB_MSM_QPIC */ - -void __init msm9625_init_gpiomux(void) -{ - int rc; - - rc = msm_gpiomux_init_dt(); - if (rc) { - pr_err("%s failed %d\n", __func__, rc); - return; - } - - msm_gpiomux_install(msm_blsp_configs, ARRAY_SIZE(msm_blsp_configs)); - msm_gpiomux_install(sdc3_configs, ARRAY_SIZE(sdc3_configs)); - msm_gpiomux_install(wlan_ath6kl_configs, - ARRAY_SIZE(wlan_ath6kl_configs)); - msm_gpiomux_install(mdm9625_mi2s_configs, - ARRAY_SIZE(mdm9625_mi2s_configs)); - msm_gpiomux_install(mdm9625_cdc_reset_config, - ARRAY_SIZE(mdm9625_cdc_reset_config)); - msm_gpiomux_install(sdc2_card_det_config, - ARRAY_SIZE(sdc2_card_det_config)); - msm9625_disp_init_gpiomux(); -} diff --git a/arch/arm/mach-msm/board-9625.c b/arch/arm/mach-msm/board-9625.c deleted file mode 100644 index 8391dda4afd3..000000000000 --- a/arch/arm/mach-msm/board-9625.c +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "board-dt.h" -#include -#include -#include "clock.h" -#include "modem_notifier.h" -#include "spm.h" - -#define MSM_KERNEL_EBI_SIZE 0x51000 - -static struct memtype_reserve msm9625_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static int msm9625_paddr_to_memtype(unsigned int paddr) -{ - return MEMTYPE_EBI1; -} - -static void __init msm9625_calculate_reserve_sizes(void) -{ - msm9625_reserve_table[MEMTYPE_EBI1].size += MSM_KERNEL_EBI_SIZE; -} - -static struct reserve_info msm9625_reserve_info __initdata = { - .memtype_reserve_table = msm9625_reserve_table, - .calculate_reserve_sizes = msm9625_calculate_reserve_sizes, - .paddr_to_memtype = msm9625_paddr_to_memtype, -}; - -static struct clk_lookup msm_clocks_dummy[] = { - CLK_DUMMY("core_clk", BLSP1_UART_CLK, "msm_serial_hsl.0", OFF), - CLK_DUMMY("iface_clk", BLSP1_UART_CLK, "msm_serial_hsl.0", OFF), - CLK_DUMMY("phy_clk", NULL, "msm_otg", OFF), - CLK_DUMMY("core_clk", NULL, "msm_otg", OFF), - CLK_DUMMY("alt_core_clk", NULL, "msm_otg", OFF), - CLK_DUMMY("iface_clk", NULL, "msm_otg", OFF), - CLK_DUMMY("xo", NULL, "msm_otg", OFF), - CLK_DUMMY("dfab_clk", DFAB_CLK, NULL, 0), - CLK_DUMMY("dma_bam_pclk", DMA_BAM_P_CLK, NULL, 0), - CLK_DUMMY("mem_clk", NULL, NULL, 0), - CLK_DUMMY("core_clk", SPI_CLK, "spi_qsd.1", OFF), - CLK_DUMMY("iface_clk", SPI_P_CLK, "spi_qsd.1", OFF), - CLK_DUMMY("core_clk", NULL, "f9966000.i2c", 0), - CLK_DUMMY("iface_clk", NULL, "f9966000.i2c", 0), - CLK_DUMMY("core_clk", NULL, "fe12f000.slim", OFF), -}; - -struct clock_init_data msm_dummy_clock_init_data __initdata = { - .table = msm_clocks_dummy, - .size = ARRAY_SIZE(msm_clocks_dummy), -}; - -static const char *msm9625_dt_match[] __initconst = { - "qcom,msm9625", - NULL -}; - -static struct of_dev_auxdata msm9625_auxdata_lookup[] __initdata = { - OF_DEV_AUXDATA("qcom,msm-lsuart-v14", 0xF991F000, \ - "msm_serial_hsl.0", NULL), - OF_DEV_AUXDATA("qcom,spmi-pmic-arb", 0xFC4C0000, \ - "spmi-pmic-arb.0", NULL), - OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF98A4000, \ - "msm_sdcc.2", NULL), - OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF9864000, \ - "msm_sdcc.3", NULL), - OF_DEV_AUXDATA("qcom,msm-tsens", 0xFC4A8000, \ - "msm-tsens", NULL), - OF_DEV_AUXDATA("qcom,usb-bam-msm", 0xF9A44000, \ - "usb_bam", NULL), - OF_DEV_AUXDATA("qcom,hsic-host", 0xF9A15000, \ - "msm_hsic_host", NULL), - OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF98A4900, \ - "msm_sdcc.2", NULL), - OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF9864900, \ - "msm_sdcc.3", NULL), - {} -}; - -static void __init msm9625_early_memory(void) -{ - reserve_info = &msm9625_reserve_info; - of_scan_flat_dt(dt_scan_for_memory_hole, msm9625_reserve_table); -} - -static void __init msm9625_reserve(void) -{ - reserve_info = &msm9625_reserve_info; - of_scan_flat_dt(dt_scan_for_memory_reserve, msm9625_reserve_table); - msm_reserve(); -} - -#define BIMC_BASE 0xfc380000 -#define BIMC_SIZE 0x0006A000 -#define SYS_NOC_BASE 0xfc460000 -#define PERIPH_NOC_BASE 0xFC468000 -#define CONFIG_NOC_BASE 0xfc480000 -#define NOC_SIZE 0x00004000 - -static struct resource bimc_res[] = { - { - .start = BIMC_BASE, - .end = BIMC_BASE + BIMC_SIZE, - .flags = IORESOURCE_MEM, - .name = "bimc_mem", - }, -}; - -static struct resource sys_noc_res[] = { - { - .start = SYS_NOC_BASE, - .end = SYS_NOC_BASE + NOC_SIZE, - .flags = IORESOURCE_MEM, - .name = "sys_noc_mem", - }, -}; - -static struct resource config_noc_res[] = { - { - .start = CONFIG_NOC_BASE, - .end = CONFIG_NOC_BASE + NOC_SIZE, - .flags = IORESOURCE_MEM, - .name = "config_noc_mem", - }, -}; - -static struct resource periph_noc_res[] = { - { - .start = PERIPH_NOC_BASE, - .end = PERIPH_NOC_BASE + NOC_SIZE, - .flags = IORESOURCE_MEM, - .name = "periph_noc_mem", - }, -}; - -static struct platform_device msm_bus_sys_noc = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYS_NOC, - .num_resources = ARRAY_SIZE(sys_noc_res), - .resource = sys_noc_res, -}; - -static struct platform_device msm_bus_bimc = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_BIMC, - .num_resources = ARRAY_SIZE(bimc_res), - .resource = bimc_res, -}; - -static struct platform_device msm_bus_periph_noc = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_PERIPH_NOC, - .num_resources = ARRAY_SIZE(periph_noc_res), - .resource = periph_noc_res, -}; - -static struct platform_device msm_bus_config_noc = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_CONFIG_NOC, - .num_resources = ARRAY_SIZE(config_noc_res), - .resource = config_noc_res, -}; - -static struct platform_device *msm_bus_9625_devices[] = { - &msm_bus_sys_noc, - &msm_bus_bimc, - &msm_bus_periph_noc, - &msm_bus_config_noc, -}; - -static void __init msm9625_init_buses(void) -{ -#ifdef CONFIG_MSM_BUS_SCALING - msm_bus_sys_noc.dev.platform_data = - &msm_bus_9625_sys_noc_pdata; - msm_bus_bimc.dev.platform_data = &msm_bus_9625_bimc_pdata; - msm_bus_periph_noc.dev.platform_data = &msm_bus_9625_periph_noc_pdata; - msm_bus_config_noc.dev.platform_data = &msm_bus_9625_config_noc_pdata; -#endif - platform_add_devices(msm_bus_9625_devices, - ARRAY_SIZE(msm_bus_9625_devices)); -} - -/* - * Used to satisfy dependencies for devices that need to be - * run early or in a particular order. Most likely your device doesn't fall - * into this category, and thus the driver should not be added here. - * EPROBE_DEFER can satisfy most dependency problems. - */ -void __init msm9625_add_drivers(void) -{ - msm_smem_init(); - msm_init_modem_notifier_list(); - msm_smd_init(); - msm_rpm_driver_init(); - rpm_regulator_smd_driver_init(); - msm_spm_device_init(); - msm_clock_init(&msm9625_clock_init_data); - msm9625_init_buses(); - tsens_tm_init_driver(); - msm_thermal_device_init(); -} - -void __init msm9625_init(void) -{ - if (socinfo_init() < 0) - pr_err("%s: socinfo_init() failed\n", __func__); - - msm9625_init_gpiomux(); - board_dt_populate(msm9625_auxdata_lookup); - msm9625_add_drivers(); -} - -DT_MACHINE_START(MSM9625_DT, "Qualcomm MSM 9625 (Flattened Device Tree)") - .map_io = msm_map_msm9625_io, - .init_irq = msm_dt_init_irq_l2x0, - .init_machine = msm9625_init, - .dt_compat = msm9625_dt_match, - .reserve = msm9625_reserve, - .init_very_early = msm9625_early_memory, - .restart = msm_restart, -MACHINE_END diff --git a/arch/arm/mach-msm/board-dt-8660.c b/arch/arm/mach-msm/board-dt-8660.c deleted file mode 100644 index 7dcfc5300bbd..000000000000 --- a/arch/arm/mach-msm/board-dt-8660.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - -#include - -#include -#include "common.h" - -static void __init msm8x60_init_late(void) -{ - smd_debugfs_init(); -} - -static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = { - {} -}; - -static void __init msm8x60_dt_init(void) -{ - of_platform_populate(NULL, of_default_bus_match_table, - msm_auxdata_lookup, NULL); -} - -static const char *msm8x60_fluid_match[] __initdata = { - "qcom,msm8660-fluid", - "qcom,msm8660-surf", - NULL -}; - -DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)") - .smp = smp_ops(msm_smp_ops), - .map_io = msm_map_msm8x60_io, - .init_irq = irqchip_init, - .init_machine = msm8x60_dt_init, - .init_late = msm8x60_init_late, - .init_time = msm_dt_timer_init, - .dt_compat = msm8x60_fluid_match, -MACHINE_END diff --git a/arch/arm/mach-msm/board-dt-8960.c b/arch/arm/mach-msm/board-dt-8960.c deleted file mode 100644 index 73019363ffa4..000000000000 --- a/arch/arm/mach-msm/board-dt-8960.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include - -#include "common.h" - -static void __init msm_dt_init(void) -{ - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); -} - -static const char * const msm8960_dt_match[] __initconst = { - "qcom,msm8960-cdp", - NULL -}; - -DT_MACHINE_START(MSM8960_DT, "Qualcomm MSM (Flattened Device Tree)") - .smp = smp_ops(msm_smp_ops), - .map_io = msm_map_msm8960_io, - .init_irq = irqchip_init, - .init_time = msm_dt_timer_init, - .init_machine = msm_dt_init, - .dt_compat = msm8960_dt_match, -MACHINE_END diff --git a/arch/arm/mach-msm/board-fsm9xxx.c b/arch/arm/mach-msm/board-fsm9xxx.c deleted file mode 100644 index cb2e766d925f..000000000000 --- a/arch/arm/mach-msm/board-fsm9xxx.c +++ /dev/null @@ -1,1017 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include "devices.h" -#include "timer.h" -#include "clock.h" -#include "pm.h" -#include "spm.h" -#include -#include -#include -#include -#include -#include - -#define PMIC_GPIO_INT 144 -#define PMIC_VREG_WLAN_LEVEL 2900 -#define PMIC_GPIO_SD_DET 165 - -#define GPIO_EPHY_RST_N 37 -#define GPIO_MAC_TXD_3 119 -#define GPIO_MAC_TXD_2 120 -#define GPIO_MAC_TXD_1 121 -#define GPIO_MAC_TXD_0 122 -#define GPIO_MAC_TX_EN 123 -#define GPIO_MAC_MDIO 127 -#define GPIO_MAC_MDC 128 -#define GPIO_MAC_TX_CLK 133 -#define GPIO_GRFC_FTR0_0 136 /* GRFC 20 */ -#define GPIO_GRFC_FTR0_1 137 /* GRFC 21 */ -#define GPIO_GRFC_FTR1_0 145 /* GRFC 22 */ -#define GPIO_GRFC_FTR1_1 93 /* GRFC 19 */ -#define GPIO_GRFC_2 110 -#define GPIO_GRFC_3 109 -#define GPIO_GRFC_4 108 -#define GPIO_GRFC_5 107 -#define GPIO_GRFC_6 106 -#define GPIO_GRFC_7 105 -#define GPIO_GRFC_8 104 -#define GPIO_GRFC_9 103 -#define GPIO_GRFC_10 102 -#define GPIO_GRFC_11 101 -#define GPIO_GRFC_13 99 -#define GPIO_GRFC_14 98 -#define GPIO_GRFC_15 97 -#define GPIO_GRFC_16 96 -#define GPIO_GRFC_17 95 -#define GPIO_GRFC_18 94 -#define GPIO_GRFC_24 150 -#define GPIO_GRFC_25 151 -#define GPIO_GRFC_26 152 -#define GPIO_GRFC_27 153 -#define GPIO_GRFC_28 154 -#define GPIO_GRFC_29 155 - -#define GPIO_USER_FIRST 58 -#define GPIO_USER_LAST 63 - -#define GPIO_UIM_RESET 75 -#define GPIO_UIM_DATA_IO 76 -#define GPIO_UIM_CLOCK 77 - -#define GPIO_PM_UIM_M_RST 26 /* UIM_RST input */ -#define GPIO_PM_UIM_RST 27 /* UIM_RST output */ -#define GPIO_PM_UIM_M_CLK 28 /* UIM_CLK input */ -#define GPIO_PM_UIM_CLK 29 /* UIM_CLK output */ - -#define FPGA_SDCC_STATUS 0x8E0001A8 - -/* Macros assume PMIC GPIOs start at 0 */ -#define PM8058_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio + NR_MSM_GPIOS) -#define PM8058_GPIO_SYS_TO_PM(sys_gpio) (sys_gpio - NR_MSM_GPIOS) -#define PM8058_MPP_BASE (NR_MSM_GPIOS + PM8058_GPIOS) -#define PM8058_MPP_PM_TO_SYS(pm_gpio) (pm_gpio + PM8058_MPP_BASE) -#define PM8058_MPP_SYS_TO_PM(sys_gpio) (sys_gpio - PM8058_MPP_BASE) - -#define PMIC_GPIO_5V_PA_PWR 21 /* PMIC GPIO Number 22 */ -#define PMIC_GPIO_4_2V_PA_PWR 22 /* PMIC GPIO Number 23 */ -#define PMIC_MPP_UIM_M_DATA 0 /* UIM_DATA input */ -#define PMIC_MPP_UIM_DATA 1 /* UIM_DATA output */ -#define PMIC_MPP_3 2 /* PMIC MPP Number 3 */ -#define PMIC_MPP_6 5 /* PMIC MPP Number 6 */ -#define PMIC_MPP_7 6 /* PMIC MPP Number 7 */ -#define PMIC_MPP_10 9 /* PMIC MPP Number 10 */ - -/* - * PM8058 - */ -struct pm8xxx_mpp_init_info { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8058_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -static int pm8058_gpios_init(void) -{ - int i; - int rc; - struct pm8058_gpio_cfg { - int gpio; - struct pm_gpio cfg; - }; - - struct pm8058_gpio_cfg gpio_cfgs[] = { - { /* 5V PA Power */ - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_5V_PA_PWR), - { - .vin_sel = 0, - .direction = PM_GPIO_DIR_BOTH, - .output_value = 1, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .pull = PM_GPIO_PULL_DN, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { /* 4.2V PA Power */ - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_4_2V_PA_PWR), - { - .vin_sel = 0, - .direction = PM_GPIO_DIR_BOTH, - .output_value = 1, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .pull = PM_GPIO_PULL_DN, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - }; - - for (i = 0; i < ARRAY_SIZE(gpio_cfgs); ++i) { - rc = pm8xxx_gpio_config(gpio_cfgs[i].gpio, &gpio_cfgs[i].cfg); - if (rc < 0) { - pr_err("%s pmic gpio config failed\n", __func__); - return rc; - } - } - - return 0; -} - -static int pm8058_mpps_init(void) -{ - int rc, i; - - struct pm8xxx_mpp_init_info pm8058_mpps[] = { - PM8XXX_MPP_INIT(PMIC_MPP_3, A_OUTPUT, - PM8XXX_MPP_AOUT_LVL_1V25_2, AOUT_CTRL_ENABLE), - PM8XXX_MPP_INIT(PMIC_MPP_6, A_OUTPUT, - PM8XXX_MPP_AOUT_LVL_1V25_2, AOUT_CTRL_ENABLE), - PM8XXX_MPP_INIT(PMIC_MPP_UIM_M_DATA, D_BI_DIR, - PM8058_MPP_DIG_LEVEL_S3, BI_PULLUP_1KOHM), - PM8XXX_MPP_INIT(PMIC_MPP_UIM_DATA, D_BI_DIR, - PM8058_MPP_DIG_LEVEL_L3, BI_PULLUP_30KOHM), - }; - - for (i = 0; i < ARRAY_SIZE(pm8058_mpps); i++) { - rc = pm8xxx_mpp_config(pm8058_mpps[i].mpp, - &pm8058_mpps[i].config); - if (rc) { - pr_err("%s: Config %d mpp pm 8058 failed\n", - __func__, pm8058_mpps[i].mpp); - return rc; - } - } - - return 0; -} - -static struct regulator_consumer_supply pm8058_vreg_supply[PM8058_VREG_MAX] = { - [PM8058_VREG_ID_L3] = REGULATOR_SUPPLY("8058_l3", NULL), - [PM8058_VREG_ID_L8] = REGULATOR_SUPPLY("8058_l8", NULL), - [PM8058_VREG_ID_L9] = REGULATOR_SUPPLY("8058_l9", NULL), - [PM8058_VREG_ID_L14] = REGULATOR_SUPPLY("8058_l14", NULL), - [PM8058_VREG_ID_L15] = REGULATOR_SUPPLY("8058_l15", NULL), - [PM8058_VREG_ID_L18] = REGULATOR_SUPPLY("8058_l18", NULL), - [PM8058_VREG_ID_S4] = REGULATOR_SUPPLY("8058_s4", NULL), - - [PM8058_VREG_ID_LVS0] = REGULATOR_SUPPLY("8058_lvs0", NULL), -}; - -#define PM8058_VREG_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, \ - _always_on, _pull_down) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = 1, \ - .consumer_supplies = &pm8058_vreg_supply[_id], \ - }, \ - .id = _id, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = 0, \ - .pin_fn = PM8058_VREG_PIN_FN_ENABLE, \ - } - -#define PM8058_VREG_INIT_LDO(_id, _min_uV, _max_uV) \ - PM8058_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL | \ - REGULATOR_MODE_IDLE | REGULATOR_MODE_STANDBY, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS | \ - REGULATOR_CHANGE_MODE, 1, 1, 1) - -#define PM8058_VREG_INIT_SMPS(_id, _min_uV, _max_uV) \ - PM8058_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL | \ - REGULATOR_MODE_IDLE | REGULATOR_MODE_STANDBY, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS | \ - REGULATOR_CHANGE_MODE, 1, 1, 1) - -#define PM8058_VREG_INIT_LVS(_id, _min_uV, _max_uV) \ - PM8058_VREG_INIT(_id, _min_uV, _min_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_STATUS, 0, 0, 1) - -static struct pm8058_vreg_pdata pm8058_vreg_init[] = { - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L3, 3000000, 3000000), - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L8, 2200000, 2200000), - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L9, 2050000, 2050000), - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L14, 2850000, 2850000), - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L15, 2200000, 2200000), - PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L18, 2200000, 2200000), - PM8058_VREG_INIT_LVS(PM8058_VREG_ID_LVS0, 1800000, 1800000), - PM8058_VREG_INIT_SMPS(PM8058_VREG_ID_S4, 1300000, 1300000), -}; - -#ifdef CONFIG_SENSORS_MSM_ADC -static struct adc_access_fn xoadc_fn = { - pm8058_xoadc_select_chan_and_start_conv, - pm8058_xoadc_read_adc_code, - pm8058_xoadc_get_properties, - pm8058_xoadc_slot_request, - pm8058_xoadc_restore_slot, - pm8058_xoadc_calibrate, -}; - -static struct msm_adc_channels msm_adc_channels_data[] = { - {"pmic_therm", CHANNEL_ADC_DIE_TEMP, 0, &xoadc_fn, CHAN_PATH_TYPE12, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, scale_pmic_therm}, - {"ref_1250mv", CHANNEL_ADC_1250_REF, 0, &xoadc_fn, CHAN_PATH_TYPE13, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, - {"xo_therm", CHANNEL_ADC_XOTHERM, 0, &xoadc_fn, CHAN_PATH_TYPE_NONE, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm}, - {"fsm_therm", CHANNEL_ADC_FSM_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE6, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm}, - {"pa_therm", CHANNEL_ADC_PA_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE7, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm}, -}; - -static struct msm_adc_platform_data msm_adc_pdata = { - .channel = msm_adc_channels_data, - .num_chan_supported = ARRAY_SIZE(msm_adc_channels_data), - .target_hw = FSM_9xxx, -}; - -static struct platform_device msm_adc_device = { - .name = "msm_adc", - .id = -1, - .dev = { - .platform_data = &msm_adc_pdata, - }, -}; - -static void pmic8058_xoadc_mpp_config(void) -{ - int rc, i; - struct pm8xxx_mpp_init_info xoadc_mpps[] = { - PM8XXX_MPP_INIT(PMIC_MPP_7, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH5, - AOUT_CTRL_DISABLE), - PM8XXX_MPP_INIT(PMIC_MPP_10, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH6, - AOUT_CTRL_DISABLE), - }; - for (i = 0; i < ARRAY_SIZE(xoadc_mpps); i++) { - rc = pm8xxx_mpp_config(xoadc_mpps[i].mpp, - &xoadc_mpps[i].config); - if (rc) { - pr_err("%s: Config MPP %d of PM8058 failed\n", - __func__, xoadc_mpps[i].mpp); - } - } -} - -static struct regulator *vreg_ldo18_adc; - -static int pmic8058_xoadc_vreg_config(int on) -{ - int rc; - - if (on) { - rc = regulator_enable(vreg_ldo18_adc); - if (rc) - pr_err("%s: Enable of regulator ldo18_adc " - "failed\n", __func__); - } else { - rc = regulator_disable(vreg_ldo18_adc); - if (rc) - pr_err("%s: Disable of regulator ldo18_adc " - "failed\n", __func__); - } - - return rc; -} - -static int pmic8058_xoadc_vreg_setup(void) -{ - int rc; - - vreg_ldo18_adc = regulator_get(NULL, "8058_l18"); - if (IS_ERR(vreg_ldo18_adc)) { - pr_err("%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_ldo18_adc)); - rc = PTR_ERR(vreg_ldo18_adc); - goto fail; - } - - rc = regulator_set_voltage(vreg_ldo18_adc, 2200000, 2200000); - if (rc) { - pr_err("%s: unable to set ldo18 voltage to 2.2V\n", __func__); - goto fail; - } - - return rc; -fail: - regulator_put(vreg_ldo18_adc); - return rc; -} - -static void pmic8058_xoadc_vreg_shutdown(void) -{ - regulator_put(vreg_ldo18_adc); -} - -/* usec. For this ADC, - * this time represents clk rate @ txco w/ 1024 decimation ratio. - * Each channel has different configuration, thus at the time of starting - * the conversion, xoadc will return actual conversion time - * */ -static struct adc_properties pm8058_xoadc_data = { - .adc_reference = 2200, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, - .conversiontime = 54, -}; - -static struct xoadc_platform_data pm8058_xoadc_pdata = { - .xoadc_prop = &pm8058_xoadc_data, - .xoadc_mpp_config = pmic8058_xoadc_mpp_config, - .xoadc_vreg_set = pmic8058_xoadc_vreg_config, - .xoadc_num = XOADC_PMIC_0, - .xoadc_vreg_setup = pmic8058_xoadc_vreg_setup, - .xoadc_vreg_shutdown = pmic8058_xoadc_vreg_shutdown, -}; -#endif - -#define XO_CONSUMERS(_id) \ - static struct regulator_consumer_supply xo_consumers_##_id[] - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -XO_CONSUMERS(A0) = { - REGULATOR_SUPPLY("8058_xo_a0", NULL), - REGULATOR_SUPPLY("a0_clk_buffer", "fsm_xo_driver"), -}; -XO_CONSUMERS(A1) = { - REGULATOR_SUPPLY("8058_xo_a1", NULL), - REGULATOR_SUPPLY("a1_clk_buffer", "fsm_xo_driver"), -}; - -#define PM8058_XO_INIT(_id, _modes, _ops, _always_on) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .boot_on = 1, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(xo_consumers_##_id),\ - .consumer_supplies = xo_consumers_##_id, \ - }, \ - .id = PM8058_XO_ID_##_id, \ - } - -#define PM8058_XO_INIT_AX(_id) \ - PM8058_XO_INIT(_id, REGULATOR_MODE_NORMAL, REGULATOR_CHANGE_STATUS, 0) - -static struct pm8058_xo_pdata pm8058_xo_init_pdata[] = { - PM8058_XO_INIT_AX(A0), - PM8058_XO_INIT_AX(A1), -}; - -#define PM8058_GPIO_INT 47 - -static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = { - .irq_base = PMIC8058_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(PM8058_GPIO_INT), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = { - .gpio_base = PM8058_GPIO_PM_TO_SYS(0), -}; - -static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = { - .mpp_base = PM8058_MPP_PM_TO_SYS(0), -}; - -static struct pm8058_platform_data pm8058_fsm9xxx_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .regulator_pdatas = pm8058_vreg_init, - .num_regulators = ARRAY_SIZE(pm8058_vreg_init), - .xo_buffer_pdata = pm8058_xo_init_pdata, - .num_xo_buffers = ARRAY_SIZE(pm8058_xo_init_pdata), -#ifdef CONFIG_SENSORS_MSM_ADC - .xoadc_pdata = &pm8058_xoadc_pdata, -#endif -}; - -#ifdef CONFIG_MSM_SSBI -static struct msm_ssbi_platform_data fsm9xxx_ssbi_pm8058_pdata = { - .controller_type = FSM_SBI_CTRL_SSBI, - .slave = { - .name = "pm8058-core", - .platform_data = &pm8058_fsm9xxx_data, - }, -}; -#endif - -static int __init buses_init(void) -{ - if (gpio_tlmm_config(GPIO_CFG(PMIC_GPIO_INT, 5, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE)) - pr_err("%s: gpio_tlmm_config (gpio=%d) failed\n", - __func__, PMIC_GPIO_INT); - - return 0; -} - -/* - * EPHY - */ - -static struct msm_gpio phy_config_data[] = { - { GPIO_CFG(GPIO_EPHY_RST_N, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_RST_N" }, - { GPIO_CFG(GPIO_MAC_TXD_3, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_3"}, - { GPIO_CFG(GPIO_MAC_TXD_2, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_2"}, - { GPIO_CFG(GPIO_MAC_TXD_1, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_1"}, - { GPIO_CFG(GPIO_MAC_TXD_0, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_0"}, - { GPIO_CFG(GPIO_MAC_TX_EN, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TX_EN"}, - { GPIO_CFG(GPIO_MAC_TX_CLK, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_10MA), "MAC_TX_CLK"}, - { GPIO_CFG(GPIO_MAC_MDIO, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "MDIO_MAC_MDIO"}, - { GPIO_CFG(GPIO_MAC_MDC, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "MDC_MAC_MDC"}, -}; - -static int __init phy_init(void) -{ - msm_gpios_request_enable(phy_config_data, ARRAY_SIZE(phy_config_data)); - gpio_direction_output(GPIO_EPHY_RST_N, 0); - udelay(100); - gpio_set_value(GPIO_EPHY_RST_N, 1); - - return 0; -} - -/* - * RF - */ - -static struct msm_gpio grfc_config_data[] = { - { GPIO_CFG(GPIO_GRFC_FTR0_0, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE1_0" }, - { GPIO_CFG(GPIO_GRFC_FTR0_1, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE1_1" }, - { GPIO_CFG(GPIO_GRFC_FTR1_0, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE2_0" }, - { GPIO_CFG(GPIO_GRFC_FTR1_1, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE2_1" }, - { GPIO_CFG(GPIO_GRFC_2, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_2" }, - { GPIO_CFG(GPIO_GRFC_3, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_3" }, - { GPIO_CFG(GPIO_GRFC_4, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_4" }, - { GPIO_CFG(GPIO_GRFC_5, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_5" }, - { GPIO_CFG(GPIO_GRFC_6, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_6" }, - { GPIO_CFG(GPIO_GRFC_7, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_7" }, - { GPIO_CFG(GPIO_GRFC_8, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_8" }, - { GPIO_CFG(GPIO_GRFC_9, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_9" }, - { GPIO_CFG(GPIO_GRFC_10, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_10" }, - { GPIO_CFG(GPIO_GRFC_11, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_11" }, - { GPIO_CFG(GPIO_GRFC_13, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_13" }, - { GPIO_CFG(GPIO_GRFC_14, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_14" }, - { GPIO_CFG(GPIO_GRFC_15, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_15" }, - { GPIO_CFG(GPIO_GRFC_16, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_16" }, - { GPIO_CFG(GPIO_GRFC_17, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_17" }, - { GPIO_CFG(GPIO_GRFC_18, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_18" }, - { GPIO_CFG(GPIO_GRFC_24, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_24" }, - { GPIO_CFG(GPIO_GRFC_25, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_25" }, - { GPIO_CFG(GPIO_GRFC_26, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_26" }, - { GPIO_CFG(GPIO_GRFC_27, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_27" }, - { GPIO_CFG(GPIO_GRFC_28, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_28" }, - { GPIO_CFG(GPIO_GRFC_29, 7, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_29" }, - { GPIO_CFG(39, 1, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "PP2S_EXT_SYNC" }, -}; - -static int __init grfc_init(void) -{ - msm_gpios_request_enable(grfc_config_data, - ARRAY_SIZE(grfc_config_data)); - - return 0; -} - -/* - * UART - */ - -#ifdef CONFIG_SERIAL_MSM_CONSOLE -static struct msm_gpio uart1_config_data[] = { - { GPIO_CFG(138, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1_Rx" }, - { GPIO_CFG(139, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1_Tx" }, -}; - -static void fsm9xxx_init_uart1(void) -{ - msm_gpios_request_enable(uart1_config_data, - ARRAY_SIZE(uart1_config_data)); - -} -#endif - -static struct msm_gpio uart3_uim_config_data[] = { - { GPIO_CFG(GPIO_UIM_RESET, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_2MA), "UIM_Reset" }, - { GPIO_CFG(GPIO_UIM_DATA_IO, 2, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_2MA), "UIM_Data" }, - { GPIO_CFG(GPIO_UIM_CLOCK, 2, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_2MA), "UIM_Clock" }, -}; - -static void fsm9xxx_init_uart3_uim(void) -{ - struct pm_gpio pmic_uim_gpio_in = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_PAIRED, - .vin_sel = PM8058_GPIO_VIN_L3, - }; - struct pm_gpio pmic_uim_gpio_out = { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_PAIRED, - .vin_sel = PM8058_GPIO_VIN_L3, - }; - - /* TLMM */ - msm_gpios_request_enable(uart3_uim_config_data, - ARRAY_SIZE(uart3_uim_config_data)); - - /* Put UIM to reset state */ - gpio_direction_output(GPIO_UIM_RESET, 0); - gpio_set_value(GPIO_UIM_RESET, 0); - gpio_export(GPIO_UIM_RESET, false); - - /* PMIC */ - pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(GPIO_PM_UIM_M_RST), - &pmic_uim_gpio_in); - pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(GPIO_PM_UIM_RST), - &pmic_uim_gpio_out); - pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(GPIO_PM_UIM_M_CLK), - &pmic_uim_gpio_in); - pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(GPIO_PM_UIM_CLK), - &pmic_uim_gpio_out); -} - -/* - * SSBI - */ - -#ifdef CONFIG_I2C_SSBI -static struct msm_i2c_ssbi_platform_data msm_i2c_ssbi2_pdata = { - .controller_type = FSM_SBI_CTRL_SSBI, -}; - -static struct msm_i2c_ssbi_platform_data msm_i2c_ssbi3_pdata = { - .controller_type = FSM_SBI_CTRL_SSBI, -}; -#endif - -#if defined(CONFIG_I2C_SSBI) || defined(CONFIG_MSM_SSBI) -/* Intialize GPIO configuration for SSBI */ -static struct msm_gpio ssbi_gpio_config_data[] = { - { GPIO_CFG(140, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), - "SSBI_1" }, - { GPIO_CFG(141, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), - "SSBI_2" }, - { GPIO_CFG(92, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), - "SSBI_3" }, -}; - -static void -fsm9xxx_init_ssbi_gpio(void) -{ - msm_gpios_request_enable(ssbi_gpio_config_data, - ARRAY_SIZE(ssbi_gpio_config_data)); - -} -#endif - -/* - * User GPIOs - */ - -static void user_gpios_init(void) -{ - unsigned int gpio; - - for (gpio = GPIO_USER_FIRST; gpio <= GPIO_USER_LAST; ++gpio) - gpio_tlmm_config(GPIO_CFG(gpio, 0, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); -} - -/* - * Crypto - */ - -#define QCE_SIZE 0x10000 - -#define QCE_0_BASE 0x80C00000 -#define QCE_1_BASE 0x80E00000 -#define QCE_2_BASE 0x81000000 - -#define QCE_NO_HW_KEY_SUPPORT 0 /* No shared HW key with external */ -#define QCE_NO_SHARE_CE_RESOURCE 0 /* No CE resource shared with TZ */ -#define QCE_NO_CE_SHARED 0 /* CE not shared with TZ */ -#define QCE_NO_SHA_HMAC_SUPPORT 0 /* No SHA-HMAC by SHA operation */ - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_1_BASE, - .end = QCE_1_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE2_IN_CHAN, - .end = DMOV_CE2_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE2_IN_CRCI, - .end = DMOV_CE2_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE2_OUT_CRCI, - .end = DMOV_CE2_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE2_HASH_CRCI, - .end = DMOV_CE2_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_NO_CE_SHARED, - .shared_ce_resource = QCE_NO_SHARE_CE_RESOURCE, - .hw_key_support = QCE_NO_HW_KEY_SUPPORT, - .sha_hmac = QCE_NO_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_1_BASE, - .end = QCE_1_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE2_IN_CHAN, - .end = DMOV_CE2_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE2_IN_CRCI, - .end = DMOV_CE2_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE2_OUT_CRCI, - .end = DMOV_CE2_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE2_HASH_CRCI, - .end = DMOV_CE2_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_NO_CE_SHARED, - .shared_ce_resource = QCE_NO_SHARE_CE_RESOURCE, - .hw_key_support = QCE_NO_HW_KEY_SUPPORT, - .sha_hmac = QCE_NO_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; - -static struct resource ota_qcrypto_resources[] = { - [0] = { - .start = QCE_2_BASE, - .end = QCE_2_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE3_IN_CHAN, - .end = DMOV_CE3_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE3_IN_CRCI, - .end = DMOV_CE3_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE3_OUT_CRCI, - .end = DMOV_CE3_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE3_HASH_DONE_CRCI, - .end = DMOV_CE3_HASH_DONE_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device ota_qcrypto_device = { - .name = "qcota", - .id = 0, - .num_resources = ARRAY_SIZE(ota_qcrypto_resources), - .resource = ota_qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct platform_device fsm9xxx_device_acpuclk = { - .name = "acpuclk-9xxx", - .id = -1, -}; - -struct ion_platform_heap msm_ion_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM_CONTIG, - .name = "kmalloc", - }, -}; - -static struct ion_platform_data msm_ion_pdata = { - .nr = 1, - .heaps = msm_ion_heaps, -}; - -static struct platform_device msm_ion_device = { - .name = "ion-msm", - .id = 1, - .dev = { - .platform_data = &msm_ion_pdata, - }, -}; - -/* - * Devices - */ - -static struct platform_device *devices[] __initdata = { - &fsm9xxx_device_acpuclk, - &msm_device_smd, - &msm_device_dmov, - &msm_device_nand, -#ifdef CONFIG_MSM_SSBI - &msm_device_ssbi_pmic1, -#endif -#ifdef CONFIG_I2C_SSBI - &msm_device_ssbi2, - &msm_device_ssbi3, -#endif -#ifdef CONFIG_SENSORS_MSM_ADC - &msm_adc_device, -#endif -#ifdef CONFIG_I2C_QUP - &msm_gsbi1_qup_i2c_device, -#endif -#if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER) - &msm_device_uart1, -#endif - &msm_device_uart3, -#if defined(CONFIG_QFP_FUSE) - &fsm_qfp_fuse_device, -#endif - &qfec_device, - &qcrypto_device, - &qcedev_device, - &ota_qcrypto_device, - &fsm_xo_device, - &fsm9xxx_device_watchdog, - &msm_ion_device, -}; - -static void __init fsm9xxx_init_irq(void) -{ - msm_init_irq(); - msm_init_sirc(); -} - -#ifdef CONFIG_MSM_SPM -static struct msm_spm_platform_data msm_spm_data __initdata = { - .reg_base_addr = MSM_SAW_BASE, - - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x05, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x18, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x00006666, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0xFF000666, - - .reg_init_values[MSM_SPM_REG_SAW_SPM_PMIC_CTL] = 0xE0F272, - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x03, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0xF2, - .retention_vlevel = 0xE0, - .collapse_vlevel = 0x72, - .retention_mid_vlevel = 0xE0, - .collapse_mid_vlevel = 0xE0, -}; -#endif - -static void __init fsm9xxx_init(void) -{ - msm_clock_init(&fsm9xxx_clock_init_data); - - regulator_has_full_constraints(); - -#if defined(CONFIG_I2C_SSBI) || defined(CONFIG_MSM_SSBI) - fsm9xxx_init_ssbi_gpio(); -#endif -#ifdef CONFIG_MSM_SSBI - msm_device_ssbi_pmic1.dev.platform_data = - &fsm9xxx_ssbi_pm8058_pdata; -#endif - buses_init(); - - platform_add_devices(devices, ARRAY_SIZE(devices)); - -#ifdef CONFIG_MSM_SPM - msm_spm_init(&msm_spm_data, 1); -#endif - pm8058_gpios_init(); - pm8058_mpps_init(); - phy_init(); - grfc_init(); - user_gpios_init(); - -#ifdef CONFIG_SERIAL_MSM_CONSOLE - fsm9xxx_init_uart1(); -#endif - fsm9xxx_init_uart3_uim(); -#ifdef CONFIG_I2C_SSBI - msm_device_ssbi2.dev.platform_data = &msm_i2c_ssbi2_pdata; - msm_device_ssbi3.dev.platform_data = &msm_i2c_ssbi3_pdata; -#endif -} - -static void __init fsm9xxx_map_io(void) -{ - msm_shared_ram_phys = 0x00100000; - msm_map_fsm9xxx_io(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); -} - -MACHINE_START(FSM9XXX_SURF, "QCT FSM9XXX") - .atag_offset = 0x100, - .map_io = fsm9xxx_map_io, - .init_irq = fsm9xxx_init_irq, - .handle_irq = vic_handle_irq, - .init_machine = fsm9xxx_init, - .timer = &msm_timer, - .restart = fsm_restart, -MACHINE_END diff --git a/arch/arm/mach-msm/board-halibut-keypad.c b/arch/arm/mach-msm/board-halibut-keypad.c deleted file mode 100644 index 49c1075627d3..000000000000 --- a/arch/arm/mach-msm/board-halibut-keypad.c +++ /dev/null @@ -1,177 +0,0 @@ -/* linux/arch/arm/mach-msm/board-halibut-keypad.c - * - * Copyright (C) 2007 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#undef MODULE_PARAM_PREFIX -#define MODULE_PARAM_PREFIX "board_halibut." -static int halibut_ffa; -module_param_named(ffa, halibut_ffa, int, S_IRUGO | S_IWUSR | S_IWGRP); - -#define SCAN_FUNCTION_KEYS 0 /* don't turn this on without updating the ffa support */ - -static unsigned int halibut_row_gpios[] = { - 31, 32, 33, 34, 35, 41 -#if SCAN_FUNCTION_KEYS - , 42 -#endif -}; - -static unsigned int halibut_col_gpios[] = { 36, 37, 38, 39, 40 }; - -/* FFA: - 36: KEYSENSE_N(0) - 37: KEYSENSE_N(1) - 38: KEYSENSE_N(2) - 39: KEYSENSE_N(3) - 40: KEYSENSE_N(4) - - 31: KYPD_17 - 32: KYPD_15 - 33: KYPD_13 - 34: KYPD_11 - 35: KYPD_9 - 41: KYPD_MEMO -*/ - -#define KEYMAP_INDEX(row, col) ((row)*ARRAY_SIZE(halibut_col_gpios) + (col)) - -static const unsigned short halibut_keymap[ARRAY_SIZE(halibut_col_gpios) * ARRAY_SIZE(halibut_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_5, - [KEYMAP_INDEX(0, 1)] = KEY_9, - [KEYMAP_INDEX(0, 2)] = 229, /* SOFT1 */ - [KEYMAP_INDEX(0, 3)] = KEY_6, - [KEYMAP_INDEX(0, 4)] = KEY_LEFT, - - [KEYMAP_INDEX(1, 0)] = KEY_0, - [KEYMAP_INDEX(1, 1)] = KEY_RIGHT, - [KEYMAP_INDEX(1, 2)] = KEY_1, - [KEYMAP_INDEX(1, 3)] = 228, /* KEY_SHARP */ - [KEYMAP_INDEX(1, 4)] = KEY_SEND, - - [KEYMAP_INDEX(2, 0)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(2, 1)] = KEY_HOME, /* FA */ - [KEYMAP_INDEX(2, 2)] = KEY_F8, /* QCHT */ - [KEYMAP_INDEX(2, 3)] = KEY_F6, /* R+ */ - [KEYMAP_INDEX(2, 4)] = KEY_F7, /* R- */ - - [KEYMAP_INDEX(3, 0)] = KEY_UP, - [KEYMAP_INDEX(3, 1)] = KEY_CLEAR, - [KEYMAP_INDEX(3, 2)] = KEY_4, - [KEYMAP_INDEX(3, 3)] = KEY_MUTE, /* SPKR */ - [KEYMAP_INDEX(3, 4)] = KEY_2, - - [KEYMAP_INDEX(4, 0)] = 230, /* SOFT2 */ - [KEYMAP_INDEX(4, 1)] = 232, /* KEY_CENTER */ - [KEYMAP_INDEX(4, 2)] = KEY_DOWN, - [KEYMAP_INDEX(4, 3)] = KEY_BACK, /* FB */ - [KEYMAP_INDEX(4, 4)] = KEY_8, - - [KEYMAP_INDEX(5, 0)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */ - [KEYMAP_INDEX(5, 2)] = KEY_MAIL, /* MESG */ - [KEYMAP_INDEX(5, 3)] = KEY_3, - [KEYMAP_INDEX(5, 4)] = KEY_7, - -#if SCAN_FUNCTION_KEYS - [KEYMAP_INDEX(6, 0)] = KEY_F5, - [KEYMAP_INDEX(6, 1)] = KEY_F4, - [KEYMAP_INDEX(6, 2)] = KEY_F3, - [KEYMAP_INDEX(6, 3)] = KEY_F2, - [KEYMAP_INDEX(6, 4)] = KEY_F1 -#endif -}; - -static const unsigned short halibut_keymap_ffa[ARRAY_SIZE(halibut_col_gpios) * ARRAY_SIZE(halibut_row_gpios)] = { - /*[KEYMAP_INDEX(0, 0)] = ,*/ - /*[KEYMAP_INDEX(0, 1)] = ,*/ - [KEYMAP_INDEX(0, 2)] = KEY_1, - [KEYMAP_INDEX(0, 3)] = KEY_SEND, - [KEYMAP_INDEX(0, 4)] = KEY_LEFT, - - [KEYMAP_INDEX(1, 0)] = KEY_3, - [KEYMAP_INDEX(1, 1)] = KEY_RIGHT, - [KEYMAP_INDEX(1, 2)] = KEY_VOLUMEUP, - /*[KEYMAP_INDEX(1, 3)] = ,*/ - [KEYMAP_INDEX(1, 4)] = KEY_6, - - [KEYMAP_INDEX(2, 0)] = KEY_HOME, /* A */ - [KEYMAP_INDEX(2, 1)] = KEY_BACK, /* B */ - [KEYMAP_INDEX(2, 2)] = KEY_0, - [KEYMAP_INDEX(2, 3)] = 228, /* KEY_SHARP */ - [KEYMAP_INDEX(2, 4)] = KEY_9, - - [KEYMAP_INDEX(3, 0)] = KEY_UP, - [KEYMAP_INDEX(3, 1)] = 232, /* KEY_CENTER */ /* i */ - [KEYMAP_INDEX(3, 2)] = KEY_4, - /*[KEYMAP_INDEX(3, 3)] = ,*/ - [KEYMAP_INDEX(3, 4)] = KEY_2, - - [KEYMAP_INDEX(4, 0)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(4, 1)] = KEY_SOUND, - [KEYMAP_INDEX(4, 2)] = KEY_DOWN, - [KEYMAP_INDEX(4, 3)] = KEY_8, - [KEYMAP_INDEX(4, 4)] = KEY_5, - - /*[KEYMAP_INDEX(5, 0)] = ,*/ - [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */ - [KEYMAP_INDEX(5, 2)] = 230, /*SOFT2*/ /* 2 */ - [KEYMAP_INDEX(5, 3)] = KEY_MENU, /* 1 */ - [KEYMAP_INDEX(5, 4)] = KEY_7, -}; - -static struct gpio_event_matrix_info halibut_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = halibut_keymap, - .output_gpios = halibut_row_gpios, - .input_gpios = halibut_col_gpios, - .noutputs = ARRAY_SIZE(halibut_row_gpios), - .ninputs = ARRAY_SIZE(halibut_col_gpios), - .settle_time.tv.nsec = 0, - .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE | GPIOKPF_PRINT_UNMAPPED_KEYS /*| GPIOKPF_PRINT_MAPPED_KEYS*/ -}; - -struct gpio_event_info *halibut_keypad_info[] = { - &halibut_matrix_info.info -}; - -static struct gpio_event_platform_data halibut_keypad_data = { - .name = "halibut_keypad", - .info = halibut_keypad_info, - .info_count = ARRAY_SIZE(halibut_keypad_info) -}; - -static struct platform_device halibut_keypad_device = { - .name = GPIO_EVENT_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &halibut_keypad_data, - }, -}; - -static int __init halibut_init_keypad(void) -{ - if (!machine_is_halibut()) - return 0; - if (halibut_ffa) - halibut_matrix_info.keymap = halibut_keymap_ffa; - return platform_device_register(&halibut_keypad_device); -} - -device_initcall(halibut_init_keypad); diff --git a/arch/arm/mach-msm/board-halibut-panel.c b/arch/arm/mach-msm/board-halibut-panel.c deleted file mode 100644 index 2a6a6ed02049..000000000000 --- a/arch/arm/mach-msm/board-halibut-panel.c +++ /dev/null @@ -1,73 +0,0 @@ -/* linux/arch/arm/mach-msm/board-halibut-mddi.c -** Author: Brian Swetland -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "devices.h" -#include "board-halibut.h" - -static void halibut_mddi_power_client(struct msm_mddi_client_data *mddi, - int on) -{ -} - -static struct resource resources_msm_fb = { - .start = MSM_FB_BASE, - .end = MSM_FB_BASE + MSM_FB_SIZE - 1, - .flags = IORESOURCE_MEM, -}; - -static struct msm_fb_data fb_data = { - .xres = 800, - .yres = 480, - .output_format = 0, -}; - -static struct msm_mddi_platform_data mddi_pdata = { - .clk_rate = 122880000, - .power_client = halibut_mddi_power_client, - .fb_resource = &resources_msm_fb, - .num_clients = 1, - .client_platform_data = { - { - .product_id = (0x4474 << 16 | 0xc065), - .name = "mddi_c_dummy", - .id = 0, - .client_data = &fb_data, - .clk_rate = 0, - }, - }, -}; - -int __init halibut_init_panel(void) -{ - int rc; - - if (!machine_is_halibut()) - return 0; - - rc = platform_device_register(&msm_device_mdp); - if (rc) - return rc; - - msm_device_mddi0.dev.platform_data = &mddi_pdata; - return platform_device_register(&msm_device_mddi0); -} - -device_initcall(halibut_init_panel); diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c deleted file mode 100644 index 84d720af34ab..000000000000 --- a/arch/arm/mach-msm/board-halibut.c +++ /dev/null @@ -1,110 +0,0 @@ -/* linux/arch/arm/mach-msm/board-halibut.c - * - * Copyright (C) 2007 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include "devices.h" -#include "common.h" - -static struct resource smc91x_resources[] = { - [0] = { - .start = 0x9C004300, - .end = 0x9C004400, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MSM_GPIO_TO_INT(49), - .end = MSM_GPIO_TO_INT(49), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device smc91x_device = { - .name = "smc91x", - .id = 0, - .num_resources = ARRAY_SIZE(smc91x_resources), - .resource = smc91x_resources, -}; - -static struct platform_device *devices[] __initdata = { - &msm_device_uart3, - &msm_device_smd, - &msm_device_nand, - &msm_device_hsusb, - &msm_device_i2c, - &smc91x_device, -}; - -static void __init halibut_init_early(void) -{ - arch_ioremap_caller = __msm_ioremap_caller; -} - -static void __init halibut_init_irq(void) -{ - msm_init_irq(); -} - -static void __init halibut_init(void) -{ - platform_add_devices(devices, ARRAY_SIZE(devices)); -} - -static void __init halibut_fixup(struct tag *tags, char **cmdline, - struct meminfo *mi) -{ -} - -static void __init halibut_map_io(void) -{ - msm_map_common_io(); - msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); -} - -static void __init halibut_init_late(void) -{ - smd_debugfs_init(); -} - -MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") - .atag_offset = 0x100, - .fixup = halibut_fixup, - .map_io = halibut_map_io, - .init_early = halibut_init_early, - .init_irq = halibut_init_irq, - .init_machine = halibut_init, - .init_late = halibut_init_late, - .init_time = msm7x01_timer_init, -MACHINE_END diff --git a/arch/arm/mach-msm/board-halibut.h b/arch/arm/mach-msm/board-halibut.h deleted file mode 100644 index edcdacb34c27..000000000000 --- a/arch/arm/mach-msm/board-halibut.h +++ /dev/null @@ -1,20 +0,0 @@ -/* linux/arch/arm/mach-msm/board-trout.h - * ** Author: Brian Swetland - * */ -#ifndef __ARCH_ARM_MACH_MSM_BOARD_HALIBUT_H -#define __ARCH_ARM_MACH_MSM_BOARD_HALIBUT_H - -#define MSM_PMEM_GPU0_BASE (0x10000000 + 64*SZ_1M) -#define MSM_PMEM_GPU0_SIZE 0x800000 -#define MSM_PMEM_MDP_BASE (MSM_PMEM_GPU0_BASE + MSM_PMEM_GPU0_SIZE) -#define MSM_PMEM_MDP_SIZE 0x800000 -#define MSM_PMEM_ADSP_BASE (MSM_PMEM_MDP_BASE + MSM_PMEM_MDP_SIZE) -#define MSM_PMEM_ADSP_SIZE 0x800000 -#define MSM_PMEM_GPU1_BASE (MSM_PMEM_ADSP_BASE + MSM_PMEM_ADSP_SIZE) -#define MSM_PMEM_GPU1_SIZE 0x800000 -#define MSM_FB_BASE (MSM_PMEM_GPU1_BASE + MSM_PMEM_GPU1_SIZE) -#define MSM_FB_SIZE 0x200000 -#define MSM_PMEM_CAMERA_BASE (MSM_FB_BASE + MSM_FB_SIZE) -#define MSM_PMEM_CAMERA_SIZE 0xA00000 - -#endif diff --git a/arch/arm/mach-msm/board-mahimahi-audio.c b/arch/arm/mach-msm/board-mahimahi-audio.c deleted file mode 100644 index 523d187794c1..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-audio.c +++ /dev/null @@ -1,283 +0,0 @@ -/* arch/arm/mach-msm/board-mahimahi-audio.c - * - * Copyright (C) 2009 HTC Corporation - * Copyright (C) 2009 Google Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include "board-mahimahi.h" -#include "pmic.h" -#include "board-mahimahi-tpa2018d1.h" - -#if 0 -#define D(fmt, args...) printk(KERN_INFO "Audio: "fmt, ##args) -#else -#define D(fmt, args...) do {} while (0) -#endif - -static struct mutex mic_lock; -static struct mutex bt_sco_lock; - -static struct q6_hw_info q6_audio_hw[Q6_HW_COUNT] = { - [Q6_HW_HANDSET] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_HEADSET] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_SPEAKER] = { - .min_gain = -1500, - .max_gain = 0, - }, - [Q6_HW_TTY] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_BT_SCO] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_BT_A2DP] = { - .min_gain = -2000, - .max_gain = 0, - }, -}; - -void mahimahi_headset_enable(int en) -{ - D("%s %d\n", __func__, en); - /* enable audio amp */ - if (en) mdelay(15); - gpio_set_value(MAHIMAHI_AUD_JACKHP_EN, !!en); -} - -void mahimahi_speaker_enable(int en) -{ - struct spkr_config_mode scm; - memset(&scm, 0, sizeof(scm)); - - D("%s %d\n", __func__, en); - if (en) { - scm.is_right_chan_en = 0; - scm.is_left_chan_en = 1; - scm.is_stereo_en = 0; - scm.is_hpf_en = 1; - pmic_spkr_en_mute(LEFT_SPKR, 0); - pmic_spkr_en_mute(RIGHT_SPKR, 0); - pmic_set_spkr_configuration(&scm); - pmic_spkr_en(LEFT_SPKR, 1); - pmic_spkr_en(RIGHT_SPKR, 0); - - /* unmute */ - pmic_spkr_en_mute(LEFT_SPKR, 1); - } else { - pmic_spkr_en_mute(LEFT_SPKR, 0); - - pmic_spkr_en(LEFT_SPKR, 0); - pmic_spkr_en(RIGHT_SPKR, 0); - - pmic_set_spkr_configuration(&scm); - } - - if (is_cdma_version(system_rev)) - tpa2018d1_set_speaker_amp(en); -} - -void mahimahi_receiver_enable(int en) -{ - if (is_cdma_version(system_rev) && - ((system_rev == 0xC1) || (system_rev == 0xC2))) { - struct spkr_config_mode scm; - memset(&scm, 0, sizeof(scm)); - - D("%s %d\n", __func__, en); - if (en) { - scm.is_right_chan_en = 1; - scm.is_left_chan_en = 0; - scm.is_stereo_en = 0; - scm.is_hpf_en = 1; - pmic_spkr_en_mute(RIGHT_SPKR, 0); - pmic_set_spkr_configuration(&scm); - pmic_spkr_en(RIGHT_SPKR, 1); - - /* unmute */ - pmic_spkr_en_mute(RIGHT_SPKR, 1); - } else { - pmic_spkr_en_mute(RIGHT_SPKR, 0); - - pmic_spkr_en(RIGHT_SPKR, 0); - - pmic_set_spkr_configuration(&scm); - } - } -} - -static void config_gpio_table(uint32_t *table, int len) -{ - int n; - unsigned id; - for (n = 0; n < len; n++) { - id = table[n]; - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - -static uint32_t bt_sco_enable[] = { - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_OUT, 1, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_IN, 1, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_SYNC, 2, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_CLK, 2, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), -}; - -static uint32_t bt_sco_disable[] = { - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_OUT, 0, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_IN, 0, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_SYNC, 0, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), - PCOM_GPIO_CFG(MAHIMAHI_BT_PCM_CLK, 0, GPIO_INPUT, - GPIO_NO_PULL, GPIO_2MA), -}; - -void mahimahi_bt_sco_enable(int en) -{ - static int bt_sco_refcount; - D("%s %d\n", __func__, en); - - mutex_lock(&bt_sco_lock); - if (en) { - if (++bt_sco_refcount == 1) - config_gpio_table(bt_sco_enable, - ARRAY_SIZE(bt_sco_enable)); - } else { - if (--bt_sco_refcount == 0) { - config_gpio_table(bt_sco_disable, - ARRAY_SIZE(bt_sco_disable)); - gpio_set_value(MAHIMAHI_BT_PCM_OUT, 0); - } - } - mutex_unlock(&bt_sco_lock); -} - -void mahimahi_mic_enable(int en) -{ - static int old_state = 0, new_state = 0; - - D("%s %d\n", __func__, en); - - mutex_lock(&mic_lock); - if (!!en) - new_state++; - else - new_state--; - - if (new_state == 1 && old_state == 0) { - gpio_set_value(MAHIMAHI_AUD_2V5_EN, 1); - mdelay(60); - } else if (new_state == 0 && old_state == 1) - gpio_set_value(MAHIMAHI_AUD_2V5_EN, 0); - else - D("%s: do nothing %d %d\n", __func__, old_state, new_state); - - old_state = new_state; - mutex_unlock(&mic_lock); -} - -void mahimahi_analog_init(void) -{ - D("%s\n", __func__); - /* stereo pmic init */ - pmic_spkr_set_gain(LEFT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_spkr_set_gain(RIGHT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_spkr_en_right_chan(OFF_CMD); - pmic_spkr_en_left_chan(OFF_CMD); - pmic_spkr_add_right_left_chan(OFF_CMD); - pmic_spkr_en_stereo(OFF_CMD); - pmic_spkr_select_usb_with_hpf_20hz(OFF_CMD); - pmic_spkr_bypass_mux(OFF_CMD); - pmic_spkr_en_hpf(ON_CMD); - pmic_spkr_en_sink_curr_from_ref_volt_cir(OFF_CMD); - pmic_spkr_set_mux_hpf_corner_freq(SPKR_FREQ_0_73KHZ); - pmic_mic_set_volt(MIC_VOLT_1_80V); - - gpio_request(MAHIMAHI_AUD_JACKHP_EN, "aud_jackhp_en"); - gpio_request(MAHIMAHI_BT_PCM_OUT, "bt_pcm_out"); - - gpio_direction_output(MAHIMAHI_AUD_JACKHP_EN, 0); - - mutex_lock(&bt_sco_lock); - config_gpio_table(bt_sco_disable, - ARRAY_SIZE(bt_sco_disable)); - gpio_direction_output(MAHIMAHI_BT_PCM_OUT, 0); - mutex_unlock(&bt_sco_lock); -} - -int mahimahi_get_rx_vol(uint8_t hw, int level) -{ - int vol; - - if (level > 100) - level = 100; - else if (level < 0) - level = 0; - - if (is_cdma_version(system_rev) && hw == Q6_HW_HANDSET) { - int handset_volume[6] = { -1600, -1300, -1000, -600, -300, 0 }; - vol = handset_volume[5 * level / 100]; - } else { - struct q6_hw_info *info; - info = &q6_audio_hw[hw]; - vol = info->min_gain + ((info->max_gain - info->min_gain) * level) / 100; - } - - D("%s %d\n", __func__, vol); - return vol; -} - -static struct qsd_acoustic_ops acoustic = { - .enable_mic_bias = mahimahi_mic_enable, -}; - -static struct q6audio_analog_ops ops = { - .init = mahimahi_analog_init, - .speaker_enable = mahimahi_speaker_enable, - .headset_enable = mahimahi_headset_enable, - .receiver_enable = mahimahi_receiver_enable, - .bt_sco_enable = mahimahi_bt_sco_enable, - .int_mic_enable = mahimahi_mic_enable, - .ext_mic_enable = mahimahi_mic_enable, - .get_rx_vol = mahimahi_get_rx_vol, -}; - -void __init mahimahi_audio_init(void) -{ - mutex_init(&mic_lock); - mutex_init(&bt_sco_lock); - q6audio_register_analog_ops(&ops); - acoustic_register_ops(&acoustic); - if (is_cdma_version(system_rev) && - ((system_rev == 0xC1) || (system_rev == 0xC2))) - q6audio_set_acdb_file("default_PMIC.acdb"); -} diff --git a/arch/arm/mach-msm/board-mahimahi-flashlight.c b/arch/arm/mach-msm/board-mahimahi-flashlight.c deleted file mode 100644 index 829b1f11cf21..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-flashlight.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * arch/arm/mach-msm/flashlight.c - flashlight driver - * - * Copyright (C) 2009 zion huang - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi-flashlight.h" - -struct flashlight_struct { - struct led_classdev fl_lcdev; - struct early_suspend early_suspend_flashlight; - spinlock_t spin_lock; - struct hrtimer timer; - int brightness; - int gpio_torch; - int gpio_flash; - int flash_duration_ms; -}; - -static struct flashlight_struct the_fl; - -static inline void toggle(void) -{ - gpio_direction_output(the_fl.gpio_torch, 0); - udelay(2); - gpio_direction_output(the_fl.gpio_torch, 1); - udelay(2); -} - -static void flashlight_hw_command(uint8_t addr, uint8_t data) -{ - int i; - - for (i = 0; i < addr + 17; i++) - toggle(); - udelay(500); - - for (i = 0; i < data; i++) - toggle(); - udelay(500); -} - -static enum hrtimer_restart flashlight_timeout(struct hrtimer *timer) -{ - unsigned long flags; - - pr_debug("%s\n", __func__); - - spin_lock_irqsave(&the_fl.spin_lock, flags); - gpio_direction_output(the_fl.gpio_flash, 0); - the_fl.brightness = LED_OFF; - spin_unlock_irqrestore(&the_fl.spin_lock, flags); - - return HRTIMER_NORESTART; -} - -int flashlight_control(int mode) -{ - int ret = 0; - unsigned long flags; - - pr_debug("%s: mode %d -> %d\n", __func__, - the_fl.brightness, mode); - - spin_lock_irqsave(&the_fl.spin_lock, flags); - - the_fl.brightness = mode; - - switch (mode) { - case FLASHLIGHT_TORCH: - pr_info("%s: half\n", __func__); - /* If we are transitioning from flash to torch, make sure to - * cancel the flash timeout timer, otherwise when it expires, - * the torch will go off as well. - */ - hrtimer_cancel(&the_fl.timer); - flashlight_hw_command(2, 4); - break; - - case FLASHLIGHT_FLASH: - pr_info("%s: full\n", __func__); - hrtimer_cancel(&the_fl.timer); - gpio_direction_output(the_fl.gpio_flash, 0); - udelay(40); - gpio_direction_output(the_fl.gpio_flash, 1); - hrtimer_start(&the_fl.timer, - ktime_set(the_fl.flash_duration_ms / 1000, - (the_fl.flash_duration_ms % 1000) * - NSEC_PER_MSEC), - HRTIMER_MODE_REL); - /* Flash overrides torch mode, and after the flash period, the - * flash LED will turn off. - */ - mode = LED_OFF; - break; - - case FLASHLIGHT_OFF: - pr_info("%s: off\n", __func__); - gpio_direction_output(the_fl.gpio_flash, 0); - gpio_direction_output(the_fl.gpio_torch, 0); - break; - - default: - pr_err("%s: unknown flash_light flags: %d\n", __func__, mode); - ret = -EINVAL; - goto done; - } - -done: - spin_unlock_irqrestore(&the_fl.spin_lock, flags); - return ret; -} -EXPORT_SYMBOL(flashlight_control); - -static void fl_lcdev_brightness_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - int level; - switch (brightness) { - case LED_HALF: - level = FLASHLIGHT_TORCH; - break; - case LED_FULL: - level = FLASHLIGHT_FLASH; - break; - case LED_OFF: - default: - level = FLASHLIGHT_OFF; - }; - - flashlight_control(level); -} - -static void flashlight_early_suspend(struct early_suspend *handler) -{ - flashlight_control(FLASHLIGHT_OFF); -} - -static int flashlight_setup_gpio(struct flashlight_platform_data *fl_pdata) -{ - int ret; - - pr_debug("%s\n", __func__); - - if (fl_pdata->gpio_init) { - ret = fl_pdata->gpio_init(); - if (ret < 0) { - pr_err("%s: gpio init failed: %d\n", __func__, - ret); - return ret; - } - } - - if (fl_pdata->torch) { - ret = gpio_request(fl_pdata->torch, "flashlight_torch"); - if (ret < 0) { - pr_err("%s: gpio_request failed\n", __func__); - return ret; - } - } - - if (fl_pdata->flash) { - ret = gpio_request(fl_pdata->flash, "flashlight_flash"); - if (ret < 0) { - pr_err("%s: gpio_request failed\n", __func__); - gpio_free(fl_pdata->torch); - return ret; - } - } - - the_fl.gpio_torch = fl_pdata->torch; - the_fl.gpio_flash = fl_pdata->flash; - the_fl.flash_duration_ms = fl_pdata->flash_duration_ms; - return 0; -} - -static int flashlight_probe(struct platform_device *pdev) -{ - struct flashlight_platform_data *fl_pdata = pdev->dev.platform_data; - int err = 0; - - pr_debug("%s\n", __func__); - - err = flashlight_setup_gpio(fl_pdata); - if (err < 0) { - pr_err("%s: setup GPIO failed\n", __func__); - goto fail_free_mem; - } - - spin_lock_init(&the_fl.spin_lock); - the_fl.fl_lcdev.name = pdev->name; - the_fl.fl_lcdev.brightness_set = fl_lcdev_brightness_set; - the_fl.fl_lcdev.brightness = LED_OFF; - err = led_classdev_register(&pdev->dev, &the_fl.fl_lcdev); - if (err < 0) { - pr_err("failed on led_classdev_register\n"); - goto fail_free_gpio; - } - - hrtimer_init(&the_fl.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - the_fl.timer.function = flashlight_timeout; - -#ifdef CONFIG_HAS_EARLYSUSPEND - the_fl.early_suspend_flashlight.suspend = flashlight_early_suspend; - the_fl.early_suspend_flashlight.resume = NULL; - register_early_suspend(&the_fl.early_suspend_flashlight); -#endif - - return 0; - -fail_free_gpio: - if (fl_pdata->torch) - gpio_free(fl_pdata->torch); - if (fl_pdata->flash) - gpio_free(fl_pdata->flash); -fail_free_mem: - return err; -} - -static int flashlight_remove(struct platform_device *pdev) -{ - struct flashlight_platform_data *fl_pdata = pdev->dev.platform_data; - - pr_debug("%s\n", __func__); - - hrtimer_cancel(&the_fl.timer); - unregister_early_suspend(&the_fl.early_suspend_flashlight); - flashlight_control(FLASHLIGHT_OFF); - led_classdev_unregister(&the_fl.fl_lcdev); - if (fl_pdata->torch) - gpio_free(fl_pdata->torch); - if (fl_pdata->flash) - gpio_free(fl_pdata->flash); - return 0; -} - -static struct platform_driver flashlight_driver = { - .probe = flashlight_probe, - .remove = flashlight_remove, - .driver = { - .name = FLASHLIGHT_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init flashlight_init(void) -{ - pr_debug("%s\n", __func__); - return platform_driver_register(&flashlight_driver); -} - -static void __exit flashlight_exit(void) -{ - pr_debug("%s\n", __func__); - platform_driver_unregister(&flashlight_driver); -} - -module_init(flashlight_init); -module_exit(flashlight_exit); - -MODULE_AUTHOR("Zion Huang "); -MODULE_DESCRIPTION("flash light driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-mahimahi-flashlight.h b/arch/arm/mach-msm/board-mahimahi-flashlight.h deleted file mode 100644 index 93b4095edaab..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-flashlight.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __ASM_ARM_ARCH_FLASHLIGHT_H -#define __ASM_ARM_ARCH_FLASHLIGHT_H - -#define FLASHLIGHT_NAME "flashlight" - -#define FLASHLIGHT_OFF 0 -#define FLASHLIGHT_TORCH 1 -#define FLASHLIGHT_FLASH 2 -#define FLASHLIGHT_NUM 3 - -struct flashlight_platform_data { - int (*gpio_init) (void); - int torch; - int flash; - int flash_duration_ms; -}; - -int flashlight_control(int level); - -#endif /*__ASM_ARM_ARCH_FLASHLIGHT_H*/ diff --git a/arch/arm/mach-msm/board-mahimahi-keypad.c b/arch/arm/mach-msm/board-mahimahi-keypad.c deleted file mode 100644 index ab38847d15e2..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-keypad.c +++ /dev/null @@ -1,265 +0,0 @@ -/* arch/arm/mach-msm/board-mahimahi-keypad.c - * - * Copyright (C) 2009 Google, Inc - * Copyright (C) 2009 HTC Corporation. - * - * Author: Dima Zavin - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "board-mahimahi.h" - -struct jog_axis_info { - struct gpio_event_axis_info info; - uint16_t in_state; - uint16_t out_state; -}; - -static struct vreg *jog_vreg; -static bool jog_just_on; -static unsigned long jog_on_jiffies; - -static unsigned int mahimahi_col_gpios[] = { 33, 32, 31 }; -static unsigned int mahimahi_row_gpios[] = { 42, 41, 40 }; - -#define KEYMAP_INDEX(col, row) ((col)*ARRAY_SIZE(mahimahi_row_gpios) + (row)) -#define KEYMAP_SIZE (ARRAY_SIZE(mahimahi_col_gpios) * \ - ARRAY_SIZE(mahimahi_row_gpios)) - -/* keypad */ -static const unsigned short mahimahi_keymap[KEYMAP_SIZE] = { - [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(1, 1)] = MATRIX_KEY(1, BTN_MOUSE), -}; - -static const unsigned short mahimahi_cdma_keymap[KEYMAP_SIZE] = { - [KEYMAP_INDEX(0, 0)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(1, 1)] = MATRIX_KEY(1, BTN_MOUSE), - - /* Key (2, 2) is not a physical key on mahimahi. The purpose of - * registering the unused matrix key as a dummy key is to make - * userland able to send/receive the key event for some requested tests - * in lab. of some CDMA carriers (e.g. Verizon). - */ - [KEYMAP_INDEX(2, 2)] = KEY_END, -}; - -static struct gpio_event_matrix_info mahimahi_keypad_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = mahimahi_keymap, - .output_gpios = mahimahi_col_gpios, - .input_gpios = mahimahi_row_gpios, - .noutputs = ARRAY_SIZE(mahimahi_col_gpios), - .ninputs = ARRAY_SIZE(mahimahi_row_gpios), - .settle_time.tv.nsec = 40 * NSEC_PER_USEC, - .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, - .flags = (GPIOKPF_LEVEL_TRIGGERED_IRQ | - GPIOKPF_REMOVE_PHANTOM_KEYS | - GPIOKPF_PRINT_UNMAPPED_KEYS), -}; - -static struct gpio_event_direct_entry mahimahi_keypad_key_map[] = { - { - .gpio = MAHIMAHI_GPIO_POWER_KEY, - .code = KEY_POWER, - }, -}; - -static struct gpio_event_input_info mahimahi_keypad_key_info = { - .info.func = gpio_event_input_func, - .info.no_suspend = true, - .debounce_time.tv.nsec = 5 * NSEC_PER_MSEC, - .flags = 0, - .type = EV_KEY, - .keymap = mahimahi_keypad_key_map, - .keymap_size = ARRAY_SIZE(mahimahi_keypad_key_map) -}; - -/* jogball */ -static uint16_t jogball_axis_map(struct gpio_event_axis_info *info, uint16_t in) -{ - struct jog_axis_info *ai = - container_of(info, struct jog_axis_info, info); - uint16_t out = ai->out_state; - - if (jog_just_on) { - if (jiffies == jog_on_jiffies || jiffies == jog_on_jiffies + 1) - goto ignore; - jog_just_on = 0; - } - if((ai->in_state ^ in) & 1) - out--; - if((ai->in_state ^ in) & 2) - out++; - ai->out_state = out; -ignore: - ai->in_state = in; - return out; -} - -static int jogball_power(const struct gpio_event_platform_data *pdata, bool on) -{ - if (on) { - vreg_enable(jog_vreg); - jog_just_on = 1; - jog_on_jiffies = jiffies; - } else { - vreg_disable(jog_vreg); - } - - return 0; -} - -static int jogball_power_cdma(const struct gpio_event_platform_data *pdata, bool on) -{ - if (on) { - gpio_set_value(MAHIMAHI_CDMA_JOG_2V6_EN, 1); - jog_just_on = 1; - jog_on_jiffies = jiffies; - } else { - gpio_set_value(MAHIMAHI_CDMA_JOG_2V6_EN, 0); - } - - return 0; -} - -static uint32_t jogball_x_gpios[] = { - MAHIMAHI_GPIO_BALL_LEFT, MAHIMAHI_GPIO_BALL_RIGHT, -}; -static uint32_t jogball_y_gpios[] = { - MAHIMAHI_GPIO_BALL_UP, MAHIMAHI_GPIO_BALL_DOWN, -}; - -static struct jog_axis_info jogball_x_axis = { - .info = { - .info.func = gpio_event_axis_func, - .count = ARRAY_SIZE(jogball_x_gpios), - .dev = 1, - .type = EV_REL, - .code = REL_X, - .decoded_size = 1U << ARRAY_SIZE(jogball_x_gpios), - .map = jogball_axis_map, - .gpio = jogball_x_gpios, - .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION, - } -}; - -static struct jog_axis_info jogball_y_axis = { - .info = { - .info.func = gpio_event_axis_func, - .count = ARRAY_SIZE(jogball_y_gpios), - .dev = 1, - .type = EV_REL, - .code = REL_Y, - .decoded_size = 1U << ARRAY_SIZE(jogball_y_gpios), - .map = jogball_axis_map, - .gpio = jogball_y_gpios, - .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION, - } -}; - -static struct gpio_event_info *mahimahi_input_info[] = { - &mahimahi_keypad_matrix_info.info, - &mahimahi_keypad_key_info.info, - &jogball_x_axis.info.info, - &jogball_y_axis.info.info, -}; - -static struct gpio_event_platform_data mahimahi_input_data = { - .names = { - "mahimahi-keypad", - "mahimahi-nav", - NULL, - }, - .info = mahimahi_input_info, - .info_count = ARRAY_SIZE(mahimahi_input_info), - .power = jogball_power, -}; - -static struct platform_device mahimahi_input_device = { - .name = GPIO_EVENT_DEV_NAME, - .id = 0, - .dev = { - .platform_data = &mahimahi_input_data, - }, -}; - -static int mahimahi_reset_keys_up[] = { - KEY_VOLUMEUP, - 0, -}; - -static struct keyreset_platform_data mahimahi_reset_keys_pdata = { - .keys_up = mahimahi_reset_keys_up, - .keys_down = { - KEY_POWER, - KEY_VOLUMEDOWN, - BTN_MOUSE, - 0 - }, -}; - -struct platform_device mahimahi_reset_keys_device = { - .name = KEYRESET_NAME, - .dev = { - .platform_data = &mahimahi_reset_keys_pdata, - }, -}; - - -static int __init mahimahi_init_keypad_jogball(void) -{ - int ret; - - if (!machine_is_mahimahi()) - return 0; - - ret = platform_device_register(&mahimahi_reset_keys_device); - if (ret != 0) - return ret; - - if (is_cdma_version(system_rev)) { - mahimahi_keypad_matrix_info.keymap = mahimahi_cdma_keymap; - /* In the CDMA version, jogball power is supplied by a gpio. */ - ret = gpio_request(MAHIMAHI_CDMA_JOG_2V6_EN, "jog_en"); - if (ret < 0) { - pr_err("%s: gpio_request(%d) failed: %d\n", __func__, - MAHIMAHI_CDMA_JOG_2V6_EN, ret); - return ret; - } - mahimahi_input_data.power = jogball_power_cdma; - } else { - /* in UMTS version, jogball power is supplied by pmic */ - jog_vreg = vreg_get(&mahimahi_input_device.dev, "gp2"); - if (jog_vreg == NULL) - return -ENOENT; - } - - ret = platform_device_register(&mahimahi_input_device); - if (ret != 0) - return ret; - - return 0; -} - -device_initcall(mahimahi_init_keypad_jogball); diff --git a/arch/arm/mach-msm/board-mahimahi-microp.c b/arch/arm/mach-msm/board-mahimahi-microp.c deleted file mode 100644 index 539bebfabc1f..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-microp.c +++ /dev/null @@ -1,2261 +0,0 @@ -/* board-mahimahi-microp.c - * Copyright (C) 2009 Google. - * Copyright (C) 2009 HTC Corporation. - * - * The Microp on mahimahi is an i2c device that supports - * the following functions - * - LEDs (Green, Amber, Jogball backlight) - * - Lightsensor - * - Headset remotekeys - * - G-sensor - * - Interrupts - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi.h" - - -#define MICROP_I2C_NAME "mahimahi-microp" - -#define MICROP_LSENSOR_ADC_CHAN 6 -#define MICROP_REMOTE_KEY_ADC_CHAN 7 - -#define MICROP_I2C_WCMD_MISC 0x20 -#define MICROP_I2C_WCMD_SPI_EN 0x21 -#define MICROP_I2C_WCMD_AUTO_BL_CTL 0x23 -#define MICROP_I2C_RCMD_SPI_BL_STATUS 0x24 -#define MICROP_I2C_WCMD_BUTTONS_LED_CTRL 0x25 -#define MICROP_I2C_RCMD_VERSION 0x30 -#define MICROP_I2C_WCMD_ADC_TABLE 0x42 -#define MICROP_I2C_WCMD_LED_MODE 0x53 -#define MICROP_I2C_RCMD_GREEN_LED_REMAIN_TIME 0x54 -#define MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME 0x55 -#define MICROP_I2C_RCMD_BLUE_LED_REMAIN_TIME 0x57 -#define MICROP_I2C_WCMD_JOGBALL_LED_MODE 0x5A -#define MICROP_I2C_RCMD_JOGBALL_LED_REMAIN_TIME 0x5B -#define MICROP_I2C_WCMD_JOGBALL_LED_PWM_SET 0x5C -#define MICROP_I2C_WCMD_JOGBALL_LED_PERIOD_SET 0x5D -#define MICROP_I2C_WCMD_READ_ADC_VALUE_REQ 0x60 -#define MICROP_I2C_RCMD_ADC_VALUE 0x62 -#define MICROP_I2C_WCMD_REMOTEKEY_TABLE 0x63 -#define MICROP_I2C_WCMD_LCM_REGISTER 0x70 -#define MICROP_I2C_WCMD_GSENSOR_REG 0x73 -#define MICROP_I2C_WCMD_GSENSOR_REG_DATA_REQ 0x74 -#define MICROP_I2C_RCMD_GSENSOR_REG_DATA 0x75 -#define MICROP_I2C_WCMD_GSENSOR_DATA_REQ 0x76 -#define MICROP_I2C_RCMD_GSENSOR_X_DATA 0x77 -#define MICROP_I2C_RCMD_GSENSOR_Y_DATA 0x78 -#define MICROP_I2C_RCMD_GSENSOR_Z_DATA 0x79 -#define MICROP_I2C_RCMD_GSENSOR_DATA 0x7A -#define MICROP_I2C_WCMD_OJ_REG 0x7B -#define MICROP_I2C_WCMD_OJ_REG_DATA_REQ 0x7C -#define MICROP_I2C_RCMD_OJ_REG_DATA 0x7D -#define MICROP_I2C_WCMD_OJ_POS_DATA_REQ 0x7E -#define MICROP_I2C_RCMD_OJ_POS_DATA 0x7F -#define MICROP_I2C_WCMD_GPI_INT_CTL_EN 0x80 -#define MICROP_I2C_WCMD_GPI_INT_CTL_DIS 0x81 -#define MICROP_I2C_RCMD_GPI_INT_STATUS 0x82 -#define MICROP_I2C_RCMD_GPI_STATUS 0x83 -#define MICROP_I2C_WCMD_GPI_INT_STATUS_CLR 0x84 -#define MICROP_I2C_RCMD_GPI_INT_SETTING 0x85 -#define MICROP_I2C_RCMD_REMOTE_KEYCODE 0x87 -#define MICROP_I2C_WCMD_REMOTE_KEY_DEBN_TIME 0x88 -#define MICROP_I2C_WCMD_REMOTE_PLUG_DEBN_TIME 0x89 -#define MICROP_I2C_WCMD_SIMCARD_DEBN_TIME 0x8A -#define MICROP_I2C_WCMD_GPO_LED_STATUS_EN 0x90 -#define MICROP_I2C_WCMD_GPO_LED_STATUS_DIS 0x91 - -#define IRQ_GSENSOR (1<<10) -#define IRQ_LSENSOR (1<<9) -#define IRQ_REMOTEKEY (1<<7) -#define IRQ_HEADSETIN (1<<2) -#define IRQ_SDCARD (1<<0) - -#define READ_GPI_STATE_HPIN (1<<2) -#define READ_GPI_STATE_SDCARD (1<<0) - -#define ALS_CALIBRATE_MODE 147 - -/* Check pattern, to check if ALS has been calibrated */ -#define ALS_CALIBRATED 0x6DA5 - -/* delay for deferred light sensor read */ -#define LS_READ_DELAY (HZ/2) - -/*#define DEBUG_BMA150 */ -#ifdef DEBUG_BMA150 -/* Debug logging of accelleration data */ -#define GSENSOR_LOG_MAX 2048 /* needs to be power of 2 */ -#define GSENSOR_LOG_MASK (GSENSOR_LOG_MAX - 1) - -struct gsensor_log { - ktime_t timestamp; - short x; - short y; - short z; -}; - -static DEFINE_MUTEX(gsensor_log_lock); -static struct gsensor_log gsensor_log[GSENSOR_LOG_MAX]; -static unsigned gsensor_log_head; -static unsigned gsensor_log_tail; - -void gsensor_log_status(ktime_t time, short x, short y, short z) -{ - unsigned n; - mutex_lock(&gsensor_log_lock); - n = gsensor_log_head; - gsensor_log[n].timestamp = time; - gsensor_log[n].x = x; - gsensor_log[n].y = y; - gsensor_log[n].z = z; - n = (n + 1) & GSENSOR_LOG_MASK; - if (n == gsensor_log_tail) - gsensor_log_tail = (gsensor_log_tail + 1) & GSENSOR_LOG_MASK; - gsensor_log_head = n; - mutex_unlock(&gsensor_log_lock); -} - -static int gsensor_log_print(struct seq_file *sf, void *private) -{ - unsigned n; - - mutex_lock(&gsensor_log_lock); - seq_printf(sf, "timestamp X Y Z\n"); - for (n = gsensor_log_tail; - n != gsensor_log_head; - n = (n + 1) & GSENSOR_LOG_MASK) { - seq_printf(sf, "%10d.%010d %6d %6d %6d\n", - gsensor_log[n].timestamp.tv.sec, - gsensor_log[n].timestamp.tv.nsec, - gsensor_log[n].x, gsensor_log[n].y, - gsensor_log[n].z); - } - mutex_unlock(&gsensor_log_lock); - return 0; -} - -static int gsensor_log_open(struct inode *inode, struct file *file) -{ - return single_open(file, gsensor_log_print, NULL); -} - -static struct file_operations gsensor_log_fops = { - .open = gsensor_log_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#endif /* def DEBUG_BMA150 */ - -static int microp_headset_has_mic(void); -static int microp_enable_headset_plug_event(void); -static int microp_enable_key_event(void); -static int microp_disable_key_event(void); - -static struct h35mm_platform_data mahimahi_h35mm_data = { - .plug_event_enable = microp_enable_headset_plug_event, - .headset_has_mic = microp_headset_has_mic, - .key_event_enable = microp_enable_key_event, - .key_event_disable = microp_disable_key_event, -}; - -static struct platform_device mahimahi_h35mm = { - .name = "htc_headset", - .id = -1, - .dev = { - .platform_data = &mahimahi_h35mm_data, - }, -}; - -enum led_type { - GREEN_LED, - AMBER_LED, - RED_LED, - BLUE_LED, - JOGBALL_LED, - BUTTONS_LED, - NUM_LEDS, -}; - -static uint16_t lsensor_adc_table[10] = { - 0x000, 0x001, 0x00F, 0x01E, 0x03C, 0x121, 0x190, 0x2BA, 0x26E, 0x3FF -}; - -static uint16_t remote_key_adc_table[6] = { - 0, 33, 43, 110, 129, 220 -}; - -static uint32_t golden_adc = 0xC0; -static uint32_t als_kadc; - -static struct wake_lock microp_i2c_wakelock; - -static struct i2c_client *private_microp_client; - -struct microp_int_pin { - uint16_t int_gsensor; - uint16_t int_lsensor; - uint16_t int_reset; - uint16_t int_simcard; - uint16_t int_hpin; - uint16_t int_remotekey; -}; - -struct microp_led_data { - int type; - struct led_classdev ldev; - struct mutex led_data_mutex; - struct work_struct brightness_work; - spinlock_t brightness_lock; - enum led_brightness brightness; - uint8_t mode; - uint8_t blink; -}; - -struct microp_i2c_work { - struct work_struct work; - struct i2c_client *client; - int (*intr_debounce)(uint8_t *pin_status); - void (*intr_function)(uint8_t *pin_status); -}; - -struct microp_i2c_client_data { - struct microp_led_data leds[NUM_LEDS]; - uint16_t version; - struct microp_i2c_work work; - struct delayed_work hpin_debounce_work; - struct delayed_work ls_read_work; - struct early_suspend early_suspend; - uint8_t enable_early_suspend; - uint8_t enable_reset_button; - int microp_is_suspend; - int auto_backlight_enabled; - uint8_t light_sensor_enabled; - uint8_t force_light_sensor_read; - uint8_t button_led_value; - int headset_is_in; - int is_hpin_pin_stable; - struct input_dev *ls_input_dev; - uint32_t als_kadc; - uint32_t als_gadc; - uint8_t als_calibrating; -}; - -static char *hex2string(uint8_t *data, int len) -{ - static char buf[101]; - int i; - - i = (sizeof(buf) - 1) / 4; - if (len > i) - len = i; - - for (i = 0; i < len; i++) - sprintf(buf + i * 4, "[%02X]", data[i]); - - return buf; -} - -#define I2C_READ_RETRY_TIMES 10 -#define I2C_WRITE_RETRY_TIMES 10 - -static int i2c_read_block(struct i2c_client *client, uint8_t addr, - uint8_t *data, int length) -{ - int retry; - int ret; - struct i2c_msg msgs[] = { - { - .addr = client->addr, - .flags = 0, - .len = 1, - .buf = &addr, - }, - { - .addr = client->addr, - .flags = I2C_M_RD, - .len = length, - .buf = data, - } - }; - - mdelay(1); - for (retry = 0; retry <= I2C_READ_RETRY_TIMES; retry++) { - ret = i2c_transfer(client->adapter, msgs, 2); - if (ret == 2) { - dev_dbg(&client->dev, "R [%02X] = %s\n", addr, - hex2string(data, length)); - return 0; - } - msleep(10); - } - - dev_err(&client->dev, "i2c_read_block retry over %d\n", - I2C_READ_RETRY_TIMES); - return -EIO; -} - -#define MICROP_I2C_WRITE_BLOCK_SIZE 21 -static int i2c_write_block(struct i2c_client *client, uint8_t addr, - uint8_t *data, int length) -{ - int retry; - uint8_t buf[MICROP_I2C_WRITE_BLOCK_SIZE]; - int ret; - - struct i2c_msg msg[] = { - { - .addr = client->addr, - .flags = 0, - .len = length + 1, - .buf = buf, - } - }; - - dev_dbg(&client->dev, "W [%02X] = %s\n", addr, - hex2string(data, length)); - - if (length + 1 > MICROP_I2C_WRITE_BLOCK_SIZE) { - dev_err(&client->dev, "i2c_write_block length too long\n"); - return -E2BIG; - } - - buf[0] = addr; - memcpy((void *)&buf[1], (void *)data, length); - - mdelay(1); - for (retry = 0; retry <= I2C_WRITE_RETRY_TIMES; retry++) { - ret = i2c_transfer(client->adapter, msg, 1); - if (ret == 1) - return 0; - msleep(10); - } - dev_err(&client->dev, "i2c_write_block retry over %d\n", - I2C_WRITE_RETRY_TIMES); - return -EIO; -} - -static int microp_read_adc(uint8_t channel, uint16_t *value) -{ - struct i2c_client *client; - int ret; - uint8_t cmd[2], data[2]; - - client = private_microp_client; - cmd[0] = 0; - cmd[1] = channel; - ret = i2c_write_block(client, MICROP_I2C_WCMD_READ_ADC_VALUE_REQ, - cmd, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: request adc fail\n", __func__); - return -EIO; - } - - ret = i2c_read_block(client, MICROP_I2C_RCMD_ADC_VALUE, data, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: read adc fail\n", __func__); - return -EIO; - } - *value = data[0] << 8 | data[1]; - return 0; -} - -static int microp_read_gpi_status(struct i2c_client *client, uint16_t *status) -{ - uint8_t data[2]; - int ret; - - ret = i2c_read_block(client, MICROP_I2C_RCMD_GPI_STATUS, data, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: read failed\n", __func__); - return -EIO; - } - *status = (data[0] << 8) | data[1]; - return 0; -} - -static int microp_interrupt_enable(struct i2c_client *client, - uint16_t interrupt_mask) -{ - uint8_t data[2]; - int ret = -1; - - data[0] = interrupt_mask >> 8; - data[1] = interrupt_mask & 0xFF; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_CTL_EN, data, 2); - - if (ret < 0) - dev_err(&client->dev, "%s: enable 0x%x interrupt failed\n", - __func__, interrupt_mask); - return ret; -} - -static int microp_interrupt_disable(struct i2c_client *client, - uint16_t interrupt_mask) -{ - uint8_t data[2]; - int ret = -1; - - data[0] = interrupt_mask >> 8; - data[1] = interrupt_mask & 0xFF; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_CTL_DIS, data, 2); - - if (ret < 0) - dev_err(&client->dev, "%s: disable 0x%x interrupt failed\n", - __func__, interrupt_mask); - return ret; -} - - -/* - * SD slot card-detect support - */ -static unsigned int sdslot_cd = 0; -static void (*sdslot_status_cb)(int card_present, void *dev_id); -static void *sdslot_mmc_dev; - -int mahimahi_microp_sdslot_status_register( - void (*cb)(int card_present, void *dev_id), - void *dev_id) -{ - if (sdslot_status_cb) - return -EBUSY; - sdslot_status_cb = cb; - sdslot_mmc_dev = dev_id; - return 0; -} - -unsigned int mahimahi_microp_sdslot_status(struct device *dev) -{ - return sdslot_cd; -} - -static void mahimahi_microp_sdslot_update_status(int status) -{ - sdslot_cd = !(status & READ_GPI_STATE_SDCARD); - if (sdslot_status_cb) - sdslot_status_cb(sdslot_cd, sdslot_mmc_dev); -} - -/* - *Headset Support -*/ -static void hpin_debounce_do_work(struct work_struct *work) -{ - uint16_t gpi_status = 0; - struct microp_i2c_client_data *cdata; - int insert = 0; - struct i2c_client *client; - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - microp_read_gpi_status(client, &gpi_status); - insert = (gpi_status & READ_GPI_STATE_HPIN) ? 0 : 1; - if (insert != cdata->headset_is_in) { - cdata->headset_is_in = insert; - pr_debug("headset %s\n", insert ? "inserted" : "removed"); - htc_35mm_jack_plug_event(cdata->headset_is_in, - &cdata->is_hpin_pin_stable); - } -} - -static int microp_enable_headset_plug_event(void) -{ - int ret; - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - uint16_t stat; - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - /* enable microp interrupt to detect changes */ - ret = microp_interrupt_enable(client, IRQ_HEADSETIN); - if (ret < 0) { - dev_err(&client->dev, "%s: failed to enable irqs\n", - __func__); - return 0; - } - /* see if headset state has changed */ - microp_read_gpi_status(client, &stat); - stat = !(stat & READ_GPI_STATE_HPIN); - if(cdata->headset_is_in != stat) { - cdata->headset_is_in = stat; - pr_debug("Headset state changed\n"); - htc_35mm_jack_plug_event(stat, &cdata->is_hpin_pin_stable); - } - - return 1; -} - -static int microp_headset_detect_mic(void) -{ - uint16_t data; - - microp_read_adc(MICROP_REMOTE_KEY_ADC_CHAN, &data); - if (data >= 200) - return 1; - else - return 0; -} - -static int microp_headset_has_mic(void) -{ - int mic1 = -1; - int mic2 = -1; - int count = 0; - - mic2 = microp_headset_detect_mic(); - - /* debounce the detection wait until 2 consecutive read are equal */ - while ((mic1 != mic2) && (count < 10)) { - mic1 = mic2; - msleep(600); - mic2 = microp_headset_detect_mic(); - count++; - } - - pr_info("%s: microphone (%d) %s\n", __func__, count, - mic1 ? "present" : "not present"); - - return mic1; -} - -static int microp_enable_key_event(void) -{ - int ret; - struct i2c_client *client; - - client = private_microp_client; - - if (!is_cdma_version(system_rev)) - gpio_set_value(MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN, 1); - - /* turn on key interrupt */ - /* enable microp interrupt to detect changes */ - ret = microp_interrupt_enable(client, IRQ_REMOTEKEY); - if (ret < 0) { - dev_err(&client->dev, "%s: failed to enable irqs\n", - __func__); - return ret; - } - return 0; -} - -static int microp_disable_key_event(void) -{ - int ret; - struct i2c_client *client; - - client = private_microp_client; - - /* shutdown key interrupt */ - if (!is_cdma_version(system_rev)) - gpio_set_value(MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN, 0); - - /* disable microp interrupt to detect changes */ - ret = microp_interrupt_disable(client, IRQ_REMOTEKEY); - if (ret < 0) { - dev_err(&client->dev, "%s: failed to disable irqs\n", - __func__); - return ret; - } - return 0; -} - -static int get_remote_keycode(int *keycode) -{ - struct i2c_client *client = private_microp_client; - int ret; - uint8_t data[2]; - - ret = i2c_read_block(client, MICROP_I2C_RCMD_REMOTE_KEYCODE, data, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: read remote keycode fail\n", - __func__); - return -EIO; - } - pr_debug("%s: key = 0x%x\n", __func__, data[1]); - if (!data[1]) { - *keycode = 0; - return 1; /* no keycode */ - } else { - *keycode = data[1]; - } - return 0; -} - -static ssize_t microp_i2c_remotekey_adc_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct i2c_client *client; - uint16_t value; - int i, button = 0; - int ret; - - client = to_i2c_client(dev); - - microp_read_adc(MICROP_REMOTE_KEY_ADC_CHAN, &value); - - for (i = 0; i < 3; i++) { - if ((value >= remote_key_adc_table[2 * i]) && - (value <= remote_key_adc_table[2 * i + 1])) { - button = i + 1; - } - - } - - ret = sprintf(buf, "Remote Key[0x%03X] => button %d\n", - value, button); - - return ret; -} - -static DEVICE_ATTR(key_adc, 0644, microp_i2c_remotekey_adc_show, NULL); - -/* - * LED support -*/ -static int microp_i2c_write_led_mode(struct i2c_client *client, - struct led_classdev *led_cdev, - uint8_t mode, uint16_t off_timer) -{ - struct microp_i2c_client_data *cdata; - struct microp_led_data *ldata; - uint8_t data[7]; - int ret; - - cdata = i2c_get_clientdata(client); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - - - if (ldata->type == GREEN_LED) { - data[0] = 0x01; - data[1] = mode; - data[2] = off_timer >> 8; - data[3] = off_timer & 0xFF; - data[4] = 0x00; - data[5] = 0x00; - data[6] = 0x00; - } else if (ldata->type == AMBER_LED) { - data[0] = 0x02; - data[1] = 0x00; - data[2] = 0x00; - data[3] = 0x00; - data[4] = mode; - data[5] = off_timer >> 8; - data[6] = off_timer & 0xFF; - } else if (ldata->type == RED_LED) { - data[0] = 0x02; - data[1] = 0x00; - data[2] = 0x00; - data[3] = 0x00; - data[4] = mode? 5: 0; - data[5] = off_timer >> 8; - data[6] = off_timer & 0xFF; - } else if (ldata->type == BLUE_LED) { - data[0] = 0x04; - data[1] = mode; - data[2] = off_timer >> 8; - data[3] = off_timer & 0xFF; - data[4] = 0x00; - data[5] = 0x00; - data[6] = 0x00; - } - - ret = i2c_write_block(client, MICROP_I2C_WCMD_LED_MODE, data, 7); - if (ret == 0) { - mutex_lock(&ldata->led_data_mutex); - if (mode > 1) - ldata->blink = mode; - else - ldata->mode = mode; - mutex_unlock(&ldata->led_data_mutex); - } - return ret; -} - -static ssize_t microp_i2c_led_blink_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - int ret; - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - - mutex_lock(&ldata->led_data_mutex); - ret = sprintf(buf, "%d\n", ldata->blink ? ldata->blink - 1 : 0); - mutex_unlock(&ldata->led_data_mutex); - - return ret; -} - -static ssize_t microp_i2c_led_blink_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - struct i2c_client *client; - int val, ret; - uint8_t mode; - - val = -1; - sscanf(buf, "%u", &val); - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - client = to_i2c_client(dev->parent); - - mutex_lock(&ldata->led_data_mutex); - switch (val) { - case 0: /* stop flashing */ - mode = ldata->mode; - ldata->blink = 0; - break; - case 1: - case 2: - case 3: - mode = val + 1; - break; - - default: - mutex_unlock(&ldata->led_data_mutex); - return -EINVAL; - } - mutex_unlock(&ldata->led_data_mutex); - - ret = microp_i2c_write_led_mode(client, led_cdev, mode, 0xffff); - if (ret) - dev_err(&client->dev, "%s set blink failed\n", led_cdev->name); - - return count; -} - -static DEVICE_ATTR(blink, 0644, microp_i2c_led_blink_show, - microp_i2c_led_blink_store); - -static ssize_t microp_i2c_led_off_timer_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct microp_i2c_client_data *cdata; - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - struct i2c_client *client; - uint8_t data[2]; - int ret, offtime; - - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - client = to_i2c_client(dev->parent); - cdata = i2c_get_clientdata(client); - - dev_dbg(&client->dev, "Getting %s remaining time\n", led_cdev->name); - - if (ldata->type == GREEN_LED) { - ret = i2c_read_block(client, - MICROP_I2C_RCMD_GREEN_LED_REMAIN_TIME, data, 2); - } else if (ldata->type == AMBER_LED) { - ret = i2c_read_block(client, - MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME, - data, 2); - } else if (ldata->type == RED_LED) { - ret = i2c_read_block(client, - MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME, - data, 2); - } else if (ldata->type == BLUE_LED) { - ret = i2c_read_block(client, - MICROP_I2C_RCMD_BLUE_LED_REMAIN_TIME, data, 2); - } else { - dev_err(&client->dev, "Unknown led %s\n", ldata->ldev.name); - return -EINVAL; - } - - if (ret) { - dev_err(&client->dev, - "%s get off_timer failed\n", led_cdev->name); - } - offtime = (int)((data[1] | data[0] << 8) * 2); - - ret = sprintf(buf, "Time remains %d:%d\n", offtime / 60, offtime % 60); - return ret; -} - -static ssize_t microp_i2c_led_off_timer_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - struct i2c_client *client; - int min, sec, ret; - uint16_t off_timer; - - min = -1; - sec = -1; - sscanf(buf, "%d %d", &min, &sec); - - if (min < 0 || min > 255) - return -EINVAL; - if (sec < 0 || sec > 255) - return -EINVAL; - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - client = to_i2c_client(dev->parent); - - dev_dbg(&client->dev, "Setting %s off_timer to %d min %d sec\n", - led_cdev->name, min, sec); - - if (!min && !sec) - off_timer = 0xFFFF; - else - off_timer = (min * 60 + sec) / 2; - - ret = microp_i2c_write_led_mode(client, led_cdev, - ldata->mode, off_timer); - if (ret) { - dev_err(&client->dev, - "%s set off_timer %d min %d sec failed\n", - led_cdev->name, min, sec); - } - return count; -} - -static DEVICE_ATTR(off_timer, 0644, microp_i2c_led_off_timer_show, - microp_i2c_led_off_timer_store); - -static ssize_t microp_i2c_jogball_color_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - struct i2c_client *client; - int rpwm, gpwm, bpwm, ret; - uint8_t data[4]; - - rpwm = -1; - gpwm = -1; - bpwm = -1; - sscanf(buf, "%d %d %d", &rpwm, &gpwm, &bpwm); - - if (rpwm < 0 || rpwm > 255) - return -EINVAL; - if (gpwm < 0 || gpwm > 255) - return -EINVAL; - if (bpwm < 0 || bpwm > 255) - return -EINVAL; - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - client = to_i2c_client(dev->parent); - - dev_dbg(&client->dev, "Setting %s color to R=%d, G=%d, B=%d\n", - led_cdev->name, rpwm, gpwm, bpwm); - - data[0] = rpwm; - data[1] = gpwm; - data[2] = bpwm; - data[3] = 0x00; - - ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_PWM_SET, - data, 4); - if (ret) { - dev_err(&client->dev, - "%s set color R=%d G=%d B=%d failed\n", - led_cdev->name, rpwm, gpwm, bpwm); - } - return count; -} - -static DEVICE_ATTR(color, 0644, NULL, microp_i2c_jogball_color_store); - -static ssize_t microp_i2c_jogball_period_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct led_classdev *led_cdev; - struct microp_led_data *ldata; - struct i2c_client *client; - int period = -1; - int ret; - uint8_t data[4]; - - sscanf(buf, "%d", &period); - - if (period < 2 || period > 12) - return -EINVAL; - - led_cdev = (struct led_classdev *)dev_get_drvdata(dev); - ldata = container_of(led_cdev, struct microp_led_data, ldev); - client = to_i2c_client(dev->parent); - - dev_info(&client->dev, "Setting Jogball flash period to %d\n", period); - - data[0] = 0x00; - data[1] = period; - - ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_PERIOD_SET, - data, 2); - if (ret) { - dev_err(&client->dev, "%s set period=%d failed\n", - led_cdev->name, period); - } - return count; -} - -static DEVICE_ATTR(period, 0644, NULL, microp_i2c_jogball_period_store); - -static void microp_brightness_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - unsigned long flags; - struct i2c_client *client = to_i2c_client(led_cdev->dev->parent); - struct microp_led_data *ldata = - container_of(led_cdev, struct microp_led_data, ldev); - - dev_dbg(&client->dev, "Setting %s brightness current %d new %d\n", - led_cdev->name, led_cdev->brightness, brightness); - - if (brightness > 255) - brightness = 255; - led_cdev->brightness = brightness; - - spin_lock_irqsave(&ldata->brightness_lock, flags); - ldata->brightness = brightness; - spin_unlock_irqrestore(&ldata->brightness_lock, flags); - - schedule_work(&ldata->brightness_work); -} - -static void microp_led_brightness_set_work(struct work_struct *work) -{ - unsigned long flags; - struct microp_led_data *ldata = - container_of(work, struct microp_led_data, brightness_work); - struct led_classdev *led_cdev = &ldata->ldev; - - struct i2c_client *client = to_i2c_client(led_cdev->dev->parent); - - enum led_brightness brightness; - int ret; - uint8_t mode; - - spin_lock_irqsave(&ldata->brightness_lock, flags); - brightness = ldata->brightness; - spin_unlock_irqrestore(&ldata->brightness_lock, flags); - - if (brightness) - mode = 1; - else - mode = 0; - - ret = microp_i2c_write_led_mode(client, led_cdev, mode, 0xffff); - if (ret) { - dev_err(&client->dev, - "led_brightness_set failed to set mode\n"); - } -} - -struct device_attribute *green_amber_attrs[] = { - &dev_attr_blink, - &dev_attr_off_timer, -}; - -struct device_attribute *jogball_attrs[] = { - &dev_attr_color, - &dev_attr_period, -}; - -static void microp_led_buttons_brightness_set_work(struct work_struct *work) -{ - - unsigned long flags; - struct microp_led_data *ldata = - container_of(work, struct microp_led_data, brightness_work); - struct led_classdev *led_cdev = &ldata->ldev; - - struct i2c_client *client = to_i2c_client(led_cdev->dev->parent); - struct microp_i2c_client_data *cdata = i2c_get_clientdata(client); - - - uint8_t data[4] = {0, 0, 0}; - int ret = 0; - enum led_brightness brightness; - uint8_t value; - - - spin_lock_irqsave(&ldata->brightness_lock, flags); - brightness = ldata->brightness; - spin_unlock_irqrestore(&ldata->brightness_lock, flags); - - value = brightness >= 255 ? 0x20 : 0; - - /* avoid a flicker that can occur when writing the same value */ - if (cdata->button_led_value == value) - return; - cdata->button_led_value = value; - - /* in 40ms */ - data[0] = 0x05; - /* duty cycle 0-255 */ - data[1] = value; - /* bit2 == change brightness */ - data[3] = 0x04; - - ret = i2c_write_block(client, MICROP_I2C_WCMD_BUTTONS_LED_CTRL, - data, 4); - if (ret < 0) - dev_err(&client->dev, "%s failed on set buttons\n", __func__); -} - -static void microp_led_jogball_brightness_set_work(struct work_struct *work) -{ - unsigned long flags; - struct microp_led_data *ldata = - container_of(work, struct microp_led_data, brightness_work); - struct led_classdev *led_cdev = &ldata->ldev; - - struct i2c_client *client = to_i2c_client(led_cdev->dev->parent); - uint8_t data[3] = {0, 0, 0}; - int ret = 0; - enum led_brightness brightness; - - spin_lock_irqsave(&ldata->brightness_lock, flags); - brightness = ldata->brightness; - spin_unlock_irqrestore(&ldata->brightness_lock, flags); - - switch (brightness) { - case 0: - data[0] = 0; - break; - case 3: - data[0] = 1; - data[1] = data[2] = 0xFF; - break; - case 7: - data[0] = 2; - data[1] = 0; - data[2] = 60; - break; - default: - dev_warn(&client->dev, "%s: unknown value: %d\n", - __func__, brightness); - break; - } - ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_MODE, - data, 3); - if (ret < 0) - dev_err(&client->dev, "%s failed on set jogball mode:0x%2.2X\n", - __func__, data[0]); -} - -/* - * Light Sensor Support - */ -static int microp_i2c_auto_backlight_mode(struct i2c_client *client, - uint8_t enabled) -{ - uint8_t data[2]; - int ret = 0; - - data[0] = 0; - if (enabled) - data[1] = 1; - else - data[1] = 0; - - ret = i2c_write_block(client, MICROP_I2C_WCMD_AUTO_BL_CTL, data, 2); - if (ret != 0) - pr_err("%s: set auto light sensor fail\n", __func__); - - return ret; -} - -static int lightsensor_enable(void) -{ - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - int ret; - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - if (cdata->microp_is_suspend) { - pr_err("%s: abort, uP is going to suspend after #\n", - __func__); - return -EIO; - } - - disable_irq(client->irq); - ret = microp_i2c_auto_backlight_mode(client, 1); - if (ret < 0) { - pr_err("%s: set auto light sensor fail\n", __func__); - enable_irq(client->irq); - return ret; - } - - cdata->auto_backlight_enabled = 1; - /* TEMPORARY HACK: schedule a deferred light sensor read - * to work around sensor manager race condition - */ - schedule_delayed_work(&cdata->ls_read_work, LS_READ_DELAY); - schedule_work(&cdata->work.work); - - return 0; -} - -static int lightsensor_disable(void) -{ - /* update trigger data when done */ - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - int ret; - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - if (cdata->microp_is_suspend) { - pr_err("%s: abort, uP is going to suspend after #\n", - __func__); - return -EIO; - } - - cancel_delayed_work(&cdata->ls_read_work); - - ret = microp_i2c_auto_backlight_mode(client, 0); - if (ret < 0) - pr_err("%s: disable auto light sensor fail\n", - __func__); - else - cdata->auto_backlight_enabled = 0; - return 0; -} - -static int microp_lightsensor_read(uint16_t *adc_value, - uint8_t *adc_level) -{ - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - uint8_t i; - int ret; - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - ret = microp_read_adc(MICROP_LSENSOR_ADC_CHAN, adc_value); - if (ret != 0) - return -1; - - if (*adc_value > 0x3FF) { - pr_warning("%s: get wrong value: 0x%X\n", - __func__, *adc_value); - return -1; - } else { - if (!cdata->als_calibrating) { - *adc_value = *adc_value - * cdata->als_gadc / cdata->als_kadc; - if (*adc_value > 0x3FF) - *adc_value = 0x3FF; - } - - *adc_level = ARRAY_SIZE(lsensor_adc_table) - 1; - for (i = 0; i < ARRAY_SIZE(lsensor_adc_table); i++) { - if (*adc_value <= lsensor_adc_table[i]) { - *adc_level = i; - break; - } - } - pr_debug("%s: ADC value: 0x%X, level: %d #\n", - __func__, *adc_value, *adc_level); - } - - return 0; -} - -static ssize_t microp_i2c_lightsensor_adc_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - uint8_t adc_level = 0; - uint16_t adc_value = 0; - int ret; - - ret = microp_lightsensor_read(&adc_value, &adc_level); - - ret = sprintf(buf, "ADC[0x%03X] => level %d\n", adc_value, adc_level); - - return ret; -} - -static DEVICE_ATTR(ls_adc, 0644, microp_i2c_lightsensor_adc_show, NULL); - -static ssize_t microp_i2c_ls_auto_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct i2c_client *client; - uint8_t data[2] = {0, 0}; - int ret; - - client = to_i2c_client(dev); - - i2c_read_block(client, MICROP_I2C_RCMD_SPI_BL_STATUS, data, 2); - ret = sprintf(buf, "Light sensor Auto = %d, SPI enable = %d\n", - data[0], data[1]); - - return ret; -} - -static ssize_t microp_i2c_ls_auto_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - uint8_t enable = 0; - int ls_auto; - - ls_auto = -1; - sscanf(buf, "%d", &ls_auto); - - if (ls_auto != 0 && ls_auto != 1 && ls_auto != ALS_CALIBRATE_MODE) - return -EINVAL; - - client = to_i2c_client(dev); - cdata = i2c_get_clientdata(client); - - if (ls_auto) { - enable = 1; - cdata->als_calibrating = (ls_auto == ALS_CALIBRATE_MODE) ? 1 : 0; - cdata->auto_backlight_enabled = 1; - } else { - enable = 0; - cdata->als_calibrating = 0; - cdata->auto_backlight_enabled = 0; - } - - microp_i2c_auto_backlight_mode(client, enable); - - return count; -} - -static DEVICE_ATTR(ls_auto, 0644, microp_i2c_ls_auto_show, - microp_i2c_ls_auto_store); - -DEFINE_MUTEX(api_lock); -static int lightsensor_opened; - -static int lightsensor_open(struct inode *inode, struct file *file) -{ - int rc = 0; - pr_debug("%s\n", __func__); - mutex_lock(&api_lock); - if (lightsensor_opened) { - pr_err("%s: already opened\n", __func__); - rc = -EBUSY; - } - lightsensor_opened = 1; - mutex_unlock(&api_lock); - return rc; -} - -static int lightsensor_release(struct inode *inode, struct file *file) -{ - pr_debug("%s\n", __func__); - mutex_lock(&api_lock); - lightsensor_opened = 0; - mutex_unlock(&api_lock); - return 0; -} - -static long lightsensor_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rc, val; - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - - mutex_lock(&api_lock); - - client = private_microp_client; - cdata = i2c_get_clientdata(client); - - pr_debug("%s cmd %d\n", __func__, _IOC_NR(cmd)); - - switch (cmd) { - case LIGHTSENSOR_IOCTL_ENABLE: - if (get_user(val, (unsigned long __user *)arg)) { - rc = -EFAULT; - break; - } - rc = val ? lightsensor_enable() : lightsensor_disable(); - break; - case LIGHTSENSOR_IOCTL_GET_ENABLED: - val = cdata->auto_backlight_enabled; - pr_debug("%s enabled %d\n", __func__, val); - rc = put_user(val, (unsigned long __user *)arg); - break; - default: - pr_err("%s: invalid cmd %d\n", __func__, _IOC_NR(cmd)); - rc = -EINVAL; - } - - mutex_unlock(&api_lock); - return rc; -} - -static struct file_operations lightsensor_fops = { - .owner = THIS_MODULE, - .open = lightsensor_open, - .release = lightsensor_release, - .unlocked_ioctl = lightsensor_ioctl -}; - -struct miscdevice lightsensor_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "lightsensor", - .fops = &lightsensor_fops -}; - -/* - * G-sensor - */ -static int microp_spi_enable(uint8_t on) -{ - struct i2c_client *client; - int ret; - - client = private_microp_client; - ret = i2c_write_block(client, MICROP_I2C_WCMD_SPI_EN, &on, 1); - if (ret < 0) { - dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__); - return ret; - } - msleep(10); - return ret; -} - -static int gsensor_read_reg(uint8_t reg, uint8_t *data) -{ - struct i2c_client *client; - int ret; - uint8_t tmp[2]; - - client = private_microp_client; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_REG_DATA_REQ, - ®, 1); - if (ret < 0) { - dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__); - return ret; - } - msleep(10); - - ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_REG_DATA, tmp, 2); - if (ret < 0) { - dev_err(&client->dev,"%s: i2c_read_block fail\n", __func__); - return ret; - } - *data = tmp[1]; - return ret; -} - -static int gsensor_write_reg(uint8_t reg, uint8_t data) -{ - struct i2c_client *client; - int ret; - uint8_t tmp[2]; - - client = private_microp_client; - - tmp[0] = reg; - tmp[1] = data; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_REG, tmp, 2); - if (ret < 0) { - dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__); - return ret; - } - - return ret; -} - -static int gsensor_read_acceleration(short *buf) -{ - struct i2c_client *client; - int ret; - uint8_t tmp[6]; - struct microp_i2c_client_data *cdata; - - client = private_microp_client; - - cdata = i2c_get_clientdata(client); - - tmp[0] = 1; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_DATA_REQ, - tmp, 1); - if (ret < 0) { - dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__); - return ret; - } - - msleep(10); - - if (cdata->version <= 0x615) { - /* - * Note the data is a 10bit signed value from the chip. - */ - ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_X_DATA, - tmp, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: i2c_read_block fail\n", - __func__); - return ret; - } - buf[0] = (short)(tmp[0] << 8 | tmp[1]); - buf[0] >>= 6; - - ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_Y_DATA, - tmp, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: i2c_read_block fail\n", - __func__); - return ret; - } - buf[1] = (short)(tmp[0] << 8 | tmp[1]); - buf[1] >>= 6; - - ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_Z_DATA, - tmp, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: i2c_read_block fail\n", - __func__); - return ret; - } - buf[2] = (short)(tmp[0] << 8 | tmp[1]); - buf[2] >>= 6; - } else { - ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_DATA, - tmp, 6); - if (ret < 0) { - dev_err(&client->dev, "%s: i2c_read_block fail\n", - __func__); - return ret; - } - buf[0] = (short)(tmp[0] << 8 | tmp[1]); - buf[0] >>= 6; - buf[1] = (short)(tmp[2] << 8 | tmp[3]); - buf[1] >>= 6; - buf[2] = (short)(tmp[4] << 8 | tmp[5]); - buf[2] >>= 6; - } - -#ifdef DEBUG_BMA150 - /* Log this to debugfs */ - gsensor_log_status(ktime_get(), buf[0], buf[1], buf[2]); -#endif - return 1; -} - -static int gsensor_init_hw(void) -{ - uint8_t reg; - int ret; - - pr_debug("%s\n", __func__); - - microp_spi_enable(1); - - ret = gsensor_read_reg(RANGE_BWIDTH_REG, ®); - if (ret < 0 ) - return -EIO; - reg &= 0xe0; - ret = gsensor_write_reg(RANGE_BWIDTH_REG, reg); - if (ret < 0 ) - return -EIO; - - ret = gsensor_read_reg(SMB150_CONF2_REG, ®); - if (ret < 0 ) - return -EIO; - reg |= (1 << 3); - ret = gsensor_write_reg(SMB150_CONF2_REG, reg); - - return ret; -} - -static int bma150_set_mode(char mode) -{ - uint8_t reg; - int ret; - - pr_debug("%s mode = %d\n", __func__, mode); - if (mode == BMA_MODE_NORMAL) - microp_spi_enable(1); - - - ret = gsensor_read_reg(SMB150_CTRL_REG, ®); - if (ret < 0 ) - return -EIO; - reg = (reg & 0xfe) | mode; - ret = gsensor_write_reg(SMB150_CTRL_REG, reg); - - if (mode == BMA_MODE_SLEEP) - microp_spi_enable(0); - - return ret; -} -static int gsensor_read(uint8_t *data) -{ - int ret; - uint8_t reg = data[0]; - - ret = gsensor_read_reg(reg, &data[1]); - pr_debug("%s reg = %x data = %x\n", __func__, reg, data[1]); - return ret; -} - -static int gsensor_write(uint8_t *data) -{ - int ret; - uint8_t reg = data[0]; - - pr_debug("%s reg = %x data = %x\n", __func__, reg, data[1]); - ret = gsensor_write_reg(reg, data[1]); - return ret; -} - -static int bma150_open(struct inode *inode, struct file *file) -{ - pr_debug("%s\n", __func__); - return nonseekable_open(inode, file); -} - -static int bma150_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static int bma150_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - void __user *argp = (void __user *)arg; - char rwbuf[8]; - int ret = -1; - short buf[8], temp; - - switch (cmd) { - case BMA_IOCTL_READ: - case BMA_IOCTL_WRITE: - case BMA_IOCTL_SET_MODE: - if (copy_from_user(&rwbuf, argp, sizeof(rwbuf))) - return -EFAULT; - break; - case BMA_IOCTL_READ_ACCELERATION: - if (copy_from_user(&buf, argp, sizeof(buf))) - return -EFAULT; - break; - default: - break; - } - - switch (cmd) { - case BMA_IOCTL_INIT: - ret = gsensor_init_hw(); - if (ret < 0) - return ret; - break; - - case BMA_IOCTL_READ: - if (rwbuf[0] < 1) - return -EINVAL; - ret = gsensor_read(rwbuf); - if (ret < 0) - return ret; - break; - case BMA_IOCTL_WRITE: - if (rwbuf[0] < 2) - return -EINVAL; - ret = gsensor_write(rwbuf); - if (ret < 0) - return ret; - break; - case BMA_IOCTL_READ_ACCELERATION: - ret = gsensor_read_acceleration(&buf[0]); - if (ret < 0) - return ret; - break; - case BMA_IOCTL_SET_MODE: - bma150_set_mode(rwbuf[0]); - break; - case BMA_IOCTL_GET_INT: - temp = 0; - break; - default: - return -ENOTTY; - } - - switch (cmd) { - case BMA_IOCTL_READ: - if (copy_to_user(argp, &rwbuf, sizeof(rwbuf))) - return -EFAULT; - break; - case BMA_IOCTL_READ_ACCELERATION: - if (copy_to_user(argp, &buf, sizeof(buf))) - return -EFAULT; - break; - case BMA_IOCTL_GET_INT: - if (copy_to_user(argp, &temp, sizeof(temp))) - return -EFAULT; - break; - default: - break; - } - - return 0; -} - -static struct file_operations bma_fops = { - .owner = THIS_MODULE, - .open = bma150_open, - .release = bma150_release, - .ioctl = bma150_ioctl, -}; - -static struct miscdevice spi_bma_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = BMA150_G_SENSOR_NAME, - .fops = &bma_fops, -}; - -/* - * Interrupt - */ -static irqreturn_t microp_i2c_intr_irq_handler(int irq, void *dev_id) -{ - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - - client = to_i2c_client(dev_id); - cdata = i2c_get_clientdata(client); - - dev_dbg(&client->dev, "intr_irq_handler\n"); - - disable_irq_nosync(client->irq); - schedule_work(&cdata->work.work); - return IRQ_HANDLED; -} - -static void microp_i2c_intr_work_func(struct work_struct *work) -{ - struct microp_i2c_work *up_work; - struct i2c_client *client; - struct microp_i2c_client_data *cdata; - uint8_t data[3], adc_level; - uint16_t intr_status = 0, adc_value, gpi_status = 0; - int keycode = 0, ret = 0; - - up_work = container_of(work, struct microp_i2c_work, work); - client = up_work->client; - cdata = i2c_get_clientdata(client); - - ret = i2c_read_block(client, MICROP_I2C_RCMD_GPI_INT_STATUS, data, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: read interrupt status fail\n", - __func__); - } - - intr_status = data[0]<<8 | data[1]; - ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_STATUS_CLR, - data, 2); - if (ret < 0) { - dev_err(&client->dev, "%s: clear interrupt status fail\n", - __func__); - } - pr_debug("intr_status=0x%02x\n", intr_status); - - if ((intr_status & IRQ_LSENSOR) || cdata->force_light_sensor_read) { - ret = microp_lightsensor_read(&adc_value, &adc_level); - if (cdata->force_light_sensor_read) { - /* report an invalid value first to ensure we trigger an event - * when adc_level is zero. - */ - input_report_abs(cdata->ls_input_dev, ABS_MISC, -1); - input_sync(cdata->ls_input_dev); - cdata->force_light_sensor_read = 0; - } - input_report_abs(cdata->ls_input_dev, ABS_MISC, (int)adc_level); - input_sync(cdata->ls_input_dev); - } - - if (intr_status & IRQ_SDCARD) { - microp_read_gpi_status(client, &gpi_status); - mahimahi_microp_sdslot_update_status(gpi_status); - } - - if (intr_status & IRQ_HEADSETIN) { - cdata->is_hpin_pin_stable = 0; - wake_lock_timeout(µp_i2c_wakelock, 3*HZ); - if (!cdata->headset_is_in) - schedule_delayed_work(&cdata->hpin_debounce_work, - msecs_to_jiffies(500)); - else - schedule_delayed_work(&cdata->hpin_debounce_work, - msecs_to_jiffies(300)); - } - if (intr_status & IRQ_REMOTEKEY) { - if ((get_remote_keycode(&keycode) == 0) && - (cdata->is_hpin_pin_stable)) { - htc_35mm_key_event(keycode, &cdata->is_hpin_pin_stable); - } - } - - enable_irq(client->irq); -} - -static void ls_read_do_work(struct work_struct *work) -{ - struct i2c_client *client = private_microp_client; - struct microp_i2c_client_data *cdata = i2c_get_clientdata(client); - - /* force a light sensor reading */ - disable_irq(client->irq); - cdata->force_light_sensor_read = 1; - schedule_work(&cdata->work.work); -} - -static int microp_function_initialize(struct i2c_client *client) -{ - struct microp_i2c_client_data *cdata; - uint8_t data[20]; - uint16_t stat, interrupts = 0; - int i; - int ret; - struct led_classdev *led_cdev; - - cdata = i2c_get_clientdata(client); - - /* Light Sensor */ - if (als_kadc >> 16 == ALS_CALIBRATED) - cdata->als_kadc = als_kadc & 0xFFFF; - else { - cdata->als_kadc = 0; - pr_info("%s: no ALS calibrated\n", __func__); - } - - if (cdata->als_kadc && golden_adc) { - cdata->als_kadc = - (cdata->als_kadc > 0 && cdata->als_kadc < 0x400) - ? cdata->als_kadc : golden_adc; - cdata->als_gadc = - (golden_adc > 0) - ? golden_adc : cdata->als_kadc; - } else { - cdata->als_kadc = 1; - cdata->als_gadc = 1; - } - pr_info("%s: als_kadc=0x%x, als_gadc=0x%x\n", - __func__, cdata->als_kadc, cdata->als_gadc); - - for (i = 0; i < 10; i++) { - data[i] = (uint8_t)(lsensor_adc_table[i] - * cdata->als_kadc / cdata->als_gadc >> 8); - data[i + 10] = (uint8_t)(lsensor_adc_table[i] - * cdata->als_kadc / cdata->als_gadc); - } - ret = i2c_write_block(client, MICROP_I2C_WCMD_ADC_TABLE, data, 20); - if (ret) - goto exit; - - ret = gpio_request(MAHIMAHI_GPIO_LS_EN_N, "microp_i2c"); - if (ret < 0) { - dev_err(&client->dev, "failed on request gpio ls_on\n"); - goto exit; - } - ret = gpio_direction_output(MAHIMAHI_GPIO_LS_EN_N, 0); - if (ret < 0) { - dev_err(&client->dev, "failed on gpio_direction_output" - "ls_on\n"); - goto err_gpio_ls; - } - cdata->light_sensor_enabled = 1; - - /* Headset */ - for (i = 0; i < 6; i++) { - data[i] = (uint8_t)(remote_key_adc_table[i] >> 8); - data[i + 6] = (uint8_t)(remote_key_adc_table[i]); - } - ret = i2c_write_block(client, - MICROP_I2C_WCMD_REMOTEKEY_TABLE, data, 12); - if (ret) - goto exit; - - INIT_DELAYED_WORK( - &cdata->hpin_debounce_work, hpin_debounce_do_work); - INIT_DELAYED_WORK( - &cdata->ls_read_work, ls_read_do_work); - - /* SD Card */ - interrupts |= IRQ_SDCARD; - - /* set LED initial state */ - for (i = 0; i < BLUE_LED; i++) { - led_cdev = &cdata->leds[i].ldev; - microp_i2c_write_led_mode(client, led_cdev, 0, 0xffff); - } - - /* enable the interrupts */ - ret = microp_interrupt_enable(client, interrupts); - if (ret < 0) { - dev_err(&client->dev, "%s: failed to enable gpi irqs\n", - __func__); - goto err_irq_en; - } - - microp_read_gpi_status(client, &stat); - mahimahi_microp_sdslot_update_status(stat); - - return 0; - -err_irq_en: -err_gpio_ls: - gpio_free(MAHIMAHI_GPIO_LS_EN_N); -exit: - return ret; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -void microp_early_suspend(struct early_suspend *h) -{ - struct microp_i2c_client_data *cdata; - struct i2c_client *client = private_microp_client; - int ret; - - if (!client) { - pr_err("%s: dataset: client is empty\n", __func__); - return; - } - cdata = i2c_get_clientdata(client); - - cdata->microp_is_suspend = 1; - - disable_irq(client->irq); - ret = cancel_work_sync(&cdata->work.work); - if (ret != 0) { - enable_irq(client->irq); - } - - if (cdata->auto_backlight_enabled) - microp_i2c_auto_backlight_mode(client, 0); - if (cdata->light_sensor_enabled == 1) { - gpio_set_value(MAHIMAHI_GPIO_LS_EN_N, 1); - cdata->light_sensor_enabled = 0; - } -} - -void microp_early_resume(struct early_suspend *h) -{ - struct i2c_client *client = private_microp_client; - struct microp_i2c_client_data *cdata; - - if (!client) { - pr_err("%s: dataset: client is empty\n", __func__); - return; - } - cdata = i2c_get_clientdata(client); - - gpio_set_value(MAHIMAHI_GPIO_LS_EN_N, 0); - cdata->light_sensor_enabled = 1; - - if (cdata->auto_backlight_enabled) - microp_i2c_auto_backlight_mode(client, 1); - - cdata->microp_is_suspend = 0; - enable_irq(client->irq); -} -#endif - -static int microp_i2c_suspend(struct i2c_client *client, - pm_message_t mesg) -{ - return 0; -} - -static int microp_i2c_resume(struct i2c_client *client) -{ - return 0; -} - -static struct { - const char *name; - void (*led_set_work)(struct work_struct *); - struct device_attribute **attrs; - int attr_cnt; -} microp_leds[] = { - [GREEN_LED] = { - .name = "green", - .led_set_work = microp_led_brightness_set_work, - .attrs = green_amber_attrs, - .attr_cnt = ARRAY_SIZE(green_amber_attrs) - }, - [AMBER_LED] = { - .name = "amber", - .led_set_work = microp_led_brightness_set_work, - .attrs = green_amber_attrs, - .attr_cnt = ARRAY_SIZE(green_amber_attrs) - }, - [RED_LED] = { - .name = "red", - .led_set_work = microp_led_brightness_set_work, - .attrs = green_amber_attrs, - .attr_cnt = ARRAY_SIZE(green_amber_attrs) - }, - [BLUE_LED] = { - .name = "blue", - .led_set_work = microp_led_brightness_set_work, - .attrs = green_amber_attrs, - .attr_cnt = ARRAY_SIZE(green_amber_attrs) - }, - [JOGBALL_LED] = { - .name = "jogball-backlight", - .led_set_work = microp_led_jogball_brightness_set_work, - .attrs = jogball_attrs, - .attr_cnt = ARRAY_SIZE(jogball_attrs) - }, - [BUTTONS_LED] = { - .name = "button-backlight", - .led_set_work = microp_led_buttons_brightness_set_work - }, -}; - -static int microp_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct microp_i2c_client_data *cdata; - uint8_t data[6]; - int ret; - int i; - int j; - - private_microp_client = client; - ret = i2c_read_block(client, MICROP_I2C_RCMD_VERSION, data, 2); - if (ret || !(data[0] && data[1])) { - ret = -ENODEV; - dev_err(&client->dev, "failed on get microp version\n"); - goto err_exit; - } - dev_info(&client->dev, "microp version [%02X][%02X]\n", - data[0], data[1]); - - ret = gpio_request(MAHIMAHI_GPIO_UP_RESET_N, "microp_i2c_wm"); - if (ret < 0) { - dev_err(&client->dev, "failed on request gpio reset\n"); - goto err_exit; - } - ret = gpio_direction_output(MAHIMAHI_GPIO_UP_RESET_N, 1); - if (ret < 0) { - dev_err(&client->dev, - "failed on gpio_direction_output reset\n"); - goto err_gpio_reset; - } - - cdata = kzalloc(sizeof(struct microp_i2c_client_data), GFP_KERNEL); - if (!cdata) { - ret = -ENOMEM; - dev_err(&client->dev, "failed on allocat cdata\n"); - goto err_cdata; - } - - i2c_set_clientdata(client, cdata); - cdata->version = data[0] << 8 | data[1]; - cdata->microp_is_suspend = 0; - cdata->auto_backlight_enabled = 0; - cdata->light_sensor_enabled = 0; - - wake_lock_init(µp_i2c_wakelock, WAKE_LOCK_SUSPEND, - "microp_i2c_present"); - - /* Light Sensor */ - ret = device_create_file(&client->dev, &dev_attr_ls_adc); - ret = device_create_file(&client->dev, &dev_attr_ls_auto); - cdata->ls_input_dev = input_allocate_device(); - if (!cdata->ls_input_dev) { - pr_err("%s: could not allocate input device\n", __func__); - ret = -ENOMEM; - goto err_request_input_dev; - } - cdata->ls_input_dev->name = "lightsensor-level"; - set_bit(EV_ABS, cdata->ls_input_dev->evbit); - input_set_abs_params(cdata->ls_input_dev, ABS_MISC, 0, 9, 0, 0); - - ret = input_register_device(cdata->ls_input_dev); - if (ret < 0) { - dev_err(&client->dev, "%s: can not register input device\n", - __func__); - goto err_register_input_dev; - } - - ret = misc_register(&lightsensor_misc); - if (ret < 0) { - dev_err(&client->dev, "%s: can not register misc device\n", - __func__); - goto err_register_misc_register; - } - - /* LEDs */ - ret = 0; - for (i = 0; i < ARRAY_SIZE(microp_leds) && !ret; ++i) { - struct microp_led_data *ldata = &cdata->leds[i]; - - ldata->type = i; - ldata->ldev.name = microp_leds[i].name; - ldata->ldev.brightness_set = microp_brightness_set; - mutex_init(&ldata->led_data_mutex); - INIT_WORK(&ldata->brightness_work, microp_leds[i].led_set_work); - spin_lock_init(&ldata->brightness_lock); - ret = led_classdev_register(&client->dev, &ldata->ldev); - if (ret) { - ldata->ldev.name = NULL; - break; - } - - for (j = 0; j < microp_leds[i].attr_cnt && !ret; ++j) - ret = device_create_file(ldata->ldev.dev, - microp_leds[i].attrs[j]); - } - if (ret) { - dev_err(&client->dev, "failed to add leds\n"); - goto err_add_leds; - } - - /* Headset */ - cdata->headset_is_in = 0; - cdata->is_hpin_pin_stable = 1; - platform_device_register(&mahimahi_h35mm); - - ret = device_create_file(&client->dev, &dev_attr_key_adc); - - /* G-sensor */ - ret = misc_register(&spi_bma_device); - if (ret < 0) { - pr_err("%s: init bma150 misc_register fail\n", - __func__); - goto err_register_bma150; - } -#ifdef DEBUG_BMA150 - debugfs_create_file("gsensor_log", 0444, NULL, NULL, &gsensor_log_fops); -#endif - /* Setup IRQ handler */ - INIT_WORK(&cdata->work.work, microp_i2c_intr_work_func); - cdata->work.client = client; - - ret = request_irq(client->irq, - microp_i2c_intr_irq_handler, - IRQF_TRIGGER_LOW, - "microp_interrupt", - &client->dev); - if (ret) { - dev_err(&client->dev, "request_irq failed\n"); - goto err_intr; - } - ret = set_irq_wake(client->irq, 1); - if (ret) { - dev_err(&client->dev, "set_irq_wake failed\n"); - goto err_intr; - } - -#ifdef CONFIG_HAS_EARLYSUSPEND - if (cdata->enable_early_suspend) { - cdata->early_suspend.level = - EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; - cdata->early_suspend.suspend = microp_early_suspend; - cdata->early_suspend.resume = microp_early_resume; - register_early_suspend(&cdata->early_suspend); - } -#endif - - ret = microp_function_initialize(client); - if (ret) { - dev_err(&client->dev, "failed on microp function initialize\n"); - goto err_fun_init; - } - - return 0; - -err_fun_init: -err_intr: - misc_deregister(&spi_bma_device); - -err_register_bma150: - platform_device_unregister(&mahimahi_h35mm); - device_remove_file(&client->dev, &dev_attr_key_adc); - -err_add_leds: - for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) { - if (!cdata->leds[i].ldev.name) - continue; - led_classdev_unregister(&cdata->leds[i].ldev); - for (j = 0; j < microp_leds[i].attr_cnt; ++j) - device_remove_file(cdata->leds[i].ldev.dev, - microp_leds[i].attrs[j]); - } - - misc_deregister(&lightsensor_misc); - -err_register_misc_register: - input_unregister_device(cdata->ls_input_dev); - -err_register_input_dev: - input_free_device(cdata->ls_input_dev); - -err_request_input_dev: - wake_lock_destroy(µp_i2c_wakelock); - device_remove_file(&client->dev, &dev_attr_ls_adc); - device_remove_file(&client->dev, &dev_attr_ls_auto); - kfree(cdata); - i2c_set_clientdata(client, NULL); - -err_cdata: -err_gpio_reset: - gpio_free(MAHIMAHI_GPIO_UP_RESET_N); -err_exit: - return ret; -} - -static int microp_i2c_remove(struct i2c_client *client) -{ - struct microp_i2c_client_data *cdata; - int i; - int j; - - cdata = i2c_get_clientdata(client); - - for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) { - struct microp_led_data *ldata = &cdata->leds[i]; - cancel_work_sync(&ldata->brightness_work); - } - -#ifdef CONFIG_HAS_EARLYSUSPEND - if (cdata->enable_early_suspend) { - unregister_early_suspend(&cdata->early_suspend); - } -#endif - - for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) { - if (!cdata->leds[i].ldev.name) - continue; - led_classdev_unregister(&cdata->leds[i].ldev); - for (j = 0; j < microp_leds[i].attr_cnt; ++j) - device_remove_file(cdata->leds[i].ldev.dev, - microp_leds[i].attrs[j]); - } - - free_irq(client->irq, &client->dev); - - gpio_free(MAHIMAHI_GPIO_UP_RESET_N); - - misc_deregister(&lightsensor_misc); - input_unregister_device(cdata->ls_input_dev); - input_free_device(cdata->ls_input_dev); - device_remove_file(&client->dev, &dev_attr_ls_adc); - device_remove_file(&client->dev, &dev_attr_key_adc); - device_remove_file(&client->dev, &dev_attr_ls_auto); - - platform_device_unregister(&mahimahi_h35mm); - - /* G-sensor */ - misc_deregister(&spi_bma_device); - - kfree(cdata); - - return 0; -} - -#define ATAG_ALS 0x5441001b -static int __init parse_tag_als_kadc(const struct tag *tags) -{ - int found = 0; - struct tag *t = (struct tag *)tags; - - for (; t->hdr.size; t = tag_next(t)) { - if (t->hdr.tag == ATAG_ALS) { - found = 1; - break; - } - } - - if (found) - als_kadc = t->u.revision.rev; - pr_debug("%s: als_kadc = 0x%x\n", __func__, als_kadc); - return 0; -} -__tagtable(ATAG_ALS, parse_tag_als_kadc); - -static const struct i2c_device_id microp_i2c_id[] = { - { MICROP_I2C_NAME, 0 }, - { } -}; - -static struct i2c_driver microp_i2c_driver = { - .driver = { - .name = MICROP_I2C_NAME, - }, - .id_table = microp_i2c_id, - .probe = microp_i2c_probe, - .suspend = microp_i2c_suspend, - .resume = microp_i2c_resume, - .remove = microp_i2c_remove, -}; - - -static int __init microp_i2c_init(void) -{ - return i2c_add_driver(µp_i2c_driver); -} - -static void __exit microp_i2c_exit(void) -{ - i2c_del_driver(µp_i2c_driver); -} - -module_init(microp_i2c_init); -module_exit(microp_i2c_exit); - -MODULE_AUTHOR("Eric Olsen "); -MODULE_DESCRIPTION("MicroP I2C driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-mahimahi-mmc.c b/arch/arm/mach-msm/board-mahimahi-mmc.c deleted file mode 100644 index dc5778147503..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-mmc.c +++ /dev/null @@ -1,454 +0,0 @@ -/* linux/arch/arm/mach-msm/board-mahimahi-mmc.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "board-mahimahi.h" -#include "devices.h" - -#undef MAHIMAHI_DEBUG_MMC - -static bool opt_disable_sdcard; -static int __init mahimahi_disablesdcard_setup(char *str) -{ - opt_disable_sdcard = (bool)simple_strtol(str, NULL, 0); - return 1; -} - -__setup("board_mahimahi.disable_sdcard=", mahimahi_disablesdcard_setup); - -static void config_gpio_table(uint32_t *table, int len) -{ - int n; - unsigned id; - for(n = 0; n < len; n++) { - id = table[n]; - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - -static uint32_t sdcard_on_gpio_table[] = { - PCOM_GPIO_CFG(62, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), /* CLK */ - PCOM_GPIO_CFG(63, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* CMD */ - PCOM_GPIO_CFG(64, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT0 */ -}; - -static uint32_t sdcard_off_gpio_table[] = { - PCOM_GPIO_CFG(62, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CLK */ - PCOM_GPIO_CFG(63, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CMD */ - PCOM_GPIO_CFG(64, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT0 */ -}; - -static struct vreg *sdslot_vreg; -static uint32_t sdslot_vdd = 0xffffffff; -static uint32_t sdslot_vreg_enabled; - -static struct { - int mask; - int level; -} mmc_vdd_table[] = { - { MMC_VDD_165_195, 1800 }, - { MMC_VDD_20_21, 2050 }, - { MMC_VDD_21_22, 2150 }, - { MMC_VDD_22_23, 2250 }, - { MMC_VDD_23_24, 2350 }, - { MMC_VDD_24_25, 2450 }, - { MMC_VDD_25_26, 2550 }, - { MMC_VDD_26_27, 2650 }, - { MMC_VDD_27_28, 2750 }, - { MMC_VDD_28_29, 2850 }, - { MMC_VDD_29_30, 2950 }, -}; - -static uint32_t mahimahi_sdslot_switchvdd(struct device *dev, unsigned int vdd) -{ - int i; - int ret; - - if (vdd == sdslot_vdd) - return 0; - - sdslot_vdd = vdd; - - if (vdd == 0) { - config_gpio_table(sdcard_off_gpio_table, - ARRAY_SIZE(sdcard_off_gpio_table)); - vreg_disable(sdslot_vreg); - sdslot_vreg_enabled = 0; - return 0; - } - - if (!sdslot_vreg_enabled) { - ret = vreg_enable(sdslot_vreg); - if (ret) - pr_err("%s: Error enabling vreg (%d)\n", __func__, ret); - config_gpio_table(sdcard_on_gpio_table, - ARRAY_SIZE(sdcard_on_gpio_table)); - sdslot_vreg_enabled = 1; - } - - for (i = 0; i < ARRAY_SIZE(mmc_vdd_table); i++) { - if (mmc_vdd_table[i].mask != (1 << vdd)) - continue; - ret = vreg_set_level(sdslot_vreg, mmc_vdd_table[i].level); - if (ret) - pr_err("%s: Error setting level (%d)\n", __func__, ret); - return 0; - } - - pr_err("%s: Invalid VDD (%d) specified\n", __func__, vdd); - return 0; -} - -static uint32_t mahimahi_cdma_sdslot_switchvdd(struct device *dev, unsigned int vdd) -{ - if (!vdd == !sdslot_vdd) - return 0; - - /* In CDMA version, the vdd of sdslot is not configurable, and it is - * fixed in 2.85V by hardware design. - */ - - sdslot_vdd = vdd ? MMC_VDD_28_29 : 0; - - if (vdd) { - gpio_set_value(MAHIMAHI_CDMA_SD_2V85_EN, 1); - config_gpio_table(sdcard_on_gpio_table, - ARRAY_SIZE(sdcard_on_gpio_table)); - } else { - config_gpio_table(sdcard_off_gpio_table, - ARRAY_SIZE(sdcard_off_gpio_table)); - gpio_set_value(MAHIMAHI_CDMA_SD_2V85_EN, 0); - } - - sdslot_vreg_enabled = !!vdd; - - return 0; -} - -static unsigned int mahimahi_sdslot_status_rev0(struct device *dev) -{ - return !gpio_get_value(MAHIMAHI_GPIO_SDMC_CD_REV0_N); -} - -#define MAHIMAHI_MMC_VDD (MMC_VDD_165_195 | MMC_VDD_20_21 | \ - MMC_VDD_21_22 | MMC_VDD_22_23 | \ - MMC_VDD_23_24 | MMC_VDD_24_25 | \ - MMC_VDD_25_26 | MMC_VDD_26_27 | \ - MMC_VDD_27_28 | MMC_VDD_28_29 | \ - MMC_VDD_29_30) - -int mahimahi_microp_sdslot_status_register(void (*cb)(int, void *), void *); -unsigned int mahimahi_microp_sdslot_status(struct device *); - -static struct mmc_platform_data mahimahi_sdslot_data = { - .ocr_mask = MAHIMAHI_MMC_VDD, - .status = mahimahi_microp_sdslot_status, - .register_status_notify = mahimahi_microp_sdslot_status_register, - .translate_vdd = mahimahi_sdslot_switchvdd, -}; - -static uint32_t wifi_on_gpio_table[] = { - PCOM_GPIO_CFG(51, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(52, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(53, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(54, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT0 */ - PCOM_GPIO_CFG(55, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* CMD */ - PCOM_GPIO_CFG(56, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), /* CLK */ - PCOM_GPIO_CFG(152, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_4MA), /* WLAN IRQ */ -}; - -static uint32_t wifi_off_gpio_table[] = { - PCOM_GPIO_CFG(51, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(52, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(53, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(54, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT0 */ - PCOM_GPIO_CFG(55, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CMD */ - PCOM_GPIO_CFG(56, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CLK */ - PCOM_GPIO_CFG(152, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* WLAN IRQ */ -}; - -/* BCM4329 returns wrong sdio_vsn(1) when we read cccr, - * we use predefined value (sdio_vsn=2) here to initial sdio driver well - */ -static struct embedded_sdio_data mahimahi_wifi_emb_data = { - .cccr = { - .sdio_vsn = 2, - .multi_block = 1, - .low_speed = 0, - .wide_bus = 0, - .high_power = 1, - .high_speed = 1, - }, -}; - -static int mahimahi_wifi_cd = 0; /* WIFI virtual 'card detect' status */ -static void (*wifi_status_cb)(int card_present, void *dev_id); -static void *wifi_status_cb_devid; - -static int mahimahi_wifi_status_register( - void (*callback)(int card_present, void *dev_id), - void *dev_id) -{ - if (wifi_status_cb) - return -EAGAIN; - wifi_status_cb = callback; - wifi_status_cb_devid = dev_id; - return 0; -} - -static unsigned int mahimahi_wifi_status(struct device *dev) -{ - return mahimahi_wifi_cd; -} - -static struct mmc_platform_data mahimahi_wifi_data = { - .ocr_mask = MMC_VDD_28_29, - .built_in = 1, - .status = mahimahi_wifi_status, - .register_status_notify = mahimahi_wifi_status_register, - .embedded_sdio = &mahimahi_wifi_emb_data, -}; - -int mahimahi_wifi_set_carddetect(int val) -{ - pr_info("%s: %d\n", __func__, val); - mahimahi_wifi_cd = val; - if (wifi_status_cb) { - wifi_status_cb(val, wifi_status_cb_devid); - } else - pr_warning("%s: Nobody to notify\n", __func__); - return 0; -} - -static int mahimahi_wifi_power_state; - -int mahimahi_wifi_power(int on) -{ - printk("%s: %d\n", __func__, on); - - if (on) { - config_gpio_table(wifi_on_gpio_table, - ARRAY_SIZE(wifi_on_gpio_table)); - mdelay(50); - } else { - config_gpio_table(wifi_off_gpio_table, - ARRAY_SIZE(wifi_off_gpio_table)); - } - - mdelay(100); - gpio_set_value(MAHIMAHI_GPIO_WIFI_SHUTDOWN_N, on); /* WIFI_SHUTDOWN */ - mdelay(200); - - mahimahi_wifi_power_state = on; - return 0; -} - -static int mahimahi_wifi_reset_state; - -int mahimahi_wifi_reset(int on) -{ - printk("%s: do nothing\n", __func__); - mahimahi_wifi_reset_state = on; - return 0; -} - -int msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat, - unsigned int stat_irq, unsigned long stat_irq_flags); - -int __init mahimahi_init_mmc(unsigned int sys_rev, unsigned debug_uart) -{ - uint32_t id; - - printk("%s()+\n", __func__); - - /* initial WIFI_SHUTDOWN# */ - id = PCOM_GPIO_CFG(MAHIMAHI_GPIO_WIFI_SHUTDOWN_N, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - - msm_add_sdcc(1, &mahimahi_wifi_data, 0, 0); - - if (debug_uart) { - pr_info("%s: sdcard disabled due to debug uart\n", __func__); - goto done; - } - if (opt_disable_sdcard) { - pr_info("%s: sdcard disabled on cmdline\n", __func__); - goto done; - } - - sdslot_vreg_enabled = 0; - - if (is_cdma_version(sys_rev)) { - /* In the CDMA version, sdslot is supplied by a gpio. */ - int rc = gpio_request(MAHIMAHI_CDMA_SD_2V85_EN, "sdslot_en"); - if (rc < 0) { - pr_err("%s: gpio_request(%d) failed: %d\n", __func__, - MAHIMAHI_CDMA_SD_2V85_EN, rc); - return rc; - } - mahimahi_sdslot_data.translate_vdd = mahimahi_cdma_sdslot_switchvdd; - } else { - /* in UMTS version, sdslot is supplied by pmic */ - sdslot_vreg = vreg_get(0, "gp6"); - if (IS_ERR(sdslot_vreg)) - return PTR_ERR(sdslot_vreg); - } - - if (system_rev > 0) - msm_add_sdcc(2, &mahimahi_sdslot_data, 0, 0); - else { - mahimahi_sdslot_data.status = mahimahi_sdslot_status_rev0; - mahimahi_sdslot_data.register_status_notify = NULL; - set_irq_wake(MSM_GPIO_TO_INT(MAHIMAHI_GPIO_SDMC_CD_REV0_N), 1); - msm_add_sdcc(2, &mahimahi_sdslot_data, - MSM_GPIO_TO_INT(MAHIMAHI_GPIO_SDMC_CD_REV0_N), - IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE); - } - -done: - printk("%s()-\n", __func__); - return 0; -} - -#if defined(MAHIMAHI_DEBUG_MMC) && defined(CONFIG_DEBUG_FS) - -static int mahimahimmc_dbg_wifi_reset_set(void *data, u64 val) -{ - mahimahi_wifi_reset((int) val); - return 0; -} - -static int mahimahimmc_dbg_wifi_reset_get(void *data, u64 *val) -{ - *val = mahimahi_wifi_reset_state; - return 0; -} - -static int mahimahimmc_dbg_wifi_cd_set(void *data, u64 val) -{ - mahimahi_wifi_set_carddetect((int) val); - return 0; -} - -static int mahimahimmc_dbg_wifi_cd_get(void *data, u64 *val) -{ - *val = mahimahi_wifi_cd; - return 0; -} - -static int mahimahimmc_dbg_wifi_pwr_set(void *data, u64 val) -{ - mahimahi_wifi_power((int) val); - return 0; -} - -static int mahimahimmc_dbg_wifi_pwr_get(void *data, u64 *val) -{ - *val = mahimahi_wifi_power_state; - return 0; -} - -static int mahimahimmc_dbg_sd_pwr_set(void *data, u64 val) -{ - mahimahi_sdslot_switchvdd(NULL, (unsigned int) val); - return 0; -} - -static int mahimahimmc_dbg_sd_pwr_get(void *data, u64 *val) -{ - *val = sdslot_vdd; - return 0; -} - -static int mahimahimmc_dbg_sd_cd_set(void *data, u64 val) -{ - return -ENOSYS; -} - -static int mahimahimmc_dbg_sd_cd_get(void *data, u64 *val) -{ - *val = mahimahi_sdslot_data.status(NULL); - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(mahimahimmc_dbg_wifi_reset_fops, - mahimahimmc_dbg_wifi_reset_get, - mahimahimmc_dbg_wifi_reset_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(mahimahimmc_dbg_wifi_cd_fops, - mahimahimmc_dbg_wifi_cd_get, - mahimahimmc_dbg_wifi_cd_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(mahimahimmc_dbg_wifi_pwr_fops, - mahimahimmc_dbg_wifi_pwr_get, - mahimahimmc_dbg_wifi_pwr_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(mahimahimmc_dbg_sd_pwr_fops, - mahimahimmc_dbg_sd_pwr_get, - mahimahimmc_dbg_sd_pwr_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(mahimahimmc_dbg_sd_cd_fops, - mahimahimmc_dbg_sd_cd_get, - mahimahimmc_dbg_sd_cd_set, "%llu\n"); - -static int __init mahimahimmc_dbg_init(void) -{ - struct dentry *dent; - - if (!machine_is_mahimahi()) - return 0; - - dent = debugfs_create_dir("mahimahi_mmc_dbg", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("wifi_reset", 0644, dent, NULL, - &mahimahimmc_dbg_wifi_reset_fops); - debugfs_create_file("wifi_cd", 0644, dent, NULL, - &mahimahimmc_dbg_wifi_cd_fops); - debugfs_create_file("wifi_pwr", 0644, dent, NULL, - &mahimahimmc_dbg_wifi_pwr_fops); - debugfs_create_file("sd_pwr", 0644, dent, NULL, - &mahimahimmc_dbg_sd_pwr_fops); - debugfs_create_file("sd_cd", 0644, dent, NULL, - &mahimahimmc_dbg_sd_cd_fops); - return 0; -} - -device_initcall(mahimahimmc_dbg_init); -#endif diff --git a/arch/arm/mach-msm/board-mahimahi-panel.c b/arch/arm/mach-msm/board-mahimahi-panel.c deleted file mode 100644 index 31ec742293eb..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-panel.c +++ /dev/null @@ -1,998 +0,0 @@ -/* linux/arch/arm/mach-msm/board-mahimahi-panel.c - * - * Copyright (c) 2009 Google Inc. - * Author: Dima Zavin - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "board-mahimahi.h" -#include "devices.h" - - -#define SPI_CONFIG (0x00000000) -#define SPI_IO_CONTROL (0x00000004) -#define SPI_OPERATIONAL (0x00000030) -#define SPI_ERROR_FLAGS_EN (0x00000038) -#define SPI_ERROR_FLAGS (0x00000038) -#define SPI_OUTPUT_FIFO (0x00000100) - -static void __iomem *spi_base; -static struct clk *spi_clk ; -static struct vreg *vreg_lcm_rftx_2v6; -static struct vreg *vreg_lcm_aux_2v6; - -static int qspi_send(uint32_t id, uint8_t data) -{ - uint32_t err; - - /* bit-5: OUTPUT_FIFO_NOT_EMPTY */ - while (readl(spi_base + SPI_OPERATIONAL) & (1<<5)) { - if ((err = readl(spi_base + SPI_ERROR_FLAGS))) { - pr_err("%s: ERROR: SPI_ERROR_FLAGS=0x%08x\n", __func__, - err); - return -EIO; - } - } - writel((0x7000 | (id << 9) | data) << 16, spi_base + SPI_OUTPUT_FIFO); - udelay(100); - - return 0; -} - -static int qspi_send_9bit(uint32_t id, uint8_t data) -{ - uint32_t err; - - while (readl(spi_base + SPI_OPERATIONAL) & (1<<5)) { - err = readl(spi_base + SPI_ERROR_FLAGS); - if (err) { - pr_err("%s: ERROR: SPI_ERROR_FLAGS=0x%08x\n", __func__, - err); - return -EIO; - } - } - writel(((id << 8) | data) << 23, spi_base + SPI_OUTPUT_FIFO); - udelay(100); - - return 0; -} - -static int lcm_writeb(uint8_t reg, uint8_t val) -{ - qspi_send(0x0, reg); - qspi_send(0x1, val); - return 0; -} - -static int lcm_writew(uint8_t reg, uint16_t val) -{ - qspi_send(0x0, reg); - qspi_send(0x1, val >> 8); - qspi_send(0x1, val & 0xff); - return 0; -} - -static struct resource resources_msm_fb[] = { - { - .start = MSM_FB_BASE, - .end = MSM_FB_BASE + MSM_FB_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct lcm_tbl { - uint8_t reg; - uint8_t val; -}; - -static struct lcm_tbl samsung_oled_rgb565_init_table[] = { - { 0x31, 0x08 }, - { 0x32, 0x14 }, - { 0x30, 0x2 }, - { 0x27, 0x1 }, - { 0x12, 0x8 }, - { 0x13, 0x8 }, - { 0x15, 0x0 }, - { 0x16, 0x02 }, - { 0x39, 0x24 }, - { 0x17, 0x22 }, - { 0x18, 0x33 }, - { 0x19, 0x3 }, - { 0x1A, 0x1 }, - { 0x22, 0xA4 }, - { 0x23, 0x0 }, - { 0x26, 0xA0 }, -}; - -static struct lcm_tbl samsung_oled_rgb666_init_table[] = { - { 0x31, 0x08 }, - { 0x32, 0x14 }, - { 0x30, 0x2 }, - { 0x27, 0x1 }, - { 0x12, 0x8 }, - { 0x13, 0x8 }, - { 0x15, 0x0 }, - { 0x16, 0x01 }, - { 0x39, 0x24 }, - { 0x17, 0x22 }, - { 0x18, 0x33 }, - { 0x19, 0x3 }, - { 0x1A, 0x1 }, - { 0x22, 0xA4 }, - { 0x23, 0x0 }, - { 0x26, 0xA0 }, -}; - -static struct lcm_tbl *init_tablep = samsung_oled_rgb565_init_table; -static size_t init_table_sz = ARRAY_SIZE(samsung_oled_rgb565_init_table); - -#define OLED_GAMMA_TABLE_SIZE (7 * 3) -static struct lcm_tbl samsung_oled_gamma_table[][OLED_GAMMA_TABLE_SIZE] = { - /* level 10 */ - { - /* Gamma-R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x3f }, - { 0x43, 0x35 }, - { 0x44, 0x30 }, - { 0x45, 0x2c }, - { 0x46, 0x13 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x0 }, - { 0x53, 0x0 }, - { 0x54, 0x27 }, - { 0x55, 0x2b }, - { 0x56, 0x12 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x3f }, - { 0x63, 0x34 }, - { 0x64, 0x2f }, - { 0x65, 0x2b }, - { 0x66, 0x1b }, - }, - - /* level 40 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x3e }, - { 0x43, 0x2e }, - { 0x44, 0x2d }, - { 0x45, 0x28 }, - { 0x46, 0x21 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x0 }, - { 0x53, 0x21 }, - { 0x54, 0x2a }, - { 0x55, 0x28 }, - { 0x56, 0x20 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x3e }, - { 0x63, 0x2d }, - { 0x64, 0x2b }, - { 0x65, 0x26 }, - { 0x66, 0x2d }, - }, - - /* level 70 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x35 }, - { 0x43, 0x2c }, - { 0x44, 0x2b }, - { 0x45, 0x26 }, - { 0x46, 0x29 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x0 }, - { 0x53, 0x25 }, - { 0x54, 0x29 }, - { 0x55, 0x26 }, - { 0x56, 0x28 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x34 }, - { 0x63, 0x2b }, - { 0x64, 0x2a }, - { 0x65, 0x23 }, - { 0x66, 0x37 }, - }, - - /* level 100 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x30 }, - { 0x43, 0x2a }, - { 0x44, 0x2b }, - { 0x45, 0x24 }, - { 0x46, 0x2f }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x0 }, - { 0x53, 0x25 }, - { 0x54, 0x29 }, - { 0x55, 0x24 }, - { 0x56, 0x2e }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x2f }, - { 0x63, 0x29 }, - { 0x64, 0x29 }, - { 0x65, 0x21 }, - { 0x66, 0x3f }, - }, - - /* level 130 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x2e }, - { 0x43, 0x29 }, - { 0x44, 0x2a }, - { 0x45, 0x23 }, - { 0x46, 0x34 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0xa }, - { 0x53, 0x25 }, - { 0x54, 0x28 }, - { 0x55, 0x23 }, - { 0x56, 0x33 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x2d }, - { 0x63, 0x28 }, - { 0x64, 0x27 }, - { 0x65, 0x20 }, - { 0x66, 0x46 }, - }, - - /* level 160 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x2b }, - { 0x43, 0x29 }, - { 0x44, 0x28 }, - { 0x45, 0x23 }, - { 0x46, 0x38 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0xb }, - { 0x53, 0x25 }, - { 0x54, 0x27 }, - { 0x55, 0x23 }, - { 0x56, 0x37 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x29 }, - { 0x63, 0x28 }, - { 0x64, 0x25 }, - { 0x65, 0x20 }, - { 0x66, 0x4b }, - }, - - /* level 190 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x29 }, - { 0x43, 0x29 }, - { 0x44, 0x27 }, - { 0x45, 0x22 }, - { 0x46, 0x3c }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x10 }, - { 0x53, 0x26 }, - { 0x54, 0x26 }, - { 0x55, 0x22 }, - { 0x56, 0x3b }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x28 }, - { 0x63, 0x28 }, - { 0x64, 0x24 }, - { 0x65, 0x1f }, - { 0x66, 0x50 }, - }, - - /* level 220 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x28 }, - { 0x43, 0x28 }, - { 0x44, 0x28 }, - { 0x45, 0x20 }, - { 0x46, 0x40 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x11 }, - { 0x53, 0x25 }, - { 0x54, 0x27 }, - { 0x55, 0x20 }, - { 0x56, 0x3f }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x27 }, - { 0x63, 0x26 }, - { 0x64, 0x26 }, - { 0x65, 0x1c }, - { 0x66, 0x56 }, - }, - - /* level 250 */ - { - /* Gamma -R */ - { 0x40, 0x0 }, - { 0x41, 0x3f }, - { 0x42, 0x2a }, - { 0x43, 0x27 }, - { 0x44, 0x27 }, - { 0x45, 0x1f }, - { 0x46, 0x44 }, - /* Gamma -G */ - { 0x50, 0x0 }, - { 0x51, 0x0 }, - { 0x52, 0x17 }, - { 0x53, 0x24 }, - { 0x54, 0x26 }, - { 0x55, 0x1f }, - { 0x56, 0x43 }, - /* Gamma -B */ - { 0x60, 0x0 }, - { 0x61, 0x3f }, - { 0x62, 0x2a }, - { 0x63, 0x25 }, - { 0x64, 0x24 }, - { 0x65, 0x1b }, - { 0x66, 0x5c }, - }, -}; -#define SAMSUNG_OLED_NUM_LEVELS ARRAY_SIZE(samsung_oled_gamma_table) - -#define SAMSUNG_OLED_MIN_VAL 10 -#define SAMSUNG_OLED_MAX_VAL 250 -#define SAMSUNG_OLED_DEFAULT_VAL (SAMSUNG_OLED_MIN_VAL + \ - (SAMSUNG_OLED_MAX_VAL - \ - SAMSUNG_OLED_MIN_VAL) / 2) - -#define SAMSUNG_OLED_LEVEL_STEP ((SAMSUNG_OLED_MAX_VAL - \ - SAMSUNG_OLED_MIN_VAL) / \ - (SAMSUNG_OLED_NUM_LEVELS - 1)) - - -#define SONY_TFT_DEF_USER_VAL 102 -#define SONY_TFT_MIN_USER_VAL 30 -#define SONY_TFT_MAX_USER_VAL 255 -#define SONY_TFT_DEF_PANEL_VAL 155 -#define SONY_TFT_MIN_PANEL_VAL 26 -#define SONY_TFT_MAX_PANEL_VAL 255 - - -static DEFINE_MUTEX(panel_lock); -static struct work_struct brightness_delayed_work; -static DEFINE_SPINLOCK(brightness_lock); -static uint8_t new_val = SAMSUNG_OLED_DEFAULT_VAL; -static uint8_t last_val = SAMSUNG_OLED_DEFAULT_VAL; -static uint8_t table_sel_vals[] = { 0x43, 0x34 }; -static int table_sel_idx = 0; -static uint8_t tft_panel_on; - -static void gamma_table_bank_select(void) -{ - lcm_writeb(0x39, table_sel_vals[table_sel_idx]); - table_sel_idx ^= 1; -} - -static void samsung_oled_set_gamma_val(int val) -{ - int i; - int level; - int frac; - - val = clamp(val, SAMSUNG_OLED_MIN_VAL, SAMSUNG_OLED_MAX_VAL); - val = (val / 2) * 2; - - level = (val - SAMSUNG_OLED_MIN_VAL) / SAMSUNG_OLED_LEVEL_STEP; - frac = (val - SAMSUNG_OLED_MIN_VAL) % SAMSUNG_OLED_LEVEL_STEP; - - clk_enable(spi_clk); - - for (i = 0; i < OLED_GAMMA_TABLE_SIZE; ++i) { - unsigned int v1; - unsigned int v2 = 0; - u8 v; - if (frac == 0) { - v = samsung_oled_gamma_table[level][i].val; - } else { - - v1 = samsung_oled_gamma_table[level][i].val; - v2 = samsung_oled_gamma_table[level+1][i].val; - v = (v1 * (SAMSUNG_OLED_LEVEL_STEP - frac) + - v2 * frac) / SAMSUNG_OLED_LEVEL_STEP; - } - lcm_writeb(samsung_oled_gamma_table[level][i].reg, v); - } - - gamma_table_bank_select(); - clk_disable(spi_clk); - last_val = val; -} - -static int samsung_oled_panel_init(struct msm_lcdc_panel_ops *ops) -{ - pr_info("%s: +()\n", __func__); - mutex_lock(&panel_lock); - - clk_enable(spi_clk); - /* Set the gamma write target to 4, leave the current gamma set at 2 */ - lcm_writeb(0x39, 0x24); - clk_disable(spi_clk); - - mutex_unlock(&panel_lock); - pr_info("%s: -()\n", __func__); - return 0; -} - -static int samsung_oled_panel_unblank(struct msm_lcdc_panel_ops *ops) -{ - int i; - - pr_info("%s: +()\n", __func__); - - mutex_lock(&panel_lock); - - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 1); - udelay(50); - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 0); - udelay(20); - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 1); - msleep(20); - - clk_enable(spi_clk); - - for (i = 0; i < init_table_sz; i++) - lcm_writeb(init_tablep[i].reg, init_tablep[i].val); - - lcm_writew(0xef, 0xd0e8); - lcm_writeb(0x1d, 0xa0); - table_sel_idx = 0; - gamma_table_bank_select(); - samsung_oled_set_gamma_val(last_val); - msleep(250); - lcm_writeb(0x14, 0x03); - clk_disable(spi_clk); - - mutex_unlock(&panel_lock); - - pr_info("%s: -()\n", __func__); - return 0; -} - -static int samsung_oled_panel_blank(struct msm_lcdc_panel_ops *ops) -{ - pr_info("%s: +()\n", __func__); - mutex_lock(&panel_lock); - - clk_enable(spi_clk); - lcm_writeb(0x14, 0x0); - mdelay(1); - lcm_writeb(0x1d, 0xa1); - clk_disable(spi_clk); - msleep(200); - - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 0); - - mutex_unlock(&panel_lock); - pr_info("%s: -()\n", __func__); - return 0; -} - -struct lcm_cmd { - int reg; - uint32_t val; - unsigned delay; -}; - -#define LCM_GPIO_CFG(gpio, func, str) \ - PCOM_GPIO_CFG(gpio, func, GPIO_OUTPUT, GPIO_NO_PULL, str) - -static uint32_t sony_tft_display_on_gpio_table[] = { - LCM_GPIO_CFG(MAHIMAHI_LCD_R1, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R2, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R3, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R4, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R5, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G0, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G1, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G2, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G3, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G4, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G5, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B1, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B2, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B3, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B4, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B5, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_PCLK, 1, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_VSYNC, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_HSYNC, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_DE, 1, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_CLK, 1, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_DO, 1, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_CSz, 1, GPIO_4MA), -}; - -static uint32_t sony_tft_display_off_gpio_table[] = { - LCM_GPIO_CFG(MAHIMAHI_LCD_R1, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R2, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R3, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R4, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_R5, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G0, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G1, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G2, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G3, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G4, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_G5, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B1, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B2, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B3, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B4, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_B5, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_PCLK, 0, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_VSYNC, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_HSYNC, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_DE, 0, GPIO_8MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_CLK, 0, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_DO, 0, GPIO_4MA), - LCM_GPIO_CFG(MAHIMAHI_LCD_SPI_CSz, 0, GPIO_4MA), -}; - -#undef LCM_GPIO_CFG - -#define SONY_TFT_DEF_PANEL_DELTA \ - (SONY_TFT_DEF_PANEL_VAL - SONY_TFT_MIN_PANEL_VAL) -#define SONY_TFT_DEF_USER_DELTA \ - (SONY_TFT_DEF_USER_VAL - SONY_TFT_MIN_USER_VAL) - -static void sony_tft_set_pwm_val(int val) -{ - pr_info("%s: %d\n", __func__, val); - - last_val = val; - - if (!tft_panel_on) - return; - - if (val <= SONY_TFT_DEF_USER_VAL) { - if (val <= SONY_TFT_MIN_USER_VAL) - val = SONY_TFT_MIN_PANEL_VAL; - else - val = SONY_TFT_DEF_PANEL_DELTA * - (val - SONY_TFT_MIN_USER_VAL) / - SONY_TFT_DEF_USER_DELTA + - SONY_TFT_MIN_PANEL_VAL; - } else - val = (SONY_TFT_MAX_PANEL_VAL - SONY_TFT_DEF_PANEL_VAL) * - (val - SONY_TFT_DEF_USER_VAL) / - (SONY_TFT_MAX_USER_VAL - SONY_TFT_DEF_USER_VAL) + - SONY_TFT_DEF_PANEL_VAL; - - clk_enable(spi_clk); - qspi_send_9bit(0x0, 0x51); - qspi_send_9bit(0x1, val); - qspi_send_9bit(0x0, 0x53); - qspi_send_9bit(0x1, 0x24); - clk_disable(spi_clk); -} - -#undef SONY_TFT_DEF_PANEL_DELTA -#undef SONY_TFT_DEF_USER_DELTA - -static void sony_tft_panel_config_gpio_table(uint32_t *table, int len) -{ - int n; - unsigned id; - for (n = 0; n < len; n++) { - id = table[n]; - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - - -static int sony_tft_panel_power(int on) -{ - unsigned id, on_off; - - if (on) { - on_off = 0; - - vreg_enable(vreg_lcm_aux_2v6); - vreg_enable(vreg_lcm_rftx_2v6); - - id = PM_VREG_PDOWN_AUX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - - id = PM_VREG_PDOWN_RFTX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - mdelay(10); - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 1); - mdelay(10); - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 0); - udelay(500); - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 1); - mdelay(10); - sony_tft_panel_config_gpio_table( - sony_tft_display_on_gpio_table, - ARRAY_SIZE(sony_tft_display_on_gpio_table)); - } else { - on_off = 1; - - gpio_set_value(MAHIMAHI_GPIO_LCD_RST_N, 0); - - mdelay(120); - - vreg_disable(vreg_lcm_rftx_2v6); - vreg_disable(vreg_lcm_aux_2v6); - - id = PM_VREG_PDOWN_RFTX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - - id = PM_VREG_PDOWN_AUX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - sony_tft_panel_config_gpio_table( - sony_tft_display_off_gpio_table, - ARRAY_SIZE(sony_tft_display_off_gpio_table)); - } - return 0; -} - -static int sony_tft_panel_init(struct msm_lcdc_panel_ops *ops) -{ - return 0; -} - -static int sony_tft_panel_unblank(struct msm_lcdc_panel_ops *ops) -{ - pr_info("%s: +()\n", __func__); - - mutex_lock(&panel_lock); - - if (tft_panel_on) { - pr_info("%s: -() already unblanked\n", __func__); - goto done; - } - - sony_tft_panel_power(1); - msleep(45); - - clk_enable(spi_clk); - qspi_send_9bit(0x0, 0x11); - msleep(5); - qspi_send_9bit(0x0, 0x3a); - qspi_send_9bit(0x1, 0x05); - msleep(100); - qspi_send_9bit(0x0, 0x29); - /* unlock register page for pwm setting */ - qspi_send_9bit(0x0, 0xf0); - qspi_send_9bit(0x1, 0x5a); - qspi_send_9bit(0x1, 0x5a); - qspi_send_9bit(0x0, 0xf1); - qspi_send_9bit(0x1, 0x5a); - qspi_send_9bit(0x1, 0x5a); - qspi_send_9bit(0x0, 0xd0); - qspi_send_9bit(0x1, 0x5a); - qspi_send_9bit(0x1, 0x5a); - - qspi_send_9bit(0x0, 0xc2); - qspi_send_9bit(0x1, 0x53); - qspi_send_9bit(0x1, 0x12); - clk_disable(spi_clk); - msleep(100); - tft_panel_on = 1; - sony_tft_set_pwm_val(last_val); - - pr_info("%s: -()\n", __func__); -done: - mutex_unlock(&panel_lock); - return 0; -} - -static int sony_tft_panel_blank(struct msm_lcdc_panel_ops *ops) -{ - pr_info("%s: +()\n", __func__); - - mutex_lock(&panel_lock); - - clk_enable(spi_clk); - qspi_send_9bit(0x0, 0x28); - qspi_send_9bit(0x0, 0x10); - clk_disable(spi_clk); - - msleep(40); - sony_tft_panel_power(0); - tft_panel_on = 0; - - mutex_unlock(&panel_lock); - - pr_info("%s: -()\n", __func__); - return 0; -} - -static struct msm_lcdc_panel_ops mahimahi_lcdc_amoled_panel_ops = { - .init = samsung_oled_panel_init, - .blank = samsung_oled_panel_blank, - .unblank = samsung_oled_panel_unblank, -}; - -static struct msm_lcdc_panel_ops mahimahi_lcdc_tft_panel_ops = { - .init = sony_tft_panel_init, - .blank = sony_tft_panel_blank, - .unblank = sony_tft_panel_unblank, -}; - - -static struct msm_lcdc_timing mahimahi_lcdc_amoled_timing = { - .clk_rate = 24576000, - .hsync_pulse_width = 4, - .hsync_back_porch = 8, - .hsync_front_porch = 8, - .hsync_skew = 0, - .vsync_pulse_width = 2, - .vsync_back_porch = 8, - .vsync_front_porch = 8, - .vsync_act_low = 1, - .hsync_act_low = 1, - .den_act_low = 1, -}; - -static struct msm_lcdc_timing mahimahi_lcdc_tft_timing = { - .clk_rate = 24576000, - .hsync_pulse_width = 2, - .hsync_back_porch = 20, - .hsync_front_porch = 20, - .hsync_skew = 0, - .vsync_pulse_width = 2, - .vsync_back_porch = 6, - .vsync_front_porch = 4, - .vsync_act_low = 1, - .hsync_act_low = 1, - .den_act_low = 0, -}; - -static struct msm_fb_data mahimahi_lcdc_fb_data = { - .xres = 480, - .yres = 800, - .width = 48, - .height = 80, - .output_format = MSM_MDP_OUT_IF_FMT_RGB565, -}; - -static struct msm_lcdc_platform_data mahimahi_lcdc_amoled_platform_data = { - .panel_ops = &mahimahi_lcdc_amoled_panel_ops, - .timing = &mahimahi_lcdc_amoled_timing, - .fb_id = 0, - .fb_data = &mahimahi_lcdc_fb_data, - .fb_resource = &resources_msm_fb[0], -}; - -static struct msm_lcdc_platform_data mahimahi_lcdc_tft_platform_data = { - .panel_ops = &mahimahi_lcdc_tft_panel_ops, - .timing = &mahimahi_lcdc_tft_timing, - .fb_id = 0, - .fb_data = &mahimahi_lcdc_fb_data, - .fb_resource = &resources_msm_fb[0], -}; - -static struct platform_device mahimahi_lcdc_amoled_device = { - .name = "msm_mdp_lcdc", - .id = -1, - .dev = { - .platform_data = &mahimahi_lcdc_amoled_platform_data, - }, -}; - -static struct platform_device mahimahi_lcdc_tft_device = { - .name = "msm_mdp_lcdc", - .id = -1, - .dev = { - .platform_data = &mahimahi_lcdc_tft_platform_data, - }, -}; - -static int mahimahi_init_spi_hack(void) -{ - int ret; - - spi_base = ioremap(MSM_SPI_PHYS, MSM_SPI_SIZE); - if (!spi_base) - return -1; - - spi_clk = clk_get(&msm_device_spi.dev, "spi_clk"); - if (IS_ERR(spi_clk)) { - pr_err("%s: unable to get spi_clk\n", __func__); - ret = PTR_ERR(spi_clk); - goto err_clk_get; - } - - clk_enable(spi_clk); - - printk("spi: SPI_CONFIG=%x\n", readl(spi_base + SPI_CONFIG)); - printk("spi: SPI_IO_CONTROL=%x\n", readl(spi_base + SPI_IO_CONTROL)); - printk("spi: SPI_OPERATIONAL=%x\n", readl(spi_base + SPI_OPERATIONAL)); - printk("spi: SPI_ERROR_FLAGS_EN=%x\n", - readl(spi_base + SPI_ERROR_FLAGS_EN)); - printk("spi: SPI_ERROR_FLAGS=%x\n", readl(spi_base + SPI_ERROR_FLAGS)); - printk("-%s()\n", __FUNCTION__); - clk_disable(spi_clk); - - return 0; - -err_clk_get: - iounmap(spi_base); - return ret; -} - -static void mahimahi_brightness_set(struct led_classdev *led_cdev, - enum led_brightness val) -{ - unsigned long flags; - led_cdev->brightness = val; - - spin_lock_irqsave(&brightness_lock, flags); - new_val = val; - spin_unlock_irqrestore(&brightness_lock, flags); - - schedule_work(&brightness_delayed_work); -} - -static void mahimahi_brightness_amoled_set_work(struct work_struct *work_ptr) -{ - unsigned long flags; - uint8_t val; - - spin_lock_irqsave(&brightness_lock, flags); - val = new_val; - spin_unlock_irqrestore(&brightness_lock, flags); - - mutex_lock(&panel_lock); - samsung_oled_set_gamma_val(val); - mutex_unlock(&panel_lock); -} - -static void mahimahi_brightness_tft_set_work(struct work_struct *work_ptr) -{ - unsigned long flags; - uint8_t val; - - spin_lock_irqsave(&brightness_lock, flags); - val = new_val; - spin_unlock_irqrestore(&brightness_lock, flags); - - mutex_lock(&panel_lock); - sony_tft_set_pwm_val(val); - mutex_unlock(&panel_lock); -} - -static struct led_classdev mahimahi_brightness_led = { - .name = "lcd-backlight", - .brightness = LED_FULL, - .brightness_set = mahimahi_brightness_set, -}; - -int __init mahimahi_init_panel(void) -{ - int ret; - - if (!machine_is_mahimahi()) - return 0; - - if (system_rev > 0xC0) { - /* CDMA version (except for EVT1) supports RGB666 */ - init_tablep = samsung_oled_rgb666_init_table; - init_table_sz = ARRAY_SIZE(samsung_oled_rgb666_init_table); - mahimahi_lcdc_fb_data.output_format = MSM_MDP_OUT_IF_FMT_RGB666; - } - - ret = platform_device_register(&msm_device_mdp); - if (ret != 0) - return ret; - - ret = mahimahi_init_spi_hack(); - if (ret != 0) - return ret; - - if (gpio_get_value(MAHIMAHI_GPIO_LCD_ID0)) { - pr_info("%s: tft panel\n", __func__); - vreg_lcm_rftx_2v6 = vreg_get(0, "rftx"); - if (IS_ERR(vreg_lcm_rftx_2v6)) - return PTR_ERR(vreg_lcm_rftx_2v6); - vreg_set_level(vreg_lcm_rftx_2v6, 2600); - - vreg_lcm_aux_2v6 = vreg_get(0, "gp4"); - if (IS_ERR(vreg_lcm_aux_2v6)) - return PTR_ERR(vreg_lcm_aux_2v6); - - if (gpio_get_value(MAHIMAHI_GPIO_LCD_RST_N)) - tft_panel_on = 1; - ret = platform_device_register(&mahimahi_lcdc_tft_device); - INIT_WORK(&brightness_delayed_work, mahimahi_brightness_tft_set_work); - } else { - pr_info("%s: amoled panel\n", __func__); - ret = platform_device_register(&mahimahi_lcdc_amoled_device); - INIT_WORK(&brightness_delayed_work, mahimahi_brightness_amoled_set_work); - } - - if (ret != 0) - return ret; - - ret = led_classdev_register(NULL, &mahimahi_brightness_led); - if (ret != 0) { - pr_err("%s: Cannot register brightness led\n", __func__); - return ret; - } - - return 0; -} - -device_initcall(mahimahi_init_panel); diff --git a/arch/arm/mach-msm/board-mahimahi-rfkill.c b/arch/arm/mach-msm/board-mahimahi-rfkill.c deleted file mode 100644 index 05c9bb0b4d55..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-rfkill.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi.h" - -static struct rfkill *bt_rfk; -static const char bt_name[] = "bcm4329"; - -static int bluetooth_set_power(void *data, bool blocked) -{ - if (!blocked) { - gpio_direction_output(MAHIMAHI_GPIO_BT_RESET_N, 1); - gpio_direction_output(MAHIMAHI_GPIO_BT_SHUTDOWN_N, 1); - } else { - gpio_direction_output(MAHIMAHI_GPIO_BT_SHUTDOWN_N, 0); - gpio_direction_output(MAHIMAHI_GPIO_BT_RESET_N, 0); - } - return 0; -} - -static struct rfkill_ops mahimahi_rfkill_ops = { - .set_block = bluetooth_set_power, -}; - -static int mahimahi_rfkill_probe(struct platform_device *pdev) -{ - int rc = 0; - bool default_state = true; /* off */ - - rc = gpio_request(MAHIMAHI_GPIO_BT_RESET_N, "bt_reset"); - if (rc) - goto err_gpio_reset; - rc = gpio_request(MAHIMAHI_GPIO_BT_SHUTDOWN_N, "bt_shutdown"); - if (rc) - goto err_gpio_shutdown; - - bluetooth_set_power(NULL, default_state); - - bt_rfk = rfkill_alloc(bt_name, &pdev->dev, RFKILL_TYPE_BLUETOOTH, - &mahimahi_rfkill_ops, NULL); - if (!bt_rfk) { - rc = -ENOMEM; - goto err_rfkill_alloc; - } - - rfkill_set_states(bt_rfk, default_state, false); - - /* userspace cannot take exclusive control */ - - rc = rfkill_register(bt_rfk); - if (rc) - goto err_rfkill_reg; - - return 0; - -err_rfkill_reg: - rfkill_destroy(bt_rfk); -err_rfkill_alloc: - gpio_free(MAHIMAHI_GPIO_BT_SHUTDOWN_N); -err_gpio_shutdown: - gpio_free(MAHIMAHI_GPIO_BT_RESET_N); -err_gpio_reset: - return rc; -} - -static int mahimahi_rfkill_remove(struct platform_device *dev) -{ - rfkill_unregister(bt_rfk); - rfkill_destroy(bt_rfk); - gpio_free(MAHIMAHI_GPIO_BT_SHUTDOWN_N); - gpio_free(MAHIMAHI_GPIO_BT_RESET_N); - - return 0; -} - -static struct platform_driver mahimahi_rfkill_driver = { - .probe = mahimahi_rfkill_probe, - .remove = mahimahi_rfkill_remove, - .driver = { - .name = "mahimahi_rfkill", - .owner = THIS_MODULE, - }, -}; - -static int __init mahimahi_rfkill_init(void) -{ - if (!machine_is_mahimahi()) - return 0; - - return platform_driver_register(&mahimahi_rfkill_driver); -} - -static void __exit mahimahi_rfkill_exit(void) -{ - platform_driver_unregister(&mahimahi_rfkill_driver); -} - -module_init(mahimahi_rfkill_init); -module_exit(mahimahi_rfkill_exit); -MODULE_DESCRIPTION("mahimahi rfkill"); -MODULE_AUTHOR("Nick Pelly "); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-mahimahi-smb329.c b/arch/arm/mach-msm/board-mahimahi-smb329.c deleted file mode 100644 index b80db78491e1..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-smb329.c +++ /dev/null @@ -1,177 +0,0 @@ -/* drivers/i2c/chips/smb329.c - * - * SMB329B Switch Charger (SUMMIT Microelectronics) - * - * Copyright (C) 2009 HTC Corporation - * Author: Justin Lin - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi-smb329.h" - -static struct smb329_data { - struct i2c_client *client; - uint8_t version; - struct work_struct work; - struct mutex state_lock; - int chg_state; -} smb329; - -static int smb329_i2c_write(uint8_t *value, uint8_t reg, uint8_t num_bytes) -{ - int ret; - struct i2c_msg msg; - - /* write the first byte of buffer as the register address */ - value[0] = reg; - msg.addr = smb329.client->addr; - msg.len = num_bytes + 1; - msg.flags = 0; - msg.buf = value; - - ret = i2c_transfer(smb329.client->adapter, &msg, 1); - - return (ret >= 0) ? 0 : ret; -} - -static int smb329_i2c_read(uint8_t *value, uint8_t reg, uint8_t num_bytes) -{ - int ret; - struct i2c_msg msg[2]; - - /* setup the address to read */ - msg[0].addr = smb329.client->addr; - msg[0].len = 1; - msg[0].flags = 0; - msg[0].buf = ® - - /* setup the read buffer */ - msg[1].addr = smb329.client->addr; - msg[1].flags = I2C_M_RD; - msg[1].len = num_bytes; - msg[1].buf = value; - - ret = i2c_transfer(smb329.client->adapter, msg, 2); - - return (ret >= 0) ? 0 : ret; -} - -static int smb329_i2c_write_byte(uint8_t value, uint8_t reg) -{ - int ret; - uint8_t buf[2] = { 0 }; - - buf[1] = value; - ret = smb329_i2c_write(buf, reg, 1); - if (ret) - pr_err("smb329: write byte error (%d)\n", ret); - - return ret; -} - -static int smb329_i2c_read_byte(uint8_t *value, uint8_t reg) -{ - int ret = smb329_i2c_read(value, reg, 1); - if (ret) - pr_err("smb329: read byte error (%d)\n", ret); - - return ret; -} - -int smb329_set_charger_ctrl(uint32_t ctl) -{ - mutex_lock(&smb329.state_lock); - smb329.chg_state = ctl; - schedule_work(&smb329.work); - mutex_unlock(&smb329.state_lock); - return 0; -} - -static void smb329_work_func(struct work_struct *work) -{ - mutex_lock(&smb329.state_lock); - - switch (smb329.chg_state) { - case SMB329_ENABLE_FAST_CHG: - pr_info("smb329: charger on (fast)\n"); - smb329_i2c_write_byte(0x84, 0x31); - smb329_i2c_write_byte(0x08, 0x05); - if ((smb329.version & 0x18) == 0x0) - smb329_i2c_write_byte(0xA9, 0x00); - break; - - case SMB329_DISABLE_CHG: - case SMB329_ENABLE_SLOW_CHG: - pr_info("smb329: charger off/slow\n"); - smb329_i2c_write_byte(0x88, 0x31); - smb329_i2c_write_byte(0x08, 0x05); - break; - default: - pr_err("smb329: unknown charger state %d\n", - smb329.chg_state); - } - - mutex_unlock(&smb329.state_lock); -} - -static int smb329_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { - dev_dbg(&client->dev, "[SMB329]:I2C fail\n"); - return -EIO; - } - - smb329.client = client; - mutex_init(&smb329.state_lock); - INIT_WORK(&smb329.work, smb329_work_func); - - smb329_i2c_read_byte(&smb329.version, 0x3B); - pr_info("smb329 version: 0x%02x\n", smb329.version); - - return 0; -} - -static const struct i2c_device_id smb329_id[] = { - { "smb329", 0 }, - { }, -}; - -static struct i2c_driver smb329_driver = { - .driver.name = "smb329", - .id_table = smb329_id, - .probe = smb329_probe, -}; - -static int __init smb329_init(void) -{ - int ret = i2c_add_driver(&smb329_driver); - if (ret) - pr_err("smb329_init: failed\n"); - - return ret; -} - -module_init(smb329_init); - -MODULE_AUTHOR("Justin Lin "); -MODULE_DESCRIPTION("SUMMIT Microelectronics SMB329B switch charger"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-mahimahi-smb329.h b/arch/arm/mach-msm/board-mahimahi-smb329.h deleted file mode 100644 index 13b326fa71df..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-smb329.h +++ /dev/null @@ -1,32 +0,0 @@ -/* include/linux/smb329.h - smb329 switch charger driver - * - * Copyright (C) 2009 HTC Corporation. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _LINUX_SMB329_H -#define _LINUX_SMB329_H - -#ifdef __KERNEL__ - -enum { - SMB329_DISABLE_CHG, - SMB329_ENABLE_SLOW_CHG, - SMB329_ENABLE_FAST_CHG, -}; - -extern int smb329_set_charger_ctrl(uint32_t ctl); - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_SMB329_H */ - diff --git a/arch/arm/mach-msm/board-mahimahi-tpa2018d1.c b/arch/arm/mach-msm/board-mahimahi-tpa2018d1.c deleted file mode 100644 index 78919b9b1954..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-tpa2018d1.c +++ /dev/null @@ -1,368 +0,0 @@ -/* drivers/i2c/chips/tpa2018d1.c - * - * TI TPA2018D1 Speaker Amplifier - * - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* TODO: content validation in TPA2018_SET_CONFIG */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi-tpa2018d1.h" - -static struct i2c_client *this_client; -static struct tpa2018d1_platform_data *pdata; -static int is_on; -static char spk_amp_cfg[8]; -static const char spk_amp_on[8] = { /* same length as spk_amp_cfg */ - 0x01, 0xc3, 0x20, 0x01, 0x00, 0x08, 0x1a, 0x21 -}; -static const char spk_amp_off[] = {0x01, 0xa2}; - -static DEFINE_MUTEX(spk_amp_lock); -static int tpa2018d1_opened; -static char *config_data; -static int tpa2018d1_num_modes; - -#define DEBUG 0 - -static int tpa2018_i2c_write(const char *txData, int length) -{ - struct i2c_msg msg[] = { - { - .addr = this_client->addr, - .flags = 0, - .len = length, - .buf = txData, - }, - }; - - if (i2c_transfer(this_client->adapter, msg, 1) < 0) { - pr_err("%s: I2C transfer error\n", __func__); - return -EIO; - } else - return 0; -} - -static int tpa2018_i2c_read(char *rxData, int length) -{ - struct i2c_msg msgs[] = { - { - .addr = this_client->addr, - .flags = I2C_M_RD, - .len = length, - .buf = rxData, - }, - }; - - if (i2c_transfer(this_client->adapter, msgs, 1) < 0) { - pr_err("%s: I2C transfer error\n", __func__); - return -EIO; - } - -#if DEBUG - do { - int i = 0; - for (i = 0; i < length; i++) - pr_info("%s: rx[%d] = %2x\n", - __func__, i, rxData[i]); - } while(0); -#endif - - return 0; -} - -static int tpa2018d1_open(struct inode *inode, struct file *file) -{ - int rc = 0; - - mutex_lock(&spk_amp_lock); - - if (tpa2018d1_opened) { - pr_err("%s: busy\n", __func__); - rc = -EBUSY; - goto done; - } - - tpa2018d1_opened = 1; -done: - mutex_unlock(&spk_amp_lock); - return rc; -} - -static int tpa2018d1_release(struct inode *inode, struct file *file) -{ - mutex_lock(&spk_amp_lock); - tpa2018d1_opened = 0; - mutex_unlock(&spk_amp_lock); - - return 0; -} - -static int tpa2018d1_read_config(void __user *argp) -{ - int rc = 0; - unsigned char reg_idx = 0x01; - unsigned char tmp[7]; - - if (!is_on) { - gpio_set_value(pdata->gpio_tpa2018_spk_en, 1); - msleep(5); /* According to TPA2018D1 Spec */ - } - - rc = tpa2018_i2c_write(®_idx, sizeof(reg_idx)); - if (rc < 0) - goto err; - - rc = tpa2018_i2c_read(tmp, sizeof(tmp)); - if (rc < 0) - goto err; - - if (copy_to_user(argp, &tmp, sizeof(tmp))) - rc = -EFAULT; - -err: - if (!is_on) - gpio_set_value(pdata->gpio_tpa2018_spk_en, 0); - return rc; -} - -static int tpa2018d1_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - void __user *argp = (void __user *)arg; - int rc = 0; - int mode = -1; - int offset = 0; - struct tpa2018d1_config_data cfg; - - mutex_lock(&spk_amp_lock); - - switch (cmd) { - case TPA2018_SET_CONFIG: - if (copy_from_user(spk_amp_cfg, argp, sizeof(spk_amp_cfg))) - rc = -EFAULT; - break; - - case TPA2018_READ_CONFIG: - rc = tpa2018d1_read_config(argp); - break; - - case TPA2018_SET_MODE: - if (copy_from_user(&mode, argp, sizeof(mode))) { - rc = -EFAULT; - break; - } - if (mode >= tpa2018d1_num_modes || mode < 0) { - pr_err("%s: unsupported tpa2018d1 mode %d\n", - __func__, mode); - rc = -EINVAL; - break; - } - if (!config_data) { - pr_err("%s: no config data!\n", __func__); - rc = -EIO; - break; - } - memcpy(spk_amp_cfg, config_data + mode * TPA2018D1_CMD_LEN, - TPA2018D1_CMD_LEN); - break; - - case TPA2018_SET_PARAM: - if (copy_from_user(&cfg, argp, sizeof(cfg))) { - pr_err("%s: copy from user failed.\n", __func__); - rc = -EFAULT; - break; - } - tpa2018d1_num_modes = cfg.mode_num; - if (tpa2018d1_num_modes > TPA2018_NUM_MODES) { - pr_err("%s: invalid number of modes %d\n", __func__, - tpa2018d1_num_modes); - rc = -EINVAL; - break; - } - if (cfg.data_len != tpa2018d1_num_modes*TPA2018D1_CMD_LEN) { - pr_err("%s: invalid data length %d, expecting %d\n", - __func__, cfg.data_len, - tpa2018d1_num_modes * TPA2018D1_CMD_LEN); - rc = -EINVAL; - break; - } - /* Free the old data */ - if (config_data) - kfree(config_data); - config_data = kmalloc(cfg.data_len, GFP_KERNEL); - if (!config_data) { - pr_err("%s: out of memory\n", __func__); - rc = -ENOMEM; - break; - } - if (copy_from_user(config_data, cfg.cmd_data, cfg.data_len)) { - pr_err("%s: copy data from user failed.\n", __func__); - kfree(config_data); - config_data = NULL; - rc = -EFAULT; - break; - } - /* replace default setting with playback setting */ - if (tpa2018d1_num_modes >= TPA2018_MODE_PLAYBACK) { - offset = TPA2018_MODE_PLAYBACK * TPA2018D1_CMD_LEN; - memcpy(spk_amp_cfg, config_data + offset, - TPA2018D1_CMD_LEN); - } - break; - - default: - pr_err("%s: invalid command %d\n", __func__, _IOC_NR(cmd)); - rc = -EINVAL; - break; - } - mutex_unlock(&spk_amp_lock); - return rc; -} - -static struct file_operations tpa2018d1_fops = { - .owner = THIS_MODULE, - .open = tpa2018d1_open, - .release = tpa2018d1_release, - .ioctl = tpa2018d1_ioctl, -}; - -static struct miscdevice tpa2018d1_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = "tpa2018d1", - .fops = &tpa2018d1_fops, -}; - -void tpa2018d1_set_speaker_amp(int on) -{ - if (!pdata) { - pr_err("%s: no platform data!\n", __func__); - return; - } - mutex_lock(&spk_amp_lock); - if (on && !is_on) { - gpio_set_value(pdata->gpio_tpa2018_spk_en, 1); - msleep(5); /* According to TPA2018D1 Spec */ - - if (tpa2018_i2c_write(spk_amp_cfg, sizeof(spk_amp_cfg)) == 0) { - is_on = 1; - pr_info("%s: ON\n", __func__); - } - } else if (!on && is_on) { - if (tpa2018_i2c_write(spk_amp_off, sizeof(spk_amp_off)) == 0) { - is_on = 0; - msleep(2); - gpio_set_value(pdata->gpio_tpa2018_spk_en, 0); - pr_info("%s: OFF\n", __func__); - } - } - mutex_unlock(&spk_amp_lock); -} - -static int tpa2018d1_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - int ret = 0; - - pdata = client->dev.platform_data; - - if (!pdata) { - ret = -EINVAL; - pr_err("%s: platform data is NULL\n", __func__); - goto err_no_pdata; - } - - this_client = client; - - ret = gpio_request(pdata->gpio_tpa2018_spk_en, "tpa2018"); - if (ret < 0) { - pr_err("%s: gpio request aud_spk_en pin failed\n", __func__); - goto err_free_gpio; - } - - ret = gpio_direction_output(pdata->gpio_tpa2018_spk_en, 1); - if (ret < 0) { - pr_err("%s: request aud_spk_en gpio direction failed\n", - __func__); - goto err_free_gpio; - } - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - pr_err("%s: i2c check functionality error\n", __func__); - ret = -ENODEV; - goto err_free_gpio; - } - - gpio_set_value(pdata->gpio_tpa2018_spk_en, 0); /* Default Low */ - - ret = misc_register(&tpa2018d1_device); - if (ret) { - pr_err("%s: tpa2018d1_device register failed\n", __func__); - goto err_free_gpio; - } - memcpy(spk_amp_cfg, spk_amp_on, sizeof(spk_amp_on)); - return 0; - -err_free_gpio: - gpio_free(pdata->gpio_tpa2018_spk_en); -err_no_pdata: - return ret; -} - -static int tpa2018d1_suspend(struct i2c_client *client, pm_message_t mesg) -{ - return 0; -} - -static int tpa2018d1_resume(struct i2c_client *client) -{ - return 0; -} - -static const struct i2c_device_id tpa2018d1_id[] = { - { TPA2018D1_I2C_NAME, 0 }, - { } -}; - -static struct i2c_driver tpa2018d1_driver = { - .probe = tpa2018d1_probe, - .suspend = tpa2018d1_suspend, - .resume = tpa2018d1_resume, - .id_table = tpa2018d1_id, - .driver = { - .name = TPA2018D1_I2C_NAME, - }, -}; - -static int __init tpa2018d1_init(void) -{ - pr_info("%s\n", __func__); - return i2c_add_driver(&tpa2018d1_driver); -} - -module_init(tpa2018d1_init); - -MODULE_DESCRIPTION("tpa2018d1 speaker amp driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-mahimahi-tpa2018d1.h b/arch/arm/mach-msm/board-mahimahi-tpa2018d1.h deleted file mode 100644 index dc1101220945..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-tpa2018d1.h +++ /dev/null @@ -1,35 +0,0 @@ -/* include/linux/tpa2018d1.h - tpa2018d1 speaker amplifier driver - * - * Copyright (C) 2009 HTC Corporation. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - - -#ifndef __ASM_ARM_ARCH_TPA2018D1_H -#define __ASM_ARM_ARCH_TPA2018D1_H - -#define TPA2018D1_I2C_NAME "tpa2018d1" -#define TPA2018D1_CMD_LEN 8 - -struct tpa2018d1_platform_data { - uint32_t gpio_tpa2018_spk_en; -}; - -struct tpa2018d1_config_data { - unsigned char *cmd_data; /* [mode][cmd_len][cmds..] */ - unsigned int mode_num; - unsigned int data_len; -}; - -extern void tpa2018d1_set_speaker_amp(int on); - -#endif /* __ASM_ARM_ARCH_TPA2018D1_H */ diff --git a/arch/arm/mach-msm/board-mahimahi-wifi.c b/arch/arm/mach-msm/board-mahimahi-wifi.c deleted file mode 100644 index 8cd24766b03c..000000000000 --- a/arch/arm/mach-msm/board-mahimahi-wifi.c +++ /dev/null @@ -1,146 +0,0 @@ -/* linux/arch/arm/mach-msm/board-mahimahi-wifi.c -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-mahimahi.h" - -int mahimahi_wifi_power(int on); -int mahimahi_wifi_reset(int on); -int mahimahi_wifi_set_carddetect(int on); - -#define PREALLOC_WLAN_NUMBER_OF_SECTIONS 4 -#define PREALLOC_WLAN_NUMBER_OF_BUFFERS 160 -#define PREALLOC_WLAN_SECTION_HEADER 24 - -#define WLAN_SECTION_SIZE_0 (PREALLOC_WLAN_NUMBER_OF_BUFFERS * 128) -#define WLAN_SECTION_SIZE_1 (PREALLOC_WLAN_NUMBER_OF_BUFFERS * 128) -#define WLAN_SECTION_SIZE_2 (PREALLOC_WLAN_NUMBER_OF_BUFFERS * 512) -#define WLAN_SECTION_SIZE_3 (PREALLOC_WLAN_NUMBER_OF_BUFFERS * 1024) - -#define WLAN_SKB_BUF_NUM 16 - -static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM]; - -typedef struct wifi_mem_prealloc_struct { - void *mem_ptr; - unsigned long size; -} wifi_mem_prealloc_t; - -static wifi_mem_prealloc_t wifi_mem_array[PREALLOC_WLAN_NUMBER_OF_SECTIONS] = { - { NULL, (WLAN_SECTION_SIZE_0 + PREALLOC_WLAN_SECTION_HEADER) }, - { NULL, (WLAN_SECTION_SIZE_1 + PREALLOC_WLAN_SECTION_HEADER) }, - { NULL, (WLAN_SECTION_SIZE_2 + PREALLOC_WLAN_SECTION_HEADER) }, - { NULL, (WLAN_SECTION_SIZE_3 + PREALLOC_WLAN_SECTION_HEADER) } -}; - -static void *mahimahi_wifi_mem_prealloc(int section, unsigned long size) -{ - if (section == PREALLOC_WLAN_NUMBER_OF_SECTIONS) - return wlan_static_skb; - if ((section < 0) || (section > PREALLOC_WLAN_NUMBER_OF_SECTIONS)) - return NULL; - if (wifi_mem_array[section].size < size) - return NULL; - return wifi_mem_array[section].mem_ptr; -} - -int __init mahimahi_init_wifi_mem(void) -{ - int i; - - for(i=0;( i < WLAN_SKB_BUF_NUM );i++) { - if (i < (WLAN_SKB_BUF_NUM/2)) - wlan_static_skb[i] = dev_alloc_skb(4096); - else - wlan_static_skb[i] = dev_alloc_skb(8192); - } - for(i=0;( i < PREALLOC_WLAN_NUMBER_OF_SECTIONS );i++) { - wifi_mem_array[i].mem_ptr = kmalloc(wifi_mem_array[i].size, - GFP_KERNEL); - if (wifi_mem_array[i].mem_ptr == NULL) - return -ENOMEM; - } - return 0; -} - -static struct resource mahimahi_wifi_resources[] = { - [0] = { - .name = "bcm4329_wlan_irq", - .start = MSM_GPIO_TO_INT(MAHIMAHI_GPIO_WIFI_IRQ), - .end = MSM_GPIO_TO_INT(MAHIMAHI_GPIO_WIFI_IRQ), - .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE, - }, -}; - -static struct wifi_platform_data mahimahi_wifi_control = { - .set_power = mahimahi_wifi_power, - .set_reset = mahimahi_wifi_reset, - .set_carddetect = mahimahi_wifi_set_carddetect, - .mem_prealloc = mahimahi_wifi_mem_prealloc, -}; - -static struct platform_device mahimahi_wifi_device = { - .name = "bcm4329_wlan", - .id = 1, - .num_resources = ARRAY_SIZE(mahimahi_wifi_resources), - .resource = mahimahi_wifi_resources, - .dev = { - .platform_data = &mahimahi_wifi_control, - }, -}; - -extern unsigned char *get_wifi_nvs_ram(void); -extern int wifi_calibration_size_set(void); - -static unsigned mahimahi_wifi_update_nvs(char *str, int add_flag) -{ -#define NVS_LEN_OFFSET 0x0C -#define NVS_DATA_OFFSET 0x40 - unsigned char *ptr; - unsigned len; - - if (!str) - return -EINVAL; - ptr = get_wifi_nvs_ram(); - /* Size in format LE assumed */ - memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); - /* if the last byte in NVRAM is 0, trim it */ - if (ptr[NVS_DATA_OFFSET + len - 1] == 0) - len -= 1; - if (add_flag) { - strcpy(ptr + NVS_DATA_OFFSET + len, str); - len += strlen(str); - } else { - if (strnstr(ptr + NVS_DATA_OFFSET, str, len)) - len -= strlen(str); - } - memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); - wifi_calibration_size_set(); - return 0; -} - -static int __init mahimahi_wifi_init(void) -{ - int ret; - - if (!machine_is_mahimahi()) - return 0; - - printk("%s: start\n", __func__); - mahimahi_wifi_update_nvs("sd_oobonly=1\r\n", 0); - mahimahi_wifi_update_nvs("btc_params70=0x32\r\n", 1); - mahimahi_init_wifi_mem(); - ret = platform_device_register(&mahimahi_wifi_device); - return ret; -} - -late_initcall(mahimahi_wifi_init); diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c deleted file mode 100644 index 1ea5b301d5ae..000000000000 --- a/arch/arm/mach-msm/board-mahimahi.c +++ /dev/null @@ -1,87 +0,0 @@ -/* linux/arch/arm/mach-msm/board-mahimahi.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation. - * Author: Dima Zavin - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "board-mahimahi.h" -#include "devices.h" - -static uint debug_uart; - -module_param_named(debug_uart, debug_uart, uint, 0); - -static struct platform_device *devices[] __initdata = { -#if !defined(CONFIG_MSM_SERIAL_DEBUGGER) - &msm_device_uart1, -#endif - &msm_device_uart_dm1, - &msm_device_nand, -}; - -static void __init mahimahi_init(void) -{ - platform_add_devices(devices, ARRAY_SIZE(devices)); -} - -static void __init mahimahi_fixup(struct tag *tags, char **cmdline, - struct meminfo *mi) -{ - mi->nr_banks = 2; - mi->bank[0].start = PHYS_OFFSET; - mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET); - mi->bank[0].size = (219*1024*1024); - mi->bank[1].start = MSM_HIGHMEM_BASE; - mi->bank[1].node = PHYS_TO_NID(MSM_HIGHMEM_BASE); - mi->bank[1].size = MSM_HIGHMEM_SIZE; -} - -static void __init mahimahi_map_io(void) -{ - msm_map_common_io(); - msm_clock_init(); -} - -static void __init mahimahi_init_late(void) -{ - smd_debugfs_init(); -} - -void msm_timer_init(void); - -MACHINE_START(MAHIMAHI, "mahimahi") - .atag_offset = 0x100, - .fixup = mahimahi_fixup, - .map_io = mahimahi_map_io, - .init_irq = msm_init_irq, - .init_machine = mahimahi_init, - .init_late = mahimahi_init_late, - .init_time = msm_timer_init, -MACHINE_END diff --git a/arch/arm/mach-msm/board-mahimahi.h b/arch/arm/mach-msm/board-mahimahi.h deleted file mode 100644 index 9696a47c4006..000000000000 --- a/arch/arm/mach-msm/board-mahimahi.h +++ /dev/null @@ -1,175 +0,0 @@ -/* arch/arm/mach-msm/board-mahimahi.h - * - * Copyright (C) 2009 HTC Corporation. - * Author: Haley Teng - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_MAHIMAHI_H -#define __ARCH_ARM_MACH_MSM_BOARD_MAHIMAHI_H - -#include - -#define MSM_SMI_BASE 0x02B00000 -#define MSM_SMI_SIZE 0x01500000 - -#define MSM_RAM_CONSOLE_BASE 0x03A00000 -#define MSM_RAM_CONSOLE_SIZE 0x00040000 - -#define MSM_FB_BASE 0x03B00000 -#define MSM_FB_SIZE 0x00465000 - -#define MSM_EBI1_BANK0_BASE 0x20000000 -#define MSM_EBI1_BANK0_SIZE 0x0E000000 - -#define MSM_GPU_MEM_BASE 0x2DB00000 -#define MSM_GPU_MEM_SIZE 0x00500000 - -#define MSM_EBI1_BANK1_BASE 0x30000000 -#define MSM_EBI1_BANK1_SIZE 0x10000000 - -#define MSM_PMEM_MDP_BASE 0x30000000 -#define MSM_PMEM_MDP_SIZE 0x02000000 - -#define MSM_PMEM_ADSP_BASE 0x32000000 -#define MSM_PMEM_ADSP_SIZE 0x02900000 - -#define MSM_PMEM_CAMERA_BASE 0x34900000 -#define MSM_PMEM_CAMERA_SIZE 0x00800000 - -#define MSM_HIGHMEM_BASE 0x35100000 -#define MSM_HIGHMEM_SIZE 0x0AF00000 - -#define MAHIMAHI_GPIO_PS_HOLD 25 - -#define MAHIMAHI_GPIO_UP_INT_N 35 -#define MAHIMAHI_GPIO_UP_RESET_N 82 -#define MAHIMAHI_GPIO_LS_EN_N 119 - -#define MAHIMAHI_GPIO_TP_INT_N 92 -#define MAHIMAHI_GPIO_TP_LS_EN 93 -#define MAHIMAHI_GPIO_TP_EN 160 - -#define MAHIMAHI_GPIO_POWER_KEY 94 -#define MAHIMAHI_GPIO_SDMC_CD_REV0_N 153 - -#define MAHIMAHI_GPIO_WIFI_SHUTDOWN_N 127 -#define MAHIMAHI_GPIO_WIFI_IRQ 152 - -#define MAHIMAHI_GPIO_BALL_UP 38 -#define MAHIMAHI_GPIO_BALL_DOWN 37 -#define MAHIMAHI_GPIO_BALL_LEFT 145 -#define MAHIMAHI_GPIO_BALL_RIGHT 21 - -#define MAHIMAHI_GPIO_BT_UART1_RTS 43 -#define MAHIMAHI_GPIO_BT_UART1_CTS 44 -#define MAHIMAHI_GPIO_BT_UART1_RX 45 -#define MAHIMAHI_GPIO_BT_UART1_TX 46 -#define MAHIMAHI_GPIO_BT_RESET_N 146 -#define MAHIMAHI_GPIO_BT_SHUTDOWN_N 128 - -#define MAHIMAHI_GPIO_BT_WAKE 57 -#define MAHIMAHI_GPIO_BT_HOST_WAKE 86 - -#define MAHIMAHI_GPIO_PROXIMITY_INT_N 90 -#define MAHIMAHI_GPIO_PROXIMITY_EN 120 - -#define MAHIMAHI_GPIO_DS2482_SLP_N 87 -#define MAHIMAHI_GPIO_VIBRATOR_ON 89 -/* Compass */ -#define MAHIMAHI_REV0_GPIO_COMPASS_INT_N 36 - -#define MAHIMAHI_GPIO_COMPASS_INT_N 153 -#define MAHIMAHI_GPIO_COMPASS_RST_N 107 -#define MAHIMAHI_PROJECT_NAME "mahimahi" -#define MAHIMAHI_LAYOUTS { \ - { {-1, 0, 0}, { 0, -1, 0}, {0, 0, 1} }, \ - { { 0, -1, 0}, { 1, 0, 0}, {0, 0, -1} }, \ - { { 0, -1, 0}, { 1, 0, 0}, {0, 0, 1} }, \ - { {-1, 0, 0}, { 0, 0, -1}, {0, 1, 0} } \ -} - -/* Audio */ -#define MAHIMAHI_AUD_JACKHP_EN 157 -#define MAHIMAHI_AUD_2V5_EN 158 -#define MAHIMAHI_AUD_MICPATH_SEL 111 -#define MAHIMAHI_AUD_A1026_INT 112 -#define MAHIMAHI_AUD_A1026_WAKEUP 113 -#define MAHIMAHI_AUD_A1026_RESET 129 -#define MAHIMAHI_AUD_A1026_CLK -1 -#define MAHIMAHI_CDMA_XA_AUD_A1026_CLK 105 -/* NOTE: MAHIMAHI_CDMA_XB_AUD_A1026_WAKEUP on CDMA is the same GPIO as - * MAHIMAHI_GPIO_BATTERY_CHARGER_CURRENT on UMTS. Also, - * MAHIMAHI_CDMA_XB_AUD_A1026_RESET is the same as - * GPIO MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN on UMTS. - */ -#define MAHIMAHI_CDMA_XB_AUD_A1026_WAKEUP 16 -#define MAHIMAHI_CDMA_XB_AUD_A1026_RESET 19 -#define MAHIMAHI_CDMA_XB_AUD_A1026_CLK -1 - -/* Bluetooth PCM */ -#define MAHIMAHI_BT_PCM_OUT 68 -#define MAHIMAHI_BT_PCM_IN 69 -#define MAHIMAHI_BT_PCM_SYNC 70 -#define MAHIMAHI_BT_PCM_CLK 71 -/* flash light */ -#define MAHIMAHI_GPIO_FLASHLIGHT_TORCH 58 -#define MAHIMAHI_GPIO_FLASHLIGHT_FLASH 84 - -#define MAHIMAHI_GPIO_LED_3V3_EN 85 -#define MAHIMAHI_GPIO_LCD_RST_N 29 -#define MAHIMAHI_GPIO_LCD_ID0 147 - -/* 3.5mm remote control key interrupt shutdown signal */ -#define MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN 19 - -#define MAHIMAHI_GPIO_DOCK 106 - -/* speaker amplifier enable pin for mahimahi CDMA version */ -#define MAHIMAHI_CDMA_GPIO_AUD_SPK_AMP_EN 104 - -#define MAHIMAHI_GPIO_BATTERY_DETECTION 39 -#define MAHIMAHI_GPIO_BATTERY_CHARGER_EN 22 -#define MAHIMAHI_GPIO_BATTERY_CHARGER_CURRENT 16 - -#define MAHIMAHI_CDMA_GPIO_BT_WAKE 28 -#define MAHIMAHI_CDMA_GPIO_FLASHLIGHT_TORCH 26 - -#define MAHIMAHI_CDMA_SD_2V85_EN 100 -#define MAHIMAHI_CDMA_JOG_2V6_EN 150 -/* display relative */ -#define MAHIMAHI_LCD_SPI_CLK (17) -#define MAHIMAHI_LCD_SPI_DO (18) -#define MAHIMAHI_LCD_SPI_CSz (20) -#define MAHIMAHI_LCD_RSTz (29) -#define MAHIMAHI_LCD_R1 (114) -#define MAHIMAHI_LCD_R2 (115) -#define MAHIMAHI_LCD_R3 (116) -#define MAHIMAHI_LCD_R4 (117) -#define MAHIMAHI_LCD_R5 (118) -#define MAHIMAHI_LCD_G0 (121) -#define MAHIMAHI_LCD_G1 (122) -#define MAHIMAHI_LCD_G2 (123) -#define MAHIMAHI_LCD_G3 (124) -#define MAHIMAHI_LCD_G4 (125) -#define MAHIMAHI_LCD_G5 (126) -#define MAHIMAHI_LCD_B1 (130) -#define MAHIMAHI_LCD_B2 (131) -#define MAHIMAHI_LCD_B3 (132) -#define MAHIMAHI_LCD_B4 (133) -#define MAHIMAHI_LCD_B5 (134) -#define MAHIMAHI_LCD_PCLK (135) -#define MAHIMAHI_LCD_VSYNC (136) -#define MAHIMAHI_LCD_HSYNC (137) -#define MAHIMAHI_LCD_DE (138) -#define is_cdma_version(rev) (((rev) & 0xF0) == 0xC0) - -#endif /* __ARCH_ARM_MACH_MSM_BOARD_MAHIMAHI_H */ diff --git a/arch/arm/mach-msm/board-msm7627-regulator.c b/arch/arm/mach-msm/board-msm7627-regulator.c deleted file mode 100644 index 3ef748d4cd4c..000000000000 --- a/arch/arm/mach-msm/board-msm7627-regulator.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "board-msm7627-regulator.h" - -#define PCOM_VREG_CONSUMERS(name) \ - static struct regulator_consumer_supply __pcom_vreg_supply_##name[] - -#define PCOM_VREG_CONSTRAINT_LVSW(_name, _always_on, _boot_on, _supply_uV) \ -{ \ - .name = #_name, \ - .min_uV = 0, \ - .max_uV = 0, \ - .input_uV = _supply_uV, \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .apply_uV = 0, \ - .boot_on = _boot_on, \ - .always_on = _always_on \ -} - -#define PCOM_VREG_CONSTRAINT_DYN(_name, _min_uV, _max_uV, _always_on, \ - _boot_on, _apply_uV, _supply_uV) \ -{ \ - .name = #_name, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, \ - .input_uV = _supply_uV, \ - .apply_uV = _apply_uV, \ - .boot_on = _boot_on, \ - .always_on = _always_on \ -} - - -#define PCOM_VREG_INIT(_name, _supply, _constraints)\ -{ \ - .supply_regulator = _supply, \ - .consumer_supplies = __pcom_vreg_supply_##_name, \ - .num_consumer_supplies = ARRAY_SIZE(__pcom_vreg_supply_##_name), \ - .constraints = _constraints \ -} - -#define PCOM_VREG_SMP(_name, _id, _supply, _min_uV, _max_uV, _rise_time, \ - _pulldown, _always_on, _boot_on, _apply_uV, _supply_uV) \ -{ \ - .init_data = PCOM_VREG_INIT(_name, _supply, \ - PCOM_VREG_CONSTRAINT_DYN(_name, _min_uV, _max_uV, _always_on, \ - _boot_on, _apply_uV, _supply_uV)), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = _pulldown, \ - .negative = 0, \ -} - -#define PCOM_VREG_LDO PCOM_VREG_SMP - -PCOM_VREG_CONSUMERS(smps0) = { - REGULATOR_SUPPLY("smps0", NULL), - REGULATOR_SUPPLY("msmc1", NULL), -}; - -PCOM_VREG_CONSUMERS(smps1) = { - REGULATOR_SUPPLY("smps1", NULL), - REGULATOR_SUPPLY("msmc2", NULL), -}; - -PCOM_VREG_CONSUMERS(smps2) = { - REGULATOR_SUPPLY("smps2", NULL), - REGULATOR_SUPPLY("pa", NULL), -}; - -PCOM_VREG_CONSUMERS(smps3) = { - REGULATOR_SUPPLY("smps3", NULL), - REGULATOR_SUPPLY("msme1", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo00) = { - REGULATOR_SUPPLY("ldo00", NULL), - REGULATOR_SUPPLY("gp3", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo01) = { - REGULATOR_SUPPLY("ldo01", NULL), - REGULATOR_SUPPLY("msma", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo02) = { - REGULATOR_SUPPLY("ldo02", NULL), - REGULATOR_SUPPLY("msmp", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo03) = { - REGULATOR_SUPPLY("ldo03", NULL), - REGULATOR_SUPPLY("ruim", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo04) = { - REGULATOR_SUPPLY("ldo04", NULL), - REGULATOR_SUPPLY("tcxo", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo05) = { - REGULATOR_SUPPLY("ldo05", NULL), - REGULATOR_SUPPLY("mmc", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo06) = { - REGULATOR_SUPPLY("ldo06", NULL), - REGULATOR_SUPPLY("usb", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo07) = { - REGULATOR_SUPPLY("ldo07", NULL), - REGULATOR_SUPPLY("rfrx1", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo08) = { - REGULATOR_SUPPLY("ldo08", NULL), - REGULATOR_SUPPLY("synt", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo09) = { - REGULATOR_SUPPLY("ldo09", NULL), - REGULATOR_SUPPLY("gp1", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo10) = { - REGULATOR_SUPPLY("ldo10", NULL), - REGULATOR_SUPPLY("gp4", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo11) = { - REGULATOR_SUPPLY("ldo11", NULL), - REGULATOR_SUPPLY("gp2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo12) = { - REGULATOR_SUPPLY("ldo12", NULL), - REGULATOR_SUPPLY("rftx", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo13) = { - REGULATOR_SUPPLY("ldo13", NULL), - REGULATOR_SUPPLY("wlan", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo14) = { - REGULATOR_SUPPLY("ldo14", NULL), - REGULATOR_SUPPLY("rf", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo15) = { - REGULATOR_SUPPLY("ldo15", NULL), - REGULATOR_SUPPLY("gp6", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo16) = { - REGULATOR_SUPPLY("ldo16", NULL), - REGULATOR_SUPPLY("gp5", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo17) = { - REGULATOR_SUPPLY("ldo17", NULL), - REGULATOR_SUPPLY("msme2", NULL), -}; - -/** - * Minimum and Maximum range for the regulators is as per the - * device Datasheet. Actual value used by consumer is between - * the provided range. - */ -static struct proccomm_regulator_info msm7627_pcom_vreg_info[] = { - /* Standard regulators (SMPS and LDO) - * R = rise time (us) - * P = pulldown (1 = pull down, 0 = float, -1 = don't care) - * A = always on - * B = boot on - * V = automatic voltage set (meaningful for single-voltage regs only) - * S = supply voltage (uV) - * name id supp min uV max uV R P A B V S */ - PCOM_VREG_SMP(smps0, 3, NULL, 750000, 3050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps1, 4, NULL, 750000, 3050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps2, 10, NULL, 750000, 3050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps3, 2, NULL, 750000, 3050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo00, 5, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo01, 0, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo02, 1, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo03, 19, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo04, 9, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo05, 18, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo06, 16, NULL, 3300000, 3300000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo07, 12, NULL, 2700000, 2700000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo08, 14, NULL, 2700000, 2700000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo09, 8, NULL, 2900000, 2900000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo10, 7, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo11, 21, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo12, 11, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo13, 15, NULL, 1800000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo14, 24, NULL, 2700000, 2700000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo15, 23, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo16, 22, NULL, 2850000, 3000000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo17, 6, NULL, 1300000, 1300000, 0, -1, 0, 0, 0, 0), - -}; - -struct proccomm_regulator_platform_data msm7627_proccomm_regulator_data = { - .regs = msm7627_pcom_vreg_info, - .nregs = ARRAY_SIZE(msm7627_pcom_vreg_info) -}; diff --git a/arch/arm/mach-msm/board-msm7627-regulator.h b/arch/arm/mach-msm/board-msm7627-regulator.h deleted file mode 100644 index aaf959890a17..000000000000 --- a/arch/arm/mach-msm/board-msm7627-regulator.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_7627_REGULATOR_H__ -#define __ARCH_ARM_MACH_MSM_BOARD_7627_REGULATOR_H__ - -#include "proccomm-regulator.h" - -extern struct proccomm_regulator_platform_data msm7627_proccomm_regulator_data; - -#endif diff --git a/arch/arm/mach-msm/board-msm7627a-bt.c b/arch/arm/mach-msm/board-msm7627a-bt.c deleted file mode 100644 index 3e90a1556e06..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-bt.c +++ /dev/null @@ -1,1029 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "board-msm7627a.h" -#include "devices-msm7x2xa.h" - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - - -static struct bt_vreg_info bt_vregs[] = { - {"msme1", 2, 1800000, 1800000, 0, NULL}, - {"bt", 21, 2900000, 3300000, 1, NULL} -}; - -static struct platform_device msm_bt_power_device = { - .name = "bt_power", -}; - -static unsigned bt_config_power_on[] = { - /*RFR*/ - GPIO_CFG(43, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*CTS*/ - GPIO_CFG(44, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*RX*/ - GPIO_CFG(45, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*TX*/ - GPIO_CFG(46, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; -static unsigned bt_config_pcm_on[] = { - /*PCM_DOUT*/ - GPIO_CFG(68, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_DIN*/ - GPIO_CFG(69, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_SYNC*/ - GPIO_CFG(70, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*PCM_CLK*/ - GPIO_CFG(71, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; -static unsigned bt_config_power_off[] = { - /*RFR*/ - GPIO_CFG(43, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*CTS*/ - GPIO_CFG(44, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*RX*/ - GPIO_CFG(45, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*TX*/ - GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; -static unsigned bt_config_pcm_off[] = { - /*PCM_DOUT*/ - GPIO_CFG(68, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_DIN*/ - GPIO_CFG(69, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_SYNC*/ - GPIO_CFG(70, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*PCM_CLK*/ - GPIO_CFG(71, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -static unsigned fm_i2s_config_power_on[] = { - /*FM_I2S_SD*/ - GPIO_CFG(68, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*FM_I2S_WS*/ - GPIO_CFG(70, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - /*FM_I2S_SCK*/ - GPIO_CFG(71, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static unsigned fm_i2s_config_power_off[] = { - /*FM_I2S_SD*/ - GPIO_CFG(68, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*FM_I2S_WS*/ - GPIO_CFG(70, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /*FM_I2S_SCK*/ - GPIO_CFG(71, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -int gpio_bt_sys_rest_en = 133; -static void gpio_bt_config(void) -{ - u32 socinfo = socinfo_get_platform_version(); - if (machine_is_msm7627a_qrd1()) - gpio_bt_sys_rest_en = 114; - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt()) - gpio_bt_sys_rest_en = 16; - if (machine_is_msm8625_qrd7()) - gpio_bt_sys_rest_en = 88; - if (machine_is_qrd_skud_prime()) - gpio_bt_sys_rest_en = 35; - if (machine_is_msm7627a_qrd3()) { - if (socinfo == 0x70002) - gpio_bt_sys_rest_en = 88; - else - gpio_bt_sys_rest_en = 85; - } -} - -static int bt_set_gpio(int on) -{ - int rc = 0; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - pr_debug("%s: Setting SYS_RST_PIN(%d) to %d\n", - __func__, gpio_bt_sys_rest_en, on); - if (on) { - - if (machine_is_msm7627a_evb() || machine_is_msm8625_qrd7()) { - rc = gpio_tlmm_config(GPIO_CFG(gpio_bt_sys_rest_en, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - - gpio_set_value(gpio_bt_sys_rest_en, 1); - } else { - rc = gpio_direction_output(gpio_bt_sys_rest_en, 1); - } - msleep(100); - } else { - - if (!marimba_get_fm_status(&config) && - !marimba_get_bt_status(&config)) { - if (machine_is_msm7627a_evb() || - machine_is_msm8625_qrd7()) { - gpio_set_value(gpio_bt_sys_rest_en, 0); - rc = gpio_tlmm_config(GPIO_CFG( - gpio_bt_sys_rest_en, 0, - GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - } else { - gpio_set_value_cansleep(gpio_bt_sys_rest_en, 0); - rc = gpio_direction_input(gpio_bt_sys_rest_en); - } - msleep(100); - } - } - if (rc) - pr_err("%s: BT sys_reset_en GPIO : Error", __func__); - - return rc; -} - -static struct regulator *fm_regulator; -static int fm_radio_setup(struct marimba_fm_platform_data *pdata) -{ - int rc = 0; - const char *id = "FMPW"; - uint32_t irqcfg; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - u8 value; - - /* Voting for 1.8V Regulator */ - fm_regulator = regulator_get(NULL , "msme1"); - if (IS_ERR(fm_regulator)) { - rc = PTR_ERR(fm_regulator); - pr_err("%s: could not get regulator: %d\n", __func__, rc); - goto out; - } - - /* Set the voltage level to 1.8V */ - rc = regulator_set_voltage(fm_regulator, 1800000, 1800000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", __func__, rc); - goto reg_free; - } - - /* Enabling the 1.8V regulator */ - rc = regulator_enable(fm_regulator); - if (rc) { - pr_err("%s: could not enable regulator: %d\n", __func__, rc); - goto reg_free; - } - - /* Voting for 19.2MHz clock */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_ON); - if (rc < 0) { - pr_err("%s: clock vote failed with :(%d)\n", - __func__, rc); - goto reg_disable; - } - - rc = bt_set_gpio(1); - if (rc) { - pr_err("%s: bt_set_gpio = %d", __func__, rc); - goto gpio_deconfig; - } - /*re-write FM Slave Id, after reset*/ - value = BAHAMA_SLAVE_ID_FM_ADDR; - rc = marimba_write_bit_mask(&config, - BAHAMA_SLAVE_ID_FM_REG, &value, 1, 0xFF); - if (rc < 0) { - pr_err("%s: FM Slave ID rewrite Failed = %d", __func__, rc); - goto gpio_deconfig; - } - /* Configuring the FM GPIO */ - irqcfg = GPIO_CFG(FM_GPIO, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA); - - rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, irqcfg, rc); - goto gpio_deconfig; - } - - return 0; - -gpio_deconfig: - pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_OFF); - bt_set_gpio(0); -reg_disable: - regulator_disable(fm_regulator); -reg_free: - regulator_put(fm_regulator); - fm_regulator = NULL; -out: - return rc; -}; - -static void fm_radio_shutdown(struct marimba_fm_platform_data *pdata) -{ - int rc; - const char *id = "FMPW"; - - /* Releasing the GPIO line used by FM */ - uint32_t irqcfg = GPIO_CFG(FM_GPIO, 0, GPIO_CFG_INPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_2MA); - - rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); - if (rc) - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, irqcfg, rc); - - /* Releasing the 1.8V Regulator */ - if (!IS_ERR_OR_NULL(fm_regulator)) { - rc = regulator_disable(fm_regulator); - if (rc) - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - regulator_put(fm_regulator); - fm_regulator = NULL; - } - - /* Voting off the clock */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_OFF); - if (rc < 0) - pr_err("%s: voting off failed with :(%d)\n", - __func__, rc); - rc = bt_set_gpio(0); - if (rc) - pr_err("%s: bt_set_gpio = %d", __func__, rc); -} -static int switch_pcm_i2s_reg_mode(int mode) -{ - unsigned char reg = 0; - int rc = -1; - unsigned char set = I2C_PIN_CTL; /*SET PIN CTL mode*/ - unsigned char unset = I2C_NORMAL; /* UNSET PIN CTL MODE*/ - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - if (mode == 0) { - /* as we need to switch path to FM we need to move - BT AUX PCM lines to PIN CONTROL mode then move - FM to normal mode.*/ - for (reg = BT_PCM_BCLK_MODE; reg <= BT_PCM_SYNC_MODE; reg++) { - rc = marimba_write(&config, reg, &set, 1); - if (rc < 0) { - pr_err("pcm pinctl failed = %d", rc); - goto err_all; - } - } - for (reg = FM_I2S_SD_MODE; reg <= FM_I2S_SCK_MODE; reg++) { - rc = marimba_write(&config, reg, &unset, 1); - if (rc < 0) { - pr_err("i2s normal failed = %d", rc); - goto err_all; - } - } - } else { - /* as we need to switch path to AUXPCM we need to move - FM I2S lines to PIN CONTROL mode then move - BT AUX_PCM to normal mode.*/ - for (reg = FM_I2S_SD_MODE; reg <= FM_I2S_SCK_MODE; reg++) { - rc = marimba_write(&config, reg, &set, 1); - if (rc < 0) { - pr_err("i2s pinctl failed = %d", rc); - goto err_all; - } - } - for (reg = BT_PCM_BCLK_MODE; reg <= BT_PCM_SYNC_MODE; reg++) { - rc = marimba_write(&config, reg, &unset, 1); - if (rc < 0) { - pr_err("pcm normal failed = %d", rc); - goto err_all; - } - } - } - - return 0; - -err_all: - return rc; -} - - -static void config_pcm_i2s_mode(int mode) -{ - void __iomem *cfg_ptr; - u8 reg2; - - cfg_ptr = ioremap_nocache(FPGA_MSM_CNTRL_REG2, sizeof(char)); - - if (!cfg_ptr) - return; - if (mode) { - /*enable the pcm mode in FPGA*/ - reg2 = readb_relaxed(cfg_ptr); - if (reg2 == 0) { - reg2 = 1; - writeb_relaxed(reg2, cfg_ptr); - } - } else { - /*enable i2s mode in FPGA*/ - reg2 = readb_relaxed(cfg_ptr); - if (reg2 == 1) { - reg2 = 0; - writeb_relaxed(reg2, cfg_ptr); - } - } - iounmap(cfg_ptr); -} - -static int config_i2s(int mode) -{ - int pin, rc = 0; - - if (mode == FM_I2S_ON) { - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() - || machine_is_msm8625_surf()) - config_pcm_i2s_mode(0); - pr_err("%s mode = FM_I2S_ON", __func__); - - rc = switch_pcm_i2s_reg_mode(0); - if (rc) { - pr_err("switch mode failed"); - return rc; - } - for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_on); - pin++) { - rc = gpio_tlmm_config( - fm_i2s_config_power_on[pin], - GPIO_CFG_ENABLE - ); - if (rc < 0) - return rc; - } - } else if (mode == FM_I2S_OFF) { - pr_err("%s mode = FM_I2S_OFF", __func__); - rc = switch_pcm_i2s_reg_mode(1); - if (rc) { - pr_err("switch mode failed"); - return rc; - } - for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_off); - pin++) { - rc = gpio_tlmm_config( - fm_i2s_config_power_off[pin], - GPIO_CFG_ENABLE - ); - if (rc < 0) - return rc; - } - } - return rc; -} - -static int config_pcm(int mode) -{ - int pin, rc = 0; - - if (mode == BT_PCM_ON) { - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() - || machine_is_msm8625_surf()) - config_pcm_i2s_mode(1); - pr_err("%s mode =BT_PCM_ON", __func__); - rc = switch_pcm_i2s_reg_mode(1); - if (rc) { - pr_err("switch mode failed"); - return rc; - } - for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_on); - pin++) { - rc = gpio_tlmm_config(bt_config_pcm_on[pin], - GPIO_CFG_ENABLE); - if (rc < 0) - return rc; - } - } else if (mode == BT_PCM_OFF) { - pr_err("%s mode =BT_PCM_OFF", __func__); - rc = switch_pcm_i2s_reg_mode(0); - if (rc) { - pr_err("switch mode failed"); - return rc; - } - for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_off); - pin++) { - rc = gpio_tlmm_config(bt_config_pcm_off[pin], - GPIO_CFG_ENABLE); - if (rc < 0) - return rc; - } - - } - - return rc; -} - -static int msm_bahama_setup_pcm_i2s(int mode) -{ - int fm_state = 0, bt_state = 0; - int rc = 0; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - fm_state = marimba_get_fm_status(&config); - bt_state = marimba_get_bt_status(&config); - - switch (mode) { - case BT_PCM_ON: - case BT_PCM_OFF: - if (!fm_state) - rc = config_pcm(mode); - break; - case FM_I2S_ON: - rc = config_i2s(mode); - break; - case FM_I2S_OFF: - if (bt_state) - rc = config_pcm(BT_PCM_ON); - else - rc = config_i2s(mode); - break; - default: - rc = -EIO; - pr_err("%s:Unsupported mode", __func__); - } - return rc; -} - -static int bahama_bt(int on) -{ - int rc = 0; - int i; - - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - struct bahama_variant_register { - const size_t size; - const struct bahama_config_register *set; - }; - - const struct bahama_config_register *p; - - int version; - - const struct bahama_config_register v10_bt_on[] = { - { 0xE9, 0x00, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xE4, 0x00, 0xFF }, - { 0xE5, 0x00, 0x0F }, -#ifdef CONFIG_WLAN - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - { 0x01, 0x0C, 0x1F }, - { 0x01, 0x08, 0x1F }, - }; - - const struct bahama_config_register v20_bt_on_fm_off[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xF0, 0x00, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0x8E, 0x15, 0xFF }, - { 0x8F, 0x15, 0xFF }, - { 0x90, 0x15, 0xFF }, - - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v20_bt_on_fm_on[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v10_bt_off[] = { - { 0xE9, 0x00, 0xFF }, - }; - - const struct bahama_config_register v20_bt_off_fm_off[] = { - { 0xF4, 0x84, 0xFF }, - { 0xF0, 0x04, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_config_register v20_bt_off_fm_on[] = { - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_variant_register bt_bahama[2][3] = { - { - { ARRAY_SIZE(v10_bt_off), v10_bt_off }, - { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off }, - { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on } - }, - { - { ARRAY_SIZE(v10_bt_on), v10_bt_on }, - { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off }, - { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on } - } - }; - - u8 offset = 0; /* index into bahama configs */ - on = on ? 1 : 0; - version = marimba_read_bahama_ver(&config); - if (version < 0 || version == BAHAMA_VER_UNSUPPORTED) { - dev_err(&msm_bt_power_device.dev, "%s : Bahama " - "version read Error, version = %d\n", - __func__, version); - return -EIO; - } - - if (version == BAHAMA_VER_2_0) { - if (marimba_get_fm_status(&config)) - offset = 0x01; - } - - p = bt_bahama[on][version + offset].set; - - dev_info(&msm_bt_power_device.dev, - "%s: found version %d\n", __func__, version); - - for (i = 0; i < bt_bahama[on][version + offset].size; i++) { - u8 value = (p+i)->value; - rc = marimba_write_bit_mask(&config, - (p+i)->reg, - &value, - sizeof((p+i)->value), - (p+i)->mask); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "%s: reg %x write failed: %d\n", - __func__, (p+i)->reg, rc); - return rc; - } - dev_dbg(&msm_bt_power_device.dev, - "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - value = 0; - /* Ignoring the read failure as it is only for check */ - if (marimba_read_bit_mask(&config, - (p+i)->reg, &value, - sizeof((p+i)->value), (p+i)->mask) < 0) - dev_err(&msm_bt_power_device.dev, - "%s marimba_read_bit_mask- error", - __func__); - dev_dbg(&msm_bt_power_device.dev, - "%s: reg 0x%02x read value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - } - /* Update BT Status */ - if (on) - marimba_set_bt_status(&config, true); - else - marimba_set_bt_status(&config, false); - return rc; -} - -static int bluetooth_switch_regulators(int on) -{ - int i, rc = 0; - const char *id = "BTPW"; - - for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) { - if (IS_ERR_OR_NULL(bt_vregs[i].reg)) { - bt_vregs[i].reg = - regulator_get(&msm_bt_power_device.dev, - bt_vregs[i].name); - if (IS_ERR(bt_vregs[i].reg)) { - rc = PTR_ERR(bt_vregs[i].reg); - dev_err(&msm_bt_power_device.dev, - "%s: could not get regulator %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_disable; - } - } - - rc = on ? regulator_set_voltage(bt_vregs[i].reg, - bt_vregs[i].min_level, - bt_vregs[i].max_level) : 0; - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not set voltage for %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_disable; - } - - rc = on ? regulator_enable(bt_vregs[i].reg) : 0; - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not %sable regulator %s: %d\n", - __func__, "en", bt_vregs[i].name, rc); - goto reg_disable; - } - - if (bt_vregs[i].is_pin_controlled) { - rc = pmapp_vreg_lpm_pincntrl_vote(id, - bt_vregs[i].pmapp_id, - PMAPP_CLOCK_ID_D1, - on ? PMAPP_CLOCK_VOTE_ON : - PMAPP_CLOCK_VOTE_OFF); - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: pin control failed for %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto pin_cnt_fail; - } - } - rc = on ? 0 : regulator_disable(bt_vregs[i].reg); - - if (rc) { - dev_err(&msm_bt_power_device.dev, - "%s: could not %sable regulator %s: %d\n", - __func__, "dis", bt_vregs[i].name, rc); - } - } - - return rc; -pin_cnt_fail: - if (on) - regulator_disable(bt_vregs[i].reg); -reg_disable: - if (on) { - while (i) { - i--; - regulator_disable(bt_vregs[i].reg); - regulator_put(bt_vregs[i].reg); - bt_vregs[i].reg = NULL; - } - } - return rc; -} - -static struct regulator *reg_s3; -static unsigned int msm_bahama_setup_power(void) -{ - int rc = 0; - - reg_s3 = regulator_get(NULL, "msme1"); - if (IS_ERR(reg_s3)) { - rc = PTR_ERR(reg_s3); - pr_err("%s: could not get regulator: %d\n", __func__, rc); - goto out; - } - - rc = regulator_set_voltage(reg_s3, 1800000, 1800000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", __func__, rc); - goto reg_fail; - } - - rc = regulator_enable(reg_s3); - if (rc < 0) { - pr_err("%s: could not enable regulator: %d\n", __func__, rc); - goto reg_fail; - } - gpio_tlmm_config(GPIO_CFG(gpio_bt_sys_rest_en, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - - /*setup Bahama_sys_reset_n*/ - rc = gpio_request(gpio_bt_sys_rest_en, "bahama sys_rst_n"); - if (rc < 0) { - pr_err("%s: gpio_request %d = %d\n", __func__, - gpio_bt_sys_rest_en, rc); - goto reg_disable; - } - - rc = bt_set_gpio(1); - if (rc < 0) { - pr_err("%s: bt_set_gpio %d = %d\n", __func__, - gpio_bt_sys_rest_en, rc); - goto gpio_fail; - } - - return rc; - -gpio_fail: - gpio_free(gpio_bt_sys_rest_en); -reg_disable: - regulator_disable(reg_s3); -reg_fail: - regulator_put(reg_s3); -out: - reg_s3 = NULL; - return rc; -} - -static unsigned int msm_bahama_shutdown_power(int value) -{ - int rc = 0; - - if (IS_ERR_OR_NULL(reg_s3)) { - rc = reg_s3 ? PTR_ERR(reg_s3) : -ENODEV; - goto out; - } - - rc = regulator_disable(reg_s3); - if (rc) { - pr_err("%s: could not disable regulator: %d\n", __func__, rc); - goto out; - } - - if (value == BAHAMA_ID) { - rc = bt_set_gpio(0); - if (rc) { - pr_err("%s: bt_set_gpio = %d\n", - __func__, rc); - goto reg_enable; - } - gpio_free(gpio_bt_sys_rest_en); - } - - regulator_put(reg_s3); - reg_s3 = NULL; - - return 0; - -reg_enable: - regulator_enable(reg_s3); -out: - return rc; -} - -static unsigned int msm_bahama_core_config(int type) -{ - int rc = 0; - - if (type == BAHAMA_ID) { - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - const struct bahama_config_register v20_init[] = { - /* reg, value, mask */ - { 0xF4, 0x84, 0xFF }, /* AREG */ - { 0xF0, 0x04, 0xFF } /* DREG */ - }; - if (marimba_read_bahama_ver(&config) == BAHAMA_VER_2_0) { - for (i = 0; i < ARRAY_SIZE(v20_init); i++) { - u8 value = v20_init[i].value; - rc = marimba_write_bit_mask(&config, - v20_init[i].reg, - &value, - sizeof(v20_init[i].value), - v20_init[i].mask); - if (rc < 0) { - pr_err("%s: reg %d write failed: %d\n", - __func__, v20_init[i].reg, rc); - return rc; - } - pr_debug("%s: reg 0x%02x value 0x%02x" - " mask 0x%02x\n", - __func__, v20_init[i].reg, - v20_init[i].value, v20_init[i].mask); - } - } - } - rc = bt_set_gpio(0); - if (rc) { - pr_err("%s: bt_set_gpio = %d\n", - __func__, rc); - } - pr_debug("core type: %d\n", type); - return rc; -} - -static int bluetooth_power(int on) -{ - int pin, rc = 0; - const char *id = "BTPW"; - int cid = 0; - int bt_state = 0; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - pr_debug("%s: on = %d\n", __func__, on); - cid = adie_get_detected_connectivity_type(); - if (cid != BAHAMA_ID) { - pr_err("%s: unexpected adie connectivity type: %d\n", - __func__, cid); - return -ENODEV; - } - if (on) { - /*setup power for BT SOC*/ - rc = bt_set_gpio(on); - if (rc) { - pr_err("%s: bt_set_gpio = %d\n", - __func__, rc); - goto exit; - } - rc = bluetooth_switch_regulators(on); - if (rc < 0) { - pr_err("%s: bluetooth_switch_regulators rc = %d", - __func__, rc); - goto fail_gpio; - } - /*setup BT GPIO lines*/ - for (pin = 0; pin < ARRAY_SIZE(bt_config_power_on); - pin++) { - rc = gpio_tlmm_config(bt_config_power_on[pin], - GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, - bt_config_power_on[pin], - rc); - goto fail_power; - } - } - /*Setup BT clocks*/ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_ON); - if (rc < 0) { - pr_err("Failed to vote for TCXO_D1 ON\n"); - goto fail_gpio_cfg; - } - msleep(20); - - /*I2C config for Bahama*/ - rc = bahama_bt(1); - if (rc < 0) { - pr_err("%s: bahama_bt rc = %d", __func__, rc); - goto fail_clock; - } - msleep(20); - - /*setup BT PCM lines*/ - rc = msm_bahama_setup_pcm_i2s(BT_PCM_ON); - if (rc < 0) { - pr_err("%s: msm_bahama_setup_pcm_i2s , rc =%d\n", - __func__, rc); - goto fail_i2c; - } - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_PIN_CTRL); - if (rc < 0) - pr_err("%s:Pin Control Failed, rc = %d", - __func__, rc); - - } else { - bt_state = marimba_get_bt_status(&config); - if (!bt_state) { - pr_err("%s: BT is already turned OFF.\n", __func__); - return 0; - } - - rc = msm_bahama_setup_pcm_i2s(BT_PCM_OFF); - if (rc < 0) { - pr_err("%s: msm_bahama_setup_pcm_i2s, rc =%d\n", - __func__, rc); - } -fail_i2c: - rc = bahama_bt(0); - if (rc < 0) - pr_err("%s: bahama_bt rc = %d", __func__, rc); - -fail_clock: - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1, - PMAPP_CLOCK_VOTE_OFF); - if (rc < 0) - pr_err("%s: Failed to vote Off D1\n", __func__); -fail_gpio_cfg: - for (pin = 0; pin < ARRAY_SIZE(bt_config_power_off); - pin++) { - rc = gpio_tlmm_config(bt_config_power_off[pin], - GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s:" - " gpio_tlmm_config(%#x)=%d\n", - __func__, - bt_config_power_off[pin], rc); - } - } -fail_power: - rc = bluetooth_switch_regulators(0); - if (rc < 0) { - pr_err("%s: switch_regulators : rc = %d",\ - __func__, rc); - } -fail_gpio: - rc = bt_set_gpio(0); - if (rc) { - pr_err("%s: bt_set_gpio = %d\n", - __func__, rc); - goto exit; - } - } - return rc; -exit: - pr_err("%s: failed with rc = %d", __func__, rc); - return rc; -} - -static struct marimba_fm_platform_data marimba_fm_pdata = { - .fm_setup = fm_radio_setup, - .fm_shutdown = fm_radio_shutdown, - .irq = MSM_GPIO_TO_INT(FM_GPIO), - .vreg_s2 = NULL, - .vreg_xo_out = NULL, - /* Configuring the FM SoC as I2S Master */ - .is_fm_soc_i2s_master = true, - .config_i2s_gpio = msm_bahama_setup_pcm_i2s, -}; - -static struct marimba_platform_data marimba_pdata = { - .slave_id[SLAVE_ID_BAHAMA_FM] = BAHAMA_SLAVE_ID_FM_ADDR, - .slave_id[SLAVE_ID_BAHAMA_QMEMBIST] = BAHAMA_SLAVE_ID_QMEMBIST_ADDR, - .bahama_setup = msm_bahama_setup_power, - .bahama_shutdown = msm_bahama_shutdown_power, - .bahama_core_config = msm_bahama_core_config, - .fm = &marimba_fm_pdata, -}; - -static struct i2c_board_info bahama_devices[] = { -{ - I2C_BOARD_INFO("marimba", 0xc), - .platform_data = &marimba_pdata, -}, -}; - -void __init msm7627a_bt_power_init(void) -{ - int i, rc = 0; - struct device *dev; - - gpio_bt_config(); - - rc = i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - bahama_devices, - ARRAY_SIZE(bahama_devices)); - if (rc < 0) { - pr_err("%s: I2C Register failed\n", __func__); - return; - } - - rc = platform_device_register(&msm_bt_power_device); - if (rc < 0) { - pr_err("%s: device register failed\n", __func__); - return; - } - - dev = &msm_bt_power_device.dev; - - for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) { - bt_vregs[i].reg = regulator_get(dev, bt_vregs[i].name); - if (IS_ERR(bt_vregs[i].reg)) { - rc = PTR_ERR(bt_vregs[i].reg); - dev_err(dev, "%s: could not get regulator %s: %d\n", - __func__, bt_vregs[i].name, rc); - goto reg_get_fail; - } - } - - dev->platform_data = &bluetooth_power; - - return; - -reg_get_fail: - while (i--) { - regulator_put(bt_vregs[i].reg); - bt_vregs[i].reg = NULL; - } - platform_device_unregister(&msm_bt_power_device); -} -#endif diff --git a/arch/arm/mach-msm/board-msm7627a-camera.c b/arch/arm/mach-msm/board-msm7627a-camera.c deleted file mode 100644 index 119b73b00f5a..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-camera.c +++ /dev/null @@ -1,1273 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices-msm7x2xa.h" -#include "board-msm7627a.h" -#include - -#define GPIO_SKU1_CAM_VGA_SHDN 18 -#define GPIO_SKU1_CAM_VGA_RESET_N 29 -#define GPIO_SKU3_CAM_5MP_SHDN_N 5 /* PWDN */ -#define GPIO_SKU3_CAM_5MP_CAMIF_RESET 6 /* (board_is(EVT))?123:121 RESET */ -#define GPIO_SKU3_CAM_5MP_CAM_DRIVER_PWDN 30 -#define GPIO_SKU7_CAM_VGA_SHDN 91 -#define GPIO_SKU7_CAM_5MP_SHDN_N 93 /* PWDN */ -#define GPIO_SKU7_CAM_5MP_CAMIF_RESET 23 /* (board_is(EVT))?123:121 RESET */ - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static uint32_t camera_off_gpio_table[] = { - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -static uint32_t camera_on_gpio_table[] = { - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -static struct gpio s5k4e1_cam_req_gpio[] = { - {GPIO_CAM_GP_CAMIF_RESET_N, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl s5k4e1_cam_gpio_set_tbl[] = { - {GPIO_CAM_GP_CAMIF_RESET_N, GPIOF_OUT_INIT_LOW, 1000}, - {GPIO_CAM_GP_CAMIF_RESET_N, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_camera_gpio_conf gpio_conf_s5k4e1 = { - .camera_off_table = camera_off_gpio_table, - .camera_off_table_size = ARRAY_SIZE(camera_off_gpio_table), - .camera_on_table = camera_on_gpio_table, - .camera_on_table_size = ARRAY_SIZE(camera_on_gpio_table), - .cam_gpio_req_tbl = s5k4e1_cam_req_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(s5k4e1_cam_req_gpio), - .cam_gpio_set_tbl = s5k4e1_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(s5k4e1_cam_gpio_set_tbl), - .gpio_no_mux = 1, -}; - -static struct msm_camera_gpio_conf gpio_conf_mt9e013 = { - .camera_off_table = camera_off_gpio_table, - .camera_on_table = camera_on_gpio_table, - .gpio_no_mux = 1, -}; - -static struct msm_camera_gpio_conf gpio_conf_ov9726 = { - .camera_off_table = camera_off_gpio_table, - .camera_on_table = camera_on_gpio_table, - .gpio_no_mux = 1, -}; - -#ifdef CONFIG_OV7692 -static struct gpio ov7692_cam_req_gpio[] = { - {GPIO_SKU1_CAM_VGA_SHDN, GPIOF_DIR_OUT, "CAM_VGA_SHDN"}, - {GPIO_SKU1_CAM_VGA_RESET_N, GPIOF_DIR_OUT, "CAM_VGA_RESET"}, -}; - -static struct msm_gpio_set_tbl ov7692_cam_gpio_set_tbl[] = { - {GPIO_SKU1_CAM_VGA_SHDN, GPIOF_OUT_INIT_HIGH, 5000}, - {GPIO_SKU1_CAM_VGA_SHDN, GPIOF_OUT_INIT_LOW, 5000}, - {GPIO_SKU1_CAM_VGA_RESET_N, GPIOF_OUT_INIT_HIGH, 5000}, - {GPIO_SKU1_CAM_VGA_RESET_N, GPIOF_OUT_INIT_LOW, 5000}, -}; - -static struct msm_camera_gpio_conf gpio_conf_ov7692 = { - .cam_gpio_req_tbl = ov7692_cam_req_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(ov7692_cam_req_gpio), - .cam_gpio_set_tbl = ov7692_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(ov7692_cam_gpio_set_tbl), - .gpio_no_mux = 1, -}; -#endif - -#ifdef CONFIG_OV5647 -static struct msm_camera_gpio_conf gpio_conf_ov5647 = { - .camera_off_table = camera_off_gpio_table, - .camera_on_table = camera_on_gpio_table, - .gpio_no_mux = 1, -}; -#endif - -#ifdef CONFIG_MSM_CAMERA_FLASH -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_EXT, - ._fsrc.ext_driver_src.led_en = GPIO_CAM_GP_LED_EN1, - ._fsrc.ext_driver_src.led_flash_en = GPIO_CAM_GP_LED_EN2, -}; -#endif - -static struct camera_vreg_t msm_cam_vreg[] = { - {"msme1", REG_LDO, 1800000, 1800000, 0}, - {"gp2", REG_LDO, 2850000, 2850000, 0}, - {"usb2", REG_LDO, 1800000, 1800000, 0}, -}; - -static struct camera_vreg_t ov5647_gpio_vreg[] = { - {"cam_ov5647_avdd", REG_GPIO, 0, 0, 0}, - {"cam_ov5647_vdd", REG_GPIO, 0, 0, 0}, -}; - -static struct camera_vreg_t ov8825_gpio_vreg[] = { - {"cam_ov8825_avdd", REG_GPIO, 0, 0, 0}, - {"cam_ov8825_vdd", REG_GPIO, 0, 0, 0}, -}; - -static struct camera_vreg_t ov7692_gpio_vreg[] = { - {"cam_ov7692_avdd", REG_GPIO, 0, 0, 0}, - {"cam_ov7692_vdd", REG_GPIO, 0, 0, 0}, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k4e1_data; - -struct msm_camera_device_platform_data msm_camera_device_data_csi1[] = { - { - .csiphy_core = 1, - .csid_core = 1, - .ioclk = { - .vfe_clk_rate = 192000000, - }, - }, - { - .csiphy_core = 1, - .csid_core = 1, - .ioclk = { - .vfe_clk_rate = 266667000, - }, - }, -}; - -struct msm_camera_device_platform_data msm_camera_device_data_csi0[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .ioclk = { - .vfe_clk_rate = 192000000, - }, - }, - { - .csiphy_core = 0, - .csid_core = 0, - .ioclk = { - .vfe_clk_rate = 266667000, - }, - }, -}; - -static struct i2c_board_info msm_act_main_cam_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x11), -}; - -static struct msm_actuator_info msm_act_main_cam_4_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_4, - .bus_id = MSM_GSBI0_QUP_I2C_BUS_ID, - .vcm_pwd = GPIO_CAM_GP_CAM_PWDN, - .vcm_enable = 1, -}; - -#ifdef CONFIG_S5K4E1 -static struct msm_camera_sensor_flash_data flash_s5k4e1 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_s5k4e1 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_s5k4e1, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k4e1_data = { - .sensor_name = "s5k4e1", - .sensor_reset_enable = 1, - .pdata = &msm_camera_device_data_csi1[0], - .flash_data = &flash_s5k4e1, - .sensor_platform_info = &sensor_board_info_s5k4e1, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_4_info, -}; -#endif - -#ifdef CONFIG_OV7692 -static struct msm_camera_sensor_platform_info sensor_board_info_ov7692 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_ov7692, -}; - -static struct msm_camera_sensor_flash_data flash_ov7692 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov7692_data = { - .sensor_name = "ov7692", - .sensor_reset_enable = 0, - .sensor_reset = GPIO_SKU1_CAM_VGA_RESET_N, - .sensor_pwd = GPIO_SKU1_CAM_VGA_SHDN, - .pdata = &msm_camera_device_data_csi0[0], - .flash_data = &flash_ov7692, - .sensor_platform_info = &sensor_board_info_ov7692, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = YUV_SENSOR, -}; -#endif - -#ifdef CONFIG_OV5647 - -static struct msm_actuator_info msm_act_main_cam_5_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_5, - .bus_id = MSM_GSBI0_QUP_I2C_BUS_ID, - .vcm_pwd = GPIO_SKU3_CAM_5MP_CAM_DRIVER_PWDN, - .vcm_enable = 1, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov5647 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_ov5647, -}; - -static struct msm_camera_sensor_flash_src msm_flash_src_ov5647 = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED1, - ._fsrc.ext_driver_src.led_en = 13, - ._fsrc.ext_driver_src.led_flash_en = 32, -}; - -static struct msm_camera_sensor_flash_data flash_ov5647 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_ov5647, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov5647_data = { - .sensor_name = "ov5647", - .sensor_reset_enable = 1, - .sensor_reset = GPIO_SKU3_CAM_5MP_CAMIF_RESET, - .sensor_pwd = GPIO_SKU3_CAM_5MP_SHDN_N, - .pdata = &msm_camera_device_data_csi1[0], - .flash_data = &flash_ov5647, - .sensor_platform_info = &sensor_board_info_ov5647, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_5_info, -}; - -#endif - -static struct msm_camera_gpio_conf gpio_conf_ov8825 = { - .camera_off_table = camera_off_gpio_table, - .camera_on_table = camera_on_gpio_table, - .gpio_no_mux = 1, -}; - -static struct msm_camera_sensor_flash_src msm_flash_src_ov8825 = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED1, - ._fsrc.ext_driver_src.led_en = 13, - ._fsrc.ext_driver_src.led_flash_en = 32, -}; - -static struct msm_camera_sensor_flash_data flash_ov8825 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_ov8825, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov8825 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_ov8825, -}; - -static struct msm_actuator_info msm_act_main_cam_3_info = { - .board_info = &msm_act_main_cam_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_3, - .bus_id = MSM_GSBI0_QUP_I2C_BUS_ID, - .vcm_pwd = GPIO_SKU3_CAM_5MP_CAM_DRIVER_PWDN, - .vcm_enable = 0, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov8825_data = { - .sensor_name = "ov8825", - .sensor_reset_enable = 1, - .pmic_gpio_enable = 1, - .sensor_reset = GPIO_SKU3_CAM_5MP_CAMIF_RESET, - .sensor_pwd = GPIO_SKU3_CAM_5MP_SHDN_N, - .pdata = &msm_camera_device_data_csi1[1], - .flash_data = &flash_ov8825, - .sensor_platform_info = &sensor_board_info_ov8825, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, - .actuator_info = &msm_act_main_cam_3_info, -}; - -#ifdef CONFIG_MT9E013 -static struct msm_camera_sensor_flash_data flash_mt9e013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_mt9e013 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_mt9e013, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9e013_data = { - .sensor_name = "mt9e013", - .sensor_reset_enable = 1, - .pdata = &msm_camera_device_data_csi1[1], - .flash_data = &flash_mt9e013, - .sensor_platform_info = &sensor_board_info_mt9e013, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; -#endif - -#ifdef CONFIG_WEBCAM_OV9726 -static struct msm_camera_sensor_flash_data flash_ov9726 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov9726 = { - .mount_angle = 90, - .cam_vreg = msm_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_cam_vreg), - .gpio_conf = &gpio_conf_ov9726, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov9726_data = { - .sensor_name = "ov9726", - .sensor_reset_enable = 0, - .pdata = &msm_camera_device_data_csi0[0], - .flash_data = &flash_ov9726, - .sensor_platform_info = &sensor_board_info_ov9726, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, - .sensor_type = BAYER_SENSOR, -}; -#endif - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -static void __init msm7x27a_init_cam(void) -{ - if (!(machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm7627a_qrd1() - || machine_is_msm8625_ffa())) { - sensor_board_info_s5k4e1.cam_vreg = NULL; - sensor_board_info_s5k4e1.num_vreg = 0; - sensor_board_info_mt9e013.cam_vreg = NULL; - sensor_board_info_mt9e013.num_vreg = 0; - sensor_board_info_ov9726.cam_vreg = NULL; - sensor_board_info_ov9726.num_vreg = 0; - sensor_board_info_ov7692.cam_vreg = NULL; - sensor_board_info_ov7692.num_vreg = 0; - sensor_board_info_ov5647.cam_vreg = NULL; - sensor_board_info_ov5647.num_vreg = 0; - sensor_board_info_ov8825.cam_vreg = NULL; - sensor_board_info_ov8825.num_vreg = 0; - - } - if (machine_is_msm8625_evb() || machine_is_msm7627a_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - sensor_board_info_ov7692.cam_vreg = - ov7692_gpio_vreg; - sensor_board_info_ov7692.num_vreg = - ARRAY_SIZE(ov7692_gpio_vreg); - sensor_board_info_ov5647.cam_vreg = - ov5647_gpio_vreg; - sensor_board_info_ov5647.num_vreg = - ARRAY_SIZE(ov5647_gpio_vreg); - sensor_board_info_ov8825.cam_vreg = - ov8825_gpio_vreg; - sensor_board_info_ov8825.num_vreg = - ARRAY_SIZE(ov8825_gpio_vreg); - } - platform_device_register(&msm_camera_server); - if (machine_is_msm8625_surf() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - platform_device_register(&msm8625_device_csic0); - platform_device_register(&msm8625_device_csic1); - } else { - platform_device_register(&msm7x27a_device_csic0); - platform_device_register(&msm7x27a_device_csic1); - } - if (machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) - *(int *) msm7x27a_device_clkctl.dev.platform_data = 1; - platform_device_register(&msm7x27a_device_clkctl); - platform_device_register(&msm7x27a_device_vfe); -} - -static struct i2c_board_info i2c_camera_devices[] = { - { - I2C_BOARD_INFO("s5k4e1", 0x36), - .platform_data = &msm_camera_sensor_s5k4e1_data, - }, - { - I2C_BOARD_INFO("ov9726", 0x10), - .platform_data = &msm_camera_sensor_ov9726_data, - }, - { - I2C_BOARD_INFO("mt9e013", 0x6C >> 2), - .platform_data = &msm_camera_sensor_mt9e013_data, - }, - { - I2C_BOARD_INFO("ov7692", 0x78), - .platform_data = &msm_camera_sensor_ov7692_data, - }, - { - I2C_BOARD_INFO("ov5647", 0x36 << 1), - .platform_data = &msm_camera_sensor_ov5647_data, - }, - { - I2C_BOARD_INFO("ov8825", 0x6C >> 3), - .platform_data = &msm_camera_sensor_ov8825_data, - }, - { - I2C_BOARD_INFO("sc628a", 0x6E), - }, -}; -#else -static uint32_t camera_off_gpio_table[] = { - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -static uint32_t camera_on_gpio_table[] = { - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), -}; - -#ifdef CONFIG_MSM_CAMERA_FLASH -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_EXT, - ._fsrc.ext_driver_src.led_en = GPIO_CAM_GP_LED_EN1, - ._fsrc.ext_driver_src.led_flash_en = GPIO_CAM_GP_LED_EN2, -}; -#endif - -static struct regulator_bulk_data regs_camera[] = { - { .supply = "msme1", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "gp2", .min_uV = 2850000, .max_uV = 2850000 }, - { .supply = "usb2", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -static void qrd1_camera_gpio_cfg(void) -{ - - int rc = 0; - - rc = gpio_request(QRD_GPIO_CAM_5MP_SHDN_EN, "ov5640"); - if (rc < 0) - pr_err("%s: gpio_request---GPIO_CAM_5MP_SHDN_EN failed!", - __func__); - - - rc = gpio_tlmm_config(GPIO_CFG(QRD_GPIO_CAM_5MP_SHDN_EN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable Power Down gpio for main" - "camera!\n", __func__); - gpio_free(QRD_GPIO_CAM_5MP_SHDN_EN); - } - - - rc = gpio_request(QRD_GPIO_CAM_5MP_RESET, "ov5640"); - if (rc < 0) { - pr_err("%s: gpio_request---GPIO_CAM_5MP_RESET failed!", - __func__); - gpio_free(QRD_GPIO_CAM_5MP_SHDN_EN); - } - - - rc = gpio_tlmm_config(GPIO_CFG(QRD_GPIO_CAM_5MP_RESET, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable reset gpio for main camera!\n", - __func__); - gpio_free(QRD_GPIO_CAM_5MP_RESET); - } - - rc = gpio_request(QRD_GPIO_CAM_3MP_PWDN, "ov7692"); - if (rc < 0) - pr_err("%s: gpio_request---GPIO_CAM_3MP_PWDN failed!", - __func__); - - rc = gpio_tlmm_config(GPIO_CFG(QRD_GPIO_CAM_3MP_PWDN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable Power Down gpio for front" - "camera!\n", __func__); - gpio_free(QRD_GPIO_CAM_3MP_PWDN); - } - - gpio_direction_output(QRD_GPIO_CAM_5MP_SHDN_EN, 1); - gpio_direction_output(QRD_GPIO_CAM_5MP_RESET, 1); - gpio_direction_output(QRD_GPIO_CAM_3MP_PWDN, 1); -} -#endif - -static void evb_camera_gpio_cfg(void) -{ - int rc = 0; - - rc = gpio_request(msm_camera_sensor_ov5647_data.sensor_pwd, "ov5647"); - if (rc < 0) - pr_err("%s: gpio_request OV5647 sensor_pwd: %d failed!", - __func__, msm_camera_sensor_ov5647_data.sensor_pwd); - - rc = gpio_tlmm_config(GPIO_CFG(msm_camera_sensor_ov5647_data.sensor_pwd, - 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s:unable to enable Powr Dwn gpio for main camera!\n", - __func__); - gpio_free(msm_camera_sensor_ov5647_data.sensor_pwd); - } - - rc = gpio_direction_output(msm_camera_sensor_ov5647_data.sensor_pwd, 1); - if (rc < 0) - pr_err("%s: unable to set gpio: %d direction for ov5647 camera\n", - __func__, msm_camera_sensor_ov5647_data.sensor_pwd); - - rc = gpio_request(msm_camera_sensor_ov5647_data.sensor_reset, "ov5647"); - if (rc < 0) - pr_err("%s: gpio_request OV5647 sensor_reset: %d failed!", - __func__, msm_camera_sensor_ov5647_data.sensor_reset); - - rc = gpio_tlmm_config(GPIO_CFG( - msm_camera_sensor_ov5647_data.sensor_reset, - 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable reset gpio for main camera!\n", - __func__); - gpio_free(msm_camera_sensor_ov5647_data.sensor_reset); - } - - rc = gpio_direction_output( - msm_camera_sensor_ov5647_data.sensor_reset, 1); - if (rc < 0) - pr_err("%s: unable to set gpio: %d direction for ov5647 camera\n", - __func__, msm_camera_sensor_ov5647_data.sensor_reset); - -} - -#ifndef CONFIG_MSM_CAMERA_V4L2 - -static void msm_camera_vreg_config(int vreg_en) -{ - int rc = vreg_en ? - regulator_bulk_enable(ARRAY_SIZE(regs_camera), regs_camera) : - regulator_bulk_disable(ARRAY_SIZE(regs_camera), regs_camera); - - if (rc) - pr_err("%s: could not %sable regulators: %d\n", - __func__, vreg_en ? "en" : "dis", rc); -} - -static int config_gpio_table(uint32_t *table, int len) -{ - int rc = 0, i = 0; - - for (i = 0; i < len; i++) { - rc = gpio_tlmm_config(table[i], GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s not able to get gpio\n", __func__); - for (i--; i >= 0; i--) - gpio_tlmm_config(camera_off_gpio_table[i], - GPIO_CFG_ENABLE); - break; - } - } - return rc; -} - -static int config_camera_on_gpios_rear(void) -{ - int rc = 0; - - if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm7627a_qrd1() - || machine_is_msm8625_ffa()) - msm_camera_vreg_config(1); - - rc = config_gpio_table(camera_on_gpio_table, - ARRAY_SIZE(camera_on_gpio_table)); - if (rc < 0) { - pr_err("%s: CAMSENSOR gpio table request" - "failed\n", __func__); - return rc; - } - - return rc; -} - -static void config_camera_off_gpios_rear(void) -{ - if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm7627a_qrd1() - || machine_is_msm8625_ffa()) - msm_camera_vreg_config(0); - - config_gpio_table(camera_off_gpio_table, - ARRAY_SIZE(camera_off_gpio_table)); -} - -static int config_camera_on_gpios_front(void) -{ - int rc = 0; - - if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm7627a_qrd1() - || machine_is_msm8625_ffa()) - msm_camera_vreg_config(1); - - rc = config_gpio_table(camera_on_gpio_table, - ARRAY_SIZE(camera_on_gpio_table)); - if (rc < 0) { - pr_err("%s: CAMSENSOR gpio table request" - "failed\n", __func__); - return rc; - } - - return rc; -} - -static void config_camera_off_gpios_front(void) -{ - if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm7627a_qrd1() - || machine_is_msm8625_ffa()) - msm_camera_vreg_config(0); - - config_gpio_table(camera_off_gpio_table, - ARRAY_SIZE(camera_off_gpio_table)); -} - -struct msm_camera_device_platform_data msm_camera_device_data_rear = { - .camera_gpio_on = config_camera_on_gpios_rear, - .camera_gpio_off = config_camera_off_gpios_rear, - .ioext.csiphy = 0xA1000000, - .ioext.csisz = 0x00100000, - .ioext.csiirq = INT_CSI_IRQ_1, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 192000000, - .ioext.appphy = MSM7XXX_CLK_CTL_PHYS, - .ioext.appsz = MSM7XXX_CLK_CTL_SIZE, -}; - -struct msm_camera_device_platform_data msm_camera_device_data_front = { - .camera_gpio_on = config_camera_on_gpios_front, - .camera_gpio_off = config_camera_off_gpios_front, - .ioext.csiphy = 0xA0F00000, - .ioext.csisz = 0x00100000, - .ioext.csiirq = INT_CSI_IRQ_0, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 192000000, - .ioext.appphy = MSM7XXX_CLK_CTL_PHYS, - .ioext.appsz = MSM7XXX_CLK_CTL_SIZE, -}; - -#ifdef CONFIG_OV5647 - -static struct msm_camera_sensor_platform_info ov5647_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_src msm_flash_src_ov5647 = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED, - ._fsrc.led_src.led_name = "flashlight", - ._fsrc.led_src.led_name_len = 10, -}; - -static struct msm_camera_sensor_flash_data flash_ov5647 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_ov5647, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov5647_data = { - .sensor_name = "ov5647", - .sensor_reset_enable = 1, - .sensor_reset = GPIO_SKU3_CAM_5MP_CAMIF_RESET, - .pmic_gpio_enable = 1, - .sensor_pwd = GPIO_SKU3_CAM_5MP_SHDN_N, - .vcm_pwd = GPIO_SKU3_CAM_5MP_CAM_DRIVER_PWDN, - .vcm_enable = 1, - .pdata = &msm_camera_device_data_rear, - .flash_data = &flash_ov5647, - .sensor_platform_info = &ov5647_sensor_7627a_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_ov5647 = { - .name = "msm_camera_ov5647", - .dev = { - .platform_data = &msm_camera_sensor_ov5647_data, - }, -}; -#endif - -#ifdef CONFIG_S5K4E1 -static struct msm_camera_sensor_platform_info s5k4e1_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_s5k4e1 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k4e1_data = { - .sensor_name = "s5k4e1", - .sensor_reset_enable = 1, - .sensor_reset = GPIO_CAM_GP_CAMIF_RESET_N, - .pmic_gpio_enable = 0, - .sensor_pwd = 85, - .vcm_pwd = GPIO_CAM_GP_CAM_PWDN, - .vcm_enable = 1, - .pdata = &msm_camera_device_data_rear, - .flash_data = &flash_s5k4e1, - .sensor_platform_info = &s5k4e1_sensor_7627a_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_s5k4e1 = { - .name = "msm_camera_s5k4e1", - .dev = { - .platform_data = &msm_camera_sensor_s5k4e1_data, - }, -}; -#endif - -#ifdef CONFIG_IMX072 -static struct msm_camera_sensor_platform_info imx072_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_imx072 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx072_data = { - .sensor_name = "imx072", - .sensor_reset_enable = 1, - .sensor_reset = GPIO_CAM_GP_CAMIF_RESET_N, /* TODO 106,*/ - .pmic_gpio_enable = 0, - .sensor_pwd = 85, - .vcm_pwd = GPIO_CAM_GP_CAM_PWDN, - .vcm_enable = 1, - .pdata = &msm_camera_device_data_rear, - .flash_data = &flash_imx072, - .sensor_platform_info = &imx072_sensor_7627a_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_imx072 = { - .name = "msm_camera_imx072", - .dev = { - .platform_data = &msm_camera_sensor_imx072_data, - }, -}; -#endif - -#ifdef CONFIG_WEBCAM_OV9726 -static struct msm_camera_sensor_info msm_camera_sensor_ov9726_data; -static struct msm_camera_sensor_platform_info ov9726_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_ov9726 = { - .flash_type = MSM_CAMERA_FLASH_NONE, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov9726_data = { - .sensor_name = "ov9726", - .sensor_reset_enable = 0, - .sensor_reset = GPIO_CAM_GP_CAM1MP_XCLR, - .pmic_gpio_enable = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_front, - .flash_data = &flash_ov9726, - .sensor_platform_info = &ov9726_sensor_7627a_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_ov9726 = { - .name = "msm_camera_ov9726", - .dev = { - .platform_data = &msm_camera_sensor_ov9726_data, - }, -}; -#else -static inline void msm_camera_vreg_init(void) { } -#endif - -#ifdef CONFIG_MT9E013 -static struct msm_camera_sensor_platform_info mt9e013_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_mt9e013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9e013_data = { - .sensor_name = "mt9e013", - .sensor_reset = 0, - .sensor_reset_enable = 1, - .pmic_gpio_enable = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_rear, - .flash_data = &flash_mt9e013, - .sensor_platform_info = &mt9e013_sensor_7627a_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_mt9e013 = { - .name = "msm_camera_mt9e013", - .dev = { - .platform_data = &msm_camera_sensor_mt9e013_data, - }, -}; -#endif - -#ifdef CONFIG_OV5640 -static struct msm_camera_sensor_platform_info ov5640_sensor_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_src msm_flash_src_ov5640 = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED, - ._fsrc.led_src.led_name = "flashlight", - ._fsrc.led_src.led_name_len = 10, -}; - -static struct msm_camera_sensor_flash_data flash_ov5640 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_ov5640, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov5640_data = { - .sensor_name = "ov5640", - .sensor_reset_enable = 1, - .pmic_gpio_enable = 0, - .sensor_reset = QRD_GPIO_CAM_5MP_RESET, - .sensor_pwd = QRD_GPIO_CAM_5MP_SHDN_EN, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_rear, - .flash_data = &flash_ov5640, - .sensor_platform_info = &ov5640_sensor_info, - .csi_if = 1, -}; - -static struct platform_device msm_camera_sensor_ov5640 = { - .name = "msm_camera_ov5640", - .dev = { - .platform_data = &msm_camera_sensor_ov5640_data, - }, -}; -#endif - -#ifdef CONFIG_WEBCAM_OV7692_QRD -static struct msm_camera_sensor_platform_info ov7692_sensor_7627a_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_ov7692 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov7692_data = { - .sensor_name = "ov7692", - .sensor_reset_enable = 0, - .pmic_gpio_enable = 1, - .sensor_reset = GPIO_SKU1_CAM_VGA_RESET_N, - .sensor_pwd = GPIO_SKU1_CAM_VGA_SHDN, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_front, - .flash_data = &flash_ov7692, - .sensor_platform_info = &ov7692_sensor_7627a_info, - .csi_if = 1, -}; - -static struct platform_device msm_camera_sensor_ov7692 = { - .name = "msm_camera_ov7692", - .dev = { - .platform_data = &msm_camera_sensor_ov7692_data, - }, -}; -#endif - -static struct i2c_board_info i2c_camera_devices[] = { - #ifdef CONFIG_S5K4E1 - { - I2C_BOARD_INFO("s5k4e1", 0x36), - }, - { - I2C_BOARD_INFO("s5k4e1_af", 0x8c >> 1), - }, - #endif - #ifdef CONFIG_WEBCAM_OV9726 - { - I2C_BOARD_INFO("ov9726", 0x10), - }, - #endif - #ifdef CONFIG_IMX072 - { - I2C_BOARD_INFO("imx072", 0x34), - }, - #endif - #ifdef CONFIG_MT9E013 - { - I2C_BOARD_INFO("mt9e013", 0x6C >> 2), - }, - #endif - { - I2C_BOARD_INFO("sc628a", 0x6E), - }, -}; - -static struct i2c_board_info i2c_camera_devices_qrd[] = { - #ifdef CONFIG_OV5640 - { - I2C_BOARD_INFO("ov5640", 0x78 >> 1), - }, - #endif - #ifdef CONFIG_WEBCAM_OV7692_QRD - { - I2C_BOARD_INFO("ov7692", 0x78), - }, - #endif -}; - -static struct i2c_board_info i2c_camera_devices_evb[] = { - #ifdef CONFIG_OV5647 - { - I2C_BOARD_INFO("ov5647", 0x36 << 1), - }, - { - I2C_BOARD_INFO("ov5647_af", 0x18 >> 1), - }, - #endif - #ifdef CONFIG_WEBCAM_OV7692_QRD - { - I2C_BOARD_INFO("ov7692", 0x78), - }, - #endif -}; - -static struct platform_device *camera_devices_msm[] __initdata = { -#ifdef CONFIG_S5K4E1 - &msm_camera_sensor_s5k4e1, -#endif -#ifdef CONFIG_IMX072 - &msm_camera_sensor_imx072, -#endif -#ifdef CONFIG_WEBCAM_OV9726 - &msm_camera_sensor_ov9726, -#endif -#ifdef CONFIG_MT9E013 - &msm_camera_sensor_mt9e013, -#endif -}; - -static struct platform_device *camera_devices_qrd[] __initdata = { -#ifdef CONFIG_OV5640 - &msm_camera_sensor_ov5640, -#endif -#ifdef CONFIG_WEBCAM_OV7692_QRD - &msm_camera_sensor_ov7692, -#endif -}; - -static struct platform_device *camera_devices_evb[] __initdata = { -#ifdef CONFIG_OV5647 - &msm_camera_sensor_ov5647, -#endif -#ifdef CONFIG_WEBCAM_OV7692_QRD - &msm_camera_sensor_ov7692, -#endif - &msm_camera_sensor_ov8825, -}; -#endif - -enum { - SX150X_CAM, -}; - -static struct sx150x_platform_data sx150x_data[] __initdata = { - [SX150X_CAM] = { - .gpio_base = GPIO_CAM_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0, - .io_pulldn_ena = 0, - .io_open_drain_ena = 0x23, - .irq_summary = -1, - }, -}; - -static struct i2c_board_info cam_exp_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1508q", 0x22), - .platform_data = &sx150x_data[SX150X_CAM], - }, -}; - -static void __init register_i2c_devices(void) -{ - i2c_register_board_info(MSM_GSBI0_QUP_I2C_BUS_ID, - cam_exp_i2c_info, - ARRAY_SIZE(cam_exp_i2c_info)); -} - -#ifndef CONFIG_MSM_CAMERA_V4L2 -#define LCD_CAMERA_LDO_2V8 35 /* SKU1&SKU3 2.8V LDO */ -#define SKU3_LCD_CAMERA_LDO_1V8 40 /* SKU3 1.8V LDO */ -#define SKU7_LCD_CAMERA_LDO_1V8 58 /* SKU7 1.8V LDO */ - -static int lcd_camera_ldo_1v8 = SKU3_LCD_CAMERA_LDO_1V8; - -static void lcd_camera_power_init(void) -{ - int rc = 0; - - pr_debug("lcd_camera_power_init\n"); - - if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) - lcd_camera_ldo_1v8 = SKU7_LCD_CAMERA_LDO_1V8; - else - lcd_camera_ldo_1v8 = SKU3_LCD_CAMERA_LDO_1V8; - - /* LDO_EXT2V8 */ - if (gpio_request(LCD_CAMERA_LDO_2V8, "lcd_camera_ldo_2v8")) { - pr_err("failed to request gpio lcd_camera_ldo_2v8\n"); - return; - } - - rc = gpio_tlmm_config(GPIO_CFG(LCD_CAMERA_LDO_2V8, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable lcd_camera_ldo_2v8!\n", __func__); - goto fail_gpio2; - } - - /* LDO_EVT1V8 */ - if (gpio_request(lcd_camera_ldo_1v8, "lcd_camera_ldo_1v8")) { - pr_err("failed to request gpio lcd_camera_ldo_1v8\n"); - goto fail_gpio2; - } - - rc = gpio_tlmm_config(GPIO_CFG(lcd_camera_ldo_1v8, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("%s: unable to enable lcd_camera_ldo_1v8!\n", __func__); - goto fail_gpio1; - } - - return; - -fail_gpio1: - gpio_free(lcd_camera_ldo_1v8); -fail_gpio2: - gpio_free(LCD_CAMERA_LDO_2V8); - - return; -} - -static int lcd_camera_power_on_sku3(void) -{ - int rc = 0; - - pr_debug("turn on sku3 lcd_camera_ldo_1v8\n"); - gpio_set_value_cansleep(lcd_camera_ldo_1v8, 1); - - pr_debug("turn on sku3 lcd_camera_ldo\n"); - gpio_set_value_cansleep(LCD_CAMERA_LDO_2V8, 1); - - return rc; -} - -static int lcd_camera_power_off_sku3(void) -{ - int rc = 0; - - pr_debug("turn off sku3 lcd_camera_ldo_1v8\n"); - gpio_set_value_cansleep(lcd_camera_ldo_1v8, 0); - - pr_debug("turn off sku3 lcd_camera_ldo\n"); - gpio_set_value_cansleep(LCD_CAMERA_LDO_2V8, 0); - - gpio_free(lcd_camera_ldo_1v8); - gpio_free(LCD_CAMERA_LDO_2V8); - - return rc; -} - -int lcd_camera_power_onoff(int on) -{ - int rc = 0; - - pr_debug("lcd_camera_power_onoff on = %d,\n", on); - - if (on) - rc = lcd_camera_power_on_sku3(); - else - rc = lcd_camera_power_off_sku3(); - - return rc; -} -EXPORT_SYMBOL(lcd_camera_power_onoff); -#endif - -void __init msm7627a_camera_init(void) -{ - -#ifndef CONFIG_MSM_CAMERA_V4L2 - int rc; -#endif - pr_debug("msm7627a_camera_init Entered\n"); - - if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { - ov7692_cam_req_gpio[0].gpio = - GPIO_SKU7_CAM_VGA_SHDN; - ov7692_cam_gpio_set_tbl[0].gpio = GPIO_SKU7_CAM_VGA_SHDN; - ov7692_cam_gpio_set_tbl[1].gpio = GPIO_SKU7_CAM_VGA_SHDN; - - msm_camera_sensor_ov5647_data.sensor_pwd = - GPIO_SKU7_CAM_5MP_SHDN_N; - msm_camera_sensor_ov5647_data.sensor_reset = - GPIO_SKU7_CAM_5MP_CAMIF_RESET; - } - - /* LCD and camera power (VREG & LDO) init */ - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { -#ifndef CONFIG_MSM_CAMERA_V4L2 - lcd_camera_power_init(); -#endif - evb_camera_gpio_cfg(); - } - -#ifndef CONFIG_MSM_CAMERA_V4L2 - if (machine_is_msm7627a_qrd1()) { - qrd1_camera_gpio_cfg(); - platform_add_devices(camera_devices_qrd, - ARRAY_SIZE(camera_devices_qrd)); - } else if (machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - platform_add_devices(camera_devices_evb, - ARRAY_SIZE(camera_devices_evb)); - } else if (machine_is_msm7627a_qrd3()) - return; - else - platform_add_devices(camera_devices_msm, - ARRAY_SIZE(camera_devices_msm)); -#endif - if (!machine_is_msm7627a_qrd1() || !machine_is_msm7627a_evb() - || !machine_is_msm8625_evb() - || !machine_is_msm8625_evt() - || !machine_is_msm7627a_qrd3() - || !machine_is_msm8625_qrd7() - || !machine_is_qrd_skud_prime()) - register_i2c_devices(); -#ifndef CONFIG_MSM_CAMERA_V4L2 - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_camera), regs_camera); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - return; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_camera), regs_camera); - - if (rc) { - pr_err("%s: could not set voltages: %d\n", __func__, rc); - return; - } -#endif - -#if defined(CONFIG_MSM_CAMERA_V4L2) - msm7x27a_init_cam(); -#endif -#ifndef CONFIG_MSM_CAMERA_V4L2 - if (machine_is_msm7627a_qrd1()) { - i2c_register_board_info(MSM_GSBI0_QUP_I2C_BUS_ID, - i2c_camera_devices_qrd, - ARRAY_SIZE(i2c_camera_devices_qrd)); - } else if (machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - pr_debug("machine_is_msm7627a_evb i2c_register_board_info\n"); - i2c_register_board_info(MSM_GSBI0_QUP_I2C_BUS_ID, - i2c_camera_devices_evb, - ARRAY_SIZE(i2c_camera_devices_evb)); - } else -#endif - pr_debug("i2c_register_board_info\n"); - i2c_register_board_info(MSM_GSBI0_QUP_I2C_BUS_ID, - i2c_camera_devices, - ARRAY_SIZE(i2c_camera_devices)); -} diff --git a/arch/arm/mach-msm/board-msm7627a-display.c b/arch/arm/mach-msm/board-msm7627a-display.c deleted file mode 100644 index 52ab97dbc636..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-display.c +++ /dev/null @@ -1,1453 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "board-msm7627a.h" - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_SIZE 0x4BF000 -#define MSM7x25A_MSM_FB_SIZE 0x1C2000 -#define MSM8x25_MSM_FB_SIZE 0x5FA000 -#else -#define MSM_FB_SIZE 0x32A000 -#define MSM7x25A_MSM_FB_SIZE 0x12C000 -#define MSM8x25_MSM_FB_SIZE 0x3FC000 -#endif - -/* - * Reserve enough v4l2 space for a double buffered full screen - * res image (864x480x1.5x2) - */ -#define MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE 1244160 - -static unsigned fb_size = MSM_FB_SIZE; -static int __init fb_size_setup(char *p) -{ - fb_size = memparse(p, NULL); - return 0; -} - -early_param("fb_size", fb_size_setup); - -static uint32_t lcdc_truly_gpio_initialized; -static struct regulator_bulk_data regs_truly_lcdc[] = { - { .supply = "rfrx1", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -#define SKU3_LCDC_GPIO_DISPLAY_RESET 90 -#define SKU3_LCDC_GPIO_SPI_MOSI 19 -#define SKU3_LCDC_GPIO_SPI_CLK 20 -#define SKU3_LCDC_GPIO_SPI_CS0_N 21 -#define SKU3_LCDC_LCD_CAMERA_LDO_2V8 35 /*LCD_CAMERA_LDO_2V8*/ -#define SKU3_LCDC_LCD_CAMERA_LDO_1V8 34 /*LCD_CAMERA_LDO_1V8*/ -#define SKU3_1_LCDC_LCD_CAMERA_LDO_1V8 58 /*LCD_CAMERA_LDO_1V8*/ - -static struct regulator *gpio_reg_2p85v_sku3, *gpio_reg_1p8v_sku3; - -static uint32_t lcdc_truly_gpio_table[] = { - 19, - 20, - 21, - 89, - 90, -}; - -static char *lcdc_gpio_name_table[5] = { - "spi_mosi", - "spi_clk", - "spi_cs", - "gpio_bkl_en", - "gpio_disp_reset", -}; - -static char lcdc_splash_is_enabled(void); -static int lcdc_truly_gpio_init(void) -{ - int i; - int rc = 0; - - if (!lcdc_truly_gpio_initialized) { - for (i = 0; i < ARRAY_SIZE(lcdc_truly_gpio_table); i++) { - rc = gpio_request(lcdc_truly_gpio_table[i], - lcdc_gpio_name_table[i]); - if (rc < 0) { - pr_err("Error request gpio %s\n", - lcdc_gpio_name_table[i]); - goto truly_gpio_fail; - } - rc = gpio_tlmm_config(GPIO_CFG(lcdc_truly_gpio_table[i], - 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("Error config lcdc gpio:%d\n", - lcdc_truly_gpio_table[i]); - goto truly_gpio_fail; - } - if (lcdc_splash_is_enabled()) - rc = gpio_direction_output( - lcdc_truly_gpio_table[i], 1); - else - rc = gpio_direction_output( - lcdc_truly_gpio_table[i], 0); - if (rc < 0) { - pr_err("Error direct lcdc gpio:%d\n", - lcdc_truly_gpio_table[i]); - goto truly_gpio_fail; - } - } - - lcdc_truly_gpio_initialized = 1; - } - - return rc; - -truly_gpio_fail: - for (; i >= 0; i--) { - pr_err("Freeing GPIO: %d", lcdc_truly_gpio_table[i]); - gpio_free(lcdc_truly_gpio_table[i]); - } - - lcdc_truly_gpio_initialized = 0; - return rc; -} - - -void sku3_lcdc_power_init(void) -{ - int rc = 0; - u32 socinfo = socinfo_get_platform_type(); - - /* LDO_EXT2V8 */ - if (gpio_request(SKU3_LCDC_LCD_CAMERA_LDO_2V8, "lcd_camera_ldo_2v8")) { - pr_err("failed to request gpio lcd_camera_ldo_2v8\n"); - return; - } - - rc = gpio_tlmm_config(GPIO_CFG(SKU3_LCDC_LCD_CAMERA_LDO_2V8, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - - if (rc < 0) { - pr_err("%s:unable to enable lcd_camera_ldo_2v8!\n", __func__); - goto fail_gpio2; - } - - /* LDO_EVT1V8 */ - if (socinfo == 0x0B) { - if (gpio_request(SKU3_LCDC_LCD_CAMERA_LDO_1V8, - "lcd_camera_ldo_1v8")) { - pr_err("failed to request gpio lcd_camera_ldo_1v8\n"); - goto fail_gpio1; - } - - rc = gpio_tlmm_config(GPIO_CFG(SKU3_LCDC_LCD_CAMERA_LDO_1V8, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - - if (rc < 0) { - pr_err("%s: unable to enable lcdc_camera_ldo_1v8!\n", - __func__); - goto fail_gpio1; - } - } else if (socinfo == 0x0F || machine_is_msm8625_qrd7()) { - if (gpio_request(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8, - "lcd_camera_ldo_1v8")) { - pr_err("failed to request gpio lcd_camera_ldo_1v8\n"); - goto fail_gpio1; - } - - rc = gpio_tlmm_config(GPIO_CFG(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8, - 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - - if (rc < 0) { - pr_err("%s: unable to enable lcdc_camera_ldo_1v8!\n", - __func__); - goto fail_gpio1; - } - } - - if (socinfo == 0x0B) - gpio_free(SKU3_LCDC_LCD_CAMERA_LDO_1V8); - else if (socinfo == 0x0F || machine_is_msm8625_qrd7()) - gpio_free(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8); - - gpio_free(SKU3_LCDC_LCD_CAMERA_LDO_2V8); - - gpio_reg_2p85v_sku3 = regulator_get(&msm_lcdc_device.dev, - "lcd_vdd_sku3"); - if (IS_ERR(gpio_reg_2p85v_sku3)) { - pr_err("%s:ext_2p85v regulator get failed", __func__); - regulator_put(gpio_reg_2p85v_sku3); - return; - } - - gpio_reg_1p8v_sku3 = regulator_get(&msm_lcdc_device.dev, - "lcd_vddi_sku3"); - if (IS_ERR(gpio_reg_1p8v_sku3)) { - pr_err("%s:ext_1p8v regulator get failed", __func__); - regulator_put(gpio_reg_1p8v_sku3); - return; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_truly_lcdc), - regs_truly_lcdc); - if (rc) - pr_err("%s: could not get regulators: %d\n", __func__, rc); - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_truly_lcdc), - regs_truly_lcdc); - if (rc) - pr_err("%s: could not set voltages: %d\n", __func__, rc); - - return; - -fail_gpio1: - if (socinfo == 0x0B) - gpio_free(SKU3_LCDC_LCD_CAMERA_LDO_1V8); - else if (socinfo == 0x0F || machine_is_msm8625_qrd7()) - gpio_free(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8); -fail_gpio2: - gpio_free(SKU3_LCDC_LCD_CAMERA_LDO_2V8); - return; -} - -int sku3_lcdc_power_onoff(int on) -{ - int rc = 0; - - if (on) { - rc = regulator_enable(gpio_reg_2p85v_sku3); - if (rc < 0) { - pr_err("%s: reg enable failed\n", __func__); - return -EINVAL; - } - rc = regulator_enable(gpio_reg_1p8v_sku3); - if (rc < 0) { - pr_err("%s: reg enable failed\n", __func__); - return -EINVAL; - } - - rc = regulator_bulk_enable(ARRAY_SIZE(regs_truly_lcdc), - regs_truly_lcdc); - if (rc) { - pr_err("%s: could not enable regulators: %d\n", - __func__, rc); - return -EINVAL; - } - } else { - rc = regulator_disable(gpio_reg_2p85v_sku3); - if (rc < 0) { - pr_err("%s: reg disable failed\n", __func__); - return -EINVAL; - } - rc = regulator_disable(gpio_reg_1p8v_sku3); - if (rc < 0) { - pr_err("%s: reg disable failed\n", __func__); - return -EINVAL; - } - - rc = regulator_bulk_disable(ARRAY_SIZE(regs_truly_lcdc), - regs_truly_lcdc); - if (rc) { - pr_err("%s: could not disable regulators: %d\n", - __func__, rc); - return -EINVAL; - } - } - - return rc; -} - -static int sku3_lcdc_power_save(int on) -{ - int rc = 0; - static int cont_splash_done; - - if (on) { - sku3_lcdc_power_onoff(1); - rc = lcdc_truly_gpio_init(); - if (rc < 0) { - pr_err("%s(): Truly GPIO initializations failed", - __func__); - return rc; - } - - if (lcdc_splash_is_enabled() && !cont_splash_done) { - cont_splash_done = 1; - return rc; - } - - if (lcdc_truly_gpio_initialized) { - /*LCD reset*/ - gpio_set_value(SKU3_LCDC_GPIO_DISPLAY_RESET, 1); - msleep(20); - gpio_set_value(SKU3_LCDC_GPIO_DISPLAY_RESET, 0); - msleep(20); - gpio_set_value(SKU3_LCDC_GPIO_DISPLAY_RESET, 1); - msleep(20); - } - } else { - /* pull down LCD IO to avoid current leakage */ - gpio_set_value(SKU3_LCDC_GPIO_SPI_MOSI, 0); - gpio_set_value(SKU3_LCDC_GPIO_SPI_CLK, 0); - gpio_set_value(SKU3_LCDC_GPIO_SPI_CS0_N, 0); - gpio_set_value(SKU3_LCDC_GPIO_DISPLAY_RESET, 0); - - sku3_lcdc_power_onoff(0); - } - return rc; -} - -static struct msm_panel_common_pdata lcdc_truly_panel_data = { - .panel_config_gpio = NULL, - .gpio_num = lcdc_truly_gpio_table, -}; - -static struct platform_device lcdc_truly_panel_device = { - .name = "lcdc_truly_hvga_ips3p2335_pt", - .id = 0, - .dev = { - .platform_data = &lcdc_truly_panel_data, - } -}; - -static struct regulator_bulk_data regs_lcdc[] = { - { .supply = "gp2", .min_uV = 2850000, .max_uV = 2850000 }, - { .supply = "msme1", .min_uV = 1800000, .max_uV = 1800000 }, -}; -static uint32_t lcdc_gpio_initialized; - -static void lcdc_toshiba_gpio_init(void) -{ - int rc = 0; - if (!lcdc_gpio_initialized) { - if (gpio_request(GPIO_SPI_CLK, "spi_clk")) { - pr_err("failed to request gpio spi_clk\n"); - return; - } - if (gpio_request(GPIO_SPI_CS0_N, "spi_cs")) { - pr_err("failed to request gpio spi_cs0_N\n"); - goto fail_gpio6; - } - if (gpio_request(GPIO_SPI_MOSI, "spi_mosi")) { - pr_err("failed to request gpio spi_mosi\n"); - goto fail_gpio5; - } - if (gpio_request(GPIO_SPI_MISO, "spi_miso")) { - pr_err("failed to request gpio spi_miso\n"); - goto fail_gpio4; - } - if (gpio_request(GPIO_DISPLAY_PWR_EN, "gpio_disp_pwr")) { - pr_err("failed to request gpio_disp_pwr\n"); - goto fail_gpio3; - } - if (gpio_request(GPIO_BACKLIGHT_EN, "gpio_bkl_en")) { - pr_err("failed to request gpio_bkl_en\n"); - goto fail_gpio2; - } - pmapp_disp_backlight_init(); - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_lcdc), - regs_lcdc); - if (rc) { - pr_err("%s: could not get regulators: %d\n", - __func__, rc); - goto fail_gpio1; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_lcdc), - regs_lcdc); - if (rc) { - pr_err("%s: could not set voltages: %d\n", - __func__, rc); - goto fail_vreg; - } - lcdc_gpio_initialized = 1; - } - return; -fail_vreg: - regulator_bulk_free(ARRAY_SIZE(regs_lcdc), regs_lcdc); -fail_gpio1: - gpio_free(GPIO_BACKLIGHT_EN); -fail_gpio2: - gpio_free(GPIO_DISPLAY_PWR_EN); -fail_gpio3: - gpio_free(GPIO_SPI_MISO); -fail_gpio4: - gpio_free(GPIO_SPI_MOSI); -fail_gpio5: - gpio_free(GPIO_SPI_CS0_N); -fail_gpio6: - gpio_free(GPIO_SPI_CLK); - lcdc_gpio_initialized = 0; -} - -static uint32_t lcdc_gpio_table[] = { - GPIO_SPI_CLK, - GPIO_SPI_CS0_N, - GPIO_SPI_MOSI, - GPIO_DISPLAY_PWR_EN, - GPIO_BACKLIGHT_EN, - GPIO_SPI_MISO, -}; - -static void config_lcdc_gpio_table(uint32_t *table, int len, unsigned enable) -{ - int n; - - if (lcdc_gpio_initialized) { - /* All are IO Expander GPIOs */ - for (n = 0; n < (len - 1); n++) - gpio_direction_output(table[n], 1); - } -} - -static void lcdc_toshiba_config_gpios(int enable) -{ - config_lcdc_gpio_table(lcdc_gpio_table, - ARRAY_SIZE(lcdc_gpio_table), enable); -} - -static int msm_fb_lcdc_power_save(int on) -{ - int rc = 0; - /* Doing the init of the LCDC GPIOs very late as they are from - an I2C-controlled IO Expander */ - lcdc_toshiba_gpio_init(); - - if (lcdc_gpio_initialized) { - gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, on); - gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, on); - - rc = on ? regulator_bulk_enable( - ARRAY_SIZE(regs_lcdc), regs_lcdc) : - regulator_bulk_disable( - ARRAY_SIZE(regs_lcdc), regs_lcdc); - - if (rc) - pr_err("%s: could not %sable regulators: %d\n", - __func__, on ? "en" : "dis", rc); - } - - return rc; -} - -static int lcdc_toshiba_set_bl(int level) -{ - int ret; - - ret = pmapp_disp_backlight_set_brightness(level); - if (ret) - pr_err("%s: can't set lcd backlight!\n", __func__); - - return ret; -} - - -static int msm_lcdc_power_save(int on) -{ - int rc = 0; - if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) - rc = sku3_lcdc_power_save(on); - else - rc = msm_fb_lcdc_power_save(on); - - return rc; -} - -static struct lcdc_platform_data lcdc_pdata = { - .lcdc_gpio_config = NULL, - .lcdc_power_save = msm_lcdc_power_save, -}; - -static int lcd_panel_spi_gpio_num[] = { - GPIO_SPI_MOSI, /* spi_sdi */ - GPIO_SPI_MISO, /* spi_sdoi */ - GPIO_SPI_CLK, /* spi_clk */ - GPIO_SPI_CS0_N, /* spi_cs */ -}; - -static struct msm_panel_common_pdata lcdc_toshiba_panel_data = { - .panel_config_gpio = lcdc_toshiba_config_gpios, - .pmic_backlight = lcdc_toshiba_set_bl, - .gpio_num = lcd_panel_spi_gpio_num, -}; - -static struct platform_device lcdc_toshiba_panel_device = { - .name = "lcdc_toshiba_fwvga_pt", - .id = 0, - .dev = { - .platform_data = &lcdc_toshiba_panel_data, - } -}; - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE -static struct resource msm_v4l2_video_overlay_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; -#endif - -#define LCDC_TOSHIBA_FWVGA_PANEL_NAME "lcdc_toshiba_fwvga_pt" -#define MIPI_CMD_RENESAS_FWVGA_PANEL_NAME "mipi_cmd_renesas_fwvga" - -static int msm_fb_detect_panel(const char *name) -{ - int ret = -ENODEV; - - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || - machine_is_msm8625_surf()) { - if (!strncmp(name, "lcdc_toshiba_fwvga_pt", 21) || - !strncmp(name, "mipi_cmd_renesas_fwvga", 22)) - ret = 0; - } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm8625_ffa()) { - if (!strncmp(name, "mipi_cmd_renesas_fwvga", 22)) - ret = 0; - } else if (machine_is_msm7627a_qrd1()) { - if (!strncmp(name, "mipi_video_truly_wvga", 21)) - ret = 0; - } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { - if (!strncmp(name, "lcdc_truly_hvga_ips3p2335_pt", 28)) - ret = 0; - } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || - machine_is_msm8625_evt() || - machine_is_qrd_skud_prime()) { - if (!strncmp(name, "mipi_cmd_nt35510_wvga", 21)) - ret = 0; - } - -#if !defined(CONFIG_FB_MSM_LCDC_AUTO_DETECT) && \ - !defined(CONFIG_FB_MSM_MIPI_PANEL_AUTO_DETECT) && \ - !defined(CONFIG_FB_MSM_LCDC_MIPI_PANEL_AUTO_DETECT) - if (machine_is_msm7x27a_surf() || - machine_is_msm7625a_surf() || - machine_is_msm8625_surf()) { - if (!strncmp(name, LCDC_TOSHIBA_FWVGA_PANEL_NAME, - strnlen(LCDC_TOSHIBA_FWVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - } -#endif - - return ret; -} - -static int mipi_truly_set_bl(int on) -{ - gpio_set_value_cansleep(QRD_GPIO_BACKLIGHT_EN, !!on); - - return 1; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev = { - .platform_data = &msm_fb_pdata, - } -}; - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE -static struct platform_device msm_v4l2_video_overlay_device = { - .name = "msm_v4l2_overlay_pd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_v4l2_video_overlay_resources), - .resource = msm_v4l2_video_overlay_resources, - }; -#endif - - -#ifdef CONFIG_FB_MSM_MIPI_DSI -static int mipi_renesas_set_bl(int level) -{ - int ret; - - ret = pmapp_disp_backlight_set_brightness(level); - - if (ret) - pr_err("%s: can't set lcd backlight!\n", __func__); - - return ret; -} - -static struct msm_panel_common_pdata mipi_renesas_pdata = { - .pmic_backlight = mipi_renesas_set_bl, -}; - - -static struct platform_device mipi_dsi_renesas_panel_device = { - .name = "mipi_renesas", - .id = 0, - .dev = { - .platform_data = &mipi_renesas_pdata, - } -}; -#endif - -static int evb_backlight_control(int level, int mode) -{ - - int i = 0; - int remainder, ret = 0; - - /* device address byte = 0x72 */ - if (!mode) { - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - gpio_set_value(96, 0); - udelay(33); - gpio_set_value(96, 1); - udelay(67); - gpio_set_value(96, 0); - udelay(33); - gpio_set_value(96, 1); - udelay(67); - gpio_set_value(96, 0); - udelay(33); - gpio_set_value(96, 1); - udelay(67); - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - gpio_set_value(96, 0); - udelay(33); - gpio_set_value(96, 1); - udelay(67); - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - - /* t-EOS and t-start */ - gpio_set_value(96, 0); - ndelay(4200); - gpio_set_value(96, 1); - ndelay(9000); - - /* data byte */ - /* RFA = 0 */ - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - - /* Address bits */ - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - - /* Data bits */ - for (i = 0; i < 5; i++) { - remainder = (level) & (16); - if (remainder) { - gpio_set_value(96, 0); - udelay(33); - gpio_set_value(96, 1); - udelay(67); - } else { - gpio_set_value(96, 0); - udelay(67); - gpio_set_value(96, 1); - udelay(33); - } - level = level << 1; - } - - /* t-EOS */ - gpio_set_value(96, 0); - ndelay(12000); - gpio_set_value(96, 1); - } else { - ret = pmapp_disp_backlight_set_brightness(level); - if (ret) - pr_err("%s: can't set lcd backlight!\n", __func__); - } - - return ret; -} - -static int mipi_NT35510_rotate_panel(void) -{ - int rotate = 0; - if (machine_is_msm8625_evt()) - rotate = 1; - - return rotate; -} - -static struct msm_panel_common_pdata mipi_truly_pdata = { - .pmic_backlight = mipi_truly_set_bl, -}; - -static struct platform_device mipi_dsi_truly_panel_device = { - .name = "mipi_truly", - .id = 0, - .dev = { - .platform_data = &mipi_truly_pdata, - } -}; - -static struct msm_panel_common_pdata mipi_NT35510_pdata = { - .backlight = evb_backlight_control, - .rotate_panel = mipi_NT35510_rotate_panel, -}; - -static struct platform_device mipi_dsi_NT35510_panel_device = { - .name = "mipi_NT35510", - .id = 0, - .dev = { - .platform_data = &mipi_NT35510_pdata, - } -}; - -static struct msm_panel_common_pdata mipi_NT35516_pdata = { - .backlight = evb_backlight_control, -}; - -static struct platform_device mipi_dsi_NT35516_panel_device = { - .name = "mipi_truly_tft540960_1_e", - .id = 0, - .dev = { - .platform_data = &mipi_NT35516_pdata, - } -}; - -static struct platform_device *msm_fb_devices[] __initdata = { - &msm_fb_device, - &lcdc_toshiba_panel_device, -#ifdef CONFIG_FB_MSM_MIPI_DSI - &mipi_dsi_renesas_panel_device, -#endif -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE - &msm_v4l2_video_overlay_device, -#endif -}; - -static struct platform_device *qrd_fb_devices[] __initdata = { - &msm_fb_device, - &mipi_dsi_truly_panel_device, -}; - -static struct platform_device *qrd3_fb_devices[] __initdata = { - &msm_fb_device, - &lcdc_truly_panel_device, -}; - -static struct platform_device *evb_fb_devices[] __initdata = { - &msm_fb_device, - &mipi_dsi_NT35510_panel_device, - &mipi_dsi_NT35516_panel_device, -}; - -void __init msm_msm7627a_allocate_memory_regions(void) -{ - void *addr; - unsigned long fb_size; - - if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) - fb_size = MSM7x25A_MSM_FB_SIZE; - else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) - fb_size = MSM8x25_MSM_FB_SIZE; - else - fb_size = MSM_FB_SIZE; - - addr = alloc_bootmem_align(fb_size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + fb_size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", fb_size, - addr, __pa(addr)); - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE - fb_size = MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE; - addr = alloc_bootmem_align(fb_size, 0x1000); - msm_v4l2_video_overlay_resources[0].start = __pa(addr); - msm_v4l2_video_overlay_resources[0].end = - msm_v4l2_video_overlay_resources[0].start + fb_size - 1; - pr_debug("allocating %lu bytes at %p (%lx physical) for v4l2\n", - fb_size, addr, __pa(addr)); -#endif - -} - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = 97, - .mdp_rev = MDP_REV_303, - .cont_splash_enabled = 0x1, -}; - -static char lcdc_splash_is_enabled() -{ - return mdp_pdata.cont_splash_enabled; -} - -#define GPIO_LCDC_BRDG_PD 128 -#define GPIO_LCDC_BRDG_RESET_N 129 -#define GPIO_LCD_DSI_SEL 125 -#define LCDC_RESET_PHYS 0x90008014 - -static void __iomem *lcdc_reset_ptr; - -static unsigned mipi_dsi_gpio[] = { - GPIO_CFG(GPIO_LCDC_BRDG_RESET_N, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* LCDC_BRDG_RESET_N */ - GPIO_CFG(GPIO_LCDC_BRDG_PD, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* LCDC_BRDG_PD */ -}; - -static unsigned lcd_dsi_sel_gpio[] = { - GPIO_CFG(GPIO_LCD_DSI_SEL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_2MA), -}; - -enum { - DSI_SINGLE_LANE = 1, - DSI_TWO_LANES, -}; - -static int msm_fb_get_lane_config(void) -{ - /* For MSM7627A SURF/FFA and QRD */ - int rc = DSI_TWO_LANES; - if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { - rc = DSI_SINGLE_LANE; - pr_info("DSI_SINGLE_LANES\n"); - } else { - pr_info("DSI_TWO_LANES\n"); - } - return rc; -} - -static int msm_fb_dsi_client_msm_reset(void) -{ - int rc = 0; - - rc = gpio_request(GPIO_LCDC_BRDG_RESET_N, "lcdc_brdg_reset_n"); - if (rc < 0) { - pr_err("failed to request lcd brdg reset_n\n"); - return rc; - } - - rc = gpio_request(GPIO_LCDC_BRDG_PD, "lcdc_brdg_pd"); - if (rc < 0) { - pr_err("failed to request lcd brdg pd\n"); - return rc; - } - - rc = gpio_tlmm_config(mipi_dsi_gpio[0], GPIO_CFG_ENABLE); - if (rc) { - pr_err("Failed to enable LCDC Bridge reset enable\n"); - goto gpio_error; - } - - rc = gpio_tlmm_config(mipi_dsi_gpio[1], GPIO_CFG_ENABLE); - if (rc) { - pr_err("Failed to enable LCDC Bridge pd enable\n"); - goto gpio_error2; - } - - rc = gpio_direction_output(GPIO_LCDC_BRDG_RESET_N, 1); - rc |= gpio_direction_output(GPIO_LCDC_BRDG_PD, 1); - gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 0); - - if (!rc) { - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() - || machine_is_msm8625_surf()) { - lcdc_reset_ptr = ioremap_nocache(LCDC_RESET_PHYS, - sizeof(uint32_t)); - - if (!lcdc_reset_ptr) - return 0; - } - return rc; - } else { - goto gpio_error; - } - -gpio_error2: - pr_err("Failed GPIO bridge pd\n"); - gpio_free(GPIO_LCDC_BRDG_PD); - -gpio_error: - pr_err("Failed GPIO bridge reset\n"); - gpio_free(GPIO_LCDC_BRDG_RESET_N); - return rc; -} - -static int mipi_truly_sel_mode(int video_mode) -{ - int rc = 0; - - rc = gpio_request(GPIO_LCD_DSI_SEL, "lcd_dsi_sel"); - if (rc < 0) - goto gpio_error; - - rc = gpio_tlmm_config(lcd_dsi_sel_gpio[0], GPIO_CFG_ENABLE); - if (rc) - goto gpio_error; - - rc = gpio_direction_output(GPIO_LCD_DSI_SEL, 1); - if (!rc) { - gpio_set_value_cansleep(GPIO_LCD_DSI_SEL, video_mode); - return rc; - } else { - goto gpio_error; - } - -gpio_error: - pr_err("mipi_truly_sel_mode failed\n"); - gpio_free(GPIO_LCD_DSI_SEL); - return rc; -} - -static int msm_fb_dsi_client_qrd1_reset(void) -{ - int rc = 0; - - rc = gpio_request(GPIO_LCDC_BRDG_RESET_N, "lcdc_brdg_reset_n"); - if (rc < 0) { - pr_err("failed to request lcd brdg reset_n\n"); - return rc; - } - - rc = gpio_tlmm_config(mipi_dsi_gpio[0], GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("Failed to enable LCDC Bridge reset enable\n"); - return rc; - } - - rc = gpio_direction_output(GPIO_LCDC_BRDG_RESET_N, 1); - if (rc < 0) { - pr_err("Failed GPIO bridge pd\n"); - gpio_free(GPIO_LCDC_BRDG_RESET_N); - return rc; - } - - mipi_truly_sel_mode(1); - - return rc; -} - -#define GPIO_QRD3_LCD_BRDG_RESET_N 85 -#define GPIO_QRD3_LCD_BACKLIGHT_EN 96 -#define GPIO_QRD3_LCD_EXT_2V85_EN 35 -#define GPIO_QRD3_LCD_EXT_1V8_EN 40 - -static unsigned qrd3_mipi_dsi_gpio[] = { - GPIO_CFG(GPIO_QRD3_LCD_BRDG_RESET_N, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), /* GPIO_QRD3_LCD_BRDG_RESET_N */ - GPIO_CFG(GPIO_QRD3_LCD_BACKLIGHT_EN, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), /* GPIO_QRD3_LCD_BACKLIGHT_EN */ - GPIO_CFG(GPIO_QRD3_LCD_EXT_2V85_EN, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), /* GPIO_QRD3_LCD_EXT_2V85_EN */ - GPIO_CFG(GPIO_QRD3_LCD_EXT_1V8_EN, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), /* GPIO_QRD3_LCD_EXT_1V8_EN */ -}; - -static int msm_fb_dsi_client_qrd3_reset(void) -{ - int rc = 0; - - rc = gpio_request(GPIO_QRD3_LCD_BRDG_RESET_N, "qrd3_lcd_brdg_reset_n"); - if (rc < 0) { - pr_err("failed to request qrd3 lcd brdg reset_n\n"); - return rc; - } - - return rc; -} - -static int msm_fb_dsi_client_reset(void) -{ - int rc = 0; - - if (machine_is_msm7627a_qrd1()) - rc = msm_fb_dsi_client_qrd1_reset(); - else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) - rc = msm_fb_dsi_client_qrd3_reset(); - else - rc = msm_fb_dsi_client_msm_reset(); - - return rc; - -} - -static struct regulator_bulk_data regs_dsi[] = { - { .supply = "gp2", .min_uV = 2850000, .max_uV = 2850000 }, - { .supply = "msme1", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -static int dsi_gpio_initialized; - -static int mipi_dsi_panel_msm_power(int on) -{ - int rc = 0; - uint32_t lcdc_reset_cfg; - - /* I2C-controlled GPIO Expander -init of the GPIOs very late */ - if (unlikely(!dsi_gpio_initialized)) { - pmapp_disp_backlight_init(); - - rc = gpio_request(GPIO_DISPLAY_PWR_EN, "gpio_disp_pwr"); - if (rc < 0) { - pr_err("failed to request gpio_disp_pwr\n"); - return rc; - } - - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() - || machine_is_msm8625_surf()) { - rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, 1); - if (rc < 0) { - pr_err("failed to enable display pwr\n"); - goto fail_gpio1; - } - - rc = gpio_request(GPIO_BACKLIGHT_EN, "gpio_bkl_en"); - if (rc < 0) { - pr_err("failed to request gpio_bkl_en\n"); - goto fail_gpio1; - } - - rc = gpio_direction_output(GPIO_BACKLIGHT_EN, 1); - if (rc < 0) { - pr_err("failed to enable backlight\n"); - goto fail_gpio2; - } - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_dsi), regs_dsi); - if (rc) { - pr_err("%s: could not get regulators: %d\n", - __func__, rc); - goto fail_gpio2; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_dsi), - regs_dsi); - if (rc) { - pr_err("%s: could not set voltages: %d\n", - __func__, rc); - goto fail_vreg; - } - if (pmapp_disp_backlight_set_brightness(100)) - pr_err("backlight set brightness failed\n"); - - dsi_gpio_initialized = 1; - } - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || - machine_is_msm8625_surf()) { - gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, on); - gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, on); - } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm8625_ffa()) { - if (on) { - /* This line drives an active low pin on FFA */ - rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, !on); - if (rc < 0) - pr_err("failed to set direction for " - "display pwr\n"); - } else { - gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, !on); - rc = gpio_direction_input(GPIO_DISPLAY_PWR_EN); - if (rc < 0) - pr_err("failed to set direction for " - "display pwr\n"); - } - } - - if (on) { - gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 0); - - if (machine_is_msm7x27a_surf() || - machine_is_msm7625a_surf() || - machine_is_msm8625_surf()) { - lcdc_reset_cfg = readl_relaxed(lcdc_reset_ptr); - rmb(); - lcdc_reset_cfg &= ~1; - - writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); - msleep(20); - wmb(); - lcdc_reset_cfg |= 1; - writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); - msleep(20); - } else { - gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1); - msleep(20); - } - } else { - gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 1); - } - - rc = on ? regulator_bulk_enable(ARRAY_SIZE(regs_dsi), regs_dsi) : - regulator_bulk_disable(ARRAY_SIZE(regs_dsi), regs_dsi); - - if (rc) - pr_err("%s: could not %sable regulators: %d\n", - __func__, on ? "en" : "dis", rc); - - return rc; -fail_vreg: - regulator_bulk_free(ARRAY_SIZE(regs_dsi), regs_dsi); -fail_gpio2: - gpio_free(GPIO_BACKLIGHT_EN); -fail_gpio1: - gpio_free(GPIO_DISPLAY_PWR_EN); - dsi_gpio_initialized = 0; - return rc; -} - -static int mipi_dsi_panel_qrd1_power(int on) -{ - int rc = 0; - - if (!dsi_gpio_initialized) { - rc = gpio_request(QRD_GPIO_BACKLIGHT_EN, "gpio_bkl_en"); - if (rc < 0) - return rc; - - rc = gpio_tlmm_config(GPIO_CFG(QRD_GPIO_BACKLIGHT_EN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("failed GPIO_BACKLIGHT_EN tlmm config\n"); - return rc; - } - - rc = gpio_direction_output(QRD_GPIO_BACKLIGHT_EN, 1); - if (rc < 0) { - pr_err("failed to enable backlight\n"); - gpio_free(QRD_GPIO_BACKLIGHT_EN); - return rc; - } - dsi_gpio_initialized = 1; - } - - gpio_set_value_cansleep(QRD_GPIO_BACKLIGHT_EN, !!on); - - if (on) { - gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1); - msleep(20); - gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1); - - } - - return rc; -} - -static int qrd3_dsi_gpio_initialized; -static struct regulator *gpio_reg_2p85v, *gpio_reg_1p8v; - -static int mipi_dsi_panel_qrd3_power(int on) -{ - int rc = 0; - - if (!qrd3_dsi_gpio_initialized) { - pmapp_disp_backlight_init(); - rc = gpio_request(GPIO_QRD3_LCD_BACKLIGHT_EN, - "qrd3_gpio_bkl_en"); - if (rc < 0) - return rc; - - qrd3_dsi_gpio_initialized = 1; - - if (mdp_pdata.cont_splash_enabled) { - rc = gpio_tlmm_config(GPIO_CFG( - GPIO_QRD3_LCD_BACKLIGHT_EN, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("failed QRD3 GPIO_BACKLIGHT_EN tlmm config\n"); - return rc; - } - rc = gpio_direction_output(GPIO_QRD3_LCD_BACKLIGHT_EN, - 1); - if (rc < 0) { - pr_err("failed to enable backlight\n"); - gpio_free(GPIO_QRD3_LCD_BACKLIGHT_EN); - return rc; - } - - /*Configure LCD Bridge reset*/ - rc = gpio_tlmm_config(qrd3_mipi_dsi_gpio[0], - GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("Failed to enable LCD Bridge reset enable\n"); - return rc; - } - - rc = gpio_direction_output(GPIO_QRD3_LCD_BRDG_RESET_N, - 1); - - if (rc < 0) { - pr_err("Failed GPIO bridge Reset\n"); - gpio_free(GPIO_QRD3_LCD_BRDG_RESET_N); - return rc; - } - return 0; - } - } - - if (on) { - rc = gpio_tlmm_config(GPIO_CFG(GPIO_QRD3_LCD_BACKLIGHT_EN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("failed QRD3 GPIO_BACKLIGHT_EN tlmm config\n"); - return rc; - } - rc = gpio_direction_output(GPIO_QRD3_LCD_BACKLIGHT_EN, 1); - if (rc < 0) { - pr_err("failed to enable backlight\n"); - gpio_free(GPIO_QRD3_LCD_BACKLIGHT_EN); - return rc; - } - /*Toggle Backlight GPIO*/ - gpio_set_value_cansleep(GPIO_QRD3_LCD_BACKLIGHT_EN, 1); - udelay(100); - gpio_set_value_cansleep(GPIO_QRD3_LCD_BACKLIGHT_EN, 0); - udelay(430); - gpio_set_value_cansleep(GPIO_QRD3_LCD_BACKLIGHT_EN, 1); - /* 1 wire mode starts from this low to high transition */ - udelay(50); - - /*Enable EXT_2.85 and 1.8 regulators*/ - rc = regulator_enable(gpio_reg_2p85v); - if (rc < 0) - pr_err("%s: reg enable failed\n", __func__); - rc = regulator_enable(gpio_reg_1p8v); - if (rc < 0) - pr_err("%s: reg enable failed\n", __func__); - - /*Configure LCD Bridge reset*/ - rc = gpio_tlmm_config(qrd3_mipi_dsi_gpio[0], GPIO_CFG_ENABLE); - if (rc < 0) { - pr_err("Failed to enable LCD Bridge reset enable\n"); - return rc; - } - - rc = gpio_direction_output(GPIO_QRD3_LCD_BRDG_RESET_N, 1); - - if (rc < 0) { - pr_err("Failed GPIO bridge Reset\n"); - gpio_free(GPIO_QRD3_LCD_BRDG_RESET_N); - return rc; - } - - /*Toggle Bridge Reset GPIO*/ - msleep(20); - gpio_set_value_cansleep(GPIO_QRD3_LCD_BRDG_RESET_N, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_QRD3_LCD_BRDG_RESET_N, 1); - msleep(20); - - } else { - gpio_tlmm_config(GPIO_CFG(GPIO_QRD3_LCD_BACKLIGHT_EN, 0, - GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - GPIO_CFG_DISABLE); - - gpio_tlmm_config(GPIO_CFG(GPIO_QRD3_LCD_BRDG_RESET_N, 0, - GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - GPIO_CFG_DISABLE); - - rc = regulator_disable(gpio_reg_2p85v); - if (rc < 0) - pr_err("%s: reg disable failed\n", __func__); - rc = regulator_disable(gpio_reg_1p8v); - if (rc < 0) - pr_err("%s: reg disable failed\n", __func__); - - } - - return rc; -} - -static char mipi_dsi_splash_is_enabled(void); -static int mipi_dsi_panel_power(int on) -{ - int rc = 0; - - if (machine_is_msm7627a_qrd1()) - rc = mipi_dsi_panel_qrd1_power(on); - else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) - rc = mipi_dsi_panel_qrd3_power(on); - else - rc = mipi_dsi_panel_msm_power(on); - return rc; -} - -#define MDP_303_VSYNC_GPIO 97 - -#ifdef CONFIG_FB_MSM_MIPI_DSI -static struct mipi_dsi_platform_data mipi_dsi_pdata = { - .vsync_gpio = MDP_303_VSYNC_GPIO, - .dsi_power_save = mipi_dsi_panel_power, - .dsi_client_reset = msm_fb_dsi_client_reset, - .get_lane_config = msm_fb_get_lane_config, - .splash_is_enabled = mipi_dsi_splash_is_enabled, -}; -#endif - -static char mipi_dsi_splash_is_enabled(void) -{ - return mdp_pdata.cont_splash_enabled; -} - -static char prim_panel_name[PANEL_NAME_MAX_LEN]; -static int __init prim_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("prim_display", prim_display_setup); - -static int disable_splash; - -void msm7x27a_set_display_params(char *prim_panel) -{ - if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.prim_panel_name, prim_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.prim_panel_name %s\n", - msm_fb_pdata.prim_panel_name); - } - if (strnlen(msm_fb_pdata.prim_panel_name, PANEL_NAME_MAX_LEN)) { - if (strncmp((char *)msm_fb_pdata.prim_panel_name, - "mipi_cmd_nt35510_wvga", - strnlen("mipi_cmd_nt35510_wvga", - PANEL_NAME_MAX_LEN)) && - strncmp((char *)msm_fb_pdata.prim_panel_name, - "mipi_video_nt35510_wvga", - strnlen("mipi_video_nt35510_wvga", - PANEL_NAME_MAX_LEN))) - disable_splash = 1; - } -} - -void __init msm_fb_add_devices(void) -{ - int rc = 0; - msm7x27a_set_display_params(prim_panel_name); - if (machine_is_msm7627a_qrd1()) { - platform_add_devices(qrd_fb_devices, - ARRAY_SIZE(qrd_fb_devices)); - } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) { - mipi_NT35510_pdata.bl_lock = 1; - mipi_NT35516_pdata.bl_lock = 1; - if (disable_splash) - mdp_pdata.cont_splash_enabled = 0x0; - - platform_add_devices(evb_fb_devices, - ARRAY_SIZE(evb_fb_devices)); - } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { - if (machine_is_msm7627a_qrd3()) - mdp_pdata.cont_splash_enabled = 0x0; - else - mdp_pdata.cont_splash_enabled = 0x1; - platform_add_devices(qrd3_fb_devices, - ARRAY_SIZE(qrd3_fb_devices)); - } else { - mdp_pdata.cont_splash_enabled = 0x0; - platform_add_devices(msm_fb_devices, - ARRAY_SIZE(msm_fb_devices)); - } - - msm_fb_register_device("mdp", &mdp_pdata); - if (machine_is_msm7625a_surf() || machine_is_msm7x27a_surf() || - machine_is_msm8625_surf() || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7()) - msm_fb_register_device("lcdc", &lcdc_pdata); - if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) - sku3_lcdc_power_init(); -#ifdef CONFIG_FB_MSM_MIPI_DSI - msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); -#endif - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) { - gpio_reg_2p85v = regulator_get(&mipi_dsi_device.dev, - "lcd_vdd"); - if (IS_ERR(gpio_reg_2p85v)) - pr_err("%s:ext_2p85v regulator get failed", __func__); - - gpio_reg_1p8v = regulator_get(&mipi_dsi_device.dev, - "lcd_vddi"); - if (IS_ERR(gpio_reg_1p8v)) - pr_err("%s:ext_1p8v regulator get failed", __func__); - - if (mdp_pdata.cont_splash_enabled) { - /*Enable EXT_2.85 and 1.8 regulators*/ - rc = regulator_enable(gpio_reg_2p85v); - if (rc < 0) - pr_err("%s: reg enable failed\n", __func__); - rc = regulator_enable(gpio_reg_1p8v); - if (rc < 0) - pr_err("%s: reg enable failed\n", __func__); - } - } -} diff --git a/arch/arm/mach-msm/board-msm7627a-io.c b/arch/arm/mach-msm/board-msm7627a-io.c deleted file mode 100644 index 3acbfc609b10..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-io.c +++ /dev/null @@ -1,926 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "board-msm7627a.h" -#include "devices-msm7x2xa.h" - -#define ATMEL_TS_I2C_NAME "maXTouch" -#define ATMEL_X_OFFSET 13 -#define ATMEL_Y_OFFSET 0 - -#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C) || \ -defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C_MODULE) - -#ifndef CLEARPAD3000_ATTEN_GPIO -#define CLEARPAD3000_ATTEN_GPIO (48) -#endif - -#ifndef CLEARPAD3000_RESET_GPIO -#define CLEARPAD3000_RESET_GPIO (26) -#endif - -#define KP_INDEX(row, col) ((row)*ARRAY_SIZE(kp_col_gpios) + (col)) - -static unsigned int kp_row_gpios[] = {31, 32, 33, 34, 35}; -static unsigned int kp_col_gpios[] = {36, 37, 38, 39, 40}; - -static const unsigned short keymap[ARRAY_SIZE(kp_col_gpios) * - ARRAY_SIZE(kp_row_gpios)] = { - [KP_INDEX(0, 0)] = KEY_7, - [KP_INDEX(0, 1)] = KEY_DOWN, - [KP_INDEX(0, 2)] = KEY_UP, - [KP_INDEX(0, 3)] = KEY_RIGHT, - [KP_INDEX(0, 4)] = KEY_ENTER, - - [KP_INDEX(1, 0)] = KEY_LEFT, - [KP_INDEX(1, 1)] = KEY_SEND, - [KP_INDEX(1, 2)] = KEY_1, - [KP_INDEX(1, 3)] = KEY_4, - [KP_INDEX(1, 4)] = KEY_CLEAR, - - [KP_INDEX(2, 0)] = KEY_6, - [KP_INDEX(2, 1)] = KEY_5, - [KP_INDEX(2, 2)] = KEY_8, - [KP_INDEX(2, 3)] = KEY_3, - [KP_INDEX(2, 4)] = KEY_NUMERIC_STAR, - - [KP_INDEX(3, 0)] = KEY_9, - [KP_INDEX(3, 1)] = KEY_NUMERIC_POUND, - [KP_INDEX(3, 2)] = KEY_0, - [KP_INDEX(3, 3)] = KEY_2, - [KP_INDEX(3, 4)] = KEY_SLEEP, - - [KP_INDEX(4, 0)] = KEY_BACK, - [KP_INDEX(4, 1)] = KEY_HOME, - [KP_INDEX(4, 2)] = KEY_MENU, - [KP_INDEX(4, 3)] = KEY_VOLUMEUP, - [KP_INDEX(4, 4)] = KEY_VOLUMEDOWN, -}; - -/* SURF keypad platform device information */ -static struct gpio_event_matrix_info kp_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = keymap, - .output_gpios = kp_row_gpios, - .input_gpios = kp_col_gpios, - .noutputs = ARRAY_SIZE(kp_row_gpios), - .ninputs = ARRAY_SIZE(kp_col_gpios), - .settle_time.tv64 = 40 * NSEC_PER_USEC, - .poll_time.tv64 = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE | - GPIOKPF_PRINT_UNMAPPED_KEYS, -}; - -static struct gpio_event_info *kp_info[] = { - &kp_matrix_info.info -}; - -static struct gpio_event_platform_data kp_pdata = { - .name = "7x27a_kp", - .info = kp_info, - .info_count = ARRAY_SIZE(kp_info) -}; - -static struct platform_device kp_pdev = { - .name = GPIO_EVENT_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &kp_pdata, - }, -}; - -/* 8625 keypad device information */ -static unsigned int kp_row_gpios_8625[] = {31}; -static unsigned int kp_col_gpios_8625[] = {36, 37}; - -static const unsigned short keymap_8625[] = { - KEY_VOLUMEUP, - KEY_VOLUMEDOWN, -}; - -static const unsigned short keymap_8625_evt[] = { - KEY_VOLUMEDOWN, - KEY_VOLUMEUP, -}; - -static struct gpio_event_matrix_info kp_matrix_info_8625 = { - .info.func = gpio_event_matrix_func, - .keymap = keymap_8625, - .output_gpios = kp_row_gpios_8625, - .input_gpios = kp_col_gpios_8625, - .noutputs = ARRAY_SIZE(kp_row_gpios_8625), - .ninputs = ARRAY_SIZE(kp_col_gpios_8625), - .settle_time.tv64 = 40 * NSEC_PER_USEC, - .poll_time.tv64 = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE | - GPIOKPF_PRINT_UNMAPPED_KEYS, -}; - -static struct gpio_event_info *kp_info_8625[] = { - &kp_matrix_info_8625.info, -}; - -static struct gpio_event_platform_data kp_pdata_8625 = { - .name = "7x27a_kp", - .info = kp_info_8625, - .info_count = ARRAY_SIZE(kp_info_8625) -}; - -static struct platform_device kp_pdev_8625 = { - .name = GPIO_EVENT_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &kp_pdata_8625, - }, -}; - -#define LED_GPIO_PDM 96 - -#define MXT_TS_IRQ_GPIO 48 -#define MXT_TS_RESET_GPIO 26 -#define MAX_VKEY_LEN 100 - -static ssize_t mxt_virtual_keys_register(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - char *virtual_keys = __stringify(EV_KEY) ":" __stringify(KEY_MENU) \ - ":60:840:120:80" ":" __stringify(EV_KEY) \ - ":" __stringify(KEY_HOME) ":180:840:120:80" \ - ":" __stringify(EV_KEY) ":" \ - __stringify(KEY_BACK) ":300:840:120:80" \ - ":" __stringify(EV_KEY) ":" \ - __stringify(KEY_SEARCH) ":420:840:120:80" "\n"; - - return snprintf(buf, strnlen(virtual_keys, MAX_VKEY_LEN) + 1 , "%s", - virtual_keys); -} - -static struct kobj_attribute mxt_virtual_keys_attr = { - .attr = { - .name = "virtualkeys.atmel_mxt_ts", - .mode = S_IRUGO, - }, - .show = &mxt_virtual_keys_register, -}; - -static struct attribute *mxt_virtual_key_properties_attrs[] = { - &mxt_virtual_keys_attr.attr, - NULL, -}; - -static struct attribute_group mxt_virtual_key_properties_attr_group = { - .attrs = mxt_virtual_key_properties_attrs, -}; - -struct kobject *mxt_virtual_key_properties_kobj; - -static int mxt_vkey_setup(void) -{ - int retval = 0; - - mxt_virtual_key_properties_kobj = - kobject_create_and_add("board_properties", NULL); - if (mxt_virtual_key_properties_kobj) - retval = sysfs_create_group(mxt_virtual_key_properties_kobj, - &mxt_virtual_key_properties_attr_group); - if (!mxt_virtual_key_properties_kobj || retval) - pr_err("failed to create mxt board_properties\n"); - - return retval; -} - -static const u8 mxt_config_data[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 16, 1, 0, 0, 0, 0, 0, 0, - /* T7 Object */ - 32, 16, 50, - /* T8 Object */ - 30, 0, 20, 20, 0, 0, 20, 0, 50, 0, - /* T9 Object */ - 3, 0, 0, 18, 11, 0, 32, 75, 3, 3, - 0, 1, 1, 0, 10, 10, 10, 10, 31, 3, - 223, 1, 11, 11, 15, 15, 151, 43, 145, 80, - 100, 15, 0, 0, 0, - /* T15 Object */ - 131, 0, 11, 11, 1, 1, 0, 45, 3, 0, - 0, - /* T18 Object */ - 0, 0, - /* T19 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - /* T23 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - /* T25 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, - /* T46 Object */ - 0, 2, 32, 48, 0, 0, 0, 0, 0, - /* T47 Object */ - 1, 20, 60, 5, 2, 50, 40, 0, 0, 40, - /* T48 Object */ - 1, 12, 80, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 6, 0, 0, 100, 4, 64, - 10, 0, 20, 5, 0, 38, 0, 20, 0, 0, - 0, 0, 0, 0, 16, 65, 3, 1, 1, 0, - 10, 10, 10, 0, 0, 15, 15, 154, 58, 145, - 80, 100, 15, 3, -}; - -static const u8 mxt_config_data_evt[] = { - /* T6 Object */ - 0, 0, 0, 0, 0, 0, - /* T38 Object */ - 20, 1, 0, 25, 9, 12, 0, 0, - /* T7 Object */ - 24, 12, 10, - /* T8 Object */ - 30, 0, 20, 20, 0, 0, 0, 0, 10, 192, - /* T9 Object */ - 131, 0, 0, 18, 11, 0, 16, 70, 2, 1, - 0, 2, 1, 62, 10, 10, 10, 10, 107, 3, - 223, 1, 2, 2, 20, 20, 172, 40, 139, 110, - 10, 15, 0, 0, 0, - /* T15 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, - /* T18 Object */ - 0, 0, - /* T19 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - /* T23 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - /* T25 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - /* T40 Object */ - 0, 0, 0, 0, 0, - /* T42 Object */ - 3, 20, 45, 40, 128, 0, 0, 0, - /* T46 Object */ - 0, 2, 16, 16, 0, 0, 0, 0, 0, - /* T47 Object */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* T48 Object */ - 1, 12, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 6, 0, 0, 100, 4, 64, - 10, 0, 20, 5, 0, 38, 0, 20, 0, 0, - 0, 0, 0, 0, 16, 65, 3, 1, 1, 0, - 10, 10, 10, 0, 0, 15, 15, 154, 58, 145, - 80, 100, 15, 3, -}; - -static struct mxt_config_info mxt_config_array[] = { - { - .config = mxt_config_data, - .config_length = ARRAY_SIZE(mxt_config_data), - .family_id = 0x81, - .variant_id = 0x01, - .version = 0x10, - .build = 0xAA, - }, -}; - -static int mxt_key_codes[MXT_KEYARRAY_MAX_KEYS] = { - [0] = KEY_HOME, - [1] = KEY_MENU, - [9] = KEY_BACK, - [10] = KEY_SEARCH, -}; - -static struct mxt_platform_data mxt_platform_data = { - .config_array = mxt_config_array, - .config_array_size = ARRAY_SIZE(mxt_config_array), - .panel_minx = 0, - .panel_maxx = 479, - .panel_miny = 0, - .panel_maxy = 799, - .disp_minx = 0, - .disp_maxx = 479, - .disp_miny = 0, - .disp_maxy = 799, - .irqflags = IRQF_TRIGGER_FALLING, - .i2c_pull_up = true, - .reset_gpio = MXT_TS_RESET_GPIO, - .irq_gpio = MXT_TS_IRQ_GPIO, - .key_codes = mxt_key_codes, -}; - -static struct i2c_board_info mxt_device_info[] __initdata = { - { - I2C_BOARD_INFO("atmel_mxt_ts", 0x4a), - .platform_data = &mxt_platform_data, - .irq = MSM_GPIO_TO_INT(MXT_TS_IRQ_GPIO), - }, -}; - -static int synaptics_touchpad_setup(void); - -static struct msm_gpio clearpad3000_cfg_data[] = { - {GPIO_CFG(CLEARPAD3000_ATTEN_GPIO, 0, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "rmi4_attn"}, - {GPIO_CFG(CLEARPAD3000_RESET_GPIO, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_8MA), "rmi4_reset"}, -}; - -static struct rmi_XY_pair rmi_offset = {.x = 0, .y = 0}; -static struct rmi_range rmi_clipx = {.min = 48, .max = 980}; -static struct rmi_range rmi_clipy = {.min = 7, .max = 1647}; -static struct rmi_f11_functiondata synaptics_f11_data = { - .swap_axes = false, - .flipX = false, - .flipY = false, - .offset = &rmi_offset, - .button_height = 113, - .clipX = &rmi_clipx, - .clipY = &rmi_clipy, -}; - -#define MAX_LEN 100 - -static ssize_t clearpad3000_virtual_keys_register(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - char *virtual_keys = __stringify(EV_KEY) ":" __stringify(KEY_MENU) \ - ":60:830:120:60" ":" __stringify(EV_KEY) \ - ":" __stringify(KEY_HOME) ":180:830:120:60" \ - ":" __stringify(EV_KEY) ":" \ - __stringify(KEY_SEARCH) ":300:830:120:60" \ - ":" __stringify(EV_KEY) ":" \ - __stringify(KEY_BACK) ":420:830:120:60" "\n"; - - return snprintf(buf, strnlen(virtual_keys, MAX_LEN) + 1 , "%s", - virtual_keys); -} - -static struct kobj_attribute clearpad3000_virtual_keys_attr = { - .attr = { - .name = "virtualkeys.sensor00fn11", - .mode = S_IRUGO, - }, - .show = &clearpad3000_virtual_keys_register, -}; - -static struct attribute *virtual_key_properties_attrs[] = { - &clearpad3000_virtual_keys_attr.attr, - NULL -}; - -static struct attribute_group virtual_key_properties_attr_group = { - .attrs = virtual_key_properties_attrs, -}; - -struct kobject *virtual_key_properties_kobj; - -static struct rmi_functiondata synaptics_functiondata[] = { - { - .function_index = RMI_F11_INDEX, - .data = &synaptics_f11_data, - }, -}; - -static struct rmi_functiondata_list synaptics_perfunctiondata = { - .count = ARRAY_SIZE(synaptics_functiondata), - .functiondata = synaptics_functiondata, -}; - -static struct rmi_sensordata synaptics_sensordata = { - .perfunctiondata = &synaptics_perfunctiondata, - .rmi_sensor_setup = synaptics_touchpad_setup, -}; - -static struct rmi_i2c_platformdata synaptics_platformdata = { - .i2c_address = 0x2c, - .irq_type = IORESOURCE_IRQ_LOWLEVEL, - .sensordata = &synaptics_sensordata, -}; - -static struct i2c_board_info synaptic_i2c_clearpad3k[] = { - { - I2C_BOARD_INFO("rmi4_ts", 0x2c), - .platform_data = &synaptics_platformdata, - }, -}; - -static int synaptics_touchpad_setup(void) -{ - int retval = 0; - - virtual_key_properties_kobj = - kobject_create_and_add("board_properties", NULL); - if (virtual_key_properties_kobj) - retval = sysfs_create_group(virtual_key_properties_kobj, - &virtual_key_properties_attr_group); - if (!virtual_key_properties_kobj || retval) - pr_err("failed to create ft5202 board_properties\n"); - - retval = msm_gpios_request_enable(clearpad3000_cfg_data, - sizeof(clearpad3000_cfg_data)/sizeof(struct msm_gpio)); - if (retval) { - pr_err("%s:Failed to obtain touchpad GPIO %d. Code: %d.", - __func__, CLEARPAD3000_ATTEN_GPIO, retval); - retval = 0; /* ignore the err */ - } - synaptics_platformdata.irq = gpio_to_irq(CLEARPAD3000_ATTEN_GPIO); - - gpio_set_value(CLEARPAD3000_RESET_GPIO, 0); - usleep(10000); - gpio_set_value(CLEARPAD3000_RESET_GPIO, 1); - usleep(50000); - - return retval; -} -#endif - -static struct regulator_bulk_data regs_atmel[] = { - { .supply = "ldo12", .min_uV = 2700000, .max_uV = 3300000 }, - { .supply = "smps3", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -#define ATMEL_TS_GPIO_IRQ 82 - -static int atmel_ts_power_on(bool on) -{ - int rc = on ? - regulator_bulk_enable(ARRAY_SIZE(regs_atmel), regs_atmel) : - regulator_bulk_disable(ARRAY_SIZE(regs_atmel), regs_atmel); - - if (rc) - pr_err("%s: could not %sable regulators: %d\n", - __func__, on ? "en" : "dis", rc); - else - msleep(50); - - return rc; -} - -static int atmel_ts_platform_init(struct i2c_client *client) -{ - int rc; - struct device *dev = &client->dev; - - rc = regulator_bulk_get(dev, ARRAY_SIZE(regs_atmel), regs_atmel); - if (rc) { - dev_err(dev, "%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_atmel), regs_atmel); - if (rc) { - dev_err(dev, "%s: could not set voltages: %d\n", - __func__, rc); - goto reg_free; - } - - rc = gpio_tlmm_config(GPIO_CFG(ATMEL_TS_GPIO_IRQ, 0, - GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_8MA), GPIO_CFG_ENABLE); - if (rc) { - dev_err(dev, "%s: gpio_tlmm_config for %d failed\n", - __func__, ATMEL_TS_GPIO_IRQ); - goto reg_free; - } - - /* configure touchscreen interrupt gpio */ - rc = gpio_request(ATMEL_TS_GPIO_IRQ, "atmel_maxtouch_gpio"); - if (rc) { - dev_err(dev, "%s: unable to request gpio %d\n", - __func__, ATMEL_TS_GPIO_IRQ); - goto ts_gpio_tlmm_unconfig; - } - - rc = gpio_direction_input(ATMEL_TS_GPIO_IRQ); - if (rc < 0) { - dev_err(dev, "%s: unable to set the direction of gpio %d\n", - __func__, ATMEL_TS_GPIO_IRQ); - goto free_ts_gpio; - } - return 0; - -free_ts_gpio: - gpio_free(ATMEL_TS_GPIO_IRQ); -ts_gpio_tlmm_unconfig: - gpio_tlmm_config(GPIO_CFG(ATMEL_TS_GPIO_IRQ, 0, - GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_DISABLE); -reg_free: - regulator_bulk_free(ARRAY_SIZE(regs_atmel), regs_atmel); -out: - return rc; -} - -static int atmel_ts_platform_exit(struct i2c_client *client) -{ - gpio_free(ATMEL_TS_GPIO_IRQ); - gpio_tlmm_config(GPIO_CFG(ATMEL_TS_GPIO_IRQ, 0, - GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_DISABLE); - regulator_bulk_free(ARRAY_SIZE(regs_atmel), regs_atmel); - return 0; -} - -static u8 atmel_ts_read_chg(void) -{ - return gpio_get_value(ATMEL_TS_GPIO_IRQ); -} - -static u8 atmel_ts_valid_interrupt(void) -{ - return !atmel_ts_read_chg(); -} - - -static struct maxtouch_platform_data atmel_ts_pdata = { - .numtouch = 4, - .init_platform_hw = atmel_ts_platform_init, - .exit_platform_hw = atmel_ts_platform_exit, - .power_on = atmel_ts_power_on, - .display_res_x = 480, - .display_res_y = 864, - .min_x = ATMEL_X_OFFSET, - .max_x = (505 - ATMEL_X_OFFSET), - .min_y = ATMEL_Y_OFFSET, - .max_y = (863 - ATMEL_Y_OFFSET), - .valid_interrupt = atmel_ts_valid_interrupt, - .read_chg = atmel_ts_read_chg, -}; - -static struct i2c_board_info atmel_ts_i2c_info[] __initdata = { - { - I2C_BOARD_INFO(ATMEL_TS_I2C_NAME, 0x4a), - .platform_data = &atmel_ts_pdata, - .irq = MSM_GPIO_TO_INT(ATMEL_TS_GPIO_IRQ), - }, -}; - -static struct msm_handset_platform_data hs_platform_data = { - .hs_name = "7k_handset", - .pwr_key_delay_ms = 500, /* 0 will disable end key */ -}; - -static struct platform_device hs_pdev = { - .name = "msm-handset", - .id = -1, - .dev = { - .platform_data = &hs_platform_data, - }, -}; - -#define FT5X06_IRQ_GPIO 48 -#define FT5X06_RESET_GPIO 26 - -#define FT5X16_IRQ_GPIO 122 - -static ssize_t -ft5x06_virtual_keys_register(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return snprintf(buf, 200, - __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":40:510:80:60" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":120:510:80:60" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":200:510:80:60" - ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":280:510:80:60" - "\n"); -} - -static ssize_t ft5x16_virtual_keys_register(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return snprintf(buf, 200, \ - __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":68:984:135:50" \ - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":203:984:135:50" \ - ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":338:984:135:50" \ - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":473:984:135:50" \ - "\n"); -} - -static struct kobj_attribute ft5x06_virtual_keys_attr = { - .attr = { - .name = "virtualkeys.ft5x06_ts", - .mode = S_IRUGO, - }, - .show = &ft5x06_virtual_keys_register, -}; - -static struct attribute *ft5x06_virtual_key_properties_attrs[] = { - &ft5x06_virtual_keys_attr.attr, - NULL, -}; - -static struct attribute_group ft5x06_virtual_key_properties_attr_group = { - .attrs = ft5x06_virtual_key_properties_attrs, -}; - -struct kobject *ft5x06_virtual_key_properties_kobj; - -static struct ft5x06_ts_platform_data ft5x06_platformdata = { - .x_max = 320, - .y_max = 480, - .reset_gpio = FT5X06_RESET_GPIO, - .irq_gpio = FT5X06_IRQ_GPIO, - .irqflags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT, -}; - -static struct i2c_board_info ft5x06_device_info[] __initdata = { - { - I2C_BOARD_INFO("ft5x06_ts", 0x38), - .platform_data = &ft5x06_platformdata, - .irq = MSM_GPIO_TO_INT(FT5X06_IRQ_GPIO), - }, -}; - -static void __init ft5x06_touchpad_setup(void) -{ - int rc; - int irq_gpio; - - if (machine_is_qrd_skud_prime()) { - irq_gpio = FT5X16_IRQ_GPIO; - - ft5x06_platformdata.x_max = 540; - ft5x06_platformdata.y_max = 960; - ft5x06_platformdata.irq_gpio = FT5X16_IRQ_GPIO; - - ft5x06_device_info[0].irq = MSM_GPIO_TO_INT(FT5X16_IRQ_GPIO); - - ft5x06_virtual_keys_attr.show = &ft5x16_virtual_keys_register; - } else { - irq_gpio = FT5X06_IRQ_GPIO; - } - - rc = gpio_tlmm_config(GPIO_CFG(irq_gpio, 0, - GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_8MA), GPIO_CFG_ENABLE); - if (rc) - pr_err("%s: gpio_tlmm_config for %d failed\n", - __func__, irq_gpio); - - rc = gpio_tlmm_config(GPIO_CFG(FT5X06_RESET_GPIO, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_8MA), GPIO_CFG_ENABLE); - if (rc) - pr_err("%s: gpio_tlmm_config for %d failed\n", - __func__, FT5X06_RESET_GPIO); - - ft5x06_virtual_key_properties_kobj = - kobject_create_and_add("board_properties", NULL); - - if (ft5x06_virtual_key_properties_kobj) - rc = sysfs_create_group(ft5x06_virtual_key_properties_kobj, - &ft5x06_virtual_key_properties_attr_group); - - if (!ft5x06_virtual_key_properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", __func__); - - i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - ft5x06_device_info, - ARRAY_SIZE(ft5x06_device_info)); -} - -/* SKU3/SKU7 keypad device information */ -#define KP_INDEX_SKU3(row, col) ((row)*ARRAY_SIZE(kp_col_gpios_sku3) + (col)) -static unsigned int kp_row_gpios_sku3[] = {31, 32}; -static unsigned int kp_col_gpios_sku3[] = {36, 37}; - -static const unsigned short keymap_sku3[] = { - [KP_INDEX_SKU3(0, 0)] = KEY_VOLUMEUP, - [KP_INDEX_SKU3(0, 1)] = KEY_VOLUMEDOWN, - [KP_INDEX_SKU3(1, 1)] = KEY_CAMERA, -}; - -static unsigned int kp_row_gpios_skud[] = {31, 32}; -static unsigned int kp_col_gpios_skud[] = {37}; - -static const unsigned short keymap_skud[] = { - [KP_INDEX_SKU3(0, 0)] = KEY_VOLUMEUP, - [KP_INDEX_SKU3(0, 1)] = KEY_VOLUMEDOWN, -}; - - -static struct gpio_event_matrix_info kp_matrix_info_sku3 = { - .info.func = gpio_event_matrix_func, - .keymap = keymap_sku3, - .output_gpios = kp_row_gpios_sku3, - .input_gpios = kp_col_gpios_sku3, - .noutputs = ARRAY_SIZE(kp_row_gpios_sku3), - .ninputs = ARRAY_SIZE(kp_col_gpios_sku3), - .settle_time.tv64 = 40 * NSEC_PER_USEC, - .poll_time.tv64 = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE | - GPIOKPF_PRINT_UNMAPPED_KEYS, -}; - -static struct gpio_event_info *kp_info_sku3[] = { - &kp_matrix_info_sku3.info, -}; -static struct gpio_event_platform_data kp_pdata_sku3 = { - .name = "7x27a_kp", - .info = kp_info_sku3, - .info_count = ARRAY_SIZE(kp_info_sku3) -}; - -static struct platform_device kp_pdev_sku3 = { - .name = GPIO_EVENT_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &kp_pdata_sku3, - }, -}; - -static struct led_info ctp_backlight_info = { - .name = "button-backlight", - .flags = PM_MPP__I_SINK__LEVEL_40mA << 16 | PM_MPP_7, -}; - -static struct led_platform_data ctp_backlight_pdata = { - .leds = &ctp_backlight_info, - .num_leds = 1, -}; - -static struct platform_device pmic_mpp_leds_pdev = { - .name = "pmic-mpp-leds", - .id = -1, - .dev = { - .platform_data = &ctp_backlight_pdata, - }, -}; - -static struct led_info tricolor_led_info[] = { - [0] = { - .name = "red", - .flags = LED_COLOR_RED, - }, - [1] = { - .name = "green", - .flags = LED_COLOR_GREEN, - }, -}; - -static struct led_platform_data tricolor_led_pdata = { - .leds = tricolor_led_info, - .num_leds = ARRAY_SIZE(tricolor_led_info), -}; - -static struct platform_device tricolor_leds_pdev = { - .name = "msm-tricolor-leds", - .id = -1, - .dev = { - .platform_data = &tricolor_led_pdata, - }, -}; - -void __init msm7627a_add_io_devices(void) -{ - /* touchscreen */ - if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { - atmel_ts_pdata.min_x = 0; - atmel_ts_pdata.max_x = 480; - atmel_ts_pdata.min_y = 0; - atmel_ts_pdata.max_y = 320; - } - - i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - atmel_ts_i2c_info, - ARRAY_SIZE(atmel_ts_i2c_info)); - /* keypad */ - platform_device_register(&kp_pdev); - - /* headset */ - platform_device_register(&hs_pdev); - - /* LED: configure it as a pdm function */ - if (gpio_tlmm_config(GPIO_CFG(LED_GPIO_PDM, 3, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_8MA), GPIO_CFG_ENABLE)) - pr_err("%s: gpio_tlmm_config for %d failed\n", - __func__, LED_GPIO_PDM); - else - platform_device_register(&led_pdev); - - /* Vibrator */ - if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() - || machine_is_msm8625_ffa()) - msm_init_pmic_vibrator(); -} - -void __init qrd7627a_add_io_devices(void) -{ - int rc; - - /* touchscreen */ - if (machine_is_msm7627a_qrd1()) { - i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - synaptic_i2c_clearpad3k, - ARRAY_SIZE(synaptic_i2c_clearpad3k)); - } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || - machine_is_msm8625_evt()) { - /* Use configuration data for EVT */ - if (machine_is_msm8625_evt()) { - mxt_config_array[0].config = mxt_config_data_evt; - mxt_config_array[0].config_length = - ARRAY_SIZE(mxt_config_data_evt); - mxt_platform_data.panel_maxy = 875; - mxt_platform_data.need_calibration = true; - mxt_vkey_setup(); - } - - rc = gpio_tlmm_config(GPIO_CFG(MXT_TS_IRQ_GPIO, 0, - GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_8MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config for %d failed\n", - __func__, MXT_TS_IRQ_GPIO); - } - - rc = gpio_tlmm_config(GPIO_CFG(MXT_TS_RESET_GPIO, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_8MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config for %d failed\n", - __func__, MXT_TS_RESET_GPIO); - } - - i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - mxt_device_info, - ARRAY_SIZE(mxt_device_info)); - } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - ft5x06_touchpad_setup(); - } - - /* headset and power key*/ - /* ignore end key as this target doesn't need it */ - hs_platform_data.ignore_end_key = true; - platform_device_register(&hs_pdev); - - /* vibrator */ -#ifdef CONFIG_MSM_RPC_VIBRATOR - msm_init_pmic_vibrator(); -#endif - - /* keypad */ - - if (machine_is_qrd_skud_prime()) { - kp_matrix_info_sku3.keymap = keymap_skud; - kp_matrix_info_sku3.output_gpios = kp_row_gpios_skud; - kp_matrix_info_sku3.input_gpios = kp_col_gpios_skud; - kp_matrix_info_sku3.noutputs = ARRAY_SIZE(kp_row_gpios_skud); - kp_matrix_info_sku3.ninputs = ARRAY_SIZE(kp_col_gpios_skud); - } - - if (machine_is_msm8625_evt()) - kp_matrix_info_8625.keymap = keymap_8625_evt; - - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || - machine_is_msm8625_evt()) - platform_device_register(&kp_pdev_8625); - else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) - platform_device_register(&kp_pdev_sku3); - - /* leds */ - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || - machine_is_msm8625_evt()) { - platform_device_register(&pmic_mpp_leds_pdev); - platform_device_register(&tricolor_leds_pdev); - } -} diff --git a/arch/arm/mach-msm/board-msm7627a-storage.c b/arch/arm/mach-msm/board-msm7627a-storage.c deleted file mode 100644 index 6aff9b654887..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-storage.c +++ /dev/null @@ -1,413 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "pm.h" -#include "board-msm7627a.h" - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)) - -#define MAX_SDCC_CONTROLLER 4 -static unsigned long vreg_sts, gpio_sts; - -struct sdcc_gpio { - struct msm_gpio *cfg_data; - uint32_t size; - struct msm_gpio *sleep_cfg_data; -}; - -/** - * Due to insufficient drive strengths for SDC GPIO lines some old versioned - * SD/MMC cards may cause data CRC errors. Hence, set optimal values - * for SDC slots based on timing closure and marginality. SDC1 slot - * require higher value since it should handle bad signal quality due - * to size of T-flash adapters. - */ -static struct msm_gpio sdc1_cfg_data[] = { - {GPIO_CFG(51, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA), - "sdc1_dat_3"}, - {GPIO_CFG(52, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA), - "sdc1_dat_2"}, - {GPIO_CFG(53, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA), - "sdc1_dat_1"}, - {GPIO_CFG(54, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA), - "sdc1_dat_0"}, - {GPIO_CFG(55, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA), - "sdc1_cmd"}, - {GPIO_CFG(56, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_14MA), - "sdc1_clk"}, -}; - -static struct msm_gpio sdc2_cfg_data[] = { - {GPIO_CFG(62, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "sdc2_clk"}, - {GPIO_CFG(63, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc2_cmd"}, - {GPIO_CFG(64, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc2_dat_3"}, - {GPIO_CFG(65, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc2_dat_2"}, - {GPIO_CFG(66, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc2_dat_1"}, - {GPIO_CFG(67, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc2_dat_0"}, -}; - -static struct msm_gpio sdc2_sleep_cfg_data[] = { - {GPIO_CFG(62, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc2_clk"}, - {GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - "sdc2_cmd"}, - {GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - "sdc2_dat_3"}, - {GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - "sdc2_dat_2"}, - {GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - "sdc2_dat_1"}, - {GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), - "sdc2_dat_0"}, -}; -static struct msm_gpio sdc3_cfg_data[] = { - {GPIO_CFG(88, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "sdc3_clk"}, - {GPIO_CFG(89, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_cmd"}, - {GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_3"}, - {GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_2"}, - {GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_1"}, - {GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_0"}, -#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT - {GPIO_CFG(19, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_7"}, - {GPIO_CFG(20, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_6"}, - {GPIO_CFG(21, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_5"}, - {GPIO_CFG(108, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc3_dat_4"}, -#endif -}; - -static struct msm_gpio sdc4_cfg_data[] = { - {GPIO_CFG(19, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc4_dat_3"}, - {GPIO_CFG(20, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc4_dat_2"}, - {GPIO_CFG(21, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc4_dat_1"}, - {GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc4_cmd"}, - {GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA), - "sdc4_dat_0"}, - {GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "sdc4_clk"}, -}; - -static struct sdcc_gpio sdcc_cfg_data[] = { - { - .cfg_data = sdc1_cfg_data, - .size = ARRAY_SIZE(sdc1_cfg_data), - }, - { - .cfg_data = sdc2_cfg_data, - .size = ARRAY_SIZE(sdc2_cfg_data), - .sleep_cfg_data = sdc2_sleep_cfg_data, - }, - { - .cfg_data = sdc3_cfg_data, - .size = ARRAY_SIZE(sdc3_cfg_data), - }, - { - .cfg_data = sdc4_cfg_data, - .size = ARRAY_SIZE(sdc4_cfg_data), - }, -}; - -static int gpio_sdc1_hw_det = 85; -static void gpio_sdc1_config(void) -{ - if (machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7()) - gpio_sdc1_hw_det = 42; -} - -static struct regulator *sdcc_vreg_data[MAX_SDCC_CONTROLLER]; -static int msm_sdcc_setup_gpio(int dev_id, unsigned int enable) -{ - int rc = 0; - struct sdcc_gpio *curr; - - curr = &sdcc_cfg_data[dev_id - 1]; - if (!(test_bit(dev_id, &gpio_sts)^enable)) - return rc; - - if (enable) { - set_bit(dev_id, &gpio_sts); - rc = msm_gpios_request_enable(curr->cfg_data, curr->size); - if (rc) - pr_err("%s: Failed to turn on GPIOs for slot %d\n", - __func__, dev_id); - } else { - clear_bit(dev_id, &gpio_sts); - if (curr->sleep_cfg_data) { - rc = msm_gpios_enable(curr->sleep_cfg_data, curr->size); - msm_gpios_free(curr->sleep_cfg_data, curr->size); - return rc; - } - msm_gpios_disable_free(curr->cfg_data, curr->size); - } - return rc; -} - -static int msm_sdcc_setup_vreg(int dev_id, unsigned int enable) -{ - int rc = 0; - struct regulator *curr = sdcc_vreg_data[dev_id - 1]; - - if (test_bit(dev_id, &vreg_sts) == enable) - return 0; - - if (!curr) - return -ENODEV; - - if (IS_ERR(curr)) - return PTR_ERR(curr); - - if (enable) { - set_bit(dev_id, &vreg_sts); - - rc = regulator_enable(curr); - if (rc) - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - } else { - clear_bit(dev_id, &vreg_sts); - - rc = regulator_disable(curr); - if (rc) - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - } - return rc; -} - -static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) -{ - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - - rc = msm_sdcc_setup_gpio(pdev->id, !!vdd); - if (rc) - goto out; - - rc = msm_sdcc_setup_vreg(pdev->id, !!vdd); -out: - return rc; -} - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static unsigned int msm7627a_sdcc_slot_status(struct device *dev) -{ - int status; - - status = gpio_tlmm_config(GPIO_CFG(gpio_sdc1_hw_det, 2, GPIO_CFG_INPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_8MA), - GPIO_CFG_ENABLE); - if (status) - pr_err("%s:Failed to configure tlmm for GPIO %d\n", __func__, - gpio_sdc1_hw_det); - - status = gpio_request(gpio_sdc1_hw_det, "SD_HW_Detect"); - if (status) { - pr_err("%s:Failed to request GPIO %d\n", __func__, - gpio_sdc1_hw_det); - } else { - status = gpio_direction_input(gpio_sdc1_hw_det); - if (!status) { - if (machine_is_msm7627a_qrd1() || - machine_is_msm7627a_evb() || - machine_is_msm8625_evb() || - machine_is_msm7627a_qrd3() || - machine_is_msm8625_qrd7()) - status = !gpio_get_value(gpio_sdc1_hw_det); - else - status = gpio_get_value(gpio_sdc1_hw_det); - } - gpio_free(gpio_sdc1_hw_det); - } - return status; -} - -static struct mmc_platform_data sdc1_plat_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .status = msm7627a_sdcc_slot_status, - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct mmc_platform_data sdc2_plat_data = { - /* - * SDC2 supports only 1.8V, claim for 2.85V range is just - * for allowing buggy cards who advertise 2.8V even though - * they can operate at 1.8V supply. - */ - .ocr_mask = MMC_VDD_28_29 | MMC_VDD_165_195, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sdiowakeup_irq = MSM_GPIO_TO_INT(66), - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, -#ifdef CONFIG_MMC_MSM_SDC2_DUMMY52_REQUIRED - .dummy52_required = 1, -#endif -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data sdc3_plat_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, -#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 1, -}; -#endif - -#if (defined(CONFIG_MMC_MSM_SDC4_SUPPORT)\ - && !defined(CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT)) -static struct mmc_platform_data sdc4_plat_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, -}; -#endif - -static int __init mmc_regulator_init(int sdcc_no, const char *supply, int uV) -{ - int rc; - - BUG_ON(sdcc_no < 1 || sdcc_no > 4); - - sdcc_no--; - - sdcc_vreg_data[sdcc_no] = regulator_get(NULL, supply); - - if (IS_ERR(sdcc_vreg_data[sdcc_no])) { - rc = PTR_ERR(sdcc_vreg_data[sdcc_no]); - pr_err("%s: could not get regulator \"%s\": %d\n", - __func__, supply, rc); - goto out; - } - - rc = regulator_set_voltage(sdcc_vreg_data[sdcc_no], uV, uV); - - if (rc) { - pr_err("%s: could not set voltage for \"%s\" to %d uV: %d\n", - __func__, supply, uV, rc); - goto reg_free; - } - - return rc; - -reg_free: - regulator_put(sdcc_vreg_data[sdcc_no]); -out: - sdcc_vreg_data[sdcc_no] = NULL; - return rc; -} - -void __init msm7627a_init_mmc(void) -{ - /* eMMC slot */ -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - - /* There is no eMMC on SDC3 for QRD3 based devices */ - if (!(machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7())) { - if (mmc_regulator_init(3, "emmc", 3000000)) - return; - /* - * On 7x25A FFA data CRC errors are seen, which are - * probably due to the proximity of SIM card and eMMC. - * Hence, reducing the clock to 24.7Mhz from 49Mhz. - */ - if (machine_is_msm7625a_ffa()) - sdc3_plat_data.msmsdcc_fmax = - sdc3_plat_data.msmsdcc_fmid; - msm_add_sdcc(3, &sdc3_plat_data); - } -#endif - /* Micro-SD slot */ -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - gpio_sdc1_config(); - if (mmc_regulator_init(1, "mmc", 2850000)) - return; - /* 8x25 EVT do not use hw detector */ - if (!((machine_is_msm8625_evt() || machine_is_qrd_skud_prime()))) - sdc1_plat_data.status_irq = MSM_GPIO_TO_INT(gpio_sdc1_hw_det); - if (machine_is_msm8625_evt() || machine_is_qrd_skud_prime()) - sdc1_plat_data.status = NULL; - - msm_add_sdcc(1, &sdc1_plat_data); -#endif - /* SDIO WLAN slot */ -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - if (mmc_regulator_init(2, "smps3", 1800000)) - return; - msm_add_sdcc(2, &sdc2_plat_data); -#endif - /* Not Used */ -#if (defined(CONFIG_MMC_MSM_SDC4_SUPPORT)\ - && !defined(CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT)) - /* There is no SDC4 for QRD3/7 based devices */ - if (!(machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7())) { - if (mmc_regulator_init(4, "smps3", 1800000)) - return; - msm_add_sdcc(4, &sdc4_plat_data); - } -#endif -} -#endif diff --git a/arch/arm/mach-msm/board-msm7627a-wlan.c b/arch/arm/mach-msm/board-msm7627a-wlan.c deleted file mode 100644 index a84b43b1027d..000000000000 --- a/arch/arm/mach-msm/board-msm7627a-wlan.c +++ /dev/null @@ -1,406 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "board-msm7627a.h" -#include "devices-msm7x2xa.h" -#include "timer.h" - -#define GPIO_WLAN_3V3_EN 119 -static const char *id = "WLAN"; -static bool wlan_powered_up; - -enum { - WLAN_VREG_S3 = 0, - WLAN_VREG_L17, - WLAN_VREG_L19 -}; - -struct wlan_vreg_info { - const char *vreg_id; - unsigned int level_min; - unsigned int level_max; - unsigned int pmapp_id; - unsigned int is_vreg_pin_controlled; - struct regulator *reg; -}; - -static struct wlan_vreg_info vreg_info[] = { - {"msme1", 1800000, 1800000, 2, 0, NULL}, - {"bt", 3300000, 3300000, 21, 1, NULL}, - {"wlan4", 1800000, 1800000, 23, 1, NULL} -}; - -int gpio_wlan_sys_rest_en = 134; -static void gpio_wlan_config(void) -{ - if (machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) - gpio_wlan_sys_rest_en = 124; -} - -static unsigned int qrf6285_init_regs(void) -{ - struct regulator_bulk_data regs[ARRAY_SIZE(vreg_info)]; - int i = 0, rc = 0; - - for (i = 0; i < ARRAY_SIZE(regs); i++) { - regs[i].supply = vreg_info[i].vreg_id; - regs[i].min_uV = vreg_info[i].level_min; - regs[i].max_uV = vreg_info[i].level_max; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs), regs); - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - for (i = 0; i < ARRAY_SIZE(regs); i++) - vreg_info[i].reg = regs[i].consumer; - -out: - return rc; -} - -static unsigned int setup_wlan_gpio(bool on) -{ - int rc = 0; - - if (on) { - rc = gpio_direction_output(gpio_wlan_sys_rest_en, 1); - msleep(100); - } else { - gpio_set_value_cansleep(gpio_wlan_sys_rest_en, 0); - rc = gpio_direction_input(gpio_wlan_sys_rest_en); - msleep(100); - } - - if (rc) - pr_err("%s: WLAN sys_reset_en GPIO: Error", __func__); - - return rc; -} - -static unsigned int setup_wlan_clock(bool on) -{ - int rc = 0; - - if (on) { - /* Vote for A0 clock */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, - PMAPP_CLOCK_VOTE_ON); - } else { - /* Vote against A0 clock */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, - PMAPP_CLOCK_VOTE_OFF); - } - - if (rc) - pr_err("%s: Configuring A0 clock for WLAN: Error", __func__); - - return rc; -} - -static unsigned int wlan_switch_regulators(int on) -{ - int rc = 0, index = 0; - - if (machine_is_msm7627a_qrd1()) - index = 2; - - for ( ; index < ARRAY_SIZE(vreg_info); index++) { - if (on) { - rc = regulator_set_voltage(vreg_info[index].reg, - vreg_info[index].level_min, - vreg_info[index].level_max); - if (rc) { - pr_err("%s:%s set voltage failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - goto reg_disable; - } - - rc = regulator_enable(vreg_info[index].reg); - if (rc) { - pr_err("%s:%s vreg enable failed %d\n", - __func__, vreg_info[index].vreg_id, rc); - goto reg_disable; - } - - if (vreg_info[index].is_vreg_pin_controlled) { - rc = pmapp_vreg_lpm_pincntrl_vote(id, - vreg_info[index].pmapp_id, - PMAPP_CLOCK_ID_A0, 1); - if (rc) { - pr_err("%s:%s pincntrl failed %d\n", - __func__, - vreg_info[index].vreg_id, rc); - goto pin_cnt_fail; - } - } - } else { - if (vreg_info[index].is_vreg_pin_controlled) { - rc = pmapp_vreg_lpm_pincntrl_vote(id, - vreg_info[index].pmapp_id, - PMAPP_CLOCK_ID_A0, 0); - if (rc) { - pr_err("%s:%s pincntrl failed %d\n", - __func__, - vreg_info[index].vreg_id, rc); - goto pin_cnt_fail; - } - } - - rc = regulator_disable(vreg_info[index].reg); - if (rc) { - pr_err("%s:%s vreg disable failed %d\n", - __func__, - vreg_info[index].vreg_id, rc); - goto reg_disable; - } - } - } - return 0; -pin_cnt_fail: - if (on) - regulator_disable(vreg_info[index].reg); -reg_disable: - if (!machine_is_msm7627a_qrd1()) { - while (index) { - if (on) { - index--; - regulator_disable(vreg_info[index].reg); - regulator_put(vreg_info[index].reg); - } - } - } - return rc; -} - -static unsigned int msm_AR600X_setup_power(bool on) -{ - int rc = 0; - static bool init_done; - - if (wlan_powered_up) { - pr_info("WLAN already powered up\n"); - return 0; - } - - if (unlikely(!init_done)) { - gpio_wlan_config(); - rc = qrf6285_init_regs(); - if (rc) { - pr_err("%s: qrf6285 init failed = %d\n", __func__, rc); - return rc; - } else { - init_done = true; - } - } - - rc = wlan_switch_regulators(on); - if (rc) { - pr_err("%s: wlan_switch_regulators error = %d\n", __func__, rc); - goto out; - } - - /* GPIO_WLAN_3V3_EN is only required for the QRD7627a */ - if (machine_is_msm7627a_qrd1()) { - rc = gpio_tlmm_config(GPIO_CFG(GPIO_WLAN_3V3_EN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s gpio_tlmm_config 119 failed,error = %d\n", - __func__, rc); - goto reg_disable; - } - gpio_set_value(GPIO_WLAN_3V3_EN, 1); - } - - /* - * gpio_wlan_sys_rest_en is not from the GPIO expander for QRD7627a, - * EVB1.0 and QRD8625,so the below step is required for those devices. - */ - if (machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - rc = gpio_tlmm_config(GPIO_CFG(gpio_wlan_sys_rest_en, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s gpio_tlmm_config 119 failed,error = %d\n", - __func__, rc); - goto qrd_gpio_fail; - } - gpio_set_value(gpio_wlan_sys_rest_en, 1); - } else { - rc = gpio_request(gpio_wlan_sys_rest_en, "WLAN_DEEP_SLEEP_N"); - if (rc) { - pr_err("%s: WLAN sys_rest_en GPIO %d request failed %d\n", - __func__, - gpio_wlan_sys_rest_en, rc); - goto qrd_gpio_fail; - } - rc = setup_wlan_gpio(on); - if (rc) { - pr_err("%s: wlan_set_gpio = %d\n", __func__, rc); - goto gpio_fail; - } - } - - /* Enable the A0 clock */ - rc = setup_wlan_clock(on); - if (rc) { - pr_err("%s: setup_wlan_clock = %d\n", __func__, rc); - goto set_gpio_fail; - } - - /* Configure A0 clock to be slave to WLAN_CLK_PWR_REQ */ - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A0, - PMAPP_CLOCK_VOTE_PIN_CTRL); - if (rc) { - pr_err("%s: Configuring A0 to Pin controllable failed %d\n", - __func__, rc); - goto set_clock_fail; - } - - pr_info("WLAN power-up success\n"); - wlan_powered_up = true; - return 0; -set_clock_fail: - setup_wlan_clock(0); -set_gpio_fail: - setup_wlan_gpio(0); -gpio_fail: - if (!(machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() || - machine_is_msm8625_evb() || machine_is_msm8625_evt() || - machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7())) - gpio_free(gpio_wlan_sys_rest_en); -qrd_gpio_fail: - /* GPIO_WLAN_3V3_EN is only required for the QRD7627a */ - if (machine_is_msm7627a_qrd1()) - gpio_free(GPIO_WLAN_3V3_EN); -reg_disable: - wlan_switch_regulators(0); -out: - pr_info("WLAN power-up failed\n"); - wlan_powered_up = false; - return rc; -} - -static unsigned int msm_AR600X_shutdown_power(bool on) -{ - int rc = 0; - - if (!wlan_powered_up) { - pr_info("WLAN is not powered up, returning success\n"); - return 0; - } - - /* Disable the A0 clock */ - rc = setup_wlan_clock(on); - if (rc) { - pr_err("%s: setup_wlan_clock = %d\n", __func__, rc); - goto set_clock_fail; - } - - /* - * gpio_wlan_sys_rest_en is not from the GPIO expander for QRD7627a, - * EVB1.0 and QRD8625,so the below step is required for those devices. - */ - if (machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() - || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_msm7627a_qrd3() - || machine_is_msm8625_qrd7() - || machine_is_qrd_skud_prime()) { - rc = gpio_tlmm_config(GPIO_CFG(gpio_wlan_sys_rest_en, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s gpio_tlmm_config 119 failed,error = %d\n", - __func__, rc); - goto gpio_fail; - } - gpio_set_value(gpio_wlan_sys_rest_en, 0); - } else { - rc = setup_wlan_gpio(on); - if (rc) { - pr_err("%s: setup_wlan_gpio = %d\n", __func__, rc); - goto set_gpio_fail; - } - gpio_free(gpio_wlan_sys_rest_en); - } - - /* GPIO_WLAN_3V3_EN is only required for the QRD7627a */ - if (machine_is_msm7627a_qrd1()) { - rc = gpio_tlmm_config(GPIO_CFG(GPIO_WLAN_3V3_EN, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s gpio_tlmm_config 119 failed,error = %d\n", - __func__, rc); - goto qrd_gpio_fail; - } - gpio_set_value(GPIO_WLAN_3V3_EN, 0); - } - - rc = wlan_switch_regulators(on); - if (rc) { - pr_err("%s: wlan_switch_regulators error = %d\n", - __func__, rc); - goto reg_disable; - } - wlan_powered_up = false; - pr_info("WLAN power-down success\n"); - return 0; -set_clock_fail: - setup_wlan_clock(0); -set_gpio_fail: - setup_wlan_gpio(0); -gpio_fail: - if (!(machine_is_msm7627a_qrd1() || machine_is_msm7627a_evb() || - machine_is_msm8625_evb() || machine_is_msm8625_evt() || - machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7())) - gpio_free(gpio_wlan_sys_rest_en); -qrd_gpio_fail: - /* GPIO_WLAN_3V3_EN is only required for the QRD7627a */ - if (machine_is_msm7627a_qrd1()) - gpio_free(GPIO_WLAN_3V3_EN); -reg_disable: - wlan_switch_regulators(0); - pr_info("WLAN power-down failed\n"); - return rc; -} - -int ar600x_wlan_power(bool on) -{ - if (on) - msm_AR600X_setup_power(on); - else - msm_AR600X_shutdown_power(on); - - return 0; -} diff --git a/arch/arm/mach-msm/board-msm7627a.h b/arch/arm/mach-msm/board-msm7627a.h deleted file mode 100644 index 37d8031d9a1a..000000000000 --- a/arch/arm/mach-msm/board-msm7627a.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __ARCH_ARM_MACH_MSM_BOARD_7627A__ -#define __ARCH_ARM_MACH_MSM_BOARD_7627A__ - -#include "pm.h" -void __init msm7627a_init_mmc(void); - -void __init msm_msm7627a_allocate_memory_regions(void); -void __init msm_fb_add_devices(void); - -enum { - GPIO_EXPANDER_IRQ_BASE = NR_MSM_IRQS + NR_GPIO_IRQS, - GPIO_EXPANDER_GPIO_BASE = NR_MSM_GPIOS, - /* SURF expander */ - GPIO_CORE_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE, - GPIO_BT_SYS_REST_EN = GPIO_CORE_EXPANDER_BASE, - GPIO_WLAN_EXT_POR_N, - GPIO_DISPLAY_PWR_EN, - GPIO_BACKLIGHT_EN, - GPIO_PRESSURE_XCLR, - GPIO_VREG_S3_EXP, - GPIO_UBM2M_PWRDWN, - GPIO_ETM_MODE_CS_N, - GPIO_HOST_VBUS_EN, - GPIO_SPI_MOSI, - GPIO_SPI_MISO, - GPIO_SPI_CLK, - GPIO_SPI_CS0_N, - GPIO_CORE_EXPANDER_IO13, - GPIO_CORE_EXPANDER_IO14, - GPIO_CORE_EXPANDER_IO15, - /* Camera expander */ - GPIO_CAM_EXPANDER_BASE = GPIO_CORE_EXPANDER_BASE + 16, - GPIO_CAM_GP_STROBE_READY = GPIO_CAM_EXPANDER_BASE, - GPIO_CAM_GP_AFBUSY, - GPIO_CAM_GP_CAM_PWDN, - GPIO_CAM_GP_CAM1MP_XCLR, - GPIO_CAM_GP_CAMIF_RESET_N, - GPIO_CAM_GP_STROBE_CE, - GPIO_CAM_GP_LED_EN1, - GPIO_CAM_GP_LED_EN2, -}; - -enum { - QRD_GPIO_HOST_VBUS_EN = 107, - QRD_GPIO_BT_SYS_REST_EN = 114, - QRD_GPIO_WAKE_ON_WIRELESS, - QRD_GPIO_BACKLIGHT_EN, - QRD_GPIO_NC, - QRD_GPIO_CAM_3MP_PWDN, /* CAM_VGA */ - QRD_GPIO_WLAN_EN, - QRD_GPIO_CAM_5MP_SHDN_EN, - QRD_GPIO_CAM_5MP_RESET, - QRD_GPIO_TP, - QRD_GPIO_CAM_GP_CAMIF_RESET, -}; - -#define ADSP_RPC_PROG 0x3000000a -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - -#define FPGA_MSM_CNTRL_REG2 0x90008010 -#define BAHAMA_SLAVE_ID_FM_REG 0x02 -#define BAHAMA_SLAVE_ID_FM_ADDR 0x2A -#define BAHAMA_SLAVE_ID_QMEMBIST_ADDR 0x7B -#define FM_GPIO 83 -#define BT_PCM_BCLK_MODE 0x88 -#define BT_PCM_DIN_MODE 0x89 -#define BT_PCM_DOUT_MODE 0x8A -#define BT_PCM_SYNC_MODE 0x8B -#define FM_I2S_SD_MODE 0x8E -#define FM_I2S_WS_MODE 0x8F -#define FM_I2S_SCK_MODE 0x90 -#define I2C_PIN_CTL 0x15 -#define I2C_NORMAL 0x40 - -struct bahama_config_register { - u8 reg; - u8 value; - u8 mask; -}; - -struct bt_vreg_info { - const char *name; - unsigned int pmapp_id; - unsigned int min_level; - unsigned int max_level; - unsigned int is_pin_controlled; - struct regulator *reg; -}; - -void __init msm7627a_bt_power_init(void); -#endif - -extern struct platform_device msm_device_snd; -extern struct platform_device msm_device_adspdec; -extern struct platform_device msm_device_cad; - -void __init msm7627a_camera_init(void); -int lcd_camera_power_onoff(int on); - -void __init msm7627a_add_io_devices(void); -void __init qrd7627a_add_io_devices(void); -#endif diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c deleted file mode 100644 index cca38b0f293a..000000000000 --- a/arch/arm/mach-msm/board-msm7x27.c +++ /dev/null @@ -1,2027 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_CACHE_L2X0 -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#ifdef CONFIG_USB_G_ANDROID -#include -#include -#endif - -#include "board-msm7627-regulator.h" -#include "devices.h" -#include "clock.h" -#include "msm-keypad-devices.h" -#include "pm.h" -#include "pm-boot.h" - -#ifdef CONFIG_ARCH_MSM7X25 -#define MSM_PMEM_MDP_SIZE 0xb21000 -#define MSM_PMEM_ADSP_SIZE 0x97b000 -#define MSM_PMEM_AUDIO_SIZE 0x121000 -#define MSM_FB_SIZE 0x200000 -#define PMEM_KERNEL_EBI1_SIZE 0x64000 -#endif - -#ifdef CONFIG_ARCH_MSM7X27 -#define MSM_PMEM_MDP_SIZE 0x1B76000 -#define MSM_PMEM_ADSP_SIZE 0xC8A000 -#define MSM_PMEM_AUDIO_SIZE 0x5B000 - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_SIZE 0x233000 -#else -#define MSM_FB_SIZE 0x177000 -#endif - -#define PMEM_KERNEL_EBI1_SIZE 0x1C000 -#endif -#define ADSP_RPC_PROG 0x3000000a - -static struct resource smc91x_resources[] = { - [0] = { - .start = 0x9C004300, - .end = 0x9C0043ff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MSM_GPIO_TO_INT(132), - .end = MSM_GPIO_TO_INT(132), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device smc91x_device = { - .name = "smc91x", - .id = 0, - .num_resources = ARRAY_SIZE(smc91x_resources), - .resource = smc91x_resources, -}; - -#ifdef CONFIG_USB_G_ANDROID -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; -#endif - -#ifdef CONFIG_USB_EHCI_MSM_72K -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - if (on) - msm_hsusb_vbus_powerup(); - else - msm_hsusb_vbus_shutdown(); -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_65NM), -}; - -static void __init msm7x2x_init_host(void) -{ - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) - return; - - msm_add_host(0, &msm_usb_host_pdata); -} -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static int hsusb_rpc_connect(int connect) -{ - if (connect) - return msm_hsusb_rpc_connect(); - else - return msm_hsusb_rpc_close(); -} -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static int msm_hsusb_ldo_init(int init) -{ - static struct regulator *reg_hsusb; - int rc; - if (init) { - reg_hsusb = regulator_get(NULL, "usb"); - if (IS_ERR(reg_hsusb)) { - rc = PTR_ERR(reg_hsusb); - pr_err("%s: could not get regulator: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_set_voltage(reg_hsusb, 3300000, 3300000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", - __func__, rc); - goto usb_reg_fail; - } - - rc = regulator_enable(reg_hsusb); - if (rc < 0) { - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - goto usb_reg_fail; - } - - /* - * PHY 3.3V analog domain(VDDA33) is powered up by - * an always enabled power supply (LP5900TL-3.3). - * USB VREG default source is VBUS line. Turning - * on USB VREG has a side effect on the USB suspend - * current. Hence USB VREG is explicitly turned - * off here. - */ - - rc = regulator_disable(reg_hsusb); - if (rc < 0) { - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - goto usb_reg_fail; - } - - regulator_put(reg_hsusb); - } - - return 0; -usb_reg_fail: - regulator_put(reg_hsusb); -out: - return rc; -} - -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) -{ - int ret; - - if (init) { - ret = msm_pm_app_rpc_init(callback); - } else { - msm_pm_app_rpc_deinit(callback); - ret = 0; - } - return ret; -} - -static int msm_otg_rpc_phy_reset(void __iomem *regs) -{ - return msm_hsusb_phy_reset(); -} - -static struct msm_otg_platform_data msm_otg_pdata = { - .rpc_connect = hsusb_rpc_connect, - .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init, - .chg_vbus_draw = hsusb_chg_vbus_draw, - .chg_connected = hsusb_chg_connected, - .chg_init = hsusb_chg_init, -#ifdef CONFIG_USB_EHCI_MSM_72K - .vbus_power = msm_hsusb_vbus_power, -#endif - .ldo_init = msm_hsusb_ldo_init, - .pclk_required_during_lpm = 1, -}; - -#ifdef CONFIG_USB_GADGET -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata; -#endif -#endif - -#define SND(desc, num) { .name = #desc, .id = num } -static struct snd_endpoint snd_endpoints_list[] = { - SND(HANDSET, 0), - SND(MONO_HEADSET, 2), - SND(HEADSET, 3), - SND(SPEAKER, 6), - SND(TTY_HEADSET, 8), - SND(TTY_VCO, 9), - SND(TTY_HCO, 10), - SND(BT, 12), - SND(IN_S_SADC_OUT_HANDSET, 16), - SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25), - SND(CURRENT, 27), -}; -#undef SND - -static struct msm_snd_endpoints msm_device_snd_endpoints = { - .endpoints = snd_endpoints_list, - .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint) -}; - -static struct platform_device msm_device_snd = { - .name = "msm_snd", - .id = -1, - .dev = { - .platform_data = &msm_device_snd_endpoints - }, -}; - -#define DEC0_FORMAT ((1< 0; i--) - regulator_put(vreg[i - 1]); - return rc; - -vreg_lcdc_fail: - if (on) { - for (; i > 0; i--) - regulator_disable(vreg[i - 1]); - } else { - for (; i > 0; i--) - regulator_enable(vreg[i - 1]); - } - - return rc; -} - -static struct lcdc_platform_data lcdc_pdata = { - .lcdc_gpio_config = msm_fb_lcdc_config, - .lcdc_power_save = msm_fb_lcdc_power_save, -}; - -static struct msm_panel_common_pdata lcdc_gordon_panel_data = { - .panel_config_gpio = lcdc_gordon_config_gpios, - .gpio_num = gpio_array_num, -}; - -static struct platform_device lcdc_gordon_panel_device = { - .name = "lcdc_gordon_vga", - .id = 0, - .dev = { - .platform_data = &lcdc_gordon_panel_data, - } -}; - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -static int msm_fb_detect_panel(const char *name) -{ - int ret = -EPERM; - - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) { - if (!strcmp(name, "lcdc_gordon_vga")) - ret = 0; - else - ret = -ENODEV; - } - - return ret; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, - .mddi_prescan = 1, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev = { - .platform_data = &msm_fb_pdata, - } -}; - -#ifdef CONFIG_BT -static struct platform_device msm_bt_power_device = { - .name = "bt_power", -}; - -enum { - BT_WAKE, - BT_RFR, - BT_CTS, - BT_RX, - BT_TX, - BT_PCM_DOUT, - BT_PCM_DIN, - BT_PCM_SYNC, - BT_PCM_CLK, - BT_HOST_WAKE, -}; - -static unsigned bt_config_power_on[] = { - GPIO_CFG(42, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* WAKE */ - GPIO_CFG(43, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* RFR */ - GPIO_CFG(44, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* CTS */ - GPIO_CFG(45, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* Rx */ - GPIO_CFG(46, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* Tx */ - GPIO_CFG(68, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DOUT */ - GPIO_CFG(69, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DIN */ - GPIO_CFG(70, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_SYNC */ - GPIO_CFG(71, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_CLK */ - GPIO_CFG(83, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* HOST_WAKE */ -}; -static unsigned bt_config_power_off[] = { - GPIO_CFG(42, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* WAKE */ - GPIO_CFG(43, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* RFR */ - GPIO_CFG(44, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* CTS */ - GPIO_CFG(45, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* Rx */ - GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* Tx */ - GPIO_CFG(68, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCM_DOUT */ - GPIO_CFG(69, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCM_DIN */ - GPIO_CFG(70, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCM_SYNC */ - GPIO_CFG(71, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCM_CLK */ - GPIO_CFG(83, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HOST_WAKE */ -}; - -static int bluetooth_power(int on) -{ - int pin, rc; - static struct regulator *vreg_bt; - - printk(KERN_DEBUG "%s\n", __func__); - - /* do not have vreg bt defined, gp6 is the same */ - /* vreg_get parameter 1 (struct device *) is ignored */ - - if (on) { - for (pin = 0; pin < ARRAY_SIZE(bt_config_power_on); pin++) { - rc = gpio_tlmm_config(bt_config_power_on[pin], - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, bt_config_power_on[pin], rc); - return -EIO; - } - } - vreg_bt = regulator_get(NULL, "gp6"); - - if (IS_ERR(vreg_bt)) { - rc = PTR_ERR(vreg_bt); - pr_err("%s: could get not regulator: %d\n", - __func__, rc); - goto out; - } - - /* units of mV, steps of 50 mV */ - rc = regulator_set_voltage(vreg_bt, 2600000, 2600000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", __func__, rc); - goto bt_vreg_fail; - } - rc = regulator_enable(vreg_bt); - if (rc < 0) { - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - goto bt_vreg_fail; - } - } else { - rc = regulator_disable(vreg_bt); - if (rc < 0) { - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - goto bt_vreg_fail; - } - regulator_put(vreg_bt); - for (pin = 0; pin < ARRAY_SIZE(bt_config_power_off); pin++) { - rc = gpio_tlmm_config(bt_config_power_off[pin], - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, bt_config_power_off[pin], rc); - return -EIO; - } - } - } - return 0; - -bt_vreg_fail: - regulator_put(vreg_bt); -out: - return rc; -} - -static void __init bt_power_init(void) -{ - msm_bt_power_device.dev.platform_data = &bluetooth_power; -} -#else -#define bt_power_init(x) do {} while (0) -#endif - -static struct platform_device msm_device_pmic_leds = { - .name = "pmic-leds", - .id = -1, -}; - -static struct resource bluesleep_resources[] = { - { - .name = "gpio_host_wake", - .start = 83, - .end = 83, - .flags = IORESOURCE_IO, - }, - { - .name = "gpio_ext_wake", - .start = 42, - .end = 42, - .flags = IORESOURCE_IO, - }, - { - .name = "host_wake", - .start = MSM_GPIO_TO_INT(83), - .end = MSM_GPIO_TO_INT(83), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_bluesleep_device = { - .name = "bluesleep", - .id = -1, - .num_resources = ARRAY_SIZE(bluesleep_resources), - .resource = bluesleep_resources, -}; - -static struct i2c_board_info i2c_devices[] = { -#ifdef CONFIG_MT9D112 - { - I2C_BOARD_INFO("mt9d112", 0x78 >> 1), - }, -#endif -#ifdef CONFIG_S5K3E2FX - { - I2C_BOARD_INFO("s5k3e2fx", 0x20 >> 1), - }, -#endif -#ifdef CONFIG_MT9P012 - { - I2C_BOARD_INFO("mt9p012", 0x6C >> 1), - }, -#endif -#ifdef CONFIG_MT9P012_KM - { - I2C_BOARD_INFO("mt9p012_km", 0x6C >> 2), - }, -#endif -#if defined(CONFIG_MT9T013) || defined(CONFIG_SENSORS_MT9T013) - { - I2C_BOARD_INFO("mt9t013", 0x6C), - }, -#endif -#ifdef CONFIG_VB6801 - { - I2C_BOARD_INFO("vb6801", 0x20), - }, -#endif -}; - -#ifdef CONFIG_MSM_CAMERA -static uint32_t camera_off_gpio_table[] = { - /* parallel CAMERA interfaces */ - GPIO_CFG(0, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */ - GPIO_CFG(1, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */ - GPIO_CFG(2, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */ - GPIO_CFG(3, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */ - GPIO_CFG(4, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */ - GPIO_CFG(5, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */ - GPIO_CFG(6, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */ - GPIO_CFG(7, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */ - GPIO_CFG(8, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT8 */ - GPIO_CFG(9, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT9 */ - GPIO_CFG(10, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT10 */ - GPIO_CFG(11, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT11 */ - GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCLK */ - GPIO_CFG(13, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */ - GPIO_CFG(14, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */ - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* MCLK */ -}; - -static uint32_t camera_on_gpio_table[] = { - /* parallel CAMERA interfaces */ - GPIO_CFG(0, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */ - GPIO_CFG(1, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */ - GPIO_CFG(2, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */ - GPIO_CFG(3, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */ - GPIO_CFG(4, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */ - GPIO_CFG(5, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */ - GPIO_CFG(6, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */ - GPIO_CFG(7, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */ - GPIO_CFG(8, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT8 */ - GPIO_CFG(9, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT9 */ - GPIO_CFG(10, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT10 */ - GPIO_CFG(11, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT11 */ - GPIO_CFG(12, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* PCLK */ - GPIO_CFG(13, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */ - GPIO_CFG(14, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */ - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* MCLK */ - }; - -static void config_gpio_table(uint32_t *table, int len) -{ - int n, rc; - for (n = 0; n < len; n++) { - rc = gpio_tlmm_config(table[n], GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, table[n], rc); - break; - } - } -} - -static void msm_camera_vreg_config(int vreg_en) -{ - int rc; - static struct regulator *vreg_gp2; - static struct regulator *vreg_gp3; - - if (vreg_gp2 == NULL && vreg_gp3 == NULL) { - vreg_gp2 = regulator_get(NULL, "gp2"); - if (IS_ERR(vreg_gp2)) { - rc = PTR_ERR(vreg_gp2); - pr_err("%s: could not get regulator: %d\n", - __func__, rc); - return; - } - - rc = regulator_set_voltage(vreg_gp2, 1800000, 1800000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", - __func__, rc); - goto cam_vreg_fail; - } - - vreg_gp3 = regulator_get(NULL, "gp3"); - if (IS_ERR(vreg_gp3)) { - rc = PTR_ERR(vreg_gp3); - pr_err("%s: could not get regulator: %d\n", - __func__, rc); - goto cam_vreg_fail; - } - - rc = regulator_set_voltage(vreg_gp3, 2850000, 2850000); - if (rc < 0) { - pr_err("%s: could not set voltage: %d\n", __func__, rc); - goto cam_vreg2_fail; - } - - return; - - } - - if (vreg_gp2 == NULL || vreg_gp3 == NULL) { - pr_err("Camera Regulators are not initialized\n"); - return; - } - - if (vreg_en) { - rc = regulator_enable(vreg_gp2); - if (rc) { - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - goto cam_vreg2_fail; - } - - rc = regulator_enable(vreg_gp3); - if (rc) { - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - goto vreg_gp3_fail; - } - } else { - rc = regulator_disable(vreg_gp2); - if (rc) { - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - return; - } - - rc = regulator_disable(vreg_gp3); - if (rc) { - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - goto cam_vreg2_fail; - } - } - - return; - -vreg_gp3_fail: - if (vreg_en) - regulator_disable(vreg_gp2); - -cam_vreg2_fail: - regulator_put(vreg_gp3); -cam_vreg_fail: - regulator_put(vreg_gp2); - vreg_gp3 = NULL; - vreg_gp2 = NULL; -} - -static int config_camera_on_gpios(void) -{ - int vreg_en = 1; - - if (machine_is_msm7x25_ffa() || - machine_is_msm7x27_ffa()) - msm_camera_vreg_config(vreg_en); - - config_gpio_table(camera_on_gpio_table, - ARRAY_SIZE(camera_on_gpio_table)); - return 0; -} - -static void config_camera_off_gpios(void) -{ - int vreg_en = 0; - - if (machine_is_msm7x25_ffa() || - machine_is_msm7x27_ffa()) - msm_camera_vreg_config(vreg_en); - - config_gpio_table(camera_off_gpio_table, - ARRAY_SIZE(camera_off_gpio_table)); -} - -static struct msm_camera_device_platform_data msm_camera_device_data = { - .camera_gpio_on = config_camera_on_gpios, - .camera_gpio_off = config_camera_off_gpios, - .ioext.mdcphy = MSM7XXX_MDC_PHYS, - .ioext.mdcsz = MSM7XXX_MDC_SIZE, - .ioext.appphy = MSM7XXX_CLK_CTL_PHYS, - .ioext.appsz = MSM7XXX_CLK_CTL_SIZE, -}; - -int pmic_set_flash_led_current(enum pmic8058_leds id, unsigned mA) -{ - int rc; - rc = pmic_flash_led_set_current(mA); - return rc; -} - -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_PMIC, - ._fsrc.pmic_src.num_of_src = 1, - ._fsrc.pmic_src.low_current = 30, - ._fsrc.pmic_src.high_current = 100, - ._fsrc.pmic_src.led_src_1 = 0, - ._fsrc.pmic_src.led_src_2 = 0, - ._fsrc.pmic_src.pmic_set_current = pmic_set_flash_led_current, -}; - -#ifdef CONFIG_MT9D112 -static struct msm_camera_sensor_flash_data flash_mt9d112 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = { - .sensor_name = "mt9d112", - .sensor_reset = 89, - .sensor_pwd = 85, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_mt9d112 -}; - -static struct platform_device msm_camera_sensor_mt9d112 = { - .name = "msm_camera_mt9d112", - .dev = { - .platform_data = &msm_camera_sensor_mt9d112_data, - }, -}; -#endif - -#ifdef CONFIG_S5K3E2FX -static struct msm_camera_sensor_flash_data flash_s5k3e2fx = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3e2fx_data = { - .sensor_name = "s5k3e2fx", - .sensor_reset = 89, - .sensor_pwd = 85, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_s5k3e2fx -}; - -static struct platform_device msm_camera_sensor_s5k3e2fx = { - .name = "msm_camera_s5k3e2fx", - .dev = { - .platform_data = &msm_camera_sensor_s5k3e2fx_data, - }, -}; -#endif - -#ifdef CONFIG_MT9P012 -static struct msm_camera_sensor_flash_data flash_mt9p012 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9p012_data = { - .sensor_name = "mt9p012", - .sensor_reset = 89, - .sensor_pwd = 85, - .vcm_pwd = 88, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_mt9p012 -}; - -static struct platform_device msm_camera_sensor_mt9p012 = { - .name = "msm_camera_mt9p012", - .dev = { - .platform_data = &msm_camera_sensor_mt9p012_data, - }, -}; -#endif - -#ifdef CONFIG_MT9P012_KM -static struct msm_camera_sensor_flash_data flash_mt9p012_km = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9p012_km_data = { - .sensor_name = "mt9p012_km", - .sensor_reset = 89, - .sensor_pwd = 85, - .vcm_pwd = 88, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_mt9p012_km -}; - -static struct platform_device msm_camera_sensor_mt9p012_km = { - .name = "msm_camera_mt9p012_km", - .dev = { - .platform_data = &msm_camera_sensor_mt9p012_km_data, - }, -}; -#endif - -#ifdef CONFIG_MT9T013 -static struct msm_camera_sensor_flash_data flash_mt9t013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9t013_data = { - .sensor_name = "mt9t013", - .sensor_reset = 89, - .sensor_pwd = 85, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_mt9t013 -}; - -static struct platform_device msm_camera_sensor_mt9t013 = { - .name = "msm_camera_mt9t013", - .dev = { - .platform_data = &msm_camera_sensor_mt9t013_data, - }, -}; -#endif - -#ifdef CONFIG_VB6801 -static struct msm_camera_sensor_flash_data flash_vb6801 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_vb6801_data = { - .sensor_name = "vb6801", - .sensor_reset = 89, - .sensor_pwd = 88, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .flash_data = &flash_vb6801 -}; - -static struct platform_device msm_camera_sensor_vb6801 = { - .name = "msm_camera_vb6801", - .dev = { - .platform_data = &msm_camera_sensor_vb6801_data, - }, -}; -#endif -#endif - -static u32 msm_calculate_batt_capacity(u32 current_voltage); - -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .voltage_min_design = 2800, - .voltage_max_design = 4300, - .avail_chg_sources = AC_CHG | USB_CHG , - .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION, - .calculate_capacity = &msm_calculate_batt_capacity, -}; - -static u32 msm_calculate_batt_capacity(u32 current_voltage) -{ - u32 low_voltage = msm_psy_batt_data.voltage_min_design; - u32 high_voltage = msm_psy_batt_data.voltage_max_design; - - return (current_voltage - low_voltage) * 100 - / (high_voltage - low_voltage); -} - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; - - -static struct platform_device *devices[] __initdata = { - &asoc_msm_pcm, - &asoc_msm_dai0, - &asoc_msm_dai1, - - &msm_device_smd, - &msm_device_dmov, - &msm_device_nand, - -#ifdef CONFIG_USB_MSM_OTG_72K - &msm_device_otg, -#ifdef CONFIG_USB_GADGET - &msm_device_gadget_peripheral, -#endif -#endif - -#ifdef CONFIG_USB_G_ANDROID - &android_usb_device, -#endif - - &msm_device_i2c, - &smc91x_device, - &msm_device_tssc, - &android_pmem_device, - &android_pmem_adsp_device, - &android_pmem_audio_device, - &msm_fb_device, - &lcdc_gordon_panel_device, - &msm_device_uart_dm1, -#ifdef CONFIG_BT - &msm_bt_power_device, -#endif - &msm_device_pmic_leds, - &msm_device_snd, - &msm_device_adspdec, -#ifdef CONFIG_MT9T013 - &msm_camera_sensor_mt9t013, -#endif -#ifdef CONFIG_MT9D112 - &msm_camera_sensor_mt9d112, -#endif -#ifdef CONFIG_S5K3E2FX - &msm_camera_sensor_s5k3e2fx, -#endif -#ifdef CONFIG_MT9P012 - &msm_camera_sensor_mt9p012, -#endif -#ifdef CONFIG_MT9P012_KM - &msm_camera_sensor_mt9p012_km, -#endif -#ifdef CONFIG_VB6801 - &msm_camera_sensor_vb6801, -#endif - &msm_bluesleep_device, -#ifdef CONFIG_ARCH_MSM7X27 - &msm_kgsl_3d0, -#endif -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - &msm_device_tsif, -#endif - &hs_device, - &msm_batt_device, -}; - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = 97, - .mdp_rev = MDP_REV_30, -}; - -static void __init msm_fb_add_devices(void) -{ - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("pmdh", 0); - msm_fb_register_device("lcdc", &lcdc_pdata); -} - -extern struct sys_timer msm_timer; - -static void __init msm7x2x_init_irq(void) -{ - msm_init_irq(); -} - -void msm_serial_debug_init(unsigned int base, int irq, - struct device *clk_device, int signal_irq); - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)) - -static unsigned long vreg_sts, gpio_sts; -static struct regulator *vreg_mmc; -static unsigned mpp_mmc = 2; - -struct sdcc_gpio { - struct msm_gpio *cfg_data; - uint32_t size; - struct msm_gpio *sleep_cfg_data; -}; - -static struct msm_gpio sdc1_cfg_data[] = { - {GPIO_CFG(51, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_3"}, - {GPIO_CFG(52, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_2"}, - {GPIO_CFG(53, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_1"}, - {GPIO_CFG(54, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_0"}, - {GPIO_CFG(55, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_cmd"}, - {GPIO_CFG(56, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc1_clk"}, -}; - -static struct msm_gpio sdc2_cfg_data[] = { - {GPIO_CFG(62, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc2_clk"}, - {GPIO_CFG(63, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_cmd"}, - {GPIO_CFG(64, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_3"}, - {GPIO_CFG(65, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_2"}, - {GPIO_CFG(66, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_1"}, - {GPIO_CFG(67, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_0"}, -}; - -static struct msm_gpio sdc2_sleep_cfg_data[] = { - {GPIO_CFG(62, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_clk"}, - {GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_cmd"}, - {GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_3"}, - {GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_2"}, - {GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_1"}, - {GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_0"}, -}; -static struct msm_gpio sdc3_cfg_data[] = { - {GPIO_CFG(88, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc3_clk"}, - {GPIO_CFG(89, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_cmd"}, - {GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_3"}, - {GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_2"}, - {GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_1"}, - {GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_0"}, -}; - -static struct msm_gpio sdc4_cfg_data[] = { - {GPIO_CFG(19, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_3"}, - {GPIO_CFG(20, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_2"}, - {GPIO_CFG(21, 4, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_1"}, - {GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_cmd"}, - {GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_0"}, - {GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc4_clk"}, -}; - -static struct sdcc_gpio sdcc_cfg_data[] = { - { - .cfg_data = sdc1_cfg_data, - .size = ARRAY_SIZE(sdc1_cfg_data), - .sleep_cfg_data = NULL, - }, - { - .cfg_data = sdc2_cfg_data, - .size = ARRAY_SIZE(sdc2_cfg_data), - .sleep_cfg_data = sdc2_sleep_cfg_data, - }, - { - .cfg_data = sdc3_cfg_data, - .size = ARRAY_SIZE(sdc3_cfg_data), - .sleep_cfg_data = NULL, - }, - { - .cfg_data = sdc4_cfg_data, - .size = ARRAY_SIZE(sdc4_cfg_data), - .sleep_cfg_data = NULL, - }, -}; - -static void msm_sdcc_setup_gpio(int dev_id, unsigned int enable) -{ - int rc = 0; - struct sdcc_gpio *curr; - - curr = &sdcc_cfg_data[dev_id - 1]; - if (!(test_bit(dev_id, &gpio_sts)^enable)) - return; - - if (enable) { - set_bit(dev_id, &gpio_sts); - rc = msm_gpios_request_enable(curr->cfg_data, curr->size); - if (rc) - printk(KERN_ERR "%s: Failed to turn on GPIOs for slot %d\n", - __func__, dev_id); - } else { - clear_bit(dev_id, &gpio_sts); - if (curr->sleep_cfg_data) { - msm_gpios_enable(curr->sleep_cfg_data, curr->size); - msm_gpios_free(curr->sleep_cfg_data, curr->size); - return; - } - msm_gpios_disable_free(curr->cfg_data, curr->size); - } -} - -static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) -{ - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - msm_sdcc_setup_gpio(pdev->id, !!vdd); - - if (vdd == 0) { - if (!vreg_sts) - return 0; - - clear_bit(pdev->id, &vreg_sts); - - if (!vreg_sts) { - if (machine_is_msm7x25_ffa() || - machine_is_msm7x27_ffa()) { - rc = mpp_config_digital_out(mpp_mmc, - MPP_CFG(MPP_DLOGIC_LVL_MSMP, - MPP_DLOGIC_OUT_CTRL_LOW)); - } else - rc = regulator_disable(vreg_mmc); - if (rc) { - pr_err("%s: return val: %d\n", - __func__, rc); - } - } - return 0; - } - - if (!vreg_sts) { - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) { - rc = mpp_config_digital_out(mpp_mmc, - MPP_CFG(MPP_DLOGIC_LVL_MSMP, - MPP_DLOGIC_OUT_CTRL_HIGH)); - } else { - rc = regulator_set_voltage(vreg_mmc, 2850000, 2850000); - if (!rc) - rc = regulator_enable(vreg_mmc); - } - if (rc) { - pr_err("%s: return val: %d\n", - __func__, rc); - } - } - set_bit(pdev->id, &vreg_sts); - return 0; -} - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct mmc_platform_data msm7x2x_sdc1_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct mmc_platform_data msm7x2x_sdc2_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sdiowakeup_irq = MSM_GPIO_TO_INT(66), - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data msm7x2x_sdc3_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct mmc_platform_data msm7x2x_sdc4_data = { - .ocr_mask = MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -static void __init msm7x2x_init_mmc(void) -{ - if (!machine_is_msm7x25_ffa() && !machine_is_msm7x27_ffa()) { - vreg_mmc = regulator_get(NULL, "mmc"); - if (IS_ERR(vreg_mmc)) { - pr_err("%s: could not get regulator: %ld\n", - __func__, PTR_ERR(vreg_mmc)); - } - } - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - msm_add_sdcc(1, &msm7x2x_sdc1_data); -#endif - - if (machine_is_msm7x25_surf() || machine_is_msm7x27_surf() || - machine_is_msm7x27_ffa()) { -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - msm_sdcc_setup_gpio(2, 1); - msm_add_sdcc(2, &msm7x2x_sdc2_data); -#endif - } - - if (machine_is_msm7x25_surf() || machine_is_msm7x27_surf()) { -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - msm_add_sdcc(3, &msm7x2x_sdc3_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - msm_add_sdcc(4, &msm7x2x_sdc4_data); -#endif - } -} -#else -#define msm7x2x_init_mmc() do {} while (0) -#endif - - -static struct msm_pm_platform_data msm7x25_pm_data[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)].latency = 16000, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] - .latency = 12000, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT)] - .latency = 2000, -}; - -static struct msm_pm_platform_data msm7x27_pm_data[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 16000, - .residency = 20000, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 12000, - .residency = 20000, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2000, - .residency = 0, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS, - .p_addr = 0, -}; - -static void -msm_i2c_gpio_config(int iface, int config_type) -{ - int gpio_scl; - int gpio_sda; - if (iface) { - gpio_scl = 95; - gpio_sda = 96; - } else { - gpio_scl = 60; - gpio_sda = 61; - } - if (config_type) { - gpio_tlmm_config(GPIO_CFG(gpio_scl, 1, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - gpio_tlmm_config(GPIO_CFG(gpio_sda, 1, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - } else { - gpio_tlmm_config(GPIO_CFG(gpio_scl, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - gpio_tlmm_config(GPIO_CFG(gpio_sda, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - } -} - -static struct msm_i2c_platform_data msm_i2c_pdata = { - .clk_freq = 100000, - .rmutex = 0, - .pri_clk = 60, - .pri_dat = 61, - .aux_clk = 95, - .aux_dat = 96, - .msm_i2c_config_gpio = msm_i2c_gpio_config, -}; -static struct platform_device msm_proccomm_regulator_dev = { - .name = PROCCOMM_REGULATOR_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &msm7627_proccomm_regulator_data - } -}; - -static void __init msm7627_init_regulators(void) -{ - int rc = platform_device_register(&msm_proccomm_regulator_dev); - if (rc) - pr_err("%s: could not register regulator device: %d\n", - __func__, rc); -} -static void __init msm_device_i2c_init(void) -{ - if (gpio_request(60, "i2c_pri_clk")) - pr_err("failed to request gpio i2c_pri_clk\n"); - if (gpio_request(61, "i2c_pri_dat")) - pr_err("failed to request gpio i2c_pri_dat\n"); - if (gpio_request(95, "i2c_sec_clk")) - pr_err("failed to request gpio i2c_sec_clk\n"); - if (gpio_request(96, "i2c_sec_dat")) - pr_err("failed to request gpio i2c_sec_dat\n"); - - if (cpu_is_msm7x27()) - msm_i2c_pdata.pm_lat = - msm7x27_pm_data[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] - .latency; - else - msm_i2c_pdata.pm_lat = - msm7x25_pm_data[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] - .latency; - - msm_device_i2c.dev.platform_data = &msm_i2c_pdata; -} - -static void usb_mpp_init(void) -{ - unsigned rc; - unsigned mpp_usb = 7; - - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) { - rc = mpp_config_digital_out(mpp_usb, - MPP_CFG(MPP_DLOGIC_LVL_VDD, - MPP_DLOGIC_OUT_CTRL_HIGH)); - if (rc) - pr_err("%s: configuring mpp pin" - "to enable 3.3V LDO failed\n", __func__); - } -} - -static void msm7x27_wlan_init(void) -{ - int rc = 0; - /* TBD: if (machine_is_msm7x27_ffa_with_wcn1312()) */ - if (machine_is_msm7x27_ffa()) { - rc = mpp_config_digital_out(3, MPP_CFG(MPP_DLOGIC_LVL_MSMP, - MPP_DLOGIC_OUT_CTRL_LOW)); - if (rc) - printk(KERN_ERR "%s: return val: %d \n", - __func__, rc); - } -} - -static void msm_adsp_add_pdev(void) -{ - int rc = 0; - struct rpc_board_dev *rpc_adsp_pdev; - - rpc_adsp_pdev = kzalloc(sizeof(struct rpc_board_dev), GFP_KERNEL); - if (rpc_adsp_pdev == NULL) { - pr_err("%s: Memory Allocation failure\n", __func__); - return; - } - rpc_adsp_pdev->prog = ADSP_RPC_PROG; - rpc_adsp_pdev->pdev = msm_adsp_device; - rc = msm_rpc_add_board_dev(rpc_adsp_pdev, 1); - if (rc < 0) { - pr_err("%s: return val: %d\n", __func__, rc); - kfree(rpc_adsp_pdev); - } -} - -static void __init msm7x2x_init(void) -{ - - msm7627_init_regulators(); -#ifdef CONFIG_ARCH_MSM7X25 - msm_clock_init(msm_clocks_7x25, msm_num_clocks_7x25); -#elif defined(CONFIG_ARCH_MSM7X27) - msm_clock_init(&msm7x27_clock_init_data); -#endif - -#if defined(CONFIG_SMC91X) - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) { - smc91x_resources[0].start = 0x98000300; - smc91x_resources[0].end = 0x980003ff; - smc91x_resources[1].start = MSM_GPIO_TO_INT(85); - smc91x_resources[1].end = MSM_GPIO_TO_INT(85); - if (gpio_tlmm_config(GPIO_CFG(85, 0, - GPIO_CFG_INPUT, - GPIO_CFG_PULL_DOWN, - GPIO_CFG_2MA), - GPIO_CFG_ENABLE)) { - printk(KERN_ERR - "%s: Err: Config GPIO-85 INT\n", - __func__); - } - } -#endif - platform_device_register(&msm7x27_device_acpuclk); - - usb_mpp_init(); - - -#ifdef CONFIG_USB_MSM_OTG_72K - msm_device_otg.dev.platform_data = &msm_otg_pdata; - if (machine_is_msm7x25_surf() || machine_is_msm7x25_ffa()) { - msm_otg_pdata.pemp_level = - PRE_EMPHASIS_WITH_20_PERCENT; - msm_otg_pdata.drv_ampl = HS_DRV_AMPLITUDE_5_PERCENT; - msm_otg_pdata.cdr_autoreset = CDR_AUTO_RESET_ENABLE; - msm_otg_pdata.phy_reset = msm_otg_rpc_phy_reset; - } - if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa()) { - msm_otg_pdata.pemp_level = - PRE_EMPHASIS_WITH_10_PERCENT; - msm_otg_pdata.drv_ampl = HS_DRV_AMPLITUDE_5_PERCENT; - msm_otg_pdata.cdr_autoreset = CDR_AUTO_RESET_DISABLE; - msm_otg_pdata.phy_reset_sig_inverted = 1; - } - -#ifdef CONFIG_USB_GADGET - msm_otg_pdata.swfi_latency = - msm7x27_pm_data - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; - msm_gadget_pdata.is_phy_status_timer_on = 1; -#endif -#endif -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - msm_device_tsif.dev.platform_data = &tsif_platform_data; -#endif - platform_add_devices(msm_footswitch_devices, - msm_num_footswitch_devices); - platform_add_devices(devices, ARRAY_SIZE(devices)); -#ifdef CONFIG_MSM_CAMERA - config_camera_off_gpios(); /* might not be necessary */ -#endif - msm_adsp_add_pdev(); - msm_device_i2c_init(); - i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices)); - -#ifdef CONFIG_SURF_FFA_GPIO_KEYPAD - if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) - platform_device_register(&keypad_device_7k_ffa); - else - platform_device_register(&keypad_device_surf); -#endif - lcdc_gordon_gpio_init(); - msm_fb_add_devices(); -#ifdef CONFIG_USB_EHCI_MSM_72K - msm7x2x_init_host(); -#endif - msm7x2x_init_mmc(); - bt_power_init(); - - if (cpu_is_msm7x27()) - msm_pm_set_platform_data(msm7x27_pm_data, - ARRAY_SIZE(msm7x27_pm_data)); - else - msm_pm_set_platform_data(msm7x25_pm_data, - ARRAY_SIZE(msm7x25_pm_data)); - - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - - msm7x27_wlan_init(); -} - -static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE; -static int __init pmem_kernel_ebi1_size_setup(char *p) -{ - pmem_kernel_ebi1_size = memparse(p, NULL); - return 0; -} -early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup); - -static unsigned pmem_mdp_size = MSM_PMEM_MDP_SIZE; -static int __init pmem_mdp_size_setup(char *p) -{ - pmem_mdp_size = memparse(p, NULL); - return 0; -} -early_param("pmem_mdp_size", pmem_mdp_size_setup); - -static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE; -static int __init pmem_adsp_size_setup(char *p) -{ - pmem_adsp_size = memparse(p, NULL); - return 0; -} -early_param("pmem_adsp_size", pmem_adsp_size_setup); - -static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE; -static int __init pmem_audio_size_setup(char *p) -{ - pmem_audio_size = memparse(p, NULL); - return 0; -} -early_param("pmem_audio_size", pmem_audio_size_setup); - -static unsigned fb_size = MSM_FB_SIZE; -static int __init fb_size_setup(char *p) -{ - fb_size = memparse(p, NULL); - return 0; -} -early_param("fb_size", fb_size_setup); - -static void __init msm_msm7x2x_allocate_memory_regions(void) -{ - void *addr; - unsigned long size; - - size = fb_size ? : MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); -} - -static struct memtype_reserve msm7x27_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static void __init size_pmem_devices(void) -{ -#ifdef CONFIG_ANDROID_PMEM - android_pmem_adsp_pdata.size = pmem_adsp_size; - android_pmem_pdata.size = pmem_mdp_size; - android_pmem_audio_pdata.size = pmem_audio_size; -#endif -} - -static void __init reserve_memory_for(struct android_pmem_platform_data *p) -{ - msm7x27_reserve_table[p->memory_type].size += p->size; -} - -static void __init reserve_pmem_memory(void) -{ -#ifdef CONFIG_ANDROID_PMEM - reserve_memory_for(&android_pmem_adsp_pdata); - reserve_memory_for(&android_pmem_pdata); - reserve_memory_for(&android_pmem_audio_pdata); - msm7x27_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size; -#endif -} - -static void __init msm7x27_calculate_reserve_sizes(void) -{ - size_pmem_devices(); - reserve_pmem_memory(); -} - -static int msm7x27_paddr_to_memtype(unsigned int paddr) -{ - return MEMTYPE_EBI1; -} - -static struct reserve_info msm7x27_reserve_info __initdata = { - .memtype_reserve_table = msm7x27_reserve_table, - .calculate_reserve_sizes = msm7x27_calculate_reserve_sizes, - .paddr_to_memtype = msm7x27_paddr_to_memtype, -}; - -static void __init msm7x27_reserve(void) -{ - reserve_info = &msm7x27_reserve_info; - msm_reserve(); -} - -static void __init msm7x27_init_early(void) -{ - msm_msm7x2x_allocate_memory_regions(); -} - -static void __init msm7x2x_map_io(void) -{ - msm_map_common_io(); - - if (socinfo_init() < 0) - BUG(); - -#ifdef CONFIG_CACHE_L2X0 - if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa()) { - /* 7x27 has 256KB L2 cache: - 64Kb/Way and 4-Way Associativity; - evmon/parity/share disabled. */ - if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) > 1) - || ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1) - && (SOCINFO_VERSION_MINOR(socinfo_get_version()) >= 3))) - /* R/W latency: 4 cycles; */ - l2x0_init(MSM_L2CC_BASE, 0x0006801B, 0xfe000000); - else - /* R/W latency: 3 cycles; */ - l2x0_init(MSM_L2CC_BASE, 0x00068012, 0xfe000000); - } -#endif -} - -MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") - .atag_offset = 0x100, - .map_io = msm7x2x_map_io, - .reserve = msm7x27_reserve, - .init_irq = msm7x2x_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x27_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END - -MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") - .atag_offset = 0x100, - .map_io = msm7x2x_map_io, - .reserve = msm7x27_reserve, - .init_irq = msm7x2x_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x27_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END - -MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") - .atag_offset = 0x100, - .map_io = msm7x2x_map_io, - .reserve = msm7x27_reserve, - .init_irq = msm7x2x_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x27_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END - -MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") - .atag_offset = 0x100, - .map_io = msm7x2x_map_io, - .reserve = msm7x27_reserve, - .init_irq = msm7x2x_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x27_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END diff --git a/arch/arm/mach-msm/board-msm7x27a-regulator.c b/arch/arm/mach-msm/board-msm7x27a-regulator.c deleted file mode 100644 index 7c140cb43440..000000000000 --- a/arch/arm/mach-msm/board-msm7x27a-regulator.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "board-msm7x27a-regulator.h" - -#define VOLTAGE_RANGE(min_uV, max_uV, step_uV) ((max_uV - min_uV) / step_uV) - -/* Physically available PMIC regulator voltage setpoint ranges */ -#define p_ranges VOLTAGE_RANGE(1500000, 3300000, 25000) - -#define n_ranges VOLTAGE_RANGE(750000, 1525000, 12500) - -#define s_ranges (VOLTAGE_RANGE(700000, 1500000, 12500) + \ - VOLTAGE_RANGE(1500000, 3050000, 25000)) - -#define PCOM_VREG_CONSUMERS(name) \ - static struct regulator_consumer_supply __pcom_vreg_supply_##name[] - -#define PCOM_VREG_INIT_DATA(_name, _supply, _min_uV, _max_uV, _always_on, \ - _boot_on, _apply_uV, _supply_uV)\ -{ \ - .supply_regulator = _supply, \ - .consumer_supplies = __pcom_vreg_supply_##_name, \ - .num_consumer_supplies = ARRAY_SIZE(__pcom_vreg_supply_##_name), \ - .constraints = { \ - .name = #_name, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS, \ - .input_uV = _supply_uV, \ - .apply_uV = _apply_uV, \ - .boot_on = _boot_on, \ - .always_on = _always_on \ - } \ -} - -#define PCOM_VREG_SMP(_name, _id, _supply, _min_uV, _max_uV, _rise_time, \ - _pulldown, _always_on, _boot_on, _apply_uV, _supply_uV, _range) \ -{ \ - .init_data = PCOM_VREG_INIT_DATA(_name, _supply, _min_uV, _max_uV, \ - _always_on, _boot_on, _apply_uV, _supply_uV), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = _pulldown, \ - .negative = 0, \ - .n_voltages = _range##_ranges, \ -} - -#define PCOM_VREG_LDO PCOM_VREG_SMP - -#define PCOM_VREG_NCP(_name, _id, _supply, _min_uV, _max_uV, _rise_time, \ - _always_on, _boot_on, _apply_uV, _supply_uV) \ -{ \ - .init_data = PCOM_VREG_INIT_DATA(_name, _supply, -(_min_uV), \ - -(_max_uV), _always_on, _boot_on, _apply_uV, _supply_uV), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = -1, \ - .negative = 1, \ -} - -PCOM_VREG_CONSUMERS(smps1) = { - REGULATOR_SUPPLY("smps1", NULL), - REGULATOR_SUPPLY("msmc1", NULL), -}; - -PCOM_VREG_CONSUMERS(smps2) = { - REGULATOR_SUPPLY("smps2", NULL), - REGULATOR_SUPPLY("msmc2", NULL), -}; - -PCOM_VREG_CONSUMERS(smps3) = { - REGULATOR_SUPPLY("smps3", NULL), - REGULATOR_SUPPLY("msme1", NULL), - REGULATOR_SUPPLY("vcc_i2c", "1-004a"), - REGULATOR_SUPPLY("vcc_i2c", "1-0038"), -}; - -PCOM_VREG_CONSUMERS(smps4) = { - REGULATOR_SUPPLY("smps4", NULL), - REGULATOR_SUPPLY("rf", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo01) = { - REGULATOR_SUPPLY("ldo01", NULL), - REGULATOR_SUPPLY("ldo1", NULL), - REGULATOR_SUPPLY("rfrx1", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo02) = { - REGULATOR_SUPPLY("ldo02", NULL), - REGULATOR_SUPPLY("ldo2", NULL), - REGULATOR_SUPPLY("rfrx2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo03) = { - REGULATOR_SUPPLY("ldo03", NULL), - REGULATOR_SUPPLY("ldo3", NULL), - REGULATOR_SUPPLY("mddi", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo04) = { - REGULATOR_SUPPLY("ldo04", NULL), - REGULATOR_SUPPLY("ldo4", NULL), - REGULATOR_SUPPLY("pllx", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo05) = { - REGULATOR_SUPPLY("ldo05", NULL), - REGULATOR_SUPPLY("ldo5", NULL), - REGULATOR_SUPPLY("wlan2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo06) = { - REGULATOR_SUPPLY("ldo06", NULL), - REGULATOR_SUPPLY("ldo6", NULL), - REGULATOR_SUPPLY("wlan3", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo07) = { - REGULATOR_SUPPLY("ldo07", NULL), - REGULATOR_SUPPLY("ldo7", NULL), - REGULATOR_SUPPLY("msma", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo08) = { - REGULATOR_SUPPLY("ldo08", NULL), - REGULATOR_SUPPLY("ldo8", NULL), - REGULATOR_SUPPLY("tcxo", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo09) = { - REGULATOR_SUPPLY("ldo09", NULL), - REGULATOR_SUPPLY("ldo9", NULL), - REGULATOR_SUPPLY("usb2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo10) = { - REGULATOR_SUPPLY("ldo10", NULL), - REGULATOR_SUPPLY("emmc", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo11) = { - REGULATOR_SUPPLY("ldo11", NULL), - REGULATOR_SUPPLY("wlan_tcx0", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo12) = { - REGULATOR_SUPPLY("ldo12", NULL), - REGULATOR_SUPPLY("gp2", NULL), - REGULATOR_SUPPLY("vdd_ana", "1-004a"), - REGULATOR_SUPPLY("vdd", "1-0038"), -}; - -PCOM_VREG_CONSUMERS(ldo13) = { - REGULATOR_SUPPLY("ldo13", NULL), - REGULATOR_SUPPLY("mmc", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo14) = { - REGULATOR_SUPPLY("ldo14", NULL), - REGULATOR_SUPPLY("usb", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo15) = { - REGULATOR_SUPPLY("ldo15", NULL), - REGULATOR_SUPPLY("usim2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo16) = { - REGULATOR_SUPPLY("ldo16", NULL), - REGULATOR_SUPPLY("ruim", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo17) = { - REGULATOR_SUPPLY("ldo17", NULL), - REGULATOR_SUPPLY("bt", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo18) = { - REGULATOR_SUPPLY("ldo18", NULL), - REGULATOR_SUPPLY("rftx", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo19) = { - REGULATOR_SUPPLY("ldo19", NULL), - REGULATOR_SUPPLY("wlan4", NULL), -}; - -PCOM_VREG_CONSUMERS(ncp) = { - REGULATOR_SUPPLY("ncp", NULL), -}; - -static struct proccomm_regulator_info msm7x27a_pcom_vreg_info[] = { - /* Standard regulators (SMPS and LDO) - * R = rise time (us) - * P = pulldown (1 = pull down, 0 = float, -1 = don't care) - * A = always on - * B = boot on - * V = automatic voltage set (meaningful for single-voltage regs only) - * S = supply voltage (uV) - * T = type of regulator (smps, pldo, nldo) - * name id supp min uV max uV R P A B V S T*/ - PCOM_VREG_SMP(smps1, 3, NULL, 1100000, 1100000, 0, -1, 0, 0, 0, 0, s), - PCOM_VREG_SMP(smps2, 4, NULL, 1100000, 1100000, 0, -1, 0, 0, 0, 0, s), - PCOM_VREG_SMP(smps3, 2, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0, s), - PCOM_VREG_SMP(smps4, 24, NULL, 2100000, 2100000, 0, -1, 0, 0, 0, 0, s), - PCOM_VREG_LDO(ldo01, 12, NULL, 1800000, 2100000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo02, 13, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo03, 49, NULL, 1200000, 1200000, 0, -1, 0, 0, 0, 0, n), - PCOM_VREG_LDO(ldo04, 50, NULL, 1100000, 1100000, 0, -1, 0, 0, 0, 0, n), - PCOM_VREG_LDO(ldo05, 45, NULL, 1300000, 1350000, 0, -1, 0, 0, 0, 0, n), - PCOM_VREG_LDO(ldo06, 51, NULL, 1200000, 1200000, 0, -1, 0, 0, 0, 0, n), - PCOM_VREG_LDO(ldo07, 0, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo08, 9, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo09, 44, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo10, 52, NULL, 1800000, 3000000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo11, 53, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo12, 21, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo13, 18, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo14, 16, NULL, 3300000, 3300000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo15, 54, NULL, 1800000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo16, 19, NULL, 1800000, 2850000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo17, 56, NULL, 2900000, 3300000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo18, 11, NULL, 2700000, 2700000, 0, -1, 0, 0, 0, 0, p), - PCOM_VREG_LDO(ldo19, 57, NULL, 1200000, 1800000, 0, -1, 0, 0, 0, 0, p), - - PCOM_VREG_NCP(ncp, 31, NULL, -1800000, -1800000, 0, 0, 0, 0, 0), -}; - -struct proccomm_regulator_platform_data msm7x27a_proccomm_regulator_data = { - .regs = msm7x27a_pcom_vreg_info, - .nregs = ARRAY_SIZE(msm7x27a_pcom_vreg_info) -}; diff --git a/arch/arm/mach-msm/board-msm7x27a-regulator.h b/arch/arm/mach-msm/board-msm7x27a-regulator.h deleted file mode 100644 index 999e2eb041e0..000000000000 --- a/arch/arm/mach-msm/board-msm7x27a-regulator.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_7X27A_REGULATOR_H__ -#define __ARCH_ARM_MACH_MSM_BOARD_7X27A_REGULATOR_H__ - -#include "proccomm-regulator.h" - -extern struct proccomm_regulator_platform_data msm7x27a_proccomm_regulator_data; - -#endif diff --git a/arch/arm/mach-msm/board-msm7x27a.c b/arch/arm/mach-msm/board-msm7x27a.c deleted file mode 100644 index 48f6fdd986e1..000000000000 --- a/arch/arm/mach-msm/board-msm7x27a.c +++ /dev/null @@ -1,1197 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "timer.h" -#include "board-msm7x27a-regulator.h" -#include "devices-msm7x2xa.h" -#include "pm.h" -#include -#include -#include "pm-boot.h" -#include "board-msm7627a.h" -#include "platsmp.h" - -#define RESERVE_KERNEL_EBI1_SIZE 0x3A000 -#define MSM_RESERVE_AUDIO_SIZE 0x1F4000 - -#if defined(CONFIG_GPIO_SX150X) -enum { - SX150X_CORE, -}; - -static struct sx150x_platform_data sx150x_data[] __initdata = { - [SX150X_CORE] = { - .gpio_base = GPIO_CORE_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0, - .io_pulldn_ena = 0x02, - .io_open_drain_ena = 0xfef8, - .irq_summary = -1, - }, -}; -#endif - - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) -static struct platform_device msm_wlan_ar6000_pm_device = { - .name = "wlan_ar6000_pm_dev", - .id = -1, -}; -#endif - -#if defined(CONFIG_I2C) && defined(CONFIG_GPIO_SX150X) -static struct i2c_board_info core_exp_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1509q", 0x3e), - }, -}; - -static void __init register_i2c_devices(void) -{ - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || - machine_is_msm8625_surf()) - sx150x_data[SX150X_CORE].io_open_drain_ena = 0xe0f0; - - core_exp_i2c_info[0].platform_data = - &sx150x_data[SX150X_CORE]; - - i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, - core_exp_i2c_info, - ARRAY_SIZE(core_exp_i2c_info)); -} -#endif - -static struct msm_gpio qup_i2c_gpios_io[] = { - { GPIO_CFG(60, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(61, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, - { GPIO_CFG(131, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(132, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, -}; - -static struct msm_gpio qup_i2c_gpios_hw[] = { - { GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, - { GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, -}; - -static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type) -{ - int rc; - - if (adap_id < 0 || adap_id > 1) - return; - - /* Each adapter gets 2 lines from the table */ - if (config_type) - rc = msm_gpios_request_enable(&qup_i2c_gpios_hw[adap_id*2], 2); - else - rc = msm_gpios_request_enable(&qup_i2c_gpios_io[adap_id*2], 2); - if (rc < 0) - pr_err("QUP GPIO request/enable failed: %d\n", rc); -} - -static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = { - .clk_freq = 100000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi1_qup_i2c_pdata = { - .clk_freq = 100000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -#ifdef CONFIG_ARCH_MSM7X27A -#define MSM_RESERVE_MDP_SIZE 0x1B00000 -#define MSM7x25A_MSM_RESERVE_MDP_SIZE 0x1500000 -#define MSM_RESERVE_ADSP_SIZE 0x1200000 -#define MSM7x25A_MSM_RESERVE_ADSP_SIZE 0xB91000 -#define CAMERA_ZSL_SIZE (SZ_1M * 60) -#endif - -#ifdef CONFIG_ION_MSM -#define MSM_ION_HEAP_NUM 4 -static struct platform_device ion_dev; -static int msm_ion_camera_size; -static int msm_ion_audio_size; -static int msm_ion_sf_size; -#endif - - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -#ifdef CONFIG_USB_EHCI_MSM_72K -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - int rc = 0; - unsigned gpio; - - gpio = GPIO_HOST_VBUS_EN; - - rc = gpio_request(gpio, "i2c_host_vbus_en"); - if (rc < 0) { - pr_err("failed to request %d GPIO\n", gpio); - return; - } - gpio_direction_output(gpio, !!on); - gpio_set_value_cansleep(gpio, !!on); - gpio_free(gpio); -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM), -}; - -static void __init msm7x2x_init_host(void) -{ - msm_add_host(0, &msm_usb_host_pdata); -} -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static int hsusb_rpc_connect(int connect) -{ - if (connect) - return msm_hsusb_rpc_connect(); - else - return msm_hsusb_rpc_close(); -} - -static struct regulator *reg_hsusb; -static int msm_hsusb_ldo_init(int init) -{ - int rc = 0; - - if (init) { - reg_hsusb = regulator_get(NULL, "usb"); - if (IS_ERR(reg_hsusb)) { - rc = PTR_ERR(reg_hsusb); - pr_err("%s: could not get regulator: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_set_voltage(reg_hsusb, 3300000, 3300000); - if (rc) { - pr_err("%s: could not set voltage: %d\n", - __func__, rc); - goto reg_free; - } - - return 0; - } - /* else fall through */ -reg_free: - regulator_put(reg_hsusb); -out: - reg_hsusb = NULL; - return rc; -} - -static int msm_hsusb_ldo_enable(int enable) -{ - static int ldo_status; - - if (IS_ERR_OR_NULL(reg_hsusb)) - return reg_hsusb ? PTR_ERR(reg_hsusb) : -ENODEV; - - if (ldo_status == enable) - return 0; - - ldo_status = enable; - - return enable ? - regulator_enable(reg_hsusb) : - regulator_disable(reg_hsusb); -} - -#ifndef CONFIG_USB_EHCI_MSM_72K -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) -{ - int ret = 0; - - if (init) - ret = msm_pm_app_rpc_init(callback); - else - msm_pm_app_rpc_deinit(callback); - - return ret; -} -#endif - -static struct msm_otg_platform_data msm_otg_pdata = { -#ifndef CONFIG_USB_EHCI_MSM_72K - .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init, -#else - .vbus_power = msm_hsusb_vbus_power, -#endif - .rpc_connect = hsusb_rpc_connect, - .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT, - .cdr_autoreset = CDR_AUTO_RESET_DISABLE, - .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT, - .se1_gating = SE1_GATING_DISABLE, - .ldo_init = msm_hsusb_ldo_init, - .ldo_enable = msm_hsusb_ldo_enable, - .chg_init = hsusb_chg_init, - .chg_connected = hsusb_chg_connected, - .chg_vbus_draw = hsusb_chg_vbus_draw, -}; -#endif - -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = { - .is_phy_status_timer_on = 1, -}; - -static struct resource smc91x_resources[] = { - [0] = { - .start = 0x90000300, - .end = 0x900003ff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MSM_GPIO_TO_INT(4), - .end = MSM_GPIO_TO_INT(4), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device smc91x_device = { - .name = "smc91x", - .id = 0, - .num_resources = ARRAY_SIZE(smc91x_resources), - .resource = smc91x_resources, -}; - -#ifdef CONFIG_SERIAL_MSM_HS -static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = { - .inject_rx_on_wakeup = 1, - .rx_to_inject = 0xFD, -}; -#endif -static struct msm_pm_platform_data msm7x27a_pm_data[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 16000, - .residency = 20000, - }, - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 12000, - .residency = 20000, - }, - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 1, - .latency = 2000, - .residency = 0, - }, - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 0, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS, - .p_addr = 0, -}; - -/* 8625 PM platform data */ -static struct msm_pm_platform_data - msm8625_pm_data[MSM_PM_SLEEP_MODE_NR * CONFIG_NR_CPUS] = { - /* CORE0 entries */ - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 16000, - .residency = 20000, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 12000, - .residency = 20000, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(2, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(2, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(3, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(3, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - -}; - -static struct msm_pm_boot_platform_data msm_pm_8625_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_REMAP_BOOT_ADDR, - .v_addr = MSM_CFG_CTL_BASE, -}; - -static unsigned reserve_mdp_size = MSM_RESERVE_MDP_SIZE; -static int __init reserve_mdp_size_setup(char *p) -{ - reserve_mdp_size = memparse(p, NULL); - return 0; -} - -early_param("reserve_mdp_size", reserve_mdp_size_setup); - -static unsigned reserve_adsp_size = MSM_RESERVE_ADSP_SIZE; -static int __init reserve_adsp_size_setup(char *p) -{ - reserve_adsp_size = memparse(p, NULL); - return 0; -} - -early_param("reserve_adsp_size", reserve_adsp_size_setup); - -static u32 msm_calculate_batt_capacity(u32 current_voltage); - -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .voltage_min_design = 3200, - .voltage_max_design = 4200, - .voltage_fail_safe = 3340, - .avail_chg_sources = AC_CHG | USB_CHG , - .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION, - .calculate_capacity = &msm_calculate_batt_capacity, -}; - -static u32 msm_calculate_batt_capacity(u32 current_voltage) -{ - u32 low_voltage = msm_psy_batt_data.voltage_min_design; - u32 high_voltage = msm_psy_batt_data.voltage_max_design; - - if (current_voltage <= low_voltage) - return 0; - else if (current_voltage >= high_voltage) - return 100; - else - return (current_voltage - low_voltage) * 100 - / (high_voltage - low_voltage); -} - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; - -static struct smsc911x_platform_config smsc911x_config = { - .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, - .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, - .flags = SMSC911X_USE_16BIT, -}; - -static struct resource smsc911x_resources[] = { - [0] = { - .start = 0x90000000, - .end = 0x90007fff, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MSM_GPIO_TO_INT(48), - .end = MSM_GPIO_TO_INT(48), - .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, - }, -}; - -static struct platform_device smsc911x_device = { - .name = "smsc911x", - .id = 0, - .num_resources = ARRAY_SIZE(smsc911x_resources), - .resource = smsc911x_resources, - .dev = { - .platform_data = &smsc911x_config, - }, -}; - -static struct msm_gpio smsc911x_gpios[] = { - { GPIO_CFG(48, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_6MA), - "smsc911x_irq" }, - { GPIO_CFG(49, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_6MA), - "eth_fifo_sel" }, -}; - -static char *msm_adc_surf_device_names[] = { - "XO_ADC", -}; - -static struct msm_adc_platform_data msm_adc_pdata = { - .dev_names = msm_adc_surf_device_names, - .num_adc = ARRAY_SIZE(msm_adc_surf_device_names), - .target_hw = MSM_8x25, -}; - -static struct platform_device msm_adc_device = { - .name = "msm_adc", - .id = -1, - .dev = { - .platform_data = &msm_adc_pdata, - }, -}; - -#ifdef CONFIG_MSM_RTB -static struct msm_rtb_platform_data msm7x27a_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - msm7x27a_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - -struct platform_device msm7x27a_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &msm7x27a_rtb_pdata, - }, -}; -#endif - -#define ETH_FIFO_SEL_GPIO 49 -static void msm7x27a_cfg_smsc911x(void) -{ - int res; - - res = msm_gpios_request_enable(smsc911x_gpios, - ARRAY_SIZE(smsc911x_gpios)); - if (res) { - pr_err("%s: unable to enable gpios for SMSC911x\n", __func__); - return; - } - - /* ETH_FIFO_SEL */ - res = gpio_direction_output(ETH_FIFO_SEL_GPIO, 0); - if (res) { - pr_err("%s: unable to get direction for gpio %d\n", __func__, - ETH_FIFO_SEL_GPIO); - msm_gpios_disable_free(smsc911x_gpios, - ARRAY_SIZE(smsc911x_gpios)); - return; - } - gpio_set_value(ETH_FIFO_SEL_GPIO, 0); -} - -#if defined(CONFIG_SERIAL_MSM_HSL_CONSOLE) \ - && defined(CONFIG_MSM_SHARED_GPIO_FOR_UART2DM) -static struct msm_gpio uart2dm_gpios[] = { - {GPIO_CFG(19, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "uart2dm_rfr_n" }, - {GPIO_CFG(20, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "uart2dm_cts_n" }, - {GPIO_CFG(21, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "uart2dm_rx" }, - {GPIO_CFG(108, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "uart2dm_tx" }, -}; - -static void msm7x27a_cfg_uart2dm_serial(void) -{ - int ret; - ret = msm_gpios_request_enable(uart2dm_gpios, - ARRAY_SIZE(uart2dm_gpios)); - if (ret) - pr_err("%s: unable to enable gpios for uart2dm\n", __func__); -} -#else -static void msm7x27a_cfg_uart2dm_serial(void) { } -#endif - -static struct platform_device *rumi_sim_devices[] __initdata = { - &msm_device_dmov, - &msm_device_smd, - &smc91x_device, - &msm_device_uart1, - &msm_device_nand, - &msm_device_uart_dm1, - &msm_gsbi0_qup_i2c_device, - &msm_gsbi1_qup_i2c_device, -}; - -static struct platform_device *msm8625_rumi3_devices[] __initdata = { - &msm8625_device_dmov, - &msm8625_device_smd, - &msm8625_device_uart1, - &msm8625_gsbi0_qup_i2c_device, -}; - -static struct platform_device *msm7627a_surf_ffa_devices[] __initdata = { - &msm_device_dmov, - &msm_device_smd, - &msm_device_uart1, - &msm_device_uart_dm1, - &msm_device_uart_dm2, - &msm_gsbi0_qup_i2c_device, - &msm_gsbi1_qup_i2c_device, - &msm_device_otg, - &msm_device_gadget_peripheral, - &smsc911x_device, - &msm_kgsl_3d0, -}; - -static struct platform_device *common_devices[] __initdata = { - &android_usb_device, - &msm_device_nand, - &msm_device_snd, - &msm_device_cad, - &msm_device_adspdec, - &asoc_msm_pcm, - &asoc_msm_dai0, - &asoc_msm_dai1, - &msm_batt_device, - &msm_adc_device, -#ifdef CONFIG_MSM_RTB - &msm7x27a_rtb_device, -#endif -#ifdef CONFIG_ION_MSM - &ion_dev, -#endif -}; - -static struct platform_device *msm8625_surf_devices[] __initdata = { - &msm8625_device_dmov, - &msm8625_device_uart1, - &msm8625_device_uart_dm1, - &msm8625_device_uart_dm2, - &msm8625_gsbi0_qup_i2c_device, - &msm8625_gsbi1_qup_i2c_device, - &msm8625_device_smd, - &msm8625_device_otg, - &msm8625_device_gadget_peripheral, - &msm8625_kgsl_3d0, -}; - -static unsigned reserve_kernel_ebi1_size = RESERVE_KERNEL_EBI1_SIZE; -static int __init reserve_kernel_ebi1_size_setup(char *p) -{ - reserve_kernel_ebi1_size = memparse(p, NULL); - return 0; -} -early_param("reserve_kernel_ebi1_size", reserve_kernel_ebi1_size_setup); - -static unsigned reserve_audio_size = MSM_RESERVE_AUDIO_SIZE; -static int __init reserve_audio_size_setup(char *p) -{ - reserve_audio_size = memparse(p, NULL); - return 0; -} -early_param("reserve_audio_size", reserve_audio_size_setup); - -static void fix_sizes(void) -{ - if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { - reserve_mdp_size = MSM7x25A_MSM_RESERVE_MDP_SIZE; - reserve_adsp_size = MSM7x25A_MSM_RESERVE_ADSP_SIZE; - } else { - reserve_mdp_size = MSM_RESERVE_MDP_SIZE; - reserve_adsp_size = MSM_RESERVE_ADSP_SIZE; - } - - if (get_ddr_size() > SZ_512M) - reserve_adsp_size = CAMERA_ZSL_SIZE; -#ifdef CONFIG_ION_MSM - msm_ion_camera_size = reserve_adsp_size; - msm_ion_audio_size = (MSM_RESERVE_AUDIO_SIZE + - RESERVE_KERNEL_EBI1_SIZE); - msm_ion_sf_size = reserve_mdp_size; -#endif -} - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_co_heap_pdata co_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; -#endif - -/** - * These heaps are listed in the order they will be allocated. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap msm7627a_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - /* ION_ADSP = CAMERA */ - { - .id = ION_CAMERA_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_CAMERA_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* ION_AUDIO */ - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* ION_MDP = SF */ - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, -#endif -}; - -static struct ion_platform_data ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .has_outer_cache = 1, - .heaps = msm7627a_heaps, -}; - -static struct platform_device ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &ion_pdata }, -}; -#endif - -static struct memtype_reserve msm7x27a_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -#ifdef CONFIG_MSM_RTB -static void __init reserve_rtb_memory(void) -{ - msm7x27a_reserve_table[MEMTYPE_EBI1].size += msm7x27a_rtb_pdata.size; -} -#else -static void __init reserve_rtb_memory(void) -{ -} -#endif - -static void __init size_ion_devices(void) -{ -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - ion_pdata.heaps[1].size = msm_ion_camera_size; - ion_pdata.heaps[2].size = msm_ion_audio_size; - ion_pdata.heaps[3].size = msm_ion_sf_size; -#endif -} - -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - msm7x27a_reserve_table[MEMTYPE_EBI1].size += msm_ion_camera_size; - msm7x27a_reserve_table[MEMTYPE_EBI1].size += msm_ion_audio_size; - msm7x27a_reserve_table[MEMTYPE_EBI1].size += msm_ion_sf_size; -#endif -} - -static void __init msm7x27a_calculate_reserve_sizes(void) -{ - fix_sizes(); - size_ion_devices(); - reserve_ion_memory(); - reserve_rtb_memory(); -} - -static int msm7x27a_paddr_to_memtype(unsigned int paddr) -{ - return MEMTYPE_EBI1; -} - -static struct reserve_info msm7x27a_reserve_info __initdata = { - .memtype_reserve_table = msm7x27a_reserve_table, - .calculate_reserve_sizes = msm7x27a_calculate_reserve_sizes, - .paddr_to_memtype = msm7x27a_paddr_to_memtype, -}; - -static void __init msm7x27a_reserve(void) -{ - reserve_info = &msm7x27a_reserve_info; - msm_reserve(); -} - -static void __init msm8625_reserve(void) -{ - msm7x27a_reserve(); - memblock_remove(MSM8625_CPU_PHYS, SZ_8); - memblock_remove(MSM8625_WARM_BOOT_PHYS, SZ_32); -} - -static void __init msm7x27a_device_i2c_init(void) -{ - msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata; - msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata; -} - -static void __init msm8625_device_i2c_init(void) -{ - msm8625_gsbi0_qup_i2c_device.dev.platform_data = - &msm_gsbi0_qup_i2c_pdata; - msm8625_gsbi1_qup_i2c_device.dev.platform_data = - &msm_gsbi1_qup_i2c_pdata; -} - -#define MSM_EBI2_PHYS 0xa0d00000 -#define MSM_EBI2_XMEM_CS2_CFG1 0xa0d10030 - -static void __init msm7x27a_init_ebi2(void) -{ - uint32_t ebi2_cfg; - void __iomem *ebi2_cfg_ptr; - - ebi2_cfg_ptr = ioremap_nocache(MSM_EBI2_PHYS, sizeof(uint32_t)); - if (!ebi2_cfg_ptr) - return; - - ebi2_cfg = readl(ebi2_cfg_ptr); - if (machine_is_msm7x27a_rumi3() || machine_is_msm7x27a_surf() || - machine_is_msm7625a_surf() || machine_is_msm8625_surf()) - ebi2_cfg |= (1 << 4); /* CS2 */ - - writel(ebi2_cfg, ebi2_cfg_ptr); - iounmap(ebi2_cfg_ptr); - - /* Enable A/D MUX[bit 31] from EBI2_XMEM_CS2_CFG1 */ - ebi2_cfg_ptr = ioremap_nocache(MSM_EBI2_XMEM_CS2_CFG1, - sizeof(uint32_t)); - if (!ebi2_cfg_ptr) - return; - - ebi2_cfg = readl(ebi2_cfg_ptr); - if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf()) - ebi2_cfg |= (1 << 31); - - writel(ebi2_cfg, ebi2_cfg_ptr); - iounmap(ebi2_cfg_ptr); -} - -static struct platform_device msm_proccomm_regulator_dev = { - .name = PROCCOMM_REGULATOR_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &msm7x27a_proccomm_regulator_data - } -}; - -static void msm_adsp_add_pdev(void) -{ - int rc = 0; - struct rpc_board_dev *rpc_adsp_pdev; - - rpc_adsp_pdev = kzalloc(sizeof(struct rpc_board_dev), GFP_KERNEL); - if (rpc_adsp_pdev == NULL) { - pr_err("%s: Memory Allocation failure\n", __func__); - return; - } - rpc_adsp_pdev->prog = ADSP_RPC_PROG; - - if (cpu_is_msm8625() || cpu_is_msm8625q()) - rpc_adsp_pdev->pdev = msm8625_device_adsp; - else - rpc_adsp_pdev->pdev = msm_adsp_device; - rc = msm_rpc_add_board_dev(rpc_adsp_pdev, 1); - if (rc < 0) { - pr_err("%s: return val: %d\n", __func__, rc); - kfree(rpc_adsp_pdev); - } -} - -static void __init msm7627a_rumi3_init(void) -{ - msm7x27a_init_ebi2(); - platform_add_devices(rumi_sim_devices, - ARRAY_SIZE(rumi_sim_devices)); -} - -static void __init msm8625_rumi3_init(void) -{ - msm7x2x_misc_init(); - msm_adsp_add_pdev(); - msm8625_device_i2c_init(); - platform_add_devices(msm8625_rumi3_devices, - ARRAY_SIZE(msm8625_rumi3_devices)); - - msm_pm_set_platform_data(msm8625_pm_data, - ARRAY_SIZE(msm8625_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_8625_boot_pdata)); - msm8x25_spm_device_init(); - msm_pm_register_cpr_ops(); -} - -#define UART1DM_RX_GPIO 45 - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) -static int __init msm7x27a_init_ar6000pm(void) -{ - msm_wlan_ar6000_pm_device.dev.platform_data = &ar600x_wlan_power; - return platform_device_register(&msm_wlan_ar6000_pm_device); -} -#else -static int __init msm7x27a_init_ar6000pm(void) { return 0; } -#endif - -static void __init msm7x27a_init_regulators(void) -{ - int rc = platform_device_register(&msm_proccomm_regulator_dev); - if (rc) - pr_err("%s: could not register regulator device: %d\n", - __func__, rc); -} - -static void __init msm7x27a_add_footswitch_devices(void) -{ - platform_add_devices(msm_footswitch_devices, - msm_num_footswitch_devices); -} - -static void __init msm7x27a_add_platform_devices(void) -{ - if (machine_is_msm8625_surf() || machine_is_msm8625_ffa()) { - platform_add_devices(msm8625_surf_devices, - ARRAY_SIZE(msm8625_surf_devices)); - } else { - platform_add_devices(msm7627a_surf_ffa_devices, - ARRAY_SIZE(msm7627a_surf_ffa_devices)); - } - - platform_add_devices(common_devices, - ARRAY_SIZE(common_devices)); -} - -static void __init msm7x27a_uartdm_config(void) -{ - msm7x27a_cfg_uart2dm_serial(); - msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO); - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm8625_device_uart_dm1.dev.platform_data = - &msm_uart_dm1_pdata; - else - msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata; -} - -static void __init msm7x27a_otg_gadget(void) -{ - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - msm_otg_pdata.swfi_latency = - msm8625_pm_data[MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT].latency; - msm8625_device_otg.dev.platform_data = &msm_otg_pdata; - msm8625_device_gadget_peripheral.dev.platform_data = - &msm_gadget_pdata; - } else { - msm_otg_pdata.swfi_latency = - msm7x27a_pm_data[ - MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_otg.dev.platform_data = &msm_otg_pdata; - msm_device_gadget_peripheral.dev.platform_data = - &msm_gadget_pdata; - } -} - -static void __init msm7x27a_pm_init(void) -{ - if (machine_is_msm8625_surf() || machine_is_msm8625_ffa()) { - msm_pm_set_platform_data(msm8625_pm_data, - ARRAY_SIZE(msm8625_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_8625_boot_pdata)); - msm8x25_spm_device_init(); - msm_pm_register_cpr_ops(); - } else { - msm_pm_set_platform_data(msm7x27a_pm_data, - ARRAY_SIZE(msm7x27a_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - } - - msm_pm_register_irqs(); -} - -static void __init msm7x2x_init(void) -{ - msm7x2x_misc_init(); - - /* Initialize regulators first so that other devices can use them */ - msm7x27a_init_regulators(); - msm_adsp_add_pdev(); - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm8625_device_i2c_init(); - else - msm7x27a_device_i2c_init(); - msm7x27a_init_ebi2(); - msm7x27a_uartdm_config(); - - msm7x27a_otg_gadget(); - msm7x27a_cfg_smsc911x(); - - msm7x27a_add_footswitch_devices(); - msm7x27a_add_platform_devices(); - /* Ensure ar6000pm device is registered before MMC/SDC */ - msm7x27a_init_ar6000pm(); - msm7627a_init_mmc(); - msm_fb_add_devices(); - msm7x2x_init_host(); - msm7x27a_pm_init(); - register_i2c_devices(); -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - msm7627a_bt_power_init(); -#endif - msm7627a_camera_init(); - msm7627a_add_io_devices(); - /*7x25a kgsl initializations*/ - msm7x25a_kgsl_3d0_init(); - /*8x25 kgsl initializations*/ - msm8x25_kgsl_3d0_init(); -} - -static void __init msm7x2x_init_early(void) -{ - msm_msm7627a_allocate_memory_regions(); -} - -MACHINE_START(MSM7X27A_RUMI3, "QCT MSM7x27a RUMI3") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7x27a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm7627a_rumi3_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7X27A_SURF, "QCT MSM7x27a SURF") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7x27a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7X27A_FFA, "QCT MSM7x27a FFA") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7x27a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7625A_SURF, "QCT MSM7625a SURF") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7x27a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7625A_FFA, "QCT MSM7625a FFA") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7x27a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM8625_RUMI3, "QCT MSM8625 RUMI3") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm8625_rumi3_init, - .timer = &msm_timer, - .smp = &msm8625_smp_ops, -MACHINE_END -MACHINE_START(MSM8625_SURF, "QCT MSM8625 SURF") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END -MACHINE_START(MSM8625_FFA, "QCT MSM8625 FFA") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm7x2x_init, - .timer = &msm_timer, - .init_early = msm7x2x_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-msm7x30-regulator.c b/arch/arm/mach-msm/board-msm7x30-regulator.c deleted file mode 100644 index 193da15544a2..000000000000 --- a/arch/arm/mach-msm/board-msm7x30-regulator.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "board-msm7x30-regulator.h" - -#define PCOM_VREG_CONSUMERS(name) \ - static struct regulator_consumer_supply __pcom_vreg_supply_##name[] - -#define PCOM_VREG_CONSTRAINT_LVSW(_name, _always_on, _boot_on, _supply_uV) \ -{ \ - .name = #_name, \ - .min_uV = 0, \ - .max_uV = 0, \ - .input_uV = _supply_uV, \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .apply_uV = 0, \ - .boot_on = _boot_on, \ - .always_on = _always_on \ -} - -#define PCOM_VREG_CONSTRAINT_DYN(_name, _min_uV, _max_uV, _always_on, \ - _boot_on, _apply_uV, _supply_uV) \ -{ \ - .name = #_name, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, \ - .input_uV = _supply_uV, \ - .apply_uV = _apply_uV, \ - .boot_on = _boot_on, \ - .always_on = _always_on \ -} - - -#define PCOM_VREG_INIT(_name, _supply, _constraints)\ -{ \ - .supply_regulator = _supply, \ - .consumer_supplies = __pcom_vreg_supply_##_name, \ - .num_consumer_supplies = ARRAY_SIZE(__pcom_vreg_supply_##_name), \ - .constraints = _constraints \ -} - -#define PCOM_VREG_SMP(_name, _id, _supply, _min_uV, _max_uV, _rise_time, \ - _pulldown, _always_on, _boot_on, _apply_uV, _supply_uV) \ -{ \ - .init_data = PCOM_VREG_INIT(_name, _supply, \ - PCOM_VREG_CONSTRAINT_DYN(_name, _min_uV, _max_uV, _always_on, \ - _boot_on, _apply_uV, _supply_uV)), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = _pulldown, \ - .negative = 0, \ -} - -#define PCOM_VREG_LDO PCOM_VREG_SMP - -#define PCOM_VREG_LVS(_name, _id, _supply, _rise_time, _pulldown, _always_on, \ - _boot_on) \ -{ \ - .init_data = PCOM_VREG_INIT(_name, _supply, \ - PCOM_VREG_CONSTRAINT_LVSW(_name, _always_on, _boot_on, 0)), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = _pulldown, \ - .negative = 0, \ -} - -#define PCOM_VREG_NCP(_name, _id, _supply, _min_uV, _max_uV, _rise_time, \ - _always_on, _boot_on, _apply_uV, _supply_uV) \ -{ \ - .init_data = PCOM_VREG_INIT(_name, _supply, \ - PCOM_VREG_CONSTRAINT_DYN(_name, -(_min_uV), -(_max_uV), \ - _always_on, _boot_on, _apply_uV, _supply_uV)), \ - .id = _id, \ - .rise_time = _rise_time, \ - .pulldown = -1, \ - .negative = 1, \ -} - -PCOM_VREG_CONSUMERS(smps0) = { - REGULATOR_SUPPLY("smps0", NULL), - REGULATOR_SUPPLY("msmc1", NULL), -}; - -PCOM_VREG_CONSUMERS(smps1) = { - REGULATOR_SUPPLY("smps1", NULL), - REGULATOR_SUPPLY("msmc2", NULL), -}; - -PCOM_VREG_CONSUMERS(smps2) = { - REGULATOR_SUPPLY("smps2", NULL), - REGULATOR_SUPPLY("s2", NULL), -}; - -PCOM_VREG_CONSUMERS(smps3) = { - REGULATOR_SUPPLY("smps3", NULL), - REGULATOR_SUPPLY("s3", NULL), -}; - -PCOM_VREG_CONSUMERS(smps4) = { - REGULATOR_SUPPLY("smps4", NULL), - REGULATOR_SUPPLY("s4", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo00) = { - REGULATOR_SUPPLY("ldo00", NULL), - REGULATOR_SUPPLY("ldo0", NULL), - REGULATOR_SUPPLY("gp3", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo02) = { - REGULATOR_SUPPLY("ldo02", NULL), - REGULATOR_SUPPLY("ldo2", NULL), - REGULATOR_SUPPLY("xo_out", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo03) = { - REGULATOR_SUPPLY("ldo03", NULL), - REGULATOR_SUPPLY("ldo3", NULL), - REGULATOR_SUPPLY("ruim", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo04) = { - REGULATOR_SUPPLY("ldo04", NULL), - REGULATOR_SUPPLY("ldo4", NULL), - REGULATOR_SUPPLY("tcxo", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo05) = { - REGULATOR_SUPPLY("ldo05", NULL), - REGULATOR_SUPPLY("ldo5", NULL), - REGULATOR_SUPPLY("mmc", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo06) = { - REGULATOR_SUPPLY("ldo06", NULL), - REGULATOR_SUPPLY("ldo6", NULL), - REGULATOR_SUPPLY("usb", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo07) = { - REGULATOR_SUPPLY("ldo07", NULL), - REGULATOR_SUPPLY("ldo7", NULL), - REGULATOR_SUPPLY("usb2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo08) = { - REGULATOR_SUPPLY("ldo08", NULL), - REGULATOR_SUPPLY("ldo8", NULL), - REGULATOR_SUPPLY("gp7", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo09) = { - REGULATOR_SUPPLY("ldo09", NULL), - REGULATOR_SUPPLY("ldo9", NULL), - REGULATOR_SUPPLY("gp1", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo10) = { - REGULATOR_SUPPLY("ldo10", NULL), - REGULATOR_SUPPLY("gp4", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo11) = { - REGULATOR_SUPPLY("ldo11", NULL), - REGULATOR_SUPPLY("gp2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo12) = { - REGULATOR_SUPPLY("ldo12", NULL), - REGULATOR_SUPPLY("gp9", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo13) = { - REGULATOR_SUPPLY("ldo13", NULL), - REGULATOR_SUPPLY("wlan", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo14) = { - REGULATOR_SUPPLY("ldo14", NULL), - REGULATOR_SUPPLY("rf", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo15) = { - REGULATOR_SUPPLY("ldo15", NULL), - REGULATOR_SUPPLY("gp6", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo16) = { - REGULATOR_SUPPLY("ldo16", NULL), - REGULATOR_SUPPLY("gp10", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo17) = { - REGULATOR_SUPPLY("ldo17", NULL), - REGULATOR_SUPPLY("gp11", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo18) = { - REGULATOR_SUPPLY("ldo18", NULL), - REGULATOR_SUPPLY("gp12", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo19) = { - REGULATOR_SUPPLY("ldo19", NULL), - REGULATOR_SUPPLY("wlan2", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo20) = { - REGULATOR_SUPPLY("ldo20", NULL), - REGULATOR_SUPPLY("gp13", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo21) = { - REGULATOR_SUPPLY("ldo21", NULL), - REGULATOR_SUPPLY("gp14", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo22) = { - REGULATOR_SUPPLY("ldo22", NULL), - REGULATOR_SUPPLY("gp15", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo23) = { - REGULATOR_SUPPLY("ldo23", NULL), - REGULATOR_SUPPLY("gp5", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo24) = { - REGULATOR_SUPPLY("ldo24", NULL), - REGULATOR_SUPPLY("gp16", NULL), -}; - -PCOM_VREG_CONSUMERS(ldo25) = { - REGULATOR_SUPPLY("ldo25", NULL), - REGULATOR_SUPPLY("gp17", NULL), -}; - -PCOM_VREG_CONSUMERS(lvsw0) = { - REGULATOR_SUPPLY("lvsw0", NULL), - REGULATOR_SUPPLY("lvs0", NULL), -}; - -PCOM_VREG_CONSUMERS(lvsw1) = { - REGULATOR_SUPPLY("lvsw1", NULL), - REGULATOR_SUPPLY("lvs1", NULL), -}; - -PCOM_VREG_CONSUMERS(ncp) = { - REGULATOR_SUPPLY("ncp", NULL), -}; - -/* This list needs to be verified against actual 7x30 hardware requirements. */ -static struct proccomm_regulator_info msm7x30_pcom_vreg_info[] = { - /* Standard regulators (SMPS and LDO) - * R = rise time (us) - * P = pulldown (1 = pull down, 0 = float, -1 = don't care) - * A = always on - * B = boot on - * V = automatic voltage set (meaningful for single-voltage regs only) - * S = supply voltage (uV) - * name id supp min uV max uV R P A B V S */ - PCOM_VREG_SMP(smps0, 3, NULL, 500000, 1500000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps1, 4, NULL, 500000, 1500000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps2, 28, NULL, 1300000, 1300000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps3, 29, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_SMP(smps4, 43, NULL, 2200000, 2200000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo00, 5, NULL, 1200000, 1200000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo02, 46, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo03, 19, NULL, 1800000, 3000000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo04, 9, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo05, 18, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo06, 16, NULL, 3075000, 3400000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo07, 44, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo08, 32, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo09, 8, NULL, 2050000, 2050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo10, 7, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo11, 21, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo12, 34, NULL, 1800000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo13, 15, NULL, 2900000, 3050000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo14, 24, NULL, 2850000, 2850000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo15, 23, NULL, 3050000, 3100000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo16, 35, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo17, 36, NULL, 2600000, 2600000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo18, 37, NULL, 2200000, 2200000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo19, 45, NULL, 2400000, 2500000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo20, 38, NULL, 1500000, 1800000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo21, 39, NULL, 1100000, 1100000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo22, 40, NULL, 1200000, 1300000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo23, 22, NULL, 1350000, 1350000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo24, 41, NULL, 1200000, 1200000, 0, -1, 0, 0, 0, 0), - PCOM_VREG_LDO(ldo25, 42, NULL, 1200000, 1200000, 0, -1, 0, 0, 0, 0), - - /* Low-voltage switches */ - PCOM_VREG_LVS(lvsw0, 47, NULL, 0, -1, 0, 0), - PCOM_VREG_LVS(lvsw1, 48, NULL, 0, -1, 0, 0), - - PCOM_VREG_NCP(ncp, 31, NULL, -1800000, -1800000, 0, 0, 0, 0, 0), -}; - -struct proccomm_regulator_platform_data msm7x30_proccomm_regulator_data = { - .regs = msm7x30_pcom_vreg_info, - .nregs = ARRAY_SIZE(msm7x30_pcom_vreg_info) -}; diff --git a/arch/arm/mach-msm/board-msm7x30-regulator.h b/arch/arm/mach-msm/board-msm7x30-regulator.h deleted file mode 100644 index 12a91228c4ec..000000000000 --- a/arch/arm/mach-msm/board-msm7x30-regulator.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_7X30_REGULATOR_H__ -#define __ARCH_ARM_MACH_MSM_BOARD_7X30_REGULATOR_H__ - -#include "proccomm-regulator.h" - -extern struct proccomm_regulator_platform_data msm7x30_proccomm_regulator_data; - -#endif diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c deleted file mode 100644 index e83f4403c3c9..000000000000 --- a/arch/arm/mach-msm/board-msm7x30.c +++ /dev/null @@ -1,7402 +0,0 @@ -/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_SPI_QSD -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "devices.h" -#include "timer.h" -#ifdef CONFIG_USB_G_ANDROID -#include -#include -#endif -#include "pm.h" -#include "pm-boot.h" -#include "spm.h" -#include "acpuclock.h" -#include "clock.h" -#include -#include -#include -#include -#include -#include "smd_private.h" -#include - -#include "board-msm7x30-regulator.h" -#include "pm.h" - -#define MSM_PMEM_SF_SIZE 0x1700000 -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_PRIM_BUF_SIZE (864 * 480 * 4 * 3) /* 4bpp * 3 Pages */ -#else -#define MSM_FB_PRIM_BUF_SIZE (864 * 480 * 4 * 2) /* 4bpp * 2 Pages */ -#endif -/* - * Reserve space for double buffered full screen - * res V4L2 video overlay - i.e. 1280x720x1.5x2 - */ -#define MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE 2764800 - -#ifdef CONFIG_FB_MSM_HDMI_ADV7520_PANEL -#define MSM_FB_EXT_BUF_SIZE (1280 * 720 * 2 * 1) /* 2 bpp x 1 page */ -#else -#define MSM_FB_EXT_BUF_SIZE 0 -#endif - -#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK -/* width x height x 3 bpp x 2 frame buffer */ -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE roundup((864 * 480 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE 0 -#endif - -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE + MSM_FB_EXT_BUF_SIZE, 4096) - -#define MSM_PMEM_ADSP_SIZE 0x1E00000 -#define MSM_FLUID_PMEM_ADSP_SIZE 0x2800000 -#define PMEM_KERNEL_EBI0_SIZE 0x600000 -#define MSM_PMEM_AUDIO_SIZE 0x200000 - -#ifdef CONFIG_ION_MSM -static struct platform_device ion_dev; -#define MSM_ION_AUDIO_SIZE (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI0_SIZE) -#define MSM_ION_SF_SIZE MSM_PMEM_SF_SIZE -#define MSM_ION_HEAP_NUM 4 -#endif - -#define PMIC_GPIO_INT 27 -#define PMIC_VREG_WLAN_LEVEL 2900 -#define PMIC_GPIO_SD_DET 36 -#define PMIC_GPIO_SDC4_EN_N 17 /* PMIC GPIO Number 18 */ -#define PMIC_GPIO_HDMI_5V_EN_V3 32 /* PMIC GPIO for V3 H/W */ -#define PMIC_GPIO_HDMI_5V_EN_V2 39 /* PMIC GPIO for V2 H/W */ - -#define ADV7520_I2C_ADDR 0x39 - -#define FPGA_SDCC_STATUS 0x8E0001A8 - -#define FPGA_OPTNAV_GPIO_ADDR 0x8E000026 -#define OPTNAV_I2C_SLAVE_ADDR (0xB0 >> 1) -#define OPTNAV_IRQ 20 -#define OPTNAV_CHIP_SELECT 19 -#define PMIC_GPIO_SDC4_PWR_EN_N 24 /* PMIC GPIO Number 25 */ - -/* Macros assume PMIC GPIOs start at 0 */ -#define PM8058_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio + NR_GPIO_IRQS) -#define PM8058_GPIO_SYS_TO_PM(sys_gpio) (sys_gpio - NR_GPIO_IRQS) -#define PM8058_MPP_BASE PM8058_GPIO_PM_TO_SYS(PM8058_GPIOS) -#define PM8058_MPP_PM_TO_SYS(pm_gpio) (pm_gpio + PM8058_MPP_BASE) - -#define PMIC_GPIO_FLASH_BOOST_ENABLE 15 /* PMIC GPIO Number 16 */ -#define PMIC_GPIO_HAP_ENABLE 16 /* PMIC GPIO Number 17 */ - -#define PMIC_GPIO_WLAN_EXT_POR 22 /* PMIC GPIO NUMBER 23 */ - -#define BMA150_GPIO_INT 1 - -#define HAP_LVL_SHFT_MSM_GPIO 24 - -#define PMIC_GPIO_QUICKVX_CLK 37 /* PMIC GPIO 38 */ - -#define PM_FLIP_MPP 5 /* PMIC MPP 06 */ - -#define DDR1_BANK_BASE 0X20000000 -#define DDR2_BANK_BASE 0X40000000 - -static unsigned int phys_add = DDR2_BANK_BASE; -unsigned long ebi1_phys_offset = DDR2_BANK_BASE; -EXPORT_SYMBOL(ebi1_phys_offset); - -struct pm8xxx_gpio_init_info { - unsigned gpio; - struct pm_gpio config; -}; - -static int pm8058_gpios_init(void) -{ - int rc; - - struct pm8xxx_gpio_init_info sdc4_en = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC4_EN_N), - { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_L5, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .out_strength = PM_GPIO_STRENGTH_LOW, - .output_value = 0, - }, - }; - - struct pm8xxx_gpio_init_info sdc4_pwr_en = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC4_PWR_EN_N), - { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_L5, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .out_strength = PM_GPIO_STRENGTH_LOW, - .output_value = 0, - }, - }; - - struct pm8xxx_gpio_init_info haptics_enable = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_ENABLE), - { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .vin_sel = 2, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - }, - }; - - struct pm8xxx_gpio_init_info hdmi_5V_en = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HDMI_5V_EN_V3), - { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_VPH, - .function = PM_GPIO_FUNC_NORMAL, - .out_strength = PM_GPIO_STRENGTH_LOW, - .output_value = 0, - }, - }; - - struct pm8xxx_gpio_init_info flash_boost_enable = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_FLASH_BOOST_ENABLE), - { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_2, - }, - }; - - struct pm8xxx_gpio_init_info gpio23 = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_WLAN_EXT_POR), - { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = 2, - .out_strength = PM_GPIO_STRENGTH_LOW, - .function = PM_GPIO_FUNC_NORMAL, - } - }; - - struct pm8xxx_gpio_init_info sdcc_det = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SD_DET - 1), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_1P5, - .vin_sel = 2, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }; - - if (machine_is_msm7x30_fluid()) - sdcc_det.config.inv_int_pol = 1; - - rc = pm8xxx_gpio_config(sdcc_det.gpio, &sdcc_det.config); - if (rc) { - pr_err("%s PMIC_GPIO_SD_DET config failed\n", __func__); - return rc; - } - - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa() || - machine_is_msm7x30_fluid()) - hdmi_5V_en.gpio = PMIC_GPIO_HDMI_5V_EN_V2; - else - hdmi_5V_en.gpio = PMIC_GPIO_HDMI_5V_EN_V3; - - hdmi_5V_en.gpio = PM8058_GPIO_PM_TO_SYS(hdmi_5V_en.gpio); - - rc = pm8xxx_gpio_config(hdmi_5V_en.gpio, &hdmi_5V_en.config); - if (rc) { - pr_err("%s PMIC_GPIO_HDMI_5V_EN config failed\n", __func__); - return rc; - } - - /* Deassert GPIO#23 (source for Ext_POR on WLAN-Volans) */ - rc = pm8xxx_gpio_config(gpio23.gpio, &gpio23.config); - if (rc) { - pr_err("%s PMIC_GPIO_WLAN_EXT_POR config failed\n", __func__); - return rc; - } - - if (machine_is_msm7x30_fluid()) { - /* Haptics gpio */ - rc = pm8xxx_gpio_config(haptics_enable.gpio, - &haptics_enable.config); - if (rc) { - pr_err("%s: PMIC GPIO %d write failed\n", __func__, - haptics_enable.gpio); - return rc; - } - /* Flash boost gpio */ - rc = pm8xxx_gpio_config(flash_boost_enable.gpio, - &flash_boost_enable.config); - if (rc) { - pr_err("%s: PMIC GPIO %d write failed\n", __func__, - flash_boost_enable.gpio); - return rc; - } - /* SCD4 gpio */ - rc = pm8xxx_gpio_config(sdc4_en.gpio, &sdc4_en.config); - if (rc) { - pr_err("%s PMIC_GPIO_SDC4_EN_N config failed\n", - __func__); - return rc; - } - rc = gpio_request(sdc4_en.gpio, "sdc4_en"); - if (rc) { - pr_err("%s PMIC_GPIO_SDC4_EN_N gpio_request failed\n", - __func__); - return rc; - } - gpio_set_value_cansleep(sdc4_en.gpio, 0); - } - /* FFA -> gpio_25 controls vdd of sdcc4 */ - else { - /* SCD4 gpio_25 */ - rc = pm8xxx_gpio_config(sdc4_pwr_en.gpio, &sdc4_pwr_en.config); - if (rc) { - pr_err("%s PMIC_GPIO_SDC4_PWR_EN_N config failed: %d\n", - __func__, rc); - return rc; - } - - rc = gpio_request(sdc4_pwr_en.gpio, "sdc4_pwr_en"); - if (rc) { - pr_err("PMIC_GPIO_SDC4_PWR_EN_N gpio_req failed: %d\n", - rc); - return rc; - } - } - - return 0; -} - -/* Regulator API support */ - -#ifdef CONFIG_MSM_PROC_COMM_REGULATOR -static struct platform_device msm_proccomm_regulator_dev = { - .name = PROCCOMM_REGULATOR_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &msm7x30_proccomm_regulator_data - } -}; -#endif - -/*virtual key support */ -static ssize_t tma300_vkeys_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return sprintf(buf, - __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":50:842:80:100" - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":170:842:80:100" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":290:842:80:100" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":410:842:80:100" - "\n"); -} - -static struct kobj_attribute tma300_vkeys_attr = { - .attr = { - .mode = S_IRUGO, - }, - .show = &tma300_vkeys_show, -}; - -static struct attribute *tma300_properties_attrs[] = { - &tma300_vkeys_attr.attr, - NULL -}; - -static struct attribute_group tma300_properties_attr_group = { - .attrs = tma300_properties_attrs, -}; - -static struct kobject *properties_kobj; -static struct regulator_bulk_data cyttsp_regs[] = { - { .supply = "ldo8", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo15", .min_uV = 3050000, .max_uV = 3100000 }, -}; - -#define CYTTSP_TS_GPIO_IRQ 150 -static int cyttsp_platform_init(struct i2c_client *client) -{ - int rc = -EINVAL; - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(cyttsp_regs), cyttsp_regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(cyttsp_regs), cyttsp_regs); - - if (rc) { - pr_err("%s: could not set regulator voltages: %d\n", __func__, - rc); - goto regs_free; - } - - rc = regulator_bulk_enable(ARRAY_SIZE(cyttsp_regs), cyttsp_regs); - - if (rc) { - pr_err("%s: could not enable regulators: %d\n", __func__, rc); - goto regs_free; - } - - /* check this device active by reading first byte/register */ - rc = i2c_smbus_read_byte_data(client, 0x01); - if (rc < 0) { - pr_err("%s: i2c sanity check failed\n", __func__); - goto regs_disable; - } - - rc = gpio_tlmm_config(GPIO_CFG(CYTTSP_TS_GPIO_IRQ, 0, GPIO_CFG_INPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_6MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: Could not configure gpio %d\n", - __func__, CYTTSP_TS_GPIO_IRQ); - goto regs_disable; - } - - /* virtual keys */ - tma300_vkeys_attr.attr.name = "virtualkeys.cyttsp-i2c"; - properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (properties_kobj) - rc = sysfs_create_group(properties_kobj, - &tma300_properties_attr_group); - if (!properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", - __func__); - - return CY_OK; - -regs_disable: - regulator_bulk_disable(ARRAY_SIZE(cyttsp_regs), cyttsp_regs); -regs_free: - regulator_bulk_free(ARRAY_SIZE(cyttsp_regs), cyttsp_regs); -out: - return rc; -} - -/* TODO: Put the regulator to LPM / HPM in suspend/resume*/ -static int cyttsp_platform_suspend(struct i2c_client *client) -{ - msleep(20); - - return CY_OK; -} - -static int cyttsp_platform_resume(struct i2c_client *client) -{ - /* add any special code to strobe a wakeup pin or chip reset */ - mdelay(10); - - return CY_OK; -} - -static struct cyttsp_platform_data cyttsp_data = { - .fw_fname = "cyttsp_7630_fluid.hex", - .panel_maxx = 479, - .panel_maxy = 799, - .disp_maxx = 469, - .disp_maxy = 799, - .disp_minx = 10, - .disp_miny = 0, - .flags = 0, - .gen = CY_GEN3, /* or */ - .use_st = CY_USE_ST, - .use_mt = CY_USE_MT, - .use_hndshk = CY_SEND_HNDSHK, - .use_trk_id = CY_USE_TRACKING_ID, - .use_sleep = CY_USE_DEEP_SLEEP_SEL | CY_USE_LOW_POWER_SEL, - .use_gestures = CY_USE_GESTURES, - /* activate up to 4 groups - * and set active distance - */ - .gest_set = CY_GEST_GRP1 | CY_GEST_GRP2 | - CY_GEST_GRP3 | CY_GEST_GRP4 | - CY_ACT_DIST, - /* change act_intrvl to customize the Active power state - * scanning/processing refresh interval for Operating mode - */ - .act_intrvl = CY_ACT_INTRVL_DFLT, - /* change tch_tmout to customize the touch timeout for the - * Active power state for Operating mode - */ - .tch_tmout = CY_TCH_TMOUT_DFLT, - /* change lp_intrvl to customize the Low Power power state - * scanning/processing refresh interval for Operating mode - */ - .lp_intrvl = CY_LP_INTRVL_DFLT, - .resume = cyttsp_platform_resume, - .suspend = cyttsp_platform_suspend, - .init = cyttsp_platform_init, - .sleep_gpio = -1, - .resout_gpio = -1, - .irq_gpio = CYTTSP_TS_GPIO_IRQ, - .correct_fw_ver = 2, -}; - -static int pm8058_pwm_config(struct pwm_device *pwm, int ch, int on) -{ - struct pm_gpio pwm_gpio_config = { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_2, - }; - int rc = -EINVAL; - int id, mode, max_mA; - - id = mode = max_mA = 0; - switch (ch) { - case 0: - case 1: - case 2: - if (on) { - id = 24 + ch; - rc = pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(id - 1), - &pwm_gpio_config); - if (rc) - pr_err("%s: pm8xxx_gpio_config(%d): rc=%d\n", - __func__, id, rc); - } - break; - - case 3: - id = PM_PWM_LED_KPD; - mode = PM_PWM_CONF_DTEST3; - max_mA = 200; - break; - - case 4: - id = PM_PWM_LED_0; - mode = PM_PWM_CONF_PWM1; - max_mA = 40; - break; - - case 5: - id = PM_PWM_LED_2; - mode = PM_PWM_CONF_PWM2; - max_mA = 40; - break; - - case 6: - id = PM_PWM_LED_FLASH; - mode = PM_PWM_CONF_DTEST3; - max_mA = 200; - break; - - default: - break; - } - - if (ch >= 3 && ch <= 6) { - if (!on) { - mode = PM_PWM_CONF_NONE; - max_mA = 0; - } - rc = pm8058_pwm_config_led(pwm, id, mode, max_mA); - if (rc) - pr_err("%s: pm8058_pwm_config_led(ch=%d): rc=%d\n", - __func__, ch, rc); - } - - return rc; -} - -static int pm8058_pwm_enable(struct pwm_device *pwm, int ch, int on) -{ - int rc; - - switch (ch) { - case 7: - rc = pm8058_pwm_set_dtest(pwm, on); - if (rc) - pr_err("%s: pwm_set_dtest(%d): rc=%d\n", - __func__, on, rc); - break; - default: - rc = -EINVAL; - break; - } - return rc; -} - -static const unsigned int fluid_keymap[] = { - KEY(0, 0, KEY_7), - KEY(0, 1, KEY_ENTER), - KEY(0, 2, KEY_UP), - /* drop (0,3) as it always shows up in pair with(0,2) */ - KEY(0, 4, KEY_DOWN), - - KEY(1, 0, KEY_CAMERA_SNAPSHOT), - KEY(1, 1, KEY_SELECT), - KEY(1, 2, KEY_1), - KEY(1, 3, KEY_VOLUMEUP), - KEY(1, 4, KEY_VOLUMEDOWN), -}; - -static const unsigned int surf_keymap[] = { - KEY(0, 0, KEY_7), - KEY(0, 1, KEY_DOWN), - KEY(0, 2, KEY_UP), - KEY(0, 3, KEY_RIGHT), - KEY(0, 4, KEY_ENTER), - KEY(0, 5, KEY_L), - KEY(0, 6, KEY_BACK), - KEY(0, 7, KEY_M), - - KEY(1, 0, KEY_LEFT), - KEY(1, 1, KEY_SEND), - KEY(1, 2, KEY_1), - KEY(1, 3, KEY_4), - KEY(1, 4, KEY_CLEAR), - KEY(1, 5, KEY_MSDOS), - KEY(1, 6, KEY_SPACE), - KEY(1, 7, KEY_COMMA), - - KEY(2, 0, KEY_6), - KEY(2, 1, KEY_5), - KEY(2, 2, KEY_8), - KEY(2, 3, KEY_3), - KEY(2, 4, KEY_NUMERIC_STAR), - KEY(2, 5, KEY_UP), - KEY(2, 6, KEY_DOWN), /* SYN */ - KEY(2, 7, KEY_LEFTSHIFT), - - KEY(3, 0, KEY_9), - KEY(3, 1, KEY_NUMERIC_POUND), - KEY(3, 2, KEY_0), - KEY(3, 3, KEY_2), - KEY(3, 4, KEY_SLEEP), - KEY(3, 5, KEY_F1), - KEY(3, 6, KEY_F2), - KEY(3, 7, KEY_F3), - - KEY(4, 0, KEY_BACK), - KEY(4, 1, KEY_HOME), - KEY(4, 2, KEY_MENU), - KEY(4, 3, KEY_VOLUMEUP), - KEY(4, 4, KEY_VOLUMEDOWN), - KEY(4, 5, KEY_F4), - KEY(4, 6, KEY_F5), - KEY(4, 7, KEY_F6), - - KEY(5, 0, KEY_R), - KEY(5, 1, KEY_T), - KEY(5, 2, KEY_Y), - KEY(5, 3, KEY_LEFTALT), - KEY(5, 4, KEY_KPENTER), - KEY(5, 5, KEY_Q), - KEY(5, 6, KEY_W), - KEY(5, 7, KEY_E), - - KEY(6, 0, KEY_F), - KEY(6, 1, KEY_G), - KEY(6, 2, KEY_H), - KEY(6, 3, KEY_CAPSLOCK), - KEY(6, 4, KEY_PAGEUP), - KEY(6, 5, KEY_A), - KEY(6, 6, KEY_S), - KEY(6, 7, KEY_D), - - KEY(7, 0, KEY_V), - KEY(7, 1, KEY_B), - KEY(7, 2, KEY_N), - KEY(7, 3, KEY_MENU), /* REVISIT - SYM */ - KEY(7, 4, KEY_PAGEDOWN), - KEY(7, 5, KEY_Z), - KEY(7, 6, KEY_X), - KEY(7, 7, KEY_C), - - KEY(8, 0, KEY_P), - KEY(8, 1, KEY_J), - KEY(8, 2, KEY_K), - KEY(8, 3, KEY_INSERT), - KEY(8, 4, KEY_LINEFEED), - KEY(8, 5, KEY_U), - KEY(8, 6, KEY_I), - KEY(8, 7, KEY_O), - - KEY(9, 0, KEY_4), - KEY(9, 1, KEY_5), - KEY(9, 2, KEY_6), - KEY(9, 3, KEY_7), - KEY(9, 4, KEY_8), - KEY(9, 5, KEY_1), - KEY(9, 6, KEY_2), - KEY(9, 7, KEY_3), - - KEY(10, 0, KEY_F7), - KEY(10, 1, KEY_F8), - KEY(10, 2, KEY_F9), - KEY(10, 3, KEY_F10), - KEY(10, 4, KEY_FN), - KEY(10, 5, KEY_9), - KEY(10, 6, KEY_0), - KEY(10, 7, KEY_DOT), - - KEY(11, 0, KEY_LEFTCTRL), - KEY(11, 1, KEY_F11), /* START */ - KEY(11, 2, KEY_ENTER), - KEY(11, 3, KEY_SEARCH), - KEY(11, 4, KEY_DELETE), - KEY(11, 5, KEY_RIGHT), - KEY(11, 6, KEY_LEFT), - KEY(11, 7, KEY_RIGHTSHIFT), -}; - -static struct matrix_keymap_data surf_keymap_data = { - .keymap_size = ARRAY_SIZE(surf_keymap), - .keymap = surf_keymap, -}; - -static struct pm8xxx_keypad_platform_data surf_keypad_data = { - .input_name = "surf_keypad", - .input_phys_device = "surf_keypad/input0", - .num_rows = 12, - .num_cols = 8, - .rows_gpio_start = PM8058_GPIO_PM_TO_SYS(8), - .cols_gpio_start = PM8058_GPIO_PM_TO_SYS(0), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &surf_keymap_data, -}; - -static struct matrix_keymap_data fluid_keymap_data = { - .keymap_size = ARRAY_SIZE(fluid_keymap), - .keymap = fluid_keymap, -}; - -static struct pm8xxx_keypad_platform_data fluid_keypad_data = { - .input_name = "fluid-keypad", - .input_phys_device = "fluid-keypad/input0", - .num_rows = 5, - .num_cols = 5, - .rows_gpio_start = PM8058_GPIO_PM_TO_SYS(8), - .cols_gpio_start = PM8058_GPIO_PM_TO_SYS(0), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &fluid_keymap_data, -}; - -static struct pm8058_pwm_pdata pm8058_pwm_data = { - .config = pm8058_pwm_config, - .enable = pm8058_pwm_enable, -}; - -static struct pmic8058_led pmic8058_ffa_leds[] = { - [0] = { - .name = "keyboard-backlight", - .max_brightness = 15, - .id = PMIC8058_ID_LED_KB_LIGHT, - }, -}; - -static struct pmic8058_leds_platform_data pm8058_ffa_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_ffa_leds), - .leds = pmic8058_ffa_leds, -}; - -static struct pmic8058_led pmic8058_surf_leds[] = { - [0] = { - .name = "keyboard-backlight", - .max_brightness = 15, - .id = PMIC8058_ID_LED_KB_LIGHT, - }, - [1] = { - .name = "voice:red", - .max_brightness = 20, - .id = PMIC8058_ID_LED_0, - }, - [2] = { - .name = "wlan:green", - .max_brightness = 20, - .id = PMIC8058_ID_LED_2, - }, -}; - -static struct pmic8058_leds_platform_data pm8058_surf_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_surf_leds), - .leds = pmic8058_surf_leds, -}; - -static struct pmic8058_led pmic8058_fluid_leds[] = { - [0] = { - .name = "keyboard-backlight", - .max_brightness = 15, - .id = PMIC8058_ID_LED_KB_LIGHT, - }, - [1] = { - .name = "flash:led_0", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_0, - }, - [2] = { - .name = "flash:led_1", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_1, - }, -}; - -static struct pmic8058_leds_platform_data pm8058_fluid_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_fluid_leds), - .leds = pmic8058_fluid_leds, -}; - -static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = { - .irq_base = PMIC8058_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(PMIC_GPIO_INT), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = { - .gpio_base = PM8058_GPIO_PM_TO_SYS(0), -}; - -static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = { - .mpp_base = PM8058_MPP_PM_TO_SYS(0), -}; - -static struct pm8058_platform_data pm8058_7x30_data = { - .irq_pdata = &pm8xxx_irq_pdata, - .gpio_pdata = &pm8xxx_gpio_pdata, - .mpp_pdata = &pm8xxx_mpp_pdata, - .pwm_pdata = &pm8058_pwm_data, -}; - -#ifdef CONFIG_MSM_SSBI -static struct msm_ssbi_platform_data msm7x30_ssbi_pm8058_pdata = { - .rsl_id = "D:PMIC_SSBI", - .controller_type = MSM_SBI_CTRL_SSBI2, - .slave = { - .name = "pm8058-core", - .platform_data = &pm8058_7x30_data, - }, -}; -#endif - -static struct i2c_board_info cy8info[] __initdata = { - { - I2C_BOARD_INFO(CY_I2C_NAME, 0x24), - .platform_data = &cyttsp_data, -#ifndef CY_USE_TIMER - .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ), -#endif /* CY_USE_TIMER */ - }, -}; - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static struct msm_camera_device_platform_data msm_camera_csi_device_data[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .ioclk = { - .vfe_clk_rate = 153600000, - }, - }, - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .ioclk = { - .vfe_clk_rate = 153600000, - }, - }, -}; - -static struct camera_vreg_t msm_7x30_back_cam_vreg[] = { - {"gp2", REG_LDO, 2600000, 2600000, -1}, - {"lvsw1", REG_VS, 0, 0, 0}, -}; - -static uint32_t camera_off_gpio_table[] = { - /* parallel CAMERA interfaces */ - /* RST */ - GPIO_CFG(0, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT2 */ - GPIO_CFG(2, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT3 */ - GPIO_CFG(3, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT4 */ - GPIO_CFG(4, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT5 */ - GPIO_CFG(5, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT6 */ - GPIO_CFG(6, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT7 */ - GPIO_CFG(7, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT8 */ - GPIO_CFG(8, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT9 */ - GPIO_CFG(9, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT10 */ - GPIO_CFG(10, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT11 */ - GPIO_CFG(11, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* PCLK */ - GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* HSYNC_IN */ - GPIO_CFG(13, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* VSYNC_IN */ - GPIO_CFG(14, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* MCLK */ - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static uint32_t camera_on_gpio_table[] = { - /* parallel CAMERA interfaces */ - /* RST */ - GPIO_CFG(0, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT2 */ - GPIO_CFG(2, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT3 */ - GPIO_CFG(3, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT4 */ - GPIO_CFG(4, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT5 */ - GPIO_CFG(5, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT6 */ - GPIO_CFG(6, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT7 */ - GPIO_CFG(7, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT8 */ - GPIO_CFG(8, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT9 */ - GPIO_CFG(9, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT10 */ - GPIO_CFG(10, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT11 */ - GPIO_CFG(11, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* PCLK */ - GPIO_CFG(12, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* HSYNC_IN */ - GPIO_CFG(13, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* VSYNC_IN */ - GPIO_CFG(14, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* MCLK */ - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static struct gpio msm7x30_back_cam_gpio[] = { - {0, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl msm7x30_back_cam_gpio_set_tbl[] = { - {0, GPIOF_OUT_INIT_LOW, 1000}, - {0, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_camera_gpio_conf msm_7x30_back_cam_gpio_conf = { - .cam_gpio_req_tbl = msm7x30_back_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm7x30_back_cam_gpio), - .cam_gpio_set_tbl = msm7x30_back_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm7x30_back_cam_gpio_set_tbl), - .camera_off_table = camera_off_gpio_table, - .camera_off_table_size = ARRAY_SIZE(camera_off_gpio_table), - .camera_on_table = camera_on_gpio_table, - .camera_on_table_size = ARRAY_SIZE(camera_on_gpio_table), - .gpio_no_mux = 1, -}; - -static struct msm_camera_sensor_flash_data flash_vx6953 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_vx6953 = { - .mount_angle = 0, - .cam_vreg = msm_7x30_back_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_7x30_back_cam_vreg), - .gpio_conf = &msm_7x30_back_cam_gpio_conf, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_vx6953_data = { - .sensor_name = "vx6953", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_vx6953, - .sensor_platform_info = &sensor_board_info_vx6953, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, -}; - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -void __init msm7x30_init_cam(void) -{ - platform_device_register(&msm_camera_server); - platform_device_register(&msm_device_csic0); - platform_device_register(&msm_device_vfe); - platform_device_register(&msm_device_vpe); -} - -#ifdef CONFIG_I2C -static struct i2c_board_info msm_camera_boardinfo[] = { - { - I2C_BOARD_INFO("vx6953", 0x20), - .platform_data = &msm_camera_sensor_vx6953_data, - }, -}; -#endif -#else -static struct i2c_board_info msm_camera_boardinfo[] __initdata = { -#ifdef CONFIG_MT9D112 - { - I2C_BOARD_INFO("mt9d112", 0x78 >> 1), - }, -#endif -#ifdef CONFIG_WEBCAM_OV9726 - { - I2C_BOARD_INFO("ov9726", 0x10), - }, -#endif -#ifdef CONFIG_S5K3E2FX - { - I2C_BOARD_INFO("s5k3e2fx", 0x20 >> 1), - }, -#endif -#ifdef CONFIG_MT9P012 - { - I2C_BOARD_INFO("mt9p012", 0x6C >> 1), - }, -#endif -#ifdef CONFIG_VX6953 - { - I2C_BOARD_INFO("vx6953", 0x20), - }, -#endif -#ifdef CONFIG_MT9E013 - { - I2C_BOARD_INFO("mt9e013", 0x6C >> 2), - }, -#endif -#ifdef CONFIG_SN12M0PZ - { - I2C_BOARD_INFO("sn12m0pz", 0x34 >> 1), - }, -#endif -#if defined(CONFIG_MT9T013) || defined(CONFIG_SENSORS_MT9T013) - { - I2C_BOARD_INFO("mt9t013", 0x6C), - }, -#endif - -}; - -#ifdef CONFIG_MSM_CAMERA -#define CAM_STNDBY 143 -static uint32_t camera_off_vcm_gpio_table[] = { -GPIO_CFG(1, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VCM */ -}; - -static uint32_t camera_off_gpio_table[] = { - /* parallel CAMERA interfaces */ - /* RST */ - GPIO_CFG(0, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT2 */ - GPIO_CFG(2, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT3 */ - GPIO_CFG(3, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT4 */ - GPIO_CFG(4, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT5 */ - GPIO_CFG(5, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT6 */ - GPIO_CFG(6, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT7 */ - GPIO_CFG(7, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT8 */ - GPIO_CFG(8, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT9 */ - GPIO_CFG(9, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT10 */ - GPIO_CFG(10, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT11 */ - GPIO_CFG(11, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* PCLK */ - GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* HSYNC_IN */ - GPIO_CFG(13, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* VSYNC_IN */ - GPIO_CFG(14, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* MCLK */ - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static uint32_t camera_on_vcm_gpio_table[] = { -GPIO_CFG(1, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), /* VCM */ -}; - -static uint32_t camera_on_gpio_table[] = { - /* parallel CAMERA interfaces */ - /* RST */ - GPIO_CFG(0, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT2 */ - GPIO_CFG(2, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT3 */ - GPIO_CFG(3, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT4 */ - GPIO_CFG(4, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT5 */ - GPIO_CFG(5, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT6 */ - GPIO_CFG(6, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT7 */ - GPIO_CFG(7, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT8 */ - GPIO_CFG(8, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT9 */ - GPIO_CFG(9, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT10 */ - GPIO_CFG(10, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* DAT11 */ - GPIO_CFG(11, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* PCLK */ - GPIO_CFG(12, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* HSYNC_IN */ - GPIO_CFG(13, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* VSYNC_IN */ - GPIO_CFG(14, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* MCLK */ - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static uint32_t camera_off_gpio_fluid_table[] = { - /* FLUID: CAM_VGA_RST_N */ - GPIO_CFG(31, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* FLUID: CAMIF_STANDBY */ - GPIO_CFG(CAM_STNDBY, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA) -}; - -static uint32_t camera_on_gpio_fluid_table[] = { - /* FLUID: CAM_VGA_RST_N */ - GPIO_CFG(31, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - /* FLUID: CAMIF_STANDBY */ - GPIO_CFG(CAM_STNDBY, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA) -}; - -static void config_gpio_table(uint32_t *table, int len) -{ - int n, rc; - for (n = 0; n < len; n++) { - rc = gpio_tlmm_config(table[n], GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, table[n], rc); - break; - } - } -} -static int config_camera_on_gpios(void) -{ - config_gpio_table(camera_on_gpio_table, - ARRAY_SIZE(camera_on_gpio_table)); - - if (adie_get_detected_codec_type() != TIMPANI_ID) - /* GPIO1 is shared also used in Timpani RF card so - only configure it for non-Timpani RF card */ - config_gpio_table(camera_on_vcm_gpio_table, - ARRAY_SIZE(camera_on_vcm_gpio_table)); - - if (machine_is_msm7x30_fluid()) { - config_gpio_table(camera_on_gpio_fluid_table, - ARRAY_SIZE(camera_on_gpio_fluid_table)); - /* FLUID: turn on 5V booster */ - gpio_set_value( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_FLASH_BOOST_ENABLE), 1); - /* FLUID: drive high to put secondary sensor to STANDBY */ - gpio_set_value(CAM_STNDBY, 1); - } - return 0; -} - -static void config_camera_off_gpios(void) -{ - config_gpio_table(camera_off_gpio_table, - ARRAY_SIZE(camera_off_gpio_table)); - - if (adie_get_detected_codec_type() != TIMPANI_ID) - /* GPIO1 is shared also used in Timpani RF card so - only configure it for non-Timpani RF card */ - config_gpio_table(camera_off_vcm_gpio_table, - ARRAY_SIZE(camera_off_vcm_gpio_table)); - - if (machine_is_msm7x30_fluid()) { - config_gpio_table(camera_off_gpio_fluid_table, - ARRAY_SIZE(camera_off_gpio_fluid_table)); - /* FLUID: turn off 5V booster */ - gpio_set_value( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_FLASH_BOOST_ENABLE), 0); - } -} - -struct resource msm_camera_resources[] = { - { - .start = 0xA6000000, - .end = 0xA6000000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_VFE, - .end = INT_VFE, - .flags = IORESOURCE_IRQ, - }, - { - .flags = IORESOURCE_DMA, - } -}; - -struct msm_camera_device_platform_data msm_camera_device_data = { - .camera_gpio_on = config_camera_on_gpios, - .camera_gpio_off = config_camera_off_gpios, - .ioext.camifpadphy = 0xAB000000, - .ioext.camifpadsz = 0x00000400, - .ioext.csiphy = 0xA6100000, - .ioext.csisz = 0x00000400, - .ioext.csiirq = INT_CSI, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 147456000, -}; - -static struct msm_camera_sensor_flash_src msm_flash_src_pwm = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_PWM, - ._fsrc.pwm_src.freq = 1000, - ._fsrc.pwm_src.max_load = 300, - ._fsrc.pwm_src.low_load = 30, - ._fsrc.pwm_src.high_load = 100, - ._fsrc.pwm_src.channel = 7, -}; - -#ifdef CONFIG_MT9D112 -static struct msm_camera_sensor_flash_data flash_mt9d112 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = { - .sensor_name = "mt9d112", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9d112, - .csi_if = 0 -}; - -static struct platform_device msm_camera_sensor_mt9d112 = { - .name = "msm_camera_mt9d112", - .dev = { - .platform_data = &msm_camera_sensor_mt9d112_data, - }, -}; -#endif - -#ifdef CONFIG_WEBCAM_OV9726 - -static struct msm_camera_sensor_platform_info ov9726_sensor_7630_info = { - .mount_angle = 90 -}; - -static struct msm_camera_sensor_flash_data flash_ov9726 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; -static struct msm_camera_sensor_info msm_camera_sensor_ov9726_data = { - .sensor_name = "ov9726", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_ov9726, - .sensor_platform_info = &ov9726_sensor_7630_info, - .csi_if = 1 -}; -struct platform_device msm_camera_sensor_ov9726 = { - .name = "msm_camera_ov9726", - .dev = { - .platform_data = &msm_camera_sensor_ov9726_data, - }, -}; -#endif - -#ifdef CONFIG_S5K3E2FX -static struct msm_camera_sensor_flash_data flash_s5k3e2fx = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3e2fx_data = { - .sensor_name = "s5k3e2fx", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_s5k3e2fx, - .csi_if = 0 -}; - -static struct platform_device msm_camera_sensor_s5k3e2fx = { - .name = "msm_camera_s5k3e2fx", - .dev = { - .platform_data = &msm_camera_sensor_s5k3e2fx_data, - }, -}; -#endif - -#ifdef CONFIG_MT9P012 -static struct msm_camera_sensor_flash_data flash_mt9p012 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9p012_data = { - .sensor_name = "mt9p012", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 1, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9p012, - .csi_if = 0 -}; - -static struct platform_device msm_camera_sensor_mt9p012 = { - .name = "msm_camera_mt9p012", - .dev = { - .platform_data = &msm_camera_sensor_mt9p012_data, - }, -}; -#endif - -#ifdef CONFIG_MT9E013 -static struct msm_camera_sensor_platform_info mt9e013_sensor_7630_info = { - .mount_angle = 0 -}; - -static struct msm_camera_sensor_flash_data flash_mt9e013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9e013_data = { - .sensor_name = "mt9e013", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 1, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9e013, - .sensor_platform_info = &mt9e013_sensor_7630_info, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_mt9e013 = { - .name = "msm_camera_mt9e013", - .dev = { - .platform_data = &msm_camera_sensor_mt9e013_data, - }, -}; -#endif - -#ifdef CONFIG_VX6953 -static struct msm_camera_sensor_platform_info vx6953_sensor_7630_info = { - .mount_angle = 0 -}; - -static struct msm_camera_sensor_flash_data flash_vx6953 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; -static struct msm_camera_sensor_info msm_camera_sensor_vx6953_data = { - .sensor_name = "vx6953", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .sensor_platform_info = &vx6953_sensor_7630_info, - .flash_data = &flash_vx6953, - .csi_if = 1 -}; -static struct platform_device msm_camera_sensor_vx6953 = { - .name = "msm_camera_vx6953", - .dev = { - .platform_data = &msm_camera_sensor_vx6953_data, - }, -}; -#endif - -#ifdef CONFIG_SN12M0PZ -static struct msm_camera_sensor_flash_src msm_flash_src_current_driver = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_CURRENT_DRIVER, - ._fsrc.current_driver_src.low_current = 210, - ._fsrc.current_driver_src.high_current = 700, - ._fsrc.current_driver_src.driver_channel = &pm8058_fluid_leds_data, -}; - -static struct msm_camera_sensor_flash_data flash_sn12m0pz = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_current_driver -}; -static struct msm_camera_sensor_info msm_camera_sensor_sn12m0pz_data = { - .sensor_name = "sn12m0pz", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 1, - .pdata = &msm_camera_device_data, - .flash_data = &flash_sn12m0pz, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .csi_if = 0 -}; - -static struct platform_device msm_camera_sensor_sn12m0pz = { - .name = "msm_camera_sn12m0pz", - .dev = { - .platform_data = &msm_camera_sensor_sn12m0pz_data, - }, -}; -#endif - -#ifdef CONFIG_MT9T013 -static struct msm_camera_sensor_flash_data flash_mt9t013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src_pwm -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9t013_data = { - .sensor_name = "mt9t013", - .sensor_reset = 0, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9t013, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_mt9t013 = { - .name = "msm_camera_mt9t013", - .dev = { - .platform_data = &msm_camera_sensor_mt9t013_data, - }, -}; -#endif - -#ifdef CONFIG_MSM_VPE -static struct resource msm_vpe_resources[] = { - { - .start = 0xAD200000, - .end = 0xAD200000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_VPE, - .end = INT_VPE, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_vpe_device = { - .name = "msm_vpe", - .id = 0, - .num_resources = ARRAY_SIZE(msm_vpe_resources), - .resource = msm_vpe_resources, -}; -#endif - -#endif /*CONFIG_MSM_CAMERA*/ -#endif - -#ifdef CONFIG_MSM_GEMINI -static struct resource msm_gemini_resources[] = { - { - .start = 0xA3A00000, - .end = 0xA3A00000 + 0x0150 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_JPEG, - .end = INT_JPEG, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_gemini_device = { - .name = "msm_gemini", - .resource = msm_gemini_resources, - .num_resources = ARRAY_SIZE(msm_gemini_resources), -}; -#endif - -#ifdef CONFIG_MSM7KV2_AUDIO -static uint32_t audio_pamp_gpio_config = - GPIO_CFG(82, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - -static uint32_t audio_fluid_icodec_tx_config = - GPIO_CFG(85, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - -static int __init snddev_poweramp_gpio_init(void) -{ - int rc; - - pr_info("snddev_poweramp_gpio_init \n"); - rc = gpio_tlmm_config(audio_pamp_gpio_config, GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, audio_pamp_gpio_config, rc); - } - return rc; -} - -void msm_snddev_tx_route_config(void) -{ - int rc; - - pr_debug("%s()\n", __func__); - - if (machine_is_msm7x30_fluid()) { - rc = gpio_tlmm_config(audio_fluid_icodec_tx_config, - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, audio_fluid_icodec_tx_config, rc); - } else - gpio_set_value(85, 0); - } -} - -void msm_snddev_tx_route_deconfig(void) -{ - int rc; - - pr_debug("%s()\n", __func__); - - if (machine_is_msm7x30_fluid()) { - rc = gpio_tlmm_config(audio_fluid_icodec_tx_config, - GPIO_CFG_DISABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, audio_fluid_icodec_tx_config, rc); - } - } -} - -void msm_snddev_poweramp_on(void) -{ - gpio_set_value(82, 1); /* enable spkr poweramp */ - pr_info("%s: power on amplifier\n", __func__); -} - -void msm_snddev_poweramp_off(void) -{ - gpio_set_value(82, 0); /* disable spkr poweramp */ - pr_info("%s: power off amplifier\n", __func__); -} - -static struct regulator_bulk_data snddev_regs[] = { - { .supply = "gp4", .min_uV = 2600000, .max_uV = 2600000 }, - { .supply = "ncp", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -static int __init snddev_hsed_voltage_init(void) -{ - int rc; - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(snddev_regs), snddev_regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(snddev_regs), snddev_regs); - - if (rc) { - pr_err("%s: could not set regulator voltages: %d\n", - __func__, rc); - goto regs_free; - } - - return 0; - -regs_free: - regulator_bulk_free(ARRAY_SIZE(snddev_regs), snddev_regs); -out: - return rc; -} - - -void msm_snddev_hsed_voltage_on(void) -{ - int rc = regulator_bulk_enable(ARRAY_SIZE(snddev_regs), snddev_regs); - - if (rc) - pr_err("%s: could not enable regulators: %d\n", __func__, rc); -} - -void msm_snddev_hsed_voltage_off(void) -{ - int rc = regulator_bulk_disable(ARRAY_SIZE(snddev_regs), snddev_regs); - - if (rc) { - pr_err("%s: could not disable regulators: %d\n", __func__, rc); - } -} - -static unsigned aux_pcm_gpio_on[] = { - GPIO_CFG(138, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DOUT */ - GPIO_CFG(139, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DIN */ - GPIO_CFG(140, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_SYNC */ - GPIO_CFG(141, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_CLK */ -}; - -static int __init aux_pcm_gpio_init(void) -{ - int pin, rc; - - pr_info("aux_pcm_gpio_init \n"); - for (pin = 0; pin < ARRAY_SIZE(aux_pcm_gpio_on); pin++) { - rc = gpio_tlmm_config(aux_pcm_gpio_on[pin], - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, aux_pcm_gpio_on[pin], rc); - } - } - return rc; -} - -static struct msm_gpio mi2s_clk_gpios[] = { - { GPIO_CFG(145, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_SCLK"}, - { GPIO_CFG(144, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_WS"}, - { GPIO_CFG(120, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_MCLK_A"}, -}; - -static struct msm_gpio mi2s_rx_data_lines_gpios[] = { - { GPIO_CFG(121, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_DATA_SD0_A"}, - { GPIO_CFG(122, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_DATA_SD1_A"}, - { GPIO_CFG(123, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_DATA_SD2_A"}, - { GPIO_CFG(146, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_DATA_SD3"}, -}; - -static struct msm_gpio mi2s_tx_data_lines_gpios[] = { - { GPIO_CFG(146, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MI2S_DATA_SD3"}, -}; - -int mi2s_config_clk_gpio(void) -{ - int rc = 0; - - rc = msm_gpios_request_enable(mi2s_clk_gpios, - ARRAY_SIZE(mi2s_clk_gpios)); - if (rc) { - pr_err("%s: enable mi2s clk gpios failed\n", - __func__); - return rc; - } - return 0; -} - -int mi2s_unconfig_data_gpio(u32 direction, u8 sd_line_mask) -{ - int i, rc = 0; - sd_line_mask &= MI2S_SD_LINE_MASK; - - switch (direction) { - case DIR_TX: - msm_gpios_disable_free(mi2s_tx_data_lines_gpios, 1); - break; - case DIR_RX: - i = 0; - while (sd_line_mask) { - if (sd_line_mask & 0x1) - msm_gpios_disable_free( - mi2s_rx_data_lines_gpios + i , 1); - sd_line_mask = sd_line_mask >> 1; - i++; - } - break; - default: - pr_err("%s: Invaild direction direction = %u\n", - __func__, direction); - rc = -EINVAL; - break; - } - return rc; -} - -int mi2s_config_data_gpio(u32 direction, u8 sd_line_mask) -{ - int i , rc = 0; - u8 sd_config_done_mask = 0; - - sd_line_mask &= MI2S_SD_LINE_MASK; - - switch (direction) { - case DIR_TX: - if ((sd_line_mask & MI2S_SD_0) || (sd_line_mask & MI2S_SD_1) || - (sd_line_mask & MI2S_SD_2) || !(sd_line_mask & MI2S_SD_3)) { - pr_err("%s: can not use SD0 or SD1 or SD2 for TX" - ".only can use SD3. sd_line_mask = 0x%x\n", - __func__ , sd_line_mask); - rc = -EINVAL; - } else { - rc = msm_gpios_request_enable(mi2s_tx_data_lines_gpios, - 1); - if (rc) - pr_err("%s: enable mi2s gpios for TX failed\n", - __func__); - } - break; - case DIR_RX: - i = 0; - while (sd_line_mask && (rc == 0)) { - if (sd_line_mask & 0x1) { - rc = msm_gpios_request_enable( - mi2s_rx_data_lines_gpios + i , 1); - if (rc) { - pr_err("%s: enable mi2s gpios for" - "RX failed. SD line = %s\n", - __func__, - (mi2s_rx_data_lines_gpios + i)->label); - mi2s_unconfig_data_gpio(DIR_RX, - sd_config_done_mask); - } else - sd_config_done_mask |= (1 << i); - } - sd_line_mask = sd_line_mask >> 1; - i++; - } - break; - default: - pr_err("%s: Invaild direction direction = %u\n", - __func__, direction); - rc = -EINVAL; - break; - } - return rc; -} - -int mi2s_unconfig_clk_gpio(void) -{ - msm_gpios_disable_free(mi2s_clk_gpios, ARRAY_SIZE(mi2s_clk_gpios)); - return 0; -} - -#endif /* CONFIG_MSM7KV2_AUDIO */ - -static int __init buses_init(void) -{ - if (gpio_tlmm_config(GPIO_CFG(PMIC_GPIO_INT, 1, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE)) - pr_err("%s: gpio_tlmm_config (gpio=%d) failed\n", - __func__, PMIC_GPIO_INT); - - if (machine_is_msm8x60_fluid()) - pm8058_7x30_data.keypad_pdata = &fluid_keypad_data; - else - pm8058_7x30_data.keypad_pdata = &surf_keypad_data; - - return 0; -} - -#define TIMPANI_RESET_GPIO 1 - -struct bahama_config_register{ - u8 reg; - u8 value; - u8 mask; -}; - -enum version{ - VER_1_0, - VER_2_0, - VER_UNSUPPORTED = 0xFF -}; - -static struct regulator *vreg_marimba_1; -static struct regulator *vreg_marimba_2; -static struct regulator *vreg_bahama; - -static struct msm_gpio timpani_reset_gpio_cfg[] = { -{ GPIO_CFG(TIMPANI_RESET_GPIO, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "timpani_reset"} }; - -static u8 read_bahama_ver(void) -{ - int rc; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA }; - u8 bahama_version; - - rc = marimba_read_bit_mask(&config, 0x00, &bahama_version, 1, 0x1F); - if (rc < 0) { - printk(KERN_ERR - "%s: version read failed: %d\n", - __func__, rc); - return rc; - } else { - printk(KERN_INFO - "%s: version read got: 0x%x\n", - __func__, bahama_version); - } - - switch (bahama_version) { - case 0x08: /* varient of bahama v1 */ - case 0x10: - case 0x00: - return VER_1_0; - case 0x09: /* variant of bahama v2 */ - return VER_2_0; - default: - return VER_UNSUPPORTED; - } -} - -static int config_timpani_reset(void) -{ - int rc; - - rc = msm_gpios_request_enable(timpani_reset_gpio_cfg, - ARRAY_SIZE(timpani_reset_gpio_cfg)); - if (rc < 0) { - printk(KERN_ERR - "%s: msm_gpios_request_enable failed (%d)\n", - __func__, rc); - } - return rc; -} - -static unsigned int msm_timpani_setup_power(void) -{ - int rc; - - rc = config_timpani_reset(); - if (rc < 0) - goto out; - - rc = regulator_enable(vreg_marimba_1); - if (rc) { - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - goto out; - } - - rc = regulator_enable(vreg_marimba_2); - if (rc) { - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - goto disable_marimba_1; - } - - rc = gpio_direction_output(TIMPANI_RESET_GPIO, 1); - if (rc < 0) { - pr_err("%s: gpio_direction_output failed (%d)\n", - __func__, rc); - msm_gpios_free(timpani_reset_gpio_cfg, - ARRAY_SIZE(timpani_reset_gpio_cfg)); - goto disable_marimba_2; - } - - return 0; - -disable_marimba_2: - regulator_disable(vreg_marimba_2); -disable_marimba_1: - regulator_disable(vreg_marimba_1); -out: - return rc; -}; - -static void msm_timpani_shutdown_power(void) -{ - int rc; - - rc = regulator_disable(vreg_marimba_2); - if (rc) - pr_err("%s: regulator_disable failed (%d)\n", __func__, rc); - - rc = regulator_disable(vreg_marimba_1); - if (rc) - pr_err("%s: regulator_disable failed (%d)\n", __func__, rc); - - rc = gpio_direction_output(TIMPANI_RESET_GPIO, 0); - if (rc < 0) - pr_err("%s: gpio_direction_output failed (%d)\n", - __func__, rc); - - msm_gpios_free(timpani_reset_gpio_cfg, - ARRAY_SIZE(timpani_reset_gpio_cfg)); -}; - -static unsigned int msm_bahama_core_config(int type) -{ - int rc = 0; - - if (type == BAHAMA_ID) { - - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA }; - - const struct bahama_config_register v20_init[] = { - /* reg, value, mask */ - { 0xF4, 0x84, 0xFF }, /* AREG */ - { 0xF0, 0x04, 0xFF } /* DREG */ - }; - - if (read_bahama_ver() == VER_2_0) { - for (i = 0; i < ARRAY_SIZE(v20_init); i++) { - u8 value = v20_init[i].value; - rc = marimba_write_bit_mask(&config, - v20_init[i].reg, - &value, - sizeof(v20_init[i].value), - v20_init[i].mask); - if (rc < 0) { - printk(KERN_ERR - "%s: reg %d write failed: %d\n", - __func__, v20_init[i].reg, rc); - return rc; - } - printk(KERN_INFO "%s: reg 0x%02x value 0x%02x" - " mask 0x%02x\n", - __func__, v20_init[i].reg, - v20_init[i].value, v20_init[i].mask); - } - } - } - printk(KERN_INFO "core type: %d\n", type); - - return rc; -} - -static unsigned int msm_bahama_setup_power(void) -{ - int rc = regulator_enable(vreg_bahama); - - if (rc) - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - - return rc; -}; - -static unsigned int msm_bahama_shutdown_power(int value) -{ - int rc = 0; - - if (value != BAHAMA_ID) { - rc = regulator_disable(vreg_bahama); - - if (rc) - pr_err("%s: regulator_disable failed (%d)\n", - __func__, rc); - } - - return rc; -}; - -static struct msm_gpio marimba_svlte_config_clock[] = { - { GPIO_CFG(34, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "MARIMBA_SVLTE_CLOCK_ENABLE" }, -}; - -static unsigned int msm_marimba_gpio_config_svlte(int gpio_cfg_marimba) -{ - if (machine_is_msm8x55_svlte_surf() || - machine_is_msm8x55_svlte_ffa()) { - if (gpio_cfg_marimba) - gpio_set_value(GPIO_PIN - (marimba_svlte_config_clock->gpio_cfg), 1); - else - gpio_set_value(GPIO_PIN - (marimba_svlte_config_clock->gpio_cfg), 0); - } - - return 0; -}; - -static unsigned int msm_marimba_setup_power(void) -{ - int rc; - - rc = regulator_enable(vreg_marimba_1); - if (rc) { - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - goto out; - } - - rc = regulator_enable(vreg_marimba_2); - if (rc) { - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - goto disable_marimba_1; - } - - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa()) { - rc = msm_gpios_request_enable(marimba_svlte_config_clock, - ARRAY_SIZE(marimba_svlte_config_clock)); - if (rc < 0) { - pr_err("%s: msm_gpios_request_enable failed (%d)\n", - __func__, rc); - goto disable_marimba_2; - } - - rc = gpio_direction_output(GPIO_PIN - (marimba_svlte_config_clock->gpio_cfg), 0); - if (rc < 0) { - pr_err("%s: gpio_direction_output failed (%d)\n", - __func__, rc); - goto disable_marimba_2; - } - } - - return 0; - -disable_marimba_2: - regulator_disable(vreg_marimba_2); -disable_marimba_1: - regulator_disable(vreg_marimba_1); -out: - return rc; -}; - -static void msm_marimba_shutdown_power(void) -{ - int rc; - - rc = regulator_disable(vreg_marimba_2); - if (rc) - pr_err("%s: regulator_disable failed (%d)\n", __func__, rc); - - rc = regulator_disable(vreg_marimba_1); - if (rc) - pr_err("%s: regulator_disable failed (%d)\n", __func__, rc); -}; - -static int bahama_present(void) -{ - int id; - switch (id = adie_get_detected_connectivity_type()) { - case BAHAMA_ID: - return 1; - - case MARIMBA_ID: - return 0; - - case TIMPANI_ID: - default: - printk(KERN_ERR "%s: unexpected adie connectivity type: %d\n", - __func__, id); - return -ENODEV; - } -} - -struct regulator *fm_regulator; -static int fm_radio_setup(struct marimba_fm_platform_data *pdata) -{ - int rc, voltage; - uint32_t irqcfg; - const char *id = "FMPW"; - - int bahama_not_marimba = bahama_present(); - - if (bahama_not_marimba < 0) { - pr_warn("%s: bahama_present: %d\n", - __func__, bahama_not_marimba); - rc = -ENODEV; - goto out; - } - if (bahama_not_marimba) { - fm_regulator = regulator_get(NULL, "s3"); - voltage = 1800000; - } else { - fm_regulator = regulator_get(NULL, "s2"); - voltage = 1300000; - } - - if (IS_ERR(fm_regulator)) { - rc = PTR_ERR(fm_regulator); - pr_err("%s: regulator_get failed (%d)\n", __func__, rc); - goto out; - } - - rc = regulator_set_voltage(fm_regulator, voltage, voltage); - - if (rc) { - pr_err("%s: regulator_set_voltage failed (%d)\n", __func__, rc); - goto regulator_free; - } - - rc = regulator_enable(fm_regulator); - - if (rc) { - pr_err("%s: regulator_enable failed (%d)\n", __func__, rc); - goto regulator_free; - } - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, PMAPP_CLOCK_VOTE_ON); - - if (rc < 0) { - pr_err("%s: clock vote failed (%d)\n", __func__, rc); - goto regulator_disable; - } - - /*Request the Clock Using GPIO34/AP2MDM_MRMBCK_EN in case - of svlte*/ - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa()) { - rc = marimba_gpio_config(1); - if (rc < 0) { - pr_err("%s: clock enable for svlte : %d\n", - __func__, rc); - goto clock_devote; - } - } - irqcfg = GPIO_CFG(147, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA); - rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", __func__, irqcfg, rc); - rc = -EIO; - goto gpio_deconfig; - - } - return 0; - -gpio_deconfig: - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa()) - marimba_gpio_config(0); -clock_devote: - pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, PMAPP_CLOCK_VOTE_OFF); -regulator_disable: - regulator_disable(fm_regulator); -regulator_free: - regulator_put(fm_regulator); - fm_regulator = NULL; -out: - return rc; -}; - -static void fm_radio_shutdown(struct marimba_fm_platform_data *pdata) -{ - int rc; - const char *id = "FMPW"; - uint32_t irqcfg = GPIO_CFG(147, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, - GPIO_CFG_2MA); - - int bahama_not_marimba = bahama_present(); - if (bahama_not_marimba == -1) { - pr_warn("%s: bahama_present: %d\n", - __func__, bahama_not_marimba); - return; - } - - rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", __func__, irqcfg, rc); - } - if (!IS_ERR_OR_NULL(fm_regulator)) { - rc = regulator_disable(fm_regulator); - - if (rc) - pr_err("%s: return val: %d\n", __func__, rc); - - regulator_put(fm_regulator); - fm_regulator = NULL; - } - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, - PMAPP_CLOCK_VOTE_OFF); - if (rc < 0) - pr_err("%s: clock_vote return val: %d\n", __func__, rc); - - /*Disable the Clock Using GPIO34/AP2MDM_MRMBCK_EN in case - of svlte*/ - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa()) { - rc = marimba_gpio_config(0); - if (rc < 0) - pr_err("%s: clock disable for svlte : %d\n", - __func__, rc); - } -} - -static struct marimba_fm_platform_data marimba_fm_pdata = { - .fm_setup = fm_radio_setup, - .fm_shutdown = fm_radio_shutdown, - .irq = MSM_GPIO_TO_INT(147), - .vreg_s2 = NULL, - .vreg_xo_out = NULL, - .is_fm_soc_i2s_master = false, - .config_i2s_gpio = NULL, -}; - - -/* Slave id address for FM/CDC/QMEMBIST - * Values can be programmed using Marimba slave id 0 - * should there be a conflict with other I2C devices - * */ -#define MARIMBA_SLAVE_ID_FM_ADDR 0x2A -#define MARIMBA_SLAVE_ID_CDC_ADDR 0x77 -#define MARIMBA_SLAVE_ID_QMEMBIST_ADDR 0X66 - -#define BAHAMA_SLAVE_ID_FM_ADDR 0x2A -#define BAHAMA_SLAVE_ID_QMEMBIST_ADDR 0x7B - -static const char *tsadc_id = "MADC"; - -static struct regulator_bulk_data regs_tsadc_marimba[] = { - { .supply = "gp12", .min_uV = 2200000, .max_uV = 2200000 }, - { .supply = "s2", .min_uV = 1300000, .max_uV = 1300000 }, -}; - -static struct regulator_bulk_data regs_tsadc_timpani[] = { - { .supply = "s3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "gp12", .min_uV = 2200000, .max_uV = 2200000 }, - { .supply = "gp16", .min_uV = 1200000, .max_uV = 1200000 }, -}; - -static struct regulator_bulk_data *regs_tsadc; -static int regs_tsadc_count; - -static int marimba_tsadc_power(int vreg_on) -{ - int rc = 0; - int tsadc_adie_type = adie_get_detected_codec_type(); - - switch (tsadc_adie_type) { - case TIMPANI_ID: - rc = pmapp_clock_vote(tsadc_id, PMAPP_CLOCK_ID_D1, - vreg_on ? PMAPP_CLOCK_VOTE_ON : PMAPP_CLOCK_VOTE_OFF); - if (rc) { - pr_err("%s: unable to %svote for d1 clk\n", - __func__, vreg_on ? "" : "de-"); - goto D1_vote_fail; - } - - /* fall through */ - case MARIMBA_ID: - rc = pmapp_clock_vote(tsadc_id, PMAPP_CLOCK_ID_DO, - vreg_on ? PMAPP_CLOCK_VOTE_ON : PMAPP_CLOCK_VOTE_OFF); - if (rc) { - pr_err("%s: unable to %svote for d1 clk\n", - __func__, vreg_on ? "" : "de-"); - goto D0_vote_fail; - } - - WARN_ON(regs_tsadc_count == 0); - - rc = vreg_on ? - regulator_bulk_enable(regs_tsadc_count, regs_tsadc) : - regulator_bulk_disable(regs_tsadc_count, regs_tsadc); - - if (rc) { - pr_err("%s: regulator %sable failed: %d\n", - __func__, vreg_on ? "en" : "dis", rc); - goto regulator_switch_fail; - } - - break; - default: - pr_err("%s:Adie %d not supported\n", - __func__, tsadc_adie_type); - return -ENODEV; - } - - msleep(5); /* ensure power is stable */ - - return 0; - -regulator_switch_fail: - pmapp_clock_vote(tsadc_id, PMAPP_CLOCK_ID_DO, - vreg_on ? PMAPP_CLOCK_VOTE_OFF : PMAPP_CLOCK_VOTE_ON); -D0_vote_fail: - if (tsadc_adie_type == TIMPANI_ID) - pmapp_clock_vote(tsadc_id, PMAPP_CLOCK_ID_D1, - vreg_on ? PMAPP_CLOCK_VOTE_OFF : PMAPP_CLOCK_VOTE_ON); -D1_vote_fail: - return rc; -} - -static int marimba_tsadc_init(void) -{ - int rc = 0; - int tsadc_adie_type = adie_get_detected_codec_type(); - - switch (tsadc_adie_type) { - case MARIMBA_ID: - regs_tsadc = regs_tsadc_marimba; - regs_tsadc_count = ARRAY_SIZE(regs_tsadc_marimba); - break; - case TIMPANI_ID: - regs_tsadc = regs_tsadc_timpani; - regs_tsadc_count = ARRAY_SIZE(regs_tsadc_timpani); - break; - default: - pr_err("%s:Adie %d not supported\n", - __func__, tsadc_adie_type); - rc = -ENODEV; - goto out; - } - - rc = regulator_bulk_get(NULL, regs_tsadc_count, regs_tsadc); - if (rc) { - pr_err("%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(regs_tsadc_count, regs_tsadc); - if (rc) { - pr_err("%s: could not set regulator voltages: %d\n", - __func__, rc); - goto vreg_free; - } - - return 0; - -vreg_free: - regulator_bulk_free(regs_tsadc_count, regs_tsadc); -out: - regs_tsadc = NULL; - regs_tsadc_count = 0; - return rc; -} - -static int marimba_tsadc_exit(void) -{ - regulator_bulk_free(regs_tsadc_count, regs_tsadc); - regs_tsadc_count = 0; - regs_tsadc = NULL; - - return 0; -} - - -static struct msm_ts_platform_data msm_ts_data = { - .min_x = 284, - .max_x = 3801, - .min_y = 155, - .max_y = 3929, - .min_press = 0, - .max_press = 255, - .inv_x = 4096, - .inv_y = 4096, - .can_wakeup = false, -}; - -static struct marimba_tsadc_platform_data marimba_tsadc_pdata = { - .marimba_tsadc_power = marimba_tsadc_power, - .init = marimba_tsadc_init, - .exit = marimba_tsadc_exit, - .tsadc_prechg_en = true, - .can_wakeup = false, - .setup = { - .pen_irq_en = true, - .tsadc_en = true, - }, - .params2 = { - .input_clk_khz = 2400, - .sample_prd = TSADC_CLK_3, - }, - .params3 = { - .prechg_time_nsecs = 6400, - .stable_time_nsecs = 6400, - .tsadc_test_mode = 0, - }, - .tssc_data = &msm_ts_data, -}; - -static struct regulator_bulk_data codec_regs[] = { - { .supply = "s4", .min_uV = 2200000, .max_uV = 2200000 }, -}; - -static int __init msm_marimba_codec_init(void) -{ - int rc = regulator_bulk_get(NULL, ARRAY_SIZE(codec_regs), codec_regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(codec_regs), codec_regs); - if (rc) { - pr_err("%s: could not set regulator voltages: %d\n", - __func__, rc); - goto reg_free; - } - - return rc; - -reg_free: - regulator_bulk_free(ARRAY_SIZE(codec_regs), codec_regs); -out: - return rc; -} - -static int msm_marimba_codec_power(int vreg_on) -{ - int rc = vreg_on ? - regulator_bulk_enable(ARRAY_SIZE(codec_regs), codec_regs) : - regulator_bulk_disable(ARRAY_SIZE(codec_regs), codec_regs); - - if (rc) { - pr_err("%s: could not %sable regulators: %d", - __func__, vreg_on ? "en" : "dis", rc); - return rc; - } - - return 0; -} - -static struct marimba_codec_platform_data mariba_codec_pdata = { - .marimba_codec_power = msm_marimba_codec_power, -#ifdef CONFIG_MARIMBA_CODEC - .snddev_profile_init = msm_snddev_init, -#endif -}; - -static struct marimba_platform_data marimba_pdata = { - .slave_id[MARIMBA_SLAVE_ID_FM] = MARIMBA_SLAVE_ID_FM_ADDR, - .slave_id[MARIMBA_SLAVE_ID_CDC] = MARIMBA_SLAVE_ID_CDC_ADDR, - .slave_id[MARIMBA_SLAVE_ID_QMEMBIST] = MARIMBA_SLAVE_ID_QMEMBIST_ADDR, - .slave_id[SLAVE_ID_BAHAMA_FM] = BAHAMA_SLAVE_ID_FM_ADDR, - .slave_id[SLAVE_ID_BAHAMA_QMEMBIST] = BAHAMA_SLAVE_ID_QMEMBIST_ADDR, - .marimba_setup = msm_marimba_setup_power, - .marimba_shutdown = msm_marimba_shutdown_power, - .bahama_setup = msm_bahama_setup_power, - .bahama_shutdown = msm_bahama_shutdown_power, - .marimba_gpio_config = msm_marimba_gpio_config_svlte, - .bahama_core_config = msm_bahama_core_config, - .fm = &marimba_fm_pdata, - .codec = &mariba_codec_pdata, - .tsadc_ssbi_adap = MARIMBA_SSBI_ADAP, -}; - -static void __init msm7x30_init_marimba(void) -{ - int rc; - - struct regulator_bulk_data regs[] = { - { .supply = "s3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "gp16", .min_uV = 1200000, .max_uV = 1200000 }, - { .supply = "usb2", .min_uV = 1800000, .max_uV = 1800000 }, - }; - - rc = msm_marimba_codec_init(); - - if (rc) { - pr_err("%s: msm_marimba_codec_init failed (%d)\n", - __func__, rc); - return; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs), regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - return; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs), regs); - - if (rc) { - pr_err("%s: could not set voltages: %d\n", __func__, rc); - regulator_bulk_free(ARRAY_SIZE(regs), regs); - return; - } - - vreg_marimba_1 = regs[0].consumer; - vreg_marimba_2 = regs[1].consumer; - vreg_bahama = regs[2].consumer; -} - -static struct marimba_codec_platform_data timpani_codec_pdata = { - .marimba_codec_power = msm_marimba_codec_power, -#ifdef CONFIG_TIMPANI_CODEC - .snddev_profile_init = msm_snddev_init_timpani, -#endif -}; - -static struct marimba_platform_data timpani_pdata = { - .slave_id[MARIMBA_SLAVE_ID_CDC] = MARIMBA_SLAVE_ID_CDC_ADDR, - .slave_id[MARIMBA_SLAVE_ID_QMEMBIST] = MARIMBA_SLAVE_ID_QMEMBIST_ADDR, - .marimba_setup = msm_timpani_setup_power, - .marimba_shutdown = msm_timpani_shutdown_power, - .codec = &timpani_codec_pdata, - .tsadc = &marimba_tsadc_pdata, - .tsadc_ssbi_adap = MARIMBA_SSBI_ADAP, -}; - -#define TIMPANI_I2C_SLAVE_ADDR 0xD - -static struct i2c_board_info msm_i2c_gsbi7_timpani_info[] = { - { - I2C_BOARD_INFO("timpani", TIMPANI_I2C_SLAVE_ADDR), - .platform_data = &timpani_pdata, - }, -}; - -#ifdef CONFIG_MSM7KV2_AUDIO -static struct resource msm_aictl_resources[] = { - { - .name = "aictl", - .start = 0xa5000100, - .end = 0xa5000100, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mi2s_resources[] = { - { - .name = "hdmi", - .start = 0xac900000, - .end = 0xac900038, - .flags = IORESOURCE_MEM, - }, - { - .name = "codec_rx", - .start = 0xac940040, - .end = 0xac940078, - .flags = IORESOURCE_MEM, - }, - { - .name = "codec_tx", - .start = 0xac980080, - .end = 0xac9800B8, - .flags = IORESOURCE_MEM, - } - -}; - -static struct msm_lpa_platform_data lpa_pdata = { - .obuf_hlb_size = 0x2BFF8, - .dsp_proc_id = 0, - .app_proc_id = 2, - .nosb_config = { - .llb_min_addr = 0, - .llb_max_addr = 0x3ff8, - .sb_min_addr = 0, - .sb_max_addr = 0, - }, - .sb_config = { - .llb_min_addr = 0, - .llb_max_addr = 0x37f8, - .sb_min_addr = 0x3800, - .sb_max_addr = 0x3ff8, - } -}; - -static struct resource msm_lpa_resources[] = { - { - .name = "lpa", - .start = 0xa5000000, - .end = 0xa50000a0, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_aux_pcm_resources[] = { - - { - .name = "aux_codec_reg_addr", - .start = 0xac9c00c0, - .end = 0xac9c00c8, - .flags = IORESOURCE_MEM, - }, - { - .name = "aux_pcm_dout", - .start = 138, - .end = 138, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_din", - .start = 139, - .end = 139, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_syncout", - .start = 140, - .end = 140, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_clkin_a", - .start = 141, - .end = 141, - .flags = IORESOURCE_IO, - }, -}; - -static struct platform_device msm_aux_pcm_device = { - .name = "msm_aux_pcm", - .id = 0, - .num_resources = ARRAY_SIZE(msm_aux_pcm_resources), - .resource = msm_aux_pcm_resources, -}; - -struct platform_device msm_aictl_device = { - .name = "audio_interct", - .id = 0, - .num_resources = ARRAY_SIZE(msm_aictl_resources), - .resource = msm_aictl_resources, -}; - -struct platform_device msm_mi2s_device = { - .name = "mi2s", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mi2s_resources), - .resource = msm_mi2s_resources, -}; - -struct platform_device msm_lpa_device = { - .name = "lpa", - .id = 0, - .num_resources = ARRAY_SIZE(msm_lpa_resources), - .resource = msm_lpa_resources, - .dev = { - .platform_data = &lpa_pdata, - }, -}; -#endif /* CONFIG_MSM7KV2_AUDIO */ - -#define DEC0_FORMAT ((1<> 12; - - qsd_spi_resources[4].start = DMOV_USB_CHAN; - qsd_spi_resources[4].end = DMOV_TSIF_CHAN; - - switch (spi_mux) { - case (1): - qsd_spi_resources[5].start = DMOV_HSUART1_RX_CRCI; - qsd_spi_resources[5].end = DMOV_HSUART1_TX_CRCI; - break; - case (2): - qsd_spi_resources[5].start = DMOV_HSUART2_RX_CRCI; - qsd_spi_resources[5].end = DMOV_HSUART2_TX_CRCI; - break; - case (3): - qsd_spi_resources[5].start = DMOV_CE_OUT_CRCI; - qsd_spi_resources[5].end = DMOV_CE_IN_CRCI; - break; - default: - ret = -ENOENT; - } - - iounmap(ct_adm_base); - - return ret; -} - -static struct platform_device qsd_device_spi = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(qsd_spi_resources), - .resource = qsd_spi_resources, -}; - -#ifdef CONFIG_SPI_QSD -static struct spi_board_info lcdc_sharp_spi_board_info[] __initdata = { - { - .modalias = "lcdc_sharp_ls038y7dx01", - .mode = SPI_MODE_1, - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 26331429, - } -}; -static struct spi_board_info lcdc_toshiba_spi_board_info[] __initdata = { - { - .modalias = "lcdc_toshiba_ltm030dd40", - .mode = SPI_MODE_3|SPI_CS_HIGH, - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 9963243, - } -}; -#endif - -static struct msm_gpio qsd_spi_gpio_config_data[] = { - { GPIO_CFG(45, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_clk" }, - { GPIO_CFG(46, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_cs0" }, - { GPIO_CFG(47, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "spi_mosi" }, - { GPIO_CFG(48, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_miso" }, -}; - -static int msm_qsd_spi_gpio_config(void) -{ - return msm_gpios_request_enable(qsd_spi_gpio_config_data, - ARRAY_SIZE(qsd_spi_gpio_config_data)); -} - -static void msm_qsd_spi_gpio_release(void) -{ - msm_gpios_disable_free(qsd_spi_gpio_config_data, - ARRAY_SIZE(qsd_spi_gpio_config_data)); -} - -static struct msm_spi_platform_data qsd_spi_pdata = { - .max_clock_speed = 26331429, - .gpio_config = msm_qsd_spi_gpio_config, - .gpio_release = msm_qsd_spi_gpio_release, - .dma_config = msm_qsd_spi_dma_config, -}; - -static void __init msm_qsd_spi_init(void) -{ - qsd_device_spi.dev.platform_data = &qsd_spi_pdata; -} - -#ifdef CONFIG_USB_EHCI_MSM_72K -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - int rc; - static int vbus_is_on; - struct pm8xxx_gpio_init_info usb_vbus = { - PM8058_GPIO_PM_TO_SYS(36), - { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 1, - .vin_sel = 2, - .out_strength = PM_GPIO_STRENGTH_MED, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }; - - /* If VBUS is already on (or off), do nothing. */ - if (unlikely(on == vbus_is_on)) - return; - - if (on) { - rc = pm8xxx_gpio_config(usb_vbus.gpio, &usb_vbus.config); - if (rc) { - pr_err("%s PMIC GPIO 36 write failed\n", __func__); - return; - } - } else { - gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS(36), 0); - } - - vbus_is_on = on; -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM), - .vbus_power = msm_hsusb_vbus_power, - .power_budget = 180, -}; -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static int hsusb_rpc_connect(int connect) -{ - if (connect) - return msm_hsusb_rpc_connect(); - else - return msm_hsusb_rpc_close(); -} -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static struct regulator *vreg_3p3; -static int msm_hsusb_ldo_init(int init) -{ - uint32_t version = 0; - int def_vol = 3400000; - - version = socinfo_get_version(); - - if (SOCINFO_VERSION_MAJOR(version) >= 2 && - SOCINFO_VERSION_MINOR(version) >= 1) { - def_vol = 3075000; - pr_debug("%s: default voltage:%d\n", __func__, def_vol); - } - - if (init) { - vreg_3p3 = regulator_get(NULL, "usb"); - if (IS_ERR(vreg_3p3)) - return PTR_ERR(vreg_3p3); - regulator_set_voltage(vreg_3p3, def_vol, def_vol); - } else - regulator_put(vreg_3p3); - - return 0; -} - -static int msm_hsusb_ldo_enable(int enable) -{ - static int ldo_status; - - if (!vreg_3p3 || IS_ERR(vreg_3p3)) - return -ENODEV; - - if (ldo_status == enable) - return 0; - - ldo_status = enable; - - if (enable) - return regulator_enable(vreg_3p3); - else - return regulator_disable(vreg_3p3); -} - -static int msm_hsusb_ldo_set_voltage(int mV) -{ - static int cur_voltage; - - if (!vreg_3p3 || IS_ERR(vreg_3p3)) - return -ENODEV; - - if (cur_voltage == mV) - return 0; - - cur_voltage = mV; - - pr_debug("%s: (%d)\n", __func__, mV); - - return regulator_set_voltage(vreg_3p3, mV*1000, mV*1000); -} -#endif - -#ifndef CONFIG_USB_EHCI_MSM_72K -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init); -#endif -static struct msm_otg_platform_data msm_otg_pdata = { - .rpc_connect = hsusb_rpc_connect, - -#ifndef CONFIG_USB_EHCI_MSM_72K - .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init, -#else - .vbus_power = msm_hsusb_vbus_power, -#endif - .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT, - .cdr_autoreset = CDR_AUTO_RESET_DISABLE, - .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT, - .se1_gating = SE1_GATING_DISABLE, - .chg_vbus_draw = hsusb_chg_vbus_draw, - .chg_connected = hsusb_chg_connected, - .chg_init = hsusb_chg_init, - .ldo_enable = msm_hsusb_ldo_enable, - .ldo_init = msm_hsusb_ldo_init, - .ldo_set_voltage = msm_hsusb_ldo_set_voltage, -}; - -#ifdef CONFIG_USB_GADGET -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = { - .is_phy_status_timer_on = 1, -}; -#endif -#ifndef CONFIG_USB_EHCI_MSM_72K -typedef void (*notify_vbus_state) (int); -notify_vbus_state notify_vbus_state_func_ptr; -int vbus_on_irq; -static irqreturn_t pmic_vbus_on_irq(int irq, void *data) -{ - pr_info("%s: vbus notification from pmic\n", __func__); - - (*notify_vbus_state_func_ptr) (1); - - return IRQ_HANDLED; -} -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) -{ - int ret; - - if (init) { - if (!callback) - return -ENODEV; - - notify_vbus_state_func_ptr = callback; - vbus_on_irq = platform_get_irq_byname(&msm_device_otg, - "vbus_on"); - if (vbus_on_irq <= 0) { - pr_err("%s: unable to get vbus on irq\n", __func__); - return -ENODEV; - } - - ret = request_any_context_irq(vbus_on_irq, pmic_vbus_on_irq, - IRQF_TRIGGER_RISING, "msm_otg_vbus_on", NULL); - if (ret < 0) { - pr_info("%s: request_irq for vbus_on" - "interrupt failed\n", __func__); - return ret; - } - msm_otg_pdata.pmic_vbus_irq = vbus_on_irq; - return 0; - } else { - free_irq(vbus_on_irq, 0); - notify_vbus_state_func_ptr = NULL; - return 0; - } -} -#endif - -#ifndef CONFIG_SPI_QSD -static int lcdc_gpio_array_num[] = { - 45, /* spi_clk */ - 46, /* spi_cs */ - 47, /* spi_mosi */ - 48, /* spi_miso */ - }; - -static struct msm_gpio lcdc_gpio_config_data[] = { - { GPIO_CFG(45, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_clk" }, - { GPIO_CFG(46, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_cs0" }, - { GPIO_CFG(47, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_mosi" }, - { GPIO_CFG(48, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_miso" }, -}; - -static void lcdc_config_gpios(int enable) -{ - if (enable) { - msm_gpios_request_enable(lcdc_gpio_config_data, - ARRAY_SIZE( - lcdc_gpio_config_data)); - } else - msm_gpios_disable_free(lcdc_gpio_config_data, - ARRAY_SIZE( - lcdc_gpio_config_data)); -} -#endif - -static struct msm_panel_common_pdata lcdc_sharp_panel_data = { -#ifndef CONFIG_SPI_QSD - .panel_config_gpio = lcdc_config_gpios, - .gpio_num = lcdc_gpio_array_num, -#endif - .gpio = 2, /* LPG PMIC_GPIO26 channel number */ -}; - -static struct platform_device lcdc_sharp_panel_device = { - .name = "lcdc_sharp_wvga", - .id = 0, - .dev = { - .platform_data = &lcdc_sharp_panel_data, - } -}; - -static struct msm_gpio dtv_panel_irq_gpios[] = { - { GPIO_CFG(18, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), - "hdmi_int" }, -}; - -static struct msm_gpio dtv_panel_gpios[] = { - { GPIO_CFG(120, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "wca_mclk" }, - { GPIO_CFG(121, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "wca_sd0" }, - { GPIO_CFG(122, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "wca_sd1" }, - { GPIO_CFG(123, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "wca_sd2" }, - { GPIO_CFG(124, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "dtv_pclk" }, - { GPIO_CFG(125, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_en" }, - { GPIO_CFG(126, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_vsync" }, - { GPIO_CFG(127, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_hsync" }, - { GPIO_CFG(128, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data0" }, - { GPIO_CFG(129, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data1" }, - { GPIO_CFG(130, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data2" }, - { GPIO_CFG(131, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data3" }, - { GPIO_CFG(132, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data4" }, - { GPIO_CFG(160, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data5" }, - { GPIO_CFG(161, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data6" }, - { GPIO_CFG(162, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data7" }, - { GPIO_CFG(163, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data8" }, - { GPIO_CFG(164, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_data9" }, - { GPIO_CFG(165, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat10" }, - { GPIO_CFG(166, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat11" }, - { GPIO_CFG(167, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat12" }, - { GPIO_CFG(168, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat13" }, - { GPIO_CFG(169, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat14" }, - { GPIO_CFG(170, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat15" }, - { GPIO_CFG(171, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat16" }, - { GPIO_CFG(172, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat17" }, - { GPIO_CFG(173, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat18" }, - { GPIO_CFG(174, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat19" }, - { GPIO_CFG(175, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat20" }, - { GPIO_CFG(176, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat21" }, - { GPIO_CFG(177, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat22" }, - { GPIO_CFG(178, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_4MA), "dtv_dat23" }, -}; - - -#ifdef HDMI_RESET -static unsigned dtv_reset_gpio = - GPIO_CFG(37, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); -#endif - -static struct regulator_bulk_data hdmi_core_regs[] = { - { .supply = "ldo8", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -static struct regulator_bulk_data hdmi_comm_regs[] = { - { .supply = "ldo8", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo10", .min_uV = 2600000, .max_uV = 2600000 }, -}; - -static struct regulator_bulk_data hdmi_cec_regs[] = { - { .supply = "ldo17", .min_uV = 2600000, .max_uV = 2600000 }, -}; - -static int __init hdmi_init_regs(void) -{ - int rc; - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(hdmi_core_regs), - hdmi_core_regs); - - if (rc) { - pr_err("%s: could not get %s regulators: %d\n", - __func__, "core", rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(hdmi_core_regs), - hdmi_core_regs); - - if (rc) { - pr_err("%s: could not set %s voltages: %d\n", - __func__, "core", rc); - goto free_core; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(hdmi_comm_regs), - hdmi_comm_regs); - - if (rc) { - pr_err("%s: could not get %s regulators: %d\n", - __func__, "comm", rc); - goto free_core; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(hdmi_comm_regs), - hdmi_comm_regs); - - if (rc) { - pr_err("%s: could not set %s voltages: %d\n", - __func__, "comm", rc); - goto free_comm; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(hdmi_cec_regs), - hdmi_cec_regs); - - if (rc) { - pr_err("%s: could not get %s regulators: %d\n", - __func__, "cec", rc); - goto free_comm; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(hdmi_cec_regs), - hdmi_cec_regs); - - if (rc) { - pr_err("%s: could not set %s voltages: %d\n", - __func__, "cec", rc); - goto free_cec; - } - - return 0; - -free_cec: - regulator_bulk_free(ARRAY_SIZE(hdmi_cec_regs), hdmi_cec_regs); -free_comm: - regulator_bulk_free(ARRAY_SIZE(hdmi_comm_regs), hdmi_comm_regs); -free_core: - regulator_bulk_free(ARRAY_SIZE(hdmi_core_regs), hdmi_core_regs); -out: - return rc; -} - -static int hdmi_init_irq(void) -{ - int rc = msm_gpios_enable(dtv_panel_irq_gpios, - ARRAY_SIZE(dtv_panel_irq_gpios)); - if (rc < 0) { - pr_err("%s: gpio enable failed: %d\n", __func__, rc); - return rc; - } - pr_info("%s\n", __func__); - - return 0; -} - -static int hdmi_enable_5v(int on) -{ - int pmic_gpio_hdmi_5v_en ; - - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa() || - machine_is_msm7x30_fluid()) - pmic_gpio_hdmi_5v_en = PMIC_GPIO_HDMI_5V_EN_V2 ; - else - pmic_gpio_hdmi_5v_en = PMIC_GPIO_HDMI_5V_EN_V3 ; - - pr_info("%s: %d\n", __func__, on); - if (on) { - int rc; - rc = gpio_request(PM8058_GPIO_PM_TO_SYS(pmic_gpio_hdmi_5v_en), - "hdmi_5V_en"); - if (rc) { - pr_err("%s PMIC_GPIO_HDMI_5V_EN gpio_request failed\n", - __func__); - return rc; - } - gpio_set_value_cansleep( - PM8058_GPIO_PM_TO_SYS(pmic_gpio_hdmi_5v_en), 1); - } else { - gpio_set_value_cansleep( - PM8058_GPIO_PM_TO_SYS(pmic_gpio_hdmi_5v_en), 0); - gpio_free(PM8058_GPIO_PM_TO_SYS(pmic_gpio_hdmi_5v_en)); - } - return 0; -} - -static int hdmi_comm_power(int on, int show) -{ - if (show) - pr_info("%s: i2c comm: %d \n", __func__, on); - return on ? - regulator_bulk_enable(ARRAY_SIZE(hdmi_comm_regs), - hdmi_comm_regs) : - regulator_bulk_disable(ARRAY_SIZE(hdmi_comm_regs), - hdmi_comm_regs); -} - -static int hdmi_core_power(int on, int show) -{ - if (show) - pr_info("%s: %d \n", __func__, on); - return on ? - regulator_bulk_enable(ARRAY_SIZE(hdmi_core_regs), - hdmi_core_regs) : - regulator_bulk_disable(ARRAY_SIZE(hdmi_core_regs), - hdmi_core_regs); -} - -static int hdmi_cec_power(int on) -{ - pr_info("%s: %d \n", __func__, on); - return on ? regulator_bulk_enable(ARRAY_SIZE(hdmi_cec_regs), - hdmi_cec_regs) : - regulator_bulk_disable(ARRAY_SIZE(hdmi_cec_regs), - hdmi_cec_regs); -} - -#if defined(CONFIG_FB_MSM_HDMI_ADV7520_PANEL) || defined(CONFIG_BOSCH_BMA150) -/* there is an i2c address conflict between adv7520 and bma150 sensor after - * power up on fluid. As a solution, the default address of adv7520's packet - * memory is changed as soon as possible - */ -static int __init fluid_i2c_address_fixup(void) -{ - unsigned char wBuff[16]; - unsigned char rBuff[16]; - struct i2c_msg msgs[3]; - int res; - int rc = -EINVAL; - struct i2c_adapter *adapter; - - if (machine_is_msm7x30_fluid()) { - adapter = i2c_get_adapter(0); - if (!adapter) { - pr_err("%s: invalid i2c adapter\n", __func__); - return PTR_ERR(adapter); - } - - /* turn on LDO8 */ - rc = hdmi_core_power(1, 0); - if (rc) { - pr_err("%s: could not enable hdmi core regs: %d", - __func__, rc); - goto adapter_put; - } - - /* change packet memory address to 0x74 */ - wBuff[0] = 0x45; - wBuff[1] = 0x74; - - msgs[0].addr = ADV7520_I2C_ADDR; - msgs[0].flags = 0; - msgs[0].buf = (unsigned char *) wBuff; - msgs[0].len = 2; - - res = i2c_transfer(adapter, msgs, 1); - if (res != 1) { - pr_err("%s: error writing adv7520\n", __func__); - goto ldo8_disable; - } - - /* powerdown adv7520 using bit 6 */ - /* i2c read first */ - wBuff[0] = 0x41; - - msgs[0].addr = ADV7520_I2C_ADDR; - msgs[0].flags = 0; - msgs[0].buf = (unsigned char *) wBuff; - msgs[0].len = 1; - - msgs[1].addr = ADV7520_I2C_ADDR; - msgs[1].flags = I2C_M_RD; - msgs[1].buf = rBuff; - msgs[1].len = 1; - res = i2c_transfer(adapter, msgs, 2); - if (res != 2) { - pr_err("%s: error reading adv7520\n", __func__); - goto ldo8_disable; - } - - /* i2c write back */ - wBuff[0] = 0x41; - wBuff[1] = rBuff[0] | 0x40; - - msgs[0].addr = ADV7520_I2C_ADDR; - msgs[0].flags = 0; - msgs[0].buf = (unsigned char *) wBuff; - msgs[0].len = 2; - - res = i2c_transfer(adapter, msgs, 1); - if (res != 1) { - pr_err("%s: error writing adv7520\n", __func__); - goto ldo8_disable; - } - - /* for successful fixup, we release the i2c adapter */ - /* but leave ldo8 on so that the adv7520 is not repowered */ - i2c_put_adapter(adapter); - pr_info("%s: fluid i2c address conflict resolved\n", __func__); - } - return 0; - -ldo8_disable: - hdmi_core_power(0, 0); -adapter_put: - i2c_put_adapter(adapter); - return rc; -} -fs_initcall_sync(fluid_i2c_address_fixup); -#endif - -static bool hdmi_check_hdcp_hw_support(void) -{ - if (machine_is_msm7x30_fluid()) - return false; - else - return true; -} - -static int dtv_panel_power(int on) -{ - int flag_on = !!on; - static int dtv_power_save_on; - int rc; - - if (dtv_power_save_on == flag_on) - return 0; - - dtv_power_save_on = flag_on; - pr_info("%s: %d\n", __func__, on); - -#ifdef HDMI_RESET - if (on) { - /* reset Toshiba WeGA chip -- toggle reset pin -- gpio_180 */ - rc = gpio_tlmm_config(dtv_reset_gpio, GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, dtv_reset_gpio, rc); - return rc; - } - - /* bring reset line low to hold reset*/ - gpio_set_value(37, 0); - } -#endif - - if (on) { - rc = msm_gpios_enable(dtv_panel_gpios, - ARRAY_SIZE(dtv_panel_gpios)); - if (rc < 0) { - printk(KERN_ERR "%s: gpio enable failed: %d\n", - __func__, rc); - return rc; - } - } else { - rc = msm_gpios_disable(dtv_panel_gpios, - ARRAY_SIZE(dtv_panel_gpios)); - if (rc < 0) { - printk(KERN_ERR "%s: gpio disable failed: %d\n", - __func__, rc); - return rc; - } - } - - mdelay(5); /* ensure power is stable */ - -#ifdef HDMI_RESET - if (on) { - gpio_set_value(37, 1); /* bring reset line high */ - mdelay(10); /* 10 msec before IO can be accessed */ - } -#endif - - return rc; -} - -static struct lcdc_platform_data dtv_pdata = { - .lcdc_power_save = dtv_panel_power, -}; - -static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = { - .inject_rx_on_wakeup = 1, - .rx_to_inject = 0xFD, -}; - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE -static struct resource msm_v4l2_video_overlay_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; -#endif - -static int msm_fb_detect_panel(const char *name) -{ - if (machine_is_msm7x30_fluid()) { - if (!strcmp(name, "lcdc_sharp_wvga_pt")) - return 0; - } else { - if (!strncmp(name, "mddi_toshiba_wvga_pt", 20)) - return -EPERM; - else if (!strncmp(name, "lcdc_toshiba_wvga_pt", 20)) - return 0; - else if (!strcmp(name, "mddi_orise")) - return -EPERM; - else if (!strcmp(name, "mddi_quickvx")) - return -EPERM; - } - return -ENODEV; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, - .mddi_prescan = 1, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev = { - .platform_data = &msm_fb_pdata, - } -}; - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE - -static struct platform_device msm_v4l2_video_overlay_device = { - .name = "msm_v4l2_overlay_pd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_v4l2_video_overlay_resources), - .resource = msm_v4l2_video_overlay_resources, -}; -#endif - -static struct platform_device msm_migrate_pages_device = { - .name = "msm_migrate_pages", - .id = -1, -}; - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0xA8400000 - -#define QCE_HW_KEY_SUPPORT 1 -#define QCE_SHA_HMAC_SUPPORT 0 -#define QCE_SHARE_CE_RESOURCE 0 -#define QCE_CE_SHARED 0 - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE_HASH_CRCI, - .end = DMOV_CE_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE_HASH_CRCI, - .end = DMOV_CE_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - /* Bus Scaling declaration*/ - .bus_scale_table = NULL, -}; - -static struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - /* Bus Scaling declaration*/ - .bus_scale_table = NULL, -}; -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -static int mddi_toshiba_pmic_bl(int level) -{ - int ret = -EPERM; - - ret = pmic_set_led_intensity(LED_LCD, level); - - if (ret) - printk(KERN_WARNING "%s: can't set lcd backlight!\n", - __func__); - return ret; -} - -static struct msm_panel_common_pdata mddi_toshiba_pdata = { - .pmic_backlight = mddi_toshiba_pmic_bl, -}; - -static struct platform_device mddi_toshiba_device = { - .name = "mddi_toshiba", - .id = 0, - .dev = { - .platform_data = &mddi_toshiba_pdata, - } -}; - -static unsigned wega_reset_gpio = - GPIO_CFG(180, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - -static struct msm_gpio fluid_vee_reset_gpio[] = { - { GPIO_CFG(20, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "vee_reset" }, -}; - -static unsigned char quickvx_mddi_client = 1, other_mddi_client = 1; -static unsigned char quickvx_ldo_enabled; - -static unsigned quickvx_vlp_gpio = - GPIO_CFG(97, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - -static struct pm8xxx_gpio_init_info pmic_quickvx_clk_gpio = { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_QUICKVX_CLK), - { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 1, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_2, - }, -}; - -static struct regulator *mddi_ldo20; -static struct regulator *mddi_ldo12; -static struct regulator *mddi_ldo16; -static struct regulator *mddi_ldo6; -static struct regulator *mddi_lcd; - -static int display_common_init(void) -{ - struct regulator_bulk_data regs[5] = { - { .supply = "ldo20", /* voltage set in display_common_power */}, - { .supply = "ldo12", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo6", .min_uV = 3075000, .max_uV = 3400000 }, - { .supply = "ldo16", .min_uV = 2600000, .max_uV = 2600000 }, - { .supply = NULL, /* mddi_lcd, initialized below */ }, - }; - - int rc = 0; - - if (machine_is_msm7x30_fluid()) { - /* lcd: LDO8 @1.8V */ - regs[4].supply = "ldo8"; - regs[4].min_uV = 1800000; - regs[4].max_uV = 1800000; - } else { - /* lcd: LDO15 @3.1V */ - regs[4].supply = "ldo15"; - regs[4].min_uV = 3100000; - regs[4].max_uV = 3100000; - } - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs), regs); - if (rc) { - pr_err("%s: regulator_bulk_get failed: %d\n", - __func__, rc); - goto bail; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs), regs); - if (rc) { - pr_err("%s: regulator_bulk_set_voltage failed: %d\n", - __func__, rc); - goto put_regs; - } - - mddi_ldo20 = regs[0].consumer; - mddi_ldo12 = regs[1].consumer; - mddi_ldo6 = regs[2].consumer; - mddi_ldo16 = regs[3].consumer; - mddi_lcd = regs[4].consumer; - - return rc; - -put_regs: - regulator_bulk_free(ARRAY_SIZE(regs), regs); -bail: - return rc; -} - -static int display_common_power(int on) -{ - int rc = 0, flag_on = !!on; - static int display_common_power_save_on; - static bool display_regs_initialized; - - if (display_common_power_save_on == flag_on) - return 0; - - display_common_power_save_on = flag_on; - - if (unlikely(!display_regs_initialized)) { - rc = display_common_init(); - if (rc) { - pr_err("%s: regulator init failed: %d\n", - __func__, rc); - return rc; - } - display_regs_initialized = true; - } - - - if (on) { - /* reset Toshiba WeGA chip -- toggle reset pin -- gpio_180 */ - rc = gpio_tlmm_config(wega_reset_gpio, GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, wega_reset_gpio, rc); - return rc; - } - - /* bring reset line low to hold reset*/ - gpio_set_value(180, 0); - - if (quickvx_mddi_client) { - /* QuickVX chip -- VLP pin -- gpio 97 */ - rc = gpio_tlmm_config(quickvx_vlp_gpio, - GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, quickvx_vlp_gpio, rc); - return rc; - } - - /* bring QuickVX VLP line low */ - gpio_set_value(97, 0); - - rc = pm8xxx_gpio_config(pmic_quickvx_clk_gpio.gpio, - &pmic_quickvx_clk_gpio.config); - if (rc) { - pr_err("%s: pm8xxx_gpio_config(%#x)=%d\n", - __func__, pmic_quickvx_clk_gpio.gpio, - rc); - return rc; - } - - gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS( - PMIC_GPIO_QUICKVX_CLK), 0); - } - } - - if (quickvx_mddi_client) - rc = regulator_set_voltage(mddi_ldo20, 1500000, 1800000); - else - rc = regulator_set_voltage(mddi_ldo20, 1500000, 1500000); - - if (rc) { - pr_err("%s: could not set voltage for ldo20: %d\n", - __func__, rc); - return rc; - } - - if (on) { - rc = regulator_enable(mddi_ldo20); - if (rc) { - pr_err("%s: LDO20 regulator enable failed (%d)\n", - __func__, rc); - return rc; - } - - rc = regulator_enable(mddi_ldo12); - if (rc) { - pr_err("%s: LDO12 regulator enable failed (%d)\n", - __func__, rc); - return rc; - } - - if (other_mddi_client) { - rc = regulator_enable(mddi_ldo16); - if (rc) { - pr_err("%s: LDO16 regulator enable failed (%d)\n", - __func__, rc); - return rc; - } - } - - if (quickvx_ldo_enabled) { - /* Disable LDO6 during display ON */ - rc = regulator_disable(mddi_ldo6); - if (rc) { - pr_err("%s: LDO6 regulator disable failed (%d)\n", - __func__, rc); - return rc; - } - quickvx_ldo_enabled = 0; - } - - rc = regulator_enable(mddi_lcd); - if (rc) { - pr_err("%s: LCD regulator enable failed (%d)\n", - __func__, rc); - return rc; - } - - mdelay(5); /* ensure power is stable */ - - if (machine_is_msm7x30_fluid()) { - rc = msm_gpios_request_enable(fluid_vee_reset_gpio, - ARRAY_SIZE(fluid_vee_reset_gpio)); - if (rc) - pr_err("%s gpio_request_enable failed rc=%d\n", - __func__, rc); - else { - /* assert vee reset_n */ - gpio_set_value(20, 1); - gpio_set_value(20, 0); - mdelay(1); - gpio_set_value(20, 1); - } - } - - gpio_set_value(180, 1); /* bring reset line high */ - mdelay(10); /* 10 msec before IO can be accessed */ - - if (quickvx_mddi_client) { - gpio_set_value(97, 1); - msleep(2); - gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS( - PMIC_GPIO_QUICKVX_CLK), 1); - msleep(2); - } - - rc = pmapp_display_clock_config(1); - if (rc) { - pr_err("%s pmapp_display_clock_config rc=%d\n", - __func__, rc); - return rc; - } - - } else { - rc = regulator_disable(mddi_ldo20); - if (rc) { - pr_err("%s: LDO20 regulator disable failed (%d)\n", - __func__, rc); - return rc; - } - - - if (other_mddi_client) { - rc = regulator_disable(mddi_ldo16); - if (rc) { - pr_err("%s: LDO16 regulator disable failed (%d)\n", - __func__, rc); - return rc; - } - } - - if (quickvx_mddi_client && !quickvx_ldo_enabled) { - /* Enable LDO6 during display OFF for - Quicklogic chip to sleep with data retention */ - rc = regulator_enable(mddi_ldo6); - if (rc) { - pr_err("%s: LDO6 regulator enable failed (%d)\n", - __func__, rc); - return rc; - } - quickvx_ldo_enabled = 1; - } - - gpio_set_value(180, 0); /* bring reset line low */ - - if (quickvx_mddi_client) { - gpio_set_value(97, 0); - gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS( - PMIC_GPIO_QUICKVX_CLK), 0); - } - - rc = regulator_disable(mddi_lcd); - if (rc) { - pr_err("%s: LCD regulator disable failed (%d)\n", - __func__, rc); - return rc; - } - - mdelay(5); /* ensure power is stable */ - - rc = regulator_disable(mddi_ldo12); - if (rc) { - pr_err("%s: LDO12 regulator disable failed (%d)\n", - __func__, rc); - return rc; - } - - if (machine_is_msm7x30_fluid()) { - msm_gpios_disable_free(fluid_vee_reset_gpio, - ARRAY_SIZE(fluid_vee_reset_gpio)); - } - - rc = pmapp_display_clock_config(0); - if (rc) { - pr_err("%s pmapp_display_clock_config rc=%d\n", - __func__, rc); - return rc; - } - } - - return rc; -} - -static int msm_fb_mddi_sel_clk(u32 *clk_rate) -{ - *clk_rate *= 2; - return 0; -} - -static int msm_fb_mddi_client_power(u32 client_id) -{ - int rc; - printk(KERN_NOTICE "\n client_id = 0x%x", client_id); - /* Check if it is Quicklogic client */ - if (client_id == 0xc5835800) { - printk(KERN_NOTICE "\n Quicklogic MDDI client"); - other_mddi_client = 0; - if (IS_ERR(mddi_ldo16)) { - rc = PTR_ERR(mddi_ldo16); - pr_err("%s: gp10 vreg get failed (%d)\n", __func__, rc); - return rc; - } - rc = regulator_disable(mddi_ldo16); - if (rc) { - pr_err("%s: LDO16 vreg enable failed (%d)\n", - __func__, rc); - return rc; - } - - } else { - printk(KERN_NOTICE "\n Non-Quicklogic MDDI client"); - quickvx_mddi_client = 0; - gpio_set_value(97, 0); - gpio_set_value_cansleep(PM8058_GPIO_PM_TO_SYS( - PMIC_GPIO_QUICKVX_CLK), 0); - } - - return 0; -} - -static struct mddi_platform_data mddi_pdata = { - .mddi_power_save = display_common_power, - .mddi_sel_clk = msm_fb_mddi_sel_clk, - .mddi_client_power = msm_fb_mddi_client_power, -}; - -static struct msm_panel_common_pdata mdp_pdata = { - .hw_revision_addr = 0xac001270, - .gpio = 30, - .mdp_max_clk = 192000000, - .mdp_rev = MDP_REV_40, - .mem_hid = MEMTYPE_EBI0, -}; - -static int lcd_panel_spi_gpio_num[] = { - 45, /* spi_clk */ - 46, /* spi_cs */ - 47, /* spi_mosi */ - 48, /* spi_miso */ - }; - -static struct msm_gpio lcd_panel_gpios[] = { -/* Workaround, since HDMI_INT is using the same GPIO line (18), and is used as - * input. if there is a hardware revision; we should reassign this GPIO to a - * new open line; and removing it will just ensure that this will be missed in - * the future. - { GPIO_CFG(18, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn0" }, - */ - { GPIO_CFG(19, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn1" }, - { GPIO_CFG(20, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu0" }, - { GPIO_CFG(21, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu1" }, - { GPIO_CFG(22, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu2" }, - { GPIO_CFG(23, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red0" }, - { GPIO_CFG(24, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red1" }, - { GPIO_CFG(25, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red2" }, -#ifndef CONFIG_SPI_QSD - { GPIO_CFG(45, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_clk" }, - { GPIO_CFG(46, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_cs0" }, - { GPIO_CFG(47, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_mosi" }, - { GPIO_CFG(48, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_miso" }, -#endif - { GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_pclk" }, - { GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_en" }, - { GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_vsync" }, - { GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_hsync" }, - { GPIO_CFG(94, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn2" }, - { GPIO_CFG(95, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn3" }, - { GPIO_CFG(96, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn4" }, - { GPIO_CFG(97, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn5" }, - { GPIO_CFG(98, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn6" }, - { GPIO_CFG(99, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn7" }, - { GPIO_CFG(100, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu3" }, - { GPIO_CFG(101, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu4" }, - { GPIO_CFG(102, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu5" }, - { GPIO_CFG(103, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu6" }, - { GPIO_CFG(104, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu7" }, - { GPIO_CFG(105, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red3" }, - { GPIO_CFG(106, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red4" }, - { GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red5" }, - { GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red6" }, - { GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red7" }, -}; - -static struct msm_gpio lcd_sharp_panel_gpios[] = { - { GPIO_CFG(22, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu2" }, - { GPIO_CFG(25, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red2" }, - { GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_pclk" }, - { GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_en" }, - { GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_vsync" }, - { GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_hsync" }, - { GPIO_CFG(94, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn2" }, - { GPIO_CFG(95, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn3" }, - { GPIO_CFG(96, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn4" }, - { GPIO_CFG(97, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn5" }, - { GPIO_CFG(98, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn6" }, - { GPIO_CFG(99, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_grn7" }, - { GPIO_CFG(100, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu3" }, - { GPIO_CFG(101, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu4" }, - { GPIO_CFG(102, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu5" }, - { GPIO_CFG(103, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu6" }, - { GPIO_CFG(104, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_blu7" }, - { GPIO_CFG(105, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red3" }, - { GPIO_CFG(106, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red4" }, - { GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red5" }, - { GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red6" }, - { GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "lcdc_red7" }, -}; - -static int lcdc_toshiba_panel_power(int on) -{ - int rc, i; - struct msm_gpio *gp; - - rc = display_common_power(on); - if (rc < 0) { - printk(KERN_ERR "%s display_common_power failed: %d\n", - __func__, rc); - return rc; - } - - if (on) { - rc = msm_gpios_enable(lcd_panel_gpios, - ARRAY_SIZE(lcd_panel_gpios)); - if (rc < 0) { - printk(KERN_ERR "%s: gpio enable failed: %d\n", - __func__, rc); - } - } else { /* off */ - gp = lcd_panel_gpios; - for (i = 0; i < ARRAY_SIZE(lcd_panel_gpios); i++) { - /* ouput low */ - gpio_set_value(GPIO_PIN(gp->gpio_cfg), 0); - gp++; - } - } - - return rc; -} - -static int lcdc_sharp_panel_power(int on) -{ - int rc, i; - struct msm_gpio *gp; - - rc = display_common_power(on); - if (rc < 0) { - printk(KERN_ERR "%s display_common_power failed: %d\n", - __func__, rc); - return rc; - } - - if (on) { - rc = msm_gpios_enable(lcd_sharp_panel_gpios, - ARRAY_SIZE(lcd_sharp_panel_gpios)); - if (rc < 0) { - printk(KERN_ERR "%s: gpio enable failed: %d\n", - __func__, rc); - } - } else { /* off */ - gp = lcd_sharp_panel_gpios; - for (i = 0; i < ARRAY_SIZE(lcd_sharp_panel_gpios); i++) { - /* ouput low */ - gpio_set_value(GPIO_PIN(gp->gpio_cfg), 0); - gp++; - } - } - - return rc; -} - -static int lcdc_panel_power(int on) -{ - int flag_on = !!on; - static int lcdc_power_save_on, lcdc_power_initialized; - - if (lcdc_power_save_on == flag_on) - return 0; - - lcdc_power_save_on = flag_on; - - if (unlikely(!lcdc_power_initialized)) { - quickvx_mddi_client = 0; - display_common_init(); - lcdc_power_initialized = 1; - } - - if (machine_is_msm7x30_fluid()) - return lcdc_sharp_panel_power(on); - else - return lcdc_toshiba_panel_power(on); -} - -static struct lcdc_platform_data lcdc_pdata = { - .lcdc_power_save = lcdc_panel_power, -}; - -static struct regulator *atv_s4, *atv_ldo9; - -static int __init atv_dac_power_init(void) -{ - int rc; - struct regulator_bulk_data regs[] = { - { .supply = "smps4", .min_uV = 2200000, .max_uV = 2200000 }, - { .supply = "ldo9", .min_uV = 2050000, .max_uV = 2050000 }, - }; - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs), regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto bail; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs), regs); - - if (rc) { - pr_err("%s: could not set voltages: %d\n", __func__, rc); - goto reg_free; - } - - atv_s4 = regs[0].consumer; - atv_ldo9 = regs[1].consumer; - -reg_free: - regulator_bulk_free(ARRAY_SIZE(regs), regs); -bail: - return rc; -} - -static int atv_dac_power(int on) -{ - int rc = 0; - - if (on) { - rc = regulator_enable(atv_s4); - if (rc) { - pr_err("%s: s4 vreg enable failed (%d)\n", - __func__, rc); - return rc; - } - rc = regulator_enable(atv_ldo9); - if (rc) { - pr_err("%s: ldo9 vreg enable failed (%d)\n", - __func__, rc); - return rc; - } - } else { - rc = regulator_disable(atv_ldo9); - if (rc) { - pr_err("%s: ldo9 vreg disable failed (%d)\n", - __func__, rc); - return rc; - } - rc = regulator_disable(atv_s4); - if (rc) { - pr_err("%s: s4 vreg disable failed (%d)\n", - __func__, rc); - return rc; - } - } - return rc; -} - -static struct tvenc_platform_data atv_pdata = { - .poll = 1, - .pm_vid_en = atv_dac_power, -}; - -static void __init msm_fb_add_devices(void) -{ - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("pmdh", &mddi_pdata); - msm_fb_register_device("lcdc", &lcdc_pdata); - msm_fb_register_device("dtv", &dtv_pdata); - msm_fb_register_device("tvenc", &atv_pdata); -#ifdef CONFIG_FB_MSM_TVOUT - msm_fb_register_device("tvout_device", NULL); -#endif -} - -static struct msm_panel_common_pdata lcdc_toshiba_panel_data = { - .gpio_num = lcd_panel_spi_gpio_num, -}; - -static struct platform_device lcdc_toshiba_panel_device = { - .name = "lcdc_toshiba_wvga", - .id = 0, - .dev = { - .platform_data = &lcdc_toshiba_panel_data, - } -}; - -#if defined(CONFIG_MARIMBA_CORE) && \ - (defined(CONFIG_MSM_BT_POWER) || defined(CONFIG_MSM_BT_POWER_MODULE)) -static struct platform_device msm_bt_power_device = { - .name = "bt_power", - .id = -1 -}; - -enum { - BT_RFR, - BT_CTS, - BT_RX, - BT_TX, -}; - -static struct msm_gpio bt_config_power_on[] = { - { GPIO_CFG(134, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_RFR" }, - { GPIO_CFG(135, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_CTS" }, - { GPIO_CFG(136, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_Rx" }, - { GPIO_CFG(137, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_Tx" } -}; - -static struct msm_gpio bt_config_power_off[] = { - { GPIO_CFG(134, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_RFR" }, - { GPIO_CFG(135, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_CTS" }, - { GPIO_CFG(136, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_Rx" }, - { GPIO_CFG(137, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_Tx" } -}; - -static u8 bahama_version; - -static struct regulator_bulk_data regs_bt_marimba[] = { - { .supply = "smps3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "smps2", .min_uV = 1300000, .max_uV = 1300000 }, - { .supply = "ldo24", .min_uV = 1200000, .max_uV = 1200000 }, - { .supply = "ldo13", .min_uV = 2900000, .max_uV = 3050000 }, -}; - -static struct regulator_bulk_data regs_bt_bahama_v1[] = { - { .supply = "smps3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo7", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "smps2", .min_uV = 1300000, .max_uV = 1300000 }, - { .supply = "ldo13", .min_uV = 2900000, .max_uV = 3050000 }, -}; - -static struct regulator_bulk_data regs_bt_bahama_v2[] = { - { .supply = "smps3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo7", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "ldo13", .min_uV = 2900000, .max_uV = 3050000 }, -}; - -static struct regulator_bulk_data *regs_bt; -static int regs_bt_count; - -static int marimba_bt(int on) -{ - int rc; - int i; - struct marimba config = { .mod_id = MARIMBA_SLAVE_ID_MARIMBA }; - - struct marimba_config_register { - u8 reg; - u8 value; - u8 mask; - }; - - struct marimba_variant_register { - const size_t size; - const struct marimba_config_register *set; - }; - - const struct marimba_config_register *p; - - u8 version; - - const struct marimba_config_register v10_bt_on[] = { - { 0xE5, 0x0B, 0x0F }, - { 0x05, 0x02, 0x07 }, - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x21, 0x21 }, - { 0xE3, 0x38, 0xFF }, - { 0xE4, 0x06, 0xFF }, - }; - - const struct marimba_config_register v10_bt_off[] = { - { 0xE5, 0x0B, 0x0F }, - { 0x05, 0x08, 0x0F }, - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x00, 0x21 }, - { 0xE3, 0x00, 0xFF }, - { 0xE4, 0x00, 0xFF }, - }; - - const struct marimba_config_register v201_bt_on[] = { - { 0x05, 0x08, 0x07 }, - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x21, 0x21 }, - { 0xE3, 0x38, 0xFF }, - { 0xE4, 0x06, 0xFF }, - }; - - const struct marimba_config_register v201_bt_off[] = { - { 0x05, 0x08, 0x07 }, - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x00, 0x21 }, - { 0xE3, 0x00, 0xFF }, - { 0xE4, 0x00, 0xFF }, - }; - - const struct marimba_config_register v210_bt_on[] = { - { 0xE9, 0x01, 0x01 }, - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x21, 0x21 }, - { 0xE3, 0x38, 0xFF }, - { 0xE4, 0x06, 0xFF }, - }; - - const struct marimba_config_register v210_bt_off[] = { - { 0x06, 0x88, 0xFF }, - { 0xE7, 0x00, 0x21 }, - { 0xE9, 0x00, 0x01 }, - { 0xE3, 0x00, 0xFF }, - { 0xE4, 0x00, 0xFF }, - }; - - const struct marimba_variant_register bt_marimba[2][4] = { - { - { ARRAY_SIZE(v10_bt_off), v10_bt_off }, - { 0, NULL }, - { ARRAY_SIZE(v201_bt_off), v201_bt_off }, - { ARRAY_SIZE(v210_bt_off), v210_bt_off } - }, - { - { ARRAY_SIZE(v10_bt_on), v10_bt_on }, - { 0, NULL }, - { ARRAY_SIZE(v201_bt_on), v201_bt_on }, - { ARRAY_SIZE(v210_bt_on), v210_bt_on } - } - }; - - on = on ? 1 : 0; - - rc = marimba_read_bit_mask(&config, 0x11, &version, 1, 0x1F); - if (rc < 0) { - printk(KERN_ERR - "%s: version read failed: %d\n", - __func__, rc); - return rc; - } - - if ((version >= ARRAY_SIZE(bt_marimba[on])) || - (bt_marimba[on][version].size == 0)) { - printk(KERN_ERR - "%s: unsupported version\n", - __func__); - return -EIO; - } - - p = bt_marimba[on][version].set; - - printk(KERN_INFO "%s: found version %d\n", __func__, version); - - for (i = 0; i < bt_marimba[on][version].size; i++) { - u8 value = (p+i)->value; - rc = marimba_write_bit_mask(&config, - (p+i)->reg, - &value, - sizeof((p+i)->value), - (p+i)->mask); - if (rc < 0) { - printk(KERN_ERR - "%s: reg %d write failed: %d\n", - __func__, (p+i)->reg, rc); - return rc; - } - printk(KERN_INFO "%s: reg 0x%02x value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - } - return 0; -} - -static int bahama_bt(int on) -{ - int rc; - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA }; - - struct bahama_variant_register { - const size_t size; - const struct bahama_config_register *set; - }; - - const struct bahama_config_register *p; - - - const struct bahama_config_register v10_bt_on[] = { - { 0xE9, 0x00, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE4, 0x00, 0xFF }, - { 0xE5, 0x00, 0x0F }, -#ifdef CONFIG_WLAN - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0x11, 0x13, 0xFF }, - { 0xE9, 0x21, 0xFF }, - { 0x01, 0x0C, 0x1F }, - { 0x01, 0x08, 0x1F }, - }; - - const struct bahama_config_register v20_bt_on_fm_off[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xF0, 0x00, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0xFF }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF } - }; - - const struct bahama_config_register v20_bt_on_fm_on[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0xFF }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF } - }; - - const struct bahama_config_register v10_bt_off[] = { - { 0xE9, 0x00, 0xFF }, - }; - - const struct bahama_config_register v20_bt_off_fm_off[] = { - { 0xF4, 0x84, 0xFF }, - { 0xF0, 0x04, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_config_register v20_bt_off_fm_on[] = { - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_variant_register bt_bahama[2][3] = { - { - { ARRAY_SIZE(v10_bt_off), v10_bt_off }, - { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off }, - { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on } - }, - { - { ARRAY_SIZE(v10_bt_on), v10_bt_on }, - { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off }, - { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on } - } - }; - - u8 offset = 0; /* index into bahama configs */ - - on = on ? 1 : 0; - - - if (bahama_version == VER_2_0) { - if (marimba_get_fm_status(&config)) - offset = 0x01; - } - - p = bt_bahama[on][bahama_version + offset].set; - - dev_info(&msm_bt_power_device.dev, - "%s: found version %d\n", __func__, bahama_version); - - for (i = 0; i < bt_bahama[on][bahama_version + offset].size; i++) { - u8 value = (p+i)->value; - rc = marimba_write_bit_mask(&config, - (p+i)->reg, - &value, - sizeof((p+i)->value), - (p+i)->mask); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "%s: reg %d write failed: %d\n", - __func__, (p+i)->reg, rc); - return rc; - } - dev_info(&msm_bt_power_device.dev, - "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - } - /* Update BT status */ - if (on) - marimba_set_bt_status(&config, true); - else - marimba_set_bt_status(&config, false); - - return 0; -} - -static int bluetooth_regs_init(int bahama_not_marimba) -{ - int rc = 0; - struct device *const dev = &msm_bt_power_device.dev; - - if (bahama_not_marimba) { - bahama_version = read_bahama_ver(); - - switch (bahama_version) { - case VER_1_0: - regs_bt = regs_bt_bahama_v1; - regs_bt_count = ARRAY_SIZE(regs_bt_bahama_v1); - break; - case VER_2_0: - regs_bt = regs_bt_bahama_v2; - regs_bt_count = ARRAY_SIZE(regs_bt_bahama_v2); - break; - case VER_UNSUPPORTED: - default: - dev_err(dev, - "%s: i2c failure or unsupported version: %d\n", - __func__, bahama_version); - rc = -EIO; - goto out; - } - } else { - regs_bt = regs_bt_marimba; - regs_bt_count = ARRAY_SIZE(regs_bt_marimba); - } - - rc = regulator_bulk_get(&msm_bt_power_device.dev, - regs_bt_count, regs_bt); - if (rc) { - dev_err(dev, "%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(regs_bt_count, regs_bt); - if (rc) { - dev_err(dev, "%s: could not set voltages: %d\n", - __func__, rc); - goto reg_free; - } - - return 0; - -reg_free: - regulator_bulk_free(regs_bt_count, regs_bt); -out: - regs_bt_count = 0; - regs_bt = NULL; - return rc; -} - -static int bluetooth_power(int on) -{ - int rc; - const char *id = "BTPW"; - - int bahama_not_marimba = bahama_present(); - - if (bahama_not_marimba < 0) { - printk(KERN_WARNING "%s: bahama_present: %d\n", - __func__, bahama_not_marimba); - return -ENODEV; - } - - if (unlikely(regs_bt_count == 0)) { - rc = bluetooth_regs_init(bahama_not_marimba); - if (rc) - return rc; - } - - if (on) { - rc = regulator_bulk_enable(regs_bt_count, regs_bt); - if (rc) - return rc; - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, - PMAPP_CLOCK_VOTE_ON); - if (rc < 0) - return -EIO; - - if (machine_is_msm8x55_svlte_surf() || - machine_is_msm8x55_svlte_ffa()) { - rc = marimba_gpio_config(1); - if (rc < 0) - return -EIO; - } - - rc = (bahama_not_marimba ? bahama_bt(on) : marimba_bt(on)); - if (rc < 0) - return -EIO; - - msleep(10); - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, - PMAPP_CLOCK_VOTE_PIN_CTRL); - if (rc < 0) - return -EIO; - - if (machine_is_msm8x55_svlte_surf() || - machine_is_msm8x55_svlte_ffa()) { - rc = marimba_gpio_config(0); - if (rc < 0) - return -EIO; - } - - rc = msm_gpios_enable(bt_config_power_on, - ARRAY_SIZE(bt_config_power_on)); - - if (rc < 0) - return rc; - - } else { - rc = msm_gpios_enable(bt_config_power_off, - ARRAY_SIZE(bt_config_power_off)); - if (rc < 0) - return rc; - - /* check for initial RFKILL block (power off) */ - if (platform_get_drvdata(&msm_bt_power_device) == NULL) - goto out; - - rc = (bahama_not_marimba ? bahama_bt(on) : marimba_bt(on)); - if (rc < 0) - return -EIO; - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_DO, - PMAPP_CLOCK_VOTE_OFF); - if (rc < 0) - return -EIO; - - rc = regulator_bulk_disable(regs_bt_count, regs_bt); - if (rc) - return rc; - - } - -out: - printk(KERN_DEBUG "Bluetooth power switch: %d\n", on); - - return 0; -} - -static void __init bt_power_init(void) -{ - msm_bt_power_device.dev.platform_data = &bluetooth_power; -} -#else -#define bt_power_init(x) do {} while (0) -#endif - -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .voltage_min_design = 2800, - .voltage_max_design = 4300, - .avail_chg_sources = AC_CHG | USB_CHG , - .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION, -}; - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; - -static char *msm_adc_fluid_device_names[] = { - "LTC_ADC1", - "LTC_ADC2", - "LTC_ADC3", -}; - -static char *msm_adc_surf_device_names[] = { - "XO_ADC", -}; - -static struct msm_adc_platform_data msm_adc_pdata; - -static struct platform_device msm_adc_device = { - .name = "msm_adc", - .id = -1, - .dev = { - .platform_data = &msm_adc_pdata, - }, -}; - -#ifdef CONFIG_MSM_SDIO_AL -static struct msm_gpio mdm2ap_status = { - GPIO_CFG(77, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "mdm2ap_status" -}; - - -static int configure_mdm2ap_status(int on) -{ - if (on) - return msm_gpios_request_enable(&mdm2ap_status, 1); - else { - msm_gpios_disable_free(&mdm2ap_status, 1); - return 0; - } -} - -static int get_mdm2ap_status(void) -{ - return gpio_get_value(GPIO_PIN(mdm2ap_status.gpio_cfg)); -} - -static struct sdio_al_platform_data sdio_al_pdata = { - .config_mdm2ap_status = configure_mdm2ap_status, - .get_mdm2ap_status = get_mdm2ap_status, - .allow_sdioc_version_major_2 = 1, - .peer_sdioc_version_minor = 0x0001, - .peer_sdioc_version_major = 0x0003, - .peer_sdioc_boot_version_minor = 0x0001, - .peer_sdioc_boot_version_major = 0x0003, -}; - -struct platform_device msm_device_sdio_al = { - .name = "msm_sdio_al", - .id = -1, - .dev = { - .platform_data = &sdio_al_pdata, - }, -}; - -#endif /* CONFIG_MSM_SDIO_AL */ - -static struct platform_device *devices[] __initdata = { -#if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER) - &msm_device_uart2, -#endif -#ifdef CONFIG_MSM_PROC_COMM_REGULATOR - &msm_proccomm_regulator_dev, -#endif - &asoc_msm_pcm, - &asoc_msm_dai0, - &asoc_msm_dai1, -#if defined (CONFIG_SND_MSM_MVS_DAI_SOC) - &asoc_msm_mvs, - &asoc_mvs_dai0, - &asoc_mvs_dai1, -#endif - &msm_device_smd, - &msm_device_dmov, - &smc91x_device, - &smsc911x_device, - &msm_device_nand, -#ifdef CONFIG_USB_MSM_OTG_72K - &msm_device_otg, -#ifdef CONFIG_USB_GADGET - &msm_device_gadget_peripheral, -#endif -#endif -#ifdef CONFIG_USB_G_ANDROID - &android_usb_device, -#endif - &qsd_device_spi, - -#ifdef CONFIG_MSM_SSBI - &msm_device_ssbi_pmic1, -#endif -#ifdef CONFIG_I2C_SSBI - &msm_device_ssbi7, -#endif - &msm_fb_device, -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE - &msm_v4l2_video_overlay_device, -#endif - &msm_migrate_pages_device, - &mddi_toshiba_device, - &lcdc_toshiba_panel_device, -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &lcdc_sharp_panel_device, - &msm_device_i2c, - &msm_device_i2c_2, - &msm_device_uart_dm1, - &hs_device, -#ifdef CONFIG_MSM7KV2_AUDIO - &msm_aictl_device, - &msm_mi2s_device, - &msm_lpa_device, - &msm_aux_pcm_device, -#endif - &msm_device_adspdec, - &qup_device_i2c, -#if defined(CONFIG_MARIMBA_CORE) && \ - (defined(CONFIG_MSM_BT_POWER) || defined(CONFIG_MSM_BT_POWER_MODULE)) - &msm_bt_power_device, -#endif - &msm_kgsl_3d0, - &msm_kgsl_2d0, -#ifndef CONFIG_MSM_CAMERA_V4L2 -#ifdef CONFIG_MT9T013 - &msm_camera_sensor_mt9t013, -#endif -#ifdef CONFIG_MT9D112 - &msm_camera_sensor_mt9d112, -#endif -#ifdef CONFIG_WEBCAM_OV9726 - &msm_camera_sensor_ov9726, -#endif -#ifdef CONFIG_S5K3E2FX - &msm_camera_sensor_s5k3e2fx, -#endif -#ifdef CONFIG_MT9P012 - &msm_camera_sensor_mt9p012, -#endif -#ifdef CONFIG_MT9E013 - &msm_camera_sensor_mt9e013, -#endif -#ifdef CONFIG_VX6953 - &msm_camera_sensor_vx6953, -#endif -#ifdef CONFIG_SN12M0PZ - &msm_camera_sensor_sn12m0pz, -#endif -#endif - &msm_device_vidc_720p, -#ifdef CONFIG_MSM_GEMINI - &msm_gemini_device, -#endif -#ifndef CONFIG_MSM_CAMERA_V4L2 -#ifdef CONFIG_MSM_VPE - &msm_vpe_device, -#endif -#endif -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - &msm_device_tsif, -#endif -#ifdef CONFIG_MSM_SDIO_AL - &msm_device_sdio_al, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif - - &msm_batt_device, - &msm_adc_device, - &msm_ebi0_thermal, - &msm_ebi1_thermal, - &msm_adsp_device, -#ifdef CONFIG_ION_MSM - &ion_dev, -#endif -}; - -static struct msm_gpio msm_i2c_gpios_hw[] = { - { GPIO_CFG(70, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "i2c_scl" }, - { GPIO_CFG(71, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "i2c_sda" }, -}; - -static struct msm_gpio msm_i2c_gpios_io[] = { - { GPIO_CFG(70, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "i2c_scl" }, - { GPIO_CFG(71, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "i2c_sda" }, -}; - -static struct msm_gpio qup_i2c_gpios_io[] = { - { GPIO_CFG(16, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "qup_scl" }, - { GPIO_CFG(17, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "qup_sda" }, -}; -static struct msm_gpio qup_i2c_gpios_hw[] = { - { GPIO_CFG(16, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "qup_scl" }, - { GPIO_CFG(17, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "qup_sda" }, -}; - -static void -msm_i2c_gpio_config(int adap_id, int config_type) -{ - struct msm_gpio *msm_i2c_table; - - /* Each adapter gets 2 lines from the table */ - if (adap_id > 0) - return; - if (config_type) - msm_i2c_table = &msm_i2c_gpios_hw[adap_id*2]; - else - msm_i2c_table = &msm_i2c_gpios_io[adap_id*2]; - msm_gpios_enable(msm_i2c_table, 2); -} -/*This needs to be enabled only for OEMS*/ -#ifndef CONFIG_QUP_EXCLUSIVE_TO_CAMERA -static struct regulator *qup_vreg; -#endif -static void -qup_i2c_gpio_config(int adap_id, int config_type) -{ - int rc = 0; - struct msm_gpio *qup_i2c_table; - /* Each adapter gets 2 lines from the table */ - if (adap_id != 4) - return; - if (config_type) - qup_i2c_table = qup_i2c_gpios_hw; - else - qup_i2c_table = qup_i2c_gpios_io; - rc = msm_gpios_enable(qup_i2c_table, 2); - if (rc < 0) - printk(KERN_ERR "QUP GPIO enable failed: %d\n", rc); - /*This needs to be enabled only for OEMS*/ -#ifndef CONFIG_QUP_EXCLUSIVE_TO_CAMERA - if (!IS_ERR_OR_NULL(qup_vreg)) { - rc = regulator_enable(qup_vreg); - if (rc) { - pr_err("%s: regulator_enable failed: %d\n", - __func__, rc); - } - } -#endif -} - -static struct msm_i2c_platform_data msm_i2c_pdata = { - .clk_freq = 100000, - .pri_clk = 70, - .pri_dat = 71, - .rmutex = 1, - .rsl_id = "D:I2C02000021", - .msm_i2c_config_gpio = msm_i2c_gpio_config, -}; - -static void __init msm_device_i2c_init(void) -{ - if (msm_gpios_request(msm_i2c_gpios_hw, ARRAY_SIZE(msm_i2c_gpios_hw))) - pr_err("failed to request I2C gpios\n"); - - msm_device_i2c.dev.platform_data = &msm_i2c_pdata; -} - -static struct msm_i2c_platform_data msm_i2c_2_pdata = { - .clk_freq = 100000, - .rmutex = 1, - .rsl_id = "D:I2C02000022", - .msm_i2c_config_gpio = msm_i2c_gpio_config, -}; - -static void __init msm_device_i2c_2_init(void) -{ - msm_device_i2c_2.dev.platform_data = &msm_i2c_2_pdata; -} - -static struct msm_i2c_platform_data qup_i2c_pdata = { - .clk_freq = 384000, - .msm_i2c_config_gpio = qup_i2c_gpio_config, -}; - -static void __init qup_device_i2c_init(void) -{ - if (msm_gpios_request(qup_i2c_gpios_hw, ARRAY_SIZE(qup_i2c_gpios_hw))) - pr_err("failed to request I2C gpios\n"); - - qup_device_i2c.dev.platform_data = &qup_i2c_pdata; - /*This needs to be enabled only for OEMS*/ -#ifndef CONFIG_QUP_EXCLUSIVE_TO_CAMERA - qup_vreg = regulator_get(&qup_device_i2c.dev, "lvsw1"); - if (IS_ERR(qup_vreg)) { - dev_err(&qup_device_i2c.dev, - "%s: regulator_get failed: %ld\n", - __func__, PTR_ERR(qup_vreg)); - } -#endif -} - -#ifdef CONFIG_I2C_SSBI -static struct msm_i2c_ssbi_platform_data msm_i2c_ssbi7_pdata = { - .rsl_id = "D:CODEC_SSBI", - .controller_type = MSM_SBI_CTRL_SSBI, -}; -#endif - -static void __init msm7x30_init_irq(void) -{ - msm_init_irq(); -} - -static struct msm_gpio msm_nand_ebi2_cfg_data[] = { - {GPIO_CFG(86, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "ebi2_cs1"}, - {GPIO_CFG(115, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "ebi2_busy1"}, -}; - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)) - -struct sdcc_gpio { - struct msm_gpio *cfg_data; - uint32_t size; - struct msm_gpio *sleep_cfg_data; -}; -#if defined(CONFIG_MMC_MSM_SDC1_SUPPORT) -static struct msm_gpio sdc1_lvlshft_cfg_data[] = { - {GPIO_CFG(35, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_16MA), "sdc1_lvlshft"}, -}; -#endif -static struct msm_gpio sdc1_cfg_data[] = { - {GPIO_CFG(38, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "sdc1_clk"}, - {GPIO_CFG(39, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_cmd"}, - {GPIO_CFG(40, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_3"}, - {GPIO_CFG(41, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_2"}, - {GPIO_CFG(42, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_1"}, - {GPIO_CFG(43, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_0"}, -}; - -static struct msm_gpio sdc2_cfg_data[] = { - {GPIO_CFG(64, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "sdc2_clk"}, - {GPIO_CFG(65, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_cmd"}, - {GPIO_CFG(66, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_3"}, - {GPIO_CFG(67, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_2"}, - {GPIO_CFG(68, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_1"}, - {GPIO_CFG(69, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_0"}, - -#ifdef CONFIG_MMC_MSM_SDC2_8_BIT_SUPPORT - {GPIO_CFG(115, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_4"}, - {GPIO_CFG(114, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_5"}, - {GPIO_CFG(113, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_6"}, - {GPIO_CFG(112, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_7"}, -#endif -}; - -static struct msm_gpio sdc3_cfg_data[] = { - {GPIO_CFG(110, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "sdc3_clk"}, - {GPIO_CFG(111, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_cmd"}, - {GPIO_CFG(116, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_3"}, - {GPIO_CFG(117, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_2"}, - {GPIO_CFG(118, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_1"}, - {GPIO_CFG(119, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_0"}, -}; - -static struct msm_gpio sdc3_sleep_cfg_data[] = { - {GPIO_CFG(110, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_clk"}, - {GPIO_CFG(111, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_cmd"}, - {GPIO_CFG(116, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_dat_3"}, - {GPIO_CFG(117, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_dat_2"}, - {GPIO_CFG(118, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_dat_1"}, - {GPIO_CFG(119, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "sdc3_dat_0"}, -}; - -static struct msm_gpio sdc4_cfg_data[] = { - {GPIO_CFG(58, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), "sdc4_clk"}, - {GPIO_CFG(59, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_cmd"}, - {GPIO_CFG(60, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_3"}, - {GPIO_CFG(61, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_2"}, - {GPIO_CFG(62, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_1"}, - {GPIO_CFG(63, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_0"}, -}; - -static struct sdcc_gpio sdcc_cfg_data[] = { - { - .cfg_data = sdc1_cfg_data, - .size = ARRAY_SIZE(sdc1_cfg_data), - .sleep_cfg_data = NULL, - }, - { - .cfg_data = sdc2_cfg_data, - .size = ARRAY_SIZE(sdc2_cfg_data), - .sleep_cfg_data = NULL, - }, - { - .cfg_data = sdc3_cfg_data, - .size = ARRAY_SIZE(sdc3_cfg_data), - .sleep_cfg_data = sdc3_sleep_cfg_data, - }, - { - .cfg_data = sdc4_cfg_data, - .size = ARRAY_SIZE(sdc4_cfg_data), - .sleep_cfg_data = NULL, - }, -}; - -static struct regulator *sdcc_vreg_data[ARRAY_SIZE(sdcc_cfg_data)]; - -static unsigned long vreg_sts, gpio_sts; - -static uint32_t msm_sdcc_setup_gpio(int dev_id, unsigned int enable) -{ - int rc = 0; - struct sdcc_gpio *curr; - - curr = &sdcc_cfg_data[dev_id - 1]; - - if (!(test_bit(dev_id, &gpio_sts)^enable)) - return rc; - - if (enable) { - set_bit(dev_id, &gpio_sts); - rc = msm_gpios_request_enable(curr->cfg_data, curr->size); - if (rc) - printk(KERN_ERR "%s: Failed to turn on GPIOs for slot %d\n", - __func__, dev_id); - } else { - clear_bit(dev_id, &gpio_sts); - if (curr->sleep_cfg_data) { - msm_gpios_enable(curr->sleep_cfg_data, curr->size); - msm_gpios_free(curr->sleep_cfg_data, curr->size); - } else { - msm_gpios_disable_free(curr->cfg_data, curr->size); - } - } - - return rc; -} - -static uint32_t msm_sdcc_setup_vreg(int dev_id, unsigned int enable) -{ - int rc = 0; - struct regulator *curr = sdcc_vreg_data[dev_id - 1]; - static int enabled_once[] = {0, 0, 0, 0}; - - if (test_bit(dev_id, &vreg_sts) == enable) - return rc; - - if (dev_id == 4) { - if (enable) { - pr_debug("Enable Vdd dev_%d\n", dev_id); - gpio_set_value_cansleep( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC4_PWR_EN_N), - 0); - set_bit(dev_id, &vreg_sts); - } else { - pr_debug("Disable Vdd dev_%d\n", dev_id); - gpio_set_value_cansleep( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC4_PWR_EN_N), - 1); - clear_bit(dev_id, &vreg_sts); - } - } - - if (!enable || enabled_once[dev_id - 1]) - return 0; - if (!curr) - return -ENODEV; - - if (IS_ERR(curr)) - return PTR_ERR(curr); - - if (enable) { - set_bit(dev_id, &vreg_sts); - - rc = regulator_enable(curr); - if (rc) - pr_err("%s: could not enable regulator: %d\n", - __func__, rc); - enabled_once[dev_id - 1] = 1; - } else { - clear_bit(dev_id, &vreg_sts); - - rc = regulator_disable(curr); - if (rc) - pr_err("%s: could not disable regulator: %d\n", - __func__, rc); - } - return rc; -} - -static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) -{ - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - rc = msm_sdcc_setup_gpio(pdev->id, (vdd ? 1 : 0)); - if (rc) - goto out; - - if (pdev->id == 4) /* S3 is always ON and cannot be disabled */ - rc = msm_sdcc_setup_vreg(pdev->id, (vdd ? 1 : 0)); -out: - return rc; -} - -#if defined(CONFIG_MMC_MSM_SDC1_SUPPORT) && \ - defined(CONFIG_CSDIO_VENDOR_ID) && \ - defined(CONFIG_CSDIO_DEVICE_ID) && \ - (CONFIG_CSDIO_VENDOR_ID == 0x70 && CONFIG_CSDIO_DEVICE_ID == 0x1117) - -#define MBP_ON 1 -#define MBP_OFF 0 - -#define MBP_RESET_N \ - GPIO_CFG(44, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA) -#define MBP_INT0 \ - GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA) - -#define MBP_MODE_CTRL_0 \ - GPIO_CFG(35, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA) -#define MBP_MODE_CTRL_1 \ - GPIO_CFG(36, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA) -#define MBP_MODE_CTRL_2 \ - GPIO_CFG(34, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA) -#define TSIF_EN \ - GPIO_CFG(35, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_DATA \ - GPIO_CFG(36, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_CLK \ - GPIO_CFG(34, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static struct msm_gpio mbp_cfg_data[] = { - {GPIO_CFG(44, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), - "mbp_reset"}, - {GPIO_CFG(85, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), - "mbp_io_voltage"}, -}; - -static int mbp_config_gpios_pre_init(int enable) -{ - int rc = 0; - - if (enable) { - rc = msm_gpios_request_enable(mbp_cfg_data, - ARRAY_SIZE(mbp_cfg_data)); - if (rc) { - printk(KERN_ERR - "%s: Failed to turnon GPIOs for mbp chip(%d)\n", - __func__, rc); - } - } else - msm_gpios_disable_free(mbp_cfg_data, ARRAY_SIZE(mbp_cfg_data)); - return rc; -} - -static struct regulator_bulk_data mbp_regs_io[2]; -static struct regulator_bulk_data mbp_regs_rf[2]; -static struct regulator_bulk_data mbp_regs_adc[1]; -static struct regulator_bulk_data mbp_regs_core[1]; - -static int mbp_init_regs(struct device *dev) -{ - struct regulator_bulk_data regs[] = { - /* Analog and I/O regs */ - { .supply = "gp4", .min_uV = 2600000, .max_uV = 2600000 }, - { .supply = "s3", .min_uV = 1800000, .max_uV = 1800000 }, - /* RF regs */ - { .supply = "s2", .min_uV = 1300000, .max_uV = 1300000 }, - { .supply = "rf", .min_uV = 2600000, .max_uV = 2600000 }, - /* ADC regs */ - { .supply = "s4", .min_uV = 2200000, .max_uV = 2200000 }, - /* Core regs */ - { .supply = "gp16", .min_uV = 1200000, .max_uV = 1200000 }, - }; - - struct regulator_bulk_data *regptr = regs; - int rc; - - rc = regulator_bulk_get(dev, ARRAY_SIZE(regs), regs); - - if (rc) { - dev_err(dev, "%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs), regs); - - if (rc) { - dev_err(dev, "%s: could not set voltages: %d\n", - __func__, rc); - goto reg_free; - } - - memcpy(mbp_regs_io, regptr, sizeof(mbp_regs_io)); - regptr += ARRAY_SIZE(mbp_regs_io); - - memcpy(mbp_regs_rf, regptr, sizeof(mbp_regs_rf)); - regptr += ARRAY_SIZE(mbp_regs_rf); - - memcpy(mbp_regs_adc, regptr, sizeof(mbp_regs_adc)); - regptr += ARRAY_SIZE(mbp_regs_adc); - - memcpy(mbp_regs_core, regptr, sizeof(mbp_regs_core)); - - return 0; - -reg_free: - regulator_bulk_free(ARRAY_SIZE(regs), regs); -out: - return rc; -} - -static int mbp_setup_rf_vregs(int state) -{ - return state ? - regulator_bulk_enable(ARRAY_SIZE(mbp_regs_rf), mbp_regs_rf) : - regulator_bulk_disable(ARRAY_SIZE(mbp_regs_rf), mbp_regs_rf); -} - -static int mbp_setup_vregs(int state) -{ - return state ? - regulator_bulk_enable(ARRAY_SIZE(mbp_regs_io), mbp_regs_io) : - regulator_bulk_disable(ARRAY_SIZE(mbp_regs_io), mbp_regs_io); -} - -static int mbp_set_tcxo_en(int enable) -{ - int rc; - const char *id = "UBMC"; - struct vreg *vreg_analog = NULL; - - rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_A1, - enable ? PMAPP_CLOCK_VOTE_ON : PMAPP_CLOCK_VOTE_OFF); - if (rc < 0) { - printk(KERN_ERR "%s: unable to %svote for a1 clk\n", - __func__, enable ? "" : "de-"); - return -EIO; - } - return rc; -} - -static void mbp_set_freeze_io(int state) -{ - if (state) - gpio_set_value(85, 0); - else - gpio_set_value(85, 1); -} - -static int mbp_set_core_voltage_en(int enable) -{ - static bool is_enabled; - int rc = 0; - - if (enable && !is_enabled) { - rc = regulator_bulk_enable(ARRAY_SIZE(mbp_regs_core), - mbp_regs_core); - if (rc) { - pr_err("%s: could not enable regulators: %d\n", - __func__, rc); - } else { - is_enabled = true; - } - } - - return rc; -} - -static void mbp_set_reset(int state) -{ - if (state) - gpio_set_value(GPIO_PIN(MBP_RESET_N), 0); - else - gpio_set_value(GPIO_PIN(MBP_RESET_N), 1); -} - -static int mbp_config_interface_mode(int state) -{ - if (state) { - gpio_tlmm_config(MBP_MODE_CTRL_0, GPIO_CFG_ENABLE); - gpio_tlmm_config(MBP_MODE_CTRL_1, GPIO_CFG_ENABLE); - gpio_tlmm_config(MBP_MODE_CTRL_2, GPIO_CFG_ENABLE); - gpio_set_value(GPIO_PIN(MBP_MODE_CTRL_0), 0); - gpio_set_value(GPIO_PIN(MBP_MODE_CTRL_1), 1); - gpio_set_value(GPIO_PIN(MBP_MODE_CTRL_2), 0); - } else { - gpio_tlmm_config(MBP_MODE_CTRL_0, GPIO_CFG_DISABLE); - gpio_tlmm_config(MBP_MODE_CTRL_1, GPIO_CFG_DISABLE); - gpio_tlmm_config(MBP_MODE_CTRL_2, GPIO_CFG_DISABLE); - } - return 0; -} - -static int mbp_setup_adc_vregs(int state) -{ - return state ? - regulator_bulk_enable(ARRAY_SIZE(mbp_regs_adc), mbp_regs_adc) : - regulator_bulk_disable(ARRAY_SIZE(mbp_regs_adc), mbp_regs_adc); -} - -static int mbp_power_up(void) -{ - int rc; - - rc = mbp_config_gpios_pre_init(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: mbp_config_gpios_pre_init() done\n", __func__); - - rc = mbp_setup_vregs(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: gp4 (2.6) and s3 (1.8) done\n", __func__); - - rc = mbp_set_tcxo_en(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: tcxo clock done\n", __func__); - - mbp_set_freeze_io(MBP_OFF); - pr_debug("%s: set gpio 85 to 1 done\n", __func__); - - udelay(100); - mbp_set_reset(MBP_ON); - - udelay(300); - rc = mbp_config_interface_mode(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: mbp_config_interface_mode() done\n", __func__); - - udelay(100 + mbp_set_core_voltage_en(MBP_ON)); - pr_debug("%s: power gp16 1.2V done\n", __func__); - - mbp_set_freeze_io(MBP_ON); - pr_debug("%s: set gpio 85 to 0 done\n", __func__); - - udelay(100); - - rc = mbp_setup_rf_vregs(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: s2 1.3V and rf 2.6V done\n", __func__); - - rc = mbp_setup_adc_vregs(MBP_ON); - if (rc) - goto exit; - pr_debug("%s: s4 2.2V done\n", __func__); - - udelay(200); - - mbp_set_reset(MBP_OFF); - pr_debug("%s: close gpio 44 done\n", __func__); - - msleep(20); -exit: - return rc; -} - -static int mbp_power_down(void) -{ - int rc; - - mbp_set_reset(MBP_ON); - pr_debug("%s: mbp_set_reset(MBP_ON) done\n", __func__); - - udelay(100); - - rc = mbp_setup_adc_vregs(MBP_OFF); - if (rc) - goto exit; - pr_debug("%s: vreg_disable(vreg_adc) done\n", __func__); - - udelay(5); - - rc = mbp_setup_rf_vregs(MBP_OFF); - if (rc) - goto exit; - pr_debug("%s: mbp_setup_rf_vregs(MBP_OFF) done\n", __func__); - - udelay(5); - - mbp_set_freeze_io(MBP_OFF); - pr_debug("%s: mbp_set_freeze_io(MBP_OFF) done\n", __func__); - - udelay(100); - rc = mbp_set_core_voltage_en(MBP_OFF); - if (rc) - goto exit; - pr_debug("%s: mbp_set_core_voltage_en(MBP_OFF) done\n", __func__); - - rc = mbp_set_tcxo_en(MBP_OFF); - if (rc) - goto exit; - pr_debug("%s: mbp_set_tcxo_en(MBP_OFF) done\n", __func__); - - rc = mbp_setup_vregs(MBP_OFF); - if (rc) - goto exit; - pr_debug("%s: mbp_setup_vregs(MBP_OFF) done\n", __func__); - - rc = mbp_config_gpios_pre_init(MBP_OFF); - if (rc) - goto exit; -exit: - return rc; -} - -static void (*mbp_status_notify_cb)(int card_present, void *dev_id); -static void *mbp_status_notify_cb_devid; -static int mbp_power_status; -static int mbp_power_init_done; - -static uint32_t mbp_setup_power(struct device *dv, - unsigned int power_status) -{ - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - - if (power_status == mbp_power_status) - goto exit; - if (power_status) { - pr_debug("turn on power of mbp slot"); - rc = mbp_power_up(); - mbp_power_status = 1; - } else { - pr_debug("turn off power of mbp slot"); - rc = mbp_power_down(); - mbp_power_status = 0; - } -exit: - return rc; -}; - -int mbp_register_status_notify(void (*callback)(int, void *), - void *dev_id) -{ - mbp_status_notify_cb = callback; - mbp_status_notify_cb_devid = dev_id; - return 0; -} - -static unsigned int mbp_status(struct device *dev) -{ - return mbp_power_status; -} - -static uint32_t msm_sdcc_setup_power_mbp(struct device *dv, unsigned int vdd) -{ - struct platform_device *pdev; - uint32_t rc = 0; - - pdev = container_of(dv, struct platform_device, dev); - rc = msm_sdcc_setup_power(dv, vdd); - if (rc) { - pr_err("%s: Failed to setup power (%d)\n", - __func__, rc); - goto out; - } - if (!mbp_power_init_done) { - rc = mbp_init_regs(dv); - if (rc) { - dev_err(dv, "%s: regulator init failed: %d\n", - __func__, rc); - goto out; - } - mbp_setup_power(dv, 1); - mbp_setup_power(dv, 0); - mbp_power_init_done = 1; - } - if (vdd >= 0x8000) { - rc = mbp_setup_power(dv, (0x8000 == vdd) ? 0 : 1); - if (rc) { - pr_err("%s: Failed to config mbp chip power (%d)\n", - __func__, rc); - goto out; - } - if (mbp_status_notify_cb) { - mbp_status_notify_cb(mbp_power_status, - mbp_status_notify_cb_devid); - } - } -out: - /* should return 0 only */ - return 0; -} - -#endif - -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static unsigned int msm7x30_sdcc_slot_status(struct device *dev) -{ - return (unsigned int) - gpio_get_value_cansleep( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SD_DET - 1)); -} - -static int msm_sdcc_get_wpswitch(struct device *dv) -{ - void __iomem *wp_addr = 0; - uint32_t ret = 0; - struct platform_device *pdev; - - if (!(machine_is_msm7x30_surf())) - return -1; - pdev = container_of(dv, struct platform_device, dev); - - wp_addr = ioremap(FPGA_SDCC_STATUS, 4); - if (!wp_addr) { - pr_err("%s: Could not remap %x\n", __func__, FPGA_SDCC_STATUS); - return -ENOMEM; - } - - ret = (((readl(wp_addr) >> 4) >> (pdev->id-1)) & 0x01); - pr_info("%s: WP Status for Slot %d = 0x%x \n", __func__, - pdev->id, ret); - iounmap(wp_addr); - - return ret; -} -#endif - -#if defined(CONFIG_MMC_MSM_SDC1_SUPPORT) -#if defined(CONFIG_CSDIO_VENDOR_ID) && \ - defined(CONFIG_CSDIO_DEVICE_ID) && \ - (CONFIG_CSDIO_VENDOR_ID == 0x70 && CONFIG_CSDIO_DEVICE_ID == 0x1117) -static struct mmc_platform_data msm7x30_sdc1_data = { - .ocr_mask = MMC_VDD_165_195 | MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power_mbp, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .status = mbp_status, - .register_status_notify = mbp_register_status_notify, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 24576000, - .nonremovable = 0, -}; -#else -static struct mmc_platform_data msm7x30_sdc1_data = { - .ocr_mask = MMC_VDD_165_195, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct mmc_platform_data msm7x30_sdc2_data = { - .ocr_mask = MMC_VDD_165_195 | MMC_VDD_27_28, - .translate_vdd = msm_sdcc_setup_power, -#ifdef CONFIG_MMC_MSM_SDC2_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 1, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data msm7x30_sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .sdiowakeup_irq = MSM_GPIO_TO_INT(118), - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct mmc_platform_data msm7x30_sdc4_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .status = msm7x30_sdcc_slot_status, - .status_irq = PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, PMIC_GPIO_SD_DET - 1), - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - .wpswitch = msm_sdcc_get_wpswitch, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 24576000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static int msm_sdc1_lvlshft_enable(void) -{ - static struct regulator *ldo5; - int rc; - - /* Enable LDO5, an input to the FET that powers slot 1 */ - - ldo5 = regulator_get(NULL, "ldo5"); - - if (IS_ERR(ldo5)) { - rc = PTR_ERR(ldo5); - pr_err("%s: could not get ldo5: %d\n", __func__, rc); - goto out; - } - - rc = regulator_set_voltage(ldo5, 2850000, 2850000); - if (rc) { - pr_err("%s: could not set ldo5 voltage: %d\n", __func__, rc); - goto ldo5_free; - } - - rc = regulator_enable(ldo5); - if (rc) { - pr_err("%s: could not enable ldo5: %d\n", __func__, rc); - goto ldo5_free; - } - - /* Enable GPIO 35, to turn on the FET that powers slot 1 */ - rc = msm_gpios_request_enable(sdc1_lvlshft_cfg_data, - ARRAY_SIZE(sdc1_lvlshft_cfg_data)); - if (rc) - printk(KERN_ERR "%s: Failed to enable GPIO 35\n", __func__); - - rc = gpio_direction_output(GPIO_PIN(sdc1_lvlshft_cfg_data[0].gpio_cfg), - 1); - if (rc) - printk(KERN_ERR "%s: Failed to turn on GPIO 35\n", __func__); - - return 0; - -ldo5_free: - regulator_put(ldo5); -out: - ldo5 = NULL; - return rc; -} -#endif - -static int mmc_regulator_init(int sdcc_no, const char *supply, int uV) -{ - int rc; - - BUG_ON(sdcc_no < 1 || sdcc_no > 4); - - sdcc_no--; - - sdcc_vreg_data[sdcc_no] = regulator_get(NULL, supply); - - if (IS_ERR(sdcc_vreg_data[sdcc_no])) { - rc = PTR_ERR(sdcc_vreg_data[sdcc_no]); - pr_err("%s: could not get regulator \"%s\": %d\n", - __func__, supply, rc); - goto out; - } - - rc = regulator_set_voltage(sdcc_vreg_data[sdcc_no], uV, uV); - - if (rc) { - pr_err("%s: could not set voltage for \"%s\" to %d uV: %d\n", - __func__, supply, uV, rc); - goto reg_free; - } - - return rc; - -reg_free: - regulator_put(sdcc_vreg_data[sdcc_no]); -out: - sdcc_vreg_data[sdcc_no] = NULL; - return rc; -} - -static void __init msm7x30_init_mmc(void) -{ -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - if (mmc_regulator_init(1, "s3", 1800000)) - goto out1; - - if (machine_is_msm7x30_fluid()) { - msm7x30_sdc1_data.ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29; - if (msm_sdc1_lvlshft_enable()) { - pr_err("%s: could not enable level shift\n"); - goto out1; - } - } - - msm_add_sdcc(1, &msm7x30_sdc1_data); -out1: -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - if (mmc_regulator_init(2, "s3", 1800000)) - goto out2; - - if (machine_is_msm8x55_svlte_surf()) - msm7x30_sdc2_data.msmsdcc_fmax = 24576000; - if (machine_is_msm8x55_svlte_surf() || - machine_is_msm8x55_svlte_ffa()) { - msm7x30_sdc2_data.sdiowakeup_irq = MSM_GPIO_TO_INT(68); - msm7x30_sdc2_data.is_sdio_al_client = 1; - } - - msm_add_sdcc(2, &msm7x30_sdc2_data); -out2: -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - if (mmc_regulator_init(3, "s3", 1800000)) - goto out3; - - msm_sdcc_setup_gpio(3, 1); - msm_add_sdcc(3, &msm7x30_sdc3_data); -out3: -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - if (mmc_regulator_init(4, "mmc", 2850000)) - return; - - msm_add_sdcc(4, &msm7x30_sdc4_data); -#endif - -} - -static void __init msm7x30_init_nand(void) -{ - char *build_id; - struct flash_platform_data *plat_data; - - build_id = socinfo_get_build_id(); - if (build_id == NULL) { - pr_err("%s: Build ID not available from socinfo\n", __func__); - return; - } - - if (build_id[8] == 'C' && - !msm_gpios_request_enable(msm_nand_ebi2_cfg_data, - ARRAY_SIZE(msm_nand_ebi2_cfg_data))) { - plat_data = msm_device_nand.dev.platform_data; - plat_data->interleave = 1; - printk(KERN_INFO "%s: Interleave mode Build ID found\n", - __func__); - } -} - -#ifdef CONFIG_SERIAL_MSM_CONSOLE -static struct msm_gpio uart2_config_data[] = { - { GPIO_CFG(49, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "UART2_RFR"}, - { GPIO_CFG(50, 2, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "UART2_CTS"}, - { GPIO_CFG(51, 2, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "UART2_Rx"}, - { GPIO_CFG(52, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "UART2_Tx"}, -}; - -static void msm7x30_init_uart2(void) -{ - msm_gpios_request_enable(uart2_config_data, - ARRAY_SIZE(uart2_config_data)); - -} -#endif - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define TSIF_B_SYNC GPIO_CFG(37, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_B_DATA GPIO_CFG(36, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_B_EN GPIO_CFG(35, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_B_CLK GPIO_CFG(34, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif_gpios[] = { - { .gpio_cfg = TSIF_B_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_B_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_B_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_B_SYNC, .label = "tsif_sync", }, -}; - -static struct msm_tsif_platform_data tsif_platform_data = { - .num_gpios = ARRAY_SIZE(tsif_gpios), - .gpios = tsif_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -static void __init pmic8058_leds_init(void) -{ - if (machine_is_msm7x30_surf()) - pm8058_7x30_data.leds_pdata = &pm8058_surf_leds_data; - else if (!machine_is_msm7x30_fluid()) - pm8058_7x30_data.leds_pdata = &pm8058_ffa_leds_data; - else if (machine_is_msm7x30_fluid()) - pm8058_7x30_data.leds_pdata = &pm8058_fluid_leds_data; -} - -<<<<<<< HEAD -#include -#include "devices.h" -#include "gpiomux.h" -#include "proc_comm.h" -#include "common.h" -======= -static struct msm_spm_platform_data msm_spm_data __initdata = { - .reg_base_addr = MSM_SAW0_BASE, - - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x05, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x18, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x00006666, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0xFF000666, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x03, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0xF2, - .retention_vlevel = 0xE0, - .collapse_vlevel = 0x72, - .retention_mid_vlevel = 0xE0, - .collapse_mid_vlevel = 0xE0, - - .vctl_timeout_us = 50, -}; - -#if defined(CONFIG_TOUCHSCREEN_TSC2007) || \ - defined(CONFIG_TOUCHSCREEN_TSC2007_MODULE) - -#define TSC2007_TS_PEN_INT 20 - -static struct msm_gpio tsc2007_config_data[] = { - { GPIO_CFG(TSC2007_TS_PEN_INT, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "tsc2007_irq" }, -}; - -static struct regulator_bulk_data tsc2007_regs[] = { - { .supply = "s3", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "s2", .min_uV = 1300000, .max_uV = 1300000 }, -}; - -static int tsc2007_init(void) -{ - int rc; - - rc = regulator_bulk_get(NULL, ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - - if (rc) { - pr_err("%s: could not set voltages: %d\n", __func__, rc); - goto reg_free; - } - - rc = regulator_bulk_enable(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - - if (rc) { - pr_err("%s: could not enable regulators: %d\n", __func__, rc); - goto reg_free; - } - - rc = msm_gpios_request_enable(tsc2007_config_data, - ARRAY_SIZE(tsc2007_config_data)); - if (rc) { - pr_err("%s: Unable to request gpios\n", __func__); - goto reg_disable; - } - - return 0; - -reg_disable: - regulator_bulk_disable(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); -reg_free: - regulator_bulk_free(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); -out: - return rc; -} - -static int tsc2007_get_pendown_state(void) -{ - int rc; - - rc = gpio_get_value(TSC2007_TS_PEN_INT); - if (rc < 0) { - pr_err("%s: MSM GPIO %d read failed\n", __func__, - TSC2007_TS_PEN_INT); - return rc; - } - - return (rc == 0 ? 1 : 0); -} - -static void tsc2007_exit(void) -{ - - regulator_bulk_disable(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - regulator_bulk_free(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - - msm_gpios_disable_free(tsc2007_config_data, - ARRAY_SIZE(tsc2007_config_data)); -} - -static int tsc2007_power_shutdown(bool enable) -{ - int rc; - - rc = (enable == false) ? - regulator_bulk_enable(ARRAY_SIZE(tsc2007_regs), tsc2007_regs) : - regulator_bulk_disable(ARRAY_SIZE(tsc2007_regs), tsc2007_regs); - - if (rc) { - pr_err("%s: could not %sable regulators: %d\n", - __func__, enable ? "dis" : "en", rc); - return rc; - } - - if (enable == false) - msleep(20); - - return 0; -} - -static struct tsc2007_platform_data tsc2007_ts_data = { - .model = 2007, - .x_plate_ohms = 300, - .min_x = 210, - .max_x = 3832, - .min_y = 150, - .max_y = 3936, - .irq_flags = IRQF_TRIGGER_LOW, - .init_platform_hw = tsc2007_init, - .exit_platform_hw = tsc2007_exit, - .power_shutdown = tsc2007_power_shutdown, - .invert_x = true, - .invert_y = true, - /* REVISIT: Temporary fix for reversed pressure */ - .invert_z1 = true, - .invert_z2 = true, - .get_pendown_state = tsc2007_get_pendown_state, -}; - -static struct i2c_board_info tsc_i2c_board_info[] = { - { - I2C_BOARD_INFO("tsc2007", 0x48), - .irq = MSM_GPIO_TO_INT(TSC2007_TS_PEN_INT), - .platform_data = &tsc2007_ts_data, - }, -}; -#endif - -static struct regulator_bulk_data regs_isa1200[] = { - { .supply = "gp7", .min_uV = 1800000, .max_uV = 1800000 }, - { .supply = "gp10", .min_uV = 2600000, .max_uV = 2600000 }, -}; - -static int isa1200_power(int vreg_on) -{ - int rc = 0; - - rc = vreg_on ? - regulator_bulk_enable(ARRAY_SIZE(regs_isa1200), regs_isa1200) : - regulator_bulk_disable(ARRAY_SIZE(regs_isa1200), regs_isa1200); - - if (rc) { - pr_err("%s: could not %sable regulators: %d\n", - __func__, vreg_on ? "en" : "dis", rc); - goto out; - } - - /* vote for DO buffer */ - rc = pmapp_clock_vote("VIBR", PMAPP_CLOCK_ID_DO, - vreg_on ? PMAPP_CLOCK_VOTE_ON : PMAPP_CLOCK_VOTE_OFF); - if (rc) { - pr_err("%s: unable to %svote for d0 clk\n", - __func__, vreg_on ? "" : "de-"); - goto vreg_fail; - } ->>>>>>> Add snapshot of mach-msm from beginning of msm-3.4 - - return 0; - -vreg_fail: - if (vreg_on) - regulator_bulk_disable(ARRAY_SIZE(regs_isa1200), regs_isa1200); - else - regulator_bulk_enable(ARRAY_SIZE(regs_isa1200), regs_isa1200); -out: - return rc; -} - -static int isa1200_dev_setup(bool enable) -{ - int rc; - - if (enable == true) { - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_isa1200), - regs_isa1200); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_isa1200), - regs_isa1200); - if (rc) { - pr_err("%s: could not set voltages: %d\n", - __func__, rc); - goto reg_free; - } - - rc = gpio_tlmm_config(GPIO_CFG(HAP_LVL_SHFT_MSM_GPIO, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: Could not configure gpio %d\n", - __func__, HAP_LVL_SHFT_MSM_GPIO); - goto reg_free; - } - - rc = gpio_request(HAP_LVL_SHFT_MSM_GPIO, "haptics_shft_lvl_oe"); - if (rc) { - pr_err("%s: unable to request gpio %d (%d)\n", - __func__, HAP_LVL_SHFT_MSM_GPIO, rc); - goto reg_free; - } - - gpio_set_value(HAP_LVL_SHFT_MSM_GPIO, 1); - } else { - regulator_bulk_free(ARRAY_SIZE(regs_isa1200), regs_isa1200); - gpio_free(HAP_LVL_SHFT_MSM_GPIO); - } - - return 0; - -reg_free: - regulator_bulk_free(ARRAY_SIZE(regs_isa1200), regs_isa1200); -out: - return rc; -} -static struct isa1200_platform_data isa1200_1_pdata = { - .name = "vibrator", - .power_on = isa1200_power, - .dev_setup = isa1200_dev_setup, - .pwm_ch_id = 1, /*channel id*/ - /*gpio to enable haptic*/ - .hap_en_gpio = PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_ENABLE), - .hap_len_gpio = -1, - .max_timeout = 15000, - .mode_ctrl = PWM_GEN_MODE, - .pwm_fd = { - .pwm_div = 256, - }, - .is_erm = false, - .smart_en = true, - .ext_clk_en = true, - .chip_en = 1, -}; - -static struct i2c_board_info msm_isa1200_board_info[] = { - { - I2C_BOARD_INFO("isa1200_1", 0x90>>1), - .platform_data = &isa1200_1_pdata, - }, -}; - - -static int kp_flip_mpp_config(void) -{ - struct pm8xxx_mpp_config_data kp_flip_mpp = { - .type = PM8XXX_MPP_TYPE_D_INPUT, - .level = PM8018_MPP_DIG_LEVEL_S3, - .control = PM8XXX_MPP_DIN_TO_INT, - }; - - return pm8xxx_mpp_config(PM8058_MPP_PM_TO_SYS(PM_FLIP_MPP), - &kp_flip_mpp); -} - -static struct flip_switch_pdata flip_switch_data = { - .name = "kp_flip_switch", - .flip_gpio = PM8058_GPIO_PM_TO_SYS(PM8058_GPIOS) + PM_FLIP_MPP, - .left_key = KEY_OPEN, - .right_key = KEY_CLOSE, - .active_low = 0, - .wakeup = 1, - .flip_mpp_config = kp_flip_mpp_config, -}; - -static struct platform_device flip_switch_device = { - .name = "kp_flip_switch", - .id = -1, - .dev = { - .platform_data = &flip_switch_data, - } -}; - -static struct regulator_bulk_data regs_tma300[] = { - { .supply = "gp6", .min_uV = 3050000, .max_uV = 3100000 }, - { .supply = "gp7", .min_uV = 1800000, .max_uV = 1800000 }, -}; - -static int tma300_power(int vreg_on) -{ - int rc; - - rc = vreg_on ? - regulator_bulk_enable(ARRAY_SIZE(regs_tma300), regs_tma300) : - regulator_bulk_disable(ARRAY_SIZE(regs_tma300), regs_tma300); - - if (rc) - pr_err("%s: could not %sable regulators: %d\n", - __func__, vreg_on ? "en" : "dis", rc); - return rc; -} - -#define TS_GPIO_IRQ 150 - -static int tma300_dev_setup(bool enable) -{ - int rc; - - if (enable) { - rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_tma300), - regs_tma300); - - if (rc) { - pr_err("%s: could not get regulators: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_tma300), - regs_tma300); - - if (rc) { - pr_err("%s: could not set voltages: %d\n", - __func__, rc); - goto reg_free; - } - - /* enable interrupt gpio */ - rc = gpio_tlmm_config(GPIO_CFG(TS_GPIO_IRQ, 0, GPIO_CFG_INPUT, - GPIO_CFG_PULL_UP, GPIO_CFG_6MA), GPIO_CFG_ENABLE); - if (rc) { - pr_err("%s: Could not configure gpio %d\n", - __func__, TS_GPIO_IRQ); - goto reg_free; - } - - /* virtual keys */ - tma300_vkeys_attr.attr.name = "virtualkeys.msm_tma300_ts"; - properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (!properties_kobj) { - pr_err("%s: failed to create a kobject " - "for board_properties\n", __func__); - rc = -ENOMEM; - goto reg_free; - } - rc = sysfs_create_group(properties_kobj, - &tma300_properties_attr_group); - if (rc) { - pr_err("%s: failed to create a sysfs entry %s\n", - __func__, tma300_vkeys_attr.attr.name); - goto kobj_free; - } - } else { - regulator_bulk_free(ARRAY_SIZE(regs_tma300), regs_tma300); - /* destroy virtual keys */ - if (properties_kobj) { - sysfs_remove_group(properties_kobj, - &tma300_properties_attr_group); - kobject_put(properties_kobj); - } - } - return 0; - -kobj_free: - kobject_put(properties_kobj); - properties_kobj = NULL; -reg_free: - regulator_bulk_free(ARRAY_SIZE(regs_tma300), regs_tma300); -out: - return rc; -} - -static struct cy8c_ts_platform_data cy8ctma300_pdata = { - .power_on = tma300_power, - .dev_setup = tma300_dev_setup, - .ts_name = "msm_tma300_ts", - .dis_min_x = 0, - .dis_max_x = 479, - .dis_min_y = 0, - .dis_max_y = 799, - .res_x = 479, - .res_y = 1009, - .min_tid = 1, - .max_tid = 255, - .min_touch = 0, - .max_touch = 255, - .min_width = 0, - .max_width = 255, - .invert_y = 1, - .nfingers = 4, - .irq_gpio = TS_GPIO_IRQ, - .resout_gpio = -1, -}; - -static struct i2c_board_info cy8ctma300_board_info[] = { - { - I2C_BOARD_INFO("cy8ctma300", 0x2), - .platform_data = &cy8ctma300_pdata, - } -}; - -static void __init msm7x30_init(void) -{ - int rc; - unsigned smem_size; - uint32_t usb_hub_gpio_cfg_value = GPIO_CFG(56, - 0, - GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, - GPIO_CFG_2MA); - uint32_t soc_version = 0; - - soc_version = socinfo_get_version(); - - msm_clock_init(&msm7x30_clock_init_data); -#ifdef CONFIG_SERIAL_MSM_CONSOLE - msm7x30_init_uart2(); -#endif - msm_spm_init(&msm_spm_data, 1); - platform_device_register(&msm7x30_device_acpuclk); - if (machine_is_msm7x30_surf() || machine_is_msm7x30_fluid()) - msm7x30_cfg_smsc911x(); - -#ifdef CONFIG_USB_MSM_OTG_72K - if (SOCINFO_VERSION_MAJOR(soc_version) >= 2 && - SOCINFO_VERSION_MINOR(soc_version) >= 1) { - pr_debug("%s: SOC Version:2.(1 or more)\n", __func__); - msm_otg_pdata.ldo_set_voltage = 0; - } - - msm_device_otg.dev.platform_data = &msm_otg_pdata; -#ifdef CONFIG_USB_GADGET - msm_otg_pdata.swfi_latency = - msm_pm_data - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; -#endif -#endif - msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(136); - msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata; -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - msm_device_tsif.dev.platform_data = &tsif_platform_data; -#endif - if (machine_is_msm7x30_fluid()) { - msm_adc_pdata.dev_names = msm_adc_fluid_device_names; - msm_adc_pdata.num_adc = ARRAY_SIZE(msm_adc_fluid_device_names); - } else { - msm_adc_pdata.dev_names = msm_adc_surf_device_names; - msm_adc_pdata.num_adc = ARRAY_SIZE(msm_adc_surf_device_names); - } - - pmic8058_leds_init(); - - buses_init(); - -#ifdef CONFIG_MSM_SSBI - msm_device_ssbi_pmic1.dev.platform_data = - &msm7x30_ssbi_pm8058_pdata; -#endif - - platform_add_devices(msm_footswitch_devices, - msm_num_footswitch_devices); - platform_add_devices(devices, ARRAY_SIZE(devices)); -#ifdef CONFIG_USB_EHCI_MSM_72K - msm_add_host(0, &msm_usb_host_pdata); -#endif -#ifdef CONFIG_MSM_CAMERA_V4L2 - msm7x30_init_cam(); -#endif - msm7x30_init_mmc(); - msm7x30_init_nand(); - msm_qsd_spi_init(); - -#ifdef CONFIG_SPI_QSD - if (machine_is_msm7x30_fluid()) - spi_register_board_info(lcdc_sharp_spi_board_info, - ARRAY_SIZE(lcdc_sharp_spi_board_info)); - else - spi_register_board_info(lcdc_toshiba_spi_board_info, - ARRAY_SIZE(lcdc_toshiba_spi_board_info)); -#endif - - atv_dac_power_init(); - sensors_ldo_init(); - hdmi_init_regs(); - msm_fb_add_devices(); - msm_pm_set_platform_data(msm_pm_data, ARRAY_SIZE(msm_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - msm_pm_register_irqs(); - msm_device_i2c_init(); - msm_device_i2c_2_init(); - qup_device_i2c_init(); - msm7x30_init_marimba(); -#ifdef CONFIG_MSM7KV2_AUDIO - snddev_poweramp_gpio_init(); - snddev_hsed_voltage_init(); - aux_pcm_gpio_init(); -#endif - - i2c_register_board_info(0, msm_i2c_board_info, - ARRAY_SIZE(msm_i2c_board_info)); - - if (!machine_is_msm8x55_svlte_ffa() && !machine_is_msm7x30_fluid()) - marimba_pdata.tsadc = &marimba_tsadc_pdata; - - if (machine_is_msm7x30_fluid()) - i2c_register_board_info(0, cy8info, - ARRAY_SIZE(cy8info)); -#ifdef CONFIG_BOSCH_BMA150 - if (machine_is_msm7x30_fluid()) - i2c_register_board_info(0, bma150_board_info, - ARRAY_SIZE(bma150_board_info)); -#endif - - i2c_register_board_info(2, msm_marimba_board_info, - ARRAY_SIZE(msm_marimba_board_info)); - - i2c_register_board_info(2, msm_i2c_gsbi7_timpani_info, - ARRAY_SIZE(msm_i2c_gsbi7_timpani_info)); - - i2c_register_board_info(4 /* QUP ID */, msm_camera_boardinfo, - ARRAY_SIZE(msm_camera_boardinfo)); - - bt_power_init(); -#ifdef CONFIG_I2C_SSBI - msm_device_ssbi7.dev.platform_data = &msm_i2c_ssbi7_pdata; -#endif - if (machine_is_msm7x30_fluid()) - i2c_register_board_info(0, msm_isa1200_board_info, - ARRAY_SIZE(msm_isa1200_board_info)); - -#if defined(CONFIG_TOUCHSCREEN_TSC2007) || \ - defined(CONFIG_TOUCHSCREEN_TSC2007_MODULE) - if (machine_is_msm8x55_svlte_ffa()) - i2c_register_board_info(2, tsc_i2c_board_info, - ARRAY_SIZE(tsc_i2c_board_info)); -#endif - - if (machine_is_msm7x30_surf()) - platform_device_register(&flip_switch_device); - - pm8058_gpios_init(); - - if (machine_is_msm7x30_fluid()) { - /* Initialize platform data for fluid v2 hardware */ - if (SOCINFO_VERSION_MAJOR( - socinfo_get_platform_version()) == 2) { - cy8ctma300_pdata.res_y = 920; - cy8ctma300_pdata.invert_y = 0; - } - i2c_register_board_info(0, cy8ctma300_board_info, - ARRAY_SIZE(cy8ctma300_board_info)); - } - - if (machine_is_msm8x55_svlte_surf() || machine_is_msm8x55_svlte_ffa()) { - rc = gpio_tlmm_config(usb_hub_gpio_cfg_value, GPIO_CFG_ENABLE); - if (rc) - pr_err("%s: gpio_tlmm_config(%#x)=%d\n", - __func__, usb_hub_gpio_cfg_value, rc); - } - - boot_reason = *(unsigned int *) - (smem_get_entry(SMEM_POWER_ON_STATUS_INFO, &smem_size)); - printk(KERN_NOTICE "Boot Reason = 0x%02x\n", boot_reason); -} - -static unsigned pmem_sf_size = MSM_PMEM_SF_SIZE; -static int __init pmem_sf_size_setup(char *p) -{ - pmem_sf_size = memparse(p, NULL); - return 0; -} -early_param("pmem_sf_size", pmem_sf_size_setup); - -static unsigned fb_size; -static int __init fb_size_setup(char *p) -{ - fb_size = memparse(p, NULL); - return 0; -} -early_param("fb_size", fb_size_setup); - -static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE; -static int __init pmem_adsp_size_setup(char *p) -{ - pmem_adsp_size = memparse(p, NULL); - return 0; -} -early_param("pmem_adsp_size", pmem_adsp_size_setup); - -static unsigned fluid_pmem_adsp_size = MSM_FLUID_PMEM_ADSP_SIZE; -static int __init fluid_pmem_adsp_size_setup(char *p) -{ - fluid_pmem_adsp_size = memparse(p, NULL); - return 0; -} -early_param("fluid_pmem_adsp_size", fluid_pmem_adsp_size_setup); - -static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE; -static int __init pmem_audio_size_setup(char *p) -{ - pmem_audio_size = memparse(p, NULL); - return 0; -} -early_param("pmem_audio_size", pmem_audio_size_setup); - -static unsigned pmem_kernel_ebi0_size = PMEM_KERNEL_EBI0_SIZE; -static int __init pmem_kernel_ebi0_size_setup(char *p) -{ - pmem_kernel_ebi0_size = memparse(p, NULL); - return 0; -} -early_param("pmem_kernel_ebi0_size", pmem_kernel_ebi0_size_setup); - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_co_heap_pdata co_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; -#endif - -/** - * These heaps are listed in the order they will be allocated. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap msm7x30_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - /* PMEM_ADSP = CAMERA */ - { - .id = ION_CAMERA_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_CAMERA_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* PMEM_AUDIO */ - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* PMEM_MDP = SF */ - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, -#endif -}; - -static struct ion_platform_data ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = msm7x30_heaps, -}; - -static struct platform_device ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &ion_pdata }, -}; -#endif - -static struct memtype_reserve msm7x30_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -unsigned long size; -unsigned long msm_ion_camera_size; - -static void fix_sizes(void) -{ - if machine_is_msm7x30_fluid() - size = fluid_pmem_adsp_size; - else - size = pmem_adsp_size; - -#ifdef CONFIG_ION_MSM - msm_ion_camera_size = size; -#endif -} - -static void __init reserve_mdp_memory(void) -{ - mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE; - msm7x30_reserve_table[mdp_pdata.mem_hid].size += mdp_pdata.ov0_wb_size; -} - -static void __init size_ion_devices(void) -{ -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - ion_pdata.heaps[1].size = msm_ion_camera_size; - ion_pdata.heaps[2].size = MSM_ION_AUDIO_SIZE; - ion_pdata.heaps[3].size = MSM_ION_SF_SIZE; -#endif -} - -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - msm7x30_reserve_table[MEMTYPE_EBI0].size += msm_ion_camera_size; - msm7x30_reserve_table[MEMTYPE_EBI0].size += MSM_ION_AUDIO_SIZE; - msm7x30_reserve_table[MEMTYPE_EBI0].size += MSM_ION_SF_SIZE; -#endif -} - -static void __init msm7x30_calculate_reserve_sizes(void) -{ - fix_sizes(); - reserve_mdp_memory(); - size_ion_devices(); - reserve_ion_memory(); -} - -static int msm7x30_paddr_to_memtype(unsigned int paddr) -{ - if (paddr < phys_add) - return MEMTYPE_EBI0; - if (paddr >= phys_add && paddr < 0x80000000) - return MEMTYPE_EBI1; - return MEMTYPE_NONE; -} - -static struct reserve_info msm7x30_reserve_info __initdata = { - .memtype_reserve_table = msm7x30_reserve_table, - .calculate_reserve_sizes = msm7x30_calculate_reserve_sizes, - .paddr_to_memtype = msm7x30_paddr_to_memtype, -}; - -static void __init msm7x30_reserve(void) -{ - reserve_info = &msm7x30_reserve_info; - msm_reserve(); -} - -static void __init msm7x30_allocate_memory_regions(void) -{ - void *addr; - unsigned long size; - - size = fb_size ? : MSM_FB_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); - -#ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE - size = MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE; - addr = alloc_bootmem_align(size, 0x1000); - msm_v4l2_video_overlay_resources[0].start = __pa(addr); - msm_v4l2_video_overlay_resources[0].end = - msm_v4l2_video_overlay_resources[0].start + size - 1; - pr_debug("allocating %lu bytes at %p (%lx physical) for v4l2\n", - size, addr, __pa(addr)); -#endif -} - -static void __init msm7x30_map_io(void) -{ - msm_shared_ram_phys = 0x00100000; - msm_map_msm7x30_io(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); -} - -static void __init msm7x30_init_early(void) -{ - msm7x30_allocate_memory_regions(); -} - -static void __init msm7x30_fixup(struct tag *tags, char **cmdline, - struct meminfo *mi) -{ - for (; tags->hdr.size; tags = tag_next(tags)) { - if (tags->hdr.tag == ATAG_MEM && tags->u.mem.start == - DDR1_BANK_BASE) { - ebi1_phys_offset = DDR1_BANK_BASE; - phys_add = DDR1_BANK_BASE; - break; - } - } -} - -static void __init msm7x30_init_late(void) -{ - smd_debugfs_init(); -} - -MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, -<<<<<<< HEAD - .init_late = msm7x30_init_late, - .init_time = msm7x30_timer_init, -======= - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, ->>>>>>> Add snapshot of mach-msm from beginning of msm-3.4 -MACHINE_END - -MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, -MACHINE_END - -MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, -MACHINE_END - -MACHINE_START(MSM8X55_SURF, "QCT MSM8X55 SURF") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, -<<<<<<< HEAD - .init_late = msm7x30_init_late, - .init_time = msm7x30_timer_init, -======= - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, ->>>>>>> Add snapshot of mach-msm from beginning of msm-3.4 -MACHINE_END - -MACHINE_START(MSM8X55_FFA, "QCT MSM8X55 FFA") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, -MACHINE_END -MACHINE_START(MSM8X55_SVLTE_SURF, "QCT MSM8X55 SVLTE SURF") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, -MACHINE_END -MACHINE_START(MSM8X55_SVLTE_FFA, "QCT MSM8X55 SVLTE FFA") - .atag_offset = 0x100, - .map_io = msm7x30_map_io, - .reserve = msm7x30_reserve, - .init_irq = msm7x30_init_irq, - .init_machine = msm7x30_init, -<<<<<<< HEAD - .init_late = msm7x30_init_late, - .init_time = msm7x30_timer_init, -======= - .timer = &msm_timer, - .init_early = msm7x30_init_early, - .handle_irq = vic_handle_irq, - .fixup = msm7x30_fixup, ->>>>>>> Add snapshot of mach-msm from beginning of msm-3.4 -MACHINE_END diff --git a/arch/arm/mach-msm/board-msm8x60-camera.c b/arch/arm/mach-msm/board-msm8x60-camera.c deleted file mode 100644 index 3a09fa37069c..000000000000 --- a/arch/arm/mach-msm/board-msm8x60-camera.c +++ /dev/null @@ -1,543 +0,0 @@ -/* Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices-msm8x60.h" -#include "devices.h" - -#define GPIO_EXT_CAMIF_PWR_EN1 (PM8901_MPP_BASE + PM8901_MPPS + 13) -#define GPIO_WEB_CAMIF_STANDBY1 (PM8901_MPP_BASE + PM8901_MPPS + 60) -#ifdef CONFIG_MSM_CAMERA_FLASH -#define VFE_CAMIF_TIMER1_GPIO 29 -#define VFE_CAMIF_TIMER2_GPIO 30 -#define VFE_CAMIF_TIMER3_GPIO_INT 31 -#define FUSION_VFE_CAMIF_TIMER1_GPIO 42 - -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_PMIC, - ._fsrc.pmic_src.num_of_src = 2, - ._fsrc.pmic_src.low_current = 100, - ._fsrc.pmic_src.high_current = 300, - ._fsrc.pmic_src.led_src_1 = PMIC8058_ID_FLASH_LED_0, - ._fsrc.pmic_src.led_src_2 = PMIC8058_ID_FLASH_LED_1, - ._fsrc.pmic_src.pmic_set_current = pm8058_set_flash_led_current, -}; -static struct msm_camera_sensor_strobe_flash_data strobe_flash_xenon = { - .flash_trigger = VFE_CAMIF_TIMER2_GPIO, - .flash_charge = VFE_CAMIF_TIMER1_GPIO, - .flash_charge_done = VFE_CAMIF_TIMER3_GPIO_INT, - .flash_recharge_duration = 50000, - .irq = MSM_GPIO_TO_INT(VFE_CAMIF_TIMER3_GPIO_INT), -}; -#endif - -static struct msm_bus_vectors cam_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_preview_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 319610880, - .ib = 511377408, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 566231040, - .ib = 905969664, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 69984000, - .ib = 111974400, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 320864256, - .ib = 513382810, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 320864256, - .ib = 513382810, - }, -}; - -static struct msm_bus_vectors cam_zsl_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 566231040, - .ib = 905969664, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 706199040, - .ib = 1129918464, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 320864256, - .ib = 513382810, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 320864256, - .ib = 513382810, - }, -}; - -static struct msm_bus_vectors cam_stereo_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 212336640, - .ib = 339738624, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 25090560, - .ib = 40144896, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 239708160, - .ib = 383533056, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 79902720, - .ib = 127844352, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_stereo_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 300902400, - .ib = 481443840, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 230307840, - .ib = 368492544, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 245113344, - .ib = 392181351, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 106536960, - .ib = 170459136, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 106536960, - .ib = 170459136, - }, -}; - -static struct msm_bus_paths cam_bus_client_config[] = { - { - ARRAY_SIZE(cam_init_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_preview_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_video_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_snapshot_vectors), - cam_snapshot_vectors, - }, - { - ARRAY_SIZE(cam_zsl_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_stereo_video_vectors), - cam_stereo_video_vectors, - }, - { - ARRAY_SIZE(cam_stereo_snapshot_vectors), - cam_stereo_snapshot_vectors, - }, -}; - -static struct msm_bus_scale_pdata cam_bus_client_pdata = { - cam_bus_client_config, - ARRAY_SIZE(cam_bus_client_config), - .name = "msm_camera", -}; - -static struct msm_camera_device_platform_data msm_camera_csi_device_data[] = { - { - .csiphy_core = 0, - .csid_core = 0, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - .ioclk = { - .vfe_clk_rate = 228570000, - }, - }, - { - .csiphy_core = 1, - .csid_core = 1, - .is_vpe = 1, - .cam_bus_scale_table = &cam_bus_client_pdata, - .ioclk = { - .vfe_clk_rate = 228570000, - }, - }, -}; -static struct camera_vreg_t msm_8x60_back_cam_vreg[] = { - {"cam_vana", REG_LDO, 2850000, 2850000, -1}, - {"cam_vio", REG_VS, 0, 0, 0}, - {"cam_vdig", REG_LDO, 1200000, 1200000, -1}, -}; - -static struct gpio msm8x60_common_cam_gpio[] = { - {32, GPIOF_DIR_IN, "CAMIF_MCLK"}, - {47, GPIOF_DIR_IN, "CAMIF_I2C_DATA"}, - {48, GPIOF_DIR_IN, "CAMIF_I2C_CLK"}, - {105, GPIOF_DIR_IN, "STANDBY"}, -}; - -static struct gpio msm8x60_back_cam_gpio[] = { - {GPIO_EXT_CAMIF_PWR_EN1, GPIOF_DIR_OUT, "CAMIF_PWR_EN"}, - {106, GPIOF_DIR_OUT, "CAM_RESET"}, -}; - -static struct msm_gpio_set_tbl msm8x60_back_cam_gpio_set_tbl[] = { - {GPIO_EXT_CAMIF_PWR_EN1, GPIOF_OUT_INIT_LOW, 10000}, - {GPIO_EXT_CAMIF_PWR_EN1, GPIOF_OUT_INIT_HIGH, 5000}, - {106, GPIOF_OUT_INIT_LOW, 1000}, - {106, GPIOF_OUT_INIT_HIGH, 4000}, -}; - -static struct msm_camera_gpio_conf msm_8x60_back_cam_gpio_conf = { - .cam_gpio_common_tbl = msm8x60_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8x60_common_cam_gpio), - .cam_gpio_req_tbl = msm8x60_back_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(msm8x60_back_cam_gpio), - .cam_gpio_set_tbl = msm8x60_back_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(msm8x60_back_cam_gpio_set_tbl), -}; - - -static struct i2c_board_info imx074_actuator_i2c_info = { - I2C_BOARD_INFO("msm_actuator", 0x11), -}; - -static struct msm_actuator_info imx074_actuator_info = { - .board_info = &imx074_actuator_i2c_info, - .cam_name = MSM_ACTUATOR_MAIN_CAM_0, - .bus_id = MSM_GSBI4_QUP_I2C_BUS_ID, - .vcm_enable = 0, -}; - -static struct msm_camera_sensor_flash_data flash_imx074 = { - .flash_type = MSM_CAMERA_FLASH_LED, -#ifdef CONFIG_MSM_CAMERA_FLASH - .flash_src = &msm_flash_src, -#endif -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = { - .mount_angle = 180, - .cam_vreg = msm_8x60_back_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8x60_back_cam_vreg), - .gpio_conf = &msm_8x60_back_cam_gpio_conf, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = { - .sensor_name = "imx074", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_imx074, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &sensor_board_info_imx074, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, - .actuator_info = &imx074_actuator_info -}; - -static struct msm_camera_sensor_flash_data flash_mt9e013 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_mt9e013 = { - .mount_angle = 0, - .cam_vreg = msm_8x60_back_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8x60_back_cam_vreg), - .gpio_conf = &msm_8x60_back_cam_gpio_conf, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9e013_data = { - .sensor_name = "mt9e013", - .pdata = &msm_camera_csi_device_data[0], - .flash_data = &flash_mt9e013, - .sensor_platform_info = &sensor_board_info_mt9e013, - .csi_if = 1, - .camera_type = BACK_CAMERA_2D, -}; - -static struct gpio ov7692_cam_gpio[] = { - {GPIO_WEB_CAMIF_STANDBY1, GPIOF_DIR_OUT, "CAM_EN"}, -}; - -static struct msm_gpio_set_tbl ov7692_cam_gpio_set_tbl[] = { - {GPIO_WEB_CAMIF_STANDBY1, GPIOF_OUT_INIT_LOW, 10000}, -}; - -static struct msm_camera_gpio_conf ov7692_cam_gpio_conf = { - .cam_gpio_common_tbl = msm8x60_common_cam_gpio, - .cam_gpio_common_tbl_size = ARRAY_SIZE(msm8x60_common_cam_gpio), - .cam_gpio_req_tbl = ov7692_cam_gpio, - .cam_gpio_req_tbl_size = ARRAY_SIZE(ov7692_cam_gpio), - .cam_gpio_set_tbl = ov7692_cam_gpio_set_tbl, - .cam_gpio_set_tbl_size = ARRAY_SIZE(ov7692_cam_gpio_set_tbl), -}; - -static struct msm_camera_sensor_flash_data flash_ov7692 = { - .flash_type = MSM_CAMERA_FLASH_NONE, -}; - -static struct msm_camera_sensor_platform_info sensor_board_info_ov7692 = { - .mount_angle = 0, - .cam_vreg = msm_8x60_back_cam_vreg, - .num_vreg = ARRAY_SIZE(msm_8x60_back_cam_vreg), - .gpio_conf = &ov7692_cam_gpio_conf, -}; - -static struct msm_camera_sensor_info msm_camera_sensor_ov7692_data = { - .sensor_name = "ov7692", - .pdata = &msm_camera_csi_device_data[1], - .flash_data = &flash_ov7692, - .sensor_platform_info = &sensor_board_info_ov7692, - .csi_if = 1, - .camera_type = FRONT_CAMERA_2D, -}; - -static struct platform_device msm_camera_server = { - .name = "msm_cam_server", - .id = 0, -}; - -void __init msm8x60_init_cam(void) -{ - platform_device_register(&msm_camera_server); - platform_device_register(&msm_device_csic0); - platform_device_register(&msm_device_csic1); - platform_device_register(&msm_device_vfe); - platform_device_register(&msm_device_vpe); -} - -#ifdef CONFIG_I2C -static struct i2c_board_info msm8x60_camera_i2c_boardinfo[] = { - { - I2C_BOARD_INFO("imx074", 0x1A), - .platform_data = &msm_camera_sensor_imx074_data, - }, - { - I2C_BOARD_INFO("mt9e013", 0x6C), - .platform_data = &msm_camera_sensor_mt9e013_data, - }, - { - I2C_BOARD_INFO("ov7692", 0x78), - .platform_data = &msm_camera_sensor_ov7692_data, - }, -}; - -struct msm_camera_board_info msm8x60_camera_board_info = { - .board_info = msm8x60_camera_i2c_boardinfo, - .num_i2c_board_info = ARRAY_SIZE(msm8x60_camera_i2c_boardinfo), -}; -#endif diff --git a/arch/arm/mach-msm/board-msm8x60-vcm.c b/arch/arm/mach-msm/board-msm8x60-vcm.c deleted file mode 100644 index de1c1e2746e0..000000000000 --- a/arch/arm/mach-msm/board-msm8x60-vcm.c +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -#include -#include - -#define MSM_SMI_BASE 0x38000000 -#define MSM_SMI_SIZE 0x04000000 - -#define SMI_16M 0 -#define SMI_1M 1 -#define SMI_64K 2 -#define SMI_4K 3 -#define EBI_16M 4 -#define EBI_1M 5 -#define EBI_64K 6 -#define EBI_4K 7 - -static void free_ebi_pools(void); - -static struct physmem_region memory[] = { - { /* SMI 16M */ - .addr = MSM_SMI_BASE, - .size = SZ_16M, - .chunk_size = SZ_16M - }, - { /* SMI 1M */ - .addr = MSM_SMI_BASE + SZ_16M, - .size = SZ_8M, - .chunk_size = SZ_1M - }, - { /* SMI 64K */ - .addr = MSM_SMI_BASE + SZ_16M + SZ_8M, - .size = SZ_4M, - .chunk_size = SZ_64K - }, - { /* SMI 4K */ - .addr = MSM_SMI_BASE + SZ_16M + SZ_8M + SZ_4M, - .size = SZ_4M, - .chunk_size = SZ_4K - }, - - { /* EBI 16M */ - .addr = 0, - .size = SZ_16M, - .chunk_size = SZ_16M - }, - { /* EBI 1M */ - .addr = 0, - .size = SZ_8M, - .chunk_size = SZ_1M - }, - { /* EBI 64K */ - .addr = 0, - .size = SZ_4M, - .chunk_size = SZ_64K - }, - { /* EBI 4K */ - .addr = 0, - .size = SZ_4M, - .chunk_size = SZ_4K - } -}; - - -/* The pool priority MUST be in descending order of size */ -static struct vcm_memtype_map mt_map[] __initdata = { - { - /* MEMTYPE_0 */ - .pool_id = {SMI_16M, SMI_1M, SMI_64K, SMI_4K}, - .num_pools = 4, - }, - { - /* MEMTYPE_1 */ - .pool_id = {SMI_16M, SMI_1M, SMI_64K, EBI_4K}, - .num_pools = 4, - }, - { /* MEMTYPE_2 */ - .pool_id = {EBI_16M, EBI_1M, EBI_64K, EBI_4K}, - .num_pools = 4, - }, - { - /* MEMTYPE_3 */ - .pool_id = {SMI_16M, SMI_1M, EBI_1M, SMI_64K, EBI_64K, EBI_4K}, - .num_pools = 6, - } -}; - -static int __init msm8x60_vcm_init(void) -{ - int ret, i; - void *ebi_chunk; - - - for (i = 0; i < ARRAY_SIZE(memory); i++) { - if (memory[i].addr == 0) { - ebi_chunk = __alloc_bootmem(memory[i].size, - memory[i].size, 0); - if (!ebi_chunk) { - pr_err("Could not allocate VCM-managed physical" - " memory\n"); - ret = -ENOMEM; - goto fail; - } - memory[i].addr = __pa(ebi_chunk); - } - } - - ret = vcm_sys_init(memory, ARRAY_SIZE(memory), - mt_map, ARRAY_SIZE(mt_map), - (void *)MSM_SMI_BASE + MSM_SMI_SIZE - SZ_8M, SZ_8M); - - if (ret != 0) { - pr_err("vcm_sys_init() ret %i\n", ret); - goto fail; - } - - return 0; -fail: - free_ebi_pools(); - return ret; -}; - -static void free_ebi_pools(void) -{ - int i; - phys_addr_t r; - for (i = 0; i < ARRAY_SIZE(memory); i++) { - r = memory[i].addr; - if (r > MSM_SMI_BASE + MSM_SMI_SIZE) - free_bootmem((unsigned long)__va(r), memory[i].size); - } -} - - -/* Useful for testing, and if VCM is ever unloaded */ -static void __exit msm8x60_vcm_exit(void) -{ - int ret; - - ret = vcm_sys_destroy(); - if (ret != 0) { - pr_err("vcm_sys_destroy() ret %i\n", ret); - goto fail; - } - free_ebi_pools(); -fail: - return; -} - - -subsys_initcall(msm8x60_vcm_init); -module_exit(msm8x60_vcm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Stepan Moskovchenko "); diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c deleted file mode 100644 index c9139e3e7414..000000000000 --- a/arch/arm/mach-msm/board-msm8x60.c +++ /dev/null @@ -1,10564 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_SMB137B_CHARGER) || defined(CONFIG_SMB137B_CHARGER_MODULE) -#include -#endif -#ifdef CONFIG_SND_SOC_WM8903 -#include -#endif -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_MSM_DSPS -#include -#endif -#include -#include -#include -#include -#ifdef CONFIG_USB_G_ANDROID -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "devices-msm8x60.h" -#include -#include "pm.h" -#include -#include "spm.h" -#include "rpm_log.h" -#include "timer.h" -#include "gpiomux-8x60.h" -#include "rpm_stats.h" -#include "peripheral-loader.h" -#include -#include "rpm_resources.h" -#include "clock.h" -#include "pm-boot.h" -#include "board-storage-common-a.h" -#include "platsmp.h" - -#include -#include -#include - -#define MSM_SHARED_RAM_PHYS 0x40000000 -#define MDM2AP_SYNC 129 - -#define GPIO_ETHERNET_RESET_N_DRAGON 30 -#define LCDC_SPI_GPIO_CLK 73 -#define LCDC_SPI_GPIO_CS 72 -#define LCDC_SPI_GPIO_MOSI 70 -#define LCDC_AUO_PANEL_NAME "lcdc_auo_wvga" -#define LCDC_SAMSUNG_OLED_PANEL_NAME "lcdc_samsung_oled" -#define LCDC_SAMSUNG_WSVGA_PANEL_NAME "lcdc_samsung_wsvga" -#define LCDC_SAMSUNG_SPI_DEVICE_NAME "lcdc_samsung_ams367pe02" -#define LCDC_AUO_SPI_DEVICE_NAME "lcdc_auo_nt35582" -#define LCDC_NT35582_PANEL_NAME "lcdc_nt35582_wvga" - -#define MIPI_CMD_NOVATEK_QHD_PANEL_NAME "mipi_cmd_novatek_qhd" -#define MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME "mipi_video_novatek_qhd" -#define MIPI_VIDEO_TOSHIBA_WVGA_PANEL_NAME "mipi_video_toshiba_wvga" -#define HDMI_PANEL_NAME "hdmi_msm" -#define TVOUT_PANEL_NAME "tvout_msm" - -#define DSPS_PIL_GENERIC_NAME "dsps" -#define DSPS_PIL_FLUID_NAME "dsps_fluid" - -#ifdef CONFIG_ION_MSM -static struct platform_device ion_dev; -#endif - -enum { - GPIO_EXPANDER_IRQ_BASE = PM8901_IRQ_BASE + NR_PMIC8901_IRQS, - GPIO_EXPANDER_GPIO_BASE = PM8901_MPP_BASE + PM8901_MPPS, - /* CORE expander */ - GPIO_CORE_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE, - GPIO_CLASS_D1_EN = GPIO_CORE_EXPANDER_BASE, - GPIO_WLAN_DEEP_SLEEP_N, - GPIO_LVDS_SHUTDOWN_N, - GPIO_DISP_RESX_N = GPIO_LVDS_SHUTDOWN_N, - GPIO_MS_SYS_RESET_N, - GPIO_CAP_TS_RESOUT_N, - GPIO_CAP_GAUGE_BI_TOUT, - GPIO_ETHERNET_PME, - GPIO_EXT_GPS_LNA_EN, - GPIO_MSM_WAKES_BT, - GPIO_ETHERNET_RESET_N, - GPIO_HEADSET_DET_N, - GPIO_USB_UICC_EN, - GPIO_BACKLIGHT_EN, - GPIO_EXT_CAMIF_PWR_EN, - GPIO_BATT_GAUGE_INT_N, - GPIO_BATT_GAUGE_EN, - /* DOCKING expander */ - GPIO_DOCKING_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE + 16, - GPIO_MIPI_DSI_RST_N = GPIO_DOCKING_EXPANDER_BASE, - GPIO_AUX_JTAG_DET_N, - GPIO_DONGLE_DET_N, - GPIO_SVIDEO_LOAD_DET, - GPIO_SVID_AMP_SHUTDOWN1_N, - GPIO_SVID_AMP_SHUTDOWN0_N, - GPIO_SDC_WP, - GPIO_IRDA_PWDN, - GPIO_IRDA_RESET_N, - GPIO_DONGLE_GPIO0, - GPIO_DONGLE_GPIO1, - GPIO_DONGLE_GPIO2, - GPIO_DONGLE_GPIO3, - GPIO_DONGLE_PWR_EN, - GPIO_EMMC_RESET_N, - GPIO_TP_EXP2_IO15, - /* SURF expander */ - GPIO_SURF_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE + (16 * 2), - GPIO_SD_CARD_DET_1 = GPIO_SURF_EXPANDER_BASE, - GPIO_SD_CARD_DET_2, - GPIO_SD_CARD_DET_4, - GPIO_SD_CARD_DET_5, - GPIO_UIM3_RST, - GPIO_SURF_EXPANDER_IO5, - GPIO_SURF_EXPANDER_IO6, - GPIO_ADC_I2C_EN, - GPIO_SURF_EXPANDER_IO8, - GPIO_SURF_EXPANDER_IO9, - GPIO_SURF_EXPANDER_IO10, - GPIO_SURF_EXPANDER_IO11, - GPIO_SURF_EXPANDER_IO12, - GPIO_SURF_EXPANDER_IO13, - GPIO_SURF_EXPANDER_IO14, - GPIO_SURF_EXPANDER_IO15, - /* LEFT KB IO expander */ - GPIO_LEFT_KB_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE + (16 * 3), - GPIO_LEFT_LED_1 = GPIO_LEFT_KB_EXPANDER_BASE, - GPIO_LEFT_LED_2, - GPIO_LEFT_LED_3, - GPIO_LEFT_LED_WLAN, - GPIO_JOYSTICK_EN, - GPIO_CAP_TS_SLEEP, - GPIO_LEFT_KB_IO6, - GPIO_LEFT_LED_5, - /* RIGHT KB IO expander */ - GPIO_RIGHT_KB_EXPANDER_BASE = GPIO_EXPANDER_GPIO_BASE + (16 * 3) + 8, - GPIO_RIGHT_LED_1 = GPIO_RIGHT_KB_EXPANDER_BASE, - GPIO_RIGHT_LED_2, - GPIO_RIGHT_LED_3, - GPIO_RIGHT_LED_BT, - GPIO_WEB_CAMIF_STANDBY, - GPIO_COMPASS_RST_N, - GPIO_WEB_CAMIF_RESET_N, - GPIO_RIGHT_LED_5, - GPIO_R_ALTIMETER_RESET_N, - /* FLUID S IO expander */ - GPIO_SOUTH_EXPANDER_BASE, - GPIO_MIC2_ANCR_SEL = GPIO_SOUTH_EXPANDER_BASE, - GPIO_MIC1_ANCL_SEL, - GPIO_HS_MIC4_SEL, - GPIO_FML_MIC3_SEL, - GPIO_FMR_MIC5_SEL, - GPIO_TS_SLEEP, - GPIO_HAP_SHIFT_LVL_OE, - GPIO_HS_SW_DIR, - /* FLUID N IO expander */ - GPIO_NORTH_EXPANDER_BASE, - GPIO_EPM_3_3V_EN = GPIO_NORTH_EXPANDER_BASE, - GPIO_EPM_5V_BOOST_EN, - GPIO_AUX_CAM_2P7_EN, - GPIO_LED_FLASH_EN, - GPIO_LED1_GREEN_N, - GPIO_LED2_RED_N, - GPIO_FRONT_CAM_RESET_N, - GPIO_EPM_LVLSFT_EN, - GPIO_N_ALTIMETER_RESET_N, - /* EPM expander */ - GPIO_EPM_EXPANDER_BASE, - GPIO_PWR_MON_START = GPIO_EPM_EXPANDER_BASE, - GPIO_PWR_MON_RESET_N, - GPIO_ADC1_PWDN_N, - GPIO_ADC2_PWDN_N, - GPIO_EPM_EXPANDER_IO4, - GPIO_ADC1_MUX_SPI_INT_N_3_3V, - GPIO_ADC2_MUX_SPI_INT_N, - GPIO_EPM_EXPANDER_IO7, - GPIO_PWR_MON_ENABLE, - GPIO_EPM_SPI_ADC1_CS_N, - GPIO_EPM_SPI_ADC2_CS_N, - GPIO_EPM_EXPANDER_IO11, - GPIO_EPM_EXPANDER_IO12, - GPIO_EPM_EXPANDER_IO13, - GPIO_EPM_EXPANDER_IO14, - GPIO_EPM_EXPANDER_IO15, -}; - -struct pm8xxx_mpp_init_info { - unsigned mpp; - struct pm8xxx_mpp_config_data config; -}; - -#define PM8058_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8058_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -#define PM8901_MPP_INIT(_mpp, _type, _level, _control) \ -{ \ - .mpp = PM8901_MPP_PM_TO_SYS(_mpp), \ - .config = { \ - .type = PM8XXX_MPP_TYPE_##_type, \ - .level = _level, \ - .control = PM8XXX_MPP_##_control, \ - } \ -} - -/* - * The UI_INTx_N lines are pmic gpio lines which connect i2c - * gpio expanders to the pm8058. - */ -#define UI_INT1_N 25 -#define UI_INT2_N 34 -#define UI_INT3_N 14 -/* -FM GPIO is GPIO 18 on PMIC 8058. -As the index starts from 0 in the PMIC driver, and hence 17 -corresponds to GPIO 18 on PMIC 8058. -*/ -#define FM_GPIO 17 - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static void (*sdc2_status_notify_cb)(int card_present, void *dev_id); -static void *sdc2_status_notify_cb_devid; -#endif - -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT -static void (*sdc5_status_notify_cb)(int card_present, void *dev_id); -static void *sdc5_status_notify_cb_devid; -#endif - -static struct msm_spm_platform_data msm_spm_data_v1[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - -#ifdef CONFIG_MSM_AVS_HW - .reg_init_values[MSM_SPM_REG_SAW_AVS_CTL] = 0x586020FF, -#endif - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x0F, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x68, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0xFFFFFFFF, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0xFFFFFFFF, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x07, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0x94, - .retention_vlevel = 0x81, - .collapse_vlevel = 0x20, - .retention_mid_vlevel = 0x94, - .collapse_mid_vlevel = 0x8C, - - .vctl_timeout_us = 50, - }, - - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - -#ifdef CONFIG_MSM_AVS_HW - .reg_init_values[MSM_SPM_REG_SAW_AVS_CTL] = 0x586020FF, -#endif - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x0F, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x68, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0xFFFFFFFF, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0xFFFFFFFF, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x13, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x07, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0x94, - .retention_vlevel = 0x81, - .collapse_vlevel = 0x20, - .retention_mid_vlevel = 0x94, - .collapse_mid_vlevel = 0x8C, - - .vctl_timeout_us = 50, - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - -#ifdef CONFIG_MSM_AVS_HW - .reg_init_values[MSM_SPM_REG_SAW_AVS_CTL] = 0x586020FF, -#endif - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x1C, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x68, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x0C0CFFFF, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0x78780FFF, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x07, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0xA0, - .retention_vlevel = 0x89, - .collapse_vlevel = 0x20, - .retention_mid_vlevel = 0x89, - .collapse_mid_vlevel = 0x89, - - .vctl_timeout_us = 50, - }, - - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - -#ifdef CONFIG_MSM_AVS_HW - .reg_init_values[MSM_SPM_REG_SAW_AVS_CTL] = 0x586020FF, -#endif - .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x1C, - .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x68, - .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x0C0CFFFF, - .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0x78780FFF, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x13, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x07, - .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00, - - .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00, - .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00, - - .awake_vlevel = 0xA0, - .retention_vlevel = 0x89, - .collapse_vlevel = 0x20, - .retention_mid_vlevel = 0x89, - .collapse_mid_vlevel = 0x89, - - .vctl_timeout_us = 50, - }, -}; - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -static struct regulator_consumer_supply vreg_consumers_8901_S0[] = { - REGULATOR_SUPPLY("8901_s0", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_8901_S1[] = { - REGULATOR_SUPPLY("8901_s1", NULL), -}; - -static struct regulator_init_data saw_s0_init_data = { - .constraints = { - .name = "8901_s0", - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, - .min_uV = 800000, - .max_uV = 1325000, - }, - .consumer_supplies = vreg_consumers_8901_S0, - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_8901_S0), -}; - -static struct regulator_init_data saw_s1_init_data = { - .constraints = { - .name = "8901_s1", - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, - .min_uV = 800000, - .max_uV = 1325000, - }, - .consumer_supplies = vreg_consumers_8901_S1, - .num_consumer_supplies = ARRAY_SIZE(vreg_consumers_8901_S1), -}; - -static struct platform_device msm_device_saw_s0 = { - .name = "saw-regulator", - .id = 0, - .dev = { - .platform_data = &saw_s0_init_data, - }, -}; - -static struct platform_device msm_device_saw_s1 = { - .name = "saw-regulator", - .id = 1, - .dev = { - .platform_data = &saw_s1_init_data, - }, -}; - -static struct resource smsc911x_resources[] = { - [0] = { - .flags = IORESOURCE_MEM, - .start = 0x1b800000, - .end = 0x1b8000ff - }, - [1] = { - .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, - }, -}; - -static struct smsc911x_platform_config smsc911x_config = { - .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, - .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, - .flags = SMSC911X_USE_16BIT, - .has_reset_gpio = 1, - .reset_gpio = GPIO_ETHERNET_RESET_N -}; - -static struct platform_device smsc911x_device = { - .name = "smsc911x", - .id = 0, - .num_resources = ARRAY_SIZE(smsc911x_resources), - .resource = smsc911x_resources, - .dev = { - .platform_data = &smsc911x_config - } -}; - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0x18500000 - -#define QCE_HW_KEY_SUPPORT 0 -#define QCE_SHA_HMAC_SUPPORT 0 -#define QCE_SHARE_CE_RESOURCE 2 -#define QCE_CE_SHARED 1 - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE_HASH_CRCI, - .end = DMOV_CE_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, - [4] = { - .name = "crypto_crci_hash", - .start = DMOV_CE_HASH_CRCI, - .end = DMOV_CE_HASH_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -static struct platform_device qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -static struct platform_device qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_HAPTIC_ISA1200) || \ - defined(CONFIG_HAPTIC_ISA1200_MODULE) - -static const char *vregs_isa1200_name[] = { - "8058_s3", - "8901_l4", -}; - -static const int vregs_isa1200_val[] = { - 1800000,/* uV */ - 2600000, -}; -static struct regulator *vregs_isa1200[ARRAY_SIZE(vregs_isa1200_name)]; -static struct msm_xo_voter *xo_handle_a1; - -static int isa1200_power(int vreg_on) -{ - int i, rc = 0; - - for (i = 0; i < ARRAY_SIZE(vregs_isa1200_name); i++) { - rc = vreg_on ? regulator_enable(vregs_isa1200[i]) : - regulator_disable(vregs_isa1200[i]); - if (rc < 0) { - pr_err("%s: vreg %s %s failed (%d)\n", - __func__, vregs_isa1200_name[i], - vreg_on ? "enable" : "disable", rc); - goto vreg_fail; - } - } - - rc = vreg_on ? msm_xo_mode_vote(xo_handle_a1, MSM_XO_MODE_ON) : - msm_xo_mode_vote(xo_handle_a1, MSM_XO_MODE_OFF); - if (rc < 0) { - pr_err("%s: failed to %svote for TCXO A1 buffer%d\n", - __func__, vreg_on ? "" : "de-", rc); - goto vreg_fail; - } - return 0; - -vreg_fail: - while (i--) - !vreg_on ? regulator_enable(vregs_isa1200[i]) : - regulator_disable(vregs_isa1200[i]); - return rc; -} - -static int isa1200_dev_setup(bool enable) -{ - int i, rc; - - if (enable == true) { - for (i = 0; i < ARRAY_SIZE(vregs_isa1200_name); i++) { - vregs_isa1200[i] = regulator_get(NULL, - vregs_isa1200_name[i]); - if (IS_ERR(vregs_isa1200[i])) { - pr_err("%s: regulator get of %s failed (%ld)\n", - __func__, vregs_isa1200_name[i], - PTR_ERR(vregs_isa1200[i])); - rc = PTR_ERR(vregs_isa1200[i]); - goto vreg_get_fail; - } - rc = regulator_set_voltage(vregs_isa1200[i], - vregs_isa1200_val[i], vregs_isa1200_val[i]); - if (rc) { - pr_err("%s: regulator_set_voltage(%s) failed\n", - __func__, vregs_isa1200_name[i]); - goto vreg_get_fail; - } - } - - rc = gpio_request(GPIO_HAP_SHIFT_LVL_OE, "haptics_shft_lvl_oe"); - if (rc) { - pr_err("%s: unable to request gpio %d (%d)\n", - __func__, GPIO_HAP_SHIFT_LVL_OE, rc); - goto vreg_get_fail; - } - - rc = gpio_direction_output(GPIO_HAP_SHIFT_LVL_OE, 1); - if (rc) { - pr_err("%s: Unable to set direction\n", __func__);; - goto free_gpio; - } - - xo_handle_a1 = msm_xo_get(MSM_XO_TCXO_A1, "isa1200"); - if (IS_ERR(xo_handle_a1)) { - rc = PTR_ERR(xo_handle_a1); - pr_err("%s: failed to get the handle for A1(%d)\n", - __func__, rc); - goto gpio_set_dir; - } - } else { - gpio_set_value(GPIO_HAP_SHIFT_LVL_OE, 0); - gpio_free(GPIO_HAP_SHIFT_LVL_OE); - - for (i = 0; i < ARRAY_SIZE(vregs_isa1200_name); i++) - regulator_put(vregs_isa1200[i]); - - msm_xo_put(xo_handle_a1); - } - - return 0; -gpio_set_dir: - gpio_set_value(GPIO_HAP_SHIFT_LVL_OE, 0); -free_gpio: - gpio_free(GPIO_HAP_SHIFT_LVL_OE); -vreg_get_fail: - while (i) - regulator_put(vregs_isa1200[--i]); - return rc; -} - -#define PMIC_GPIO_HAP_ENABLE 18 /* PMIC GPIO Number 19 */ -#define PMIC_GPIO_HAP_LDO_ENABLE 5 /* PMIC GPIO Number 6 */ -static struct isa1200_platform_data isa1200_1_pdata = { - .name = "vibrator", - .power_on = isa1200_power, - .dev_setup = isa1200_dev_setup, - /*gpio to enable haptic*/ - .hap_en_gpio = PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_ENABLE), - .hap_len_gpio = PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_LDO_ENABLE), - .max_timeout = 15000, - .mode_ctrl = PWM_GEN_MODE, - .pwm_fd = { - .pwm_div = 256, - }, - .is_erm = false, - .smart_en = true, - .ext_clk_en = true, - .chip_en = 1, -}; - -static struct i2c_board_info msm_isa1200_board_info[] = { - { - I2C_BOARD_INFO("isa1200_1", 0x90>>1), - .platform_data = &isa1200_1_pdata, - }, -}; -#endif - -#if defined(CONFIG_BATTERY_BQ27520) || \ - defined(CONFIG_BATTERY_BQ27520_MODULE) -static struct bq27520_platform_data bq27520_pdata = { - .name = "fuel-gauge", - .vreg_name = "8058_s3", - .vreg_value = 1800000, - .soc_int = GPIO_BATT_GAUGE_INT_N, - .bi_tout = GPIO_CAP_GAUGE_BI_TOUT, - .chip_en = GPIO_BATT_GAUGE_EN, - .enable_dlog = 0, /* if enable coulomb counter logger */ -}; - -static struct i2c_board_info msm_bq27520_board_info[] = { - { - I2C_BOARD_INFO("bq27520", 0xaa>>1), - .platform_data = &bq27520_pdata, - }, -}; -#endif - -static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = { - { - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1, 8000, 100000, 1, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 1500, 5000, 60100000, 3000, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - false, - 1800, 5000, 60350000, 3500, - }, - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, ACTIVE, MAX, ACTIVE), - false, - 3800, 4500, 65350000, 5500, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, HSFS_OPEN, MAX, ACTIVE), - false, - 2800, 2500, 66850000, 4800, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), - false, - 4800, 2000, 71850000, 6800, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH), - false, - 6800, 500, 75850000, 8800, - }, - - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW), - false, - 7800, 0, 76350000, 9800, - }, -}; - -static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 500, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1000, - [MSM_RPMRS_VDD_MEM_MAX] = 1325, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 500, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 1000, - [MSM_RPMRS_VDD_DIG_MAX] = 1250, - }, - .vdd_mask = 0xFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_APPS_L2_CACHE_CTL, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_SMPS1_0, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_SMPS1_1, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_SMPS0_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_SMPS0_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_TRIGGER_SET_FROM, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_TZ, -}; - -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - -#define ISP1763_INT_GPIO 117 -#define ISP1763_RST_GPIO 152 -static struct resource isp1763_resources[] = { - [0] = { - .flags = IORESOURCE_MEM, - .start = 0x1D000000, - .end = 0x1D005FFF, /* 24KB */ - }, - [1] = { - .flags = IORESOURCE_IRQ, - }, -}; -static void __init msm8x60_cfg_isp1763(void) -{ - isp1763_resources[1].start = gpio_to_irq(ISP1763_INT_GPIO); - isp1763_resources[1].end = gpio_to_irq(ISP1763_INT_GPIO); -} - -static int isp1763_setup_gpio(int enable) -{ - int status = 0; - - if (enable) { - status = gpio_request(ISP1763_INT_GPIO, "isp1763_usb"); - if (status) { - pr_err("%s:Failed to request GPIO %d\n", - __func__, ISP1763_INT_GPIO); - return status; - } - status = gpio_direction_input(ISP1763_INT_GPIO); - if (status) { - pr_err("%s:Failed to configure GPIO %d\n", - __func__, ISP1763_INT_GPIO); - goto gpio_free_int; - } - status = gpio_request(ISP1763_RST_GPIO, "isp1763_usb"); - if (status) { - pr_err("%s:Failed to request GPIO %d\n", - __func__, ISP1763_RST_GPIO); - goto gpio_free_int; - } - status = gpio_direction_output(ISP1763_RST_GPIO, 1); - if (status) { - pr_err("%s:Failed to configure GPIO %d\n", - __func__, ISP1763_RST_GPIO); - goto gpio_free_rst; - } - pr_debug("\nISP GPIO configuration done\n"); - return status; - } - -gpio_free_rst: - gpio_free(ISP1763_RST_GPIO); -gpio_free_int: - gpio_free(ISP1763_INT_GPIO); - - return status; -} -static struct isp1763_platform_data isp1763_pdata = { - .reset_gpio = ISP1763_RST_GPIO, - .setup_gpio = isp1763_setup_gpio -}; - -static struct platform_device isp1763_device = { - .name = "isp1763_usb", - .num_resources = ARRAY_SIZE(isp1763_resources), - .resource = isp1763_resources, - .dev = { - .platform_data = &isp1763_pdata - } -}; -#endif - -#if defined(CONFIG_USB_MSM_72K) || defined(CONFIG_USB_EHCI_MSM_72K) -static struct msm_otg_platform_data msm_otg_pdata; -static struct regulator *ldo6_3p3; -static struct regulator *ldo7_1p8; -static struct regulator *vdd_cx; -#define PMICID_INT PM8058_GPIO_IRQ(PM8058_IRQ_BASE, 36) -#define PMIC_ID_GPIO 36 -notify_vbus_state notify_vbus_state_func_ptr; -static int usb_phy_susp_dig_vol = 750000; -static int pmic_id_notif_supported; - -#ifdef CONFIG_USB_EHCI_MSM_72K -#define USB_PMIC_ID_DET_DELAY msecs_to_jiffies(100) -struct delayed_work pmic_id_det; - -static int __init usb_id_pin_rework_setup(char *support) -{ - if (strncmp(support, "true", 4) == 0) - pmic_id_notif_supported = 1; - - return 1; -} -__setup("usb_id_pin_rework=", usb_id_pin_rework_setup); - -static void pmic_id_detect(struct work_struct *w) -{ - int val = gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(36)); - pr_debug("%s(): gpio_read_value = %d\n", __func__, val); - - if (notify_vbus_state_func_ptr) - (*notify_vbus_state_func_ptr) (val); -} - -static irqreturn_t pmic_id_on_irq(int irq, void *data) -{ - /* - * Spurious interrupts are observed on pmic gpio line - * even though there is no state change on USB ID. Schedule the - * work to to allow debounce on gpio - */ - schedule_delayed_work(&pmic_id_det, USB_PMIC_ID_DET_DELAY); - - return IRQ_HANDLED; -} - -static int msm_hsusb_phy_id_setup_init(int init) -{ - unsigned ret; - - struct pm8xxx_mpp_config_data hsusb_phy_mpp = { - .type = PM8XXX_MPP_TYPE_D_OUTPUT, - .level = PM8901_MPP_DIG_LEVEL_L5, - }; - - if (init) { - hsusb_phy_mpp.control = PM8XXX_MPP_DOUT_CTRL_HIGH; - ret = pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(1), - &hsusb_phy_mpp); - if (ret < 0) - pr_err("%s:MPP2 configuration failed\n", __func__); - } else { - hsusb_phy_mpp.control = PM8XXX_MPP_DOUT_CTRL_LOW; - ret = pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(1), - &hsusb_phy_mpp); - if (ret < 0) - pr_err("%s:MPP2 un config failed\n", __func__); - } - return ret; -} - -static int msm_hsusb_pmic_id_notif_init(void (*callback)(int online), int init) -{ - unsigned ret = -ENODEV; - - struct pm_gpio pmic_id_cfg = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_1P5, - .function = PM_GPIO_FUNC_NORMAL, - .vin_sel = 2, - .inv_int_pol = 0, - }; - struct pm_gpio pmic_id_uncfg = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .function = PM_GPIO_FUNC_NORMAL, - .vin_sel = 2, - .inv_int_pol = 0, - }; - if (!callback) - return -EINVAL; - - if (machine_is_msm8x60_fluid()) - return -ENOTSUPP; - - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) != 2) { - pr_debug("%s: USB_ID pin is not routed to PMIC" - "on V1 surf/ffa\n", __func__); - return -ENOTSUPP; - } - - if ((machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa() || - machine_is_msm8x60_ffa()) && !pmic_id_notif_supported) { - pr_debug("%s: USB_ID is not routed to PMIC" - "on V2 ffa\n", __func__); - return -ENOTSUPP; - } - - usb_phy_susp_dig_vol = 500000; - - if (init) { - notify_vbus_state_func_ptr = callback; - INIT_DELAYED_WORK(&pmic_id_det, pmic_id_detect); - ret = pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(PMIC_ID_GPIO), - &pmic_id_cfg); - if (ret) { - pr_err("%s:return val of pm8xxx_gpio_config: %d\n", - __func__, ret); - return ret; - } - ret = request_threaded_irq(PMICID_INT, NULL, pmic_id_on_irq, - (IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING), - "msm_otg_id", NULL); - if (ret) { - pr_err("%s:pmic_usb_id interrupt registration failed", - __func__); - return ret; - } - msm_otg_pdata.pmic_id_irq = PMICID_INT; - } else { - usb_phy_susp_dig_vol = 750000; - free_irq(PMICID_INT, 0); - ret = pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(PMIC_ID_GPIO), - &pmic_id_uncfg); - if (ret) { - pr_err("%s: return val of pm8xxx_gpio_config: %d\n", - __func__, ret); - return ret; - } - msm_otg_pdata.pmic_id_irq = 0; - cancel_delayed_work_sync(&pmic_id_det); - notify_vbus_state_func_ptr = NULL; - } - return 0; -} -#endif - -#define USB_PHY_OPERATIONAL_MIN_VDD_DIG_VOL 1000000 -#define USB_PHY_MAX_VDD_DIG_VOL 1320000 -static int msm_hsusb_init_vddcx(int init) -{ - int ret = 0; - - if (init) { - vdd_cx = regulator_get(NULL, "8058_s1"); - if (IS_ERR(vdd_cx)) { - return PTR_ERR(vdd_cx); - } - - ret = regulator_set_voltage(vdd_cx, - USB_PHY_OPERATIONAL_MIN_VDD_DIG_VOL, - USB_PHY_MAX_VDD_DIG_VOL); - if (ret) { - pr_err("%s: unable to set the voltage for regulator" - "vdd_cx\n", __func__); - regulator_put(vdd_cx); - return ret; - } - - ret = regulator_enable(vdd_cx); - if (ret) { - pr_err("%s: unable to enable regulator" - "vdd_cx\n", __func__); - regulator_put(vdd_cx); - } - } else { - ret = regulator_disable(vdd_cx); - if (ret) { - pr_err("%s: Unable to disable the regulator:" - "vdd_cx\n", __func__); - return ret; - } - - regulator_put(vdd_cx); - } - - return ret; -} - -static int msm_hsusb_config_vddcx(int high) -{ - int max_vol = USB_PHY_MAX_VDD_DIG_VOL; - int min_vol; - int ret; - - if (high) - min_vol = USB_PHY_OPERATIONAL_MIN_VDD_DIG_VOL; - else - min_vol = usb_phy_susp_dig_vol; - - ret = regulator_set_voltage(vdd_cx, min_vol, max_vol); - if (ret) { - pr_err("%s: unable to set the voltage for regulator" - "vdd_cx\n", __func__); - return ret; - } - - pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); - - return ret; -} - -#define USB_PHY_3P3_VOL_MIN 3050000 /* uV */ -#define USB_PHY_3P3_VOL_MAX 3050000 /* uV */ -#define USB_PHY_3P3_HPM_LOAD 50000 /* uA */ -#define USB_PHY_3P3_LPM_LOAD 4000 /* uA */ - -#define USB_PHY_1P8_VOL_MIN 1800000 /* uV */ -#define USB_PHY_1P8_VOL_MAX 1800000 /* uV */ -#define USB_PHY_1P8_HPM_LOAD 50000 /* uA */ -#define USB_PHY_1P8_LPM_LOAD 4000 /* uA */ -static int msm_hsusb_ldo_init(int init) -{ - int rc = 0; - - if (init) { - ldo6_3p3 = regulator_get(NULL, "8058_l6"); - if (IS_ERR(ldo6_3p3)) - return PTR_ERR(ldo6_3p3); - - ldo7_1p8 = regulator_get(NULL, "8058_l7"); - if (IS_ERR(ldo7_1p8)) { - rc = PTR_ERR(ldo7_1p8); - goto put_3p3; - } - - rc = regulator_set_voltage(ldo6_3p3, USB_PHY_3P3_VOL_MIN, - USB_PHY_3P3_VOL_MAX); - if (rc) { - pr_err("%s: Unable to set voltage level for" - "ldo6_3p3 regulator\n", __func__); - goto put_1p8; - } - rc = regulator_enable(ldo6_3p3); - if (rc) { - pr_err("%s: Unable to enable the regulator:" - "ldo6_3p3\n", __func__); - goto put_1p8; - } - rc = regulator_set_voltage(ldo7_1p8, USB_PHY_1P8_VOL_MIN, - USB_PHY_1P8_VOL_MAX); - if (rc) { - pr_err("%s: Unable to set voltage level for" - "ldo7_1p8 regulator\n", __func__); - goto disable_3p3; - } - rc = regulator_enable(ldo7_1p8); - if (rc) { - pr_err("%s: Unable to enable the regulator:" - "ldo7_1p8\n", __func__); - goto disable_3p3; - } - - return 0; - } - - regulator_disable(ldo7_1p8); -disable_3p3: - regulator_disable(ldo6_3p3); -put_1p8: - regulator_put(ldo7_1p8); -put_3p3: - regulator_put(ldo6_3p3); - return rc; -} - -static int msm_hsusb_ldo_enable(int on) -{ - int ret = 0; - - if (!ldo7_1p8 || IS_ERR(ldo7_1p8)) { - pr_err("%s: ldo7_1p8 is not initialized\n", __func__); - return -ENODEV; - } - - if (!ldo6_3p3 || IS_ERR(ldo6_3p3)) { - pr_err("%s: ldo6_3p3 is not initialized\n", __func__); - return -ENODEV; - } - - if (on) { - ret = regulator_set_optimum_mode(ldo7_1p8, - USB_PHY_1P8_HPM_LOAD); - if (ret < 0) { - pr_err("%s: Unable to set HPM of the regulator:" - "ldo7_1p8\n", __func__); - return ret; - } - ret = regulator_set_optimum_mode(ldo6_3p3, - USB_PHY_3P3_HPM_LOAD); - if (ret < 0) { - pr_err("%s: Unable to set HPM of the regulator:" - "ldo6_3p3\n", __func__); - regulator_set_optimum_mode(ldo7_1p8, - USB_PHY_1P8_LPM_LOAD); - return ret; - } - } else { - ret = regulator_set_optimum_mode(ldo7_1p8, - USB_PHY_1P8_LPM_LOAD); - if (ret < 0) - pr_err("%s: Unable to set LPM of the regulator:" - "ldo7_1p8\n", __func__); - ret = regulator_set_optimum_mode(ldo6_3p3, - USB_PHY_3P3_LPM_LOAD); - if (ret < 0) - pr_err("%s: Unable to set LPM of the regulator:" - "ldo6_3p3\n", __func__); - } - - pr_debug("reg (%s)\n", on ? "HPM" : "LPM"); - return ret < 0 ? ret : 0; - } -#endif -#ifdef CONFIG_USB_EHCI_MSM_72K -#if defined(CONFIG_SMB137B_CHARGER) || defined(CONFIG_SMB137B_CHARGER_MODULE) -static void msm_hsusb_smb137b_vbus_power(unsigned phy_info, int on) -{ - static int vbus_is_on; - - /* If VBUS is already on (or off), do nothing. */ - if (on == vbus_is_on) - return; - smb137b_otg_power(on); - vbus_is_on = on; -} -#endif -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - static struct regulator *votg_5v_switch; - static struct regulator *ext_5v_reg; - static int vbus_is_on; - - /* If VBUS is already on (or off), do nothing. */ - if (on == vbus_is_on) - return; - - if (!votg_5v_switch) { - votg_5v_switch = regulator_get(NULL, "8901_usb_otg"); - if (IS_ERR(votg_5v_switch)) { - pr_err("%s: unable to get votg_5v_switch\n", __func__); - return; - } - } - if (!ext_5v_reg) { - ext_5v_reg = regulator_get(NULL, "8901_mpp0"); - if (IS_ERR(ext_5v_reg)) { - pr_err("%s: unable to get ext_5v_reg\n", __func__); - return; - } - } - if (on) { - if (regulator_enable(ext_5v_reg)) { - pr_err("%s: Unable to enable the regulator:" - " ext_5v_reg\n", __func__); - return; - } - if (regulator_enable(votg_5v_switch)) { - pr_err("%s: Unable to enable the regulator:" - " votg_5v_switch\n", __func__); - return; - } - } else { - if (regulator_disable(votg_5v_switch)) - pr_err("%s: Unable to enable the regulator:" - " votg_5v_switch\n", __func__); - if (regulator_disable(ext_5v_reg)) - pr_err("%s: Unable to enable the regulator:" - " ext_5v_reg\n", __func__); - } - - vbus_is_on = on; -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM), - .power_budget = 390, -}; -#endif - -#ifdef CONFIG_BATTERY_MSM8X60 -static int msm_hsusb_pmic_vbus_notif_init(void (*callback)(int online), - int init) -{ - int ret = -ENOTSUPP; - -#if defined(CONFIG_SMB137B_CHARGER) || defined(CONFIG_SMB137B_CHARGER_MODULE) - if (machine_is_msm8x60_fluid()) { - if (init) - msm_charger_register_vbus_sn(callback); - else - msm_charger_unregister_vbus_sn(callback); - return 0; - } -#endif - /* ID and VBUS lines are connected to pmic on 8660.V2.SURF, - * hence, irrespective of either peripheral only mode or - * OTG (host and peripheral) modes, can depend on pmic for - * vbus notifications - */ - if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) - && (machine_is_msm8x60_surf() || - pmic_id_notif_supported)) { - if (init) - ret = msm_charger_register_vbus_sn(callback); - else { - msm_charger_unregister_vbus_sn(callback); - ret = 0; - } - } else { -#if !defined(CONFIG_USB_EHCI_MSM_72K) - if (init) - ret = msm_charger_register_vbus_sn(callback); - else { - msm_charger_unregister_vbus_sn(callback); - ret = 0; - } -#endif - } - return ret; -} -#endif - -#if defined(CONFIG_USB_MSM_72K) || defined(CONFIG_USB_EHCI_MSM_72K) -static struct msm_otg_platform_data msm_otg_pdata = { - /* if usb link is in sps there is no need for - * usb pclk as dayatona fabric clock will be - * used instead - */ - .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT, - .cdr_autoreset = CDR_AUTO_RESET_DISABLE, - .se1_gating = SE1_GATING_DISABLE, - .bam_disable = 1, -#ifdef CONFIG_USB_EHCI_MSM_72K - .pmic_id_notif_init = msm_hsusb_pmic_id_notif_init, - .phy_id_setup_init = msm_hsusb_phy_id_setup_init, -#endif -#ifdef CONFIG_USB_EHCI_MSM_72K - .vbus_power = msm_hsusb_vbus_power, -#endif -#ifdef CONFIG_BATTERY_MSM8X60 - .pmic_vbus_notif_init = msm_hsusb_pmic_vbus_notif_init, -#endif - .ldo_init = msm_hsusb_ldo_init, - .ldo_enable = msm_hsusb_ldo_enable, - .config_vddcx = msm_hsusb_config_vddcx, - .init_vddcx = msm_hsusb_init_vddcx, -#ifdef CONFIG_BATTERY_MSM8X60 - .chg_vbus_draw = msm_charger_vbus_draw, -#endif -}; -#endif - -#ifdef CONFIG_USB_MSM_72K -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = { - .is_phy_status_timer_on = 1, -}; -#endif - -#ifdef CONFIG_USB_G_ANDROID - -#define PID_MAGIC_ID 0x71432909 -#define SERIAL_NUM_MAGIC_ID 0x61945374 -#define SERIAL_NUMBER_LENGTH 127 -#define DLOAD_USB_BASE_ADD 0x2A05F0C8 - -struct magic_num_struct { - uint32_t pid; - uint32_t serial_num; -}; - -struct dload_struct { - uint32_t reserved1; - uint32_t reserved2; - uint32_t reserved3; - uint16_t reserved4; - uint16_t pid; - char serial_number[SERIAL_NUMBER_LENGTH]; - uint16_t reserved5; - struct magic_num_struct - magic_struct; -}; - -static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum) -{ - struct dload_struct __iomem *dload = 0; - - dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload)); - if (!dload) { - pr_err("%s: cannot remap I/O memory region: %08x\n", - __func__, DLOAD_USB_BASE_ADD); - return -ENXIO; - } - - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", - __func__, dload, pid, snum); - /* update pid */ - dload->magic_struct.pid = PID_MAGIC_ID; - dload->pid = pid; - - /* update serial number */ - dload->magic_struct.serial_num = 0; - if (!snum) - return 0; - - dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID; - strncpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH); - dload->serial_number[SERIAL_NUMBER_LENGTH - 1] = '\0'; - - iounmap(dload); - - return 0; -} - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - - -#endif - -#ifdef CONFIG_MSM_VPE -#ifndef CONFIG_MSM_CAMERA_V4L2 -static struct resource msm_vpe_resources[] = { - { - .start = 0x05300000, - .end = 0x05300000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_VPE, - .end = INT_VPE, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_vpe_device = { - .name = "msm_vpe", - .id = 0, - .num_resources = ARRAY_SIZE(msm_vpe_resources), - .resource = msm_vpe_resources, -}; -#endif -#endif - -#ifdef CONFIG_MSM_CAMERA -#ifndef CONFIG_MSM_CAMERA_V4L2 -#ifdef CONFIG_MSM_CAMERA_FLASH -#define VFE_CAMIF_TIMER1_GPIO 29 -#define VFE_CAMIF_TIMER2_GPIO 30 -#define VFE_CAMIF_TIMER3_GPIO_INT 31 -#define FUSION_VFE_CAMIF_TIMER1_GPIO 42 -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_PMIC, - ._fsrc.pmic_src.num_of_src = 2, - ._fsrc.pmic_src.low_current = 100, - ._fsrc.pmic_src.high_current = 300, - ._fsrc.pmic_src.led_src_1 = PMIC8058_ID_FLASH_LED_0, - ._fsrc.pmic_src.led_src_2 = PMIC8058_ID_FLASH_LED_1, - ._fsrc.pmic_src.pmic_set_current = pm8058_set_flash_led_current, -}; -#ifdef CONFIG_IMX074 -static struct msm_camera_sensor_strobe_flash_data strobe_flash_xenon = { - .flash_trigger = VFE_CAMIF_TIMER2_GPIO, - .flash_charge = VFE_CAMIF_TIMER1_GPIO, - .flash_charge_done = VFE_CAMIF_TIMER3_GPIO_INT, - .flash_recharge_duration = 50000, - .irq = MSM_GPIO_TO_INT(VFE_CAMIF_TIMER3_GPIO_INT), -}; -#endif -#endif - -int msm_cam_gpio_tbl[] = { - 32,/*CAMIF_MCLK*/ - 47,/*CAMIF_I2C_DATA*/ - 48,/*CAMIF_I2C_CLK*/ - 105,/*STANDBY*/ -}; - -enum msm_cam_stat{ - MSM_CAM_OFF, - MSM_CAM_ON, -}; - -static int config_gpio_table(enum msm_cam_stat stat) -{ - int rc = 0, i = 0; - if (stat == MSM_CAM_ON) { - for (i = 0; i < ARRAY_SIZE(msm_cam_gpio_tbl); i++) { - rc = gpio_request(msm_cam_gpio_tbl[i], "CAM_GPIO"); - if (unlikely(rc < 0)) { - pr_err("%s not able to get gpio\n", __func__); - for (i--; i >= 0; i--) - gpio_free(msm_cam_gpio_tbl[i]); - break; - } - } - } else { - for (i = 0; i < ARRAY_SIZE(msm_cam_gpio_tbl); i++) - gpio_free(msm_cam_gpio_tbl[i]); - } - return rc; -} - -static struct msm_camera_sensor_platform_info sensor_board_info = { - .mount_angle = 0 -}; - -/*external regulator VREG_5V*/ -static struct regulator *reg_flash_5V; - -static int config_camera_on_gpios_fluid(void) -{ - int rc = 0; - - reg_flash_5V = regulator_get(NULL, "8901_mpp0"); - if (IS_ERR(reg_flash_5V)) { - pr_err("'%s' regulator not found, rc=%ld\n", - "8901_mpp0", IS_ERR(reg_flash_5V)); - return -ENODEV; - } - - rc = regulator_enable(reg_flash_5V); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8901_mpp0", rc); - regulator_put(reg_flash_5V); - return rc; - } - -#ifdef CONFIG_IMX074 - sensor_board_info.mount_angle = 90; -#endif - rc = config_gpio_table(MSM_CAM_ON); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio table request" - "failed\n", __func__); - return rc; - } - - rc = gpio_request(GPIO_EXT_CAMIF_PWR_EN, "CAM_EN"); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio %d request" - "failed\n", __func__, GPIO_EXT_CAMIF_PWR_EN); - regulator_disable(reg_flash_5V); - regulator_put(reg_flash_5V); - return rc; - } - gpio_direction_output(GPIO_EXT_CAMIF_PWR_EN, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_EXT_CAMIF_PWR_EN, 1); - - - /*Enable LED_FLASH_EN*/ - rc = gpio_request(GPIO_LED_FLASH_EN, "LED_FLASH_EN"); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio %d request" - "failed\n", __func__, GPIO_LED_FLASH_EN); - - regulator_disable(reg_flash_5V); - regulator_put(reg_flash_5V); - config_gpio_table(MSM_CAM_OFF); - gpio_set_value_cansleep(GPIO_EXT_CAMIF_PWR_EN, 0); - gpio_free(GPIO_EXT_CAMIF_PWR_EN); - return rc; - } - gpio_direction_output(GPIO_LED_FLASH_EN, 1); - msleep(20); - return rc; -} - - -static void config_camera_off_gpios_fluid(void) -{ - regulator_disable(reg_flash_5V); - regulator_put(reg_flash_5V); - - gpio_direction_output(GPIO_LED_FLASH_EN, 0); - gpio_free(GPIO_LED_FLASH_EN); - - config_gpio_table(MSM_CAM_OFF); - - gpio_set_value_cansleep(GPIO_EXT_CAMIF_PWR_EN, 0); - gpio_free(GPIO_EXT_CAMIF_PWR_EN); -} -static int config_camera_on_gpios(void) -{ - int rc = 0; - - if (machine_is_msm8x60_fluid()) - return config_camera_on_gpios_fluid(); - - rc = config_gpio_table(MSM_CAM_ON); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio table request" - "failed\n", __func__); - return rc; - } - - if (!machine_is_msm8x60_dragon()) { - rc = gpio_request(GPIO_EXT_CAMIF_PWR_EN, "CAM_EN"); - if (rc < 0) { - config_gpio_table(MSM_CAM_OFF); - pr_err("%s: CAMSENSOR gpio %d request" - "failed\n", __func__, GPIO_EXT_CAMIF_PWR_EN); - return rc; - } - gpio_direction_output(GPIO_EXT_CAMIF_PWR_EN, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_EXT_CAMIF_PWR_EN, 1); - } - -#ifdef CONFIG_MSM_CAMERA_FLASH -#ifdef CONFIG_IMX074 - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) - strobe_flash_xenon.flash_charge = FUSION_VFE_CAMIF_TIMER1_GPIO; -#endif -#endif - return rc; -} - -static void config_camera_off_gpios(void) -{ - if (machine_is_msm8x60_fluid()) - return config_camera_off_gpios_fluid(); - - - config_gpio_table(MSM_CAM_OFF); - - if (!machine_is_msm8x60_dragon()) { - gpio_set_value_cansleep(GPIO_EXT_CAMIF_PWR_EN, 0); - gpio_free(GPIO_EXT_CAMIF_PWR_EN); - } -} - -#ifdef CONFIG_QS_S5K4E1 - -#define QS_CAM_HC37_CAM_PD PM8058_GPIO_PM_TO_SYS(26) - -static int config_camera_on_gpios_qs_cam_fluid(void) -{ - int rc = 0; - - /* request QS_CAM_HC37_CAM_PD as an output to HC37 ASIC pin CAM_PD */ - rc = gpio_request(QS_CAM_HC37_CAM_PD, "QS_CAM_HC37_CAM_PD"); - if (rc < 0) { - printk(KERN_ERR "%s: QS_CAM_HC37_CAM_PD gpio %d request" - " failed\n", __func__, QS_CAM_HC37_CAM_PD); - return rc; - } - gpio_direction_output(QS_CAM_HC37_CAM_PD, 0); - msleep(20); - gpio_set_value_cansleep(QS_CAM_HC37_CAM_PD, 1); - msleep(20); - - /* - * Set GPIO_AUX_CAM_2P7_EN to 1 on North Expander IO2 - * to enable 2.7V power to Camera - */ - rc = gpio_request(GPIO_AUX_CAM_2P7_EN, "CAM_2P7_EN"); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio %d request" - " failed\n", __func__, GPIO_AUX_CAM_2P7_EN); - gpio_set_value_cansleep(QS_CAM_HC37_CAM_PD, 0); - gpio_free(QS_CAM_HC37_CAM_PD); - return rc; - } - gpio_direction_output(GPIO_AUX_CAM_2P7_EN, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_AUX_CAM_2P7_EN, 1); - msleep(20); - - rc = config_camera_on_gpios_fluid(); - if (rc < 0) { - printk(KERN_ERR "%s: config_camera_on_gpios_fluid" - " failed\n", __func__); - gpio_set_value_cansleep(QS_CAM_HC37_CAM_PD, 0); - gpio_free(QS_CAM_HC37_CAM_PD); - gpio_set_value_cansleep(GPIO_AUX_CAM_2P7_EN, 0); - gpio_free(GPIO_AUX_CAM_2P7_EN); - return rc; - } - return rc; -} - -static void config_camera_off_gpios_qs_cam_fluid(void) -{ - /* - * Set GPIO_AUX_CAM_2P7_EN to 0 on North Expander IO2 - * to disable 2.7V power to Camera - */ - gpio_set_value_cansleep(GPIO_AUX_CAM_2P7_EN, 0); - gpio_free(GPIO_AUX_CAM_2P7_EN); - - /* set QS_CAM_HC37_CAM_PD to 0 to power off HC37 ASIC*/ - gpio_set_value_cansleep(QS_CAM_HC37_CAM_PD, 0); - gpio_free(QS_CAM_HC37_CAM_PD); - - config_camera_off_gpios_fluid(); - return; -} - -static int config_camera_on_gpios_qs_cam(void) -{ - int rc = 0; - - if (machine_is_msm8x60_fluid()) - return config_camera_on_gpios_qs_cam_fluid(); - - rc = config_camera_on_gpios(); - return rc; -} - -static void config_camera_off_gpios_qs_cam(void) -{ - if (machine_is_msm8x60_fluid()) - return config_camera_off_gpios_qs_cam_fluid(); - - config_camera_off_gpios(); - return; -} -#endif - -static int config_camera_on_gpios_web_cam(void) -{ - int rc = 0; - rc = config_gpio_table(MSM_CAM_ON); - if (rc < 0) { - printk(KERN_ERR "%s: CAMSENSOR gpio table request" - "failed\n", __func__); - return rc; - } - - if (!(machine_is_msm8x60_fluid() || machine_is_msm8x60_dragon())) { - rc = gpio_request(GPIO_WEB_CAMIF_STANDBY, "CAM_EN"); - if (rc < 0) { - config_gpio_table(MSM_CAM_OFF); - pr_err(KERN_ERR "%s: CAMSENSOR gpio %d request" - "failed\n", __func__, GPIO_WEB_CAMIF_STANDBY); - return rc; - } - gpio_direction_output(GPIO_WEB_CAMIF_STANDBY, 0); - } - return rc; -} - -static void config_camera_off_gpios_web_cam(void) -{ - config_gpio_table(MSM_CAM_OFF); - if (!(machine_is_msm8x60_fluid() || machine_is_msm8x60_dragon())) { - gpio_set_value_cansleep(GPIO_WEB_CAMIF_STANDBY, 1); - gpio_free(GPIO_WEB_CAMIF_STANDBY); - } - return; -} - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors cam_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_preview_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 283115520, - .ib = 452984832, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 319610880, - .ib = 511377408, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 566231040, - .ib = 905969664, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 69984000, - .ib = 111974400, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 320864256, - .ib = 513382810, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 320864256, - .ib = 513382810, - }, -}; - -static struct msm_bus_vectors cam_zsl_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 566231040, - .ib = 905969664, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 706199040, - .ib = 1129918464, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 320864256, - .ib = 513382810, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 320864256, - .ib = 513382810, - }, -}; - -static struct msm_bus_vectors cam_stereo_video_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 212336640, - .ib = 339738624, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 25090560, - .ib = 40144896, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 239708160, - .ib = 383533056, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 79902720, - .ib = 127844352, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors cam_stereo_snapshot_vectors[] = { - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VFE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 300902400, - .ib = 481443840, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 230307840, - .ib = 368492544, - }, - { - .src = MSM_BUS_MASTER_VPE, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 245113344, - .ib = 392181351, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 106536960, - .ib = 170459136, - }, - { - .src = MSM_BUS_MASTER_JPEG_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 106536960, - .ib = 170459136, - }, -}; - -static struct msm_bus_paths cam_bus_client_config[] = { - { - ARRAY_SIZE(cam_init_vectors), - cam_init_vectors, - }, - { - ARRAY_SIZE(cam_preview_vectors), - cam_preview_vectors, - }, - { - ARRAY_SIZE(cam_video_vectors), - cam_video_vectors, - }, - { - ARRAY_SIZE(cam_snapshot_vectors), - cam_snapshot_vectors, - }, - { - ARRAY_SIZE(cam_zsl_vectors), - cam_zsl_vectors, - }, - { - ARRAY_SIZE(cam_stereo_video_vectors), - cam_stereo_video_vectors, - }, - { - ARRAY_SIZE(cam_stereo_snapshot_vectors), - cam_stereo_snapshot_vectors, - }, -}; - -static struct msm_bus_scale_pdata cam_bus_client_pdata = { - cam_bus_client_config, - ARRAY_SIZE(cam_bus_client_config), - .name = "msm_camera", -}; -#endif - -struct msm_camera_device_platform_data msm_camera_device_data = { - .camera_gpio_on = config_camera_on_gpios, - .camera_gpio_off = config_camera_off_gpios, - .ioext.csiphy = 0x04800000, - .ioext.csisz = 0x00000400, - .ioext.csiirq = CSI_0_IRQ, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 228570000, -#ifdef CONFIG_MSM_BUS_SCALING - .cam_bus_scale_table = &cam_bus_client_pdata, -#endif -}; - -#ifdef CONFIG_QS_S5K4E1 -struct msm_camera_device_platform_data msm_camera_device_data_qs_cam = { - .camera_gpio_on = config_camera_on_gpios_qs_cam, - .camera_gpio_off = config_camera_off_gpios_qs_cam, - .ioext.csiphy = 0x04800000, - .ioext.csisz = 0x00000400, - .ioext.csiirq = CSI_0_IRQ, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 228570000, -#ifdef CONFIG_MSM_BUS_SCALING - .cam_bus_scale_table = &cam_bus_client_pdata, -#endif -}; -#endif - -struct msm_camera_device_platform_data msm_camera_device_data_web_cam = { - .camera_gpio_on = config_camera_on_gpios_web_cam, - .camera_gpio_off = config_camera_off_gpios_web_cam, - .ioext.csiphy = 0x04900000, - .ioext.csisz = 0x00000400, - .ioext.csiirq = CSI_1_IRQ, - .ioclk.mclk_clk_rate = 24000000, - .ioclk.vfe_clk_rate = 228570000, -#ifdef CONFIG_MSM_BUS_SCALING - .cam_bus_scale_table = &cam_bus_client_pdata, -#endif -}; - -struct resource msm_camera_resources[] = { - { - .start = 0x04500000, - .end = 0x04500000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = VFE_IRQ, - .end = VFE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; -#ifdef CONFIG_MT9E013 -static struct msm_camera_sensor_platform_info mt9e013_sensor_8660_info = { - .mount_angle = 0 -}; - -static struct msm_camera_sensor_flash_data flash_mt9e013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9e013_data = { - .sensor_name = "mt9e013", - .sensor_reset = 106, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9e013, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &mt9e013_sensor_8660_info, - .csi_if = 1 -}; -struct platform_device msm_camera_sensor_mt9e013 = { - .name = "msm_camera_mt9e013", - .dev = { - .platform_data = &msm_camera_sensor_mt9e013_data, - }, -}; -#endif - -#ifdef CONFIG_IMX074 -static struct msm_camera_sensor_platform_info imx074_sensor_board_info = { - .mount_angle = 180 -}; - -static struct msm_camera_sensor_flash_data flash_imx074 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = { - .sensor_name = "imx074", - .sensor_reset = 106, - .sensor_pwd = 85, - .vcm_pwd = GPIO_AUX_CAM_2P7_EN, - .vcm_enable = 1, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_imx074, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &imx074_sensor_board_info, - .csi_if = 1 -}; -struct platform_device msm_camera_sensor_imx074 = { - .name = "msm_camera_imx074", - .dev = { - .platform_data = &msm_camera_sensor_imx074_data, - }, -}; -#endif -#ifdef CONFIG_WEBCAM_OV9726 - -static struct msm_camera_sensor_platform_info ov9726_sensor_8660_info = { - .mount_angle = 0 -}; - -static struct msm_camera_sensor_flash_data flash_ov9726 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; -static struct msm_camera_sensor_info msm_camera_sensor_ov9726_data = { - .sensor_name = "ov9726", - .sensor_reset_enable = 1, - .sensor_reset = GPIO_FRONT_CAM_RESET_N, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_web_cam, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_ov9726, - .sensor_platform_info = &ov9726_sensor_8660_info, - .csi_if = 1 -}; -struct platform_device msm_camera_sensor_webcam_ov9726 = { - .name = "msm_camera_ov9726", - .dev = { - .platform_data = &msm_camera_sensor_ov9726_data, - }, -}; -#endif -#ifdef CONFIG_WEBCAM_OV7692 -static struct msm_camera_sensor_flash_data flash_ov7692 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; -static struct msm_camera_sensor_info msm_camera_sensor_ov7692_data = { - .sensor_name = "ov7692", - .sensor_reset = GPIO_WEB_CAMIF_RESET_N, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_web_cam, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_ov7692, - .csi_if = 1 -}; - -static struct platform_device msm_camera_sensor_webcam_ov7692 = { - .name = "msm_camera_ov7692", - .dev = { - .platform_data = &msm_camera_sensor_ov7692_data, - }, -}; -#endif -#ifdef CONFIG_VX6953 -static struct msm_camera_sensor_platform_info vx6953_sensor_8660_info = { - .mount_angle = 270 -}; - -static struct msm_camera_sensor_flash_data flash_vx6953 = { - .flash_type = MSM_CAMERA_FLASH_NONE, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_vx6953_data = { - .sensor_name = "vx6953", - .sensor_reset = 63, - .sensor_pwd = 63, - .vcm_pwd = GPIO_AUX_CAM_2P7_EN, - .vcm_enable = 1, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_vx6953, - .sensor_platform_info = &vx6953_sensor_8660_info, - .csi_if = 1 -}; -struct platform_device msm_camera_sensor_vx6953 = { - .name = "msm_camera_vx6953", - .dev = { - .platform_data = &msm_camera_sensor_vx6953_data, - }, -}; -#endif -#ifdef CONFIG_QS_S5K4E1 - -static struct msm_camera_sensor_platform_info qs_s5k4e1_sensor_8660_info = { -#ifdef CONFIG_FB_MSM_MIPI_NOVATEK_CMD_QHD_PT - .mount_angle = 90 -#else - .mount_angle = 0 -#endif -}; - -static char eeprom_data[864]; -static struct msm_camera_sensor_flash_data flash_qs_s5k4e1 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_qs_s5k4e1_data = { - .sensor_name = "qs_s5k4e1", - .sensor_reset = 106, - .sensor_pwd = 85, - .vcm_pwd = 1, - .vcm_enable = 0, - .pdata = &msm_camera_device_data_qs_cam, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_qs_s5k4e1, - .strobe_flash_data = &strobe_flash_xenon, - .sensor_platform_info = &qs_s5k4e1_sensor_8660_info, - .csi_if = 1, - .eeprom_data = eeprom_data, -}; -struct platform_device msm_camera_sensor_qs_s5k4e1 = { - .name = "msm_camera_qs_s5k4e1", - .dev = { - .platform_data = &msm_camera_sensor_qs_s5k4e1_data, - }, -}; -#endif -static struct i2c_board_info msm_camera_boardinfo[] __initdata = { - #ifdef CONFIG_MT9E013 - { - I2C_BOARD_INFO("mt9e013", 0x6C >> 2), - }, - #endif - #ifdef CONFIG_IMX074 - { - I2C_BOARD_INFO("imx074", 0x1A), - }, - #endif - #ifdef CONFIG_WEBCAM_OV7692 - { - I2C_BOARD_INFO("ov7692", 0x78), - }, - #endif - #ifdef CONFIG_WEBCAM_OV9726 - { - I2C_BOARD_INFO("ov9726", 0x10), - }, - #endif - #ifdef CONFIG_QS_S5K4E1 - { - I2C_BOARD_INFO("qs_s5k4e1", 0x20), - }, - #endif -}; - -static struct i2c_board_info msm_camera_dragon_boardinfo[] __initdata = { - #ifdef CONFIG_WEBCAM_OV9726 - { - I2C_BOARD_INFO("ov9726", 0x10), - }, - #endif - #ifdef CONFIG_VX6953 - { - I2C_BOARD_INFO("vx6953", 0x20), - }, - #endif -}; -#endif -#endif - -#ifdef CONFIG_MSM_GEMINI -static struct resource msm_gemini_resources[] = { - { - .start = 0x04600000, - .end = 0x04600000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_JPEG, - .end = INT_JPEG, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_gemini_device = { - .name = "msm_gemini", - .resource = msm_gemini_resources, - .num_resources = ARRAY_SIZE(msm_gemini_resources), -}; -#endif - -#ifdef CONFIG_I2C_QUP -static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type) -{ -} - -static struct msm_i2c_platform_data msm_gsbi3_qup_i2c_pdata = { - .clk_freq = 384000, - .src_clk_rate = 24000000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi4_qup_i2c_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi7_qup_i2c_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi8_qup_i2c_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi9_qup_i2c_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi12_qup_i2c_pdata = { - .clk_freq = 100000, - .src_clk_rate = 24000000, - .use_gsbi_shared_mode = 1, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; -#endif - -#if defined(CONFIG_SPI_QUP) || defined(CONFIG_SPI_QUP_MODULE) -static struct msm_spi_platform_data msm_gsbi1_qup_spi_pdata = { - .max_clock_speed = 24000000, -}; - -static struct msm_spi_platform_data msm_gsbi10_qup_spi_pdata = { - .max_clock_speed = 24000000, -}; -#endif - -#ifdef CONFIG_I2C_SSBI -/* CODEC/TSSC SSBI */ -static struct msm_i2c_ssbi_platform_data msm_ssbi3_pdata = { - .controller_type = MSM_SBI_CTRL_SSBI, -}; -#endif - -#ifdef CONFIG_BATTERY_MSM -/* Use basic value for fake MSM battery */ -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .avail_chg_sources = AC_CHG, -}; - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; -#endif - -#ifdef CONFIG_FB_MSM_LCDC_DSUB -/* VGA = 1440 x 900 x 4(bpp) x 2(pages) - prim = 1024 x 600 x 4(bpp) x 2(pages) - This is the difference. */ -#define MSM_FB_DSUB_PMEM_ADDER (0xA32000-0x4B0000) -#else -#define MSM_FB_DSUB_PMEM_ADDER (0) -#endif - -/* Sensors DSPS platform data */ -#ifdef CONFIG_MSM_DSPS - -static struct dsps_gpio_info dsps_surf_gpios[] = { - { - .name = "compass_rst_n", - .num = GPIO_COMPASS_RST_N, - .on_val = 1, /* device not in reset */ - .off_val = 0, /* device in reset */ - }, - { - .name = "gpio_r_altimeter_reset_n", - .num = GPIO_R_ALTIMETER_RESET_N, - .on_val = 1, /* device not in reset */ - .off_val = 0, /* device in reset */ - } -}; - -static struct dsps_gpio_info dsps_fluid_gpios[] = { - { - .name = "gpio_n_altimeter_reset_n", - .num = GPIO_N_ALTIMETER_RESET_N, - .on_val = 1, /* device not in reset */ - .off_val = 0, /* device in reset */ - } -}; - -static void __init msm8x60_init_dsps(void) -{ - struct msm_dsps_platform_data *pdata = - msm_dsps_device.dev.platform_data; - /* - * On Fluid the Compass sensor Chip-Select (CS) is directly connected - * to the power supply and not controled via GPIOs. Fluid uses a - * different IO-Expender (north) than used on surf/ffa. - */ - if (machine_is_msm8x60_fluid()) { - /* fluid has different firmware, gpios */ - pdata->pil_name = DSPS_PIL_FLUID_NAME; - msm_pil_dsps.dev.platform_data = DSPS_PIL_FLUID_NAME; - pdata->gpios = dsps_fluid_gpios; - pdata->gpios_num = ARRAY_SIZE(dsps_fluid_gpios); - } else { - pdata->pil_name = DSPS_PIL_GENERIC_NAME; - msm_pil_dsps.dev.platform_data = DSPS_PIL_GENERIC_NAME; - pdata->gpios = dsps_surf_gpios; - pdata->gpios_num = ARRAY_SIZE(dsps_surf_gpios); - } - - platform_device_register(&msm_dsps_device); -} -#endif /* CONFIG_MSM_DSPS */ - -#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((1024 * 600 * 4), 4096) * 3) /* 4 bpp x 3 pages */ -#else -#define MSM_FB_PRIM_BUF_SIZE \ - (roundup((1024 * 600 * 4), 4096) * 2) /* 4 bpp x 2 pages */ -#endif - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -#define MSM_FB_EXT_BUF_SIZE \ - (roundup((1920 * 1080 * 2), 4096) * 1) /* 2 bpp x 1 page */ -#elif defined(CONFIG_FB_MSM_TVOUT) -#define MSM_FB_EXT_BUF_SIZE \ - (roundup((720 * 576 * 2), 4096) * 2) /* 2 bpp x 2 pages */ -#else -#define MSM_FB_EXT_BUF_SIZE 0 -#endif - -/* Note: must be multiple of 4096 */ -#define MSM_FB_SIZE roundup(MSM_FB_PRIM_BUF_SIZE + MSM_FB_EXT_BUF_SIZE + \ - MSM_FB_DSUB_PMEM_ADDER, 4096) - -#define MSM_PMEM_SF_SIZE 0x4000000 /* 64 Mbytes */ -#define MSM_HDMI_PRIM_PMEM_SF_SIZE 0x8000000 /* 128 Mbytes */ - -#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY -unsigned char hdmi_is_primary = 1; -#else -unsigned char hdmi_is_primary; -#endif - -#ifdef CONFIG_FB_MSM_OVERLAY0_WRITEBACK -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE roundup((1376 * 768 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY0_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY0_WRITEBACK */ - -#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE roundup((1920 * 1088 * 3 * 2), 4096) -#else -#define MSM_FB_OVERLAY1_WRITEBACK_SIZE (0) -#endif /* CONFIG_FB_MSM_OVERLAY1_WRITEBACK */ - -#define MSM_PMEM_KERNEL_EBI1_SIZE 0x3BC000 -#define MSM_PMEM_ADSP_SIZE 0x4200000 -#define MSM_PMEM_AUDIO_SIZE 0x4CF000 - -#define MSM_SMI_BASE 0x38000000 -#define MSM_SMI_SIZE 0x4000000 - -#define KERNEL_SMI_BASE (MSM_SMI_BASE) -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) -#define KERNEL_SMI_SIZE 0x000000 -#else -#define KERNEL_SMI_SIZE 0x600000 -#endif - -#define USER_SMI_BASE (KERNEL_SMI_BASE + KERNEL_SMI_SIZE) -#define USER_SMI_SIZE (MSM_SMI_SIZE - KERNEL_SMI_SIZE) -#define MSM_PMEM_SMIPOOL_SIZE USER_SMI_SIZE - -#ifdef CONFIG_MSM_CP -#define MSM_ION_HOLE_SIZE SZ_128K /* (128KB) */ -#else -#define MSM_ION_HOLE_SIZE 0 -#endif - -#define MSM_MM_FW_SIZE (0x200000 - MSM_ION_HOLE_SIZE) /*(2MB-128KB)*/ -#define MSM_ION_MM_SIZE 0x3800000 /* (56MB) */ -#define MSM_ION_MFC_SIZE SZ_8K - -#define MSM_MM_FW_BASE MSM_SMI_BASE -#define MSM_ION_HOLE_BASE (MSM_MM_FW_BASE + MSM_MM_FW_SIZE) -#define MSM_ION_MM_BASE (MSM_ION_HOLE_BASE + MSM_ION_HOLE_SIZE) -#define MSM_ION_MFC_BASE (MSM_ION_MM_BASE + MSM_ION_MM_SIZE) - -#ifdef CONFIG_MSM_CP -#define SECURE_BASE (MSM_ION_HOLE_BASE) -#define SECURE_SIZE (MSM_ION_MM_SIZE + MSM_ION_HOLE_SIZE) -#else -#define SECURE_BASE (MSM_MM_FW_BASE) -#define SECURE_SIZE (MSM_ION_MM_SIZE + MSM_MM_FW_SIZE) -#endif - -#define MSM_ION_SF_SIZE 0x4000000 /* 64MB */ -#define MSM_ION_CAMERA_SIZE MSM_PMEM_ADSP_SIZE - -#ifdef CONFIG_FB_MSM_OVERLAY1_WRITEBACK -#define MSM_ION_WB_SIZE 0xC00000 /* 12MB */ -#else -#define MSM_ION_WB_SIZE 0x600000 /* 6MB */ -#endif - -#define MSM_ION_QSECOM_SIZE 0x600000 /* (6MB) */ - -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE -#define MSM_ION_HEAP_NUM 9 -#define MSM_HDMI_PRIM_ION_SF_SIZE MSM_HDMI_PRIM_PMEM_SF_SIZE -static unsigned msm_ion_sf_size = MSM_ION_SF_SIZE; -#else -#define MSM_ION_HEAP_NUM 1 -#endif - -static unsigned fb_size; -static int __init fb_size_setup(char *p) -{ - fb_size = memparse(p, NULL); - return 0; -} -early_param("fb_size", fb_size_setup); - -static unsigned pmem_kernel_ebi1_size = MSM_PMEM_KERNEL_EBI1_SIZE; -static int __init pmem_kernel_ebi1_size_setup(char *p) -{ - pmem_kernel_ebi1_size = memparse(p, NULL); - return 0; -} -early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup); - -#ifdef CONFIG_ANDROID_PMEM -static unsigned pmem_sf_size = MSM_PMEM_SF_SIZE; -static int __init pmem_sf_size_setup(char *p) -{ - pmem_sf_size = memparse(p, NULL); - return 0; -} -early_param("pmem_sf_size", pmem_sf_size_setup); - -static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE; - -static int __init pmem_adsp_size_setup(char *p) -{ - pmem_adsp_size = memparse(p, NULL); - return 0; -} -early_param("pmem_adsp_size", pmem_adsp_size_setup); - -static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE; - -static int __init pmem_audio_size_setup(char *p) -{ - pmem_audio_size = memparse(p, NULL); - return 0; -} -early_param("pmem_audio_size", pmem_audio_size_setup); -#endif - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -static void set_mdp_clocks_for_wuxga(void); - -static int msm_fb_detect_panel(const char *name) -{ - if (machine_is_msm8x60_fluid()) { - uint32_t soc_platform_version = socinfo_get_platform_version(); - if (SOCINFO_VERSION_MAJOR(soc_platform_version) < 3) { -#ifdef CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT - if (!strncmp(name, LCDC_SAMSUNG_OLED_PANEL_NAME, - strnlen(LCDC_SAMSUNG_OLED_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - } else { /*P3 and up use AUO panel */ -#ifdef CONFIG_FB_MSM_LCDC_AUO_WVGA - if (!strncmp(name, LCDC_AUO_PANEL_NAME, - strnlen(LCDC_AUO_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - } -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - } else if machine_is_msm8x60_dragon() { - if (!strncmp(name, LCDC_NT35582_PANEL_NAME, - strnlen(LCDC_NT35582_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - } else { - if (!strncmp(name, LCDC_SAMSUNG_WSVGA_PANEL_NAME, - strnlen(LCDC_SAMSUNG_WSVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - -#if !defined(CONFIG_FB_MSM_LCDC_AUTO_DETECT) && \ - !defined(CONFIG_FB_MSM_MIPI_PANEL_AUTO_DETECT) && \ - !defined(CONFIG_FB_MSM_LCDC_MIPI_PANEL_AUTO_DETECT) - if (!strncmp(name, MIPI_VIDEO_TOSHIBA_WVGA_PANEL_NAME, - strnlen(MIPI_VIDEO_TOSHIBA_WVGA_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_VIDEO_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - if (!strncmp(name, MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - strnlen(MIPI_CMD_NOVATEK_QHD_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; -#endif - } - - if (!strncmp(name, HDMI_PANEL_NAME, - strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - if (hdmi_is_primary) - set_mdp_clocks_for_wuxga(); - return 0; - } - - if (!strncmp(name, TVOUT_PANEL_NAME, - strnlen(TVOUT_PANEL_NAME, - PANEL_NAME_MAX_LEN))) - return 0; - - pr_warning("%s: not supported '%s'", __func__, name); - return -ENODEV; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev.platform_data = &msm_fb_pdata, -}; - -#define PMEM_BUS_WIDTH(_bw) \ - { \ - .vectors = &(struct msm_bus_vectors){ \ - .src = MSM_BUS_MASTER_AMPSS_M0, \ - .dst = MSM_BUS_SLAVE_SMI, \ - .ib = (_bw), \ - .ab = 0, \ - }, \ - .num_paths = 1, \ - } - -static struct msm_bus_paths mem_smi_table[] = { - [0] = PMEM_BUS_WIDTH(0), /* Off */ - [1] = PMEM_BUS_WIDTH(1), /* On */ -}; - -static struct msm_bus_scale_pdata smi_client_pdata = { - .usecase = mem_smi_table, - .num_usecases = ARRAY_SIZE(mem_smi_table), - .name = "mem_smi", -}; - -int request_smi_region(void *data) -{ - int bus_id = (int) data; - - msm_bus_scale_client_update_request(bus_id, 1); - return 0; -} - -int release_smi_region(void *data) -{ - int bus_id = (int) data; - - msm_bus_scale_client_update_request(bus_id, 0); - return 0; -} - -void *setup_smi_region(void) -{ - return (void *)msm_bus_scale_register_client(&smi_client_pdata); -} - -#ifdef CONFIG_ANDROID_PMEM -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem", - .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING, - .cached = 1, - .memory_type = MEMTYPE_EBI1, -}; - -static struct platform_device android_pmem_device = { - .name = "android_pmem", - .id = 0, - .dev = {.platform_data = &android_pmem_pdata}, -}; - -static struct android_pmem_platform_data android_pmem_adsp_pdata = { - .name = "pmem_adsp", - .allocator_type = PMEM_ALLOCATORTYPE_BITMAP, - .cached = 0, - .memory_type = MEMTYPE_EBI1, -}; - -static struct platform_device android_pmem_adsp_device = { - .name = "android_pmem", - .id = 2, - .dev = { .platform_data = &android_pmem_adsp_pdata }, -}; - -static struct android_pmem_platform_data android_pmem_audio_pdata = { - .name = "pmem_audio", - .allocator_type = PMEM_ALLOCATORTYPE_BITMAP, - .cached = 0, - .memory_type = MEMTYPE_EBI1, -}; - -static struct platform_device android_pmem_audio_device = { - .name = "android_pmem", - .id = 4, - .dev = { .platform_data = &android_pmem_audio_pdata }, -}; -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ - -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct android_pmem_platform_data android_pmem_smipool_pdata = { - .name = "pmem_smipool", - .allocator_type = PMEM_ALLOCATORTYPE_BITMAP, - .cached = 0, - .memory_type = MEMTYPE_SMI, - .request_region = request_smi_region, - .release_region = release_smi_region, - .setup_region = setup_smi_region, - .map_on_demand = 1, -}; -static struct platform_device android_pmem_smipool_device = { - .name = "android_pmem", - .id = 7, - .dev = { .platform_data = &android_pmem_smipool_pdata }, -}; -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ -#endif /*CONFIG_ANDROID_PMEM*/ - -#define GPIO_DONGLE_PWR_EN 258 -static void setup_display_power(void); -static int lcdc_vga_enabled; -static int vga_enable_request(int enable) -{ - if (enable) - lcdc_vga_enabled = 1; - else - lcdc_vga_enabled = 0; - setup_display_power(); - - return 0; -} - -#define GPIO_BACKLIGHT_PWM0 0 -#define GPIO_BACKLIGHT_PWM1 1 - -static int pmic_backlight_gpio[2] - = { GPIO_BACKLIGHT_PWM0, GPIO_BACKLIGHT_PWM1 }; -static struct msm_panel_common_pdata lcdc_samsung_panel_data = { - .gpio_num = pmic_backlight_gpio, /* two LPG CHANNELS for backlight */ - .vga_switch = vga_enable_request, -}; - -static struct platform_device lcdc_samsung_panel_device = { - .name = LCDC_SAMSUNG_WSVGA_PANEL_NAME, - .id = 0, - .dev = { - .platform_data = &lcdc_samsung_panel_data, - } -}; -#if (!defined(CONFIG_SPI_QUP)) && \ - (defined(CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT) || \ - defined(CONFIG_FB_MSM_LCDC_AUO_WVGA)) - -static int lcdc_spi_gpio_array_num[] = { - LCDC_SPI_GPIO_CLK, - LCDC_SPI_GPIO_CS, - LCDC_SPI_GPIO_MOSI, -}; - -static uint32_t lcdc_spi_gpio_config_data[] = { - GPIO_CFG(LCDC_SPI_GPIO_CLK, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - GPIO_CFG(LCDC_SPI_GPIO_CS, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - GPIO_CFG(LCDC_SPI_GPIO_MOSI, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), -}; - -static void lcdc_config_spi_gpios(int enable) -{ - int n; - for (n = 0; n < ARRAY_SIZE(lcdc_spi_gpio_config_data); ++n) - gpio_tlmm_config(lcdc_spi_gpio_config_data[n], 0); -} -#endif - -#ifdef CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT -#ifdef CONFIG_SPI_QUP -static struct spi_board_info lcdc_samsung_spi_board_info[] __initdata = { - { - .modalias = LCDC_SAMSUNG_SPI_DEVICE_NAME, - .mode = SPI_MODE_3, - .bus_num = 1, - .chip_select = 0, - .max_speed_hz = 10800000, - } -}; -#endif /* CONFIG_SPI_QUP */ - -static struct msm_panel_common_pdata lcdc_samsung_oled_panel_data = { -#ifndef CONFIG_SPI_QUP - .panel_config_gpio = lcdc_config_spi_gpios, - .gpio_num = lcdc_spi_gpio_array_num, -#endif -}; - -static struct platform_device lcdc_samsung_oled_panel_device = { - .name = LCDC_SAMSUNG_OLED_PANEL_NAME, - .id = 0, - .dev.platform_data = &lcdc_samsung_oled_panel_data, -}; -#endif /*CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT */ - -#ifdef CONFIG_FB_MSM_LCDC_AUO_WVGA -#ifdef CONFIG_SPI_QUP -static struct spi_board_info lcdc_auo_spi_board_info[] __initdata = { - { - .modalias = LCDC_AUO_SPI_DEVICE_NAME, - .mode = SPI_MODE_3, - .bus_num = 1, - .chip_select = 0, - .max_speed_hz = 10800000, - } -}; -#endif - -static struct msm_panel_common_pdata lcdc_auo_wvga_panel_data = { -#ifndef CONFIG_SPI_QUP - .panel_config_gpio = lcdc_config_spi_gpios, - .gpio_num = lcdc_spi_gpio_array_num, -#endif -}; - -static struct platform_device lcdc_auo_wvga_panel_device = { - .name = LCDC_AUO_PANEL_NAME, - .id = 0, - .dev.platform_data = &lcdc_auo_wvga_panel_data, -}; -#endif /*CONFIG_FB_MSM_LCDC_AUO_WVGA*/ - -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - -#define GPIO_NT35582_RESET 94 -#define GPIO_NT35582_BL_EN_HW_PIN 24 -#define GPIO_NT35582_BL_EN \ - PM8058_GPIO_PM_TO_SYS(GPIO_NT35582_BL_EN_HW_PIN - 1) - -static int lcdc_nt35582_pmic_gpio[] = {GPIO_NT35582_BL_EN }; - -static struct msm_panel_common_pdata lcdc_nt35582_panel_data = { - .gpio_num = lcdc_nt35582_pmic_gpio, -}; - -static struct platform_device lcdc_nt35582_panel_device = { - .name = LCDC_NT35582_PANEL_NAME, - .id = 0, - .dev = { - .platform_data = &lcdc_nt35582_panel_data, - } -}; - -static struct spi_board_info lcdc_nt35582_spi_board_info[] __initdata = { - { - .modalias = "lcdc_nt35582_spi", - .mode = SPI_MODE_0, - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 1100000, - } -}; -#endif - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -static struct resource hdmi_msm_resources[] = { - { - .name = "hdmi_msm_qfprom_addr", - .start = 0x00700000, - .end = 0x007060FF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_hdmi_addr", - .start = 0x04A00000, - .end = 0x04A00FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = "hdmi_msm_irq", - .start = HDMI_IRQ, - .end = HDMI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static int hdmi_enable_5v(int on); -static int hdmi_core_power(int on, int show); -static int hdmi_gpio_config(int on); -static int hdmi_cec_power(int on); -static int hdmi_panel_power(int on); - -static struct msm_hdmi_platform_data hdmi_msm_data = { - .irq = HDMI_IRQ, - .enable_5v = hdmi_enable_5v, - .core_power = hdmi_core_power, - .cec_power = hdmi_cec_power, - .panel_power = hdmi_panel_power, - .gpio_config = hdmi_gpio_config, -}; - -static struct platform_device hdmi_msm_device = { - .name = "hdmi_msm", - .id = 0, - .num_resources = ARRAY_SIZE(hdmi_msm_resources), - .resource = hdmi_msm_resources, - .dev.platform_data = &hdmi_msm_data, -}; -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -#ifdef CONFIG_FB_MSM_MIPI_DSI -static struct platform_device mipi_dsi_toshiba_panel_device = { - .name = "mipi_toshiba", - .id = 0, -}; - -#define FPGA_3D_GPIO_CONFIG_ADDR 0x1D00017A - -static struct mipi_dsi_panel_platform_data novatek_pdata = { - .fpga_3d_config_addr = FPGA_3D_GPIO_CONFIG_ADDR, - .fpga_ctrl_mode = FPGA_EBI2_INTF, -}; - -static struct platform_device mipi_dsi_novatek_panel_device = { - .name = "mipi_novatek", - .id = 0, - .dev = { - .platform_data = &novatek_pdata, - } -}; -#endif - -static void __init msm8x60_allocate_memory_regions(void) -{ - void *addr; - unsigned long size; - - if (hdmi_is_primary) - size = roundup((1920 * 1088 * 4 * 2), 4096); - else - size = MSM_FB_SIZE; - - addr = alloc_bootmem_align(size, 0x1000); - msm_fb_resources[0].start = __pa(addr); - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", - size, addr, __pa(addr)); - -} - -void __init msm8x60_set_display_params(char *prim_panel, char *ext_panel) -{ - if (strnlen(prim_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.prim_panel_name, prim_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.prim_panel_name %s\n", - msm_fb_pdata.prim_panel_name); - - if (!strncmp((char *)msm_fb_pdata.prim_panel_name, - HDMI_PANEL_NAME, strnlen(HDMI_PANEL_NAME, - PANEL_NAME_MAX_LEN))) { - pr_debug("HDMI is the primary display by" - " boot parameter\n"); - hdmi_is_primary = 1; - set_mdp_clocks_for_wuxga(); - } - } - if (strnlen(ext_panel, PANEL_NAME_MAX_LEN)) { - strlcpy(msm_fb_pdata.ext_panel_name, ext_panel, - PANEL_NAME_MAX_LEN); - pr_debug("msm_fb_pdata.ext_panel_name %s\n", - msm_fb_pdata.ext_panel_name); - } -} - -#if defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC) || \ - defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC_MODULE) -/*virtual key support */ -static ssize_t tma300_vkeys_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -{ - return sprintf(buf, - __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":60:900:90:120" - ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":180:900:90:120" - ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":300:900:90:120" - ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":420:900:90:120" - "\n"); -} - -static struct kobj_attribute tma300_vkeys_attr = { - .attr = { - .mode = S_IRUGO, - }, - .show = &tma300_vkeys_show, -}; - -static struct attribute *tma300_properties_attrs[] = { - &tma300_vkeys_attr.attr, - NULL -}; - -static struct attribute_group tma300_properties_attr_group = { - .attrs = tma300_properties_attrs, -}; - -static struct kobject *properties_kobj; - - - -#define CYTTSP_TS_GPIO_IRQ 61 -static int cyttsp_platform_init(struct i2c_client *client) -{ - int rc = -EINVAL; - struct regulator *pm8058_l5 = NULL, *pm8058_s3; - - if (machine_is_msm8x60_fluid()) { - pm8058_l5 = regulator_get(NULL, "8058_l5"); - if (IS_ERR(pm8058_l5)) { - pr_err("%s: regulator get of 8058_l5 failed (%ld)\n", - __func__, PTR_ERR(pm8058_l5)); - rc = PTR_ERR(pm8058_l5); - return rc; - } - rc = regulator_set_voltage(pm8058_l5, 2850000, 2850000); - if (rc) { - pr_err("%s: regulator_set_voltage of 8058_l5 failed(%d)\n", - __func__, rc); - goto reg_l5_put; - } - - rc = regulator_enable(pm8058_l5); - if (rc) { - pr_err("%s: regulator_enable of 8058_l5 failed(%d)\n", - __func__, rc); - goto reg_l5_put; - } - } - /* vote for s3 to enable i2c communication lines */ - pm8058_s3 = regulator_get(NULL, "8058_s3"); - if (IS_ERR(pm8058_s3)) { - pr_err("%s: regulator get of 8058_s3 failed (%ld)\n", - __func__, PTR_ERR(pm8058_s3)); - rc = PTR_ERR(pm8058_s3); - goto reg_l5_disable; - } - - rc = regulator_set_voltage(pm8058_s3, 1800000, 1800000); - if (rc) { - pr_err("%s: regulator_set_voltage() = %d\n", - __func__, rc); - goto reg_s3_put; - } - - rc = regulator_enable(pm8058_s3); - if (rc) { - pr_err("%s: regulator_enable of 8058_l5 failed(%d)\n", - __func__, rc); - goto reg_s3_put; - } - - /* wait for vregs to stabilize */ - usleep_range(10000, 10000); - - /* check this device active by reading first byte/register */ - rc = i2c_smbus_read_byte_data(client, 0x01); - if (rc < 0) { - pr_err("%s: i2c sanity check failed\n", __func__); - goto reg_s3_disable; - } - - /* virtual keys */ - if (machine_is_msm8x60_fluid()) { - properties_kobj = kobject_create_and_add("board_properties", - NULL); - if (properties_kobj); - if (!properties_kobj || rc) - pr_err("%s: failed to create board_properties\n", - __func__); - } - return CY_OK; - -reg_s3_disable: - regulator_disable(pm8058_s3); -reg_s3_put: - regulator_put(pm8058_s3); -reg_l5_disable: - if (machine_is_msm8x60_fluid()) - regulator_disable(pm8058_l5); -reg_l5_put: - if (machine_is_msm8x60_fluid()) - regulator_put(pm8058_l5); - return rc; -} - -/* TODO: Put the regulator to LPM / HPM in suspend/resume*/ -static int cyttsp_platform_suspend(struct i2c_client *client) -{ - msleep(20); - - return CY_OK; -} - -static int cyttsp_platform_resume(struct i2c_client *client) -{ - /* add any special code to strobe a wakeup pin or chip reset */ - msleep(10); - - return CY_OK; -} - -static struct cyttsp_platform_data cyttsp_fluid_pdata = { - .flags = 0x04, - .gen = CY_GEN3, /* or */ - .use_st = CY_USE_ST, - .use_mt = CY_USE_MT, - .use_hndshk = CY_SEND_HNDSHK, - .use_trk_id = CY_USE_TRACKING_ID, - .use_sleep = CY_USE_DEEP_SLEEP_SEL | CY_USE_LOW_POWER_SEL, - .use_gestures = CY_USE_GESTURES, - /* activate up to 4 groups - * and set active distance - */ - .gest_set = CY_GEST_GRP1 | CY_GEST_GRP2 | - CY_GEST_GRP3 | CY_GEST_GRP4 | - CY_ACT_DIST, - /* change act_intrvl to customize the Active power state - * scanning/processing refresh interval for Operating mode - */ - .act_intrvl = CY_ACT_INTRVL_DFLT, - /* change tch_tmout to customize the touch timeout for the - * Active power state for Operating mode - */ - .tch_tmout = CY_TCH_TMOUT_DFLT, - /* change lp_intrvl to customize the Low Power power state - * scanning/processing refresh interval for Operating mode - */ - .lp_intrvl = CY_LP_INTRVL_DFLT, - .sleep_gpio = -1, - .resout_gpio = -1, - .irq_gpio = CYTTSP_TS_GPIO_IRQ, - .resume = cyttsp_platform_resume, - .suspend = cyttsp_platform_suspend, - .init = cyttsp_platform_init, -}; - -static struct cyttsp_platform_data cyttsp_tmg240_pdata = { - .panel_maxx = 1083, - .panel_maxy = 659, - .disp_minx = 30, - .disp_maxx = 1053, - .disp_miny = 30, - .disp_maxy = 629, - .correct_fw_ver = 8, - .fw_fname = "cyttsp_8660_ffa.hex", - .flags = 0x00, - .gen = CY_GEN2, /* or */ - .use_st = CY_USE_ST, - .use_mt = CY_USE_MT, - .use_hndshk = CY_SEND_HNDSHK, - .use_trk_id = CY_USE_TRACKING_ID, - .use_sleep = CY_USE_DEEP_SLEEP_SEL | CY_USE_LOW_POWER_SEL, - .use_gestures = CY_USE_GESTURES, - /* activate up to 4 groups - * and set active distance - */ - .gest_set = CY_GEST_GRP1 | CY_GEST_GRP2 | - CY_GEST_GRP3 | CY_GEST_GRP4 | - CY_ACT_DIST, - /* change act_intrvl to customize the Active power state - * scanning/processing refresh interval for Operating mode - */ - .act_intrvl = CY_ACT_INTRVL_DFLT, - /* change tch_tmout to customize the touch timeout for the - * Active power state for Operating mode - */ - .tch_tmout = CY_TCH_TMOUT_DFLT, - /* change lp_intrvl to customize the Low Power power state - * scanning/processing refresh interval for Operating mode - */ - .lp_intrvl = CY_LP_INTRVL_DFLT, - .sleep_gpio = -1, - .resout_gpio = -1, - .irq_gpio = CYTTSP_TS_GPIO_IRQ, - .resume = cyttsp_platform_resume, - .suspend = cyttsp_platform_suspend, - .init = cyttsp_platform_init, - .disable_ghost_det = true, -}; -static void cyttsp_set_params(void) -{ - if (SOCINFO_VERSION_MAJOR(socinfo_get_platform_version()) < 3) { - cyttsp_fluid_pdata.fw_fname = "cyttsp_8660_fluid_p2.hex"; - cyttsp_fluid_pdata.panel_maxx = 539; - cyttsp_fluid_pdata.panel_maxy = 994; - cyttsp_fluid_pdata.disp_minx = 30; - cyttsp_fluid_pdata.disp_maxx = 509; - cyttsp_fluid_pdata.disp_miny = 60; - cyttsp_fluid_pdata.disp_maxy = 859; - cyttsp_fluid_pdata.correct_fw_ver = 4; - } else { - cyttsp_fluid_pdata.fw_fname = "cyttsp_8660_fluid_p3.hex"; - cyttsp_fluid_pdata.panel_maxx = 550; - cyttsp_fluid_pdata.panel_maxy = 1013; - cyttsp_fluid_pdata.disp_minx = 35; - cyttsp_fluid_pdata.disp_maxx = 515; - cyttsp_fluid_pdata.disp_miny = 69; - cyttsp_fluid_pdata.disp_maxy = 869; - cyttsp_fluid_pdata.correct_fw_ver = 5; - } - -} - -static struct i2c_board_info cyttsp_fluid_info[] __initdata = { - { - I2C_BOARD_INFO(CY_I2C_NAME, 0x24), - .platform_data = &cyttsp_fluid_pdata, -#ifndef CY_USE_TIMER - .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ), -#endif /* CY_USE_TIMER */ - }, -}; - -static struct i2c_board_info cyttsp_ffa_info[] __initdata = { - { - I2C_BOARD_INFO(CY_I2C_NAME, 0x3b), - .platform_data = &cyttsp_tmg240_pdata, -#ifndef CY_USE_TIMER - .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ), -#endif /* CY_USE_TIMER */ - }, -}; -#endif - -static struct regulator *vreg_tmg200; - -#define TS_PEN_IRQ_GPIO 61 -static int tmg200_power(int vreg_on) -{ - int rc = -EINVAL; - - if (!vreg_tmg200) { - printk(KERN_ERR "%s: regulator 8058_s3 not found (%d)\n", - __func__, rc); - return rc; - } - - rc = vreg_on ? regulator_enable(vreg_tmg200) : - regulator_disable(vreg_tmg200); - if (rc < 0) - printk(KERN_ERR "%s: vreg 8058_s3 %s failed (%d)\n", - __func__, vreg_on ? "enable" : "disable", rc); - - /* wait for vregs to stabilize */ - msleep(20); - - return rc; -} - -static int tmg200_dev_setup(bool enable) -{ - int rc; - - if (enable) { - vreg_tmg200 = regulator_get(NULL, "8058_s3"); - if (IS_ERR(vreg_tmg200)) { - pr_err("%s: regulator get of 8058_s3 failed (%ld)\n", - __func__, PTR_ERR(vreg_tmg200)); - rc = PTR_ERR(vreg_tmg200); - return rc; - } - - rc = regulator_set_voltage(vreg_tmg200, 1800000, 1800000); - if (rc) { - pr_err("%s: regulator_set_voltage() = %d\n", - __func__, rc); - goto reg_put; - } - } else { - /* put voltage sources */ - regulator_put(vreg_tmg200); - } - return 0; -reg_put: - regulator_put(vreg_tmg200); - return rc; -} - -static struct cy8c_ts_platform_data cy8ctmg200_pdata = { - .ts_name = "msm_tmg200_ts", - .dis_min_x = 0, - .dis_max_x = 1023, - .dis_min_y = 0, - .dis_max_y = 599, - .min_tid = 0, - .max_tid = 255, - .min_touch = 0, - .max_touch = 255, - .min_width = 0, - .max_width = 255, - .power_on = tmg200_power, - .dev_setup = tmg200_dev_setup, - .nfingers = 2, - .irq_gpio = TS_PEN_IRQ_GPIO, - .resout_gpio = GPIO_CAP_TS_RESOUT_N, -}; - -static struct i2c_board_info cy8ctmg200_board_info[] = { - { - I2C_BOARD_INFO("cy8ctmg200", 0x2), - .platform_data = &cy8ctmg200_pdata, - } -}; - -static struct regulator *vreg_tma340; - -static int tma340_power(int vreg_on) -{ - int rc = -EINVAL; - - if (!vreg_tma340) { - pr_err("%s: regulator 8901_l2 not found (%d)\n", - __func__, rc); - return rc; - } - - rc = vreg_on ? regulator_enable(vreg_tma340) : - regulator_disable(vreg_tma340); - if (rc < 0) - pr_err("%s: vreg 8901_l2 %s failed (%d)\n", - __func__, vreg_on ? "enable" : "disable", rc); - - /* wait for vregs to stabilize */ - msleep(100); - - return rc; -} - -static struct kobject *tma340_prop_kobj; - -static int tma340_dragon_dev_setup(bool enable) -{ - int rc; - - if (enable) { - vreg_tma340 = regulator_get(NULL, "8901_l2"); - if (IS_ERR(vreg_tma340)) { - pr_err("%s: regulator get of 8901_l2 failed (%ld)\n", - __func__, PTR_ERR(vreg_tma340)); - rc = PTR_ERR(vreg_tma340); - return rc; - } - - rc = regulator_set_voltage(vreg_tma340, 3300000, 3300000); - if (rc) { - pr_err("%s: regulator_set_voltage() = %d\n", - __func__, rc); - goto reg_put; - } - tma340_prop_kobj = kobject_create_and_add("board_properties", - NULL); - if (tma340_prop_kobj) { - ; - if (rc) { - kobject_put(tma340_prop_kobj); - pr_err("%s: failed to create board_properties\n", - __func__); - goto reg_put; - } - } - - } else { - /* put voltage sources */ - regulator_put(vreg_tma340); - /* destroy virtual keys */ - if (tma340_prop_kobj) { - kobject_put(tma340_prop_kobj); - } - } - return 0; -reg_put: - regulator_put(vreg_tma340); - return rc; -} - - -static struct cy8c_ts_platform_data cy8ctma340_dragon_pdata = { - .ts_name = "cy8ctma340", - .dis_min_x = 0, - .dis_max_x = 479, - .dis_min_y = 0, - .dis_max_y = 799, - .min_tid = 0, - .max_tid = 255, - .min_touch = 0, - .max_touch = 255, - .min_width = 0, - .max_width = 255, - .power_on = tma340_power, - .dev_setup = tma340_dragon_dev_setup, - .nfingers = 2, - .irq_gpio = TS_PEN_IRQ_GPIO, - .resout_gpio = -1, -}; - -static struct i2c_board_info cy8ctma340_dragon_board_info[] = { - { - I2C_BOARD_INFO("cy8ctma340", 0x24), - .platform_data = &cy8ctma340_dragon_pdata, - } -}; - -#ifdef CONFIG_SERIAL_MSM_HS -static int configure_uart_gpios(int on) -{ - int ret = 0, i; - int uart_gpios[] = {53, 54, 55, 56}; - for (i = 0; i < ARRAY_SIZE(uart_gpios); i++) { - if (on) { - ret = msm_gpiomux_get(uart_gpios[i]); - if (unlikely(ret)) - break; - } else { - ret = msm_gpiomux_put(uart_gpios[i]); - if (unlikely(ret)) - return ret; - } - } - if (ret) - for (; i >= 0; i--) - msm_gpiomux_put(uart_gpios[i]); - return ret; -} -static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = { - .inject_rx_on_wakeup = 1, - .rx_to_inject = 0xFD, - .gpio_config = configure_uart_gpios, -}; -#endif - - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - -static struct gpio_led gpio_exp_leds_config[] = { - { - .name = "left_led1:green", - .gpio = GPIO_LEFT_LED_1, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "left_led2:red", - .gpio = GPIO_LEFT_LED_2, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "left_led3:green", - .gpio = GPIO_LEFT_LED_3, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "wlan_led:orange", - .gpio = GPIO_LEFT_LED_WLAN, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "left_led5:green", - .gpio = GPIO_LEFT_LED_5, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "right_led1:green", - .gpio = GPIO_RIGHT_LED_1, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "right_led2:red", - .gpio = GPIO_RIGHT_LED_2, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "right_led3:green", - .gpio = GPIO_RIGHT_LED_3, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "bt_led:blue", - .gpio = GPIO_RIGHT_LED_BT, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, - { - .name = "right_led5:green", - .gpio = GPIO_RIGHT_LED_5, - .active_low = 1, - .retain_state_suspended = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, -}; - -static struct gpio_led_platform_data gpio_leds_pdata = { - .num_leds = ARRAY_SIZE(gpio_exp_leds_config), - .leds = gpio_exp_leds_config, -}; - -static struct platform_device gpio_leds = { - .name = "leds-gpio", - .id = -1, - .dev = { - .platform_data = &gpio_leds_pdata, - }, -}; - -static struct gpio_led fluid_gpio_leds[] = { - { - .name = "dual_led:green", - .gpio = GPIO_LED1_GREEN_N, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - .active_low = 1, - .retain_state_suspended = 0, - }, - { - .name = "dual_led:red", - .gpio = GPIO_LED2_RED_N, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - .active_low = 1, - .retain_state_suspended = 0, - }, -}; - -static struct gpio_led_platform_data gpio_led_pdata = { - .leds = fluid_gpio_leds, - .num_leds = ARRAY_SIZE(fluid_gpio_leds), -}; - -static struct platform_device fluid_leds_gpio = { - .name = "leds-gpio", - .id = -1, - .dev = { - .platform_data = &gpio_led_pdata, - }, -}; - -#endif - -#ifdef CONFIG_BATTERY_MSM8X60 -static struct msm_charger_platform_data msm_charger_data = { - .safety_time = 180, - .update_time = 1, - .max_voltage = 4200, - .min_voltage = 3200, -}; - -static struct platform_device msm_charger_device = { - .name = "msm-charger", - .id = -1, - .dev = { - .platform_data = &msm_charger_data, - } -}; -#endif - -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -static struct regulator_consumer_supply vreg_consumers_PM8058_L0[] = { - REGULATOR_SUPPLY("8058_l0", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L1[] = { - REGULATOR_SUPPLY("8058_l1", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L2[] = { - REGULATOR_SUPPLY("8058_l2", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L3[] = { - REGULATOR_SUPPLY("8058_l3", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L4[] = { - REGULATOR_SUPPLY("8058_l4", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L5[] = { - REGULATOR_SUPPLY("8058_l5", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L6[] = { - REGULATOR_SUPPLY("8058_l6", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L7[] = { - REGULATOR_SUPPLY("8058_l7", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L8[] = { - REGULATOR_SUPPLY("8058_l8", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L9[] = { - REGULATOR_SUPPLY("8058_l9", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L10[] = { - REGULATOR_SUPPLY("8058_l10", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L11[] = { - REGULATOR_SUPPLY("8058_l11", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L12[] = { - REGULATOR_SUPPLY("8058_l12", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L13[] = { - REGULATOR_SUPPLY("8058_l13", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L14[] = { - REGULATOR_SUPPLY("8058_l14", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L15[] = { - REGULATOR_SUPPLY("8058_l15", NULL), - REGULATOR_SUPPLY("cam_vana", "1-001a"), - REGULATOR_SUPPLY("cam_vana", "1-006c"), - REGULATOR_SUPPLY("cam_vana", "1-0078"), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L16[] = { - REGULATOR_SUPPLY("8058_l16", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L17[] = { - REGULATOR_SUPPLY("8058_l17", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L18[] = { - REGULATOR_SUPPLY("8058_l18", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L19[] = { - REGULATOR_SUPPLY("8058_l19", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L20[] = { - REGULATOR_SUPPLY("8058_l20", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L21[] = { - REGULATOR_SUPPLY("8058_l21", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L22[] = { - REGULATOR_SUPPLY("8058_l22", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L23[] = { - REGULATOR_SUPPLY("8058_l23", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L24[] = { - REGULATOR_SUPPLY("8058_l24", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L25[] = { - REGULATOR_SUPPLY("8058_l25", NULL), - REGULATOR_SUPPLY("cam_vdig", "1-001a"), - REGULATOR_SUPPLY("cam_vdig", "1-006c"), - REGULATOR_SUPPLY("cam_vdig", "1-0078"), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S0[] = { - REGULATOR_SUPPLY("8058_s0", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S1[] = { - REGULATOR_SUPPLY("8058_s1", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S2[] = { - REGULATOR_SUPPLY("8058_s2", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S3[] = { - REGULATOR_SUPPLY("8058_s3", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S4[] = { - REGULATOR_SUPPLY("8058_s4", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_LVS0[] = { - REGULATOR_SUPPLY("8058_lvs0", NULL), - REGULATOR_SUPPLY("cam_vio", "1-001a"), - REGULATOR_SUPPLY("cam_vio", "1-006c"), - REGULATOR_SUPPLY("cam_vio", "1-0078"), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_LVS1[] = { - REGULATOR_SUPPLY("8058_lvs1", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_NCP[] = { - REGULATOR_SUPPLY("8058_ncp", NULL), -}; - -static struct regulator_consumer_supply vreg_consumers_PM8901_L0[] = { - REGULATOR_SUPPLY("8901_l0", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L1[] = { - REGULATOR_SUPPLY("8901_l1", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L2[] = { - REGULATOR_SUPPLY("8901_l2", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L3[] = { - REGULATOR_SUPPLY("8901_l3", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L4[] = { - REGULATOR_SUPPLY("8901_l4", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L5[] = { - REGULATOR_SUPPLY("8901_l5", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L6[] = { - REGULATOR_SUPPLY("8901_l6", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_S2[] = { - REGULATOR_SUPPLY("8901_s2", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_S3[] = { - REGULATOR_SUPPLY("8901_s3", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_S4[] = { - REGULATOR_SUPPLY("8901_s4", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_LVS0[] = { - REGULATOR_SUPPLY("8901_lvs0", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_LVS1[] = { - REGULATOR_SUPPLY("8901_lvs1", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_LVS2[] = { - REGULATOR_SUPPLY("8901_lvs2", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_LVS3[] = { - REGULATOR_SUPPLY("8901_lvs3", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_MVS0[] = { - REGULATOR_SUPPLY("8901_mvs0", NULL), -}; - -/* Pin control regulators */ -static struct regulator_consumer_supply vreg_consumers_PM8058_L8_PC[] = { - REGULATOR_SUPPLY("8058_l8_pc", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L20_PC[] = { - REGULATOR_SUPPLY("8058_l20_pc", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_L21_PC[] = { - REGULATOR_SUPPLY("8058_l21_pc", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8058_S2_PC[] = { - REGULATOR_SUPPLY("8058_s2_pc", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_L0_PC[] = { - REGULATOR_SUPPLY("8901_l0_pc", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_PM8901_S4_PC[] = { - REGULATOR_SUPPLY("8901_s4_pc", NULL), -}; - -#define RPM_VREG_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, \ - _default_uV, _peak_uA, _avg_uA, _pull_down, _pin_ctrl, \ - _freq, _pin_fn, _force_mode, _sleep_set_force_mode, \ - _state, _sleep_selectable, _always_on) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .consumer_supplies = vreg_consumers_##_id, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - }, \ - .id = RPM_VREG_ID_##_id, \ - .default_uV = _default_uV, \ - .peak_uA = _peak_uA, \ - .avg_uA = _avg_uA, \ - .pull_down_enable = _pull_down, \ - .pin_ctrl = _pin_ctrl, \ - .freq = RPM_VREG_FREQ_##_freq, \ - .pin_fn = _pin_fn, \ - .force_mode = _force_mode, \ - .sleep_set_force_mode = _sleep_set_force_mode, \ - .state = _state, \ - .sleep_selectable = _sleep_selectable, \ - } - -/* Pin control initialization */ -#define RPM_PC(_id, _always_on, _pin_fn, _pin_ctrl) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - .always_on = _always_on, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id##_PC), \ - .consumer_supplies = vreg_consumers_##_id##_PC, \ - }, \ - .id = RPM_VREG_ID_##_id##_PC, \ - .pin_fn = RPM_VREG_PIN_FN_8660_##_pin_fn, \ - .pin_ctrl = _pin_ctrl, \ - } - -/* - * The default LPM/HPM state of an RPM controlled regulator can be controlled - * via the peak_uA value specified in the table below. If the value is less - * than the high power min threshold for the regulator, then the regulator will - * be set to LPM. Otherwise, it will be set to HPM. - * - * This value can be further overridden by specifying an initial mode via - * .init_data.constraints.initial_mode. - */ - -#define RPM_LDO(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _init_peak_uA) \ - RPM_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_FAST | \ - REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE | \ - REGULATOR_MODE_STANDBY, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _min_uV, _init_peak_uA, \ - _init_peak_uA, _pd, RPM_VREG_PIN_CTRL_NONE, NONE, \ - RPM_VREG_PIN_FN_8660_ENABLE, \ - RPM_VREG_FORCE_MODE_8660_NONE, \ - RPM_VREG_FORCE_MODE_8660_NONE, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on) - -#define RPM_SMPS(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV, \ - _init_peak_uA, _freq) \ - RPM_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_FAST | \ - REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE | \ - REGULATOR_MODE_STANDBY, REGULATOR_CHANGE_VOLTAGE | \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE | \ - REGULATOR_CHANGE_DRMS, 0, _min_uV, _init_peak_uA, \ - _init_peak_uA, _pd, RPM_VREG_PIN_CTRL_NONE, _freq, \ - RPM_VREG_PIN_FN_8660_ENABLE, \ - RPM_VREG_FORCE_MODE_8660_NONE, \ - RPM_VREG_FORCE_MODE_8660_NONE, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on) - -#define RPM_VS(_id, _always_on, _pd, _sleep_selectable) \ - RPM_VREG_INIT(_id, 0, 0, REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE, \ - REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE, 0, 0, \ - 1000, 1000, _pd, RPM_VREG_PIN_CTRL_NONE, NONE, \ - RPM_VREG_PIN_FN_8660_ENABLE, \ - RPM_VREG_FORCE_MODE_8660_NONE, \ - RPM_VREG_FORCE_MODE_8660_NONE, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on) - -#define RPM_NCP(_id, _always_on, _pd, _sleep_selectable, _min_uV, _max_uV) \ - RPM_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS, 0, \ - _min_uV, 1000, 1000, _pd, RPM_VREG_PIN_CTRL_NONE, NONE, \ - RPM_VREG_PIN_FN_8660_ENABLE, \ - RPM_VREG_FORCE_MODE_8660_NONE, \ - RPM_VREG_FORCE_MODE_8660_NONE, RPM_VREG_STATE_OFF, \ - _sleep_selectable, _always_on) - -#define LDO50HMIN RPM_VREG_8660_LDO_50_HPM_MIN_LOAD -#define LDO150HMIN RPM_VREG_8660_LDO_150_HPM_MIN_LOAD -#define LDO300HMIN RPM_VREG_8660_LDO_300_HPM_MIN_LOAD -#define SMPS_HMIN RPM_VREG_8660_SMPS_HPM_MIN_LOAD -#define FTS_HMIN RPM_VREG_8660_FTSMPS_HPM_MIN_LOAD - -/* RPM early regulator constraints */ -static struct rpm_regulator_init_data rpm_regulator_early_init_data[] = { - /* ID a_on pd ss min_uV max_uV init_ip freq */ - RPM_SMPS(PM8058_S0, 0, 1, 1, 500000, 1325000, SMPS_HMIN, 1p60), - RPM_SMPS(PM8058_S1, 0, 1, 1, 500000, 1250000, SMPS_HMIN, 1p60), -}; - -/* RPM regulator constraints */ -static struct rpm_regulator_init_data rpm_regulator_init_data[] = { - /* ID a_on pd ss min_uV max_uV init_ip */ - RPM_LDO(PM8058_L0, 0, 1, 0, 1200000, 1200000, LDO150HMIN), - RPM_LDO(PM8058_L1, 0, 1, 0, 1200000, 1200000, LDO300HMIN), - RPM_LDO(PM8058_L2, 0, 1, 0, 1800000, 2600000, LDO300HMIN), - RPM_LDO(PM8058_L3, 0, 1, 0, 1800000, 1800000, LDO150HMIN), - RPM_LDO(PM8058_L4, 0, 1, 0, 2850000, 2850000, LDO50HMIN), - RPM_LDO(PM8058_L5, 0, 1, 0, 2850000, 2850000, LDO300HMIN), - RPM_LDO(PM8058_L6, 0, 1, 0, 3000000, 3600000, LDO50HMIN), - RPM_LDO(PM8058_L7, 0, 1, 0, 1800000, 1800000, LDO50HMIN), - RPM_LDO(PM8058_L8, 0, 1, 0, 2900000, 3050000, LDO300HMIN), - RPM_LDO(PM8058_L9, 0, 1, 0, 1800000, 1800000, LDO300HMIN), - RPM_LDO(PM8058_L10, 0, 1, 0, 2600000, 2600000, LDO300HMIN), - RPM_LDO(PM8058_L11, 0, 1, 0, 1500000, 1500000, LDO150HMIN), - RPM_LDO(PM8058_L12, 0, 1, 0, 2900000, 2900000, LDO150HMIN), - RPM_LDO(PM8058_L13, 0, 1, 0, 2050000, 2050000, LDO300HMIN), - RPM_LDO(PM8058_L14, 0, 0, 0, 2850000, 2850000, LDO300HMIN), - RPM_LDO(PM8058_L15, 0, 1, 0, 2850000, 2850000, LDO300HMIN), - RPM_LDO(PM8058_L16, 1, 1, 0, 1800000, 1800000, LDO300HMIN), - RPM_LDO(PM8058_L17, 0, 1, 0, 2600000, 2600000, LDO150HMIN), - RPM_LDO(PM8058_L18, 0, 1, 0, 2200000, 2200000, LDO150HMIN), - RPM_LDO(PM8058_L19, 0, 1, 0, 2500000, 2500000, LDO150HMIN), - RPM_LDO(PM8058_L20, 0, 1, 0, 1800000, 1800000, LDO150HMIN), - RPM_LDO(PM8058_L21, 1, 1, 0, 1200000, 1200000, LDO150HMIN), - RPM_LDO(PM8058_L22, 0, 1, 0, 1150000, 1150000, LDO300HMIN), - RPM_LDO(PM8058_L23, 0, 1, 0, 1200000, 1200000, LDO300HMIN), - RPM_LDO(PM8058_L24, 0, 1, 0, 1200000, 1200000, LDO150HMIN), - RPM_LDO(PM8058_L25, 0, 1, 0, 1200000, 1200000, LDO150HMIN), - - /* ID a_on pd ss min_uV max_uV init_ip freq */ - RPM_SMPS(PM8058_S2, 0, 1, 1, 1200000, 1400000, SMPS_HMIN, 1p60), - RPM_SMPS(PM8058_S3, 1, 1, 0, 1800000, 1800000, SMPS_HMIN, 1p60), - RPM_SMPS(PM8058_S4, 1, 1, 0, 2200000, 2200000, SMPS_HMIN, 1p60), - - /* ID a_on pd ss */ - RPM_VS(PM8058_LVS0, 0, 1, 0), - RPM_VS(PM8058_LVS1, 0, 1, 0), - - /* ID a_on pd ss min_uV max_uV */ - RPM_NCP(PM8058_NCP, 0, 1, 0, 1800000, 1800000), - - /* ID a_on pd ss min_uV max_uV init_ip */ - RPM_LDO(PM8901_L0, 0, 1, 0, 1200000, 1200000, LDO300HMIN), - RPM_LDO(PM8901_L1, 0, 1, 0, 3300000, 3300000, LDO300HMIN), - RPM_LDO(PM8901_L2, 0, 1, 0, 2850000, 3300000, LDO300HMIN), - RPM_LDO(PM8901_L3, 0, 1, 0, 3300000, 3300000, LDO300HMIN), - RPM_LDO(PM8901_L4, 0, 1, 0, 2600000, 2600000, LDO300HMIN), - RPM_LDO(PM8901_L5, 0, 1, 0, 2850000, 2850000, LDO300HMIN), - RPM_LDO(PM8901_L6, 0, 1, 0, 2200000, 2200000, LDO300HMIN), - - /* ID a_on pd ss min_uV max_uV init_ip freq */ - RPM_SMPS(PM8901_S2, 0, 1, 0, 1300000, 1300000, FTS_HMIN, 1p60), - RPM_SMPS(PM8901_S3, 0, 1, 0, 1100000, 1100000, FTS_HMIN, 1p60), - RPM_SMPS(PM8901_S4, 0, 1, 0, 1225000, 1225000, FTS_HMIN, 1p60), - - /* ID a_on pd ss */ - RPM_VS(PM8901_LVS0, 1, 1, 0), - RPM_VS(PM8901_LVS1, 0, 1, 0), - RPM_VS(PM8901_LVS2, 0, 1, 0), - RPM_VS(PM8901_LVS3, 0, 1, 0), - RPM_VS(PM8901_MVS0, 0, 1, 0), - - /* ID a_on pin_func pin_ctrl */ - RPM_PC(PM8058_L8, 0, SLEEP_B, RPM_VREG_PIN_CTRL_NONE), - RPM_PC(PM8058_L20, 0, SLEEP_B, RPM_VREG_PIN_CTRL_NONE), - RPM_PC(PM8058_L21, 1, SLEEP_B, RPM_VREG_PIN_CTRL_NONE), - RPM_PC(PM8058_S2, 0, ENABLE, RPM_VREG_PIN_CTRL_PM8058_A0), - RPM_PC(PM8901_L0, 0, ENABLE, RPM_VREG_PIN_CTRL_PM8901_A0), - RPM_PC(PM8901_S4, 0, ENABLE, RPM_VREG_PIN_CTRL_PM8901_A0), -}; - -static struct rpm_regulator_platform_data rpm_regulator_early_pdata = { - .init_data = rpm_regulator_early_init_data, - .num_regulators = ARRAY_SIZE(rpm_regulator_early_init_data), - .version = RPM_VREG_VERSION_8660, - .vreg_id_vdd_mem = RPM_VREG_ID_PM8058_S0, - .vreg_id_vdd_dig = RPM_VREG_ID_PM8058_S1, -}; - -static struct rpm_regulator_platform_data rpm_regulator_pdata = { - .init_data = rpm_regulator_init_data, - .num_regulators = ARRAY_SIZE(rpm_regulator_init_data), - .version = RPM_VREG_VERSION_8660, -}; - -static struct platform_device rpm_regulator_early_device = { - .name = "rpm-regulator", - .id = 0, - .dev = { - .platform_data = &rpm_regulator_early_pdata, - }, -}; - -static struct platform_device rpm_regulator_device = { - .name = "rpm-regulator", - .id = 1, - .dev = { - .platform_data = &rpm_regulator_pdata, - }, -}; - -static struct platform_device *early_regulators[] __initdata = { - &msm_device_saw_s0, - &msm_device_saw_s1, - &rpm_regulator_early_device, -}; - -static struct platform_device *early_devices[] __initdata = { -#ifdef CONFIG_MSM_BUS_SCALING - &msm_bus_apps_fabric, - &msm_bus_sys_fabric, - &msm_bus_mm_fabric, - &msm_bus_sys_fpb, - &msm_bus_cpss_fpb, -#endif - &msm_device_dmov_adm0, - &msm_device_dmov_adm1, -}; - -#if (defined(CONFIG_MARIMBA_CORE)) && \ - (defined(CONFIG_MSM_BT_POWER) || defined(CONFIG_MSM_BT_POWER_MODULE)) - -static int bluetooth_power(int); -static struct platform_device msm_bt_power_device = { - .name = "bt_power", - .id = -1, - .dev = { - .platform_data = &bluetooth_power, - }, -}; -#endif - -static struct platform_device msm_tsens_device = { - .name = "tsens-tm", - .id = -1, -}; - -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) -enum { - SX150X_CORE, - SX150X_DOCKING, - SX150X_SURF, - SX150X_LEFT_FHA, - SX150X_RIGHT_FHA, - SX150X_SOUTH, - SX150X_NORTH, - SX150X_CORE_FLUID, -}; - -static struct sx150x_platform_data sx150x_data[] __initdata = { - [SX150X_CORE] = { - .gpio_base = GPIO_CORE_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0c08, - .io_pulldn_ena = 0x4060, - .io_open_drain_ena = 0x000c, - .io_polarity = 0, - .irq_summary = -1, /* see fixup_i2c_configs() */ - .irq_base = GPIO_EXPANDER_IRQ_BASE, - }, - [SX150X_DOCKING] = { - .gpio_base = GPIO_DOCKING_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x5e06, - .io_pulldn_ena = 0x81b8, - .io_open_drain_ena = 0, - .io_polarity = 0, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, - UI_INT2_N), - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_DOCKING_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - }, - [SX150X_SURF] = { - .gpio_base = GPIO_SURF_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0, - .io_pulldn_ena = 0, - .io_open_drain_ena = 0, - .io_polarity = 0, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, - UI_INT1_N), - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_SURF_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - }, - [SX150X_LEFT_FHA] = { - .gpio_base = GPIO_LEFT_KB_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0, - .io_pulldn_ena = 0x40, - .io_open_drain_ena = 0, - .io_polarity = 0, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, - UI_INT3_N), - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_LEFT_KB_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - }, - [SX150X_RIGHT_FHA] = { - .gpio_base = GPIO_RIGHT_KB_EXPANDER_BASE, - .oscio_is_gpo = true, - .io_pullup_ena = 0, - .io_pulldn_ena = 0, - .io_open_drain_ena = 0, - .io_polarity = 0, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, - UI_INT3_N), - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_RIGHT_KB_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - }, - [SX150X_SOUTH] = { - .gpio_base = GPIO_SOUTH_EXPANDER_BASE, - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_SOUTH_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT3_N), - }, - [SX150X_NORTH] = { - .gpio_base = GPIO_NORTH_EXPANDER_BASE, - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_NORTH_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - .irq_summary = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT3_N), - .oscio_is_gpo = true, - .io_open_drain_ena = 0x30, - }, - [SX150X_CORE_FLUID] = { - .gpio_base = GPIO_CORE_EXPANDER_BASE, - .oscio_is_gpo = false, - .io_pullup_ena = 0x0408, - .io_pulldn_ena = 0x4060, - .io_open_drain_ena = 0x0008, - .io_polarity = 0, - .irq_summary = -1, /* see fixup_i2c_configs() */ - .irq_base = GPIO_EXPANDER_IRQ_BASE, - }, -}; - -#ifdef CONFIG_SENSORS_MSM_ADC -/* Configuration of EPM expander is done when client - * request an adc read - */ -static struct sx150x_platform_data sx150x_epmdata = { - .gpio_base = GPIO_EPM_EXPANDER_BASE, - .irq_base = GPIO_EXPANDER_IRQ_BASE + - GPIO_EPM_EXPANDER_BASE - - GPIO_EXPANDER_GPIO_BASE, - .irq_summary = -1, -}; -#endif - -/* sx150x_low_power_cfg - * - * This data and init function are used to put unused gpio-expander output - * lines into their low-power states at boot. The init - * function must be deferred until a later init stage because the i2c - * gpio expander drivers do not probe until after they are registered - * (see register_i2c_devices) and the work-queues for those registrations - * are processed. Because these lines are unused, there is no risk of - * competing with a device driver for the gpio. - * - * gpio lines whose low-power states are input are naturally in their low- - * power configurations once probed, see the platform data structures above. - */ -struct sx150x_low_power_cfg { - unsigned gpio; - unsigned val; -}; - -static struct sx150x_low_power_cfg -common_sx150x_lp_cfgs[] __initdata = { - {GPIO_WLAN_DEEP_SLEEP_N, 0}, - {GPIO_EXT_GPS_LNA_EN, 0}, - {GPIO_MSM_WAKES_BT, 0}, - {GPIO_USB_UICC_EN, 0}, - {GPIO_BATT_GAUGE_EN, 0}, -}; - -static struct sx150x_low_power_cfg -surf_ffa_sx150x_lp_cfgs[] __initdata = { - {GPIO_MIPI_DSI_RST_N, 0}, - {GPIO_DONGLE_PWR_EN, 0}, - {GPIO_CAP_TS_SLEEP, 1}, - {GPIO_WEB_CAMIF_RESET_N, 0}, -}; - -static void __init -cfg_gpio_low_power(struct sx150x_low_power_cfg *cfgs, unsigned nelems) -{ - unsigned n; - int rc; - - for (n = 0; n < nelems; ++n) { - rc = gpio_request(cfgs[n].gpio, NULL); - if (!rc) { - rc = gpio_direction_output(cfgs[n].gpio, cfgs[n].val); - gpio_free(cfgs[n].gpio); - } - - if (rc) { - printk(KERN_NOTICE "%s: failed to sleep gpio %d: %d\n", - __func__, cfgs[n].gpio, rc); - } - } -} - -static int __init cfg_sx150xs_low_power(void) -{ - cfg_gpio_low_power(common_sx150x_lp_cfgs, - ARRAY_SIZE(common_sx150x_lp_cfgs)); - if (!machine_is_msm8x60_fluid()) - cfg_gpio_low_power(surf_ffa_sx150x_lp_cfgs, - ARRAY_SIZE(surf_ffa_sx150x_lp_cfgs)); - return 0; -} -module_init(cfg_sx150xs_low_power); - -#ifdef CONFIG_I2C -static struct i2c_board_info core_expander_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1509q", 0x3e), - .platform_data = &sx150x_data[SX150X_CORE] - }, -}; - -static struct i2c_board_info docking_expander_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1509q", 0x3f), - .platform_data = &sx150x_data[SX150X_DOCKING] - }, -}; - -static struct i2c_board_info surf_expanders_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1509q", 0x70), - .platform_data = &sx150x_data[SX150X_SURF] - } -}; - -static struct i2c_board_info fha_expanders_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1508q", 0x21), - .platform_data = &sx150x_data[SX150X_LEFT_FHA] - }, - { - I2C_BOARD_INFO("sx1508q", 0x22), - .platform_data = &sx150x_data[SX150X_RIGHT_FHA] - } -}; - -static struct i2c_board_info fluid_expanders_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1508q", 0x23), - .platform_data = &sx150x_data[SX150X_SOUTH] - }, - { - I2C_BOARD_INFO("sx1508q", 0x20), - .platform_data = &sx150x_data[SX150X_NORTH] - } -}; - -static struct i2c_board_info fluid_core_expander_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("sx1509q", 0x3e), - .platform_data = &sx150x_data[SX150X_CORE_FLUID] - }, -}; - -#ifdef CONFIG_SENSORS_MSM_ADC -static struct i2c_board_info fluid_expanders_i2c_epm_info[] = { - { - I2C_BOARD_INFO("sx1509q", 0x3e), - .platform_data = &sx150x_epmdata - }, -}; -#endif -#endif -#endif - -#ifdef CONFIG_SENSORS_MSM_ADC - -static struct adc_access_fn xoadc_fn = { - pm8058_xoadc_select_chan_and_start_conv, - pm8058_xoadc_read_adc_code, - pm8058_xoadc_get_properties, - pm8058_xoadc_slot_request, - pm8058_xoadc_restore_slot, - pm8058_xoadc_calibrate, -}; - -#if defined(CONFIG_I2C) && \ - (defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)) -static struct regulator *vreg_adc_epm1; - -static struct i2c_client *epm_expander_i2c_register_board(void) - -{ - struct i2c_adapter *i2c_adap; - struct i2c_client *client = NULL; - i2c_adap = i2c_get_adapter(0x0); - - if (i2c_adap == NULL) - printk(KERN_ERR "\nepm_expander_i2c_adapter is NULL\n"); - - if (i2c_adap != NULL) - client = i2c_new_device(i2c_adap, - &fluid_expanders_i2c_epm_info[0]); - return client; - -} - -static unsigned int msm_adc_gpio_configure_expander_enable(void) -{ - int rc = 0; - static struct i2c_client *epm_i2c_client; - - printk(KERN_DEBUG "Enter msm_adc_gpio_configure_expander_enable\n"); - - vreg_adc_epm1 = regulator_get(NULL, "8058_s3"); - - if (IS_ERR(vreg_adc_epm1)) { - printk(KERN_ERR "%s: Unable to get 8058_s3\n", __func__); - return 0; - } - - rc = regulator_set_voltage(vreg_adc_epm1, 1800000, 1800000); - if (rc) - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: " - "regulator set voltage failed\n"); - - rc = regulator_enable(vreg_adc_epm1); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: " - "Error while enabling regulator for epm s3 %d\n", rc); - return rc; - } - - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: Start" - " setting the value of the EPM 3.3, 5v and lvlsft\n"); - - msleep(1000); - - rc = gpio_request(GPIO_EPM_5V_BOOST_EN, "boost_epm_5v"); - if (!rc) { - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: " - "Configure 5v boost\n"); - gpio_direction_output(GPIO_EPM_5V_BOOST_EN, 1); - } else { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: " - "Error for epm 5v boost en\n"); - goto exit_vreg_epm; - } - - msleep(500); - - rc = gpio_request(GPIO_EPM_3_3V_EN, "epm_3_3v"); - if (!rc) { - gpio_direction_output(GPIO_EPM_3_3V_EN, 1); - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: " - "Configure epm 3.3v\n"); - } else { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: " - "Error for gpio 3.3ven\n"); - goto exit_vreg_epm; - } - msleep(500); - - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: " - "Trying to request EPM LVLSFT_EN\n"); - rc = gpio_request(GPIO_EPM_LVLSFT_EN, "lvsft_en"); - if (!rc) { - gpio_direction_output(GPIO_EPM_LVLSFT_EN, 1); - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: " - "Configure the lvlsft\n"); - } else { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: " - "Error for epm lvlsft_en\n"); - goto exit_vreg_epm; - } - - msleep(500); - - if (!epm_i2c_client) - epm_i2c_client = epm_expander_i2c_register_board(); - - rc = gpio_request(GPIO_PWR_MON_ENABLE, "pwr_mon_enable"); - if (!rc) - rc = gpio_direction_output(GPIO_PWR_MON_ENABLE, 1); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": GPIO PWR MON Enable issue\n"); - goto exit_vreg_epm; - } - - msleep(1000); - - rc = gpio_request(GPIO_ADC1_PWDN_N, "adc1_pwdn"); - if (!rc) { - rc = gpio_direction_output(GPIO_ADC1_PWDN_N, 1); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": ADC1_PWDN error direction out\n"); - goto exit_vreg_epm; - } - } - - msleep(100); - - rc = gpio_request(GPIO_ADC2_PWDN_N, "adc2_pwdn"); - if (!rc) { - rc = gpio_direction_output(GPIO_ADC2_PWDN_N, 1); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": ADC2_PWD error direction out\n"); - goto exit_vreg_epm; - } - } - - msleep(1000); - - rc = gpio_request(GPIO_PWR_MON_START, "pwr_mon_start"); - if (!rc) { - rc = gpio_direction_output(GPIO_PWR_MON_START, 0); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - "Gpio request problem %d\n", rc); - goto exit_vreg_epm; - } - } - - rc = gpio_request(GPIO_EPM_SPI_ADC1_CS_N, "spi_adc1_cs"); - if (!rc) { - rc = gpio_direction_output(GPIO_EPM_SPI_ADC1_CS_N, 0); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": EPM_SPI_ADC1_CS_N error\n"); - goto exit_vreg_epm; - } - } - - rc = gpio_request(GPIO_EPM_SPI_ADC2_CS_N, "spi_adc2_cs"); - if (!rc) { - rc = gpio_direction_output(GPIO_EPM_SPI_ADC2_CS_N, 0); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": EPM_SPI_ADC2_Cs_N error\n"); - goto exit_vreg_epm; - } - } - - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_enable: Set " - "the power monitor reset for epm\n"); - - rc = gpio_request(GPIO_PWR_MON_RESET_N, "pwr_mon_reset_n"); - if (!rc) { - gpio_direction_output(GPIO_PWR_MON_RESET_N, 0); - if (rc) { - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable" - ": Error in the power mon reset\n"); - goto exit_vreg_epm; - } - } - - msleep(1000); - - gpio_set_value_cansleep(GPIO_PWR_MON_RESET_N, 1); - - msleep(500); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC1_CS_N, 1); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC2_CS_N, 1); - - return rc; - -exit_vreg_epm: - regulator_disable(vreg_adc_epm1); - - printk(KERN_ERR "msm_adc_gpio_configure_expander_enable: Exit." - " rc = %d.\n", rc); - return rc; -}; - -static unsigned int msm_adc_gpio_configure_expander_disable(void) -{ - int rc = 0; - - gpio_set_value_cansleep(GPIO_PWR_MON_RESET_N, 0); - gpio_free(GPIO_PWR_MON_RESET_N); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC1_CS_N, 0); - gpio_free(GPIO_EPM_SPI_ADC1_CS_N); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC2_CS_N, 0); - gpio_free(GPIO_EPM_SPI_ADC2_CS_N); - - gpio_set_value_cansleep(GPIO_PWR_MON_START, 0); - gpio_free(GPIO_PWR_MON_START); - - gpio_direction_output(GPIO_ADC1_PWDN_N, 0); - gpio_free(GPIO_ADC1_PWDN_N); - - gpio_direction_output(GPIO_ADC2_PWDN_N, 0); - gpio_free(GPIO_ADC2_PWDN_N); - - gpio_set_value_cansleep(GPIO_PWR_MON_ENABLE, 0); - gpio_free(GPIO_PWR_MON_ENABLE); - - gpio_set_value_cansleep(GPIO_EPM_LVLSFT_EN, 0); - gpio_free(GPIO_EPM_LVLSFT_EN); - - gpio_set_value_cansleep(GPIO_EPM_5V_BOOST_EN, 0); - gpio_free(GPIO_EPM_5V_BOOST_EN); - - gpio_set_value_cansleep(GPIO_EPM_3_3V_EN, 0); - gpio_free(GPIO_EPM_3_3V_EN); - - rc = regulator_disable(vreg_adc_epm1); - if (rc) - printk(KERN_DEBUG "msm_adc_gpio_configure_expander_disable: " - "Error while enabling regulator for epm s3 %d\n", rc); - regulator_put(vreg_adc_epm1); - - printk(KERN_DEBUG "Exi msm_adc_gpio_configure_expander_disable\n"); - return rc; -}; - -unsigned int msm_adc_gpio_expander_enable(int cs_enable) -{ - int rc = 0; - - printk(KERN_DEBUG "msm_adc_gpio_expander_enable: cs_enable = %d", - cs_enable); - - if (cs_enable < 16) { - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC1_CS_N, 0); - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC2_CS_N, 1); - } else { - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC2_CS_N, 0); - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC1_CS_N, 1); - } - return rc; -}; - -unsigned int msm_adc_gpio_expander_disable(int cs_disable) -{ - int rc = 0; - - printk(KERN_DEBUG "Enter msm_adc_gpio_expander_disable.\n"); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC1_CS_N, 1); - - gpio_set_value_cansleep(GPIO_EPM_SPI_ADC2_CS_N, 1); - - return rc; -}; -#endif - -static struct msm_adc_channels msm_adc_channels_data[] = { - {"vbatt", CHANNEL_ADC_VBATT, 0, &xoadc_fn, CHAN_PATH_TYPE2, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE3, scale_default}, - {"vcoin", CHANNEL_ADC_VCOIN, 0, &xoadc_fn, CHAN_PATH_TYPE1, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, - {"vcharger_channel", CHANNEL_ADC_VCHG, 0, &xoadc_fn, CHAN_PATH_TYPE3, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE4, scale_default}, - {"charger_current_monitor", CHANNEL_ADC_CHG_MONITOR, 0, &xoadc_fn, - CHAN_PATH_TYPE4, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, scale_default}, - {"vph_pwr", CHANNEL_ADC_VPH_PWR, 0, &xoadc_fn, CHAN_PATH_TYPE5, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE3, scale_default}, - {"usb_vbus", CHANNEL_ADC_USB_VBUS, 0, &xoadc_fn, CHAN_PATH_TYPE11, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE3, scale_default}, - {"pmic_therm", CHANNEL_ADC_DIE_TEMP, 0, &xoadc_fn, CHAN_PATH_TYPE12, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, scale_pmic_therm}, - {"pmic_therm_4K", CHANNEL_ADC_DIE_TEMP_4K, 0, &xoadc_fn, - CHAN_PATH_TYPE12, - ADC_CONFIG_TYPE1, ADC_CALIB_CONFIG_TYPE7, scale_pmic_therm}, - {"xo_therm", CHANNEL_ADC_XOTHERM, 0, &xoadc_fn, CHAN_PATH_TYPE_NONE, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm}, - {"xo_therm_4K", CHANNEL_ADC_XOTHERM_4K, 0, &xoadc_fn, - CHAN_PATH_TYPE_NONE, - ADC_CONFIG_TYPE1, ADC_CALIB_CONFIG_TYPE6, tdkntcgtherm}, - {"hdset_detect", CHANNEL_ADC_HDSET, 0, &xoadc_fn, CHAN_PATH_TYPE6, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, scale_default}, - {"chg_batt_amon", CHANNEL_ADC_BATT_AMON, 0, &xoadc_fn, CHAN_PATH_TYPE10, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, - scale_xtern_chgr_cur}, - {"msm_therm", CHANNEL_ADC_MSM_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE8, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_msm_therm}, - {"batt_therm", CHANNEL_ADC_BATT_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE7, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_batt_therm}, - {"batt_id", CHANNEL_ADC_BATT_ID, 0, &xoadc_fn, CHAN_PATH_TYPE9, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, - {"ref_625mv", CHANNEL_ADC_625_REF, 0, &xoadc_fn, CHAN_PATH_TYPE15, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, - {"ref_1250mv", CHANNEL_ADC_1250_REF, 0, &xoadc_fn, CHAN_PATH_TYPE13, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, - {"ref_325mv", CHANNEL_ADC_325_REF, 0, &xoadc_fn, CHAN_PATH_TYPE14, - ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default}, -}; - -static char *msm_adc_fluid_device_names[] = { - "ADS_ADC1", - "ADS_ADC2", -}; - -static struct msm_adc_platform_data msm_adc_pdata = { - .channel = msm_adc_channels_data, - .num_chan_supported = ARRAY_SIZE(msm_adc_channels_data), -#if defined(CONFIG_I2C) && \ - (defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)) - .adc_gpio_enable = msm_adc_gpio_expander_enable, - .adc_gpio_disable = msm_adc_gpio_expander_disable, - .adc_fluid_enable = msm_adc_gpio_configure_expander_enable, - .adc_fluid_disable = msm_adc_gpio_configure_expander_disable, -#endif -}; - -static struct platform_device msm_adc_device = { - .name = "msm_adc", - .id = -1, - .dev = { - .platform_data = &msm_adc_pdata, - }, -}; - -static struct msm_rtb_platform_data msm_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - msm_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - - -static struct platform_device msm_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &msm_rtb_pdata, - }, -}; - -static void pmic8058_xoadc_mpp_config(void) -{ - int rc, i; - struct pm8xxx_mpp_init_info xoadc_mpps[] = { - PM8058_MPP_INIT(XOADC_MPP_3, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH5, - AOUT_CTRL_DISABLE), - PM8058_MPP_INIT(XOADC_MPP_5, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH9, - AOUT_CTRL_DISABLE), - PM8058_MPP_INIT(XOADC_MPP_7, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH6, - AOUT_CTRL_DISABLE), - PM8058_MPP_INIT(XOADC_MPP_8, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH8, - AOUT_CTRL_DISABLE), - PM8058_MPP_INIT(XOADC_MPP_10, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH7, - AOUT_CTRL_DISABLE), - PM8901_MPP_INIT(XOADC_MPP_4, D_OUTPUT, PM8901_MPP_DIG_LEVEL_S4, - DOUT_CTRL_LOW), - }; - - for (i = 0; i < ARRAY_SIZE(xoadc_mpps); i++) { - rc = pm8xxx_mpp_config(xoadc_mpps[i].mpp, - &xoadc_mpps[i].config); - if (rc) { - pr_err("%s: Config MPP %d of PM8058 failed\n", - __func__, xoadc_mpps[i].mpp); - } - } -} - -static struct regulator *vreg_ldo18_adc; - -static int pmic8058_xoadc_vreg_config(int on) -{ - int rc; - - if (on) { - rc = regulator_enable(vreg_ldo18_adc); - if (rc) - pr_err("%s: Enable of regulator ldo18_adc " - "failed\n", __func__); - } else { - rc = regulator_disable(vreg_ldo18_adc); - if (rc) - pr_err("%s: Disable of regulator ldo18_adc " - "failed\n", __func__); - } - - return rc; -} - -static int pmic8058_xoadc_vreg_setup(void) -{ - int rc; - - vreg_ldo18_adc = regulator_get(NULL, "8058_l18"); - if (IS_ERR(vreg_ldo18_adc)) { - printk(KERN_ERR "%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_ldo18_adc)); - rc = PTR_ERR(vreg_ldo18_adc); - goto fail; - } - - rc = regulator_set_voltage(vreg_ldo18_adc, 2200000, 2200000); - if (rc) { - pr_err("%s: unable to set ldo18 voltage to 2.2V\n", __func__); - goto fail; - } - - return rc; -fail: - regulator_put(vreg_ldo18_adc); - return rc; -} - -static void pmic8058_xoadc_vreg_shutdown(void) -{ - regulator_put(vreg_ldo18_adc); -} - -/* usec. For this ADC, - * this time represents clk rate @ txco w/ 1024 decimation ratio. - * Each channel has different configuration, thus at the time of starting - * the conversion, xoadc will return actual conversion time - * */ -static struct adc_properties pm8058_xoadc_data = { - .adc_reference = 2200, /* milli-voltage for this adc */ - .bitresolution = 15, - .bipolar = 0, - .conversiontime = 54, -}; - -static struct xoadc_platform_data pm8058_xoadc_pdata = { - .xoadc_prop = &pm8058_xoadc_data, - .xoadc_mpp_config = pmic8058_xoadc_mpp_config, - .xoadc_vreg_set = pmic8058_xoadc_vreg_config, - .xoadc_num = XOADC_PMIC_0, - .xoadc_vreg_setup = pmic8058_xoadc_vreg_setup, - .xoadc_vreg_shutdown = pmic8058_xoadc_vreg_shutdown, -}; -#endif - -#ifdef CONFIG_MSM_SDIO_AL - -static unsigned mdm2ap_status = 140; - -static int configure_mdm2ap_status(int on) -{ - int ret = 0; - if (on) - ret = msm_gpiomux_get(mdm2ap_status); - else - ret = msm_gpiomux_put(mdm2ap_status); - - if (ret) - pr_err("%s: mdm2ap_status config failed, on = %d\n", __func__, - on); - - return ret; -} - - -static int get_mdm2ap_status(void) -{ - return gpio_get_value(mdm2ap_status); -} - -static struct sdio_al_platform_data sdio_al_pdata = { - .config_mdm2ap_status = configure_mdm2ap_status, - .get_mdm2ap_status = get_mdm2ap_status, - .allow_sdioc_version_major_2 = 0, - .peer_sdioc_version_minor = 0x0202, - .peer_sdioc_version_major = 0x0004, - .peer_sdioc_boot_version_minor = 0x0001, - .peer_sdioc_boot_version_major = 0x0003 -}; - -struct platform_device msm_device_sdio_al = { - .name = "msm_sdio_al", - .id = -1, - .dev = { - .parent = &msm_charm_modem.dev, - .platform_data = &sdio_al_pdata, - }, -}; - -#endif /* CONFIG_MSM_SDIO_AL */ - -#define GPIO_VREG_ID_EXT_5V 0 - -static struct regulator_consumer_supply vreg_consumers_EXT_5V[] = { - REGULATOR_SUPPLY("ext_5v", NULL), - REGULATOR_SUPPLY("8901_mpp0", NULL), -}; - -#define GPIO_VREG_INIT(_id, _reg_name, _gpio_label, _gpio, _active_low) \ - [GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - }, \ - .regulator_name = _reg_name, \ - .active_low = _active_low, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -/* GPIO regulator constraints */ -static struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] = { - GPIO_VREG_INIT(EXT_5V, "ext_5v", "ext_5v_en", - PM8901_MPP_PM_TO_SYS(0), 0), -}; - -/* GPIO regulator */ -static struct platform_device msm8x60_8901_mpp_vreg = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = PM8901_MPP_PM_TO_SYS(0), - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V], - }, -}; - -static void __init pm8901_vreg_mpp0_init(void) -{ - int rc; - - struct pm8xxx_mpp_init_info pm8901_vreg_mpp0 = { - .mpp = PM8901_MPP_PM_TO_SYS(0), - .config = { - .type = PM8XXX_MPP_TYPE_D_OUTPUT, - .level = PM8901_MPP_DIG_LEVEL_VPH, - }, - }; - - /* - * Set PMIC 8901 MPP0 active_high to 0 for surf and charm_surf. This - * implies that the regulator connected to MPP0 is enabled when - * MPP0 is low. - */ - if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) { - msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V].active_low = 1; - pm8901_vreg_mpp0.config.control = PM8XXX_MPP_DOUT_CTRL_HIGH; - } else { - msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V].active_low = 0; - pm8901_vreg_mpp0.config.control = PM8XXX_MPP_DOUT_CTRL_LOW; - } - - rc = pm8xxx_mpp_config(pm8901_vreg_mpp0.mpp, &pm8901_vreg_mpp0.config); - if (rc) - pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc); -} - -static struct platform_device *charm_devices[] __initdata = { - &msm_charm_modem, -#ifdef CONFIG_MSM_SDIO_AL - &msm_device_sdio_al, -#endif -}; - -#ifdef CONFIG_SND_SOC_MSM8660_APQ -static struct platform_device *dragon_alsa_devices[] __initdata = { - &msm_pcm, - &msm_pcm_routing, - &msm_cpudai0, - &msm_cpudai1, - &msm_cpudai_hdmi_rx, - &msm_cpudai_bt_rx, - &msm_cpudai_bt_tx, - &msm_cpudai_fm_rx, - &msm_cpudai_fm_tx, - &msm_cpu_fe, - &msm_stub_codec, - &msm_lpa_pcm, -}; -#endif - -static struct platform_device *asoc_devices[] __initdata = { - &asoc_msm_pcm, - &asoc_msm_dai0, - &asoc_msm_dai1, -}; - -/* qseecom bus scaling */ -static struct msm_bus_vectors qseecom_clks_init_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = (492 * 8) * 1000000UL, - .ab = (492 * 8) * 100000UL, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = 0, - .ab = 0, - }, -}; - -static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = { - { - .src = MSM_BUS_MASTER_SPS, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ib = 0, - .ab = 0, - }, - { - .src = MSM_BUS_MASTER_SPDM, - .dst = MSM_BUS_SLAVE_SPDM, - .ib = (64 * 8) * 1000000UL, - .ab = (64 * 8) * 100000UL, - }, -}; - -static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = { - { - ARRAY_SIZE(qseecom_clks_init_vectors), - qseecom_clks_init_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_dfab_vectors), - qseecom_enable_sfpb_vectors, - }, - { - ARRAY_SIZE(qseecom_enable_sfpb_vectors), - qseecom_enable_sfpb_vectors, - }, -}; - -static struct msm_bus_scale_pdata qseecom_bus_pdata = { - .usecase = qseecom_hw_bus_scale_usecases, - .num_usecases = ARRAY_SIZE(qseecom_hw_bus_scale_usecases), - .name = "qsee", -}; - -static struct platform_device qseecom_device = { - .name = "qseecom", - .id = -1, - .dev = { - .platform_data = &qseecom_bus_pdata, - }, -}; - -static struct platform_device *surf_devices[] __initdata = { - &msm8x60_device_acpuclk, - &msm_device_smd, - &msm_device_uart_dm12, - &msm_pil_q6v3, - &msm_pil_modem, - &msm_pil_tzapps, - &msm_pil_dsps, - &msm_pil_vidc, - &qseecom_device, -#ifdef CONFIG_I2C_QUP - &msm_gsbi3_qup_i2c_device, - &msm_gsbi4_qup_i2c_device, - &msm_gsbi7_qup_i2c_device, - &msm_gsbi8_qup_i2c_device, - &msm_gsbi9_qup_i2c_device, - &msm_gsbi12_qup_i2c_device, -#endif -#ifdef CONFIG_SERIAL_MSM_HS - &msm_device_uart_dm1, -#endif -#ifdef CONFIG_MSM_SSBI - &msm_device_ssbi_pmic1, - &msm_device_ssbi_pmic2, -#endif -#ifdef CONFIG_I2C_SSBI - &msm_device_ssbi3, -#endif -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - &isp1763_device, -#endif - -#if defined (CONFIG_MSM_8x60_VOIP) - &asoc_msm_mvs, - &asoc_mvs_dai0, - &asoc_mvs_dai1, -#endif - -#if defined(CONFIG_USB_MSM_72K) || defined(CONFIG_USB_EHCI_HCD) - &msm_device_otg, -#endif -#ifdef CONFIG_USB_MSM_72K - &msm_device_gadget_peripheral, -#endif -#ifdef CONFIG_USB_G_ANDROID - &android_usb_device, -#endif -#ifdef CONFIG_BATTERY_MSM - &msm_batt_device, -#endif -#ifdef CONFIG_ANDROID_PMEM -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION - &android_pmem_device, - &android_pmem_adsp_device, - &android_pmem_smipool_device, - &android_pmem_audio_device, -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ -#endif /*CONFIG_ANDROID_PMEM*/ -#ifdef CONFIG_MSM_ROTATOR - &msm_rotator_device, -#endif - &msm_fb_device, - &msm_kgsl_3d0, - &msm_kgsl_2d0, - &msm_kgsl_2d1, - &lcdc_samsung_panel_device, -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - &lcdc_nt35582_panel_device, -#endif -#ifdef CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT - &lcdc_samsung_oled_panel_device, -#endif -#ifdef CONFIG_FB_MSM_LCDC_AUO_WVGA - &lcdc_auo_wvga_panel_device, -#endif -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL - &hdmi_msm_device, -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ -#ifdef CONFIG_FB_MSM_MIPI_DSI - &mipi_dsi_toshiba_panel_device, - &mipi_dsi_novatek_panel_device, -#endif -#ifdef CONFIG_MSM_CAMERA -#ifndef CONFIG_MSM_CAMERA_V4L2 -#ifdef CONFIG_MT9E013 - &msm_camera_sensor_mt9e013, -#endif -#ifdef CONFIG_IMX074 - &msm_camera_sensor_imx074, -#endif -#ifdef CONFIG_WEBCAM_OV7692 - &msm_camera_sensor_webcam_ov7692, -#endif -#ifdef CONFIG_WEBCAM_OV9726 - &msm_camera_sensor_webcam_ov9726, -#endif -#ifdef CONFIG_QS_S5K4E1 - &msm_camera_sensor_qs_s5k4e1, -#endif -#ifdef CONFIG_VX6953 - &msm_camera_sensor_vx6953, -#endif -#endif -#endif -#ifdef CONFIG_MSM_GEMINI - &msm_gemini_device, -#endif -#ifdef CONFIG_MSM_VPE -#ifndef CONFIG_MSM_CAMERA_V4L2 - &msm_vpe_device, -#endif -#endif - -#if defined(CONFIG_MSM_RPM_LOG) || defined(CONFIG_MSM_RPM_LOG_MODULE) - &msm8660_rpm_log_device, -#endif -#if defined(CONFIG_MSM_RPM_STATS_LOG) - &msm8660_rpm_stat_device, -#endif - &msm_device_vidc, -#if (defined(CONFIG_MARIMBA_CORE)) && \ - (defined(CONFIG_MSM_BT_POWER) || defined(CONFIG_MSM_BT_POWER_MODULE)) - &msm_bt_power_device, -#endif -#ifdef CONFIG_SENSORS_MSM_ADC - &msm_adc_device, -#endif - &rpm_regulator_device, - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - &qcrypto_device, -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - &qcedev_device, -#endif - - -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) -#ifdef CONFIG_MSM_USE_TSIF1 - &msm_device_tsif[1], -#else - &msm_device_tsif[0], -#endif /* CONFIG_MSM_USE_TSIF1 */ -#endif /* CONFIG_TSIF */ - -#ifdef CONFIG_HW_RANDOM_MSM - &msm_device_rng, -#endif - - &msm_tsens_device, - &msm8660_rpm_device, -#ifdef CONFIG_ION_MSM - &ion_dev, -#endif - &msm8660_device_watchdog, - &msm_device_tz_log, - &msm_rtb_device, - &msm8660_iommu_domain_device, - &msm8660_pm_8x60, -}; - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_cp_heap_pdata cp_mm_ion_pdata = { - .permission_type = IPT_TYPE_MM_CARVEOUT, - .align = SZ_64K, - .request_region = request_smi_region, - .release_region = release_smi_region, - .setup_region = setup_smi_region, - .secure_base = SECURE_BASE, - .secure_size = SECURE_SIZE, - .iommu_map_all = 1, - .iommu_2x_map_domain = VIDEO_DOMAIN, -}; - -static struct ion_cp_heap_pdata cp_mfc_ion_pdata = { - .permission_type = IPT_TYPE_MFC_SHAREDMEM, - .align = PAGE_SIZE, - .request_region = request_smi_region, - .release_region = release_smi_region, - .setup_region = setup_smi_region, -}; - -static struct ion_cp_heap_pdata cp_wb_ion_pdata = { - .permission_type = IPT_TYPE_MDP_WRITEBACK, - .align = PAGE_SIZE, -}; - -static struct ion_co_heap_pdata mm_fw_co_ion_pdata = { - .adjacent_mem_id = ION_CP_MM_HEAP_ID, -}; - -static struct ion_co_heap_pdata co_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; -#endif - -/** - * These heaps are listed in the order they will be allocated. Due to - * video hardware restrictions and content protection the FW heap has to - * be allocated adjacent (below) the MM heap and the MFC heap has to be - * allocated after the MM heap to ensure MFC heap is not more than 256MB - * away from the base address of the FW heap. - * However, the order of FW heap and MM heap doesn't matter since these - * two heaps are taken care of by separate code to ensure they are adjacent - * to each other. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap msm8x60_heaps [] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - { - .id = ION_CP_MM_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MM_HEAP_NAME, - .base = MSM_ION_MM_BASE, - .size = MSM_ION_MM_SIZE, - .memory_type = ION_SMI_TYPE, - .extra_data = (void *) &cp_mm_ion_pdata, - }, - { - .id = ION_MM_FIRMWARE_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_MM_FIRMWARE_HEAP_NAME, - .base = MSM_MM_FW_BASE, - .size = MSM_MM_FW_SIZE, - .memory_type = ION_SMI_TYPE, - .extra_data = (void *) &mm_fw_co_ion_pdata, - }, - { - .id = ION_CP_MFC_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_MFC_HEAP_NAME, - .base = MSM_ION_MFC_BASE, - .size = MSM_ION_MFC_SIZE, - .memory_type = ION_SMI_TYPE, - .extra_data = (void *) &cp_mfc_ion_pdata, - }, - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .size = MSM_ION_SF_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - { - .id = ION_CAMERA_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_CAMERA_HEAP_NAME, - .size = MSM_ION_CAMERA_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = &co_ion_pdata, - }, - { - .id = ION_CP_WB_HEAP_ID, - .type = ION_HEAP_TYPE_CP, - .name = ION_WB_HEAP_NAME, - .size = MSM_ION_WB_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &cp_wb_ion_pdata, - }, - { - .id = ION_QSECOM_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_QSECOM_HEAP_NAME, - .size = MSM_ION_QSECOM_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *) &co_ion_pdata, - }, - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .size = MSM_ION_AUDIO_SIZE, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, -#endif -}; - -static struct ion_platform_data ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .heaps = msm8x60_heaps, -}; - -static struct platform_device ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &ion_pdata }, -}; -#endif - - -static struct memtype_reserve msm8x60_reserve_table[] __initdata = { - /* Kernel SMI memory pool for video core, used for firmware */ - /* and encoder, decoder scratch buffers */ - /* Kernel SMI memory pool should always precede the user space */ - /* SMI memory pool, as the video core will use offset address */ - /* from the Firmware base */ - [MEMTYPE_SMI_KERNEL] = { - .start = KERNEL_SMI_BASE, - .limit = KERNEL_SMI_SIZE, - .size = KERNEL_SMI_SIZE, - .flags = MEMTYPE_FLAGS_FIXED, - }, - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - unsigned int i; - - if (hdmi_is_primary) { - msm_ion_sf_size = MSM_HDMI_PRIM_ION_SF_SIZE; - for (i = 0; i < ion_pdata.nr; i++) { - if (ion_pdata.heaps[i].id == ION_SF_HEAP_ID) { - ion_pdata.heaps[i].size = msm_ion_sf_size; - pr_debug("msm_ion_sf_size 0x%x\n", - msm_ion_sf_size); - break; - } - } - } - - /* Verify size of heap is a multiple of 64K */ - for (i = 0; i < ion_pdata.nr; i++) { - struct ion_platform_heap *heap = &(ion_pdata.heaps[i]); - - if (heap->extra_data && - heap->type == (enum ion_heap_type) ION_HEAP_TYPE_CP) { - int map_all = ((struct ion_cp_heap_pdata *) - heap->extra_data)->iommu_map_all; - - if (map_all && (heap->size & (SZ_64K-1))) { - heap->size = ALIGN(heap->size, SZ_64K); - pr_err("Heap %s size is not a multiple of 64K. Adjusting size to %x\n", - heap->name, heap->size); - - } - } - } - - msm8x60_reserve_table[MEMTYPE_EBI1].size += msm_ion_sf_size; - msm8x60_reserve_table[MEMTYPE_EBI1].size += MSM_ION_CAMERA_SIZE; - msm8x60_reserve_table[MEMTYPE_EBI1].size += MSM_ION_WB_SIZE; - msm8x60_reserve_table[MEMTYPE_EBI1].size += MSM_ION_AUDIO_SIZE; - msm8x60_reserve_table[MEMTYPE_EBI1].size += MSM_ION_QSECOM_SIZE; -#endif -} - -static void __init size_pmem_devices(void) -{ -#ifdef CONFIG_ANDROID_PMEM -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION - android_pmem_adsp_pdata.size = pmem_adsp_size; - android_pmem_smipool_pdata.size = MSM_PMEM_SMIPOOL_SIZE; - - if (hdmi_is_primary) - pmem_sf_size = MSM_HDMI_PRIM_PMEM_SF_SIZE; - android_pmem_pdata.size = pmem_sf_size; - android_pmem_audio_pdata.size = MSM_PMEM_AUDIO_SIZE; -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ -#endif /*CONFIG_ANDROID_PMEM*/ -} - -#ifdef CONFIG_ANDROID_PMEM -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION -static void __init reserve_memory_for(struct android_pmem_platform_data *p) -{ - msm8x60_reserve_table[p->memory_type].size += p->size; -} -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ -#endif /*CONFIG_ANDROID_PMEM*/ - -static void __init reserve_pmem_memory(void) -{ -#ifdef CONFIG_ANDROID_PMEM -#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION - reserve_memory_for(&android_pmem_adsp_pdata); - reserve_memory_for(&android_pmem_smipool_pdata); - reserve_memory_for(&android_pmem_pdata); - reserve_memory_for(&android_pmem_audio_pdata); -#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/ - msm8x60_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size; -#endif /*CONFIG_ANDROID_PMEM*/ -} - -static void __init reserve_mdp_memory(void); - -static void __init reserve_rtb_memory(void) -{ -#if defined(CONFIG_MSM_RTB) - msm8x60_reserve_table[MEMTYPE_EBI1].size += msm_rtb_pdata.size; -#endif -} - -static void __init msm8x60_calculate_reserve_sizes(void) -{ - size_pmem_devices(); - reserve_pmem_memory(); - reserve_ion_memory(); - reserve_mdp_memory(); - reserve_rtb_memory(); -} - -static int msm8x60_paddr_to_memtype(phys_addr_t paddr) -{ - if (paddr >= 0x40000000 && paddr < 0x60000000) - return MEMTYPE_EBI1; - if (paddr >= 0x38000000 && paddr < 0x40000000) - return MEMTYPE_SMI; - return MEMTYPE_NONE; -} - -static struct reserve_info msm8x60_reserve_info __initdata = { - .memtype_reserve_table = msm8x60_reserve_table, - .calculate_reserve_sizes = msm8x60_calculate_reserve_sizes, - .paddr_to_memtype = msm8x60_paddr_to_memtype, -}; - -static char prim_panel_name[PANEL_NAME_MAX_LEN]; -static char ext_panel_name[PANEL_NAME_MAX_LEN]; -static int __init prim_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("prim_display", prim_display_setup); - -static int __init ext_display_setup(char *param) -{ - if (strnlen(param, PANEL_NAME_MAX_LEN)) - strlcpy(ext_panel_name, param, PANEL_NAME_MAX_LEN); - return 0; -} -early_param("ext_display", ext_display_setup); - -static void __init msm8x60_reserve(void) -{ - msm8x60_set_display_params(prim_panel_name, ext_panel_name); - reserve_info = &msm8x60_reserve_info; - msm_reserve(); -} - -#define EXT_CHG_VALID_MPP 10 -#define EXT_CHG_VALID_MPP_2 11 - -static struct pm8xxx_mpp_init_info isl_mpp[] = { - PM8058_MPP_INIT(EXT_CHG_VALID_MPP, D_INPUT, - PM8058_MPP_DIG_LEVEL_S3, DIN_TO_INT), - PM8058_MPP_INIT(EXT_CHG_VALID_MPP_2, D_BI_DIR, - PM8058_MPP_DIG_LEVEL_S3, BI_PULLUP_10KOHM), -}; - -#ifdef CONFIG_ISL9519_CHARGER -static int isl_detection_setup(void) -{ - int ret = 0, i; - - for (i = 0; i < ARRAY_SIZE(isl_mpp); i++) { - ret = pm8xxx_mpp_config(isl_mpp[i].mpp, - &isl_mpp[i].config); - if (ret) { - pr_err("%s: Config MPP %d of PM8058 failed\n", - __func__, isl_mpp[i].mpp); - return ret; - } - } - - return ret; -} - -static struct isl_platform_data isl_data __initdata = { - .chgcurrent = 700, - .valid_n_gpio = PM8058_MPP_PM_TO_SYS(10), - .chg_detection_config = isl_detection_setup, - .max_system_voltage = 4200, - .min_system_voltage = 3200, - .term_current = 120, - .input_current = 2048, -}; - -static struct i2c_board_info isl_charger_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("isl9519q", 0x9), - .irq = PM8058_IRQ_BASE + PM8058_CBLPWR_IRQ, - .platform_data = &isl_data, - }, -}; -#endif - -#if defined(CONFIG_SMB137B_CHARGER) || defined(CONFIG_SMB137B_CHARGER_MODULE) -static int smb137b_detection_setup(void) -{ - int ret = 0, i; - - for (i = 0; i < ARRAY_SIZE(isl_mpp); i++) { - ret = pm8xxx_mpp_config(isl_mpp[i].mpp, - &isl_mpp[i].config); - if (ret) { - pr_err("%s: Config MPP %d of PM8058 failed\n", - __func__, isl_mpp[i].mpp); - return ret; - } - } - - return ret; -} - -static struct smb137b_platform_data smb137b_data __initdata = { - .chg_detection_config = smb137b_detection_setup, - .valid_n_gpio = PM8058_MPP_PM_TO_SYS(10), - .batt_mah_rating = 950, -}; - -static struct i2c_board_info smb137b_charger_i2c_info[] __initdata = { - { - I2C_BOARD_INFO("smb137b", 0x08), - .irq = PM8058_IRQ_BASE + PM8058_CBLPWR_IRQ, - .platform_data = &smb137b_data, - }, -}; -#endif - -#ifdef CONFIG_PMIC8058 -#define PMIC_GPIO_SDC3_DET 22 -#define PMIC_GPIO_TOUCH_DISC_INTR 5 - -static int pm8058_gpios_init(void) -{ - int i; - int rc; - struct pm8058_gpio_cfg { - int gpio; - struct pm_gpio cfg; - }; - - struct pm8058_gpio_cfg gpio_cfgs[] = { - { /* FFA ethernet */ - PM8058_GPIO_PM_TO_SYS(6), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_DN, - .vin_sel = 2, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_30, - .vin_sel = 2, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { /* core&surf gpio expander */ - PM8058_GPIO_PM_TO_SYS(UI_INT1_N), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { /* docking gpio expander */ - PM8058_GPIO_PM_TO_SYS(UI_INT2_N), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { /* FHA/keypad gpio expanders */ - PM8058_GPIO_PM_TO_SYS(UI_INT3_N), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }, - }, - { /* Timpani Reset */ - PM8058_GPIO_PM_TO_SYS(20), - { - .direction = PM_GPIO_DIR_OUT, - .output_value = 1, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .pull = PM_GPIO_PULL_DN, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .vin_sel = 2, - .inv_int_pol = 0, - } - }, - { /* PMIC ID interrupt */ - PM8058_GPIO_PM_TO_SYS(36), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .function = PM_GPIO_FUNC_NORMAL, - .vin_sel = 2, - .inv_int_pol = 0, - } - }, - }; - -#if defined(CONFIG_TOUCHDISC_VTD518_SHINETSU) || \ - defined(CONFIG_TOUCHDISC_VTD518_SHINETSU_MODULE) - struct pm_gpio touchdisc_intr_gpio_cfg = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_1P5, - .vin_sel = 2, - .function = PM_GPIO_FUNC_NORMAL, - }; -#endif - -#if defined(CONFIG_HAPTIC_ISA1200) || \ - defined(CONFIG_HAPTIC_ISA1200_MODULE) - struct pm_gpio en_hap_gpio_cfg = { - .direction = PM_GPIO_DIR_OUT, - .pull = PM_GPIO_PULL_NO, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - .vin_sel = 2, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - }; -#endif - -#if defined(CONFIG_PMIC8058_OTHC) || defined(CONFIG_PMIC8058_OTHC_MODULE) - struct pm8058_gpio_cfg line_in_gpio_cfg = { - PM8058_GPIO_PM_TO_SYS(18), - { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_UP_1P5, - .vin_sel = 2, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - } - }; -#endif - -#if defined(CONFIG_QS_S5K4E1) - { - struct pm8058_gpio_cfg qs_hc37_cam_pd_gpio_cfg = { - PM8058_GPIO_PM_TO_SYS(26), - { - .direction = PM_GPIO_DIR_OUT, - .output_value = 0, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .pull = PM_GPIO_PULL_DN, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .vin_sel = 2, - .inv_int_pol = 0, - } - }; -#endif -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - struct pm8058_gpio_cfg pmic_lcdc_nt35582_gpio_cfg = { - PM8058_GPIO_PM_TO_SYS(GPIO_NT35582_BL_EN_HW_PIN - 1), - { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 1, - .pull = PM_GPIO_PULL_UP_30, - /* 2.9V PM_GPIO_VIN_L2, which gives 2.6V */ - .vin_sel = PM8058_GPIO_VIN_L5, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - } - }; -#endif -#if defined(CONFIG_HAPTIC_ISA1200) || \ - defined(CONFIG_HAPTIC_ISA1200_MODULE) - if (machine_is_msm8x60_fluid()) { - rc = pm8xxx_gpio_config( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_ENABLE), - &en_hap_gpio_cfg); - if (rc < 0) { - pr_err("%s: pmic haptics gpio config failed\n", - __func__); - } - rc = pm8xxx_gpio_config( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_HAP_LDO_ENABLE), - &en_hap_gpio_cfg); - if (rc < 0) { - pr_err("%s: pmic haptics ldo gpio config failed\n", - __func__); - } - - } -#endif - -#if defined(CONFIG_TOUCHDISC_VTD518_SHINETSU) || \ - defined(CONFIG_TOUCHDISC_VTD518_SHINETSU_MODULE) - if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() || - machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - rc = pm8xxx_gpio_config( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_TOUCH_DISC_INTR), - &touchdisc_intr_gpio_cfg); - if (rc < 0) { - pr_err("%s: Touchdisc interrupt gpio config failed\n", - __func__); - } - } -#endif - -#if defined(CONFIG_PMIC8058_OTHC) || defined(CONFIG_PMIC8058_OTHC_MODULE) - /* Line_in only for 8660 ffa & surf */ - if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() || - machine_is_msm8x60_fusion() || machine_is_msm8x60_dragon() || - machine_is_msm8x60_fusn_ffa()) { - rc = pm8xxx_gpio_config(line_in_gpio_cfg.gpio, - &line_in_gpio_cfg.cfg); - if (rc < 0) { - pr_err("%s pmic line_in gpio config failed\n", - __func__); - return rc; - } - } -#endif - -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - if (machine_is_msm8x60_dragon()) { - rc = pm8xxx_gpio_config(pmic_lcdc_nt35582_gpio_cfg.gpio, - &pmic_lcdc_nt35582_gpio_cfg.cfg); - if (rc < 0) { - pr_err("%s pmic gpio config failed\n", __func__); - return rc; - } - } -#endif - -#if defined(CONFIG_QS_S5K4E1) - /* qs_cam_hc37_cam_pd only for 8660 fluid qs camera*/ - if (machine_is_msm8x60_fluid()) { - rc = pm8xxx_gpio_config(qs_hc37_cam_pd_gpio_cfg.gpio, - &qs_hc37_cam_pd_gpio_cfg.cfg); - if (rc < 0) { - pr_err("%s pmic qs_hc37_cam_pd gpio config failed\n", - __func__); - return rc; - } - } - } -#endif - - for (i = 0; i < ARRAY_SIZE(gpio_cfgs); ++i) { - rc = pm8xxx_gpio_config(gpio_cfgs[i].gpio, - &gpio_cfgs[i].cfg); - if (rc < 0) { - pr_err("%s pmic gpio config failed\n", - __func__); - return rc; - } - } - - return 0; -} - -static const unsigned int ffa_keymap[] = { - KEY(0, 0, KEY_FN_F1), /* LS - PUSH1 */ - KEY(0, 1, KEY_UP), /* NAV - UP */ - KEY(0, 2, KEY_LEFT), /* NAV - LEFT */ - KEY(0, 3, KEY_VOLUMEUP), /* Shuttle SW_UP */ - - KEY(1, 0, KEY_FN_F2), /* LS - PUSH2 */ - KEY(1, 1, KEY_RIGHT), /* NAV - RIGHT */ - KEY(1, 2, KEY_DOWN), /* NAV - DOWN */ - KEY(1, 3, KEY_VOLUMEDOWN), - - KEY(2, 3, KEY_ENTER), /* SW_PUSH key */ - - KEY(4, 0, KEY_CAMERA_FOCUS), /* RS - PUSH1 */ - KEY(4, 1, KEY_UP), /* USER_UP */ - KEY(4, 2, KEY_LEFT), /* USER_LEFT */ - KEY(4, 3, KEY_HOME), /* Right switch: MIC Bd */ - KEY(4, 4, KEY_FN_F3), /* Reserved MIC */ - - KEY(5, 0, KEY_CAMERA), /* RS - PUSH2 */ - KEY(5, 1, KEY_RIGHT), /* USER_RIGHT */ - KEY(5, 2, KEY_DOWN), /* USER_DOWN */ - KEY(5, 3, KEY_BACK), /* Left switch: MIC */ - KEY(5, 4, KEY_MENU), /* Center switch: MIC */ -}; - -static const unsigned int dragon_keymap[] = { - KEY(0, 0, KEY_MENU), - KEY(0, 2, KEY_1), - KEY(0, 3, KEY_4), - KEY(0, 4, KEY_7), - - KEY(1, 0, KEY_UP), - KEY(1, 1, KEY_LEFT), - KEY(1, 2, KEY_DOWN), - KEY(1, 3, KEY_5), - KEY(1, 4, KEY_8), - - KEY(2, 0, KEY_HOME), - KEY(2, 1, KEY_REPLY), - KEY(2, 2, KEY_2), - KEY(2, 3, KEY_6), - KEY(2, 4, KEY_0), - - KEY(3, 0, KEY_VOLUMEUP), - KEY(3, 1, KEY_RIGHT), - KEY(3, 2, KEY_3), - KEY(3, 3, KEY_9), - KEY(3, 4, KEY_SWITCHVIDEOMODE), - - KEY(4, 0, KEY_VOLUMEDOWN), - KEY(4, 1, KEY_BACK), - KEY(4, 2, KEY_CAMERA), - KEY(4, 3, KEY_KBDILLUMTOGGLE), -}; - -static struct matrix_keymap_data ffa_keymap_data = { - .keymap_size = ARRAY_SIZE(ffa_keymap), - .keymap = ffa_keymap, -}; - -static struct pm8xxx_keypad_platform_data ffa_keypad_data = { - .input_name = "ffa-keypad", - .input_phys_device = "ffa-keypad/input0", - .num_rows = 6, - .num_cols = 5, - .rows_gpio_start = PM8058_GPIO_PM_TO_SYS(8), - .cols_gpio_start = PM8058_GPIO_PM_TO_SYS(0), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &ffa_keymap_data, -}; - -static struct matrix_keymap_data dragon_keymap_data = { - .keymap_size = ARRAY_SIZE(dragon_keymap), - .keymap = dragon_keymap, -}; - -static struct pm8xxx_keypad_platform_data dragon_keypad_data = { - .input_name = "dragon-keypad", - .input_phys_device = "dragon-keypad/input0", - .num_rows = 6, - .num_cols = 5, - .rows_gpio_start = PM8058_GPIO_PM_TO_SYS(8), - .cols_gpio_start = PM8058_GPIO_PM_TO_SYS(0), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &dragon_keymap_data, -}; - -static const unsigned int fluid_keymap[] = { - KEY(0, 0, KEY_FN_F1), /* LS - PUSH1 */ - KEY(0, 1, KEY_UP), /* NAV - UP */ - KEY(0, 2, KEY_LEFT), /* NAV - LEFT */ - KEY(0, 3, KEY_VOLUMEDOWN), /* Shuttle SW_UP */ - - KEY(1, 0, KEY_FN_F2), /* LS - PUSH2 */ - KEY(1, 1, KEY_RIGHT), /* NAV - RIGHT */ - KEY(1, 2, KEY_DOWN), /* NAV - DOWN */ - KEY(1, 3, KEY_VOLUMEUP), - - KEY(2, 3, KEY_ENTER), /* SW_PUSH key */ - - KEY(4, 0, KEY_CAMERA_FOCUS), /* RS - PUSH1 */ - KEY(4, 1, KEY_UP), /* USER_UP */ - KEY(4, 2, KEY_LEFT), /* USER_LEFT */ - KEY(4, 3, KEY_HOME), /* Right switch: MIC Bd */ - KEY(4, 4, KEY_FN_F3), /* Reserved MIC */ - - KEY(5, 0, KEY_CAMERA), /* RS - PUSH2 */ - KEY(5, 1, KEY_RIGHT), /* USER_RIGHT */ - KEY(5, 2, KEY_DOWN), /* USER_DOWN */ - KEY(5, 3, KEY_BACK), /* Left switch: MIC */ - KEY(5, 4, KEY_MENU), /* Center switch: MIC */ -}; - -static struct matrix_keymap_data fluid_keymap_data = { - .keymap_size = ARRAY_SIZE(fluid_keymap), - .keymap = fluid_keymap, -}; - -static struct pm8xxx_keypad_platform_data fluid_keypad_data = { - .input_name = "fluid-keypad", - .input_phys_device = "fluid-keypad/input0", - .num_rows = 6, - .num_cols = 5, - .rows_gpio_start = PM8058_GPIO_PM_TO_SYS(8), - .cols_gpio_start = PM8058_GPIO_PM_TO_SYS(0), - .debounce_ms = 15, - .scan_delay_ms = 32, - .row_hold_ns = 91500, - .wakeup = 1, - .keymap_data = &fluid_keymap_data, -}; - -static struct pm8xxx_vibrator_platform_data pm8058_vib_pdata = { - .initial_vibrate_ms = 500, - .level_mV = 3000, - .max_timeout_ms = 15000, -}; - -static struct pm8xxx_rtc_platform_data pm8058_rtc_pdata = { - .rtc_write_enable = false, - .rtc_alarm_powerup = false, -}; - -static struct pm8xxx_pwrkey_platform_data pm8058_pwrkey_pdata = { - .pull_up = 1, - .kpd_trigger_delay_us = 15625, - .wakeup = 1, -}; - -#define PM8058_LINE_IN_DET_GPIO PM8058_GPIO_PM_TO_SYS(18) - -static struct othc_accessory_info othc_accessories[] = { - { - .accessory = OTHC_SVIDEO_OUT, - .detect_flags = OTHC_MICBIAS_DETECT | OTHC_SWITCH_DETECT - | OTHC_ADC_DETECT, - .key_code = SW_VIDEOOUT_INSERT, - .enabled = false, - .adc_thres = { - .min_threshold = 20, - .max_threshold = 40, - }, - }, - { - .accessory = OTHC_ANC_HEADPHONE, - .detect_flags = OTHC_MICBIAS_DETECT | OTHC_GPIO_DETECT | - OTHC_SWITCH_DETECT, - .gpio = PM8058_LINE_IN_DET_GPIO, - .active_low = 1, - .key_code = SW_HEADPHONE_INSERT, - .enabled = true, - }, - { - .accessory = OTHC_ANC_HEADSET, - .detect_flags = OTHC_MICBIAS_DETECT | OTHC_GPIO_DETECT, - .gpio = PM8058_LINE_IN_DET_GPIO, - .active_low = 1, - .key_code = SW_HEADPHONE_INSERT, - .enabled = true, - }, - { - .accessory = OTHC_HEADPHONE, - .detect_flags = OTHC_MICBIAS_DETECT | OTHC_SWITCH_DETECT, - .key_code = SW_HEADPHONE_INSERT, - .enabled = true, - }, - { - .accessory = OTHC_MICROPHONE, - .detect_flags = OTHC_GPIO_DETECT, - .gpio = PM8058_LINE_IN_DET_GPIO, - .active_low = 1, - .key_code = SW_MICROPHONE_INSERT, - .enabled = true, - }, - { - .accessory = OTHC_HEADSET, - .detect_flags = OTHC_MICBIAS_DETECT, - .key_code = SW_HEADPHONE_INSERT, - .enabled = true, - }, -}; - -static struct othc_switch_info switch_info[] = { - { - .min_adc_threshold = 0, - .max_adc_threshold = 100, - .key_code = KEY_PLAYPAUSE, - }, - { - .min_adc_threshold = 100, - .max_adc_threshold = 200, - .key_code = KEY_REWIND, - }, - { - .min_adc_threshold = 200, - .max_adc_threshold = 500, - .key_code = KEY_FASTFORWARD, - }, -}; - -static struct othc_n_switch_config switch_config = { - .voltage_settling_time_ms = 0, - .num_adc_samples = 3, - .adc_channel = CHANNEL_ADC_HDSET, - .switch_info = switch_info, - .num_keys = ARRAY_SIZE(switch_info), - .default_sw_en = true, - .default_sw_idx = 0, -}; - -static struct hsed_bias_config hsed_bias_config = { - /* HSED mic bias config info */ - .othc_headset = OTHC_HEADSET_NO, - .othc_lowcurr_thresh_uA = 100, - .othc_highcurr_thresh_uA = 600, - .othc_hyst_prediv_us = 7800, - .othc_period_clkdiv_us = 62500, - .othc_hyst_clk_us = 121000, - .othc_period_clk_us = 312500, - .othc_wakeup = 1, -}; - -static struct othc_hsed_config hsed_config_1 = { - .hsed_bias_config = &hsed_bias_config, - /* - * The detection delay and switch reporting delay are - * required to encounter a hardware bug (spurious switch - * interrupts on slow insertion/removal of the headset). - * This will introduce a delay in reporting the accessory - * insertion and removal to the userspace. - */ - .detection_delay_ms = 1500, - /* Switch info */ - .switch_debounce_ms = 1500, - .othc_support_n_switch = false, - .switch_config = &switch_config, - .ir_gpio = -1, - /* Accessory info */ - .accessories_support = true, - .accessories = othc_accessories, - .othc_num_accessories = ARRAY_SIZE(othc_accessories), -}; - -static struct othc_regulator_config othc_reg = { - .regulator = "8058_l5", - .max_uV = 2850000, - .min_uV = 2850000, -}; - -/* MIC_BIAS0 is configured as normal MIC BIAS */ -static struct pmic8058_othc_config_pdata othc_config_pdata_0 = { - .micbias_select = OTHC_MICBIAS_0, - .micbias_capability = OTHC_MICBIAS, - .micbias_enable = OTHC_SIGNAL_OFF, - .micbias_regulator = &othc_reg, -}; - -/* MIC_BIAS1 is configured as HSED_BIAS for OTHC */ -static struct pmic8058_othc_config_pdata othc_config_pdata_1 = { - .micbias_select = OTHC_MICBIAS_1, - .micbias_capability = OTHC_MICBIAS_HSED, - .micbias_enable = OTHC_SIGNAL_PWM_TCXO, - .micbias_regulator = &othc_reg, - .hsed_config = &hsed_config_1, - .hsed_name = "8660_handset", -}; - -/* MIC_BIAS2 is configured as normal MIC BIAS */ -static struct pmic8058_othc_config_pdata othc_config_pdata_2 = { - .micbias_select = OTHC_MICBIAS_2, - .micbias_capability = OTHC_MICBIAS, - .micbias_enable = OTHC_SIGNAL_OFF, - .micbias_regulator = &othc_reg, -}; - - -static void __init msm8x60_init_pm8058_othc(void) -{ - int i; - - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2 || - machine_is_msm8x60_fluid() || machine_is_msm8x60_fusion() || - machine_is_msm8x60_fusn_ffa()) { - /* 3-switch headset supported only by V2 FFA and FLUID */ - hsed_config_1.accessories_adc_support = true, - /* ADC based accessory detection works only on V2 and FLUID */ - hsed_config_1.accessories_adc_channel = CHANNEL_ADC_HDSET, - hsed_config_1.othc_support_n_switch = true; - } - - /* IR GPIO is absent on FLUID */ - if (machine_is_msm8x60_fluid()) - hsed_config_1.ir_gpio = -1; - - for (i = 0; i < ARRAY_SIZE(othc_accessories); i++) { - if (machine_is_msm8x60_fluid()) { - switch (othc_accessories[i].accessory) { - case OTHC_ANC_HEADPHONE: - case OTHC_ANC_HEADSET: - othc_accessories[i].gpio = GPIO_HEADSET_DET_N; - break; - case OTHC_MICROPHONE: - othc_accessories[i].enabled = false; - break; - case OTHC_SVIDEO_OUT: - othc_accessories[i].enabled = true; - hsed_config_1.video_out_gpio = GPIO_HS_SW_DIR; - break; - } - } - } -} - - -static int pm8058_pwm_config(struct pwm_device *pwm, int ch, int on) -{ - struct pm_gpio pwm_gpio_config = { - .direction = PM_GPIO_DIR_OUT, - .output_buffer = PM_GPIO_OUT_BUF_CMOS, - .output_value = 0, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_VPH, - .out_strength = PM_GPIO_STRENGTH_HIGH, - .function = PM_GPIO_FUNC_2, - }; - - int rc = -EINVAL; - int id, mode, max_mA; - - id = mode = max_mA = 0; - switch (ch) { - case 0: - case 1: - case 2: - if (on) { - id = 24 + ch; - rc = pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(id - 1), - &pwm_gpio_config); - if (rc) - pr_err("%s: pm8xxx_gpio_config(%d): rc=%d\n", - __func__, id, rc); - } - break; - - case 6: - id = PM_PWM_LED_FLASH; - mode = PM_PWM_CONF_PWM1; - max_mA = 300; - break; - - case 7: - id = PM_PWM_LED_FLASH1; - mode = PM_PWM_CONF_PWM1; - max_mA = 300; - break; - - default: - break; - } - - if (ch >= 6 && ch <= 7) { - if (!on) { - mode = PM_PWM_CONF_NONE; - max_mA = 0; - } - rc = pm8058_pwm_config_led(pwm, id, mode, max_mA); - if (rc) - pr_err("%s: pm8058_pwm_config_led(ch=%d): rc=%d\n", - __func__, ch, rc); - } - return rc; - -} - -static struct pm8058_pwm_pdata pm8058_pwm_data = { - .config = pm8058_pwm_config, -}; - -#define PM8058_GPIO_INT 88 - -static struct pmic8058_led pmic8058_flash_leds[] = { - [0] = { - .name = "camera:flash0", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_0, - }, - [1] = { - .name = "camera:flash1", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_1, - }, -}; - -static struct pmic8058_leds_platform_data pm8058_flash_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_flash_leds), - .leds = pmic8058_flash_leds, -}; - -static struct pmic8058_led pmic8058_dragon_leds[] = { - [0] = { - /* RED */ - .name = "led_drv0", - .max_brightness = 15, - .id = PMIC8058_ID_LED_0, - },/* 300 mA flash led0 drv sink */ - [1] = { - /* Yellow */ - .name = "led_drv1", - .max_brightness = 15, - .id = PMIC8058_ID_LED_1, - },/* 300 mA flash led0 drv sink */ - [2] = { - /* Green */ - .name = "led_drv2", - .max_brightness = 15, - .id = PMIC8058_ID_LED_2, - },/* 300 mA flash led0 drv sink */ - [3] = { - .name = "led_psensor", - .max_brightness = 15, - .id = PMIC8058_ID_LED_KB_LIGHT, - },/* 300 mA flash led0 drv sink */ -}; - -static struct pmic8058_leds_platform_data pm8058_dragon_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_dragon_leds), - .leds = pmic8058_dragon_leds, -}; - -static struct pmic8058_led pmic8058_fluid_flash_leds[] = { - [0] = { - .name = "led:drv0", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_0, - },/* 300 mA flash led0 drv sink */ - [1] = { - .name = "led:drv1", - .max_brightness = 15, - .id = PMIC8058_ID_FLASH_LED_1, - },/* 300 mA flash led1 sink */ - [2] = { - .name = "led:drv2", - .max_brightness = 20, - .id = PMIC8058_ID_LED_0, - },/* 40 mA led0 sink */ - [3] = { - .name = "keypad:drv", - .max_brightness = 15, - .id = PMIC8058_ID_LED_KB_LIGHT, - },/* 300 mA keypad drv sink */ -}; - -static struct pmic8058_leds_platform_data pm8058_fluid_flash_leds_data = { - .num_leds = ARRAY_SIZE(pmic8058_fluid_flash_leds), - .leds = pmic8058_fluid_flash_leds, -}; - -static struct pmic8058_charger_data pmic8058_charger_dragon = { - .charger_data_valid = true, - .max_source_current = 1800, - .charger_type = CHG_TYPE_AC, -}; - -static struct pmic8058_charger_data pmic8058_charger_ffa_surf = { - .charger_data_valid = false, -}; - -static struct pm8xxx_misc_platform_data pm8058_misc_pdata = { - .priority = 0, -}; - -static struct pm8xxx_irq_platform_data pm8058_irq_pdata = { - .irq_base = PM8058_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(PM8058_GPIO_INT), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_gpio_platform_data pm8058_gpio_pdata = { - .gpio_base = PM8058_GPIO_PM_TO_SYS(0), -}; - -static struct pm8xxx_mpp_platform_data pm8058_mpp_pdata = { - .mpp_base = PM8058_MPP_PM_TO_SYS(0), -}; - -static struct pm8058_platform_data pm8058_platform_data = { - .irq_pdata = &pm8058_irq_pdata, - .gpio_pdata = &pm8058_gpio_pdata, - .mpp_pdata = &pm8058_mpp_pdata, - .rtc_pdata = &pm8058_rtc_pdata, - .pwrkey_pdata = &pm8058_pwrkey_pdata, - .othc0_pdata = &othc_config_pdata_0, - .othc1_pdata = &othc_config_pdata_1, - .othc2_pdata = &othc_config_pdata_2, - .pwm_pdata = &pm8058_pwm_data, - .misc_pdata = &pm8058_misc_pdata, -#ifdef CONFIG_SENSORS_MSM_ADC - .xoadc_pdata = &pm8058_xoadc_pdata, -#endif -}; - -#ifdef CONFIG_MSM_SSBI -static struct msm_ssbi_platform_data msm8x60_ssbi_pm8058_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8058-core", - .platform_data = &pm8058_platform_data, - }, -}; -#endif -#endif /* CONFIG_PMIC8058 */ - -#if defined(CONFIG_TOUCHDISC_VTD518_SHINETSU) || \ - defined(CONFIG_TOUCHDISC_VTD518_SHINETSU_MODULE) -#define TDISC_I2C_SLAVE_ADDR 0x67 -#define PMIC_GPIO_TDISC PM8058_GPIO_PM_TO_SYS(5) -#define TDISC_INT PM8058_GPIO_IRQ(PM8058_IRQ_BASE, 5) - -static const char *vregs_tdisc_name[] = { - "8058_l5", - "8058_s3", -}; - -static const int vregs_tdisc_val[] = { - 2850000,/* uV */ - 1800000, -}; -static struct regulator *vregs_tdisc[ARRAY_SIZE(vregs_tdisc_name)]; - -static int tdisc_shinetsu_setup(void) -{ - int rc, i; - - rc = gpio_request(PMIC_GPIO_TDISC, "tdisc_interrupt"); - if (rc) { - pr_err("%s: gpio_request failed for PMIC_GPIO_TDISC\n", - __func__); - return rc; - } - - rc = gpio_request(GPIO_JOYSTICK_EN, "tdisc_oe"); - if (rc) { - pr_err("%s: gpio_request failed for GPIO_JOYSTICK_EN\n", - __func__); - goto fail_gpio_oe; - } - - rc = gpio_direction_output(GPIO_JOYSTICK_EN, 1); - if (rc) { - pr_err("%s: gpio_direction_output failed for GPIO_JOYSTICK_EN\n", - __func__); - gpio_free(GPIO_JOYSTICK_EN); - goto fail_gpio_oe; - } - - for (i = 0; i < ARRAY_SIZE(vregs_tdisc_name); i++) { - vregs_tdisc[i] = regulator_get(NULL, vregs_tdisc_name[i]); - if (IS_ERR(vregs_tdisc[i])) { - printk(KERN_ERR "%s: regulator get %s failed (%ld)\n", - __func__, vregs_tdisc_name[i], - PTR_ERR(vregs_tdisc[i])); - rc = PTR_ERR(vregs_tdisc[i]); - goto vreg_get_fail; - } - - rc = regulator_set_voltage(vregs_tdisc[i], - vregs_tdisc_val[i], vregs_tdisc_val[i]); - if (rc) { - printk(KERN_ERR "%s: regulator_set_voltage() = %d\n", - __func__, rc); - goto vreg_set_voltage_fail; - } - } - - return rc; -vreg_set_voltage_fail: - i++; -vreg_get_fail: - while (i) - regulator_put(vregs_tdisc[--i]); -fail_gpio_oe: - gpio_free(PMIC_GPIO_TDISC); - return rc; -} - -static void tdisc_shinetsu_release(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(vregs_tdisc_name); i++) - regulator_put(vregs_tdisc[i]); - - gpio_free(PMIC_GPIO_TDISC); - gpio_free(GPIO_JOYSTICK_EN); -} - -static int tdisc_shinetsu_enable(void) -{ - int i, rc = -EINVAL; - - for (i = 0; i < ARRAY_SIZE(vregs_tdisc_name); i++) { - rc = regulator_enable(vregs_tdisc[i]); - if (rc < 0) { - printk(KERN_ERR "%s: vreg %s enable failed (%d)\n", - __func__, vregs_tdisc_name[i], rc); - goto vreg_fail; - } - } - - /* Enable the OE (output enable) gpio */ - gpio_set_value_cansleep(GPIO_JOYSTICK_EN, 1); - /* voltage and gpio stabilization delay */ - msleep(50); - - return 0; -vreg_fail: - while (i) - regulator_disable(vregs_tdisc[--i]); - return rc; -} - -static int tdisc_shinetsu_disable(void) -{ - int i, rc; - - for (i = 0; i < ARRAY_SIZE(vregs_tdisc_name); i++) { - rc = regulator_disable(vregs_tdisc[i]); - if (rc < 0) { - printk(KERN_ERR "%s: vreg %s disable failed (%d)\n", - __func__, vregs_tdisc_name[i], rc); - goto tdisc_reg_fail; - } - } - - /* Disable the OE (output enable) gpio */ - gpio_set_value_cansleep(GPIO_JOYSTICK_EN, 0); - - return 0; - -tdisc_reg_fail: - while (i) - regulator_enable(vregs_tdisc[--i]); - return rc; -} - -static struct tdisc_abs_values tdisc_abs = { - .x_max = 32, - .y_max = 32, - .x_min = -32, - .y_min = -32, - .pressure_max = 32, - .pressure_min = 0, -}; - -static struct tdisc_platform_data tdisc_data = { - .tdisc_setup = tdisc_shinetsu_setup, - .tdisc_release = tdisc_shinetsu_release, - .tdisc_enable = tdisc_shinetsu_enable, - .tdisc_disable = tdisc_shinetsu_disable, - .tdisc_wakeup = 0, - .tdisc_gpio = PMIC_GPIO_TDISC, - .tdisc_report_keys = true, - .tdisc_report_relative = true, - .tdisc_report_absolute = false, - .tdisc_report_wheel = false, - .tdisc_reverse_x = false, - .tdisc_reverse_y = true, - .tdisc_abs = &tdisc_abs, -}; - -static struct i2c_board_info msm_i2c_gsbi3_tdisc_info[] = { - { - I2C_BOARD_INFO("vtd518", TDISC_I2C_SLAVE_ADDR), - .irq = TDISC_INT, - .platform_data = &tdisc_data, - }, -}; -#endif - -#define PM_GPIO_CDC_RST_N 20 -#define GPIO_CDC_RST_N PM8058_GPIO_PM_TO_SYS(PM_GPIO_CDC_RST_N) - -static struct regulator *vreg_timpani_1; -static struct regulator *vreg_timpani_2; - -static unsigned int msm_timpani_setup_power(void) -{ - int rc; - - vreg_timpani_1 = regulator_get(NULL, "8058_l0"); - if (IS_ERR(vreg_timpani_1)) { - pr_err("%s: Unable to get 8058_l0\n", __func__); - return -ENODEV; - } - - vreg_timpani_2 = regulator_get(NULL, "8058_s3"); - if (IS_ERR(vreg_timpani_2)) { - pr_err("%s: Unable to get 8058_s3\n", __func__); - regulator_put(vreg_timpani_1); - return -ENODEV; - } - - rc = regulator_set_voltage(vreg_timpani_1, 1200000, 1200000); - if (rc) { - pr_err("%s: unable to set L0 voltage to 1.2V\n", __func__); - goto fail; - } - - rc = regulator_set_voltage(vreg_timpani_2, 1800000, 1800000); - if (rc) { - pr_err("%s: unable to set S3 voltage to 1.8V\n", __func__); - goto fail; - } - - rc = regulator_enable(vreg_timpani_1); - if (rc) { - pr_err("%s: Enable regulator 8058_l0 failed\n", __func__); - goto fail; - } - - /* The settings for LDO0 should be set such that - * it doesn't require to reset the timpani. */ - rc = regulator_set_optimum_mode(vreg_timpani_1, 5000); - if (rc < 0) { - pr_err("Timpani regulator optimum mode setting failed\n"); - goto fail; - } - - rc = regulator_enable(vreg_timpani_2); - if (rc) { - pr_err("%s: Enable regulator 8058_s3 failed\n", __func__); - regulator_disable(vreg_timpani_1); - goto fail; - } - - rc = gpio_request(GPIO_CDC_RST_N, "CDC_RST_N"); - if (rc) { - pr_err("%s: GPIO Request %d failed\n", __func__, - GPIO_CDC_RST_N); - regulator_disable(vreg_timpani_1); - regulator_disable(vreg_timpani_2); - goto fail; - } else { - gpio_direction_output(GPIO_CDC_RST_N, 1); - usleep_range(1000, 1050); - gpio_direction_output(GPIO_CDC_RST_N, 0); - usleep_range(1000, 1050); - gpio_direction_output(GPIO_CDC_RST_N, 1); - gpio_free(GPIO_CDC_RST_N); - } - return rc; - -fail: - regulator_put(vreg_timpani_1); - regulator_put(vreg_timpani_2); - return rc; -} - -static void msm_timpani_shutdown_power(void) -{ - int rc; - - rc = regulator_disable(vreg_timpani_1); - if (rc) - pr_err("%s: Disable regulator 8058_l0 failed\n", __func__); - - regulator_put(vreg_timpani_1); - - rc = regulator_disable(vreg_timpani_2); - if (rc) - pr_err("%s: Disable regulator 8058_s3 failed\n", __func__); - - regulator_put(vreg_timpani_2); -} - -/* Power analog function of codec */ -static struct regulator *vreg_timpani_cdc_apwr; -static int msm_timpani_codec_power(int vreg_on) -{ - int rc = 0; - - if (!vreg_timpani_cdc_apwr) { - - vreg_timpani_cdc_apwr = regulator_get(NULL, "8058_s4"); - - if (IS_ERR(vreg_timpani_cdc_apwr)) { - pr_err("%s: vreg_get failed (%ld)\n", - __func__, PTR_ERR(vreg_timpani_cdc_apwr)); - rc = PTR_ERR(vreg_timpani_cdc_apwr); - return rc; - } - } - - if (vreg_on) { - - rc = regulator_set_voltage(vreg_timpani_cdc_apwr, - 2200000, 2200000); - if (rc) { - pr_err("%s: unable to set 8058_s4 voltage to 2.2 V\n", - __func__); - goto vreg_fail; - } - - rc = regulator_enable(vreg_timpani_cdc_apwr); - if (rc) { - pr_err("%s: vreg_enable failed %d\n", __func__, rc); - goto vreg_fail; - } - } else { - rc = regulator_disable(vreg_timpani_cdc_apwr); - if (rc) { - pr_err("%s: vreg_disable failed %d\n", - __func__, rc); - goto vreg_fail; - } - } - - return 0; - -vreg_fail: - regulator_put(vreg_timpani_cdc_apwr); - vreg_timpani_cdc_apwr = NULL; - return rc; -} - -static struct marimba_codec_platform_data timpani_codec_pdata = { - .marimba_codec_power = msm_timpani_codec_power, -}; - -#define TIMPANI_SLAVE_ID_CDC_ADDR 0X77 -#define TIMPANI_SLAVE_ID_QMEMBIST_ADDR 0X66 - -static struct marimba_platform_data timpani_pdata = { - .slave_id[MARIMBA_SLAVE_ID_CDC] = TIMPANI_SLAVE_ID_CDC_ADDR, - .slave_id[MARIMBA_SLAVE_ID_QMEMBIST] = TIMPANI_SLAVE_ID_QMEMBIST_ADDR, - .marimba_setup = msm_timpani_setup_power, - .marimba_shutdown = msm_timpani_shutdown_power, - .codec = &timpani_codec_pdata, - .tsadc_ssbi_adap = MARIMBA_SSBI_ADAP, -}; - -#define TIMPANI_I2C_SLAVE_ADDR 0xD - -static struct i2c_board_info msm_i2c_gsbi7_timpani_info[] = { - { - I2C_BOARD_INFO("timpani", TIMPANI_I2C_SLAVE_ADDR), - .platform_data = &timpani_pdata, - }, -}; - -#ifdef CONFIG_SND_SOC_WM8903 -static struct wm8903_platform_data wm8903_pdata = { - .gpio_cfg[2] = 0x3A8, -}; - -#define WM8903_I2C_SLAVE_ADDR 0x34 -static struct i2c_board_info wm8903_codec_i2c_info[] = { - { - I2C_BOARD_INFO("wm8903", WM8903_I2C_SLAVE_ADDR >> 1), - .platform_data = &wm8903_pdata, - }, -}; -#endif -#ifdef CONFIG_PMIC8901 - -#define PM8901_GPIO_INT 91 -/* - * Consumer specific regulator names: - * regulator name consumer dev_name - */ -static struct regulator_consumer_supply vreg_consumers_8901_USB_OTG[] = { - REGULATOR_SUPPLY("8901_usb_otg", NULL), -}; -static struct regulator_consumer_supply vreg_consumers_8901_HDMI_MVS[] = { - REGULATOR_SUPPLY("8901_hdmi_mvs", NULL), -}; - -#define PM8901_VREG_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, \ - _always_on) \ - { \ - .init_data = { \ - .constraints = { \ - .valid_modes_mask = _modes, \ - .valid_ops_mask = _ops, \ - .min_uV = _min_uV, \ - .max_uV = _max_uV, \ - .input_uV = _min_uV, \ - .apply_uV = _apply_uV, \ - .always_on = _always_on, \ - }, \ - .consumer_supplies = vreg_consumers_8901_##_id, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_8901_##_id), \ - }, \ - .id = PM8901_VREG_ID_##_id, \ - } - -#define PM8901_VREG_INIT_VS(_id) \ - PM8901_VREG_INIT(_id, 0, 0, REGULATOR_MODE_NORMAL, \ - REGULATOR_CHANGE_STATUS, 0, 0) - -static struct pm8901_vreg_pdata pm8901_vreg_init[] = { - PM8901_VREG_INIT_VS(USB_OTG), - PM8901_VREG_INIT_VS(HDMI_MVS), -}; - -static struct pm8xxx_misc_platform_data pm8901_misc_pdata = { - .priority = 1, -}; - -static struct pm8xxx_irq_platform_data pm8901_irq_pdata = { - .irq_base = PM8901_IRQ_BASE, - .devirq = MSM_GPIO_TO_INT(PM8901_GPIO_INT), - .irq_trigger_flag = IRQF_TRIGGER_LOW, -}; - -static struct pm8xxx_mpp_platform_data pm8901_mpp_pdata = { - .mpp_base = PM8901_MPP_PM_TO_SYS(0), -}; - -static struct pm8901_platform_data pm8901_platform_data = { - .irq_pdata = &pm8901_irq_pdata, - .mpp_pdata = &pm8901_mpp_pdata, - .regulator_pdatas = pm8901_vreg_init, - .num_regulators = ARRAY_SIZE(pm8901_vreg_init), - .misc_pdata = &pm8901_misc_pdata, -}; - -static struct msm_ssbi_platform_data msm8x60_ssbi_pm8901_pdata = { - .controller_type = MSM_SBI_CTRL_PMIC_ARBITER, - .slave = { - .name = "pm8901-core", - .platform_data = &pm8901_platform_data, - }, -}; -#endif /* CONFIG_PMIC8901 */ - -#if defined(CONFIG_MARIMBA_CORE) && (defined(CONFIG_GPIO_SX150X) \ - || defined(CONFIG_GPIO_SX150X_MODULE)) - -static struct regulator *vreg_bahama; -static int msm_bahama_sys_rst = GPIO_MS_SYS_RESET_N; - -struct bahama_config_register{ - u8 reg; - u8 value; - u8 mask; -}; - -enum version{ - VER_1_0, - VER_2_0, - VER_UNSUPPORTED = 0xFF -}; - -static u8 read_bahama_ver(void) -{ - int rc; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA }; - u8 bahama_version; - - rc = marimba_read_bit_mask(&config, 0x00, &bahama_version, 1, 0x1F); - if (rc < 0) { - printk(KERN_ERR - "%s: version read failed: %d\n", - __func__, rc); - return VER_UNSUPPORTED; - } else { - printk(KERN_INFO - "%s: version read got: 0x%x\n", - __func__, bahama_version); - } - - switch (bahama_version) { - case 0x08: /* varient of bahama v1 */ - case 0x10: - case 0x00: - return VER_1_0; - case 0x09: /* variant of bahama v2 */ - return VER_2_0; - default: - return VER_UNSUPPORTED; - } -} - -static int msm_bahama_setup_power_enable; -static unsigned int msm_bahama_setup_power(void) -{ - int rc = 0; - const char *msm_bahama_regulator = "8058_s3"; - - if (machine_is_msm8x60_dragon()) - msm_bahama_sys_rst = GPIO_CDC_RST_N; - - vreg_bahama = regulator_get(NULL, msm_bahama_regulator); - - if (IS_ERR(vreg_bahama)) { - rc = PTR_ERR(vreg_bahama); - pr_err("%s: regulator_get %s = %d\n", __func__, - msm_bahama_regulator, rc); - return rc; - } - - rc = regulator_set_voltage(vreg_bahama, 1800000, 1800000); - if (rc) { - pr_err("%s: regulator_set_voltage %s = %d\n", __func__, - msm_bahama_regulator, rc); - goto unget; - } - - rc = regulator_enable(vreg_bahama); - if (rc) { - pr_err("%s: regulator_enable %s = %d\n", __func__, - msm_bahama_regulator, rc); - goto unget; - } - - rc = gpio_request(msm_bahama_sys_rst, "bahama sys_rst_n"); - if (rc) { - pr_err("%s: gpio_request %d = %d\n", __func__, - msm_bahama_sys_rst, rc); - goto unenable; - } - - gpio_direction_output(msm_bahama_sys_rst, 0); - usleep_range(1000, 1050); - gpio_set_value_cansleep(msm_bahama_sys_rst, 1); - usleep_range(1000, 1050); - msm_bahama_setup_power_enable = 1; - return rc; - -unenable: - regulator_disable(vreg_bahama); -unget: - regulator_put(vreg_bahama); - return rc; -}; - -static unsigned int msm_bahama_shutdown_power(int value) -{ - if (msm_bahama_setup_power_enable) { - gpio_set_value_cansleep(msm_bahama_sys_rst, 0); - gpio_free(msm_bahama_sys_rst); - regulator_disable(vreg_bahama); - regulator_put(vreg_bahama); - msm_bahama_setup_power_enable = 0; - } - - return 0; -}; - -static unsigned int msm_bahama_core_config(int type) -{ - int rc = 0; - - if (type == BAHAMA_ID) { - - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA }; - - const struct bahama_config_register v20_init[] = { - /* reg, value, mask */ - { 0xF4, 0x84, 0xFF }, /* AREG */ - { 0xF0, 0x04, 0xFF } /* DREG */ - }; - - if (read_bahama_ver() == VER_2_0) { - for (i = 0; i < ARRAY_SIZE(v20_init); i++) { - u8 value = v20_init[i].value; - rc = marimba_write_bit_mask(&config, - v20_init[i].reg, - &value, - sizeof(v20_init[i].value), - v20_init[i].mask); - if (rc < 0) { - printk(KERN_ERR - "%s: reg %d write failed: %d\n", - __func__, v20_init[i].reg, rc); - return rc; - } - printk(KERN_INFO "%s: reg 0x%02x value 0x%02x" - " mask 0x%02x\n", - __func__, v20_init[i].reg, - v20_init[i].value, v20_init[i].mask); - } - } - } - printk(KERN_INFO "core type: %d\n", type); - - return rc; -} - -static struct regulator *fm_regulator_s3; -static struct msm_xo_voter *fm_clock; - -static int fm_radio_setup(struct marimba_fm_platform_data *pdata) -{ - int rc = 0; - struct pm_gpio cfg = { - .direction = PM_GPIO_DIR_IN, - .pull = PM_GPIO_PULL_NO, - .vin_sel = PM8058_GPIO_VIN_S3, - .function = PM_GPIO_FUNC_NORMAL, - .inv_int_pol = 0, - }; - - if (!fm_regulator_s3) { - fm_regulator_s3 = regulator_get(NULL, "8058_s3"); - if (IS_ERR(fm_regulator_s3)) { - rc = PTR_ERR(fm_regulator_s3); - printk(KERN_ERR "%s: regulator get s3 (%d)\n", - __func__, rc); - goto out; - } - } - - - rc = regulator_set_voltage(fm_regulator_s3, 1800000, 1800000); - if (rc < 0) { - printk(KERN_ERR "%s: regulator set voltage failed (%d)\n", - __func__, rc); - goto fm_fail_put; - } - - rc = regulator_enable(fm_regulator_s3); - if (rc < 0) { - printk(KERN_ERR "%s: regulator s3 enable failed (%d)\n", - __func__, rc); - goto fm_fail_put; - } - - /*Vote for XO clock*/ - fm_clock = msm_xo_get(MSM_XO_TCXO_D0, "fm_power"); - - if (IS_ERR(fm_clock)) { - rc = PTR_ERR(fm_clock); - printk(KERN_ERR "%s: Couldn't get TCXO_D0 vote for FM (%d)\n", - __func__, rc); - goto fm_fail_switch; - } - - rc = msm_xo_mode_vote(fm_clock, MSM_XO_MODE_ON); - if (rc < 0) { - printk(KERN_ERR "%s: Failed to vote for TCX0_D0 ON (%d)\n", - __func__, rc); - goto fm_fail_vote; - } - - /*GPIO 18 on PMIC is FM_IRQ*/ - rc = pm8xxx_gpio_config(PM8058_GPIO_PM_TO_SYS(FM_GPIO), &cfg); - if (rc) { - printk(KERN_ERR "%s: return val of pm8xxx_gpio_config: %d\n", - __func__, rc); - goto fm_fail_clock; - } - goto out; - -fm_fail_clock: - msm_xo_mode_vote(fm_clock, MSM_XO_MODE_OFF); -fm_fail_vote: - msm_xo_put(fm_clock); -fm_fail_switch: - regulator_disable(fm_regulator_s3); -fm_fail_put: - regulator_put(fm_regulator_s3); -out: - return rc; -}; - -static void fm_radio_shutdown(struct marimba_fm_platform_data *pdata) -{ - int rc = 0; - if (fm_regulator_s3 != NULL) { - rc = regulator_disable(fm_regulator_s3); - if (rc < 0) { - printk(KERN_ERR "%s: regulator s3 disable (%d)\n", - __func__, rc); - } - regulator_put(fm_regulator_s3); - fm_regulator_s3 = NULL; - } - printk(KERN_ERR "%s: Voting off for XO", __func__); - - if (fm_clock != NULL) { - rc = msm_xo_mode_vote(fm_clock, MSM_XO_MODE_OFF); - if (rc < 0) { - printk(KERN_ERR "%s: Voting off XO clock (%d)\n", - __func__, rc); - } - msm_xo_put(fm_clock); - } - printk(KERN_ERR "%s: coming out of fm_radio_shutdown", __func__); -} - -/* Slave id address for FM/CDC/QMEMBIST - * Values can be programmed using Marimba slave id 0 - * should there be a conflict with other I2C devices - * */ -#define BAHAMA_SLAVE_ID_FM_ADDR 0x2A -#define BAHAMA_SLAVE_ID_QMEMBIST_ADDR 0x7B - -static struct marimba_fm_platform_data marimba_fm_pdata = { - .fm_setup = fm_radio_setup, - .fm_shutdown = fm_radio_shutdown, - .irq = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, FM_GPIO), - .is_fm_soc_i2s_master = false, - .config_i2s_gpio = NULL, -}; - -/* -Just initializing the BAHAMA related slave -*/ -static struct marimba_platform_data marimba_pdata = { - .slave_id[SLAVE_ID_BAHAMA_FM] = BAHAMA_SLAVE_ID_FM_ADDR, - .slave_id[SLAVE_ID_BAHAMA_QMEMBIST] = BAHAMA_SLAVE_ID_QMEMBIST_ADDR, - .bahama_setup = msm_bahama_setup_power, - .bahama_shutdown = msm_bahama_shutdown_power, - .bahama_core_config = msm_bahama_core_config, - .fm = &marimba_fm_pdata, - .tsadc_ssbi_adap = MARIMBA_SSBI_ADAP, -}; - - -static struct i2c_board_info msm_marimba_board_info[] = { - { - I2C_BOARD_INFO("marimba", 0xc), - .platform_data = &marimba_pdata, - } -}; -#endif /* CONFIG_MAIMBA_CORE */ - -#ifdef CONFIG_I2C -#define I2C_SURF 1 -#define I2C_FFA (1 << 1) -#define I2C_RUMI (1 << 2) -#define I2C_SIM (1 << 3) -#define I2C_FLUID (1 << 4) -#define I2C_DRAGON (1 << 5) - -struct i2c_registry { - u8 machs; - int bus; - struct i2c_board_info *info; - int len; -}; - -static struct i2c_registry msm8x60_i2c_devices[] __initdata = { -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - { - I2C_SURF | I2C_FFA | I2C_DRAGON, - MSM_GSBI8_QUP_I2C_BUS_ID, - core_expander_i2c_info, - ARRAY_SIZE(core_expander_i2c_info), - }, - { - I2C_SURF | I2C_FFA | I2C_DRAGON, - MSM_GSBI8_QUP_I2C_BUS_ID, - docking_expander_i2c_info, - ARRAY_SIZE(docking_expander_i2c_info), - }, - { - I2C_SURF, - MSM_GSBI8_QUP_I2C_BUS_ID, - surf_expanders_i2c_info, - ARRAY_SIZE(surf_expanders_i2c_info), - }, - { - I2C_SURF | I2C_FFA | I2C_DRAGON, - MSM_GSBI3_QUP_I2C_BUS_ID, - fha_expanders_i2c_info, - ARRAY_SIZE(fha_expanders_i2c_info), - }, - { - I2C_FLUID, - MSM_GSBI3_QUP_I2C_BUS_ID, - fluid_expanders_i2c_info, - ARRAY_SIZE(fluid_expanders_i2c_info), - }, - { - I2C_FLUID, - MSM_GSBI8_QUP_I2C_BUS_ID, - fluid_core_expander_i2c_info, - ARRAY_SIZE(fluid_core_expander_i2c_info), - }, -#endif -#if defined(CONFIG_TOUCHDISC_VTD518_SHINETSU) || \ - defined(CONFIG_TOUCHDISC_VTD518_SHINETSU_MODULE) - { - I2C_SURF | I2C_FFA | I2C_FLUID | I2C_DRAGON, - MSM_GSBI3_QUP_I2C_BUS_ID, - msm_i2c_gsbi3_tdisc_info, - ARRAY_SIZE(msm_i2c_gsbi3_tdisc_info), - }, -#endif - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_GSBI3_QUP_I2C_BUS_ID, - cy8ctmg200_board_info, - ARRAY_SIZE(cy8ctmg200_board_info), - }, - { - I2C_DRAGON, - MSM_GSBI3_QUP_I2C_BUS_ID, - cy8ctma340_dragon_board_info, - ARRAY_SIZE(cy8ctma340_dragon_board_info), - }, -#if defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC) || \ - defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC_MODULE) - { - I2C_FLUID, - MSM_GSBI3_QUP_I2C_BUS_ID, - cyttsp_fluid_info, - ARRAY_SIZE(cyttsp_fluid_info), - }, - { - I2C_FFA | I2C_SURF, - MSM_GSBI3_QUP_I2C_BUS_ID, - cyttsp_ffa_info, - ARRAY_SIZE(cyttsp_ffa_info), - }, -#endif -#ifdef CONFIG_MSM_CAMERA -#ifndef CONFIG_MSM_CAMERA_V4L2 - { - I2C_SURF | I2C_FFA | I2C_FLUID , - MSM_GSBI4_QUP_I2C_BUS_ID, - msm_camera_boardinfo, - ARRAY_SIZE(msm_camera_boardinfo), - }, - { - I2C_DRAGON, - MSM_GSBI4_QUP_I2C_BUS_ID, - msm_camera_dragon_boardinfo, - ARRAY_SIZE(msm_camera_dragon_boardinfo), - }, -#endif -#endif - { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_GSBI7_QUP_I2C_BUS_ID, - msm_i2c_gsbi7_timpani_info, - ARRAY_SIZE(msm_i2c_gsbi7_timpani_info), - }, -#if defined(CONFIG_MARIMBA_CORE) - { - I2C_SURF | I2C_FFA | I2C_FLUID | I2C_DRAGON, - MSM_GSBI7_QUP_I2C_BUS_ID, - msm_marimba_board_info, - ARRAY_SIZE(msm_marimba_board_info), - }, -#endif /* CONFIG_MARIMBA_CORE */ -#ifdef CONFIG_ISL9519_CHARGER - { - I2C_SURF | I2C_FFA, - MSM_GSBI8_QUP_I2C_BUS_ID, - isl_charger_i2c_info, - ARRAY_SIZE(isl_charger_i2c_info), - }, -#endif -#if defined(CONFIG_HAPTIC_ISA1200) || \ - defined(CONFIG_HAPTIC_ISA1200_MODULE) - { - I2C_FLUID, - MSM_GSBI8_QUP_I2C_BUS_ID, - msm_isa1200_board_info, - ARRAY_SIZE(msm_isa1200_board_info), - }, -#endif -#if defined(CONFIG_SMB137B_CHARGER) || defined(CONFIG_SMB137B_CHARGER_MODULE) - { - I2C_FLUID, - MSM_GSBI8_QUP_I2C_BUS_ID, - smb137b_charger_i2c_info, - ARRAY_SIZE(smb137b_charger_i2c_info), - }, -#endif -#if defined(CONFIG_BATTERY_BQ27520) || \ - defined(CONFIG_BATTERY_BQ27520_MODULE) - { - I2C_FLUID, - MSM_GSBI8_QUP_I2C_BUS_ID, - msm_bq27520_board_info, - ARRAY_SIZE(msm_bq27520_board_info), - }, -#endif -#if defined(CONFIG_SND_SOC_WM8903) || defined(CONFIG_SND_SOC_WM8903_MODULE) - { - I2C_DRAGON, - MSM_GSBI8_QUP_I2C_BUS_ID, - wm8903_codec_i2c_info, - ARRAY_SIZE(wm8903_codec_i2c_info), - }, -#endif -}; -#endif /* CONFIG_I2C */ - -static void __init fixup_i2c_configs(void) -{ -#ifdef CONFIG_I2C -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) - sx150x_data[SX150X_CORE].irq_summary = - PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT2_N); - else if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa() || - machine_is_msm8x60_dragon()) - sx150x_data[SX150X_CORE].irq_summary = - PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT1_N); - else if (machine_is_msm8x60_fluid()) - sx150x_data[SX150X_CORE_FLUID].irq_summary = - PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT1_N); -#endif -#endif -} - -static void __init register_i2c_devices(void) -{ -#ifdef CONFIG_I2C - u8 mach_mask = 0; - int i; -#ifdef CONFIG_MSM_CAMERA_V4L2 - struct i2c_registry msm8x60_camera_i2c_devices = { - I2C_SURF | I2C_FFA | I2C_FLUID, - MSM_GSBI4_QUP_I2C_BUS_ID, - msm8x60_camera_board_info.board_info, - msm8x60_camera_board_info.num_i2c_board_info, - }; -#endif - - /* Build the matching 'supported_machs' bitmask */ - if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) - mach_mask = I2C_SURF; - else if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa()) - mach_mask = I2C_FFA; - else if (machine_is_msm8x60_fluid()) - mach_mask = I2C_FLUID; - else if (machine_is_msm8x60_dragon()) - mach_mask = I2C_DRAGON; - else - pr_err("unmatched machine ID in register_i2c_devices\n"); - - /* Run the array and install devices as appropriate */ - for (i = 0; i < ARRAY_SIZE(msm8x60_i2c_devices); ++i) { - if (msm8x60_i2c_devices[i].machs & mach_mask) - i2c_register_board_info(msm8x60_i2c_devices[i].bus, - msm8x60_i2c_devices[i].info, - msm8x60_i2c_devices[i].len); - } -#ifdef CONFIG_MSM_CAMERA_V4L2 - if (msm8x60_camera_i2c_devices.machs & mach_mask) - i2c_register_board_info(msm8x60_camera_i2c_devices.bus, - msm8x60_camera_i2c_devices.info, - msm8x60_camera_i2c_devices.len); -#endif -#endif -} - -static void __init msm8x60_init_uart12dm(void) -{ -#if !defined(CONFIG_USB_PEHCI_HCD) && !defined(CONFIG_USB_PEHCI_HCD_MODULE) - /* 0x1D000000 now belongs to EBI2:CS3 i.e. USB ISP Controller */ - void *fpga_mem = ioremap_nocache(0x1D000000, SZ_4K); - - if (!fpga_mem) - pr_err("%s(): Error getting memory\n", __func__); - - /* Advanced mode */ - writew(0xFFFF, fpga_mem + 0x15C); - /* FPGA_UART_SEL */ - writew(0, fpga_mem + 0x172); - /* FPGA_GPIO_CONFIG_117 */ - writew(1, fpga_mem + 0xEA); - /* FPGA_GPIO_CONFIG_118 */ - writew(1, fpga_mem + 0xEC); - mb(); - iounmap(fpga_mem); -#endif -} - -#define MSM_GSBI9_PHYS 0x19900000 -#define GSBI_DUAL_MODE_CODE 0x60 - -static void __init msm8x60_init_buses(void) -{ -#ifdef CONFIG_I2C_QUP - void *gsbi_mem = ioremap_nocache(0x19C00000, 4); - /* Setting protocol code to 0x60 for dual UART/I2C in GSBI12 */ - writel_relaxed(0x6 << 4, gsbi_mem); - /* Ensure protocol code is written before proceeding further */ - mb(); - iounmap(gsbi_mem); - - msm_gsbi3_qup_i2c_device.dev.platform_data = &msm_gsbi3_qup_i2c_pdata; - msm_gsbi4_qup_i2c_device.dev.platform_data = &msm_gsbi4_qup_i2c_pdata; - msm_gsbi7_qup_i2c_device.dev.platform_data = &msm_gsbi7_qup_i2c_pdata; - msm_gsbi8_qup_i2c_device.dev.platform_data = &msm_gsbi8_qup_i2c_pdata; - -#ifdef CONFIG_MSM_GSBI9_UART - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - /* Setting protocol code to 0x60 for dual UART/I2C in GSBI9 */ - gsbi_mem = ioremap_nocache(MSM_GSBI9_PHYS, 4); - writel_relaxed(GSBI_DUAL_MODE_CODE, gsbi_mem); - iounmap(gsbi_mem); - msm_gsbi9_qup_i2c_pdata.use_gsbi_shared_mode = 1; - } -#endif - msm_gsbi9_qup_i2c_device.dev.platform_data = &msm_gsbi9_qup_i2c_pdata; - msm_gsbi12_qup_i2c_device.dev.platform_data = &msm_gsbi12_qup_i2c_pdata; -#endif -#if defined(CONFIG_SPI_QUP) || defined(CONFIG_SPI_QUP_MODULE) - msm_gsbi1_qup_spi_device.dev.platform_data = &msm_gsbi1_qup_spi_pdata; -#endif -#ifdef CONFIG_I2C_SSBI - msm_device_ssbi3.dev.platform_data = &msm_ssbi3_pdata; -#endif - -#ifdef CONFIG_MSM_SSBI - msm_device_ssbi_pmic1.dev.platform_data = - &msm8x60_ssbi_pm8058_pdata; - msm_device_ssbi_pmic2.dev.platform_data = - &msm8x60_ssbi_pm8901_pdata; -#endif - - if (machine_is_msm8x60_fluid()) { -#if (defined(CONFIG_USB_EHCI_MSM_72K) && \ - (defined(CONFIG_SMB137B_CHARGER) || \ - defined(CONFIG_SMB137B_CHARGER_MODULE))) - msm_otg_pdata.vbus_power = msm_hsusb_smb137b_vbus_power; -#endif -#if defined(CONFIG_SPI_QUP) || defined(CONFIG_SPI_QUP_MODULE) - msm_gsbi10_qup_spi_device.dev.platform_data = - &msm_gsbi10_qup_spi_pdata; -#endif - } - -#if defined(CONFIG_USB_MSM_72K) || defined(CONFIG_USB_EHCI_HCD) - /* - * We can not put USB regulators (8058_l6 and 8058_l7) in LPM - * when we depend on USB PHY for VBUS/ID notifications. VBUS - * and ID notifications are available only on V2 surf and FFA - * with a hardware workaround. - */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2 && - (machine_is_msm8x60_surf() || - (machine_is_msm8x60_ffa() && - pmic_id_notif_supported))) - msm_otg_pdata.phy_can_powercollapse = 1; - msm_device_otg.dev.platform_data = &msm_otg_pdata; -#endif - -#ifdef CONFIG_USB_MSM_72K - msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; -#endif - -#ifdef CONFIG_SERIAL_MSM_HS - msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(54); /* GSBI6(2) */ - msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata; -#endif -#ifdef CONFIG_MSM_GSBI9_UART - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - msm_device_uart_gsbi9 = msm_add_gsbi9_uart(); - if (IS_ERR(msm_device_uart_gsbi9)) - pr_err("%s(): Failed to create uart gsbi9 device\n", - __func__); - } -#endif - -#ifdef CONFIG_MSM_BUS_SCALING - - /* RPM calls are only enabled on V2 */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) { - msm_bus_apps_fabric_pdata.rpm_enabled = 1; - msm_bus_sys_fabric_pdata.rpm_enabled = 1; - msm_bus_mm_fabric_pdata.rpm_enabled = 1; - msm_bus_sys_fpb_pdata.rpm_enabled = 1; - msm_bus_cpss_fpb_pdata.rpm_enabled = 1; - } - - msm_bus_apps_fabric.dev.platform_data = &msm_bus_apps_fabric_pdata; - msm_bus_sys_fabric.dev.platform_data = &msm_bus_sys_fabric_pdata; - msm_bus_mm_fabric.dev.platform_data = &msm_bus_mm_fabric_pdata; - msm_bus_sys_fpb.dev.platform_data = &msm_bus_sys_fpb_pdata; - msm_bus_cpss_fpb.dev.platform_data = &msm_bus_cpss_fpb_pdata; -#endif -} - -static void __init msm8x60_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_msm8x60_io(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - -} - -/* - * Most segments of the EBI2 bus are disabled by default. - */ -static void __init msm8x60_init_ebi2(void) -{ - uint32_t ebi2_cfg; - void *ebi2_cfg_ptr; - struct clk *mem_clk = clk_get_sys("msm_ebi2", "mem_clk"); - - if (IS_ERR(mem_clk)) { - pr_err("%s: clk_get_sys(%s,%s), failed", __func__, - "msm_ebi2", "mem_clk"); - return; - } - clk_prepare_enable(mem_clk); - clk_put(mem_clk); - - ebi2_cfg_ptr = ioremap_nocache(0x1a100000, sizeof(uint32_t)); - if (ebi2_cfg_ptr != 0) { - ebi2_cfg = readl_relaxed(ebi2_cfg_ptr); - - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fluid() || - machine_is_msm8x60_dragon()) - ebi2_cfg |= (1 << 4) | (1 << 5); /* CS2, CS3 */ - - writel_relaxed(ebi2_cfg, ebi2_cfg_ptr); - iounmap(ebi2_cfg_ptr); - } - - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fluid() || machine_is_msm8x60_dragon()) { - ebi2_cfg_ptr = ioremap_nocache(0x1a110000, SZ_4K); - if (ebi2_cfg_ptr != 0) { - /* EBI2_XMEM_CFG:PWRSAVE_MODE off */ - writel_relaxed(0UL, ebi2_cfg_ptr); - - /* CS2: Delay 9 cycles (140ns@64MHz) between SMSC - * LAN9221 Ethernet controller reads and writes. - * The lowest 4 bits are the read delay, the next - * 4 are the write delay. */ - writel_relaxed(0x031F1C99, ebi2_cfg_ptr + 0x10); -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - /* - * RECOVERY=5, HOLD_WR=1 - * INIT_LATENCY_WR=1, INIT_LATENCY_RD=1 - * WAIT_WR=1, WAIT_RD=2 - */ - writel_relaxed(0x51010112, ebi2_cfg_ptr + 0x14); - /* - * HOLD_RD=1 - * ADV_OE_RECOVERY=0, ADDR_HOLD_ENA=1 - */ - writel_relaxed(0x01000020, ebi2_cfg_ptr + 0x34); -#else - /* EBI2 CS3 muxed address/data, - * two cyc addr enable */ - writel_relaxed(0xA3030020, ebi2_cfg_ptr + 0x34); - -#endif - iounmap(ebi2_cfg_ptr); - } - } -} - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC5_SUPPORT)) - -/* 8x60 has 5 SDCC controllers */ -#define MAX_SDCC_CONTROLLER 5 - -struct msm_sdcc_gpio { - /* maximum 10 GPIOs per SDCC controller */ - s16 no; - /* name of this GPIO */ - const char *name; - bool always_on; - bool is_enabled; -}; - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct msm_sdcc_gpio sdc1_gpio_cfg[] = { - {159, "sdc1_dat_0"}, - {160, "sdc1_dat_1"}, - {161, "sdc1_dat_2"}, - {162, "sdc1_dat_3"}, -#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT - {163, "sdc1_dat_4"}, - {164, "sdc1_dat_5"}, - {165, "sdc1_dat_6"}, - {166, "sdc1_dat_7"}, -#endif - {167, "sdc1_clk"}, - {168, "sdc1_cmd"} -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct msm_sdcc_gpio sdc2_gpio_cfg[] = { - {143, "sdc2_dat_0"}, - {144, "sdc2_dat_1", 1}, - {145, "sdc2_dat_2"}, - {146, "sdc2_dat_3"}, -#ifdef CONFIG_MMC_MSM_SDC2_8_BIT_SUPPORT - {147, "sdc2_dat_4"}, - {148, "sdc2_dat_5"}, - {149, "sdc2_dat_6"}, - {150, "sdc2_dat_7"}, -#endif - {151, "sdc2_cmd"}, - {152, "sdc2_clk", 1} -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT -static struct msm_sdcc_gpio sdc5_gpio_cfg[] = { - {95, "sdc5_cmd"}, - {96, "sdc5_dat_3"}, - {97, "sdc5_clk", 1}, - {98, "sdc5_dat_2"}, - {99, "sdc5_dat_1", 1}, - {100, "sdc5_dat_0"} -}; -#endif - -struct msm_sdcc_pad_pull_cfg { - enum msm_tlmm_pull_tgt pull; - u32 pull_val; -}; - -struct msm_sdcc_pad_drv_cfg { - enum msm_tlmm_hdrive_tgt drv; - u32 drv_val; -}; - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct msm_sdcc_pad_drv_cfg sdc3_pad_on_drv_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA} -}; - -static struct msm_sdcc_pad_pull_cfg sdc3_pad_on_pull_cfg[] = { - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_sdcc_pad_drv_cfg sdc3_pad_off_drv_cfg[] = { - {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA} -}; - -static struct msm_sdcc_pad_pull_cfg sdc3_pad_off_pull_cfg[] = { - {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_DOWN}, - {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_DOWN} -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct msm_sdcc_pad_drv_cfg sdc4_pad_on_drv_cfg[] = { - {TLMM_HDRV_SDC4_CLK, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC4_CMD, GPIO_CFG_8MA}, - {TLMM_HDRV_SDC4_DATA, GPIO_CFG_8MA} -}; - -static struct msm_sdcc_pad_pull_cfg sdc4_pad_on_pull_cfg[] = { - {TLMM_PULL_SDC4_CMD, GPIO_CFG_PULL_UP}, - {TLMM_PULL_SDC4_DATA, GPIO_CFG_PULL_UP} -}; - -static struct msm_sdcc_pad_drv_cfg sdc4_pad_off_drv_cfg[] = { - {TLMM_HDRV_SDC4_CLK, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC4_CMD, GPIO_CFG_2MA}, - {TLMM_HDRV_SDC4_DATA, GPIO_CFG_2MA} -}; - -static struct msm_sdcc_pad_pull_cfg sdc4_pad_off_pull_cfg[] = { - {TLMM_PULL_SDC4_CMD, GPIO_CFG_PULL_DOWN}, - {TLMM_PULL_SDC4_DATA, GPIO_CFG_PULL_DOWN} -}; -#endif - -struct msm_sdcc_pin_cfg { - /* - * = 1 if controller pins are using gpios - * = 0 if controller has dedicated MSM pins - */ - u8 is_gpio; - u8 cfg_sts; - u8 gpio_data_size; - struct msm_sdcc_gpio *gpio_data; - struct msm_sdcc_pad_drv_cfg *pad_drv_on_data; - struct msm_sdcc_pad_drv_cfg *pad_drv_off_data; - struct msm_sdcc_pad_pull_cfg *pad_pull_on_data; - struct msm_sdcc_pad_pull_cfg *pad_pull_off_data; - u8 pad_drv_data_size; - u8 pad_pull_data_size; - u8 sdio_lpm_gpio_cfg; -}; - - -static struct msm_sdcc_pin_cfg sdcc_pin_cfg_data[MAX_SDCC_CONTROLLER] = { -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - [0] = { - .is_gpio = 1, - .gpio_data_size = ARRAY_SIZE(sdc1_gpio_cfg), - .gpio_data = sdc1_gpio_cfg - }, -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - [1] = { - .is_gpio = 1, - .gpio_data_size = ARRAY_SIZE(sdc2_gpio_cfg), - .gpio_data = sdc2_gpio_cfg - }, -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - [2] = { - .is_gpio = 0, - .pad_drv_on_data = sdc3_pad_on_drv_cfg, - .pad_drv_off_data = sdc3_pad_off_drv_cfg, - .pad_pull_on_data = sdc3_pad_on_pull_cfg, - .pad_pull_off_data = sdc3_pad_off_pull_cfg, - .pad_drv_data_size = ARRAY_SIZE(sdc3_pad_on_drv_cfg), - .pad_pull_data_size = ARRAY_SIZE(sdc3_pad_on_pull_cfg) - }, -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - [3] = { - .is_gpio = 0, - .pad_drv_on_data = sdc4_pad_on_drv_cfg, - .pad_drv_off_data = sdc4_pad_off_drv_cfg, - .pad_pull_on_data = sdc4_pad_on_pull_cfg, - .pad_pull_off_data = sdc4_pad_off_pull_cfg, - .pad_drv_data_size = ARRAY_SIZE(sdc4_pad_on_drv_cfg), - .pad_pull_data_size = ARRAY_SIZE(sdc4_pad_on_pull_cfg) - }, -#endif -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT - [4] = { - .is_gpio = 1, - .gpio_data_size = ARRAY_SIZE(sdc5_gpio_cfg), - .gpio_data = sdc5_gpio_cfg - } -#endif -}; - -static int msm_sdcc_setup_gpio(int dev_id, unsigned int enable) -{ - int rc = 0; - struct msm_sdcc_pin_cfg *curr; - int n; - - curr = &sdcc_pin_cfg_data[dev_id - 1]; - if (!curr->gpio_data) - goto out; - - for (n = 0; n < curr->gpio_data_size; n++) { - if (enable) { - - if (curr->gpio_data[n].always_on && - curr->gpio_data[n].is_enabled) - continue; - pr_debug("%s: enable: %s\n", __func__, - curr->gpio_data[n].name); - rc = gpio_request(curr->gpio_data[n].no, - curr->gpio_data[n].name); - if (rc) { - pr_err("%s: gpio_request(%d, %s)" - "failed", __func__, - curr->gpio_data[n].no, - curr->gpio_data[n].name); - goto free_gpios; - } - /* set direction as output for all GPIOs */ - rc = gpio_direction_output( - curr->gpio_data[n].no, 1); - if (rc) { - pr_err("%s: gpio_direction_output" - "(%d, 1) failed\n", __func__, - curr->gpio_data[n].no); - goto free_gpios; - } - curr->gpio_data[n].is_enabled = 1; - } else { - /* - * now free this GPIO which will put GPIO - * in low power mode and will also put GPIO - * in input mode - */ - if (curr->gpio_data[n].always_on) - continue; - pr_debug("%s: disable: %s\n", __func__, - curr->gpio_data[n].name); - gpio_free(curr->gpio_data[n].no); - curr->gpio_data[n].is_enabled = 0; - } - } - curr->cfg_sts = enable; - goto out; - -free_gpios: - for (; n >= 0; n--) - gpio_free(curr->gpio_data[n].no); -out: - return rc; -} - -static int msm_sdcc_setup_pad(int dev_id, unsigned int enable) -{ - int rc = 0; - struct msm_sdcc_pin_cfg *curr; - int n; - - curr = &sdcc_pin_cfg_data[dev_id - 1]; - if (!curr->pad_drv_on_data || !curr->pad_pull_on_data) - goto out; - - if (enable) { - /* - * set up the normal driver strength and - * pull config for pads - */ - for (n = 0; n < curr->pad_drv_data_size; n++) { - if (curr->sdio_lpm_gpio_cfg) { - if (curr->pad_drv_on_data[n].drv == - TLMM_HDRV_SDC4_DATA) - continue; - } - msm_tlmm_set_hdrive(curr->pad_drv_on_data[n].drv, - curr->pad_drv_on_data[n].drv_val); - } - for (n = 0; n < curr->pad_pull_data_size; n++) { - if (curr->sdio_lpm_gpio_cfg) { - if (curr->pad_pull_on_data[n].pull == - TLMM_PULL_SDC4_DATA) - continue; - } - msm_tlmm_set_pull(curr->pad_pull_on_data[n].pull, - curr->pad_pull_on_data[n].pull_val); - } - } else { - /* set the low power config for pads */ - for (n = 0; n < curr->pad_drv_data_size; n++) { - if (curr->sdio_lpm_gpio_cfg) { - if (curr->pad_drv_off_data[n].drv == - TLMM_HDRV_SDC4_DATA) - continue; - } - msm_tlmm_set_hdrive( - curr->pad_drv_off_data[n].drv, - curr->pad_drv_off_data[n].drv_val); - } - for (n = 0; n < curr->pad_pull_data_size; n++) { - if (curr->sdio_lpm_gpio_cfg) { - if (curr->pad_pull_off_data[n].pull == - TLMM_PULL_SDC4_DATA) - continue; - } - msm_tlmm_set_pull( - curr->pad_pull_off_data[n].pull, - curr->pad_pull_off_data[n].pull_val); - } - } - curr->cfg_sts = enable; -out: - return rc; -} - -struct sdcc_reg { - /* VDD/VCC/VCCQ regulator name on PMIC8058/PMIC8089*/ - const char *reg_name; - /* - * is set voltage supported for this regulator? - * 0 = not supported, 1 = supported - */ - unsigned char set_voltage_sup; - /* voltage level to be set */ - unsigned int level; - /* VDD/VCC/VCCQ voltage regulator handle */ - struct regulator *reg; - /* is this regulator enabled? */ - bool enabled; - /* is this regulator needs to be always on? */ - bool always_on; - /* is operating power mode setting required for this regulator? */ - bool op_pwr_mode_sup; - /* Load values for low power and high power mode */ - unsigned int lpm_uA; - unsigned int hpm_uA; -}; -/* all SDCC controllers require VDD/VCC voltage */ -static struct sdcc_reg sdcc_vdd_reg_data[MAX_SDCC_CONTROLLER]; -/* only SDCC1 requires VCCQ voltage */ -static struct sdcc_reg sdcc_vccq_reg_data[1]; -/* all SDCC controllers may require voting for VDD PAD voltage */ -static struct sdcc_reg sdcc_vddp_reg_data[MAX_SDCC_CONTROLLER]; - -struct sdcc_reg_data { - struct sdcc_reg *vdd_data; /* keeps VDD/VCC regulator info */ - struct sdcc_reg *vccq_data; /* keeps VCCQ regulator info */ - struct sdcc_reg *vddp_data; /* keeps VDD Pad regulator info */ - unsigned char sts; /* regulator enable/disable status */ -}; -/* msm8x60 has 5 SDCC controllers */ -static struct sdcc_reg_data sdcc_vreg_data[MAX_SDCC_CONTROLLER]; - -static int msm_sdcc_vreg_init_reg(struct sdcc_reg *vreg) -{ - int rc = 0; - - /* Get the regulator handle */ - vreg->reg = regulator_get(NULL, vreg->reg_name); - if (IS_ERR(vreg->reg)) { - rc = PTR_ERR(vreg->reg); - pr_err("%s: regulator_get(%s) failed. rc=%d\n", - __func__, vreg->reg_name, rc); - goto out; - } - - /* Set the voltage level if required */ - if (vreg->set_voltage_sup) { - rc = regulator_set_voltage(vreg->reg, vreg->level, - vreg->level); - if (rc) { - pr_err("%s: regulator_set_voltage(%s) failed rc=%d\n", - __func__, vreg->reg_name, rc); - goto vreg_put; - } - } - goto out; - -vreg_put: - regulator_put(vreg->reg); -out: - return rc; -} - -static inline void msm_sdcc_vreg_deinit_reg(struct sdcc_reg *vreg) -{ - regulator_put(vreg->reg); -} - -/* this init function should be called only once for each SDCC */ -static int msm_sdcc_vreg_init(int dev_id, unsigned char init) -{ - int rc = 0; - struct sdcc_reg *curr_vdd_reg, *curr_vccq_reg, *curr_vddp_reg; - struct sdcc_reg_data *curr; - - curr = &sdcc_vreg_data[dev_id - 1]; - curr_vdd_reg = curr->vdd_data; - curr_vccq_reg = curr->vccq_data; - curr_vddp_reg = curr->vddp_data; - - if (init) { - /* - * get the regulator handle from voltage regulator framework - * and then try to set the voltage level for the regulator - */ - if (curr_vdd_reg) { - rc = msm_sdcc_vreg_init_reg(curr_vdd_reg); - if (rc) - goto out; - } - if (curr_vccq_reg) { - rc = msm_sdcc_vreg_init_reg(curr_vccq_reg); - if (rc) - goto vdd_reg_deinit; - } - if (curr_vddp_reg) { - rc = msm_sdcc_vreg_init_reg(curr_vddp_reg); - if (rc) - goto vccq_reg_deinit; - } - goto out; - } else - /* deregister with all regulators from regulator framework */ - goto vddp_reg_deinit; - -vddp_reg_deinit: - if (curr_vddp_reg) - msm_sdcc_vreg_deinit_reg(curr_vddp_reg); -vccq_reg_deinit: - if (curr_vccq_reg) - msm_sdcc_vreg_deinit_reg(curr_vccq_reg); -vdd_reg_deinit: - if (curr_vdd_reg) - msm_sdcc_vreg_deinit_reg(curr_vdd_reg); -out: - return rc; -} - -static int msm_sdcc_vreg_enable(struct sdcc_reg *vreg) -{ - int rc; - - if (!vreg->enabled) { - rc = regulator_enable(vreg->reg); - if (rc) { - pr_err("%s: regulator_enable(%s) failed. rc=%d\n", - __func__, vreg->reg_name, rc); - goto out; - } - vreg->enabled = 1; - } - - /* Put always_on regulator in HPM (high power mode) */ - if (vreg->always_on && vreg->op_pwr_mode_sup) { - rc = regulator_set_optimum_mode(vreg->reg, vreg->hpm_uA); - if (rc < 0) { - pr_err("%s: reg=%s: HPM setting failed" - " hpm_uA=%d, rc=%d\n", - __func__, vreg->reg_name, - vreg->hpm_uA, rc); - goto vreg_disable; - } - rc = 0; - } - goto out; - -vreg_disable: - regulator_disable(vreg->reg); - vreg->enabled = 0; -out: - return rc; -} - -static int msm_sdcc_vreg_disable(struct sdcc_reg *vreg) -{ - int rc; - - /* Never disable always_on regulator */ - if (!vreg->always_on) { - rc = regulator_disable(vreg->reg); - if (rc) { - pr_err("%s: regulator_disable(%s) failed. rc=%d\n", - __func__, vreg->reg_name, rc); - goto out; - } - vreg->enabled = 0; - } - - /* Put always_on regulator in LPM (low power mode) */ - if (vreg->always_on && vreg->op_pwr_mode_sup) { - rc = regulator_set_optimum_mode(vreg->reg, vreg->lpm_uA); - if (rc < 0) { - pr_err("%s: reg=%s: LPM setting failed" - " lpm_uA=%d, rc=%d\n", - __func__, - vreg->reg_name, - vreg->lpm_uA, rc); - goto out; - } - rc = 0; - } - -out: - return rc; -} - -static int msm_sdcc_setup_vreg(int dev_id, unsigned char enable) -{ - int rc = 0; - struct sdcc_reg *curr_vdd_reg, *curr_vccq_reg, *curr_vddp_reg; - struct sdcc_reg_data *curr; - - curr = &sdcc_vreg_data[dev_id - 1]; - curr_vdd_reg = curr->vdd_data; - curr_vccq_reg = curr->vccq_data; - curr_vddp_reg = curr->vddp_data; - - /* check if regulators are initialized or not? */ - if ((curr_vdd_reg && !curr_vdd_reg->reg) || - (curr_vccq_reg && !curr_vccq_reg->reg) || - (curr_vddp_reg && !curr_vddp_reg->reg)) { - /* initialize voltage regulators required for this SDCC */ - rc = msm_sdcc_vreg_init(dev_id, 1); - if (rc) { - pr_err("%s: regulator init failed = %d\n", - __func__, rc); - goto out; - } - } - - if (curr->sts == enable) - goto out; - - if (curr_vdd_reg) { - if (enable) - rc = msm_sdcc_vreg_enable(curr_vdd_reg); - else - rc = msm_sdcc_vreg_disable(curr_vdd_reg); - if (rc) - goto out; - } - - if (curr_vccq_reg) { - if (enable) - rc = msm_sdcc_vreg_enable(curr_vccq_reg); - else - rc = msm_sdcc_vreg_disable(curr_vccq_reg); - if (rc) - goto out; - } - - if (curr_vddp_reg) { - if (enable) - rc = msm_sdcc_vreg_enable(curr_vddp_reg); - else - rc = msm_sdcc_vreg_disable(curr_vddp_reg); - if (rc) - goto out; - } - curr->sts = enable; - -out: - return rc; -} - -static u32 msm_sdcc_setup_power(struct device *dv, unsigned int vdd) -{ - u32 rc_pin_cfg = 0; - u32 rc_vreg_cfg = 0; - u32 rc = 0; - struct platform_device *pdev; - struct msm_sdcc_pin_cfg *curr_pin_cfg; - - pdev = container_of(dv, struct platform_device, dev); - - /* setup gpio/pad */ - curr_pin_cfg = &sdcc_pin_cfg_data[pdev->id - 1]; - if (curr_pin_cfg->cfg_sts == !!vdd) - goto setup_vreg; - - if (curr_pin_cfg->is_gpio) - rc_pin_cfg = msm_sdcc_setup_gpio(pdev->id, !!vdd); - else - rc_pin_cfg = msm_sdcc_setup_pad(pdev->id, !!vdd); - -setup_vreg: - /* setup voltage regulators */ - rc_vreg_cfg = msm_sdcc_setup_vreg(pdev->id, !!vdd); - - if (rc_pin_cfg || rc_vreg_cfg) - rc = rc_pin_cfg ? rc_pin_cfg : rc_vreg_cfg; - - return rc; -} - -static void msm_sdcc_sdio_lpm_gpio(struct device *dv, unsigned int active) -{ - struct msm_sdcc_pin_cfg *curr_pin_cfg; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - /* setup gpio/pad */ - curr_pin_cfg = &sdcc_pin_cfg_data[pdev->id - 1]; - - if (curr_pin_cfg->cfg_sts == active) - return; - - curr_pin_cfg->sdio_lpm_gpio_cfg = 1; - if (curr_pin_cfg->is_gpio) - msm_sdcc_setup_gpio(pdev->id, active); - else - msm_sdcc_setup_pad(pdev->id, active); - curr_pin_cfg->sdio_lpm_gpio_cfg = 0; -} - -static int msm_sdc3_get_wpswitch(struct device *dev) -{ - struct platform_device *pdev; - int status; - pdev = container_of(dev, struct platform_device, dev); - - status = gpio_request(GPIO_SDC_WP, "SD_WP_Switch"); - if (status) { - pr_err("%s:Failed to request GPIO %d\n", - __func__, GPIO_SDC_WP); - } else { - status = gpio_direction_input(GPIO_SDC_WP); - if (!status) { - status = gpio_get_value_cansleep(GPIO_SDC_WP); - pr_info("%s: WP Status for Slot %d = %d\n", - __func__, pdev->id, status); - } - gpio_free(GPIO_SDC_WP); - } - return status; -} - -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT -int sdc5_register_status_notify(void (*callback)(int, void *), - void *dev_id) -{ - sdc5_status_notify_cb = callback; - sdc5_status_notify_cb_devid = dev_id; - return 0; -} -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -int sdc2_register_status_notify(void (*callback)(int, void *), - void *dev_id) -{ - sdc2_status_notify_cb = callback; - sdc2_status_notify_cb_devid = dev_id; - return 0; -} -#endif - -/* Interrupt handler for SDC2 and SDC5 detection - * This function uses dual-edge interrputs settings in order - * to get SDIO detection when the GPIO is rising and SDIO removal - * when the GPIO is falling */ -static irqreturn_t msm8x60_multi_sdio_slot_status_irq(int irq, void *dev_id) -{ - int status; - - if (!machine_is_msm8x60_fusion() && - !machine_is_msm8x60_fusn_ffa()) - return IRQ_NONE; - - status = gpio_get_value(MDM2AP_SYNC); - pr_info("%s: MDM2AP_SYNC Status = %d\n", - __func__, status); - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - if (sdc2_status_notify_cb) { - pr_info("%s: calling sdc2_status_notify_cb\n", __func__); - sdc2_status_notify_cb(status, - sdc2_status_notify_cb_devid); - } -#endif - -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT - if (sdc5_status_notify_cb) { - pr_info("%s: calling sdc5_status_notify_cb\n", __func__); - sdc5_status_notify_cb(status, - sdc5_status_notify_cb_devid); - } -#endif - return IRQ_HANDLED; -} - -static int msm8x60_multi_sdio_init(void) -{ - int ret, irq_num; - - if (!machine_is_msm8x60_fusion() && - !machine_is_msm8x60_fusn_ffa()) - return 0; - - ret = msm_gpiomux_get(MDM2AP_SYNC); - if (ret) { - pr_err("%s:Failed to request GPIO %d, ret=%d\n", - __func__, MDM2AP_SYNC, ret); - return ret; - } - - irq_num = gpio_to_irq(MDM2AP_SYNC); - - ret = request_irq(irq_num, - msm8x60_multi_sdio_slot_status_irq, - IRQ_TYPE_EDGE_BOTH, - "sdio_multidetection", NULL); - - if (ret) { - pr_err("%s:Failed to request irq, ret=%d\n", - __func__, ret); - return ret; - } - - return ret; -} - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static unsigned int msm8x60_sdcc_slot_status(struct device *dev) -{ - int status; - - status = gpio_request(PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1) - , "SD_HW_Detect"); - if (status) { - pr_err("%s:Failed to request GPIO %d\n", __func__, - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1)); - } else { - status = gpio_direction_input( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1)); - if (!status) - status = !(gpio_get_value_cansleep( - PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1))); - gpio_free(PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_SDC3_DET - 1)); - } - return (unsigned int) status; -} -#endif -#endif - -#define MSM_MPM_PIN_SDC3_DAT1 21 -#define MSM_MPM_PIN_SDC4_DAT1 23 - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct mmc_platform_data msm8x60_sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, -#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .msmsdcc_fmin = 400000, - .msmsdcc_fmid = 24000000, - .msmsdcc_fmax = 48000000, - .nonremovable = 1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct mmc_platform_data msm8x60_sdc2_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29 | MMC_VDD_165_195, - .translate_vdd = msm_sdcc_setup_power, - .sdio_lpm_gpio_setup = msm_sdcc_sdio_lpm_gpio, - .mmc_bus_width = MMC_CAP_8_BIT_DATA, - .msmsdcc_fmin = 400000, - .msmsdcc_fmid = 24000000, - .msmsdcc_fmax = 48000000, - .nonremovable = 0, - .register_status_notify = sdc2_register_status_notify, -#ifdef CONFIG_MSM_SDIO_AL - .is_sdio_al_client = 1, -#endif - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data msm8x60_sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .wpswitch = msm_sdc3_get_wpswitch, - .status = msm8x60_sdcc_slot_status, - .status_irq = PM8058_GPIO_IRQ(PM8058_IRQ_BASE, - PMIC_GPIO_SDC3_DET - 1), - .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - .msmsdcc_fmin = 400000, - .msmsdcc_fmid = 24000000, - .msmsdcc_fmax = 48000000, - .nonremovable = 0, - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct mmc_platform_data msm8x60_sdc4_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 400000, - .msmsdcc_fmid = 24000000, - .msmsdcc_fmax = 48000000, - .nonremovable = 0, - .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC4_DAT1, - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT -static struct mmc_platform_data msm8x60_sdc5_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29 | MMC_VDD_165_195, - .translate_vdd = msm_sdcc_setup_power, - .sdio_lpm_gpio_setup = msm_sdcc_sdio_lpm_gpio, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .msmsdcc_fmin = 400000, - .msmsdcc_fmid = 24000000, - .msmsdcc_fmax = 48000000, - .nonremovable = 0, - .register_status_notify = sdc5_register_status_notify, -#ifdef CONFIG_MSM_SDIO_AL - .is_sdio_al_client = 1, -#endif - .msm_bus_voting_data = &sps_to_ddr_bus_voting_data, -}; -#endif - -static void __init msm8x60_init_mmc(void) -{ -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - /* SDCC1 : eMMC card connected */ - sdcc_vreg_data[0].vdd_data = &sdcc_vdd_reg_data[0]; - sdcc_vreg_data[0].vdd_data->reg_name = "8901_l5"; - sdcc_vreg_data[0].vdd_data->set_voltage_sup = 1; - sdcc_vreg_data[0].vdd_data->level = 2850000; - sdcc_vreg_data[0].vdd_data->always_on = 1; - sdcc_vreg_data[0].vdd_data->op_pwr_mode_sup = 1; - sdcc_vreg_data[0].vdd_data->lpm_uA = 9000; - sdcc_vreg_data[0].vdd_data->hpm_uA = 200000; - - sdcc_vreg_data[0].vccq_data = &sdcc_vccq_reg_data[0]; - sdcc_vreg_data[0].vccq_data->reg_name = "8901_lvs0"; - sdcc_vreg_data[0].vccq_data->set_voltage_sup = 0; - sdcc_vreg_data[0].vccq_data->always_on = 1; - - msm_add_sdcc(1, &msm8x60_sdc1_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - /* - * MDM SDIO client is connected to SDC2 on charm SURF/FFA - * and no card is connected on 8660 SURF/FFA/FLUID. - */ - sdcc_vreg_data[1].vdd_data = &sdcc_vdd_reg_data[1]; - sdcc_vreg_data[1].vdd_data->reg_name = "8058_s3"; - sdcc_vreg_data[1].vdd_data->set_voltage_sup = 1; - sdcc_vreg_data[1].vdd_data->level = 1800000; - - sdcc_vreg_data[1].vccq_data = NULL; - - if (machine_is_msm8x60_fusion()) - msm8x60_sdc2_data.msmsdcc_fmax = 24000000; - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - msm8x60_sdc2_data.sdiowakeup_irq = gpio_to_irq(144); - msm_sdcc_setup_gpio(2, 1); - msm_add_sdcc(2, &msm8x60_sdc2_data); - } -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - /* SDCC3 : External card slot connected */ - sdcc_vreg_data[2].vdd_data = &sdcc_vdd_reg_data[2]; - sdcc_vreg_data[2].vdd_data->reg_name = "8058_l14"; - sdcc_vreg_data[2].vdd_data->set_voltage_sup = 1; - sdcc_vreg_data[2].vdd_data->level = 2850000; - sdcc_vreg_data[2].vdd_data->always_on = 1; - sdcc_vreg_data[2].vdd_data->op_pwr_mode_sup = 1; - sdcc_vreg_data[2].vdd_data->lpm_uA = 9000; - sdcc_vreg_data[2].vdd_data->hpm_uA = 200000; - - sdcc_vreg_data[2].vccq_data = NULL; - - sdcc_vreg_data[2].vddp_data = &sdcc_vddp_reg_data[2]; - sdcc_vreg_data[2].vddp_data->reg_name = "8058_l5"; - sdcc_vreg_data[2].vddp_data->set_voltage_sup = 1; - sdcc_vreg_data[2].vddp_data->level = 2850000; - sdcc_vreg_data[2].vddp_data->always_on = 1; - sdcc_vreg_data[2].vddp_data->op_pwr_mode_sup = 1; - /* Sleep current required is ~300 uA. But min. RPM - * vote can be in terms of mA (min. 1 mA). - * So let's vote for 2 mA during sleep. - */ - sdcc_vreg_data[2].vddp_data->lpm_uA = 2000; - /* Max. Active current required is 16 mA */ - sdcc_vreg_data[2].vddp_data->hpm_uA = 16000; - - if (machine_is_msm8x60_fluid()) - msm8x60_sdc3_data.wpswitch = NULL; - msm_add_sdcc(3, &msm8x60_sdc3_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - /* SDCC4 : WLAN WCN1314 chip is connected */ - sdcc_vreg_data[3].vdd_data = &sdcc_vdd_reg_data[3]; - sdcc_vreg_data[3].vdd_data->reg_name = "8058_s3"; - sdcc_vreg_data[3].vdd_data->set_voltage_sup = 1; - sdcc_vreg_data[3].vdd_data->level = 1800000; - - sdcc_vreg_data[3].vccq_data = NULL; - - msm_add_sdcc(4, &msm8x60_sdc4_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC5_SUPPORT - /* - * MDM SDIO client is connected to SDC5 on charm SURF/FFA - * and no card is connected on 8660 SURF/FFA/FLUID. - */ - sdcc_vreg_data[4].vdd_data = &sdcc_vdd_reg_data[4]; - sdcc_vreg_data[4].vdd_data->reg_name = "8058_s3"; - sdcc_vreg_data[4].vdd_data->set_voltage_sup = 1; - sdcc_vreg_data[4].vdd_data->level = 1800000; - - sdcc_vreg_data[4].vccq_data = NULL; - - if (machine_is_msm8x60_fusion()) - msm8x60_sdc5_data.msmsdcc_fmax = 24000000; - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - msm8x60_sdc5_data.sdiowakeup_irq = gpio_to_irq(99); - msm_sdcc_setup_gpio(5, 1); - msm_add_sdcc(5, &msm8x60_sdc5_data); - } -#endif -} - -#if !defined(CONFIG_GPIO_SX150X) && !defined(CONFIG_GPIO_SX150X_MODULE) -static inline void display_common_power(int on) {} -#else - -#define _GET_REGULATOR(var, name) do { \ - if (var == NULL) { \ - var = regulator_get(NULL, name); \ - if (IS_ERR(var)) { \ - pr_err("'%s' regulator not found, rc=%ld\n", \ - name, PTR_ERR(var)); \ - var = NULL; \ - } \ - } \ -} while (0) - -static int dsub_regulator(int on) -{ - static struct regulator *dsub_reg; - static struct regulator *mpp0_reg; - static int dsub_reg_enabled; - int rc = 0; - - _GET_REGULATOR(dsub_reg, "8901_l3"); - if (IS_ERR(dsub_reg)) { - printk(KERN_ERR "%s: failed to get reg 8901_l3 err=%ld", - __func__, PTR_ERR(dsub_reg)); - return PTR_ERR(dsub_reg); - } - - _GET_REGULATOR(mpp0_reg, "8901_mpp0"); - if (IS_ERR(mpp0_reg)) { - printk(KERN_ERR "%s: failed to get reg 8901_mpp0 err=%ld", - __func__, PTR_ERR(mpp0_reg)); - return PTR_ERR(mpp0_reg); - } - - if (on && !dsub_reg_enabled) { - rc = regulator_set_voltage(dsub_reg, 3300000, 3300000); - if (rc) { - printk(KERN_ERR "%s: failed to set reg 8901_l3 voltage" - " err=%d", __func__, rc); - goto dsub_regulator_err; - } - rc = regulator_enable(dsub_reg); - if (rc) { - printk(KERN_ERR "%s: failed to enable reg 8901_l3" - " err=%d", __func__, rc); - goto dsub_regulator_err; - } - rc = regulator_enable(mpp0_reg); - if (rc) { - printk(KERN_ERR "%s: failed to enable reg 8901_mpp0" - " err=%d", __func__, rc); - goto dsub_regulator_err; - } - dsub_reg_enabled = 1; - } else if (!on && dsub_reg_enabled) { - rc = regulator_disable(dsub_reg); - if (rc) - printk(KERN_WARNING "%s: failed to disable reg 8901_l3" - " err=%d", __func__, rc); - rc = regulator_disable(mpp0_reg); - if (rc) - printk(KERN_WARNING "%s: failed to disable reg " - "8901_mpp0 err=%d", __func__, rc); - dsub_reg_enabled = 0; - } - - return rc; - -dsub_regulator_err: - regulator_put(mpp0_reg); - regulator_put(dsub_reg); - return rc; -} - -static int display_power_on; -static void setup_display_power(void) -{ - if (display_power_on) - if (lcdc_vga_enabled) { - dsub_regulator(1); - gpio_set_value_cansleep(GPIO_LVDS_SHUTDOWN_N, 0); - gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, 0); - if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) - gpio_set_value_cansleep(GPIO_DONGLE_PWR_EN, 1); - } else { - dsub_regulator(0); - gpio_set_value_cansleep(GPIO_LVDS_SHUTDOWN_N, 1); - gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, 1); - if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) - gpio_set_value_cansleep(GPIO_DONGLE_PWR_EN, 0); - } - else { - dsub_regulator(0); - if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa()) - gpio_set_value_cansleep(GPIO_DONGLE_PWR_EN, 0); - /* BACKLIGHT */ - gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, 0); - /* LVDS */ - gpio_set_value_cansleep(GPIO_LVDS_SHUTDOWN_N, 0); - } -} - -#define _GET_REGULATOR(var, name) do { \ - if (var == NULL) { \ - var = regulator_get(NULL, name); \ - if (IS_ERR(var)) { \ - pr_err("'%s' regulator not found, rc=%ld\n", \ - name, PTR_ERR(var)); \ - var = NULL; \ - } \ - } \ -} while (0) - -#define GPIO_RESX_N (GPIO_EXPANDER_GPIO_BASE + 2) - -static void display_common_power(int on) -{ - int rc; - static struct regulator *display_reg; - - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { - if (on) { - /* LVDS */ - _GET_REGULATOR(display_reg, "8901_l2"); - if (!display_reg) - return; - rc = regulator_set_voltage(display_reg, - 3300000, 3300000); - if (rc) - goto out; - rc = regulator_enable(display_reg); - if (rc) - goto out; - rc = gpio_request(GPIO_LVDS_SHUTDOWN_N, - "LVDS_STDN_OUT_N"); - if (rc) { - printk(KERN_ERR "%s: LVDS gpio %d request" - "failed\n", __func__, - GPIO_LVDS_SHUTDOWN_N); - goto out2; - } - - /* BACKLIGHT */ - rc = gpio_request(GPIO_BACKLIGHT_EN, "BACKLIGHT_EN"); - if (rc) { - printk(KERN_ERR "%s: BACKLIGHT gpio %d request" - "failed\n", __func__, - GPIO_BACKLIGHT_EN); - goto out3; - } - - if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) { - rc = gpio_request(GPIO_DONGLE_PWR_EN, - "DONGLE_PWR_EN"); - if (rc) { - printk(KERN_ERR "%s: DONGLE_PWR_EN gpio" - " %d request failed\n", __func__, - GPIO_DONGLE_PWR_EN); - goto out4; - } - } - - gpio_direction_output(GPIO_LVDS_SHUTDOWN_N, 0); - gpio_direction_output(GPIO_BACKLIGHT_EN, 0); - if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) - gpio_direction_output(GPIO_DONGLE_PWR_EN, 0); - mdelay(20); - display_power_on = 1; - setup_display_power(); - } else { - if (display_power_on) { - display_power_on = 0; - setup_display_power(); - mdelay(20); - if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) - gpio_free(GPIO_DONGLE_PWR_EN); - goto out4; - } - } - } -#if defined(CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT) || \ - defined(CONFIG_FB_MSM_LCDC_AUO_WVGA) - else if (machine_is_msm8x60_fluid()) { - static struct regulator *fluid_reg; - static struct regulator *fluid_reg2; - - if (on) { - _GET_REGULATOR(fluid_reg, "8901_l2"); - if (!fluid_reg) - return; - _GET_REGULATOR(fluid_reg2, "8058_s3"); - if (!fluid_reg2) { - regulator_put(fluid_reg); - return; - } - rc = gpio_request(GPIO_RESX_N, "RESX_N"); - if (rc) { - regulator_put(fluid_reg2); - regulator_put(fluid_reg); - return; - } - regulator_set_voltage(fluid_reg, 2850000, 2850000); - regulator_set_voltage(fluid_reg2, 1800000, 1800000); - regulator_enable(fluid_reg); - regulator_enable(fluid_reg2); - msleep(20); - gpio_direction_output(GPIO_RESX_N, 0); - udelay(10); - gpio_set_value_cansleep(GPIO_RESX_N, 1); - display_power_on = 1; - setup_display_power(); - } else { - gpio_set_value_cansleep(GPIO_RESX_N, 0); - gpio_free(GPIO_RESX_N); - msleep(20); - regulator_disable(fluid_reg2); - regulator_disable(fluid_reg); - regulator_put(fluid_reg2); - regulator_put(fluid_reg); - display_power_on = 0; - setup_display_power(); - fluid_reg = NULL; - fluid_reg2 = NULL; - } - } -#endif -#if defined(CONFIG_FB_MSM_LCDC_NT35582_WVGA) - else if (machine_is_msm8x60_dragon()) { - static struct regulator *dragon_reg; - static struct regulator *dragon_reg2; - - if (on) { - _GET_REGULATOR(dragon_reg, "8901_l2"); - if (!dragon_reg) - return; - _GET_REGULATOR(dragon_reg2, "8058_l16"); - if (!dragon_reg2) { - regulator_put(dragon_reg); - dragon_reg = NULL; - return; - } - - rc = gpio_request(GPIO_NT35582_BL_EN, "lcdc_bl_en"); - if (rc) { - pr_err("%s: gpio %d request failed with rc=%d\n", - __func__, GPIO_NT35582_BL_EN, rc); - regulator_put(dragon_reg); - regulator_put(dragon_reg2); - dragon_reg = NULL; - dragon_reg2 = NULL; - return; - } - - if (gpio_tlmm_config(GPIO_CFG(GPIO_NT35582_RESET, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, - GPIO_CFG_16MA), GPIO_CFG_ENABLE)) { - pr_err("%s: config gpio '%d' failed!\n", - __func__, GPIO_NT35582_RESET); - gpio_free(GPIO_NT35582_BL_EN); - regulator_put(dragon_reg); - regulator_put(dragon_reg2); - dragon_reg = NULL; - dragon_reg2 = NULL; - return; - } - - rc = gpio_request(GPIO_NT35582_RESET, "lcdc_reset"); - if (rc) { - pr_err("%s: unable to request gpio %d (rc=%d)\n", - __func__, GPIO_NT35582_RESET, rc); - gpio_free(GPIO_NT35582_BL_EN); - regulator_put(dragon_reg); - regulator_put(dragon_reg2); - dragon_reg = NULL; - dragon_reg2 = NULL; - return; - } - - regulator_set_voltage(dragon_reg, 3300000, 3300000); - regulator_set_voltage(dragon_reg2, 1800000, 1800000); - regulator_enable(dragon_reg); - regulator_enable(dragon_reg2); - msleep(20); - - gpio_set_value_cansleep(GPIO_NT35582_RESET, 1); - msleep(20); - gpio_set_value_cansleep(GPIO_NT35582_RESET, 0); - msleep(20); - gpio_set_value_cansleep(GPIO_NT35582_RESET, 1); - msleep(50); - - gpio_set_value_cansleep(GPIO_NT35582_BL_EN, 1); - - display_power_on = 1; - } else if ((dragon_reg != NULL) && (dragon_reg2 != NULL)) { - gpio_free(GPIO_NT35582_RESET); - gpio_free(GPIO_NT35582_BL_EN); - regulator_disable(dragon_reg2); - regulator_disable(dragon_reg); - regulator_put(dragon_reg2); - regulator_put(dragon_reg); - display_power_on = 0; - dragon_reg = NULL; - dragon_reg2 = NULL; - } - } -#endif - return; - -out4: - gpio_free(GPIO_BACKLIGHT_EN); -out3: - gpio_free(GPIO_LVDS_SHUTDOWN_N); -out2: - regulator_disable(display_reg); -out: - regulator_put(display_reg); - display_reg = NULL; -} -#undef _GET_REGULATOR -#endif - -static int mipi_dsi_panel_power(int on); - -#define LCDC_NUM_GPIO 28 -#define LCDC_GPIO_START 0 - -static void lcdc_samsung_panel_power(int on) -{ - int n, ret = 0; - - display_common_power(on); - - for (n = 0; n < LCDC_NUM_GPIO; n++) { - if (on) { - ret = gpio_request(LCDC_GPIO_START + n, "LCDC_GPIO"); - if (unlikely(ret)) { - pr_err("%s not able to get gpio\n", __func__); - break; - } - } else - gpio_free(LCDC_GPIO_START + n); - } - - if (ret) { - for (n--; n >= 0; n--) - gpio_free(LCDC_GPIO_START + n); - } - - mipi_dsi_panel_power(0); /* set 8058_ldo0 to LPM */ -} - -#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL -#define _GET_REGULATOR(var, name) do { \ - var = regulator_get(NULL, name); \ - if (IS_ERR(var)) { \ - pr_err("'%s' regulator not found, rc=%ld\n", \ - name, IS_ERR(var)); \ - var = NULL; \ - return -ENODEV; \ - } \ -} while (0) - -static int hdmi_enable_5v(int on) -{ - static struct regulator *reg_8901_hdmi_mvs; /* HDMI_5V */ - static struct regulator *reg_8901_mpp0; /* External 5V */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8901_hdmi_mvs) - _GET_REGULATOR(reg_8901_hdmi_mvs, "8901_hdmi_mvs"); - if (!reg_8901_mpp0) - _GET_REGULATOR(reg_8901_mpp0, "8901_mpp0"); - - if (on) { - rc = regulator_enable(reg_8901_mpp0); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "reg_8901_mpp0", rc); - return rc; - } - rc = regulator_enable(reg_8901_hdmi_mvs); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8901_hdmi_mvs", rc); - return rc; - } - pr_info("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8901_hdmi_mvs); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "8901_hdmi_mvs", rc); - rc = regulator_disable(reg_8901_mpp0); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "reg_8901_mpp0", rc); - pr_info("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_core_power(int on, int show) -{ - static struct regulator *reg_8058_l16; /* VDD_HDMI */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8058_l16) - _GET_REGULATOR(reg_8058_l16, "8058_l16"); - - if (on) { - rc = regulator_set_voltage(reg_8058_l16, 1800000, 1800000); - if (!rc) - rc = regulator_enable(reg_8058_l16); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8058_l16", rc); - return rc; - } - pr_debug("%s(on): success\n", __func__); - } else { - rc = regulator_disable(reg_8058_l16); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "8058_l16", rc); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -} - -static int hdmi_gpio_config(int on) -{ - int rc = 0; - static int prev_on; - - if (on == prev_on) - return 0; - - if (on) { - rc = gpio_request(170, "HDMI_DDC_CLK"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_CLK", 170, rc); - goto error1; - } - rc = gpio_request(171, "HDMI_DDC_DATA"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_DDC_DATA", 171, rc); - goto error2; - } - rc = gpio_request(172, "HDMI_HPD"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_HPD", 172, rc); - goto error3; - } - pr_debug("%s(on): success\n", __func__); - } else { - gpio_free(170); - gpio_free(171); - gpio_free(172); - pr_debug("%s(off): success\n", __func__); - } - - prev_on = on; - return 0; - -error3: - gpio_free(171); -error2: - gpio_free(170); -error1: - return rc; -} - -static int hdmi_cec_power(int on) -{ - static struct regulator *reg_8901_l3; /* HDMI_CEC */ - static int prev_on; - int rc; - - if (on == prev_on) - return 0; - - if (!reg_8901_l3) - _GET_REGULATOR(reg_8901_l3, "8901_l3"); - - if (on) { - rc = regulator_set_voltage(reg_8901_l3, 3300000, 3300000); - if (!rc) - rc = regulator_enable(reg_8901_l3); - if (rc) { - pr_err("'%s' regulator enable failed, rc=%d\n", - "8901_l3", rc); - return rc; - } - rc = gpio_request(169, "HDMI_CEC_VAR"); - if (rc) { - pr_err("'%s'(%d) gpio_request failed, rc=%d\n", - "HDMI_CEC_VAR", 169, rc); - goto error; - } - pr_info("%s(on): success\n", __func__); - } else { - gpio_free(169); - rc = regulator_disable(reg_8901_l3); - if (rc) - pr_warning("'%s' regulator disable failed, rc=%d\n", - "8901_l3", rc); - pr_info("%s(off): success\n", __func__); - } - - prev_on = on; - - return 0; -error: - regulator_disable(reg_8901_l3); - return rc; -} - -static int hdmi_panel_power(int on) -{ - int rc; - - pr_debug("%s: HDMI Core: %s\n", __func__, (on ? "ON" : "OFF")); - rc = hdmi_core_power(on, 1); - if (rc) - rc = hdmi_cec_power(on); - - pr_debug("%s: HDMI Core: %s Success\n", __func__, (on ? "ON" : "OFF")); - return rc; -} -#undef _GET_REGULATOR - -#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL */ - -static int lcdc_panel_power(int on) -{ - int flag_on = !!on; - static int lcdc_power_save_on; - - if (lcdc_power_save_on == flag_on) - return 0; - - lcdc_power_save_on = flag_on; - - lcdc_samsung_panel_power(on); - - return 0; -} - -#ifdef CONFIG_MSM_BUS_SCALING - -static struct msm_bus_vectors rotator_init_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors rotator_ui_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1024 * 600 * 4 * 2 * 60), - .ib = (1024 * 600 * 4 * 2 * 60 * 1.5), - }, -}; - -static struct msm_bus_vectors rotator_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_SMI, - .ab = (640 * 480 * 2 * 2 * 30), - .ib = (640 * 480 * 2 * 2 * 30 * 1.5), - }, - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (640 * 480 * 2 * 2 * 30), - .ib = (640 * 480 * 2 * 2 * 30 * 1.5), - }, -}; - -static struct msm_bus_vectors rotator_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_SMI, - .ab = (1280 * 736 * 2 * 2 * 30), - .ib = (1280 * 736 * 2 * 2 * 30 * 1.5), - }, - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1280 * 736 * 2 * 2 * 30), - .ib = (1280 * 736 * 2 * 2 * 30 * 1.5), - }, -}; - -static struct msm_bus_vectors rotator_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_SMI, - .ab = (1920 * 1088 * 2 * 2 * 30), - .ib = (1920 * 1088 * 2 * 2 * 30 * 1.5), - }, - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1920 * 1088 * 2 * 2 * 30), - .ib = (1920 * 1088 * 2 * 2 * 30 * 1.5), - }, -}; - -static struct msm_bus_paths rotator_bus_scale_usecases[] = { - { - ARRAY_SIZE(rotator_init_vectors), - rotator_init_vectors, - }, - { - ARRAY_SIZE(rotator_ui_vectors), - rotator_ui_vectors, - }, - { - ARRAY_SIZE(rotator_vga_vectors), - rotator_vga_vectors, - }, - { - ARRAY_SIZE(rotator_720p_vectors), - rotator_720p_vectors, - }, - { - ARRAY_SIZE(rotator_1080p_vectors), - rotator_1080p_vectors, - }, -}; - -struct msm_bus_scale_pdata rotator_bus_scale_pdata = { - rotator_bus_scale_usecases, - ARRAY_SIZE(rotator_bus_scale_usecases), - .name = "rotator", -}; - -static struct msm_bus_vectors mdp_init_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -#ifdef CONFIG_FB_MSM_LCDC_DSUB -static struct msm_bus_vectors mdp_sd_smi_vectors[] = { - /* Default case static display/UI/2d/3d if FB SMI */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 388800000, - .ib = 486000000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors mdp_sd_ebi_vectors[] = { - /* Default case static display/UI/2d/3d if FB SMI */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 388800000, - .ib = 486000000 * 2, - }, -}; -static struct msm_bus_vectors mdp_vga_vectors[] = { - /* VGA and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 458092800, - .ib = 572616000, - }, - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 458092800, - .ib = 572616000 * 2, - }, -}; -static struct msm_bus_vectors mdp_720p_vectors[] = { - /* 720p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 471744000, - .ib = 589680000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 471744000, - .ib = 589680000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_1080p_vectors[] = { - /* 1080p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 575424000, - .ib = 719280000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 575424000, - .ib = 719280000 * 2, - }, -}; - -#else -static struct msm_bus_vectors mdp_sd_smi_vectors[] = { - /* Default case static display/UI/2d/3d if FB SMI */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 175110000, - .ib = 218887500, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors mdp_sd_ebi_vectors[] = { - /* Default case static display/UI/2d/3d if FB SMI */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000, - .ib = 270000000 * 2, - }, -}; -static struct msm_bus_vectors mdp_vga_vectors[] = { - /* VGA and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 216000000, - .ib = 270000000, - }, - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 216000000, - .ib = 270000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_720p_vectors[] = { - /* 720p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 230400000, - .ib = 288000000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 230400000, - .ib = 288000000 * 2, - }, -}; - -static struct msm_bus_vectors mdp_1080p_vectors[] = { - /* 1080p and less video */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 334080000, - .ib = 417600000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 334080000, - .ib = 550000000 * 2, - }, -}; - -#endif -static struct msm_bus_paths mdp_bus_scale_usecases[] = { - { - ARRAY_SIZE(mdp_init_vectors), - mdp_init_vectors, - }, - { - ARRAY_SIZE(mdp_sd_smi_vectors), - mdp_sd_smi_vectors, - }, - { - ARRAY_SIZE(mdp_sd_ebi_vectors), - mdp_sd_ebi_vectors, - }, - { - ARRAY_SIZE(mdp_vga_vectors), - mdp_vga_vectors, - }, - { - ARRAY_SIZE(mdp_720p_vectors), - mdp_720p_vectors, - }, - { - ARRAY_SIZE(mdp_1080p_vectors), - mdp_1080p_vectors, - }, -}; -static struct msm_bus_scale_pdata mdp_bus_scale_pdata = { - mdp_bus_scale_usecases, - ARRAY_SIZE(mdp_bus_scale_usecases), - .name = "mdp", -}; - -#endif -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors dtv_bus_init_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors dtv_bus_def_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 566092800, - .ib = 707616000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 566092800, - .ib = 707616000, - }, -}; - -static struct msm_bus_vectors dtv_bus_hdmi_prim_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 2000000000, - .ib = 2000000000, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2000000000, - .ib = 2000000000, - }, -}; - -static struct msm_bus_paths dtv_bus_scale_usecases[] = { - { - ARRAY_SIZE(dtv_bus_init_vectors), - dtv_bus_init_vectors, - }, - { - ARRAY_SIZE(dtv_bus_def_vectors), - dtv_bus_def_vectors, - }, -}; - -static struct msm_bus_scale_pdata dtv_bus_scale_pdata = { - dtv_bus_scale_usecases, - ARRAY_SIZE(dtv_bus_scale_usecases), - .name = "dtv", -}; - -static struct lcdc_platform_data dtv_pdata = { - .bus_scale_table = &dtv_bus_scale_pdata, - .lcdc_power_save = hdmi_panel_power, -}; - -static struct msm_bus_paths dtv_hdmi_prim_bus_scale_usecases[] = { - { - ARRAY_SIZE(dtv_bus_init_vectors), - dtv_bus_init_vectors, - }, - { - ARRAY_SIZE(dtv_bus_hdmi_prim_vectors), - dtv_bus_hdmi_prim_vectors, - }, -}; - -static struct msm_bus_scale_pdata dtv_hdmi_prim_bus_scale_pdata = { - dtv_hdmi_prim_bus_scale_usecases, - ARRAY_SIZE(dtv_hdmi_prim_bus_scale_usecases), - .name = "dtv", -}; - -static struct lcdc_platform_data dtv_hdmi_prim_pdata = { - .bus_scale_table = &dtv_hdmi_prim_bus_scale_pdata, -}; -#endif - - -static struct lcdc_platform_data lcdc_pdata = { - .lcdc_power_save = lcdc_panel_power, -}; - - -#define MDP_VSYNC_GPIO 28 - -/* - * MIPI_DSI only use 8058_LDO0 which need always on - * therefore it need to be put at low power mode if - * it was not used instead of turn it off. - */ -static int mipi_dsi_panel_power(int on) -{ - int flag_on = !!on; - static int mipi_dsi_power_save_on; - static struct regulator *ldo0; - int rc = 0; - - if (mipi_dsi_power_save_on == flag_on) - return 0; - - mipi_dsi_power_save_on = flag_on; - - if (ldo0 == NULL) { /* init */ - ldo0 = regulator_get(NULL, "8058_l0"); - if (IS_ERR(ldo0)) { - pr_debug("%s: LDO0 failed\n", __func__); - rc = PTR_ERR(ldo0); - return rc; - } - - rc = regulator_set_voltage(ldo0, 1200000, 1200000); - if (rc) - goto out; - - rc = regulator_enable(ldo0); - if (rc) - goto out; - } - - if (on) { - /* set ldo0 to HPM */ - rc = regulator_set_optimum_mode(ldo0, 100000); - if (rc < 0) - goto out; - } else { - /* set ldo0 to LPM */ - rc = regulator_set_optimum_mode(ldo0, 1000); - if (rc < 0) - goto out; - } - - return 0; -out: - regulator_disable(ldo0); - regulator_put(ldo0); - ldo0 = NULL; - return rc; -} - -static struct mipi_dsi_platform_data mipi_dsi_pdata = { - .vsync_gpio = MDP_VSYNC_GPIO, - .dsi_power_save = mipi_dsi_panel_power, -}; - -#ifdef CONFIG_FB_MSM_TVOUT -static struct regulator *reg_8058_l13; - -static int atv_dac_power(int on) -{ - int rc = 0; - #define _GET_REGULATOR(var, name) do { \ - var = regulator_get(NULL, name); \ - if (IS_ERR(var)) { \ - pr_info("'%s' regulator not found, rc=%ld\n", \ - name, IS_ERR(var)); \ - var = NULL; \ - return -ENODEV; \ - } \ - } while (0) - - if (!reg_8058_l13) - _GET_REGULATOR(reg_8058_l13, "8058_l13"); - #undef _GET_REGULATOR - - if (on) { - rc = regulator_set_voltage(reg_8058_l13, 2050000, 2050000); - if (rc) { - pr_info("%s: '%s' regulator set voltage failed,\ - rc=%d\n", __func__, "8058_l13", rc); - return rc; - } - - rc = regulator_enable(reg_8058_l13); - if (rc) { - pr_err("%s: '%s' regulator enable failed,\ - rc=%d\n", __func__, "8058_l13", rc); - return rc; - } - } else { - rc = regulator_force_disable(reg_8058_l13); - if (rc) - pr_warning("%s: '%s' regulator disable failed, rc=%d\n", - __func__, "8058_l13", rc); - } - return rc; - -} -#endif - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = MDP_VSYNC_GPIO, - .mdp_max_clk = 200000000, -#ifdef CONFIG_MSM_BUS_SCALING - .mdp_bus_scale_table = &mdp_bus_scale_pdata, -#endif - .mdp_rev = MDP_REV_41, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .mem_hid = BIT(ION_CP_WB_HEAP_ID), -#else - .mem_hid = MEMTYPE_EBI1, -#endif - .mdp_iommu_split_domain = 0, -}; - -static void __init reserve_mdp_memory(void) -{ - mdp_pdata.ov0_wb_size = MSM_FB_OVERLAY0_WRITEBACK_SIZE; - mdp_pdata.ov1_wb_size = MSM_FB_OVERLAY1_WRITEBACK_SIZE; -#if defined(CONFIG_ANDROID_PMEM) && !defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - msm8x60_reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov0_wb_size; - msm8x60_reserve_table[mdp_pdata.mem_hid].size += - mdp_pdata.ov1_wb_size; -#endif -} - -#ifdef CONFIG_FB_MSM_TVOUT - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors atv_bus_init_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors atv_bus_def_vectors[] = { - /* For now, 0th array entry is reserved. - * Please leave 0 as is and don't use it - */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 236390400, - .ib = 265939200, - }, - /* Master and slaves can be from different fabrics */ - { - .src = MSM_BUS_MASTER_MDP_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 236390400, - .ib = 265939200, - }, -}; -static struct msm_bus_paths atv_bus_scale_usecases[] = { - { - ARRAY_SIZE(atv_bus_init_vectors), - atv_bus_init_vectors, - }, - { - ARRAY_SIZE(atv_bus_def_vectors), - atv_bus_def_vectors, - }, -}; -static struct msm_bus_scale_pdata atv_bus_scale_pdata = { - atv_bus_scale_usecases, - ARRAY_SIZE(atv_bus_scale_usecases), - .name = "atv", -}; -#endif - -static struct tvenc_platform_data atv_pdata = { - .poll = 0, - .pm_vid_en = atv_dac_power, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &atv_bus_scale_pdata, -#endif -}; -#endif - -static void __init msm_fb_add_devices(void) -{ -#ifdef CONFIG_FB_MSM_LCDC_DSUB - mdp_pdata.mdp_max_clk = 200000000; -#endif - msm_fb_register_device("mdp", &mdp_pdata); - - msm_fb_register_device("lcdc", &lcdc_pdata); - msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); -#ifdef CONFIG_MSM_BUS_SCALING - if (hdmi_is_primary) - msm_fb_register_device("dtv", &dtv_hdmi_prim_pdata); - else - msm_fb_register_device("dtv", &dtv_pdata); -#endif -#ifdef CONFIG_FB_MSM_TVOUT - msm_fb_register_device("tvenc", &atv_pdata); - msm_fb_register_device("tvout_device", NULL); -#endif -} - -/** - * Set MDP clocks to high frequency to avoid underflow when - * using high resolution 1200x1920 WUXGA/HDMI as primary panels - */ -static void set_mdp_clocks_for_wuxga(void) -{ - mdp_sd_smi_vectors[0].ab = 2000000000; - mdp_sd_smi_vectors[0].ib = 2000000000; - mdp_sd_smi_vectors[1].ab = 2000000000; - mdp_sd_smi_vectors[1].ib = 2000000000; - - mdp_sd_ebi_vectors[0].ab = 2000000000; - mdp_sd_ebi_vectors[0].ib = 2000000000; - mdp_sd_ebi_vectors[1].ab = 2000000000; - mdp_sd_ebi_vectors[1].ib = 2000000000; - - mdp_vga_vectors[0].ab = 2000000000; - mdp_vga_vectors[0].ib = 2000000000; - mdp_vga_vectors[1].ab = 2000000000; - mdp_vga_vectors[1].ib = 2000000000; - - mdp_720p_vectors[0].ab = 2000000000; - mdp_720p_vectors[0].ib = 2000000000; - mdp_720p_vectors[1].ab = 2000000000; - mdp_720p_vectors[1].ib = 2000000000; - - mdp_1080p_vectors[0].ab = 2000000000; - mdp_1080p_vectors[0].ib = 2000000000; - mdp_1080p_vectors[1].ab = 2000000000; - mdp_1080p_vectors[1].ib = 2000000000; - - mdp_pdata.mdp_max_clk = 200000000; -} - -#if (defined(CONFIG_MARIMBA_CORE)) && \ - (defined(CONFIG_MSM_BT_POWER) || defined(CONFIG_MSM_BT_POWER_MODULE)) - -static const struct { - char *name; - int vmin; - int vmax; -} bt_regs_info[] = { - { "8058_s3", 1800000, 1800000 }, - { "8058_s2", 1300000, 1300000 }, - { "8058_l8", 2900000, 3050000 }, -}; - -static struct { - bool enabled; -} bt_regs_status[] = { - { false }, - { false }, - { false }, -}; -static struct regulator *bt_regs[ARRAY_SIZE(bt_regs_info)]; - -static int bahama_bt(int on) -{ - int rc; - int i; - struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; - - struct bahama_variant_register { - const size_t size; - const struct bahama_config_register *set; - }; - - const struct bahama_config_register *p; - - u8 version; - - const struct bahama_config_register v10_bt_on[] = { - { 0xE9, 0x00, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xE4, 0x00, 0xFF }, - { 0xE5, 0x00, 0x0F }, -#ifdef CONFIG_WLAN - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - { 0x01, 0x0C, 0x1F }, - { 0x01, 0x08, 0x1F }, - }; - - const struct bahama_config_register v20_bt_on_fm_off[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x80, 0xFF }, - { 0xF0, 0x00, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v20_bt_on_fm_on[] = { - { 0x11, 0x0C, 0xFF }, - { 0x13, 0x01, 0xFF }, - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF }, -#ifdef CONFIG_WLAN - { 0x81, 0x00, 0x7F }, - { 0x82, 0x00, 0xFF }, - { 0xE6, 0x38, 0x7F }, - { 0xE7, 0x06, 0xFF }, -#endif - { 0xE9, 0x21, 0xFF }, - }; - - const struct bahama_config_register v10_bt_off[] = { - { 0xE9, 0x00, 0xFF }, - }; - - const struct bahama_config_register v20_bt_off_fm_off[] = { - { 0xF4, 0x84, 0xFF }, - { 0xF0, 0x04, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - - const struct bahama_config_register v20_bt_off_fm_on[] = { - { 0xF4, 0x86, 0xFF }, - { 0xF0, 0x06, 0xFF }, - { 0xE9, 0x00, 0xFF } - }; - const struct bahama_variant_register bt_bahama[2][3] = { - { - { ARRAY_SIZE(v10_bt_off), v10_bt_off }, - { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off }, - { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on } - }, - { - { ARRAY_SIZE(v10_bt_on), v10_bt_on }, - { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off }, - { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on } - } - }; - - u8 offset = 0; /* index into bahama configs */ - - on = on ? 1 : 0; - version = read_bahama_ver(); - - if (version == VER_UNSUPPORTED) { - dev_err(&msm_bt_power_device.dev, - "%s: unsupported version\n", - __func__); - return -EIO; - } - - if (version == VER_2_0) { - if (marimba_get_fm_status(&config)) - offset = 0x01; - } - - /* Voting off 1.3V S2 Regulator,BahamaV2 used in Normal mode */ - if (on && (version == VER_2_0)) { - for (i = 0; i < ARRAY_SIZE(bt_regs_info); i++) { - if ((!strcmp(bt_regs_info[i].name, "8058_s2")) - && (bt_regs_status[i].enabled == true)) { - if (regulator_disable(bt_regs[i])) { - dev_err(&msm_bt_power_device.dev, - "%s: regulator disable failed", - __func__); - } - bt_regs_status[i].enabled = false; - break; - } - } - } - - p = bt_bahama[on][version + offset].set; - - dev_info(&msm_bt_power_device.dev, - "%s: found version %d\n", __func__, version); - - for (i = 0; i < bt_bahama[on][version + offset].size; i++) { - u8 value = (p+i)->value; - rc = marimba_write_bit_mask(&config, - (p+i)->reg, - &value, - sizeof((p+i)->value), - (p+i)->mask); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "%s: reg %d write failed: %d\n", - __func__, (p+i)->reg, rc); - return rc; - } - dev_dbg(&msm_bt_power_device.dev, - "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n", - __func__, (p+i)->reg, - value, (p+i)->mask); - } - /* Update BT Status */ - if (on) - marimba_set_bt_status(&config, true); - else - marimba_set_bt_status(&config, false); - - return 0; -} - -static int bluetooth_use_regulators(int on) -{ - int i, recover = -1, rc = 0; - - for (i = 0; i < ARRAY_SIZE(bt_regs_info); i++) { - bt_regs[i] = on ? regulator_get(&msm_bt_power_device.dev, - bt_regs_info[i].name) : - (regulator_put(bt_regs[i]), NULL); - if (IS_ERR(bt_regs[i])) { - rc = PTR_ERR(bt_regs[i]); - dev_err(&msm_bt_power_device.dev, - "regulator %s get failed (%d)\n", - bt_regs_info[i].name, rc); - recover = i - 1; - bt_regs[i] = NULL; - break; - } - - if (!on) - continue; - - rc = regulator_set_voltage(bt_regs[i], - bt_regs_info[i].vmin, - bt_regs_info[i].vmax); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "regulator %s voltage set (%d)\n", - bt_regs_info[i].name, rc); - recover = i; - break; - } - } - - if (on && (recover > -1)) - for (i = recover; i >= 0; i--) { - regulator_put(bt_regs[i]); - bt_regs[i] = NULL; - } - - return rc; -} - -static int bluetooth_switch_regulators(int on) -{ - int i, rc = 0; - - for (i = 0; i < ARRAY_SIZE(bt_regs_info); i++) { - if (on && (bt_regs_status[i].enabled == false)) { - rc = regulator_enable(bt_regs[i]); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "regulator %s %s failed (%d)\n", - bt_regs_info[i].name, - "enable", rc); - if (i > 0) { - while (--i) { - regulator_disable(bt_regs[i]); - bt_regs_status[i].enabled - = false; - } - break; - } - } - bt_regs_status[i].enabled = true; - } else if (!on && (bt_regs_status[i].enabled == true)) { - rc = regulator_disable(bt_regs[i]); - if (rc < 0) { - dev_err(&msm_bt_power_device.dev, - "regulator %s %s failed (%d)\n", - bt_regs_info[i].name, - "disable", rc); - break; - } - bt_regs_status[i].enabled = false; - } - } - return rc; -} - -static struct msm_xo_voter *bt_clock; - -static int bluetooth_power(int on) -{ - int rc = 0; - int id; - - /* In case probe function fails, cur_connv_type would be -1 */ - id = adie_get_detected_connectivity_type(); - if (id != BAHAMA_ID) { - pr_err("%s: unexpected adie connectivity type: %d\n", - __func__, id); - return -ENODEV; - } - - if (on) { - - rc = bluetooth_use_regulators(1); - if (rc < 0) - goto out; - - rc = bluetooth_switch_regulators(1); - - if (rc < 0) - goto fail_put; - - bt_clock = msm_xo_get(MSM_XO_TCXO_D0, "bt_power"); - - if (IS_ERR(bt_clock)) { - pr_err("Couldn't get TCXO_D0 voter\n"); - goto fail_switch; - } - - rc = msm_xo_mode_vote(bt_clock, MSM_XO_MODE_ON); - - if (rc < 0) { - pr_err("Failed to vote for TCXO_DO ON\n"); - goto fail_vote; - } - - rc = bahama_bt(1); - - if (rc < 0) - goto fail_clock; - - msleep(10); - - rc = msm_xo_mode_vote(bt_clock, MSM_XO_MODE_PIN_CTRL); - - if (rc < 0) { - pr_err("Failed to vote for TCXO_DO pin control\n"); - goto fail_vote; - } - } else { - /* check for initial RFKILL block (power off) */ - /* some RFKILL versions/configurations rfkill_register */ - /* calls here for an initial set_block */ - /* avoid calling i2c and regulator before unblock (on) */ - if (platform_get_drvdata(&msm_bt_power_device) == NULL) { - dev_info(&msm_bt_power_device.dev, - "%s: initialized OFF/blocked\n", __func__); - goto out; - } - - bahama_bt(0); - -fail_clock: - msm_xo_mode_vote(bt_clock, MSM_XO_MODE_OFF); -fail_vote: - msm_xo_put(bt_clock); -fail_switch: - bluetooth_switch_regulators(0); -fail_put: - bluetooth_use_regulators(0); - } - -out: - if (rc < 0) - on = 0; - dev_info(&msm_bt_power_device.dev, - "Bluetooth power switch: state %d result %d\n", on, rc); - - return rc; -} - -#endif /*CONFIG_MARIMBA_CORE, CONFIG_MSM_BT_POWER, CONFIG_MSM_BT_POWER_MODULE*/ - -static void __init msm8x60_cfg_smsc911x(void) -{ - smsc911x_resources[1].start = - PM8058_GPIO_IRQ(PM8058_IRQ_BASE, 6); - smsc911x_resources[1].end = - PM8058_GPIO_IRQ(PM8058_IRQ_BASE, 6); -} - -void msm_fusion_setup_pinctrl(void) -{ - struct msm_xo_voter *a1; - - if (socinfo_get_platform_subtype() == 0x3) { - /* - * Vote for the A1 clock to be in pin control mode before - * the external images are loaded. - */ - a1 = msm_xo_get(MSM_XO_TCXO_A1, "mdm"); - BUG_ON(!a1); - msm_xo_mode_vote(a1, MSM_XO_MODE_PIN_CTRL); - } -} - -struct msm_board_data { - struct msm_gpiomux_configs *gpiomux_cfgs; -}; - -static struct msm_board_data msm8x60_surf_board_data __initdata = { - .gpiomux_cfgs = msm8x60_surf_ffa_gpiomux_cfgs, -}; - -static struct msm_board_data msm8x60_ffa_board_data __initdata = { - .gpiomux_cfgs = msm8x60_surf_ffa_gpiomux_cfgs, -}; - -static struct msm_board_data msm8x60_fluid_board_data __initdata = { - .gpiomux_cfgs = msm8x60_fluid_gpiomux_cfgs, -}; - -static struct msm_board_data msm8x60_charm_surf_board_data __initdata = { - .gpiomux_cfgs = msm8x60_charm_gpiomux_cfgs, -}; - -static struct msm_board_data msm8x60_charm_ffa_board_data __initdata = { - .gpiomux_cfgs = msm8x60_charm_gpiomux_cfgs, -}; - -static struct msm_board_data msm8x60_dragon_board_data __initdata = { - .gpiomux_cfgs = msm8x60_dragon_gpiomux_cfgs, -}; - -static void __init msm8x60_init(struct msm_board_data *board_data) -{ - uint32_t soc_platform_version; -#ifdef CONFIG_USB_EHCI_MSM_72K - struct pm8xxx_mpp_config_data hsusb_phy_mpp = { - .type = PM8XXX_MPP_TYPE_D_OUTPUT, - .level = PM8901_MPP_DIG_LEVEL_L5, - .control = PM8XXX_MPP_DOUT_CTRL_HIGH, - }; -#endif - pmic_reset_irq = PM8058_IRQ_BASE + PM8058_RESOUT_IRQ; - - platform_device_register(&msm_gpio_device); - /* - * Initialize RPM first as other drivers and devices may need - * it for their initialization. - */ - BUG_ON(msm_rpm_init(&msm8660_rpm_data)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data)); - if (msm_xo_init()) - pr_err("Failed to initialize XO votes\n"); - - msm8x60_check_2d_hardware(); - - /* Change SPM handling of core 1 if PMM 8160 is present. */ - soc_platform_version = socinfo_get_platform_version(); - if (SOCINFO_VERSION_MAJOR(soc_platform_version) == 1 && - SOCINFO_VERSION_MINOR(soc_platform_version) >= 2) { - struct msm_spm_platform_data *spm_data; - - spm_data = &msm_spm_data_v1[1]; - spm_data->reg_init_values[MSM_SPM_REG_SAW_CFG] &= ~0x0F00UL; - spm_data->reg_init_values[MSM_SPM_REG_SAW_CFG] |= 0x0100UL; - - spm_data = &msm_spm_data[1]; - spm_data->reg_init_values[MSM_SPM_REG_SAW_CFG] &= ~0x0F00UL; - spm_data->reg_init_values[MSM_SPM_REG_SAW_CFG] |= 0x0100UL; - } - - /* - * Initialize SPM before acpuclock as the latter calls into SPM - * driver to set ACPU voltages. - */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) != 1) - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); - else - msm_spm_init(msm_spm_data_v1, ARRAY_SIZE(msm_spm_data_v1)); - - /* - * Set regulators 8901_l4 and 8901_l6 to be always on in HPM for SURF - * devices so that the RPM doesn't drop into a low power mode that an - * un-reworked SURF cannot resume from. - */ - if (machine_is_msm8x60_surf()) { - int i; - - for (i = 0; i < ARRAY_SIZE(rpm_regulator_init_data); i++) - if (rpm_regulator_init_data[i].id - == RPM_VREG_ID_PM8901_L4 - || rpm_regulator_init_data[i].id - == RPM_VREG_ID_PM8901_L6) - rpm_regulator_init_data[i] - .init_data.constraints.always_on = 1; - } - - /* - * Disable regulator info printing so that regulator registration - * messages do not enter the kmsg log. - */ - regulator_suppress_info_printing(); - - /* Initialize regulators needed for clock_init. */ - platform_add_devices(early_regulators, ARRAY_SIZE(early_regulators)); - - msm_clock_init(&msm8x60_clock_init_data); - - /* Buses need to be initialized before early-device registration - * to get the platform data for fabrics. - */ - msm8x60_init_buses(); - platform_add_devices(early_devices, ARRAY_SIZE(early_devices)); - - /* - * Enable EBI2 only for boards which make use of it. Leave - * it disabled for all others for additional power savings. - */ - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fluid() || - machine_is_msm8x60_dragon()) - msm8x60_init_ebi2(); - msm8x60_init_gpiomux(board_data->gpiomux_cfgs); - msm8x60_init_uart12dm(); -#ifdef CONFIG_MSM_CAMERA_V4L2 - msm8x60_init_cam(); -#endif - msm8x60_init_mmc(); - - -#if defined(CONFIG_PMIC8058_OTHC) || defined(CONFIG_PMIC8058_OTHC_MODULE) - msm8x60_init_pm8058_othc(); -#endif - - if (machine_is_msm8x60_fluid()) - pm8058_platform_data.keypad_pdata = &fluid_keypad_data; - else if (machine_is_msm8x60_dragon()) - pm8058_platform_data.keypad_pdata = &dragon_keypad_data; - else - pm8058_platform_data.keypad_pdata = &ffa_keypad_data; -#if !defined(CONFIG_MSM_CAMERA_V4L2) && defined(CONFIG_WEBCAM_OV9726) - /* Specify reset pin for OV9726 */ - if (machine_is_msm8x60_dragon()) { - msm_camera_sensor_ov9726_data.sensor_reset = 62; - ov9726_sensor_8660_info.mount_angle = 270; - } -#endif -#ifdef CONFIG_BATTERY_MSM8X60 - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusion() || machine_is_msm8x60_dragon() || - machine_is_msm8x60_fusn_ffa() || machine_is_msm8x60_fluid()) - platform_device_register(&msm_charger_device); -#endif - - if (machine_is_msm8x60_dragon()) - pm8058_platform_data.charger_pdata = &pmic8058_charger_dragon; - if (!machine_is_msm8x60_fluid()) - pm8058_platform_data.charger_pdata = &pmic8058_charger_ffa_surf; - - /* configure pmic leds */ - if (machine_is_msm8x60_fluid()) - pm8058_platform_data.leds_pdata = &pm8058_fluid_flash_leds_data; - else if (machine_is_msm8x60_dragon()) - pm8058_platform_data.leds_pdata = &pm8058_dragon_leds_data; - else - pm8058_platform_data.leds_pdata = &pm8058_flash_leds_data; - - if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa() || - machine_is_msm8x60_dragon()) { - pm8058_platform_data.vibrator_pdata = &pm8058_vib_pdata; - } - - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_fluid() || machine_is_msm8x60_fusion() || - machine_is_msm8x60_fusn_ffa() || machine_is_msm8x60_dragon()) { - msm8x60_cfg_smsc911x(); - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) != 1) - platform_add_devices(msm8660_footswitch, - msm8660_num_footswitch); - platform_add_devices(surf_devices, - ARRAY_SIZE(surf_devices)); - -#ifdef CONFIG_MSM_DSPS - if (machine_is_msm8x60_fluid()) { - platform_device_unregister(&msm_gsbi12_qup_i2c_device); - msm8x60_init_dsps(); - } -#endif - - pm8901_vreg_mpp0_init(); - - platform_device_register(&msm8x60_8901_mpp_vreg); - -#ifdef CONFIG_USB_EHCI_MSM_72K - /* - * Drive MPP2 pin HIGH for PHY to generate ID interrupts on 8660 - * fluid - */ - if (machine_is_msm8x60_fluid()) - pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(1), &hsusb_phy_mpp); - msm_add_host(0, &msm_usb_host_pdata); -#endif - -#ifdef CONFIG_SND_SOC_MSM8660_APQ - if (machine_is_msm8x60_dragon()) - platform_add_devices(dragon_alsa_devices, - ARRAY_SIZE(dragon_alsa_devices)); - else -#endif - platform_add_devices(asoc_devices, - ARRAY_SIZE(asoc_devices)); - } -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() || - machine_is_msm8x60_dragon()) - msm8x60_cfg_isp1763(); -#endif - - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) - platform_add_devices(charm_devices, ARRAY_SIZE(charm_devices)); - - -#if defined(CONFIG_SPI_QUP) || defined(CONFIG_SPI_QUP_MODULE) - if (machine_is_msm8x60_fluid()) - platform_device_register(&msm_gsbi10_qup_spi_device); - else - platform_device_register(&msm_gsbi1_qup_spi_device); -#endif - -#if defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC) || \ - defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_QC_MODULE) - if (machine_is_msm8x60_fluid()) - cyttsp_set_params(); -#endif - msm_fb_add_devices(); - fixup_i2c_configs(); - register_i2c_devices(); - - if (machine_is_msm8x60_dragon()) - smsc911x_config.reset_gpio - = GPIO_ETHERNET_RESET_N_DRAGON; - - platform_device_register(&smsc911x_device); - -#if (defined(CONFIG_SPI_QUP)) && \ - (defined(CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT) || \ - defined(CONFIG_FB_MSM_LCDC_AUO_WVGA) || \ - defined(CONFIG_FB_MSM_LCDC_NT35582_WVGA)) - - if (machine_is_msm8x60_fluid()) { -#ifdef CONFIG_FB_MSM_LCDC_SAMSUNG_OLED_PT - if (SOCINFO_VERSION_MAJOR(soc_platform_version) < 3) { - spi_register_board_info(lcdc_samsung_spi_board_info, - ARRAY_SIZE(lcdc_samsung_spi_board_info)); - } else -#endif - { -#ifdef CONFIG_FB_MSM_LCDC_AUO_WVGA - spi_register_board_info(lcdc_auo_spi_board_info, - ARRAY_SIZE(lcdc_auo_spi_board_info)); -#endif - } -#ifdef CONFIG_FB_MSM_LCDC_NT35582_WVGA - } else if (machine_is_msm8x60_dragon()) { - spi_register_board_info(lcdc_nt35582_spi_board_info, - ARRAY_SIZE(lcdc_nt35582_spi_board_info)); -#endif - } -#endif - - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - - pm8058_gpios_init(); - -#ifdef CONFIG_SENSORS_MSM_ADC - if (machine_is_msm8x60_fluid()) { - msm_adc_pdata.dev_names = msm_adc_fluid_device_names; - msm_adc_pdata.num_adc = ARRAY_SIZE(msm_adc_fluid_device_names); - if (SOCINFO_VERSION_MAJOR(soc_platform_version) < 3) - msm_adc_pdata.gpio_config = APROC_CONFIG; - else - msm_adc_pdata.gpio_config = MPROC_CONFIG; - } - msm_adc_pdata.target_hw = MSM_8x60; -#endif -#ifdef CONFIG_MSM8X60_AUDIO - msm_snddev_init(); -#endif -#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE) - if (machine_is_msm8x60_fluid()) - platform_device_register(&fluid_leds_gpio); - else - platform_device_register(&gpio_leds); -#endif - - msm8x60_multi_sdio_init(); - - if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) - msm_fusion_setup_pinctrl(); -} - -static void __init msm8x60_surf_init(void) -{ - msm8x60_init(&msm8x60_surf_board_data); -} - -static void __init msm8x60_ffa_init(void) -{ - msm8x60_init(&msm8x60_ffa_board_data); -} - -static void __init msm8x60_fluid_init(void) -{ - msm8x60_init(&msm8x60_fluid_board_data); -} - -static void __init msm8x60_charm_surf_init(void) -{ - msm8x60_init(&msm8x60_charm_surf_board_data); -} - -static void __init msm8x60_charm_ffa_init(void) -{ - msm8x60_init(&msm8x60_charm_ffa_board_data); -} - -static void __init msm8x60_charm_init_early(void) -{ - msm8x60_allocate_memory_regions(); -} - -static void __init msm8x60_dragon_init(void) -{ - msm8x60_init(&msm8x60_dragon_board_data); -} - -MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_surf_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END - -MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_ffa_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END - -MACHINE_START(MSM8X60_FLUID, "QCT MSM8X60 FLUID") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_fluid_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END - -MACHINE_START(MSM8X60_FUSION, "QCT MSM8X60 FUSION SURF") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_charm_surf_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END - -MACHINE_START(MSM8X60_FUSN_FFA, "QCT MSM8X60 FUSION FFA") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_charm_ffa_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END - -MACHINE_START(MSM8X60_DRAGON, "QCT MSM8X60 DRAGON") - .map_io = msm8x60_map_io, - .reserve = msm8x60_reserve, - .init_irq = msm8x60_init_irq, - .init_machine = msm8x60_dragon_init, - .timer = &msm_timer, - .init_early = msm8x60_charm_init_early, - .restart = msm_restart, - .smp = &scorpion_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-qrd7627a.c b/arch/arm/mach-msm/board-qrd7627a.c deleted file mode 100644 index 923ef1e0566a..000000000000 --- a/arch/arm/mach-msm/board-qrd7627a.c +++ /dev/null @@ -1,1215 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "board-msm7x27a-regulator.h" -#include "devices.h" -#include "devices-msm7x2xa.h" -#include "pm.h" -#include "timer.h" -#include "pm-boot.h" -#include "board-msm7x27a-regulator.h" -#include "board-msm7627a.h" -#include "platsmp.h" - -#define RESERVE_KERNEL_EBI1_SIZE 0x3A000 -#define MSM_RESERVE_AUDIO_SIZE 0x1F4000 -#define BAHAMA_SLAVE_ID_FM_REG 0x02 -#define FM_GPIO 83 -#define BT_PCM_BCLK_MODE 0x88 -#define BT_PCM_DIN_MODE 0x89 -#define BT_PCM_DOUT_MODE 0x8A -#define BT_PCM_SYNC_MODE 0x8B -#define FM_I2S_SD_MODE 0x8E -#define FM_I2S_WS_MODE 0x8F -#define FM_I2S_SCK_MODE 0x90 -#define I2C_PIN_CTL 0x15 -#define I2C_NORMAL 0x40 - - -static struct platform_device msm_wlan_ar6000_pm_device = { - .name = "wlan_ar6000_pm_dev", - .id = -1, -}; - -static struct msm_serial_platform_data msm_8625_uart1_pdata = { - .userid = 10, -}; - -static struct msm_gpio qup_i2c_gpios_io[] = { - { GPIO_CFG(60, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(61, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, - { GPIO_CFG(131, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "qup_scl" }, - { GPIO_CFG(132, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "qup_sda" }, -}; - -static struct msm_gpio qup_i2c_gpios_hw[] = { - { GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, - { GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "qup_scl" }, - { GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "qup_sda" }, -}; - -static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type) -{ - int rc; - - if (adap_id < 0 || adap_id > 1) - return; - - /* Each adapter gets 2 lines from the table */ - if (config_type) - rc = msm_gpios_request_enable(&qup_i2c_gpios_hw[adap_id*2], 2); - else - rc = msm_gpios_request_enable(&qup_i2c_gpios_io[adap_id*2], 2); - if (rc < 0) - pr_err("QUP GPIO request/enable failed: %d\n", rc); -} - -static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = { - .clk_freq = 100000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_i2c_platform_data msm_gsbi1_qup_i2c_pdata = { - .clk_freq = 100000, - .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config, -}; - -static struct msm_gpio msm8625q_i2c_gpio_config[] = { - { GPIO_CFG(39, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_scl" }, - { GPIO_CFG(36, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), - "qup_sda" }, -}; - -static struct i2c_gpio_platform_data msm8625q_i2c_gpio_pdata = { - .scl_pin = 39, - .sda_pin = 36, - .udelay = 5, /* 100 Khz */ -}; - -static struct platform_device msm8625q_i2c_gpio = { - .name = "i2c-gpio", - .id = 2, - .dev = { - .platform_data = &msm8625q_i2c_gpio_pdata, - } -}; - -#ifdef CONFIG_ARCH_MSM7X27A - -#define MSM_RESERVE_MDP_SIZE 0x1B00000 -#define MSM_RESERVE_ADSP_SIZE 0x1200000 -#define CAMERA_ZSL_SIZE (SZ_1M * 60) - -#ifdef CONFIG_ION_MSM -#define MSM_ION_HEAP_NUM 4 -static struct platform_device ion_dev; -static int msm_ion_camera_size; -static int msm_ion_audio_size; -static int msm_ion_sf_size; -#endif -#endif - -static struct android_usb_platform_data android_usb_pdata = { - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, - .cdrom = 1, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -#ifdef CONFIG_USB_EHCI_MSM_72K -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - int rc = 0; - unsigned gpio; - - gpio = QRD_GPIO_HOST_VBUS_EN; - - rc = gpio_request(gpio, "i2c_host_vbus_en"); - if (rc < 0) { - pr_err("failed to request %d GPIO\n", gpio); - return; - } - gpio_direction_output(gpio, !!on); - gpio_set_value_cansleep(gpio, !!on); - gpio_free(gpio); -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM), -}; - -static void __init msm7627a_init_host(void) -{ - msm_add_host(0, &msm_usb_host_pdata); -} -#endif - -#ifdef CONFIG_USB_MSM_OTG_72K -static int hsusb_rpc_connect(int connect) -{ - if (connect) - return msm_hsusb_rpc_connect(); - else - return msm_hsusb_rpc_close(); -} - -static struct regulator *reg_hsusb; -static int msm_hsusb_ldo_init(int init) -{ - int rc = 0; - - if (init) { - reg_hsusb = regulator_get(NULL, "usb"); - if (IS_ERR(reg_hsusb)) { - rc = PTR_ERR(reg_hsusb); - pr_err("%s: could not get regulator: %d\n", - __func__, rc); - goto out; - } - - rc = regulator_set_voltage(reg_hsusb, 3300000, 3300000); - if (rc) { - pr_err("%s: could not set voltage: %d\n", - __func__, rc); - goto reg_free; - } - - return 0; - } - /* else fall through */ -reg_free: - regulator_put(reg_hsusb); -out: - reg_hsusb = NULL; - return rc; -} - -static int msm_hsusb_ldo_enable(int enable) -{ - static int ldo_status; - - if (IS_ERR_OR_NULL(reg_hsusb)) - return reg_hsusb ? PTR_ERR(reg_hsusb) : -ENODEV; - - if (ldo_status == enable) - return 0; - - ldo_status = enable; - - return enable ? - regulator_enable(reg_hsusb) : - regulator_disable(reg_hsusb); -} - -#ifndef CONFIG_USB_EHCI_MSM_72K -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) -{ - int ret = 0; - - if (init) - ret = msm_pm_app_rpc_init(callback); - else - msm_pm_app_rpc_deinit(callback); - - return ret; -} -#endif - -static struct msm_otg_platform_data msm_otg_pdata = { -#ifndef CONFIG_USB_EHCI_MSM_72K - .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init, -#else - .vbus_power = msm_hsusb_vbus_power, -#endif - .rpc_connect = hsusb_rpc_connect, - .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT, - .cdr_autoreset = CDR_AUTO_RESET_DISABLE, - .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT, - .se1_gating = SE1_GATING_DISABLE, - .ldo_init = msm_hsusb_ldo_init, - .ldo_enable = msm_hsusb_ldo_enable, - .chg_init = hsusb_chg_init, - .chg_connected = hsusb_chg_connected, - .chg_vbus_draw = hsusb_chg_vbus_draw, -}; -#endif - -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = { - .is_phy_status_timer_on = 1, - .prop_chg = 0, -}; - -#ifdef CONFIG_SERIAL_MSM_HS -static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = { - .inject_rx_on_wakeup = 1, - .rx_to_inject = 0xFD, -}; -#endif -static struct msm_pm_platform_data msm7627a_pm_data[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 16000, - .residency = 20000, - }, - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 12000, - .residency = 20000, - }, - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 1, - .latency = 2000, - .residency = 0, - }, - [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 0, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS, - .p_addr = 0, -}; - -/* 8625 PM platform data */ -static struct msm_pm_platform_data - msm8625_pm_data[MSM_PM_SLEEP_MODE_NR * CONFIG_NR_CPUS] = { - /* CORE0 entries */ - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 16000, - .residency = 20000, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 12000, - .residency = 20000, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(2, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(2, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - - /* picked latency & redisdency values from 7x30 */ - [MSM_PM_MODE(3, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 0, - .latency = 500, - .residency = 500, - }, - - [MSM_PM_MODE(3, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 10, - }, - -}; - -static struct msm_pm_boot_platform_data msm_pm_8625_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_REMAP_BOOT_ADDR, - .v_addr = MSM_CFG_CTL_BASE, -}; - -static unsigned reserve_mdp_size = MSM_RESERVE_MDP_SIZE; -static int __init reserve_mdp_size_setup(char *p) -{ - reserve_mdp_size = memparse(p, NULL); - return 0; -} - -early_param("reserve_mdp_size", reserve_mdp_size_setup); - -static unsigned reserve_adsp_size = MSM_RESERVE_ADSP_SIZE; -static int __init reserve_adsp_size_setup(char *p) -{ - reserve_adsp_size = memparse(p, NULL); - return 0; -} - -early_param("reserve_adsp_size", reserve_adsp_size_setup); - -static u32 msm_calculate_batt_capacity(u32 current_voltage); - -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .voltage_min_design = 3500, - .voltage_max_design = 4200, - .voltage_fail_safe = 3598, - .avail_chg_sources = AC_CHG | USB_CHG , - .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION, - .calculate_capacity = &msm_calculate_batt_capacity, -}; - -static u32 msm_calculate_batt_capacity(u32 current_voltage) -{ - u32 low_voltage = msm_psy_batt_data.voltage_min_design; - u32 high_voltage = msm_psy_batt_data.voltage_max_design; - - if (current_voltage <= low_voltage) - return 0; - else if (current_voltage >= high_voltage) - return 100; - else - return (current_voltage - low_voltage) * 100 - / (high_voltage - low_voltage); -} - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; - -static char *msm_adc_surf_device_names[] = { - "XO_ADC", -}; - -static struct msm_adc_platform_data msm_adc_pdata = { - .dev_names = msm_adc_surf_device_names, - .num_adc = ARRAY_SIZE(msm_adc_surf_device_names), - .target_hw = MSM_8x25, -}; - -static struct platform_device msm_adc_device = { - .name = "msm_adc", - .id = -1, - .dev = { - .platform_data = &msm_adc_pdata, - }, -}; - -#ifdef CONFIG_MSM_RTB -static struct msm_rtb_platform_data msm7627a_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - msm7627a_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - -struct platform_device msm7627a_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &msm7627a_rtb_pdata, - }, -}; -#endif - -#define GPIO_VREG_INIT(_id, _reg_name, _gpio_label, _gpio, _active_low) \ - [GPIO_VREG_ID_##_id] = { \ - .init_data = { \ - .constraints = { \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = \ - ARRAY_SIZE(vreg_consumers_##_id), \ - .consumer_supplies = vreg_consumers_##_id, \ - }, \ - .regulator_name = _reg_name, \ - .active_low = _active_low, \ - .gpio_label = _gpio_label, \ - .gpio = _gpio, \ - } - -#define GPIO_VREG_ID_EXT_2P85V 0 -#define GPIO_VREG_ID_EXT_1P8V 1 -#define GPIO_VREG_ID_EXT_2P85V_SKU3 2 -#define GPIO_VREG_ID_EXT_1P8V_SKU3 3 -#define GPIO_VREG_ID_EXT_1P8V_SKU3_1 4 - -static struct regulator_consumer_supply vreg_consumers_EXT_2P85V[] = { - REGULATOR_SUPPLY("cam_ov5647_avdd", "0-006c"), - REGULATOR_SUPPLY("cam_ov7692_avdd", "0-0078"), - REGULATOR_SUPPLY("cam_ov8825_avdd", "0-000d"), - REGULATOR_SUPPLY("lcd_vdd", "mipi_dsi.1"), -}; - -static struct regulator_consumer_supply vreg_consumers_EXT_1P8V[] = { - REGULATOR_SUPPLY("cam_ov5647_vdd", "0-006c"), - REGULATOR_SUPPLY("cam_ov7692_vdd", "0-0078"), - REGULATOR_SUPPLY("cam_ov8825_vdd", "0-000d"), - REGULATOR_SUPPLY("lcd_vddi", "mipi_dsi.1"), -}; - -static struct regulator_consumer_supply vreg_consumers_EXT_2P85V_SKU3[] = { - REGULATOR_SUPPLY("cam_ov5647_avdd", "0-006c"), - REGULATOR_SUPPLY("cam_ov7692_avdd", "0-0078"), - REGULATOR_SUPPLY("cam_ov8825_avdd", "0-000d"), - REGULATOR_SUPPLY("lcd_vdd_sku3", "lcdc.0"), -}; - -static struct regulator_consumer_supply vreg_consumers_EXT_1P8V_SKU3[] = { - REGULATOR_SUPPLY("cam_ov5647_vdd", "0-006c"), - REGULATOR_SUPPLY("cam_ov7692_vdd", "0-0078"), - REGULATOR_SUPPLY("cam_ov8825_vdd", "0-000d"), - REGULATOR_SUPPLY("lcd_vddi_sku3", "lcdc.0"), -}; - -static struct regulator_consumer_supply vreg_consumers_EXT_1P8V_SKU3_1[] = { - REGULATOR_SUPPLY("cam_ov5647_vdd", "0-006c"), - REGULATOR_SUPPLY("cam_ov7692_vdd", "0-0078"), - REGULATOR_SUPPLY("cam_ov8825_vdd", "0-000d"), - REGULATOR_SUPPLY("lcd_vddi_sku3", "lcdc.0"), -}; - -/* GPIO regulator constraints */ -static struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] = { - GPIO_VREG_INIT(EXT_2P85V, "ext_2p85v", "ext_2p85v_en", 35, 0), - GPIO_VREG_INIT(EXT_1P8V, "ext_1p8v", "ext_1p8v_en", 40, 0), - GPIO_VREG_INIT(EXT_2P85V_SKU3, "ext_2p85v_sku3", "ext_2p85v_sku3_en", - 35, 0), - GPIO_VREG_INIT(EXT_1P8V_SKU3, "ext_1p8v_sku3", "ext_1p8v_sku3_en", - 34, 0), - GPIO_VREG_INIT(EXT_1P8V_SKU3_1, "ext_1p8v_sku3_1", "ext_1p8v_sku3_1_en", - 58, 0), -}; - -/* GPIO regulator */ -static struct platform_device qrd_vreg_gpio_ext_2p85v = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 35, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_2P85V], - }, -}; - -static struct platform_device qrd_vreg_gpio_ext_1p8v = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 40, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_1P8V], - }, -}; - -static struct platform_device qrd_vreg_gpio_ext_2p85v_sku3 = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 35, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_2P85V_SKU3], - }, -}; - -static struct platform_device qrd_vreg_gpio_ext_1p8v_sku3 = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 34, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_1P8V_SKU3], - }, -}; - -static struct platform_device qrd_vreg_gpio_ext_1p8v_sku3_1 = { - .name = GPIO_REGULATOR_DEV_NAME, - .id = 58, - .dev = { - .platform_data = - &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_1P8V_SKU3_1], - }, -}; - -/* Regulator configuration for the NCP6335D buck */ -struct regulator_consumer_supply ncp6335d_consumer_supplies[] = { - REGULATOR_SUPPLY("ncp6335d", NULL), - /* TO DO: NULL entry needs to be fixed once - * we fix the cross-dependencies. - */ - REGULATOR_SUPPLY("vddx_cx", NULL), -}; - -static struct regulator_init_data ncp6335d_init_data = { - .constraints = { - .name = "ncp6335d_sw", - .min_uV = 600000, - .max_uV = 1400000, - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | - REGULATOR_CHANGE_STATUS | - REGULATOR_CHANGE_MODE, - .valid_modes_mask = REGULATOR_MODE_NORMAL | - REGULATOR_MODE_FAST, - .initial_mode = REGULATOR_MODE_NORMAL, - .always_on = 1, - }, - .num_consumer_supplies = ARRAY_SIZE(ncp6335d_consumer_supplies), - .consumer_supplies = ncp6335d_consumer_supplies, -}; - -static struct ncp6335d_platform_data ncp6335d_pdata = { - .init_data = &ncp6335d_init_data, - .default_vsel = NCP6335D_VSEL0, - .slew_rate_ns = 166, - .sleep_enable = true, -}; - -static struct i2c_board_info i2c2_info[] __initdata = { - { - I2C_BOARD_INFO("ncp6335d", 0x38 >> 1), - .platform_data = &ncp6335d_pdata, - }, -}; - -static struct platform_device *common_devices[] __initdata = { - &android_usb_device, - &msm_batt_device, - &msm_device_adspdec, - &msm_device_snd, - &msm_device_cad, - &asoc_msm_pcm, - &asoc_msm_dai0, - &asoc_msm_dai1, - &msm_adc_device, -#ifdef CONFIG_MSM_RTB - &msm7627a_rtb_device, -#endif -#ifdef CONFIG_ION_MSM - &ion_dev, -#endif -}; - -static struct platform_device *qrd7627a_devices[] __initdata = { - &msm_device_dmov, - &msm_device_smd, - &msm_device_uart1, - &msm_device_uart_dm1, - &msm_gsbi0_qup_i2c_device, - &msm_gsbi1_qup_i2c_device, - &msm_device_otg, - &msm_device_gadget_peripheral, - &msm_kgsl_3d0, -}; - -static struct platform_device *msm8625_lcd_camera_devices[] __initdata = { - &qrd_vreg_gpio_ext_2p85v, - &qrd_vreg_gpio_ext_1p8v, -}; - -static struct platform_device *sku3_lcd_camera_devices[] __initdata = { - &qrd_vreg_gpio_ext_2p85v_sku3, - &qrd_vreg_gpio_ext_1p8v_sku3, -}; - -static struct platform_device *sku3_1_lcd_camera_devices[] __initdata = { - &qrd_vreg_gpio_ext_2p85v_sku3, - &qrd_vreg_gpio_ext_1p8v_sku3_1, -}; - -static struct platform_device *qrd3_devices[] __initdata = { - &msm_device_nand, -}; - -static struct platform_device *msm8625_evb_devices[] __initdata = { - &msm8625_device_dmov, - &msm8625_device_smd, - &msm8625_gsbi0_qup_i2c_device, - &msm8625_gsbi1_qup_i2c_device, - &msm8625_device_uart1, - &msm8625_device_uart_dm1, - &msm8625_device_otg, - &msm8625_device_gadget_peripheral, - &msm8625_kgsl_3d0, -}; - -static unsigned reserve_kernel_ebi1_size = RESERVE_KERNEL_EBI1_SIZE; -static int __init reserve_kernel_ebi1_size_setup(char *p) -{ - reserve_kernel_ebi1_size = memparse(p, NULL); - return 0; -} -early_param("reserve_kernel_ebi1_size", reserve_kernel_ebi1_size_setup); - - -static unsigned reserve_audio_size = MSM_RESERVE_AUDIO_SIZE; -static int __init reserve_audio_size_setup(char *p) -{ - reserve_audio_size = memparse(p, NULL); - return 0; -} -early_param("reserve_audio_size", reserve_audio_size_setup); - -static void fix_sizes(void) -{ - if (get_ddr_size() > SZ_512M) - reserve_adsp_size = CAMERA_ZSL_SIZE; -#ifdef CONFIG_ION_MSM - msm_ion_camera_size = reserve_adsp_size; - msm_ion_audio_size = (MSM_RESERVE_AUDIO_SIZE + - RESERVE_KERNEL_EBI1_SIZE); - msm_ion_sf_size = reserve_mdp_size; -#endif -} - -#ifdef CONFIG_ION_MSM -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION -static struct ion_co_heap_pdata co_ion_pdata = { - .adjacent_mem_id = INVALID_HEAP_ID, - .align = PAGE_SIZE, -}; -#endif - -/** - * These heaps are listed in the order they will be allocated. - * Don't swap the order unless you know what you are doing! - */ -struct ion_platform_heap qrd7627a_heaps[] = { - { - .id = ION_SYSTEM_HEAP_ID, - .type = ION_HEAP_TYPE_SYSTEM, - .name = ION_VMALLOC_HEAP_NAME, - }, -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - /* ION_ADSP = CAMERA */ - { - .id = ION_CAMERA_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_CAMERA_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* ION_AUDIO */ - { - .id = ION_AUDIO_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_AUDIO_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, - /* ION_MDP = SF */ - { - .id = ION_SF_HEAP_ID, - .type = ION_HEAP_TYPE_CARVEOUT, - .name = ION_SF_HEAP_NAME, - .memory_type = ION_EBI_TYPE, - .extra_data = (void *)&co_ion_pdata, - }, -#endif -}; - -static struct ion_platform_data ion_pdata = { - .nr = MSM_ION_HEAP_NUM, - .has_outer_cache = 1, - .heaps = qrd7627a_heaps, -}; - -static struct platform_device ion_dev = { - .name = "ion-msm", - .id = 1, - .dev = { .platform_data = &ion_pdata }, -}; -#endif - -static struct memtype_reserve msm7627a_reserve_table[] __initdata = { - [MEMTYPE_SMI] = { - }, - [MEMTYPE_EBI0] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, - [MEMTYPE_EBI1] = { - .flags = MEMTYPE_FLAGS_1M_ALIGN, - }, -}; - -#ifdef CONFIG_MSM_RTB -static void __init reserve_rtb_memory(void) -{ - msm7627a_reserve_table[MEMTYPE_EBI1].size += msm7627a_rtb_pdata.size; -} -#else -static void __init reserve_rtb_memory(void) -{ -} -#endif - -static void __init size_ion_devices(void) -{ -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - ion_pdata.heaps[1].size = msm_ion_camera_size; - ion_pdata.heaps[2].size = msm_ion_audio_size; - ion_pdata.heaps[3].size = msm_ion_sf_size; -#endif -} - -static void __init reserve_ion_memory(void) -{ -#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION) - msm7627a_reserve_table[MEMTYPE_EBI1].size += msm_ion_camera_size; - msm7627a_reserve_table[MEMTYPE_EBI1].size += msm_ion_audio_size; - msm7627a_reserve_table[MEMTYPE_EBI1].size += msm_ion_sf_size; -#endif -} - -static void __init msm7627a_calculate_reserve_sizes(void) -{ - fix_sizes(); - size_ion_devices(); - reserve_ion_memory(); - reserve_rtb_memory(); -} - -static int msm7627a_paddr_to_memtype(unsigned int paddr) -{ - return MEMTYPE_EBI1; -} - -static struct reserve_info msm7627a_reserve_info __initdata = { - .memtype_reserve_table = msm7627a_reserve_table, - .calculate_reserve_sizes = msm7627a_calculate_reserve_sizes, - .paddr_to_memtype = msm7627a_paddr_to_memtype, -}; - -static void __init msm7627a_reserve(void) -{ - reserve_info = &msm7627a_reserve_info; - msm_reserve(); - memblock_remove(MSM8625_WARM_BOOT_PHYS, SZ_32); -} - -static void __init msm8625_reserve(void) -{ - memblock_remove(MSM8625_CPU_PHYS, SZ_8); - msm7627a_reserve(); -} - -static void msmqrd_adsp_add_pdev(void) -{ - int rc = 0; - struct rpc_board_dev *rpc_adsp_pdev; - - rpc_adsp_pdev = kzalloc(sizeof(struct rpc_board_dev), GFP_KERNEL); - if (rpc_adsp_pdev == NULL) { - pr_err("%s: Memory Allocation failure\n", __func__); - return; - } - rpc_adsp_pdev->prog = ADSP_RPC_PROG; - - if (cpu_is_msm8625() || cpu_is_msm8625q()) - rpc_adsp_pdev->pdev = msm8625_device_adsp; - else - rpc_adsp_pdev->pdev = msm_adsp_device; - rc = msm_rpc_add_board_dev(rpc_adsp_pdev, 1); - if (rc < 0) { - pr_err("%s: return val: %d\n", __func__, rc); - kfree(rpc_adsp_pdev); - } -} - -static void __init msm7627a_device_i2c_init(void) -{ - msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata; - msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata; -} - -static void __init msm8625_device_i2c_init(void) -{ - int i, rc; - - msm8625_gsbi0_qup_i2c_device.dev.platform_data - = &msm_gsbi0_qup_i2c_pdata; - msm8625_gsbi1_qup_i2c_device.dev.platform_data - = &msm_gsbi1_qup_i2c_pdata; - if (machine_is_qrd_skud_prime() || cpu_is_msm8625q()) { - for (i = 0 ; i < ARRAY_SIZE(msm8625q_i2c_gpio_config); i++) { - rc = gpio_tlmm_config( - msm8625q_i2c_gpio_config[i].gpio_cfg, - GPIO_CFG_ENABLE); - if (rc) - pr_err("I2C-gpio tlmm config failed\n"); - } - rc = platform_device_register(&msm8625q_i2c_gpio); - if (rc) - pr_err("%s: could not register i2c-gpio device: %d\n", - __func__, rc); - } -} - -static struct platform_device msm_proccomm_regulator_dev = { - .name = PROCCOMM_REGULATOR_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &msm7x27a_proccomm_regulator_data - } -}; - -static void __init msm7627a_init_regulators(void) -{ - int rc = platform_device_register(&msm_proccomm_regulator_dev); - if (rc) - pr_err("%s: could not register regulator device: %d\n", - __func__, rc); -} - -static int __init msm_qrd_init_ar6000pm(void) -{ - msm_wlan_ar6000_pm_device.dev.platform_data = &ar600x_wlan_power; - return platform_device_register(&msm_wlan_ar6000_pm_device); -} - -static void __init msm_add_footswitch_devices(void) -{ - platform_add_devices(msm_footswitch_devices, - msm_num_footswitch_devices); -} - -static void __init add_platform_devices(void) -{ - if (machine_is_msm8625_evb() || machine_is_msm8625_qrd7() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) { - msm8625_device_uart1.dev.platform_data = &msm_8625_uart1_pdata; - platform_add_devices(msm8625_evb_devices, - ARRAY_SIZE(msm8625_evb_devices)); - platform_add_devices(qrd3_devices, - ARRAY_SIZE(qrd3_devices)); - } else { - platform_add_devices(qrd7627a_devices, - ARRAY_SIZE(qrd7627a_devices)); - } - - if (machine_is_msm7627a_qrd3() || machine_is_msm7627a_evb()) - platform_add_devices(qrd3_devices, - ARRAY_SIZE(qrd3_devices)); - - if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() - || machine_is_msm8625_evt() - || machine_is_qrd_skud_prime()) - platform_add_devices(msm8625_lcd_camera_devices, - ARRAY_SIZE(msm8625_lcd_camera_devices)); - else if (machine_is_msm8625_qrd7()) - platform_add_devices(sku3_1_lcd_camera_devices, - ARRAY_SIZE(sku3_1_lcd_camera_devices)); - else if (machine_is_msm7627a_qrd3()) { - u32 socinfo = socinfo_get_platform_type(); - if (socinfo == 0x0B) - platform_add_devices(sku3_lcd_camera_devices, - ARRAY_SIZE(sku3_lcd_camera_devices)); - else if (socinfo == 0x0F) - platform_add_devices(sku3_1_lcd_camera_devices, - ARRAY_SIZE(sku3_1_lcd_camera_devices)); - } - - platform_add_devices(common_devices, - ARRAY_SIZE(common_devices)); -} - -#define UART1DM_RX_GPIO 45 -static void __init qrd7627a_uart1dm_config(void) -{ - msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO); - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm8625_device_uart_dm1.dev.platform_data = - &msm_uart_dm1_pdata; - else - msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata; -} - -static void __init qrd7627a_otg_gadget(void) -{ - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - msm_otg_pdata.swfi_latency = msm8625_pm_data - [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT].latency; - msm8625_device_otg.dev.platform_data = &msm_otg_pdata; - msm8625_device_gadget_peripheral.dev.platform_data = - &msm_gadget_pdata; - - } else { - msm_otg_pdata.swfi_latency = msm7627a_pm_data - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_otg.dev.platform_data = &msm_otg_pdata; - msm_device_gadget_peripheral.dev.platform_data = - &msm_gadget_pdata; - } -} - -static void __init msm_pm_init(void) -{ - - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) { - msm_pm_set_platform_data(msm7627a_pm_data, - ARRAY_SIZE(msm7627a_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - } else { - msm_pm_set_platform_data(msm8625_pm_data, - ARRAY_SIZE(msm8625_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_8625_boot_pdata)); - msm8x25_spm_device_init(); - msm_pm_register_cpr_ops(); - } -} - -static void __init msm_qrd_init(void) -{ - msm7x2x_misc_init(); - msm7627a_init_regulators(); - msmqrd_adsp_add_pdev(); - - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm8625_device_i2c_init(); - else - msm7627a_device_i2c_init(); - - /* uart1dm*/ - qrd7627a_uart1dm_config(); - /*OTG gadget*/ - qrd7627a_otg_gadget(); - - msm_add_footswitch_devices(); - add_platform_devices(); - - /* Ensure ar6000pm device is registered before MMC/SDC */ - msm_qrd_init_ar6000pm(); - msm7627a_init_mmc(); - -#ifdef CONFIG_USB_EHCI_MSM_72K - msm7627a_init_host(); -#endif - msm_pm_init(); - - msm_pm_register_irqs(); - msm_fb_add_devices(); - - if (machine_is_qrd_skud_prime()) - i2c_register_board_info(2, i2c2_info, - ARRAY_SIZE(i2c2_info)); - - -#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) - msm7627a_bt_power_init(); -#endif - - msm7627a_camera_init(); - qrd7627a_add_io_devices(); - msm7x25a_kgsl_3d0_init(); - msm8x25_kgsl_3d0_init(); -} - -static void __init qrd7627a_init_early(void) -{ - msm_msm7627a_allocate_memory_regions(); -} - -MACHINE_START(MSM7627A_QRD1, "QRD MSM7627a QRD1") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7627a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7627A_QRD3, "QRD MSM7627a QRD3") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7627a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM7627A_EVB, "QRD MSM7627a EVB") - .atag_offset = 0x100, - .map_io = msm_common_io_init, - .reserve = msm7627a_reserve, - .init_irq = msm_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .handle_irq = vic_handle_irq, -MACHINE_END -MACHINE_START(MSM8625_EVB, "QRD MSM8625 EVB") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END -MACHINE_START(MSM8625_QRD7, "QRD MSM8625 QRD7") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END -MACHINE_START(MSM8625_EVT, "QRD MSM8625 EVT") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END -MACHINE_START(QRD_SKUD_PRIME, "QRD MSM8625 SKUD PRIME") - .atag_offset = 0x100, - .map_io = msm8625_map_io, - .reserve = msm8625_reserve, - .init_irq = msm8625_init_irq, - .init_machine = msm_qrd_init, - .timer = &msm_timer, - .init_early = qrd7627a_init_early, - .smp = &msm8625_smp_ops, -MACHINE_END diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c deleted file mode 100644 index a93298734671..000000000000 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ /dev/null @@ -1,2548 +0,0 @@ -/* Copyright (c) 2008-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "timer.h" -#include "msm-keypad-devices.h" -#include "acpuclock.h" -#include "clock.h" -#include "pm.h" -#include "irq.h" -#include "pm-boot.h" -#ifdef CONFIG_USB_ANDROID -#include -#endif - -#define TOUCHPAD_SUSPEND 34 -#define TOUCHPAD_IRQ 38 - -#define MSM_PMEM_SF_SIZE 0x1700000 - -#define SMEM_SPINLOCK_I2C "S:6" - -#define MSM_PMEM_ADSP_SIZE 0x2A05000 -#define MSM_FB_SIZE 0x2EE000 -#define MSM_AUDIO_SIZE 0x80000 - -#ifdef CONFIG_MSM_SOC_REV_A -#define MSM_SMI_BASE 0xE0000000 -#else -#define MSM_SMI_BASE 0x00000000 -#endif - -#define MSM_SHARED_RAM_PHYS (MSM_SMI_BASE + 0x00100000) - -#define MSM_PMEM_SMI_BASE (MSM_SMI_BASE + 0x02B00000) -#define MSM_PMEM_SMI_SIZE 0x01500000 - -#define MSM_FB_BASE MSM_PMEM_SMI_BASE -#define MSM_PMEM_SMIPOOL_BASE (MSM_FB_BASE + MSM_FB_SIZE) -#define MSM_PMEM_SMIPOOL_SIZE (MSM_PMEM_SMI_SIZE - MSM_FB_SIZE) - -#define PMEM_KERNEL_EBI1_SIZE 0x28000 - -#define PMIC_VREG_WLAN_LEVEL 2600 -#define PMIC_VREG_GP6_LEVEL 2900 - -#define FPGA_SDCC_STATUS 0x70000280 - -static struct resource smc91x_resources[] = { - [0] = { - .flags = IORESOURCE_MEM, - }, - [1] = { - .flags = IORESOURCE_IRQ, - }, -}; - -#ifdef CONFIG_USB_FUNCTION -static struct usb_mass_storage_platform_data usb_mass_storage_pdata = { - .nluns = 0x02, - .buf_size = 16384, - .vendor = "GOOGLE", - .product = "Mass storage", - .release = 0xffff, -}; - -static struct platform_device mass_storage_device = { - .name = "usb_mass_storage", - .id = -1, - .dev = { - .platform_data = &usb_mass_storage_pdata, - }, -}; -#endif - -#ifdef CONFIG_USB_ANDROID -static char *usb_functions_default[] = { - "diag", - "modem", - "nmea", - "rmnet", - "usb_mass_storage", -}; - -static char *usb_functions_default_adb[] = { - "diag", - "adb", - "modem", - "nmea", - "rmnet", - "usb_mass_storage", -}; - -static char *usb_functions_rndis[] = { - "rndis", -}; - -static char *usb_functions_rndis_adb[] = { - "rndis", - "adb", -}; - -static char *usb_functions_all[] = { -#ifdef CONFIG_USB_ANDROID_RNDIS - "rndis", -#endif -#ifdef CONFIG_USB_ANDROID_DIAG - "diag", -#endif - "adb", -#ifdef CONFIG_USB_F_SERIAL - "modem", - "nmea", -#endif -#ifdef CONFIG_USB_ANDROID_RMNET - "rmnet", -#endif - "usb_mass_storage", -#ifdef CONFIG_USB_ANDROID_ACM - "acm", -#endif -}; - -static struct android_usb_product usb_products[] = { - { - .product_id = 0x9026, - .num_functions = ARRAY_SIZE(usb_functions_default), - .functions = usb_functions_default, - }, - { - .product_id = 0x9025, - .num_functions = ARRAY_SIZE(usb_functions_default_adb), - .functions = usb_functions_default_adb, - }, - { - .product_id = 0xf00e, - .num_functions = ARRAY_SIZE(usb_functions_rndis), - .functions = usb_functions_rndis, - }, - { - .product_id = 0x9024, - .num_functions = ARRAY_SIZE(usb_functions_rndis_adb), - .functions = usb_functions_rndis_adb, - }, -}; - -static struct usb_mass_storage_platform_data mass_storage_pdata = { - .nluns = 1, - .vendor = "Qualcomm Incorporated", - .product = "Mass storage", - .release = 0x0100, -}; - -static struct platform_device usb_mass_storage_device = { - .name = "usb_mass_storage", - .id = -1, - .dev = { - .platform_data = &mass_storage_pdata, - }, -}; - -static struct usb_ether_platform_data rndis_pdata = { - /* ethaddr is filled by board_serialno_setup */ - .vendorID = 0x05C6, - .vendorDescr = "Qualcomm Incorporated", -}; - -static struct platform_device rndis_device = { - .name = "rndis", - .id = -1, - .dev = { - .platform_data = &rndis_pdata, - }, -}; - -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x05C6, - .product_id = 0x9026, - .version = 0x0100, - .product_name = "Qualcomm HSUSB Device", - .manufacturer_name = "Qualcomm Incorporated", - .num_products = ARRAY_SIZE(usb_products), - .products = usb_products, - .num_functions = ARRAY_SIZE(usb_functions_all), - .functions = usb_functions_all, - .serial_number = "1234567890ABCDEF", -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -static int __init board_serialno_setup(char *serialno) -{ - int i; - char *src = serialno; - - /* create a fake MAC address from our serial number. - * first byte is 0x02 to signify locally administered. - */ - rndis_pdata.ethaddr[0] = 0x02; - for (i = 0; *src; i++) { - /* XOR the USB serial across the remaining bytes */ - rndis_pdata.ethaddr[i % (ETH_ALEN - 1) + 1] ^= *src++; - } - - android_usb_pdata.serial_number = serialno; - return 1; -} -__setup("androidboot.serialno=", board_serialno_setup); -#endif - -static struct platform_device smc91x_device = { - .name = "smc91x", - .id = 0, - .num_resources = ARRAY_SIZE(smc91x_resources), - .resource = smc91x_resources, -}; - -#ifdef CONFIG_USB_FUNCTION -static struct usb_function_map usb_functions_map[] = { - {"diag", 0}, - {"adb", 1}, - {"modem", 2}, - {"nmea", 3}, - {"mass_storage", 4}, - {"ethernet", 5}, -}; - -/* dynamic composition */ -static struct usb_composition usb_func_composition[] = { - { - .product_id = 0x9012, - .functions = 0x5, /* 0101 */ - }, - - { - .product_id = 0x9013, - .functions = 0x15, /* 10101 */ - }, - - { - .product_id = 0x9014, - .functions = 0x30, /* 110000 */ - }, - - { - .product_id = 0x9015, - .functions = 0x12, /* 10010 */ - }, - - { - .product_id = 0x9016, - .functions = 0xD, /* 01101 */ - }, - - { - .product_id = 0x9017, - .functions = 0x1D, /* 11101 */ - }, - - { - .product_id = 0xF000, - .functions = 0x10, /* 10000 */ - }, - - { - .product_id = 0xF009, - .functions = 0x20, /* 100000 */ - }, - - { - .product_id = 0x9018, - .functions = 0x1F, /* 011111 */ - }, - - { - .product_id = 0x901A, - .functions = 0x0F, /* 01111 */ - }, -}; -#endif - -static struct msm_handset_platform_data hs_platform_data = { - .hs_name = "8k_handset", - .pwr_key_delay_ms = 500, /* 0 will disable end key */ -}; - -static struct platform_device hs_device = { - .name = "msm-handset", - .id = -1, - .dev = { - .platform_data = &hs_platform_data, - }, -}; - -#ifdef CONFIG_USB_FS_HOST -static struct msm_gpio fsusb_config[] = { - { GPIO_CFG(139, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "fs_dat" }, - { GPIO_CFG(140, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "fs_se0" }, - { GPIO_CFG(141, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "fs_oe_n" }, -}; - -static int fsusb_gpio_init(void) -{ - return msm_gpios_request(fsusb_config, ARRAY_SIZE(fsusb_config)); -} - -static void msm_fsusb_setup_gpio(unsigned int enable) -{ - if (enable) - msm_gpios_enable(fsusb_config, ARRAY_SIZE(fsusb_config)); - else - msm_gpios_disable(fsusb_config, ARRAY_SIZE(fsusb_config)); - -} -#endif - -#define MSM_USB_BASE ((unsigned)addr) - -static struct msm_hsusb_platform_data msm_hsusb_pdata = { -#ifdef CONFIG_USB_FUNCTION - .version = 0x0100, - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_180NM), - .vendor_id = 0x5c6, - .product_name = "Qualcomm HSUSB Device", - .serial_number = "1234567890ABCDEF", - .manufacturer_name = "Qualcomm Incorporated", - .compositions = usb_func_composition, - .num_compositions = ARRAY_SIZE(usb_func_composition), - .function_map = usb_functions_map, - .num_functions = ARRAY_SIZE(usb_functions_map), - .config_gpio = NULL, - -#endif -}; - -static struct vreg *vreg_usb; -static void msm_hsusb_vbus_power(unsigned phy_info, int on) -{ - - switch (PHY_TYPE(phy_info)) { - case USB_PHY_INTEGRATED: - if (on) - msm_hsusb_vbus_powerup(); - else - msm_hsusb_vbus_shutdown(); - break; - case USB_PHY_SERIAL_PMIC: - if (on) - vreg_enable(vreg_usb); - else - vreg_disable(vreg_usb); - break; - default: - pr_err("%s: undefined phy type ( %X ) \n", __func__, - phy_info); - } - -} - -static struct msm_usb_host_platform_data msm_usb_host_pdata = { - .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_180NM), -}; - -#ifdef CONFIG_USB_FS_HOST -static struct msm_usb_host_platform_data msm_usb_host2_pdata = { - .phy_info = USB_PHY_SERIAL_PMIC, - .config_gpio = msm_fsusb_setup_gpio, - .vbus_power = msm_hsusb_vbus_power, -}; -#endif - -static struct android_pmem_platform_data android_pmem_kernel_ebi1_pdata = { - .name = PMEM_KERNEL_EBI1_DATA_NAME, - /* if no allocator_type, defaults to PMEM_ALLOCATORTYPE_BITMAP, - * the only valid choice at this time. The board structure is - * set to all zeros by the C runtime initialization and that is now - * the enum value of PMEM_ALLOCATORTYPE_BITMAP, now forced to 0 in - * include/linux/android_pmem.h. - */ - .cached = 0, -}; - -#ifdef CONFIG_KERNEL_PMEM_SMI_REGION - -static struct android_pmem_platform_data android_pmem_kernel_smi_pdata = { - .name = PMEM_KERNEL_SMI_DATA_NAME, - /* if no allocator_type, defaults to PMEM_ALLOCATORTYPE_BITMAP, - * the only valid choice at this time. The board structure is - * set to all zeros by the C runtime initialization and that is now - * the enum value of PMEM_ALLOCATORTYPE_BITMAP, now forced to 0 in - * include/linux/android_pmem.h. - */ - .cached = 0, -}; - -#endif - -static struct android_pmem_platform_data android_pmem_pdata = { - .name = "pmem", - .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING, - .cached = 1, -}; - -static struct android_pmem_platform_data android_pmem_adsp_pdata = { - .name = "pmem_adsp", - .allocator_type = PMEM_ALLOCATORTYPE_BITMAP, - .cached = 0, -}; - -static struct android_pmem_platform_data android_pmem_smipool_pdata = { - .name = "pmem_smipool", - .size = MSM_PMEM_SMIPOOL_SIZE, - .allocator_type = PMEM_ALLOCATORTYPE_BITMAP, - .cached = 0, -}; - - -static struct platform_device android_pmem_device = { - .name = "android_pmem", - .id = 0, - .dev = { .platform_data = &android_pmem_pdata }, -}; - -static struct platform_device android_pmem_adsp_device = { - .name = "android_pmem", - .id = 1, - .dev = { .platform_data = &android_pmem_adsp_pdata }, -}; - -static struct platform_device android_pmem_smipool_device = { - .name = "android_pmem", - .id = 2, - .dev = { .platform_data = &android_pmem_smipool_pdata }, -}; - - -static struct platform_device android_pmem_kernel_ebi1_device = { - .name = "android_pmem", - .id = 3, - .dev = { .platform_data = &android_pmem_kernel_ebi1_pdata }, -}; - -#ifdef CONFIG_KERNEL_PMEM_SMI_REGION -static struct platform_device android_pmem_kernel_smi_device = { - .name = "android_pmem", - .id = 4, - .dev = { .platform_data = &android_pmem_kernel_smi_pdata }, -}; -#endif - -static struct resource msm_fb_resources[] = { - { - .flags = IORESOURCE_DMA, - } -}; - -static int msm_fb_detect_panel(const char *name) -{ - int ret = -EPERM; - - if (machine_is_qsd8x50_ffa()) { - if (!strncmp(name, "mddi_toshiba_wvga_pt", 20)) - ret = 0; - else - ret = -ENODEV; - } else if ((machine_is_qsd8x50_surf()) - && !strcmp(name, "lcdc_external")) - ret = 0; - - return ret; -} - -static struct msm_fb_platform_data msm_fb_pdata = { - .detect_client = msm_fb_detect_panel, -}; - -static struct platform_device msm_fb_device = { - .name = "msm_fb", - .id = 0, - .num_resources = ARRAY_SIZE(msm_fb_resources), - .resource = msm_fb_resources, - .dev = { - .platform_data = &msm_fb_pdata, - } -}; - -static struct msm_gpio bma_spi_gpio_config_data[] = { - { GPIO_CFG(22, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "bma_irq" }, -}; - -static int msm_bma_gpio_setup(struct device *dev) -{ - int rc; - - rc = msm_gpios_request_enable(bma_spi_gpio_config_data, - ARRAY_SIZE(bma_spi_gpio_config_data)); - - return rc; -} - -static void msm_bma_gpio_teardown(struct device *dev) -{ - msm_gpios_disable_free(bma_spi_gpio_config_data, - ARRAY_SIZE(bma_spi_gpio_config_data)); -} - -static struct bma150_platform_data bma_pdata = { - .setup = msm_bma_gpio_setup, - .teardown = msm_bma_gpio_teardown, -}; - -static struct resource qsd_spi_resources[] = { - { - .name = "spi_irq_in", - .start = INT_SPI_INPUT, - .end = INT_SPI_INPUT, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_irq_out", - .start = INT_SPI_OUTPUT, - .end = INT_SPI_OUTPUT, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_irq_err", - .start = INT_SPI_ERROR, - .end = INT_SPI_ERROR, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_base", - .start = 0xA1200000, - .end = 0xA1200000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spidm_channels", - .flags = IORESOURCE_DMA, - }, - { - .name = "spidm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static struct platform_device qsd_device_spi = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(qsd_spi_resources), - .resource = qsd_spi_resources, -}; - -static struct spi_board_info msm_spi_board_info[] __initdata = { - { - .modalias = "bma150", - .mode = SPI_MODE_3, - .irq = MSM_GPIO_TO_INT(22), - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 10000000, - .platform_data = &bma_pdata, - }, -}; - -#define CT_CSR_PHYS 0xA8700000 -#define TCSR_SPI_MUX (ct_csr_base + 0x54) -static int msm_qsd_spi_dma_config(void) -{ - void __iomem *ct_csr_base = 0; - u32 spi_mux; - int ret = 0; - - ct_csr_base = ioremap(CT_CSR_PHYS, PAGE_SIZE); - if (!ct_csr_base) { - pr_err("%s: Could not remap %x\n", __func__, CT_CSR_PHYS); - return -1; - } - - spi_mux = readl(TCSR_SPI_MUX); - switch (spi_mux) { - case (1): - qsd_spi_resources[4].start = DMOV_HSUART1_RX_CHAN; - qsd_spi_resources[4].end = DMOV_HSUART1_TX_CHAN; - qsd_spi_resources[5].start = DMOV_HSUART1_RX_CRCI; - qsd_spi_resources[5].end = DMOV_HSUART1_TX_CRCI; - break; - case (2): - qsd_spi_resources[4].start = DMOV_HSUART2_RX_CHAN; - qsd_spi_resources[4].end = DMOV_HSUART2_TX_CHAN; - qsd_spi_resources[5].start = DMOV_HSUART2_RX_CRCI; - qsd_spi_resources[5].end = DMOV_HSUART2_TX_CRCI; - break; - case (3): - qsd_spi_resources[4].start = DMOV_CE_OUT_CHAN; - qsd_spi_resources[4].end = DMOV_CE_IN_CHAN; - qsd_spi_resources[5].start = DMOV_CE_OUT_CRCI; - qsd_spi_resources[5].end = DMOV_CE_IN_CRCI; - break; - default: - ret = -1; - } - - iounmap(ct_csr_base); - return ret; -} - -static struct msm_gpio qsd_spi_gpio_config_data[] = { - { GPIO_CFG(17, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_clk" }, - { GPIO_CFG(18, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_mosi" }, - { GPIO_CFG(19, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_miso" }, - { GPIO_CFG(20, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "spi_cs0" }, - { GPIO_CFG(21, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_16MA), "spi_pwr" }, -}; - -static int msm_qsd_spi_gpio_config(void) -{ - int rc; - - rc = msm_gpios_request_enable(qsd_spi_gpio_config_data, - ARRAY_SIZE(qsd_spi_gpio_config_data)); - if (rc) - return rc; - - /* Set direction for SPI_PWR */ - gpio_direction_output(21, 1); - - return 0; -} - -static void msm_qsd_spi_gpio_release(void) -{ - msm_gpios_disable_free(qsd_spi_gpio_config_data, - ARRAY_SIZE(qsd_spi_gpio_config_data)); -} - -static struct msm_spi_platform_data qsd_spi_pdata = { - .max_clock_speed = 19200000, - .gpio_config = msm_qsd_spi_gpio_config, - .gpio_release = msm_qsd_spi_gpio_release, - .dma_config = msm_qsd_spi_dma_config, -}; - -static void __init msm_qsd_spi_init(void) -{ - qsd_device_spi.dev.platform_data = &qsd_spi_pdata; -} - -static int mddi_toshiba_pmic_bl(int level) -{ - int ret = -EPERM; - - if (machine_is_qsd8x50_ffa()) { - ret = pmic_set_led_intensity(LED_LCD, level); - - if (ret) - printk(KERN_WARNING "%s: can't set lcd backlight!\n", - __func__); - } - - return ret; -} - -static struct msm_panel_common_pdata mddi_toshiba_pdata = { - .pmic_backlight = mddi_toshiba_pmic_bl, -}; - -static struct platform_device mddi_toshiba_device = { - .name = "mddi_toshiba", - .id = 0, - .dev = { - .platform_data = &mddi_toshiba_pdata, - } -}; - -static void msm_fb_vreg_config(const char *name, int on) -{ - struct vreg *vreg; - int ret = 0; - - vreg = vreg_get(NULL, name); - if (IS_ERR(vreg)) { - printk(KERN_ERR "%s: vreg_get(%s) failed (%ld)\n", - __func__, name, PTR_ERR(vreg)); - return; - } - - ret = (on) ? vreg_enable(vreg) : vreg_disable(vreg); - if (ret) - printk(KERN_ERR "%s: %s(%s) failed!\n", - __func__, (on) ? "vreg_enable" : "vreg_disable", name); -} - -#define MDDI_RST_OUT_GPIO 100 - -static int mddi_power_save_on; -static int msm_fb_mddi_power_save(int on) -{ - int flag_on = !!on; - int ret = 0; - - - if (mddi_power_save_on == flag_on) - return ret; - - mddi_power_save_on = flag_on; - - if (!flag_on && machine_is_qsd8x50_ffa()) { - gpio_set_value(MDDI_RST_OUT_GPIO, 0); - mdelay(1); - } - - ret = pmic_lp_mode_control(flag_on ? OFF_CMD : ON_CMD, - PM_VREG_LP_MSME2_ID); - if (ret) - printk(KERN_ERR "%s: pmic_lp_mode_control failed!\n", __func__); - - msm_fb_vreg_config("gp5", flag_on); - msm_fb_vreg_config("boost", flag_on); - - if (flag_on && machine_is_qsd8x50_ffa()) { - gpio_set_value(MDDI_RST_OUT_GPIO, 0); - mdelay(1); - gpio_set_value(MDDI_RST_OUT_GPIO, 1); - gpio_set_value(MDDI_RST_OUT_GPIO, 1); - mdelay(1); - } - - return ret; -} - -static int msm_fb_mddi_sel_clk(u32 *clk_rate) -{ - *clk_rate *= 2; - return 0; -} - -static struct mddi_platform_data mddi_pdata = { - .mddi_power_save = msm_fb_mddi_power_save, - .mddi_sel_clk = msm_fb_mddi_sel_clk, -}; - -static struct msm_panel_common_pdata mdp_pdata = { - .gpio = 98, - .mdp_rev = MDP_REV_31, -}; - -static void __init msm_fb_add_devices(void) -{ - msm_fb_register_device("mdp", &mdp_pdata); - msm_fb_register_device("pmdh", &mddi_pdata); - msm_fb_register_device("emdh", &mddi_pdata); - msm_fb_register_device("tvenc", 0); - msm_fb_register_device("lcdc", 0); -} - -static struct resource msm_audio_resources[] = { - { - .flags = IORESOURCE_DMA, - }, - { - .name = "aux_pcm_dout", - .start = 68, - .end = 68, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_din", - .start = 69, - .end = 69, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_syncout", - .start = 70, - .end = 70, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_clkin_a", - .start = 71, - .end = 71, - .flags = IORESOURCE_IO, - }, - { - .name = "sdac_din", - .start = 144, - .end = 144, - .flags = IORESOURCE_IO, - }, - { - .name = "sdac_dout", - .start = 145, - .end = 145, - .flags = IORESOURCE_IO, - }, - { - .name = "sdac_wsout", - .start = 143, - .end = 143, - .flags = IORESOURCE_IO, - }, - { - .name = "cc_i2s_clk", - .start = 142, - .end = 142, - .flags = IORESOURCE_IO, - }, - { - .name = "audio_master_clkout", - .start = 146, - .end = 146, - .flags = IORESOURCE_IO, - }, - { - .name = "audio_base_addr", - .start = 0xa0700000, - .end = 0xa0700000 + 4, - .flags = IORESOURCE_MEM, - }, - -}; - -static unsigned audio_gpio_on[] = { - GPIO_CFG(68, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DOUT */ - GPIO_CFG(69, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_DIN */ - GPIO_CFG(70, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_SYNC */ - GPIO_CFG(71, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* PCM_CLK */ - GPIO_CFG(142, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* CC_I2S_CLK */ - GPIO_CFG(143, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* SADC_WSOUT */ - GPIO_CFG(144, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* SADC_DIN */ - GPIO_CFG(145, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* SDAC_DOUT */ - GPIO_CFG(146, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* MA_CLK_OUT */ -}; - -static void __init audio_gpio_init(void) -{ - int pin, rc; - - for (pin = 0; pin < ARRAY_SIZE(audio_gpio_on); pin++) { - rc = gpio_tlmm_config(audio_gpio_on[pin], - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR - "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, audio_gpio_on[pin], rc); - return; - } - } -} - -static struct platform_device msm_audio_device = { - .name = "msm_audio", - .id = 0, - .num_resources = ARRAY_SIZE(msm_audio_resources), - .resource = msm_audio_resources, -}; - -static struct resource bluesleep_resources[] = { - { - .name = "gpio_host_wake", - .start = 21, - .end = 21, - .flags = IORESOURCE_IO, - }, - { - .name = "gpio_ext_wake", - .start = 19, - .end = 19, - .flags = IORESOURCE_IO, - }, - { - .name = "host_wake", - .start = MSM_GPIO_TO_INT(21), - .end = MSM_GPIO_TO_INT(21), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_bluesleep_device = { - .name = "bluesleep", - .id = -1, - .num_resources = ARRAY_SIZE(bluesleep_resources), - .resource = bluesleep_resources, -}; - -#ifdef CONFIG_BT -static struct platform_device msm_bt_power_device = { - .name = "bt_power", -}; - -enum { - BT_SYSRST, - BT_WAKE, - BT_HOST_WAKE, - BT_VDD_IO, - BT_RFR, - BT_CTS, - BT_RX, - BT_TX, - BT_VDD_FREG -}; - -static struct msm_gpio bt_config_power_off[] = { - { GPIO_CFG(18, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "BT SYSRST" }, - { GPIO_CFG(19, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "BT WAKE" }, - { GPIO_CFG(21, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "HOST WAKE" }, - { GPIO_CFG(22, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "BT VDD_IO" }, - { GPIO_CFG(43, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_RFR" }, - { GPIO_CFG(44, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_CTS" }, - { GPIO_CFG(45, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_RX" }, - { GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "UART1DM_TX" } -}; - -static struct msm_gpio bt_config_power_on[] = { - { GPIO_CFG(18, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "BT SYSRST" }, - { GPIO_CFG(19, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "BT WAKE" }, - { GPIO_CFG(21, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "HOST WAKE" }, - { GPIO_CFG(22, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "BT VDD_IO" }, - { GPIO_CFG(43, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_RFR" }, - { GPIO_CFG(44, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_CTS" }, - { GPIO_CFG(45, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_RX" }, - { GPIO_CFG(46, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "UART1DM_TX" } -}; - -static struct msm_gpio wlan_config_power_off[] = { - { GPIO_CFG(62, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_CLK" }, - { GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_CMD" }, - { GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_D3" }, - { GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_D2" }, - { GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_D1" }, - { GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "SDC2_D0" }, - { GPIO_CFG(113, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "VDD_WLAN" }, - { GPIO_CFG(138, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - "WLAN_PWD" } -}; - -static struct msm_gpio wlan_config_power_on[] = { - { GPIO_CFG(62, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_CLK" }, - { GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_CMD" }, - { GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_D3" }, - { GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_D2" }, - { GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_D1" }, - { GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "SDC2_D0" }, - { GPIO_CFG(113, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "VDD_WLAN" }, - { GPIO_CFG(138, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), - "WLAN_PWD" } -}; - -static int bluetooth_power(int on) -{ - int rc; - struct vreg *vreg_wlan; - - vreg_wlan = vreg_get(NULL, "wlan"); - - if (IS_ERR(vreg_wlan)) { - printk(KERN_ERR "%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_wlan)); - return PTR_ERR(vreg_wlan); - } - - if (on) { - /* units of mV, steps of 50 mV */ - rc = vreg_set_level(vreg_wlan, PMIC_VREG_WLAN_LEVEL); - if (rc) { - printk(KERN_ERR "%s: vreg wlan set level failed (%d)\n", - __func__, rc); - return -EIO; - } - rc = vreg_enable(vreg_wlan); - if (rc) { - printk(KERN_ERR "%s: vreg wlan enable failed (%d)\n", - __func__, rc); - return -EIO; - } - - rc = msm_gpios_enable(bt_config_power_on, - ARRAY_SIZE(bt_config_power_on)); - if (rc < 0) { - printk(KERN_ERR - "%s: bt power on gpio config failed: %d\n", - __func__, rc); - return rc; - } - - if (machine_is_qsd8x50_ffa()) { - rc = msm_gpios_enable - (wlan_config_power_on, - ARRAY_SIZE(wlan_config_power_on)); - if (rc < 0) { - printk - (KERN_ERR - "%s: wlan power on gpio config failed: %d\n", - __func__, rc); - return rc; - } - } - - gpio_set_value(22, on); /* VDD_IO */ - gpio_set_value(18, on); /* SYSRST */ - - if (machine_is_qsd8x50_ffa()) { - gpio_set_value(138, 0); /* WLAN: CHIP_PWD */ - gpio_set_value(113, on); /* WLAN */ - } - } else { - if (machine_is_qsd8x50_ffa()) { - gpio_set_value(138, on); /* WLAN: CHIP_PWD */ - gpio_set_value(113, on); /* WLAN */ - } - - gpio_set_value(18, on); /* SYSRST */ - gpio_set_value(22, on); /* VDD_IO */ - - rc = vreg_disable(vreg_wlan); - if (rc) { - printk(KERN_ERR "%s: vreg wlan disable failed (%d)\n", - __func__, rc); - return -EIO; - } - - rc = msm_gpios_enable(bt_config_power_off, - ARRAY_SIZE(bt_config_power_off)); - if (rc < 0) { - printk(KERN_ERR - "%s: bt power off gpio config failed: %d\n", - __func__, rc); - return rc; - } - - if (machine_is_qsd8x50_ffa()) { - rc = msm_gpios_enable - (wlan_config_power_off, - ARRAY_SIZE(wlan_config_power_off)); - if (rc < 0) { - printk - (KERN_ERR - "%s: wlan power off gpio config failed: %d\n", - __func__, rc); - return rc; - } - } - } - - printk(KERN_DEBUG "Bluetooth power switch: %d\n", on); - - return 0; -} - -static void __init bt_power_init(void) -{ - struct vreg *vreg_bt; - int rc; - - if (machine_is_qsd8x50_ffa()) { - gpio_set_value(138, 0); /* WLAN: CHIP_PWD */ - gpio_set_value(113, 0); /* WLAN */ - } - - gpio_set_value(18, 0); /* SYSRST */ - gpio_set_value(22, 0); /* VDD_IO */ - - /* do not have vreg bt defined, gp6 is the same */ - /* vreg_get parameter 1 (struct device *) is ignored */ - vreg_bt = vreg_get(NULL, "gp6"); - - if (IS_ERR(vreg_bt)) { - printk(KERN_ERR "%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_bt)); - goto exit; - } - - /* units of mV, steps of 50 mV */ - rc = vreg_set_level(vreg_bt, PMIC_VREG_GP6_LEVEL); - if (rc) { - printk(KERN_ERR "%s: vreg bt set level failed (%d)\n", - __func__, rc); - goto exit; - } - rc = vreg_enable(vreg_bt); - if (rc) { - printk(KERN_ERR "%s: vreg bt enable failed (%d)\n", - __func__, rc); - goto exit; - } - - if (bluetooth_power(0)) - goto exit; - - msm_bt_power_device.dev.platform_data = &bluetooth_power; - - printk(KERN_DEBUG "Bluetooth power switch: initialized\n"); - -exit: - return; -} -#else -#define bt_power_init(x) do {} while (0) -#endif - -static struct platform_device msm_device_pmic_leds = { - .name = "pmic-leds", - .id = -1, -}; - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define TSIF_A_SYNC GPIO_CFG(106, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_A_DATA GPIO_CFG(107, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_A_EN GPIO_CFG(108, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_A_CLK GPIO_CFG(109, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif_gpios[] = { - { .gpio_cfg = TSIF_A_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_A_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_A_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_A_SYNC, .label = "tsif_sync", }, -}; - -static struct msm_tsif_platform_data tsif_platform_data = { - .num_gpios = ARRAY_SIZE(tsif_gpios), - .gpios = tsif_gpios, - .tsif_clk = "core_clk", - .tsif_ref_clk = "ref_clk", -}; - -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -static void touchpad_gpio_release(void) -{ - gpio_free(TOUCHPAD_IRQ); - gpio_free(TOUCHPAD_SUSPEND); -} - -static int touchpad_gpio_setup(void) -{ - int rc; - int suspend_pin = TOUCHPAD_SUSPEND; - int irq_pin = TOUCHPAD_IRQ; - unsigned suspend_cfg = - GPIO_CFG(suspend_pin, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - unsigned irq_cfg = - GPIO_CFG(irq_pin, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - - rc = gpio_request(irq_pin, "msm_touchpad_irq"); - if (rc) { - pr_err("gpio_request failed on pin %d (rc=%d)\n", - irq_pin, rc); - goto err_gpioconfig; - } - rc = gpio_request(suspend_pin, "msm_touchpad_suspend"); - if (rc) { - pr_err("gpio_request failed on pin %d (rc=%d)\n", - suspend_pin, rc); - goto err_gpioconfig; - } - rc = gpio_tlmm_config(suspend_cfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("gpio_tlmm_config failed on pin %d (rc=%d)\n", - suspend_pin, rc); - goto err_gpioconfig; - } - rc = gpio_tlmm_config(irq_cfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("gpio_tlmm_config failed on pin %d (rc=%d)\n", - irq_pin, rc); - goto err_gpioconfig; - } - return rc; - -err_gpioconfig: - touchpad_gpio_release(); - return rc; -} - -static struct msm_touchpad_platform_data msm_touchpad_data = { - .gpioirq = TOUCHPAD_IRQ, - .gpiosuspend = TOUCHPAD_SUSPEND, - .gpio_setup = touchpad_gpio_setup, - .gpio_shutdown = touchpad_gpio_release -}; - -#define KBD_RST 35 -#define KBD_IRQ 36 - -static void kbd_gpio_release(void) -{ - gpio_free(KBD_IRQ); - gpio_free(KBD_RST); -} - -static int kbd_gpio_setup(void) -{ - int rc; - int respin = KBD_RST; - int irqpin = KBD_IRQ; - unsigned rescfg = - GPIO_CFG(respin, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA); - unsigned irqcfg = - GPIO_CFG(irqpin, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA); - - rc = gpio_request(irqpin, "gpio_keybd_irq"); - if (rc) { - pr_err("gpio_request failed on pin %d (rc=%d)\n", - irqpin, rc); - goto err_gpioconfig; - } - rc = gpio_request(respin, "gpio_keybd_reset"); - if (rc) { - pr_err("gpio_request failed on pin %d (rc=%d)\n", - respin, rc); - goto err_gpioconfig; - } - rc = gpio_tlmm_config(rescfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("gpio_tlmm_config failed on pin %d (rc=%d)\n", - respin, rc); - goto err_gpioconfig; - } - rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE); - if (rc) { - pr_err("gpio_tlmm_config failed on pin %d (rc=%d)\n", - irqpin, rc); - goto err_gpioconfig; - } - return rc; - -err_gpioconfig: - kbd_gpio_release(); - return rc; -} - -/* use gpio output pin to toggle keyboard external reset pin */ -static void kbd_hwreset(int kbd_mclrpin) -{ - gpio_direction_output(kbd_mclrpin, 0); - gpio_direction_output(kbd_mclrpin, 1); -} - -static struct msm_i2ckbd_platform_data msm_kybd_data = { - .hwrepeat = 0, - .scanset1 = 1, - .gpioreset = KBD_RST, - .gpioirq = KBD_IRQ, - .gpio_setup = kbd_gpio_setup, - .gpio_shutdown = kbd_gpio_release, - .hw_reset = kbd_hwreset, -}; - -static struct i2c_board_info msm_i2c_board_info[] __initdata = { - { - I2C_BOARD_INFO("glidesensor", 0x2A), - .irq = MSM_GPIO_TO_INT(TOUCHPAD_IRQ), - .platform_data = &msm_touchpad_data - }, - { - I2C_BOARD_INFO("msm-i2ckbd", 0x3A), - .type = "msm-i2ckbd", - .irq = MSM_GPIO_TO_INT(KBD_IRQ), - .platform_data = &msm_kybd_data - }, -#ifdef CONFIG_MT9D112 - { - I2C_BOARD_INFO("mt9d112", 0x78 >> 1), - }, -#endif -#ifdef CONFIG_S5K3E2FX - { - I2C_BOARD_INFO("s5k3e2fx", 0x20 >> 1), - }, -#endif -#ifdef CONFIG_MT9P012 - { - I2C_BOARD_INFO("mt9p012", 0x6C >> 1), - }, -#endif -#ifdef CONFIG_MT9P012_KM - { - I2C_BOARD_INFO("mt9p012_km", 0x6C >> 2), - }, -#endif -#if defined(CONFIG_MT9T013) || defined(CONFIG_SENSORS_MT9T013) - { - I2C_BOARD_INFO("mt9t013", 0x6C), - }, -#endif - { - I2C_BOARD_INFO("tps65023", 0x48), - }, -}; - -#ifdef CONFIG_MSM_CAMERA -static uint32_t camera_off_gpio_table[] = { - /* parallel CAMERA interfaces */ - GPIO_CFG(0, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */ - GPIO_CFG(1, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */ - GPIO_CFG(2, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */ - GPIO_CFG(3, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */ - GPIO_CFG(4, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */ - GPIO_CFG(5, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */ - GPIO_CFG(6, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */ - GPIO_CFG(7, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */ - GPIO_CFG(8, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT8 */ - GPIO_CFG(9, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT9 */ - GPIO_CFG(10, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT10 */ - GPIO_CFG(11, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT11 */ - GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCLK */ - GPIO_CFG(13, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */ - GPIO_CFG(14, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */ - GPIO_CFG(15, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* MCLK */ -}; - -static uint32_t camera_on_gpio_table[] = { - /* parallel CAMERA interfaces */ - GPIO_CFG(0, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */ - GPIO_CFG(1, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */ - GPIO_CFG(2, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */ - GPIO_CFG(3, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */ - GPIO_CFG(4, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */ - GPIO_CFG(5, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */ - GPIO_CFG(6, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */ - GPIO_CFG(7, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */ - GPIO_CFG(8, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT8 */ - GPIO_CFG(9, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT9 */ - GPIO_CFG(10, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT10 */ - GPIO_CFG(11, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT11 */ - GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCLK */ - GPIO_CFG(13, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */ - GPIO_CFG(14, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */ - GPIO_CFG(15, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_16MA), /* MCLK */ -}; - -static uint32_t camera_on_gpio_ffa_table[] = { - /* parallel CAMERA interfaces */ - GPIO_CFG(95, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* I2C_SCL */ - GPIO_CFG(96, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* I2C_SDA */ - /* FFA front Sensor Reset */ - GPIO_CFG(137, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), -}; - -static uint32_t camera_off_gpio_ffa_table[] = { - /* FFA front Sensor Reset */ - GPIO_CFG(137, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), -}; - -static void config_gpio_table(uint32_t *table, int len) -{ - int n, rc; - for (n = 0; n < len; n++) { - rc = gpio_tlmm_config(table[n], GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR "%s: gpio_tlmm_config(%#x)=%d\n", - __func__, table[n], rc); - break; - } - } -} - -static struct vreg *vreg_gp2; -static struct vreg *vreg_gp3; - -static void msm_camera_vreg_config(int vreg_en) -{ - int rc; - - if (vreg_gp2 == NULL) { - vreg_gp2 = vreg_get(NULL, "gp2"); - if (IS_ERR(vreg_gp2)) { - printk(KERN_ERR "%s: vreg_get(%s) failed (%ld)\n", - __func__, "gp2", PTR_ERR(vreg_gp2)); - return; - } - - rc = vreg_set_level(vreg_gp2, 1800); - if (rc) { - printk(KERN_ERR "%s: GP2 set_level failed (%d)\n", - __func__, rc); - } - } - - if (vreg_gp3 == NULL) { - vreg_gp3 = vreg_get(NULL, "gp3"); - if (IS_ERR(vreg_gp3)) { - printk(KERN_ERR "%s: vreg_get(%s) failed (%ld)\n", - __func__, "gp3", PTR_ERR(vreg_gp3)); - return; - } - - rc = vreg_set_level(vreg_gp3, 2800); - if (rc) { - printk(KERN_ERR "%s: GP3 set level failed (%d)\n", - __func__, rc); - } - } - - if (vreg_en) { - rc = vreg_enable(vreg_gp2); - if (rc) { - printk(KERN_ERR "%s: GP2 enable failed (%d)\n", - __func__, rc); - } - - rc = vreg_enable(vreg_gp3); - if (rc) { - printk(KERN_ERR "%s: GP3 enable failed (%d)\n", - __func__, rc); - } - } else { - rc = vreg_disable(vreg_gp2); - if (rc) { - printk(KERN_ERR "%s: GP2 disable failed (%d)\n", - __func__, rc); - } - - rc = vreg_disable(vreg_gp3); - if (rc) { - printk(KERN_ERR "%s: GP3 disable failed (%d)\n", - __func__, rc); - } - } -} - -static int config_camera_on_gpios(void) -{ - int vreg_en = 1; - - if (machine_is_qsd8x50_ffa()) { - config_gpio_table(camera_on_gpio_ffa_table, - ARRAY_SIZE(camera_on_gpio_ffa_table)); - - msm_camera_vreg_config(vreg_en); - gpio_set_value(137, 0); - } - config_gpio_table(camera_on_gpio_table, - ARRAY_SIZE(camera_on_gpio_table)); - return 0; -} - -static void config_camera_off_gpios(void) -{ - int vreg_en = 0; - - if (machine_is_qsd8x50_ffa()) { - config_gpio_table(camera_off_gpio_ffa_table, - ARRAY_SIZE(camera_off_gpio_ffa_table)); - - msm_camera_vreg_config(vreg_en); - } - config_gpio_table(camera_off_gpio_table, - ARRAY_SIZE(camera_off_gpio_table)); -} - -static struct resource msm_camera_resources[] = { - { - .start = 0xA0F00000, - .end = 0xA0F00000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_VFE, - .end = INT_VFE, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_camera_device_platform_data msm_camera_device_data = { - .camera_gpio_on = config_camera_on_gpios, - .camera_gpio_off = config_camera_off_gpios, - .ioext.mdcphy = MSM_MDC_PHYS, - .ioext.mdcsz = MSM_MDC_SIZE, - .ioext.appphy = MSM_CLK_CTL_PHYS, - .ioext.appsz = MSM_CLK_CTL_SIZE, -}; - -int pmic_set_flash_led_current(enum pmic8058_leds id, unsigned mA) -{ - int rc; - rc = pmic_flash_led_set_current(mA); - return rc; -} -static struct msm_camera_sensor_flash_src msm_flash_src = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_PMIC, - ._fsrc.pmic_src.num_of_src = 1, - ._fsrc.pmic_src.low_current = 30, - ._fsrc.pmic_src.high_current = 100, - ._fsrc.pmic_src.led_src_1 = 0, - ._fsrc.pmic_src.led_src_2 = 0, - ._fsrc.pmic_src.pmic_set_current = pmic_set_flash_led_current, -}; - -#ifdef CONFIG_MT9D112 -static struct msm_camera_sensor_flash_data flash_mt9d112 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = { - .sensor_name = "mt9d112", - .sensor_reset = 17, - .sensor_pwd = 85, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9d112 -}; - -static struct platform_device msm_camera_sensor_mt9d112 = { - .name = "msm_camera_mt9d112", - .dev = { - .platform_data = &msm_camera_sensor_mt9d112_data, - }, -}; -#endif - -#ifdef CONFIG_S5K3E2FX -static struct msm_camera_sensor_flash_data flash_s5k3e2fx = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_s5k3e2fx_data = { - .sensor_name = "s5k3e2fx", - .sensor_reset = 17, - .sensor_pwd = 85, - /*.vcm_pwd = 31, */ /* CAM1_VCM_EN, enabled in a9 */ - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_s5k3e2fx -}; - -static struct platform_device msm_camera_sensor_s5k3e2fx = { - .name = "msm_camera_s5k3e2fx", - .dev = { - .platform_data = &msm_camera_sensor_s5k3e2fx_data, - }, -}; -#endif - -#ifdef CONFIG_MT9P012 -static struct msm_camera_sensor_flash_data flash_mt9p012 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9p012_data = { - .sensor_name = "mt9p012", - .sensor_reset = 17, - .sensor_pwd = 85, - .vcm_pwd = 88, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9p012 -}; - -static struct platform_device msm_camera_sensor_mt9p012 = { - .name = "msm_camera_mt9p012", - .dev = { - .platform_data = &msm_camera_sensor_mt9p012_data, - }, -}; -#endif - -#ifdef CONFIG_MT9P012_KM -static struct msm_camera_sensor_flash_data flash_mt9p012_km = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9p012_km_data = { - .sensor_name = "mt9p012_km", - .sensor_reset = 17, - .sensor_pwd = 85, - .vcm_pwd = 88, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9p012_km -}; - -static struct platform_device msm_camera_sensor_mt9p012_km = { - .name = "msm_camera_mt9p012_km", - .dev = { - .platform_data = &msm_camera_sensor_mt9p012_km_data, - }, -}; -#endif - -#ifdef CONFIG_MT9T013 -static struct msm_camera_sensor_flash_data flash_mt9t013 = { - .flash_type = MSM_CAMERA_FLASH_LED, - .flash_src = &msm_flash_src -}; - -static struct msm_camera_sensor_info msm_camera_sensor_mt9t013_data = { - .sensor_name = "mt9t013", - .sensor_reset = 17, - .sensor_pwd = 85, - .vcm_pwd = 0, - .vcm_enable = 0, - .pdata = &msm_camera_device_data, - .resource = msm_camera_resources, - .num_resources = ARRAY_SIZE(msm_camera_resources), - .flash_data = &flash_mt9t013 -}; - -static struct platform_device msm_camera_sensor_mt9t013 = { - .name = "msm_camera_mt9t013", - .dev = { - .platform_data = &msm_camera_sensor_mt9t013_data, - }, -}; -#endif -#endif /*CONFIG_MSM_CAMERA*/ - -static u32 msm_calculate_batt_capacity(u32 current_voltage); - -static struct msm_psy_batt_pdata msm_psy_batt_data = { - .voltage_min_design = 3200, - .voltage_max_design = 4200, - .avail_chg_sources = AC_CHG | USB_CHG , - .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION, - .calculate_capacity = &msm_calculate_batt_capacity, -}; - -static u32 msm_calculate_batt_capacity(u32 current_voltage) -{ - u32 low_voltage = msm_psy_batt_data.voltage_min_design; - u32 high_voltage = msm_psy_batt_data.voltage_max_design; - - return (current_voltage - low_voltage) * 100 - / (high_voltage - low_voltage); -} - -static struct platform_device msm_batt_device = { - .name = "msm-battery", - .id = -1, - .dev.platform_data = &msm_psy_batt_data, -}; - -static int hsusb_rpc_connect(int connect) -{ - if (connect) - return msm_hsusb_rpc_connect(); - else - return msm_hsusb_rpc_close(); -} - -static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init) -{ - int ret; - - if (init) { - ret = msm_pm_app_rpc_init(callback); - } else { - msm_pm_app_rpc_deinit(callback); - ret = 0; - } - return ret; -} -static int msm_hsusb_ldo_init(int init); -static int msm_hsusb_ldo_enable(int enable); - -static struct msm_otg_platform_data msm_otg_pdata = { - .rpc_connect = hsusb_rpc_connect, - .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init, - .pemp_level = PRE_EMPHASIS_WITH_10_PERCENT, - .cdr_autoreset = CDR_AUTO_RESET_DEFAULT, - .drv_ampl = HS_DRV_AMPLITUDE_5_PERCENT, - .vbus_power = msm_hsusb_vbus_power, - .chg_vbus_draw = hsusb_chg_vbus_draw, - .chg_connected = hsusb_chg_connected, - .chg_init = hsusb_chg_init, - .phy_can_powercollapse = 1, - .ldo_init = msm_hsusb_ldo_init, - .ldo_enable = msm_hsusb_ldo_enable, -}; - -static struct msm_hsusb_gadget_platform_data msm_gadget_pdata; - -static struct platform_device *devices[] __initdata = { - &msm_fb_device, - &mddi_toshiba_device, - &smc91x_device, - &msm_device_smd, - &msm_device_dmov, - &android_pmem_kernel_ebi1_device, -#ifdef CONFIG_KERNEL_PMEM_SMI_REGION - &android_pmem_kernel_smi_device, -#endif - &android_pmem_device, - &android_pmem_adsp_device, - &android_pmem_smipool_device, - &msm_device_nand, - &msm_device_i2c, - &qsd_device_spi, -#ifdef CONFIG_USB_FUNCTION - &mass_storage_device, -#endif -#ifdef CONFIG_USB_ANDROID - &usb_mass_storage_device, - &rndis_device, -#ifdef CONFIG_USB_ANDROID_DIAG - &usb_diag_device, -#endif -#ifdef CONFIG_USB_F_SERIAL - &usb_gadget_fserial_device, -#endif - &android_usb_device, -#endif - &msm_device_tssc, - &msm_audio_device, - &msm_device_uart_dm1, - &msm_bluesleep_device, -#ifdef CONFIG_BT - &msm_bt_power_device, -#endif -#if !defined(CONFIG_MSM_SERIAL_DEBUGGER) - &msm_device_uart3, -#endif - &msm_device_pmic_leds, - &msm_kgsl_3d0, - &hs_device, -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - &msm_device_tsif, -#endif -#ifdef CONFIG_MT9T013 - &msm_camera_sensor_mt9t013, -#endif -#ifdef CONFIG_MT9D112 - &msm_camera_sensor_mt9d112, -#endif -#ifdef CONFIG_S5K3E2FX - &msm_camera_sensor_s5k3e2fx, -#endif -#ifdef CONFIG_MT9P012 - &msm_camera_sensor_mt9p012, -#endif -#ifdef CONFIG_MT9P012_KM - &msm_camera_sensor_mt9p012_km, -#endif - &msm_batt_device, -}; - -static void __init qsd8x50_init_irq(void) -{ - msm_init_irq(); - msm_init_sirc(); -} - -static void usb_mpp_init(void) -{ - unsigned rc; - unsigned mpp_usb = 20; - - if (machine_is_qsd8x50_ffa()) { - rc = mpp_config_digital_out(mpp_usb, - MPP_CFG(MPP_DLOGIC_LVL_VDD, - MPP_DLOGIC_OUT_CTRL_HIGH)); - if (rc) - pr_err("%s: configuring mpp pin" - "to enable 3.3V LDO failed\n", __func__); - } -} - -/* TBD: 8x50 FFAs have internal 3p3 voltage regulator as opposed to - * external 3p3 voltage regulator on Surf platform. There is no way - * s/w can detect fi concerned regulator is internal or external to - * to MSM. Internal 3p3 regulator is powered through boost voltage - * regulator where as external 3p3 regulator is powered through VPH. - * So for internal voltage regulator it is required to power on - * boost voltage regulator first. Unfortunately some of the FFAs are - * re-worked to install external 3p3 regulator. For now, assuming all - * FFAs have 3p3 internal regulators and all SURFs have external 3p3 - * regulator as there is no way s/w can determine if theregulator is - * internal or external. May be, we can implement this flag as kernel - * boot parameters so that we can change code behaviour dynamically - */ -static int regulator_3p3_is_internal; -static struct vreg *vreg_5v; -static struct vreg *vreg_3p3; -static int msm_hsusb_ldo_init(int init) -{ - if (init) { - if (regulator_3p3_is_internal) { - vreg_5v = vreg_get(NULL, "boost"); - if (IS_ERR(vreg_5v)) - return PTR_ERR(vreg_5v); - vreg_set_level(vreg_5v, 5000); - } - - vreg_3p3 = vreg_get(NULL, "usb"); - if (IS_ERR(vreg_3p3)) - return PTR_ERR(vreg_3p3); - vreg_set_level(vreg_3p3, 3300); - } else { - if (regulator_3p3_is_internal) - vreg_put(vreg_5v); - vreg_put(vreg_3p3); - } - - return 0; -} - -static int msm_hsusb_ldo_enable(int enable) -{ - static int ldo_status; - int ret; - - if (ldo_status == enable) - return 0; - - if (regulator_3p3_is_internal && (!vreg_5v || IS_ERR(vreg_5v))) - return -ENODEV; - if (!vreg_3p3 || IS_ERR(vreg_3p3)) - return -ENODEV; - - ldo_status = enable; - - if (enable) { - if (regulator_3p3_is_internal) { - ret = vreg_enable(vreg_5v); - if (ret) - return ret; - - /* power supply to 3p3 regulator can vary from - * USB VBUS or VREG 5V. If the power supply is - * USB VBUS cable disconnection cannot be - * deteted. Select power supply to VREG 5V - */ - /* TBD: comeup with a better name */ - ret = pmic_vote_3p3_pwr_sel_switch(1); - if (ret) - return ret; - } - ret = vreg_enable(vreg_3p3); - - return ret; - } else { - if (regulator_3p3_is_internal) { - ret = vreg_disable(vreg_5v); - if (ret) - return ret; - ret = pmic_vote_3p3_pwr_sel_switch(0); - if (ret) - return ret; - } - ret = vreg_disable(vreg_3p3); - - return ret; - } -} - -static void __init qsd8x50_init_usb(void) -{ - usb_mpp_init(); - - if (machine_is_qsd8x50_ffa()) - regulator_3p3_is_internal = 1; - -#ifdef CONFIG_USB_MSM_OTG_72K - platform_device_register(&msm_device_otg); -#endif - -#ifdef CONFIG_USB_FUNCTION_MSM_HSUSB - platform_device_register(&msm_device_hsusb_peripheral); -#endif - -#ifdef CONFIG_USB_MSM_72K - platform_device_register(&msm_device_gadget_peripheral); -#endif - - if (machine_is_qsd8x50_ffa()) - return; - - vreg_usb = vreg_get(NULL, "boost"); - - if (IS_ERR(vreg_usb)) { - printk(KERN_ERR "%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_usb)); - return; - } - - platform_device_register(&msm_device_hsusb_otg); - msm_add_host(0, &msm_usb_host_pdata); -#ifdef CONFIG_USB_FS_HOST - if (fsusb_gpio_init()) - return; - msm_add_host(1, &msm_usb_host2_pdata); -#endif -} - -static struct vreg *vreg_mmc; - -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)) - -struct sdcc_gpio { - struct msm_gpio *cfg_data; - uint32_t size; -}; - -static struct msm_gpio sdc1_cfg_data[] = { - {GPIO_CFG(51, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_3"}, - {GPIO_CFG(52, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_2"}, - {GPIO_CFG(53, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_1"}, - {GPIO_CFG(54, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_0"}, - {GPIO_CFG(55, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_cmd"}, - {GPIO_CFG(56, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc1_clk"}, -}; - -static struct msm_gpio sdc2_cfg_data[] = { - {GPIO_CFG(62, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc2_clk"}, - {GPIO_CFG(63, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_cmd"}, - {GPIO_CFG(64, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_3"}, - {GPIO_CFG(65, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_2"}, - {GPIO_CFG(66, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_1"}, - {GPIO_CFG(67, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_0"}, -}; - -static struct msm_gpio sdc3_cfg_data[] = { - {GPIO_CFG(88, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc3_clk"}, - {GPIO_CFG(89, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_cmd"}, - {GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_3"}, - {GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_2"}, - {GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_1"}, - {GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_0"}, - -#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT - {GPIO_CFG(158, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_4"}, - {GPIO_CFG(159, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_5"}, - {GPIO_CFG(160, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_6"}, - {GPIO_CFG(161, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_7"}, -#endif -}; - -static struct msm_gpio sdc4_cfg_data[] = { - {GPIO_CFG(142, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc4_clk"}, - {GPIO_CFG(143, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_cmd"}, - {GPIO_CFG(144, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_0"}, - {GPIO_CFG(145, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_1"}, - {GPIO_CFG(146, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_2"}, - {GPIO_CFG(147, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_3"}, -}; - -static struct sdcc_gpio sdcc_cfg_data[] = { - { - .cfg_data = sdc1_cfg_data, - .size = ARRAY_SIZE(sdc1_cfg_data), - }, - { - .cfg_data = sdc2_cfg_data, - .size = ARRAY_SIZE(sdc2_cfg_data), - }, - { - .cfg_data = sdc3_cfg_data, - .size = ARRAY_SIZE(sdc3_cfg_data), - }, - { - .cfg_data = sdc4_cfg_data, - .size = ARRAY_SIZE(sdc4_cfg_data), - }, -}; - -static unsigned long vreg_sts, gpio_sts; - -static void msm_sdcc_setup_gpio(int dev_id, unsigned int enable) -{ - int rc = 0; - struct sdcc_gpio *curr; - - curr = &sdcc_cfg_data[dev_id - 1]; - if (!(test_bit(dev_id, &gpio_sts)^enable)) - return; - - if (enable) { - set_bit(dev_id, &gpio_sts); - rc = msm_gpios_request_enable(curr->cfg_data, curr->size); - if (rc) - printk(KERN_ERR "%s: Failed to turn on GPIOs for slot %d\n", - __func__, dev_id); - } else { - clear_bit(dev_id, &gpio_sts); - msm_gpios_disable_free(curr->cfg_data, curr->size); - } -} - -static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd) -{ - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dv, struct platform_device, dev); - msm_sdcc_setup_gpio(pdev->id, !!vdd); - - if (vdd == 0) { - if (!vreg_sts) - return 0; - - clear_bit(pdev->id, &vreg_sts); - - if (!vreg_sts) { - rc = vreg_disable(vreg_mmc); - if (rc) - printk(KERN_ERR "%s: return val: %d \n", - __func__, rc); - } - return 0; - } - - if (!vreg_sts) { - rc = vreg_set_level(vreg_mmc, PMIC_VREG_GP6_LEVEL); - if (!rc) - rc = vreg_enable(vreg_mmc); - if (rc) - printk(KERN_ERR "%s: return val: %d \n", - __func__, rc); - } - set_bit(pdev->id, &vreg_sts); - return 0; -} - -#endif -#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\ - || defined(CONFIG_MMC_MSM_SDC4_SUPPORT)) - -static int msm_sdcc_get_wpswitch(struct device *dv) -{ - void __iomem *wp_addr = 0; - uint32_t ret = 0; - struct platform_device *pdev; - - if (!machine_is_qsd8x50_surf()) - return -1; - - pdev = container_of(dv, struct platform_device, dev); - - wp_addr = ioremap(FPGA_SDCC_STATUS, 4); - if (!wp_addr) { - pr_err("%s: Could not remap %x\n", __func__, FPGA_SDCC_STATUS); - return -ENOMEM; - } - - ret = (readl(wp_addr) >> ((pdev->id - 1) << 1)) & (0x03); - pr_info("%s: WP/CD Status for Slot %d = 0x%x \n", __func__, - pdev->id, ret); - iounmap(wp_addr); - return ((ret == 0x02) ? 1 : 0); - -} -#endif - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT -static struct mmc_platform_data qsd8x50_sdc1_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .wpswitch = msm_sdcc_get_wpswitch, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 25000000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT -static struct mmc_platform_data qsd8x50_sdc2_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .wpswitch = msm_sdcc_get_wpswitch, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 25000000, - .msmsdcc_fmax = 49152000, - .nonremovable = 1, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT -static struct mmc_platform_data qsd8x50_sdc3_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, -#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT - .mmc_bus_width = MMC_CAP_8_BIT_DATA, -#else - .mmc_bus_width = MMC_CAP_4_BIT_DATA, -#endif - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 25000000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT -static struct mmc_platform_data qsd8x50_sdc4_data = { - .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, - .translate_vdd = msm_sdcc_setup_power, - .mmc_bus_width = MMC_CAP_4_BIT_DATA, - .wpswitch = msm_sdcc_get_wpswitch, - .msmsdcc_fmin = 144000, - .msmsdcc_fmid = 25000000, - .msmsdcc_fmax = 49152000, - .nonremovable = 0, -}; -#endif - -static void __init qsd8x50_init_mmc(void) -{ - if (machine_is_qsd8x50_ffa()) - vreg_mmc = vreg_get(NULL, "gp6"); - else - vreg_mmc = vreg_get(NULL, "gp5"); - - if (IS_ERR(vreg_mmc)) { - printk(KERN_ERR "%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_mmc)); - return; - } - -#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT - msm_add_sdcc(1, &qsd8x50_sdc1_data); -#endif - - if (machine_is_qsd8x50_surf()) { -#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT - msm_add_sdcc(2, &qsd8x50_sdc2_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT - msm_add_sdcc(3, &qsd8x50_sdc3_data); -#endif -#ifdef CONFIG_MMC_MSM_SDC4_SUPPORT - msm_add_sdcc(4, &qsd8x50_sdc4_data); -#endif - } - -} - -static void __init qsd8x50_cfg_smc91x(void) -{ - int rc = 0; - - if (machine_is_qsd8x50_surf()) { - smc91x_resources[0].start = 0x70000300; - smc91x_resources[0].end = 0x700003ff; - smc91x_resources[1].start = MSM_GPIO_TO_INT(156); - smc91x_resources[1].end = MSM_GPIO_TO_INT(156); - } else if (machine_is_qsd8x50_ffa()) { - smc91x_resources[0].start = 0x84000300; - smc91x_resources[0].end = 0x840003ff; - smc91x_resources[1].start = MSM_GPIO_TO_INT(87); - smc91x_resources[1].end = MSM_GPIO_TO_INT(87); - - rc = gpio_tlmm_config(GPIO_CFG(87, 0, GPIO_CFG_INPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), - GPIO_CFG_ENABLE); - if (rc) { - printk(KERN_ERR "%s: gpio_tlmm_config=%d\n", - __func__, rc); - } - } else - printk(KERN_ERR "%s: invalid machine type\n", __func__); -} - -static struct msm_pm_platform_data msm_pm_data[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 8594, - .residency = 23740, - }, - - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 4594, - .residency = 23740, - }, - - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 0, - .suspend_enabled = 1, - .latency = 443, - .residency = 1098, - }, - - [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = { - .idle_supported = 1, - .suspend_supported = 1, - .idle_enabled = 1, - .suspend_enabled = 1, - .latency = 2, - .residency = 0, - }, -}; - -static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = { - .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_VIRT, - .v_addr = (unsigned int *)PAGE_OFFSET, -}; - -static void -msm_i2c_gpio_config(int iface, int config_type) -{ - int gpio_scl; - int gpio_sda; - if (iface) { - gpio_scl = 60; - gpio_sda = 61; - } else { - gpio_scl = 95; - gpio_sda = 96; - } - if (config_type) { - gpio_tlmm_config(GPIO_CFG(gpio_scl, 1, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - gpio_tlmm_config(GPIO_CFG(gpio_sda, 1, GPIO_CFG_INPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - } else { - gpio_tlmm_config(GPIO_CFG(gpio_scl, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - gpio_tlmm_config(GPIO_CFG(gpio_sda, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE); - } -} - -static struct msm_i2c_platform_data msm_i2c_pdata = { - .clk_freq = 100000, - .rsl_id = SMEM_SPINLOCK_I2C, - .pri_clk = 95, - .pri_dat = 96, - .aux_clk = 60, - .aux_dat = 61, - .msm_i2c_config_gpio = msm_i2c_gpio_config, -}; - -static void __init msm_device_i2c_init(void) -{ - if (gpio_request(95, "i2c_pri_clk")) - pr_err("failed to request gpio i2c_pri_clk\n"); - if (gpio_request(96, "i2c_pri_dat")) - pr_err("failed to request gpio i2c_pri_dat\n"); - if (gpio_request(60, "i2c_sec_clk")) - pr_err("failed to request gpio i2c_sec_clk\n"); - if (gpio_request(61, "i2c_sec_dat")) - pr_err("failed to request gpio i2c_sec_dat\n"); - - msm_i2c_pdata.rmutex = 1; - msm_i2c_pdata.pm_lat = - msm_pm_data[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] - .latency; - msm_device_i2c.dev.platform_data = &msm_i2c_pdata; -} - -static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE; -static int __init pmem_kernel_ebi1_size_setup(char *p) -{ - pmem_kernel_ebi1_size = memparse(p, NULL); - return 0; -} -early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup); - -#ifdef CONFIG_KERNEL_PMEM_SMI_REGION -static unsigned pmem_kernel_smi_size = MSM_PMEM_SMIPOOL_SIZE; -static int __init pmem_kernel_smi_size_setup(char *p) -{ - pmem_kernel_smi_size = memparse(p, NULL); - - /* Make sure that we don't allow more SMI memory then is - available - the kernel mapping code has no way of knowing - if it has gone over the edge */ - - if (pmem_kernel_smi_size > MSM_PMEM_SMIPOOL_SIZE) - pmem_kernel_smi_size = MSM_PMEM_SMIPOOL_SIZE; - return 0; -} -early_param("pmem_kernel_smi_size", pmem_kernel_smi_size_setup); -#endif - -static unsigned pmem_sf_size = MSM_PMEM_SF_SIZE; -static int __init pmem_sf_size_setup(char *p) -{ - pmem_sf_size = memparse(p, NULL); - return 0; -} -early_param("pmem_sf_size", pmem_sf_size_setup); - -static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE; -static int __init pmem_adsp_size_setup(char *p) -{ - pmem_adsp_size = memparse(p, NULL); - return 0; -} -early_param("pmem_adsp_size", pmem_adsp_size_setup); - - -static unsigned audio_size = MSM_AUDIO_SIZE; -static int __init audio_size_setup(char *p) -{ - audio_size = memparse(p, NULL); - return 0; -} -early_param("audio_size", audio_size_setup); - -static void __init qsd8x50_init(void) -{ - msm_clock_init(&qds8x50_clock_init_data); - qsd8x50_cfg_smc91x(); - platform_device_register(&msm8x50_device_acpuclk); - - msm_hsusb_pdata.swfi_latency = - msm_pm_data - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_hsusb_peripheral.dev.platform_data = &msm_hsusb_pdata; - - msm_otg_pdata.swfi_latency = - msm_pm_data - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; - msm_device_otg.dev.platform_data = &msm_otg_pdata; - msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; - msm_gadget_pdata.is_phy_status_timer_on = 1; - -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - msm_device_tsif.dev.platform_data = &tsif_platform_data; -#endif - platform_add_devices(devices, ARRAY_SIZE(devices)); - msm_fb_add_devices(); -#ifdef CONFIG_MSM_CAMERA - config_camera_off_gpios(); /* might not be necessary */ -#endif - qsd8x50_init_usb(); - qsd8x50_init_mmc(); - bt_power_init(); - audio_gpio_init(); - msm_device_i2c_init(); - msm_qsd_spi_init(); - i2c_register_board_info(0, msm_i2c_board_info, - ARRAY_SIZE(msm_i2c_board_info)); - spi_register_board_info(msm_spi_board_info, - ARRAY_SIZE(msm_spi_board_info)); - msm_pm_set_platform_data(msm_pm_data, ARRAY_SIZE(msm_pm_data)); - BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); - msm_pm_register_irqs(); - -#ifdef CONFIG_SURF_FFA_GPIO_KEYPAD - if (machine_is_qsd8x50_ffa()) - platform_device_register(&keypad_device_8k_ffa); - else - platform_device_register(&keypad_device_surf); -#endif -} - -static void __init qsd8x50_allocate_memory_regions(void) -{ - void *addr; - unsigned long size; - - size = pmem_kernel_ebi1_size; - if (size) { - addr = alloc_bootmem_align(size, 0x100000); - android_pmem_kernel_ebi1_pdata.size = size; - pr_info("allocating %lu bytes at %p (%lx physical) for kernel" - " ebi1 pmem arena\n", size, addr, __pa(addr)); - } - -#ifdef CONFIG_KERNEL_PMEM_SMI_REGION - size = pmem_kernel_smi_size; - if (size > MSM_PMEM_SMIPOOL_SIZE) { - printk(KERN_ERR "pmem kernel smi arena size %lu is too big\n", - size); - - size = MSM_PMEM_SMIPOOL_SIZE; - } - - android_pmem_kernel_smi_pdata.size = size; - - pr_info("allocating %lu bytes at %lx (%lx physical)" - "for pmem kernel smi arena\n", size, - (long unsigned int) MSM_PMEM_SMIPOOL_BASE, - __pa(MSM_PMEM_SMIPOOL_BASE)); -#endif - - size = pmem_sf_size; - if (size) { - addr = alloc_bootmem(size); - android_pmem_pdata.size = size; - pr_info("allocating %lu bytes at %p (%lx physical) for sf " - "pmem arena\n", size, addr, __pa(addr)); - } - - size = pmem_adsp_size; - if (size) { - addr = alloc_bootmem(size); - android_pmem_adsp_pdata.size = size; - pr_info("allocating %lu bytes at %p (%lx physical) for adsp " - "pmem arena\n", size, addr, __pa(addr)); - } - - - size = MSM_FB_SIZE; - addr = (void *)MSM_FB_BASE; - msm_fb_resources[0].start = (unsigned long)addr; - msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; - pr_info("using %lu bytes of SMI at %lx physical for fb\n", - size, (unsigned long)addr); - - size = audio_size ? : MSM_AUDIO_SIZE; - addr = alloc_bootmem(size); - msm_audio_resources[0].start = __pa(addr); - msm_audio_resources[0].end = msm_audio_resources[0].start + size - 1; - pr_info("allocating %lu bytes at %p (%lx physical) for audio\n", - size, addr, __pa(addr)); -} - -static void __init qsd8x50_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_qsd8x50_io(); - qsd8x50_allocate_memory_regions(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); -} - -static void __init qsd8x50_init_late(void) -{ - smd_debugfs_init(); -} - -MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") - .atag_offset = 0x100, - .map_io = qsd8x50_map_io, - .init_irq = qsd8x50_init_irq, - .init_machine = qsd8x50_init, - .init_late = qsd8x50_init_late, - .init_time = qsd8x50_timer_init, -MACHINE_END - -MACHINE_START(QSD8X50_FFA, "QCT QSD8X50 FFA") - .atag_offset = 0x100, - .map_io = qsd8x50_map_io, - .init_irq = qsd8x50_init_irq, - .init_machine = qsd8x50_init, - .init_late = qsd8x50_init_late, - .init_time = qsd8x50_timer_init, -MACHINE_END diff --git a/arch/arm/mach-msm/board-sapphire-gpio.c b/arch/arm/mach-msm/board-sapphire-gpio.c deleted file mode 100644 index 375440c5afb9..000000000000 --- a/arch/arm/mach-msm/board-sapphire-gpio.c +++ /dev/null @@ -1,326 +0,0 @@ -/* arch/arm/mach-msm/board-sapphire-gpio.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "gpio_chip.h" -#include "board-sapphire.h" - -#ifdef DEBUG_SAPPHIRE_GPIO -#define DBG(fmt, arg...) printk(KERN_INFO "%s: " fmt "\n", __func__, ## arg) -#else -#define DBG(fmt, arg...) do {} while (0) -#endif - -#define SAPPHIRE_CPLD_INT_STATUS (SAPPHIRE_CPLD_BASE + 0x0E) -#define SAPPHIRE_CPLD_INT_LEVEL (SAPPHIRE_CPLD_BASE + 0x08) -#define SAPPHIRE_CPLD_INT_MASK (SAPPHIRE_CPLD_BASE + 0x0C) - -/*CPLD misc reg offset*/ -static const int _g_CPLD_MISCn_Offset[] = { 0x0A, /*misc1 reg*/ - 0x00, /*misc2 reg*/ - 0x02, /*misc3 reg*/ - 0x04, /*misc4 reg*/ - 0x06}; /*misc5 reg*/ -/*CPLD INT Bank*/ -/*BANK0: int1 status, int2 level, int3 mask*/ -static const int _g_INT_BANK_Offset[][3] = {{0x0E, 0x08, 0x0C} }; - -static uint8_t sapphire_cpld_initdata[4] = { - [0] = 0x80, /* for serial debug UART3, low current misc2*/ - [1] = 0x34, /* jog & tp enable, I2C pull misc3*/ - [3] = 0x04, /* mmdi 32k en misc5*/ -}; - -/*save current working int mask, so the value can be restored after resume. -Sapphire has only bank0.*/ -static uint8_t sapphire_int_mask[] = { - [0] = 0xfb, /* enable all interrupts, bit 2 is not used */ -}; - -/*Sleep have to prepare the wake up source in advance. -default to disable all wakeup sources when suspend.*/ -static uint8_t sapphire_sleep_int_mask[] = { - [0] = 0x00, /* bit2 is not used */ -}; - -static int sapphire_suspended; - -static int sapphire_gpio_read(struct gpio_chip *chip, unsigned n) -{ - if (n < SAPPHIRE_GPIO_INT_B0_BASE) /*MISCn*/ - return !!(readb(CPLD_GPIO_REG(n)) & CPLD_GPIO_BIT_POS_MASK(n)); - else if (n <= SAPPHIRE_GPIO_END) /*gpio n is INT pin*/ - return !!(readb(CPLD_INT_LEVEL_REG_G(n)) & - CPLD_GPIO_BIT_POS_MASK(n)); - return 0; -} - -/*CPLD Write only register :MISC2, MISC3, MISC4, MISC5 => reg=0,2,4,6 -Reading from write-only registers is undefined, so the writing value -should be kept in shadow for later usage.*/ -int sapphire_gpio_write(struct gpio_chip *chip, unsigned n, unsigned on) -{ - unsigned long flags; - uint8_t reg_val; - if (n > SAPPHIRE_GPIO_END) - return -1; - - local_irq_save(flags); - reg_val = readb(CPLD_GPIO_REG(n)); - if (on) - reg_val |= CPLD_GPIO_BIT_POS_MASK(n); - else - reg_val &= ~CPLD_GPIO_BIT_POS_MASK(n); - writeb(reg_val, CPLD_GPIO_REG(n)); - - DBG("gpio=%d, l=0x%x\r\n", n, readb(SAPPHIRE_CPLD_INT_LEVEL)); - - local_irq_restore(flags); - - return 0; -} - -static int sapphire_gpio_configure(struct gpio_chip *chip, unsigned int gpio, - unsigned long flags) -{ - if (flags & (GPIOF_OUTPUT_LOW | GPIOF_OUTPUT_HIGH)) - sapphire_gpio_write(chip, gpio, flags & GPIOF_OUTPUT_HIGH); - - DBG("gpio=%d, l=0x%x\r\n", gpio, readb(SAPPHIRE_CPLD_INT_LEVEL)); - - return 0; -} - -static int sapphire_gpio_get_irq_num(struct gpio_chip *chip, unsigned int gpio, - unsigned int *irqp, unsigned long *irqnumflagsp) -{ - DBG("gpio=%d, l=0x%x\r\n", gpio, readb(SAPPHIRE_CPLD_INT_LEVEL)); - DBG("SAPPHIRE_GPIO_INT_B0_BASE=%d, SAPPHIRE_GPIO_LAST_INT=%d\r\n", - SAPPHIRE_GPIO_INT_B0_BASE, SAPPHIRE_GPIO_LAST_INT); - if ((gpio < SAPPHIRE_GPIO_INT_B0_BASE) || - (gpio > SAPPHIRE_GPIO_LAST_INT)) - return -ENOENT; - *irqp = SAPPHIRE_GPIO_TO_INT(gpio); - DBG("*irqp=%d\r\n", *irqp); - if (irqnumflagsp) - *irqnumflagsp = 0; - return 0; -} - -/*write 1 to clear INT status bit.*/ -static void sapphire_gpio_irq_ack(unsigned int irq) -{ - /*write 1 to clear*/ - writeb(SAPPHIRE_INT_BIT_MASK(irq), CPLD_INT_STATUS_REG(irq)); -} - -/*unmask/enable the INT -static void sapphire_gpio_irq_unmask(unsigned int irq)*/ -static void sapphire_gpio_irq_enable(unsigned int irq) -{ - unsigned long flags; - uint8_t reg_val; - - local_irq_save(flags); /*disabling all interrupts*/ - - reg_val = readb(CPLD_INT_MASK_REG(irq)) | SAPPHIRE_INT_BIT_MASK(irq); - DBG("(irq=%d,0x%x, 0x%x)\r\n", irq, CPLD_INT_MASK_REG(irq), - SAPPHIRE_INT_BIT_MASK(irq)); - DBG("sapphire_suspended=%d\r\n", sapphire_suspended); - /*printk(KERN_INFO "sapphire_gpio_irq_mask irq %d => %d:%02x\n", - irq, bank, reg_val);*/ - if (!sapphire_suspended) - writeb(reg_val, CPLD_INT_MASK_REG(irq)); - - reg_val = readb(CPLD_INT_MASK_REG(irq)); - DBG("reg_val= 0x%x\r\n", reg_val); - DBG("l=0x%x\r\n", readb(SAPPHIRE_CPLD_INT_LEVEL)); - - local_irq_restore(flags); /*restore the interrupts*/ -} - -/*mask/disable INT -static void sapphire_gpio_irq_mask(unsigned int irq)*/ -static void sapphire_gpio_irq_disable(unsigned int irq) -{ - unsigned long flags; - uint8_t reg_val; - - local_irq_save(flags); - reg_val = readb(CPLD_INT_MASK_REG(irq)) & ~SAPPHIRE_INT_BIT_MASK(irq); - /*CPLD INT MASK is r/w now.*/ - - /*printk(KERN_INFO "sapphire_gpio_irq_unmask irq %d => %d:%02x\n", - irq, bank, reg_val);*/ - DBG("(%d,0x%x, 0x%x, 0x%x)\r\n", irq, reg_val, CPLD_INT_MASK_REG(irq), - SAPPHIRE_INT_BIT_MASK(irq)); - DBG("sapphire_suspended=%d\r\n", sapphire_suspended); - if (!sapphire_suspended) - writeb(reg_val, CPLD_INT_MASK_REG(irq)); - - reg_val = readb(CPLD_INT_MASK_REG(irq)); - DBG("reg_val= 0x%x\r\n", reg_val); - DBG("l=0x%x\r\n", readb(SAPPHIRE_CPLD_INT_LEVEL)); - - local_irq_restore(flags); -} - -/*preparing enable/disable wake source before sleep*/ -int sapphire_gpio_irq_set_wake(unsigned int irq, unsigned int on) -{ - unsigned long flags; - uint8_t mask = SAPPHIRE_INT_BIT_MASK(irq); - - local_irq_save(flags); - - if (on) /*wake on -> mask the bit*/ - sapphire_sleep_int_mask[CPLD_INT_TO_BANK(irq)] |= mask; - else /*no wake -> unmask the bit*/ - sapphire_sleep_int_mask[CPLD_INT_TO_BANK(irq)] &= ~mask; - local_irq_restore(flags); - return 0; -} - -/*Sapphire has only one INT Bank.*/ -static void sapphire_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) -{ - int j; - unsigned v; - int int_base = SAPPHIRE_INT_START; - - v = readb(SAPPHIRE_CPLD_INT_STATUS); /*INT1 status reg, BANK0*/ - - for (j = 0; j < 8 ; j++) { /*8 bit per bank*/ - if (v & (1U << j)) { /*got the INT Bit*/ - DBG("generic_handle_irq j=0x%x\r\n", j); - generic_handle_irq(int_base + j); - } - } - - desc->chip->ack(irq); /*clear CPLD INT in SOC side.*/ - DBG("irq=%d, l=0x%x\r\n", irq, readb(SAPPHIRE_CPLD_INT_LEVEL)); -} - -/*Save current working sources before sleep, so we can restore it after - * resume.*/ -static int sapphire_sysdev_suspend(struct sys_device *dev, pm_message_t state) -{ - sapphire_suspended = 1; - /*save current masking*/ - sapphire_int_mask[0] = readb(SAPPHIRE_CPLD_BASE + - SAPPHIRE_GPIO_INT_B0_MASK_REG); - - /*set waking source before sleep.*/ - writeb(sapphire_sleep_int_mask[0], - SAPPHIRE_CPLD_BASE + SAPPHIRE_GPIO_INT_B0_MASK_REG); - - return 0; -} - -/*All the registers will be kept till a power loss...*/ -int sapphire_sysdev_resume(struct sys_device *dev) -{ - /*restore the working mask saved before sleep*/ - writeb(sapphire_int_mask[0], SAPPHIRE_CPLD_BASE + - SAPPHIRE_GPIO_INT_B0_MASK_REG); - sapphire_suspended = 0; - return 0; -} - -/** - * linux/irq.h :: struct irq_chip - * @enable: enable the interrupt (defaults to chip->unmask if NULL) - * @disable: disable the interrupt (defaults to chip->mask if NULL) - * @ack: start of a new interrupt - * @mask: mask an interrupt source - * @mask_ack: ack and mask an interrupt source - * @unmask: unmask an interrupt source - */ -static struct irq_chip sapphire_gpio_irq_chip = { - .name = "sapphiregpio", - .ack = sapphire_gpio_irq_ack, - .mask = sapphire_gpio_irq_disable, /*sapphire_gpio_irq_mask,*/ - .unmask = sapphire_gpio_irq_enable, /*sapphire_gpio_irq_unmask,*/ - .set_wake = sapphire_gpio_irq_set_wake, - /*.set_type = sapphire_gpio_irq_set_type,*/ -}; - -/*Thomas:For CPLD*/ -static struct gpio_chip sapphire_gpio_chip = { - .start = SAPPHIRE_GPIO_START, - .end = SAPPHIRE_GPIO_END, - .configure = sapphire_gpio_configure, - .get_irq_num = sapphire_gpio_get_irq_num, - .read = sapphire_gpio_read, - .write = sapphire_gpio_write, -/* .read_detect_status = sapphire_gpio_read_detect_status, - .clear_detect_status = sapphire_gpio_clear_detect_status */ -}; - -struct sysdev_class sapphire_sysdev_class = { - .name = "sapphiregpio_irq", - .suspend = sapphire_sysdev_suspend, - .resume = sapphire_sysdev_resume, -}; - -static struct sys_device sapphire_irq_device = { - .cls = &sapphire_sysdev_class, -}; - -int sapphire_init_gpio(void) -{ - int i; - if (!machine_is_sapphire()) - return 0; - - DBG("%d,%d\r\n", SAPPHIRE_INT_START, SAPPHIRE_INT_END); - DBG("NR_MSM_IRQS=%d, NR_GPIO_IRQS=%d\r\n", NR_MSM_IRQS, NR_GPIO_IRQS); - for (i = SAPPHIRE_INT_START; i <= SAPPHIRE_INT_END; i++) { - set_irq_chip(i, &sapphire_gpio_irq_chip); - set_irq_handler(i, handle_edge_irq); - set_irq_flags(i, IRQF_VALID); - } - - register_gpio_chip(&sapphire_gpio_chip); - - /*setup CPLD INT connecting to SOC's gpio 17 */ - set_irq_type(MSM_GPIO_TO_INT(17), IRQF_TRIGGER_HIGH); - set_irq_chained_handler(MSM_GPIO_TO_INT(17), sapphire_gpio_irq_handler); - set_irq_wake(MSM_GPIO_TO_INT(17), 1); - - if (sysdev_class_register(&sapphire_sysdev_class) == 0) - sysdev_register(&sapphire_irq_device); - - return 0; -} - -int sapphire_init_cpld(unsigned int sys_rev) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(sapphire_cpld_initdata); i++) - writeb(sapphire_cpld_initdata[i], SAPPHIRE_CPLD_BASE + i * 2); - return 0; -} - -postcore_initcall(sapphire_init_gpio); diff --git a/arch/arm/mach-msm/board-sapphire-h2w.c b/arch/arm/mach-msm/board-sapphire-h2w.c deleted file mode 100644 index aa83e216974d..000000000000 --- a/arch/arm/mach-msm/board-sapphire-h2w.c +++ /dev/null @@ -1,545 +0,0 @@ -/* - * H2W device detection driver. - * - * Copyright (C) 2008 HTC Corporation. - * Copyright (C) 2008 Google, Inc. - * - * Authors: - * Laurence Chen - * Nick Pelly - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* For detecting HTC 2 Wire devices, such as wired headset. - - Logically, the H2W driver is always present, and H2W state (hi->state) - indicates what is currently plugged into the H2W interface. - - When the headset is plugged in, CABLE_IN1 is pulled low. When the headset - button is pressed, CABLE_IN2 is pulled low. These two lines are shared with - the TX and RX (respectively) of UART3 - used for serial debugging. - - This headset driver keeps the CPLD configured as UART3 for as long as - possible, so that we can do serial FIQ debugging even when the kernel is - locked and this driver no longer runs. So it only configures the CPLD to - GPIO while the headset is plugged in, and for 10ms during detection work. - - Unfortunately we can't leave the CPLD as UART3 while a headset is plugged - in, UART3 is pullup on TX but the headset is pull-down, causing a 55 mA - drain on sapphire. - - The headset detection work involves setting CPLD to GPIO, and then pulling - CABLE_IN1 high with a stronger pullup than usual. A H2W headset will still - pull this line low, whereas other attachments such as a serial console - would get pulled up by this stronger pullup. - - Headset insertion/removal causes UEvent's to be sent, and - /sys/class/switch/h2w/state to be updated. - - Button presses are interpreted as input event (KEY_MEDIA). Button presses - are ignored if the headset is plugged in, so the buttons on 11 pin -> 3.5mm - jack adapters do not work until a headset is plugged into the adapter. This - is to avoid serial RX traffic causing spurious button press events. - - We tend to check the status of CABLE_IN1 a few more times than strictly - necessary during headset detection, to avoid spurious headset insertion - events caused by serial debugger TX traffic. -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "board-sapphire.h" - -#ifdef CONFIG_DEBUG_SAPPHIRE_H2W -#define H2W_DBG(fmt, arg...) printk(KERN_INFO "[H2W] %s " fmt "\n", __FUNCTION__, ## arg) -#else -#define H2W_DBG(fmt, arg...) do {} while (0) -#endif - -static struct workqueue_struct *g_detection_work_queue; -static void detection_work(struct work_struct *work); -static DECLARE_WORK(g_detection_work, detection_work); -enum { - NO_DEVICE = 0, - HTC_HEADSET = 1, -}; - -enum { - UART3 = 0, - GPIO = 1, -}; - -struct h2w_info { - struct switch_dev sdev; - struct input_dev *input; - - atomic_t btn_state; - int ignore_btn; - - unsigned int irq; - unsigned int irq_btn; - - struct hrtimer timer; - ktime_t debounce_time; - - struct hrtimer btn_timer; - ktime_t btn_debounce_time; -}; -static struct h2w_info *hi; - -static ssize_t sapphire_h2w_print_name(struct switch_dev *sdev, char *buf) -{ - switch (switch_get_state(&hi->sdev)) { - case NO_DEVICE: - return sprintf(buf, "No Device\n"); - case HTC_HEADSET: - return sprintf(buf, "Headset\n"); - } - return -EINVAL; -} - -static void configure_cpld(int route) -{ - H2W_DBG(" route = %s", route == UART3 ? "UART3" : "GPIO"); - switch (route) { - case UART3: - gpio_set_value(SAPPHIRE_GPIO_H2W_SEL0, 0); - gpio_set_value(SAPPHIRE_GPIO_H2W_SEL1, 1); - break; - case GPIO: - gpio_set_value(SAPPHIRE_GPIO_H2W_SEL0, 0); - gpio_set_value(SAPPHIRE_GPIO_H2W_SEL1, 0); - break; - } -} - -static void button_pressed(void) -{ - H2W_DBG(""); - atomic_set(&hi->btn_state, 1); - input_report_key(hi->input, KEY_MEDIA, 1); - input_sync(hi->input); -} - -static void button_released(void) -{ - H2W_DBG(""); - atomic_set(&hi->btn_state, 0); - input_report_key(hi->input, KEY_MEDIA, 0); - input_sync(hi->input); -} - -#ifdef CONFIG_MSM_SERIAL_DEBUGGER -extern void msm_serial_debug_enable(int); -#endif - -static void insert_headset(void) -{ - unsigned long irq_flags; - - H2W_DBG(""); - - switch_set_state(&hi->sdev, HTC_HEADSET); - configure_cpld(GPIO); - -#ifdef CONFIG_MSM_SERIAL_DEBUGGER - msm_serial_debug_enable(false); -#endif - - - /* On some non-standard headset adapters (usually those without a - * button) the btn line is pulled down at the same time as the detect - * line. We can check here by sampling the button line, if it is - * low then it is probably a bad adapter so ignore the button. - * If the button is released then we stop ignoring the button, so that - * the user can recover from the situation where a headset is plugged - * in with button held down. - */ - hi->ignore_btn = !gpio_get_value(SAPPHIRE_GPIO_CABLE_IN2); - - /* Enable button irq */ - local_irq_save(irq_flags); - enable_irq(hi->irq_btn); - local_irq_restore(irq_flags); - - hi->debounce_time = ktime_set(0, 20000000); /* 20 ms */ -} - -static void remove_headset(void) -{ - unsigned long irq_flags; - - H2W_DBG(""); - - switch_set_state(&hi->sdev, NO_DEVICE); - configure_cpld(UART3); - - /* Disable button */ - local_irq_save(irq_flags); - disable_irq(hi->irq_btn); - local_irq_restore(irq_flags); - - if (atomic_read(&hi->btn_state)) - button_released(); - - hi->debounce_time = ktime_set(0, 100000000); /* 100 ms */ -} - -static void detection_work(struct work_struct *work) -{ - unsigned long irq_flags; - int clk, cable_in1; - - H2W_DBG(""); - - if (gpio_get_value(SAPPHIRE_GPIO_CABLE_IN1) != 0) { - /* Headset not plugged in */ - if (switch_get_state(&hi->sdev) == HTC_HEADSET) - remove_headset(); - return; - } - - /* Something plugged in, lets make sure its a headset */ - - /* Switch CPLD to GPIO to do detection */ - configure_cpld(GPIO); - /* Disable headset interrupt while detecting.*/ - local_irq_save(irq_flags); - disable_irq(hi->irq); - local_irq_restore(irq_flags); - - /* Set GPIO_CABLE_IN1 as output high */ - gpio_direction_output(SAPPHIRE_GPIO_CABLE_IN1, 1); - /* Delay 10ms for pin stable. */ - msleep(10); - /* Save H2W_CLK */ - clk = gpio_get_value(SAPPHIRE_GPIO_H2W_CLK_GPI); - /* Set GPIO_CABLE_IN1 as input */ - gpio_direction_input(SAPPHIRE_GPIO_CABLE_IN1); - - /* Restore IRQs */ - local_irq_save(irq_flags); - enable_irq(hi->irq); - local_irq_restore(irq_flags); - - cable_in1 = gpio_get_value(SAPPHIRE_GPIO_CABLE_IN1); - - if (cable_in1 == 0 && clk == 0) { - if (switch_get_state(&hi->sdev) == NO_DEVICE) - insert_headset(); - } else { - configure_cpld(UART3); - H2W_DBG("CABLE_IN1 was low, but not a headset " - "(recent cable_in1 = %d, clk = %d)", cable_in1, clk); - } -} - -static enum hrtimer_restart button_event_timer_func(struct hrtimer *data) -{ - H2W_DBG(""); - - if (switch_get_state(&hi->sdev) == HTC_HEADSET) { - if (gpio_get_value(SAPPHIRE_GPIO_CABLE_IN2)) { - if (hi->ignore_btn) - hi->ignore_btn = 0; - else if (atomic_read(&hi->btn_state)) - button_released(); - } else { - if (!hi->ignore_btn && !atomic_read(&hi->btn_state)) - button_pressed(); - } - } - - return HRTIMER_NORESTART; -} - -static enum hrtimer_restart detect_event_timer_func(struct hrtimer *data) -{ - H2W_DBG(""); - - queue_work(g_detection_work_queue, &g_detection_work); - return HRTIMER_NORESTART; -} - -static irqreturn_t detect_irq_handler(int irq, void *dev_id) -{ - int value1, value2; - int retry_limit = 10; - - H2W_DBG(""); - do { - value1 = gpio_get_value(SAPPHIRE_GPIO_CABLE_IN1); - set_irq_type(hi->irq, value1 ? - IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - value2 = gpio_get_value(SAPPHIRE_GPIO_CABLE_IN1); - } while (value1 != value2 && retry_limit-- > 0); - - H2W_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); - - if ((switch_get_state(&hi->sdev) == NO_DEVICE) ^ value2) { - if (switch_get_state(&hi->sdev) == HTC_HEADSET) - hi->ignore_btn = 1; - /* Do the rest of the work in timer context */ - hrtimer_start(&hi->timer, hi->debounce_time, HRTIMER_MODE_REL); - } - - return IRQ_HANDLED; -} - -static irqreturn_t button_irq_handler(int irq, void *dev_id) -{ - int value1, value2; - int retry_limit = 10; - - H2W_DBG(""); - do { - value1 = gpio_get_value(SAPPHIRE_GPIO_CABLE_IN2); - set_irq_type(hi->irq_btn, value1 ? - IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - value2 = gpio_get_value(SAPPHIRE_GPIO_CABLE_IN2); - } while (value1 != value2 && retry_limit-- > 0); - - H2W_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); - - hrtimer_start(&hi->btn_timer, hi->btn_debounce_time, HRTIMER_MODE_REL); - - return IRQ_HANDLED; -} - -#if defined(CONFIG_DEBUG_FS) -static void h2w_debug_set(void *data, u64 val) -{ - switch_set_state(&hi->sdev, (int)val); -} - -static u64 h2w_debug_get(void *data) -{ - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(h2w_debug_fops, h2w_debug_get, h2w_debug_set, "%llu\n"); -static int __init h2w_debug_init(void) -{ - struct dentry *dent; - - dent = debugfs_create_dir("h2w", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("state", 0644, dent, NULL, &h2w_debug_fops); - - return 0; -} - -device_initcall(h2w_debug_init); -#endif - -static int sapphire_h2w_probe(struct platform_device *pdev) -{ - int ret; - unsigned long irq_flags; - - printk(KERN_INFO "H2W: Registering H2W (headset) driver\n"); - hi = kzalloc(sizeof(struct h2w_info), GFP_KERNEL); - if (!hi) - return -ENOMEM; - - atomic_set(&hi->btn_state, 0); - hi->ignore_btn = 0; - - hi->debounce_time = ktime_set(0, 100000000); /* 100 ms */ - hi->btn_debounce_time = ktime_set(0, 10000000); /* 10 ms */ - hi->sdev.name = "h2w"; - hi->sdev.print_name = sapphire_h2w_print_name; - - ret = switch_dev_register(&hi->sdev); - if (ret < 0) - goto err_switch_dev_register; - - g_detection_work_queue = create_workqueue("detection"); - if (g_detection_work_queue == NULL) { - ret = -ENOMEM; - goto err_create_work_queue; - } - - ret = gpio_request(SAPPHIRE_GPIO_CABLE_IN1, "h2w_detect"); - if (ret < 0) - goto err_request_detect_gpio; - - ret = gpio_request(SAPPHIRE_GPIO_CABLE_IN2, "h2w_button"); - if (ret < 0) - goto err_request_button_gpio; - - ret = gpio_direction_input(SAPPHIRE_GPIO_CABLE_IN1); - if (ret < 0) - goto err_set_detect_gpio; - - ret = gpio_direction_input(SAPPHIRE_GPIO_CABLE_IN2); - if (ret < 0) - goto err_set_button_gpio; - - hi->irq = gpio_to_irq(SAPPHIRE_GPIO_CABLE_IN1); - if (hi->irq < 0) { - ret = hi->irq; - goto err_get_h2w_detect_irq_num_failed; - } - - hi->irq_btn = gpio_to_irq(SAPPHIRE_GPIO_CABLE_IN2); - if (hi->irq_btn < 0) { - ret = hi->irq_btn; - goto err_get_button_irq_num_failed; - } - - /* Set CPLD MUX to H2W <-> CPLD GPIO */ - configure_cpld(UART3); - /* Set the CPLD connected H2W GPIO's to input */ - gpio_set_value(SAPPHIRE_GPIO_H2W_CLK_DIR, 0); - gpio_set_value(SAPPHIRE_GPIO_H2W_DAT_DIR, 0); - - hrtimer_init(&hi->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - hi->timer.function = detect_event_timer_func; - hrtimer_init(&hi->btn_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - hi->btn_timer.function = button_event_timer_func; - - ret = request_irq(hi->irq, detect_irq_handler, - IRQF_TRIGGER_LOW, "h2w_detect", NULL); - if (ret < 0) - goto err_request_detect_irq; - - /* Disable button until plugged in */ - set_irq_flags(hi->irq_btn, IRQF_VALID | IRQF_NOAUTOEN); - ret = request_irq(hi->irq_btn, button_irq_handler, - IRQF_TRIGGER_LOW, "h2w_button", NULL); - if (ret < 0) - goto err_request_h2w_headset_button_irq; - - ret = set_irq_wake(hi->irq, 1); - if (ret < 0) - goto err_request_input_dev; - ret = set_irq_wake(hi->irq_btn, 1); - if (ret < 0) - goto err_request_input_dev; - - hi->input = input_allocate_device(); - if (!hi->input) { - ret = -ENOMEM; - goto err_request_input_dev; - } - - hi->input->name = "h2w headset"; - hi->input->evbit[0] = BIT_MASK(EV_KEY); - hi->input->keybit[BIT_WORD(KEY_MEDIA)] = BIT_MASK(KEY_MEDIA); - - ret = input_register_device(hi->input); - if (ret < 0) - goto err_register_input_dev; - - return 0; - -err_register_input_dev: - input_free_device(hi->input); -err_request_input_dev: - free_irq(hi->irq_btn, 0); -err_request_h2w_headset_button_irq: - free_irq(hi->irq, 0); -err_request_detect_irq: -err_get_button_irq_num_failed: -err_get_h2w_detect_irq_num_failed: -err_set_button_gpio: -err_set_detect_gpio: - gpio_free(SAPPHIRE_GPIO_CABLE_IN2); -err_request_button_gpio: - gpio_free(SAPPHIRE_GPIO_CABLE_IN1); -err_request_detect_gpio: - destroy_workqueue(g_detection_work_queue); -err_create_work_queue: - switch_dev_unregister(&hi->sdev); -err_switch_dev_register: - printk(KERN_ERR "H2W: Failed to register driver\n"); - - return ret; -} - -static int sapphire_h2w_remove(struct platform_device *pdev) -{ - H2W_DBG(""); - if (switch_get_state(&hi->sdev)) - remove_headset(); - input_unregister_device(hi->input); - gpio_free(SAPPHIRE_GPIO_CABLE_IN2); - gpio_free(SAPPHIRE_GPIO_CABLE_IN1); - free_irq(hi->irq_btn, 0); - free_irq(hi->irq, 0); - destroy_workqueue(g_detection_work_queue); - switch_dev_unregister(&hi->sdev); - - return 0; -} - -static struct platform_device sapphire_h2w_device = { - .name = "sapphire-h2w", -}; - -static struct platform_driver sapphire_h2w_driver = { - .probe = sapphire_h2w_probe, - .remove = sapphire_h2w_remove, - .driver = { - .name = "sapphire-h2w", - .owner = THIS_MODULE, - }, -}; - -static int __init sapphire_h2w_init(void) -{ - if (!machine_is_sapphire()) - return 0; - int ret; - H2W_DBG(""); - ret = platform_driver_register(&sapphire_h2w_driver); - if (ret) - return ret; - return platform_device_register(&sapphire_h2w_device); -} - -static void __exit sapphire_h2w_exit(void) -{ - platform_device_unregister(&sapphire_h2w_device); - platform_driver_unregister(&sapphire_h2w_driver); -} - -module_init(sapphire_h2w_init); -module_exit(sapphire_h2w_exit); - -MODULE_AUTHOR("Laurence Chen "); -MODULE_DESCRIPTION("HTC 2 Wire detection driver for sapphire"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-sapphire-keypad.c b/arch/arm/mach-msm/board-sapphire-keypad.c deleted file mode 100644 index 5c8fc37649a3..000000000000 --- a/arch/arm/mach-msm/board-sapphire-keypad.c +++ /dev/null @@ -1,132 +0,0 @@ -/* arch/arm/mach-msm/board-sapphire-keypad.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#include -#include -#include -#include -#include -#include "gpio_chip.h" -#include "board-sapphire.h" -static char *keycaps = "--qwerty"; -#undef MODULE_PARAM_PREFIX -#define MODULE_PARAM_PREFIX "board_sapphire." -module_param_named(keycaps, keycaps, charp, 0); - - -static unsigned int sapphire_col_gpios[] = { 35, 34 }; - -/* KP_MKIN2 (GPIO40) is not used? */ -static unsigned int sapphire_row_gpios[] = { 42, 41 }; - -#define KEYMAP_INDEX(col, row) ((col)*ARRAY_SIZE(sapphire_row_gpios) + (row)) - -/*scan matrix key*/ -/* HOME(up) MENU (up) Back Search */ -static const unsigned short sapphire_keymap2[ARRAY_SIZE(sapphire_col_gpios) * ARRAY_SIZE(sapphire_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_COMPOSE, - [KEYMAP_INDEX(0, 1)] = KEY_BACK, - - [KEYMAP_INDEX(1, 0)] = KEY_MENU, - [KEYMAP_INDEX(1, 1)] = KEY_SEND, -}; - -/* HOME(up) + MENU (down)*/ -static const unsigned short sapphire_keymap1[ARRAY_SIZE(sapphire_col_gpios) * - ARRAY_SIZE(sapphire_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_BACK, - [KEYMAP_INDEX(0, 1)] = KEY_MENU, - - [KEYMAP_INDEX(1, 0)] = KEY_HOME, - [KEYMAP_INDEX(1, 1)] = KEY_SEND, -}; - -/* MENU(up) + HOME (down)*/ -static const unsigned short sapphire_keymap0[ARRAY_SIZE(sapphire_col_gpios) * - ARRAY_SIZE(sapphire_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_BACK, - [KEYMAP_INDEX(0, 1)] = KEY_HOME, - - [KEYMAP_INDEX(1, 0)] = KEY_MENU, - [KEYMAP_INDEX(1, 1)] = KEY_SEND, -}; - -static struct gpio_event_matrix_info sapphire_keypad_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = sapphire_keymap2, - .output_gpios = sapphire_col_gpios, - .input_gpios = sapphire_row_gpios, - .noutputs = ARRAY_SIZE(sapphire_col_gpios), - .ninputs = ARRAY_SIZE(sapphire_row_gpios), - .settle_time.tv.nsec = 40 * NSEC_PER_USEC, - .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, - .debounce_delay.tv.nsec = 50 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | - GPIOKPF_REMOVE_PHANTOM_KEYS | - GPIOKPF_PRINT_UNMAPPED_KEYS /*| GPIOKPF_PRINT_MAPPED_KEYS*/ -}; - -static struct gpio_event_direct_entry sapphire_keypad_nav_map[] = { - { SAPPHIRE_POWER_KEY, KEY_END }, - { SAPPHIRE_VOLUME_UP, KEY_VOLUMEUP }, - { SAPPHIRE_VOLUME_DOWN, KEY_VOLUMEDOWN }, -}; - -static struct gpio_event_input_info sapphire_keypad_nav_info = { - .info.func = gpio_event_input_func, - .flags = 0, - .type = EV_KEY, - .keymap = sapphire_keypad_nav_map, - .debounce_time.tv.nsec = 20 * NSEC_PER_MSEC, - .keymap_size = ARRAY_SIZE(sapphire_keypad_nav_map) -}; - -static struct gpio_event_info *sapphire_keypad_info[] = { - &sapphire_keypad_matrix_info.info, - &sapphire_keypad_nav_info.info, -}; - -static struct gpio_event_platform_data sapphire_keypad_data = { - .name = "sapphire-keypad", - .info = sapphire_keypad_info, - .info_count = ARRAY_SIZE(sapphire_keypad_info) -}; - -static struct platform_device sapphire_keypad_device = { - .name = GPIO_EVENT_DEV_NAME, - .id = 0, - .dev = { - .platform_data = &sapphire_keypad_data, - }, -}; - -static int __init sapphire_init_keypad(void) -{ - if (!machine_is_sapphire()) - return 0; - - switch (sapphire_get_hwid()) { - case 0: - sapphire_keypad_matrix_info.keymap = sapphire_keymap0; - break; - default: - if(system_rev != 0x80) - sapphire_keypad_matrix_info.keymap = sapphire_keymap1; - break; - } - return platform_device_register(&sapphire_keypad_device); -} - -device_initcall(sapphire_init_keypad); - diff --git a/arch/arm/mach-msm/board-sapphire-mmc.c b/arch/arm/mach-msm/board-sapphire-mmc.c deleted file mode 100644 index 8cb913fade13..000000000000 --- a/arch/arm/mach-msm/board-sapphire-mmc.c +++ /dev/null @@ -1,486 +0,0 @@ -/* linux/arch/arm/mach-msm/board-sapphire-mmc.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include "devices.h" -#include "gpio_chip.h" -#include "board-sapphire.h" - -#define DEBUG_SDSLOT_VDD 0 - -extern int msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat, - unsigned int stat_irq, unsigned long stat_irq_flags); - -/* ---- COMMON ---- */ -static void config_gpio_table(uint32_t *table, int len) -{ - int n; - unsigned id; - for (n = 0; n < len; n++) { - id = table[n]; - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - -/* ---- SDCARD ---- */ - -static uint32_t sdcard_on_gpio_table[] = { - PCOM_GPIO_CFG(62, 2, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), /* CLK */ - PCOM_GPIO_CFG(63, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* CMD */ - PCOM_GPIO_CFG(64, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT0 */ -}; - -static uint32_t sdcard_off_gpio_table[] = { - PCOM_GPIO_CFG(62, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CLK */ - PCOM_GPIO_CFG(63, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CMD */ - PCOM_GPIO_CFG(64, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT0 */ -}; - -static uint opt_disable_sdcard; - -static int __init sapphire_disablesdcard_setup(char *str) -{ - int cal = simple_strtol(str, NULL, 0); - - opt_disable_sdcard = cal; - return 1; -} - -__setup("board_sapphire.disable_sdcard=", sapphire_disablesdcard_setup); - -static struct vreg *vreg_sdslot; /* SD slot power */ - -struct mmc_vdd_xlat { - int mask; - int level; -}; - -static struct mmc_vdd_xlat mmc_vdd_table[] = { - { MMC_VDD_165_195, 1800 }, - { MMC_VDD_20_21, 2050 }, - { MMC_VDD_21_22, 2150 }, - { MMC_VDD_22_23, 2250 }, - { MMC_VDD_23_24, 2350 }, - { MMC_VDD_24_25, 2450 }, - { MMC_VDD_25_26, 2550 }, - { MMC_VDD_26_27, 2650 }, - { MMC_VDD_27_28, 2750 }, - { MMC_VDD_28_29, 2850 }, - { MMC_VDD_29_30, 2950 }, -}; - -static unsigned int sdslot_vdd = 0xffffffff; -static unsigned int sdslot_vreg_enabled; - -static uint32_t sapphire_sdslot_switchvdd(struct device *dev, unsigned int vdd) -{ - int i, rc; - - BUG_ON(!vreg_sdslot); - - if (vdd == sdslot_vdd) - return 0; - - sdslot_vdd = vdd; - - if (vdd == 0) { -#if DEBUG_SDSLOT_VDD - printk(KERN_DEBUG "%s: Disabling SD slot power\n", __func__); -#endif - config_gpio_table(sdcard_off_gpio_table, - ARRAY_SIZE(sdcard_off_gpio_table)); - vreg_disable(vreg_sdslot); - sdslot_vreg_enabled = 0; - return 0; - } - - if (!sdslot_vreg_enabled) { - rc = vreg_enable(vreg_sdslot); - if (rc) { - printk(KERN_ERR "%s: Error enabling vreg (%d)\n", - __func__, rc); - } - config_gpio_table(sdcard_on_gpio_table, - ARRAY_SIZE(sdcard_on_gpio_table)); - sdslot_vreg_enabled = 1; - } - - for (i = 0; i < ARRAY_SIZE(mmc_vdd_table); i++) { - if (mmc_vdd_table[i].mask == (1 << vdd)) { -#if DEBUG_SDSLOT_VDD - printk(KERN_DEBUG "%s: Setting level to %u\n", - __func__, mmc_vdd_table[i].level); -#endif - rc = vreg_set_level(vreg_sdslot, - mmc_vdd_table[i].level); - if (rc) { - printk(KERN_ERR - "%s: Error setting vreg level (%d)\n", - __func__, rc); - } - return 0; - } - } - - printk(KERN_ERR "%s: Invalid VDD %d specified\n", __func__, vdd); - return 0; -} - -static unsigned int sapphire_sdslot_status(struct device *dev) -{ - unsigned int status; - - status = (unsigned int) gpio_get_value(SAPPHIRE_GPIO_SDMC_CD_N); - return !status; -} - -#define SAPPHIRE_MMC_VDD (MMC_VDD_165_195 | MMC_VDD_20_21 | MMC_VDD_21_22 \ - | MMC_VDD_22_23 | MMC_VDD_23_24 | MMC_VDD_24_25 \ - | MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 \ - | MMC_VDD_28_29 | MMC_VDD_29_30) - -static struct mmc_platform_data sapphire_sdslot_data = { - .ocr_mask = SAPPHIRE_MMC_VDD, - .status = sapphire_sdslot_status, - .translate_vdd = sapphire_sdslot_switchvdd, -}; - -/* ---- WIFI ---- */ - -static uint32_t wifi_on_gpio_table[] = { - PCOM_GPIO_CFG(51, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(52, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(53, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(54, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT0 */ - PCOM_GPIO_CFG(55, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* CMD */ - PCOM_GPIO_CFG(56, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), /* CLK */ - PCOM_GPIO_CFG(29, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_4MA), /* WLAN IRQ */ -}; - -static uint32_t wifi_off_gpio_table[] = { - PCOM_GPIO_CFG(51, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(52, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(53, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(54, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT0 */ - PCOM_GPIO_CFG(55, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CMD */ - PCOM_GPIO_CFG(56, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CLK */ - PCOM_GPIO_CFG(29, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* WLAN IRQ */ -}; - -static struct vreg *vreg_wifi_osc; /* WIFI 32khz oscilator */ -static int sapphire_wifi_cd = 0; /* WIFI virtual 'card detect' status */ - -static struct sdio_embedded_func wifi_func = { - .f_class = SDIO_CLASS_WLAN, - .f_maxblksize = 512, -}; - -static struct embedded_sdio_data sapphire_wifi_emb_data = { - .cis = { - .vendor = 0x104c, - .device = 0x9066, - .blksize = 512, - .max_dtr = 20000000, - }, - .cccr = { - .multi_block = 0, - .low_speed = 0, - .wide_bus = 1, - .high_power = 0, - .high_speed = 0, - }, - .funcs = &wifi_func, - .num_funcs = 1, -}; - -static void (*wifi_status_cb)(int card_present, void *dev_id); -static void *wifi_status_cb_devid; - -static int sapphire_wifi_status_register(void (*callback)(int card_present, - void *dev_id), - void *dev_id) -{ - if (wifi_status_cb) - return -EAGAIN; - wifi_status_cb = callback; - wifi_status_cb_devid = dev_id; - return 0; -} - -static unsigned int sapphire_wifi_status(struct device *dev) -{ - return sapphire_wifi_cd; -} - -int sapphire_wifi_set_carddetect(int val) -{ - printk(KERN_DEBUG "%s: %d\n", __func__, val); - sapphire_wifi_cd = val; - if (wifi_status_cb) - wifi_status_cb(val, wifi_status_cb_devid); - else - printk(KERN_WARNING "%s: Nobody to notify\n", __func__); - return 0; -} -#ifndef CONFIG_WIFI_CONTROL_FUNC -EXPORT_SYMBOL(sapphire_wifi_set_carddetect); -#endif - -int sapphire_wifi_power_state=0; -int sapphire_bt_power_state=0; - -int sapphire_wifi_power(int on) -{ - int rc; - - printk(KERN_DEBUG "%s: %d\n", __func__, on); - - if (on) { - config_gpio_table(wifi_on_gpio_table, - ARRAY_SIZE(wifi_on_gpio_table)); - rc = vreg_enable(vreg_wifi_osc); - if (rc) - return rc; - htc_pwrsink_set(PWRSINK_WIFI, 70); - } else { - config_gpio_table(wifi_off_gpio_table, - ARRAY_SIZE(wifi_off_gpio_table)); - htc_pwrsink_set(PWRSINK_WIFI, 0); - } - gpio_set_value(SAPPHIRE_GPIO_MAC_32K_EN, on); - mdelay(100); - gpio_set_value(SAPPHIRE_GPIO_WIFI_EN, on); - mdelay(100); - if (!on) { - if(!sapphire_bt_power_state) - { - vreg_disable(vreg_wifi_osc); - printk("WiFi disable vreg_wifi_osc.\n"); - } - else - printk("WiFi shouldn't disable vreg_wifi_osc. BT is using it!!\n"); - } - sapphire_wifi_power_state = on; - return 0; -} -#ifndef CONFIG_WIFI_CONTROL_FUNC -EXPORT_SYMBOL(sapphire_wifi_power); -#endif - -/* Eenable VREG_MMC pin to turn on fastclock oscillator : colin */ -int sapphire_bt_fastclock_power(int on) -{ - int rc; - - printk(KERN_DEBUG "sapphire_bt_fastclock_power on = %d\n", on); - if (vreg_wifi_osc) { - if (on) { - rc = vreg_enable(vreg_wifi_osc); - printk(KERN_DEBUG "BT vreg_enable vreg_mmc, rc=%d\n", - rc); - if (rc) { - printk("Error turn sapphire_bt_fastclock_power rc=%d\n", rc); - return rc; - } - } else { - if (!sapphire_wifi_power_state) { - vreg_disable(vreg_wifi_osc); - printk(KERN_DEBUG "BT disable vreg_wifi_osc.\n"); - } else - printk(KERN_DEBUG "BT shouldn't disable vreg_wifi_osc. WiFi is using it!!\n"); - } - } - sapphire_bt_power_state = on; - return 0; -} -EXPORT_SYMBOL(sapphire_bt_fastclock_power); - -static int sapphire_wifi_reset_state; -void sapphire_wifi_reset(int on) -{ - printk(KERN_DEBUG "%s: %d\n", __func__, on); - gpio_set_value(SAPPHIRE_GPIO_WIFI_PA_RESETX, !on); - sapphire_wifi_reset_state = on; - mdelay(50); -} -#ifndef CONFIG_WIFI_CONTROL_FUNC -EXPORT_SYMBOL(sapphire_wifi_reset); -#endif - -static struct mmc_platform_data sapphire_wifi_data = { - .ocr_mask = MMC_VDD_28_29, - .status = sapphire_wifi_status, - .register_status_notify = sapphire_wifi_status_register, - .embedded_sdio = &sapphire_wifi_emb_data, -}; - -int __init sapphire_init_mmc(unsigned int sys_rev) -{ - wifi_status_cb = NULL; - - sdslot_vreg_enabled = 0; - - vreg_sdslot = vreg_get(0, "gp6"); - if (IS_ERR(vreg_sdslot)) - return PTR_ERR(vreg_sdslot); - vreg_wifi_osc = vreg_get(0, "mmc"); - if (IS_ERR(vreg_wifi_osc)) - return PTR_ERR(vreg_wifi_osc); - - set_irq_wake(SAPPHIRE_GPIO_TO_INT(SAPPHIRE_GPIO_SDMC_CD_N), 1); - - msm_add_sdcc(1, &sapphire_wifi_data, 0, 0); - - if (!opt_disable_sdcard) - msm_add_sdcc(2, &sapphire_sdslot_data, - SAPPHIRE_GPIO_TO_INT(SAPPHIRE_GPIO_SDMC_CD_N), 0); - else - printk(KERN_INFO "sapphire: SD-Card interface disabled\n"); - return 0; -} - -#if defined(CONFIG_DEBUG_FS) -static int sapphiremmc_dbg_wifi_reset_set(void *data, u64 val) -{ - sapphire_wifi_reset((int) val); - return 0; -} - -static int sapphiremmc_dbg_wifi_reset_get(void *data, u64 *val) -{ - *val = sapphire_wifi_reset_state; - return 0; -} - -static int sapphiremmc_dbg_wifi_cd_set(void *data, u64 val) -{ - sapphire_wifi_set_carddetect((int) val); - return 0; -} - -static int sapphiremmc_dbg_wifi_cd_get(void *data, u64 *val) -{ - *val = sapphire_wifi_cd; - return 0; -} - -static int sapphiremmc_dbg_wifi_pwr_set(void *data, u64 val) -{ - sapphire_wifi_power((int) val); - return 0; -} - -static int sapphiremmc_dbg_wifi_pwr_get(void *data, u64 *val) -{ - - *val = sapphire_wifi_power_state; - return 0; -} - -static int sapphiremmc_dbg_sd_pwr_set(void *data, u64 val) -{ - sapphire_sdslot_switchvdd(NULL, (unsigned int) val); - return 0; -} - -static int sapphiremmc_dbg_sd_pwr_get(void *data, u64 *val) -{ - *val = sdslot_vdd; - return 0; -} - -static int sapphiremmc_dbg_sd_cd_set(void *data, u64 val) -{ - return -ENOSYS; -} - -static int sapphiremmc_dbg_sd_cd_get(void *data, u64 *val) -{ - *val = sapphire_sdslot_status(NULL); - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(sapphiremmc_dbg_wifi_reset_fops, - sapphiremmc_dbg_wifi_reset_get, - sapphiremmc_dbg_wifi_reset_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(sapphiremmc_dbg_wifi_cd_fops, - sapphiremmc_dbg_wifi_cd_get, - sapphiremmc_dbg_wifi_cd_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(sapphiremmc_dbg_wifi_pwr_fops, - sapphiremmc_dbg_wifi_pwr_get, - sapphiremmc_dbg_wifi_pwr_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(sapphiremmc_dbg_sd_pwr_fops, - sapphiremmc_dbg_sd_pwr_get, - sapphiremmc_dbg_sd_pwr_set, "%llu\n"); - -DEFINE_SIMPLE_ATTRIBUTE(sapphiremmc_dbg_sd_cd_fops, - sapphiremmc_dbg_sd_cd_get, - sapphiremmc_dbg_sd_cd_set, "%llu\n"); - -static int __init sapphiremmc_dbg_init(void) -{ - struct dentry *dent; - - if (!machine_is_sapphire()) - return 0; - - dent = debugfs_create_dir("sapphiremmc_dbg", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("wifi_reset", 0644, dent, NULL, - &sapphiremmc_dbg_wifi_reset_fops); - debugfs_create_file("wifi_cd", 0644, dent, NULL, - &sapphiremmc_dbg_wifi_cd_fops); - debugfs_create_file("wifi_pwr", 0644, dent, NULL, - &sapphiremmc_dbg_wifi_pwr_fops); - - debugfs_create_file("sd_pwr", 0644, dent, NULL, - &sapphiremmc_dbg_sd_pwr_fops); - debugfs_create_file("sd_cd", 0644, dent, NULL, - &sapphiremmc_dbg_sd_cd_fops); - - return 0; -} - -device_initcall(sapphiremmc_dbg_init); - -#endif diff --git a/arch/arm/mach-msm/board-sapphire-panel.c b/arch/arm/mach-msm/board-sapphire-panel.c deleted file mode 100644 index 1a5f63acec53..000000000000 --- a/arch/arm/mach-msm/board-sapphire-panel.c +++ /dev/null @@ -1,1272 +0,0 @@ -/* linux/arch/arm/mach-msm/board-sapphire-panel.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "gpio_chip.h" -#include "board-sapphire.h" -#include "devices.h" - -#define DEBUG_SAPPHIRE_PANEL 0 -#define userid 0xD10 - -#define VSYNC_GPIO 97 - -enum sapphire_panel_type { - SAPPHIRE_PANEL_SHARP = 0, - SAPPHIRE_PANEL_TOPPOLY, - NUM_OF_SAPPHIRE_PANELS, -}; -static int g_panel_id = -1 ; -static int g_panel_inited = 0 ; - -#define SAPPHIRE_DEFAULT_BACKLIGHT_BRIGHTNESS 132 -#define GOOGLE_DEFAULT_BACKLIGHT_BRIGHTNESS 102 -#define SDBB SAPPHIRE_DEFAULT_BACKLIGHT_BRIGHTNESS -#define GDBB GOOGLE_DEFAULT_BACKLIGHT_BRIGHTNESS - -static int sapphire_backlight_off; -static int sapphire_backlight_brightness = - SAPPHIRE_DEFAULT_BACKLIGHT_BRIGHTNESS; - -static uint8_t sapphire_backlight_last_level = 33; -static DEFINE_MUTEX(sapphire_backlight_lock); - -/* Divide dimming level into 12 sections, and restrict maximum level to 27 */ -#define DIMMING_STEPS 12 -static unsigned dimming_levels[NUM_OF_SAPPHIRE_PANELS][DIMMING_STEPS] = { - {0, 1, 2, 3, 6, 9, 11, 13, 16, 19, 22, 25}, /* Sharp */ - {0, 1, 2, 4, 7, 10, 13, 15, 18, 21, 24, 27}, /* Toppolly */ -}; -static unsigned pwrsink_percents[] = {0, 6, 8, 15, 26, 34, 46, 54, 65, 77, 87, - 100}; - -static void sapphire_set_backlight_level(uint8_t level) -{ - unsigned dimming_factor = 255/DIMMING_STEPS + 1; - int index, new_level ; - unsigned percent; - unsigned long flags; - int i = 0; - - /* Non-linear transform for the difference between two - * kind of default backlight settings. - */ - new_level = level<=GDBB ? - level*SDBB/GDBB : (SDBB + (level-GDBB)*(255-SDBB) / (255-GDBB)) ; - index = new_level/dimming_factor ; - -#if DEBUG_SAPPHIRE_PANEL - printk(KERN_INFO "level=%d, new level=%d, dimming_levels[%d]=%d\n", - level, new_level, index, dimming_levels[g_panel_id][index]); -#endif - percent = pwrsink_percents[index]; - level = dimming_levels[g_panel_id][index]; - - if (sapphire_backlight_last_level == level) - return; - - if (level == 0) { - gpio_set_value(27, 0); - msleep(2); - } else { - local_irq_save(flags); - if (sapphire_backlight_last_level == 0) { - gpio_set_value(27, 1); - udelay(40); - sapphire_backlight_last_level = 33; - } - i = (sapphire_backlight_last_level - level + 33) % 33; - while (i-- > 0) { - gpio_set_value(27, 0); - udelay(1); - gpio_set_value(27, 1); - udelay(1); - } - local_irq_restore(flags); - } - sapphire_backlight_last_level = level; - htc_pwrsink_set(PWRSINK_BACKLIGHT, percent); -} - -#define MDDI_CLIENT_CORE_BASE 0x108000 -#define LCD_CONTROL_BLOCK_BASE 0x110000 -#define SPI_BLOCK_BASE 0x120000 -#define I2C_BLOCK_BASE 0x130000 -#define PWM_BLOCK_BASE 0x140000 -#define GPIO_BLOCK_BASE 0x150000 -#define SYSTEM_BLOCK1_BASE 0x160000 -#define SYSTEM_BLOCK2_BASE 0x170000 - - -#define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) -#define SYSCLKENA (MDDI_CLIENT_CORE_BASE|0x2C) -#define PWM0OFF (PWM_BLOCK_BASE|0x1C) - -#define V_VDDE2E_VDD2_GPIO 0 -#define V_VDDE2E_VDD2_GPIO_5M 89 -#define MDDI_RST_N 82 - -#define MDDICAP0 (MDDI_CLIENT_CORE_BASE|0x00) -#define MDDICAP1 (MDDI_CLIENT_CORE_BASE|0x04) -#define MDDICAP2 (MDDI_CLIENT_CORE_BASE|0x08) -#define MDDICAP3 (MDDI_CLIENT_CORE_BASE|0x0C) -#define MDCAPCHG (MDDI_CLIENT_CORE_BASE|0x10) -#define MDCRCERC (MDDI_CLIENT_CORE_BASE|0x14) -#define TTBUSSEL (MDDI_CLIENT_CORE_BASE|0x18) -#define DPSET0 (MDDI_CLIENT_CORE_BASE|0x1C) -#define DPSET1 (MDDI_CLIENT_CORE_BASE|0x20) -#define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) -#define DPRUN (MDDI_CLIENT_CORE_BASE|0x28) -#define SYSCKENA (MDDI_CLIENT_CORE_BASE|0x2C) -#define TESTMODE (MDDI_CLIENT_CORE_BASE|0x30) -#define FIFOMONI (MDDI_CLIENT_CORE_BASE|0x34) -#define INTMONI (MDDI_CLIENT_CORE_BASE|0x38) -#define MDIOBIST (MDDI_CLIENT_CORE_BASE|0x3C) -#define MDIOPSET (MDDI_CLIENT_CORE_BASE|0x40) -#define BITMAP0 (MDDI_CLIENT_CORE_BASE|0x44) -#define BITMAP1 (MDDI_CLIENT_CORE_BASE|0x48) -#define BITMAP2 (MDDI_CLIENT_CORE_BASE|0x4C) -#define BITMAP3 (MDDI_CLIENT_CORE_BASE|0x50) -#define BITMAP4 (MDDI_CLIENT_CORE_BASE|0x54) - -#define SRST (LCD_CONTROL_BLOCK_BASE|0x00) -#define PORT_ENB (LCD_CONTROL_BLOCK_BASE|0x04) -#define START (LCD_CONTROL_BLOCK_BASE|0x08) -#define PORT (LCD_CONTROL_BLOCK_BASE|0x0C) -#define CMN (LCD_CONTROL_BLOCK_BASE|0x10) -#define GAMMA (LCD_CONTROL_BLOCK_BASE|0x14) -#define INTFLG (LCD_CONTROL_BLOCK_BASE|0x18) -#define INTMSK (LCD_CONTROL_BLOCK_BASE|0x1C) -#define MPLFBUF (LCD_CONTROL_BLOCK_BASE|0x20) -#define HDE_LEFT (LCD_CONTROL_BLOCK_BASE|0x24) -#define VDE_TOP (LCD_CONTROL_BLOCK_BASE|0x28) -#define PXL (LCD_CONTROL_BLOCK_BASE|0x30) -#define HCYCLE (LCD_CONTROL_BLOCK_BASE|0x34) -#define HSW (LCD_CONTROL_BLOCK_BASE|0x38) -#define HDE_START (LCD_CONTROL_BLOCK_BASE|0x3C) -#define HDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x40) -#define VCYCLE (LCD_CONTROL_BLOCK_BASE|0x44) -#define VSW (LCD_CONTROL_BLOCK_BASE|0x48) -#define VDE_START (LCD_CONTROL_BLOCK_BASE|0x4C) -#define VDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x50) -#define WAKEUP (LCD_CONTROL_BLOCK_BASE|0x54) -#define WSYN_DLY (LCD_CONTROL_BLOCK_BASE|0x58) -#define REGENB (LCD_CONTROL_BLOCK_BASE|0x5C) -#define VSYNIF (LCD_CONTROL_BLOCK_BASE|0x60) -#define WRSTB (LCD_CONTROL_BLOCK_BASE|0x64) -#define RDSTB (LCD_CONTROL_BLOCK_BASE|0x68) -#define ASY_DATA (LCD_CONTROL_BLOCK_BASE|0x6C) -#define ASY_DATB (LCD_CONTROL_BLOCK_BASE|0x70) -#define ASY_DATC (LCD_CONTROL_BLOCK_BASE|0x74) -#define ASY_DATD (LCD_CONTROL_BLOCK_BASE|0x78) -#define ASY_DATE (LCD_CONTROL_BLOCK_BASE|0x7C) -#define ASY_DATF (LCD_CONTROL_BLOCK_BASE|0x80) -#define ASY_DATG (LCD_CONTROL_BLOCK_BASE|0x84) -#define ASY_DATH (LCD_CONTROL_BLOCK_BASE|0x88) -#define ASY_CMDSET (LCD_CONTROL_BLOCK_BASE|0x8C) - -#define SSICTL (SPI_BLOCK_BASE|0x00) -#define SSITIME (SPI_BLOCK_BASE|0x04) -#define SSITX (SPI_BLOCK_BASE|0x08) -#define SSIRX (SPI_BLOCK_BASE|0x0C) -#define SSIINTC (SPI_BLOCK_BASE|0x10) -#define SSIINTS (SPI_BLOCK_BASE|0x14) -#define SSIDBG1 (SPI_BLOCK_BASE|0x18) -#define SSIDBG2 (SPI_BLOCK_BASE|0x1C) -#define SSIID (SPI_BLOCK_BASE|0x20) - -#define WKREQ (SYSTEM_BLOCK1_BASE|0x00) -#define CLKENB (SYSTEM_BLOCK1_BASE|0x04) -#define DRAMPWR (SYSTEM_BLOCK1_BASE|0x08) -#define INTMASK (SYSTEM_BLOCK1_BASE|0x0C) -#define GPIOSEL (SYSTEM_BLOCK2_BASE|0x00) - -#define GPIODATA (GPIO_BLOCK_BASE|0x00) -#define GPIODIR (GPIO_BLOCK_BASE|0x04) -#define GPIOIS (GPIO_BLOCK_BASE|0x08) -#define GPIOIBE (GPIO_BLOCK_BASE|0x0C) -#define GPIOIEV (GPIO_BLOCK_BASE|0x10) -#define GPIOIE (GPIO_BLOCK_BASE|0x14) -#define GPIORIS (GPIO_BLOCK_BASE|0x18) -#define GPIOMIS (GPIO_BLOCK_BASE|0x1C) -#define GPIOIC (GPIO_BLOCK_BASE|0x20) -#define GPIOOMS (GPIO_BLOCK_BASE|0x24) -#define GPIOPC (GPIO_BLOCK_BASE|0x28) -#define GPIOID (GPIO_BLOCK_BASE|0x30) - -#define SPI_WRITE(reg, val) \ - { SSITX, 0x00010000 | (((reg) & 0xff) << 8) | ((val) & 0xff) }, \ - { 0, 5 }, - -#define SPI_WRITE1(reg) \ - { SSITX, (reg) & 0xff }, \ - { 0, 5 }, - -struct mddi_table { - uint32_t reg; - uint32_t value; -}; -static struct mddi_table mddi_toshiba_init_table[] = { - { DPSET0, 0x09e90046 }, - { DPSET1, 0x00000118 }, - { DPSUS, 0x00000000 }, - { DPRUN, 0x00000001 }, - { 1, 14 }, /* msleep 14 */ - { SYSCKENA, 0x00000001 }, - /*{ CLKENB, 0x000000EF } */ - { CLKENB, 0x0000A1EF }, /* # SYS.CLKENB # Enable clocks for each module (without DCLK , i2cCLK) */ - /*{ CLKENB, 0x000025CB }, Clock enable register */ - - { GPIODATA, 0x02000200 }, /* # GPI .GPIODATA # GPIO2(RESET_LCD_N) set to 0 , GPIO3(eDRAM_Power) set to 0 */ - { GPIODIR, 0x000030D }, /* 24D # GPI .GPIODIR # Select direction of GPIO port (0,2,3,6,9 output) */ - { GPIOSEL, 0/*0x00000173*/}, /* # SYS.GPIOSEL # GPIO port multiplexing control */ - { GPIOPC, 0x03C300C0 }, /* # GPI .GPIOPC # GPIO2,3 PD cut */ - { WKREQ, 0x00000000 }, /* # SYS.WKREQ # Wake-up request event is VSYNC alignment */ - - { GPIOIBE, 0x000003FF }, - { GPIOIS, 0x00000000 }, - { GPIOIC, 0x000003FF }, - { GPIOIE, 0x00000000 }, - - { GPIODATA, 0x00040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ - { 1, 1 }, /* msleep 1 */ - { GPIODATA, 0x02040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ - { DRAMPWR, 0x00000001 }, /* eDRAM power */ -}; - -static struct mddi_table mddi_toshiba_panel_init_table[] = { - { SRST, 0x00000003 }, /* FIFO/LCDC not reset */ - { PORT_ENB, 0x00000001 }, /* Enable sync. Port */ - { START, 0x00000000 }, /* To stop operation */ - /*{ START, 0x00000001 }, To start operation */ - { PORT, 0x00000004 }, /* Polarity of VS/HS/DE. */ - { CMN, 0x00000000 }, - { GAMMA, 0x00000000 }, /* No Gamma correction */ - { INTFLG, 0x00000000 }, /* VSYNC interrupt flag clear/status */ - { INTMSK, 0x00000000 }, /* VSYNC interrupt mask is off. */ - { MPLFBUF, 0x00000000 }, /* Select frame buffer's base address. */ - { HDE_LEFT, 0x00000000 }, /* The value of HDE_LEFT. */ - { VDE_TOP, 0x00000000 }, /* The value of VDE_TPO. */ - { PXL, 0x00000001 }, /* 1. RGB666 */ - /* 2. Data is valid from 1st frame of beginning. */ - { HDE_START, 0x00000006 }, /* HDE_START= 14 PCLK */ - { HDE_SIZE, 0x0000009F }, /* HDE_SIZE=320 PCLK */ - { HSW, 0x00000004 }, /* HSW= 10 PCLK */ - { VSW, 0x00000001 }, /* VSW=2 HCYCLE */ - { VDE_START, 0x00000003 }, /* VDE_START=4 HCYCLE */ - { VDE_SIZE, 0x000001DF }, /* VDE_SIZE=480 HCYCLE */ - { WAKEUP, 0x000001e2 }, /* Wakeup position in VSYNC mode. */ - { WSYN_DLY, 0x00000000 }, /* Wakeup position in VSIN mode. */ - { REGENB, 0x00000001 }, /* Set 1 to enable to change the value of registers. */ - { CLKENB, 0x000025CB }, /* Clock enable register */ - - { SSICTL, 0x00000170 }, /* SSI control register */ - { SSITIME, 0x00000250 }, /* SSI timing control register */ - { SSICTL, 0x00000172 }, /* SSI control register */ -}; - - -static struct mddi_table mddi_sharp_init_table[] = { - { VCYCLE, 0x000001eb }, - { HCYCLE, 0x000000ae }, - { REGENB, 0x00000001 }, /* Set 1 to enable to change the value of registers. */ - { GPIODATA, 0x00040000 }, /* GPIO2 low */ - { GPIODIR, 0x00000004 }, /* GPIO2 out */ - { 1, 1 }, /* msleep 1 */ - { GPIODATA, 0x00040004 }, /* GPIO2 high */ - { 1, 10 }, /* msleep 10 */ - SPI_WRITE(0x5f, 0x01) - SPI_WRITE1(0x11) - { 1, 200 }, /* msleep 200 */ - SPI_WRITE1(0x29) - SPI_WRITE1(0xde) - { START, 0x00000001 }, /* To start operation */ -}; - -static struct mddi_table mddi_sharp_deinit_table[] = { - { 1, 200 }, /* msleep 200 */ - SPI_WRITE(0x10, 0x1) - { 1, 100 }, /* msleep 100 */ - { GPIODATA, 0x00040004 }, /* GPIO2 high */ - { GPIODIR, 0x00000004 }, /* GPIO2 out */ - { GPIODATA, 0x00040000 }, /* GPIO2 low */ - { 1, 10 }, /* msleep 10 */ -}; - -static struct mddi_table mddi_tpo_init_table[] = { - { VCYCLE, 0x000001e5 }, - { HCYCLE, 0x000000ac }, - { REGENB, 0x00000001 }, /* Set 1 to enable to change the value of registers. */ - { 0, 20 }, /* udelay 20 */ - { GPIODATA, 0x00000004 }, /* GPIO2 high */ - { GPIODIR, 0x00000004 }, /* GPIO2 out */ - { 0, 20 }, /* udelay 20 */ - - SPI_WRITE(0x08, 0x01) - { 0, 500 }, /* udelay 500 */ - SPI_WRITE(0x08, 0x00) - SPI_WRITE(0x02, 0x00) - SPI_WRITE(0x03, 0x04) - SPI_WRITE(0x04, 0x0e) - SPI_WRITE(0x09, 0x02) - SPI_WRITE(0x0b, 0x08) - SPI_WRITE(0x0c, 0x53) - SPI_WRITE(0x0d, 0x01) - SPI_WRITE(0x0e, 0xe0) - SPI_WRITE(0x0f, 0x01) - SPI_WRITE(0x10, 0x58) - SPI_WRITE(0x20, 0x1e) - SPI_WRITE(0x21, 0x0a) - SPI_WRITE(0x22, 0x0a) - SPI_WRITE(0x23, 0x1e) - SPI_WRITE(0x25, 0x32) - SPI_WRITE(0x26, 0x00) - SPI_WRITE(0x27, 0xac) - SPI_WRITE(0x29, 0x06) - SPI_WRITE(0x2a, 0xa4) - SPI_WRITE(0x2b, 0x45) - SPI_WRITE(0x2c, 0x45) - SPI_WRITE(0x2d, 0x15) - SPI_WRITE(0x2e, 0x5a) - SPI_WRITE(0x2f, 0xff) - SPI_WRITE(0x30, 0x6b) - SPI_WRITE(0x31, 0x0d) - SPI_WRITE(0x32, 0x48) - SPI_WRITE(0x33, 0x82) - SPI_WRITE(0x34, 0xbd) - SPI_WRITE(0x35, 0xe7) - SPI_WRITE(0x36, 0x18) - SPI_WRITE(0x37, 0x94) - SPI_WRITE(0x38, 0x01) - SPI_WRITE(0x39, 0x5d) - SPI_WRITE(0x3a, 0xae) - SPI_WRITE(0x3b, 0xff) - SPI_WRITE(0x07, 0x09) - { 0, 10 }, /* udelay 10 */ - { START, 0x00000001 }, /* To start operation */ -}; - -static struct mddi_table mddi_tpo_deinit_table[] = { - SPI_WRITE(0x07, 0x19) - { START, 0x00000000 }, /* To stop operation */ - { GPIODATA, 0x00040004 }, /* GPIO2 high */ - { GPIODIR, 0x00000004 }, /* GPIO2 out */ - { GPIODATA, 0x00040000 }, /* GPIO2 low */ - { 0, 5 }, /* usleep 5 */ -}; - - -#define GPIOSEL_VWAKEINT (1U << 0) -#define INTMASK_VWAKEOUT (1U << 0) - -static void sapphire_process_mddi_table( - struct msm_mddi_client_data *client_data, - const struct mddi_table *table, - size_t count) -{ - int i; - for (i = 0; i < count; i++) { - uint32_t reg = table[i].reg; - uint32_t value = table[i].value; - - if (reg == 0) - udelay(value); - else if (reg == 1) - msleep(value); - else - client_data->remote_write(client_data, value, reg); - } -} - -static struct vreg *vreg_lcm_2v85; - -static void sapphire_mddi_power_client(struct msm_mddi_client_data *client_data, - int on) -{ - unsigned id, on_off; -#if DEBUG_SAPPHIRE_PANEL - printk(KERN_INFO "sapphire_mddi_client_power:%d\r\n", on); -#endif - if (on) { - on_off = 0; - id = PM_VREG_PDOWN_MDDI_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - - gpio_set_value(SAPPHIRE_MDDI_1V5_EN, 1); - mdelay(5); /* delay time >5ms and <10ms */ - - if (is_12pin_camera()) - gpio_set_value(V_VDDE2E_VDD2_GPIO_5M, 1); - else - gpio_set_value(V_VDDE2E_VDD2_GPIO, 1); - - gpio_set_value(SAPPHIRE_GPIO_MDDI_32K_EN, 1); - msleep(3); - id = PM_VREG_PDOWN_AUX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - vreg_enable(vreg_lcm_2v85); - msleep(3); - } else { - gpio_set_value(SAPPHIRE_GPIO_MDDI_32K_EN, 0); - gpio_set_value(MDDI_RST_N, 0); - msleep(10); - vreg_disable(vreg_lcm_2v85); - on_off = 1; - id = PM_VREG_PDOWN_AUX_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - msleep(5); - if (is_12pin_camera()) - gpio_set_value(V_VDDE2E_VDD2_GPIO_5M, 0); - else - gpio_set_value(V_VDDE2E_VDD2_GPIO, 0); - - msleep(200); - gpio_set_value(SAPPHIRE_MDDI_1V5_EN, 0); - id = PM_VREG_PDOWN_MDDI_ID; - msm_proc_comm(PCOM_VREG_PULLDOWN, &on_off, &id); - } -} - -static int sapphire_mddi_toshiba_client_init( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int panel_id; - - /* Set the MDDI_RST_N accroding to MDDI client repectively( - * been set in sapphire_mddi_power_client() originally) - */ - gpio_set_value(MDDI_RST_N, 1); - msleep(10); - - client_data->auto_hibernate(client_data, 0); - sapphire_process_mddi_table(client_data, mddi_toshiba_init_table, - ARRAY_SIZE(mddi_toshiba_init_table)); - client_data->auto_hibernate(client_data, 1); - g_panel_id = panel_id = - (client_data->remote_read(client_data, GPIODATA) >> 4) & 3; - if (panel_id > 1) { -#if DEBUG_SAPPHIRE_PANEL - printk(KERN_ERR "unknown panel id at mddi_enable\n"); -#endif - return -1; - } - return 0; -} - -static int sapphire_mddi_toshiba_client_uninit( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - gpio_set_value(MDDI_RST_N, 0); - msleep(10); - - return 0; -} - -static int sapphire_mddi_panel_unblank( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int panel_id, ret = 0; - - sapphire_set_backlight_level(0); - client_data->auto_hibernate(client_data, 0); - sapphire_process_mddi_table(client_data, mddi_toshiba_panel_init_table, - ARRAY_SIZE(mddi_toshiba_panel_init_table)); - panel_id = (client_data->remote_read(client_data, GPIODATA) >> 4) & 3; - switch (panel_id) { - case 0: -#if DEBUG_SAPPHIRE_PANEL - printk(KERN_DEBUG "init sharp panel\n"); -#endif - sapphire_process_mddi_table(client_data, - mddi_sharp_init_table, - ARRAY_SIZE(mddi_sharp_init_table)); - break; - case 1: -#if DEBUG_SAPPHIRE_PANEL - printk(KERN_DEBUG "init tpo panel\n"); -#endif - sapphire_process_mddi_table(client_data, - mddi_tpo_init_table, - ARRAY_SIZE(mddi_tpo_init_table)); - break; - default: - - printk(KERN_DEBUG "unknown panel_id: %d\n", panel_id); - ret = -1; - }; - mutex_lock(&sapphire_backlight_lock); - sapphire_set_backlight_level(sapphire_backlight_brightness); - sapphire_backlight_off = 0; - mutex_unlock(&sapphire_backlight_lock); - client_data->auto_hibernate(client_data, 1); - /* reenable vsync */ - client_data->remote_write(client_data, GPIOSEL_VWAKEINT, - GPIOSEL); - client_data->remote_write(client_data, INTMASK_VWAKEOUT, - INTMASK); - return ret; - -} - -static int sapphire_mddi_panel_blank( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int panel_id, ret = 0; - - panel_id = (client_data->remote_read(client_data, GPIODATA) >> 4) & 3; - client_data->auto_hibernate(client_data, 0); - switch (panel_id) { - case 0: - printk(KERN_DEBUG "deinit sharp panel\n"); - sapphire_process_mddi_table(client_data, - mddi_sharp_deinit_table, - ARRAY_SIZE(mddi_sharp_deinit_table)); - break; - case 1: - printk(KERN_DEBUG "deinit tpo panel\n"); - sapphire_process_mddi_table(client_data, - mddi_tpo_deinit_table, - ARRAY_SIZE(mddi_tpo_deinit_table)); - break; - default: - printk(KERN_DEBUG "unknown panel_id: %d\n", panel_id); - ret = -1; - }; - client_data->auto_hibernate(client_data, 1); - mutex_lock(&sapphire_backlight_lock); - sapphire_set_backlight_level(0); - sapphire_backlight_off = 1; - mutex_unlock(&sapphire_backlight_lock); - client_data->remote_write(client_data, 0, SYSCLKENA); - client_data->remote_write(client_data, 1, DPSUS); - - return ret; -} - - -/* Initial sequence of sharp panel with Novatek NT35399 MDDI client */ -static const struct mddi_table sharp2_init_table[] = { - { 0x02A0, 0x00 }, - { 0x02A1, 0x00 }, - { 0x02A2, 0x3F }, - { 0x02A3, 0x01 }, - { 0x02B0, 0x00 }, - { 0x02B1, 0x00 }, - { 0x02B2, 0xDF }, - { 0x02B3, 0x01 }, - { 0x02D0, 0x00 }, - { 0x02D1, 0x00 }, - { 0x02D2, 0x00 }, - { 0x02D3, 0x00 }, - { 0x0350, 0x80 }, /* Set frame tearing effect(FTE) position */ - { 0x0351, 0x00 }, - { 0x0360, 0x30 }, - { 0x0361, 0xC1 }, - { 0x0362, 0x00 }, - { 0x0370, 0x00 }, - { 0x0371, 0xEF }, - { 0x0372, 0x01 }, - - { 0x0B00, 0x10 }, - - { 0x0B10, 0x00 }, - { 0x0B20, 0x22 }, - { 0x0B30, 0x46 }, - { 0x0B40, 0x07 }, - { 0x0B41, 0x1C }, - { 0x0B50, 0x0F }, - { 0x0B51, 0x7A }, - { 0x0B60, 0x16 }, - { 0x0B70, 0x0D }, - { 0x0B80, 0x04 }, - { 0x0B90, 0x07 }, - { 0x0BA0, 0x04 }, - { 0x0BA1, 0x86 }, - { 0x0BB0, 0xFF }, - { 0x0BB1, 0x01 }, - { 0x0BB2, 0xF7 }, - { 0x0BB3, 0x01 }, - { 0x0BC0, 0x00 }, - { 0x0BC1, 0x00 }, - { 0x0BC2, 0x00 }, - { 0x0BC3, 0x00 }, - { 0x0BE0, 0x01 }, - { 0x0BE1, 0x3F }, - - { 0x0BF0, 0x03 }, - - { 0x0C10, 0x02 }, - - { 0x0C30, 0x22 }, - { 0x0C31, 0x20 }, - { 0x0C40, 0x48 }, - { 0x0C41, 0x06 }, - - { 0xE00, 0x0028}, - { 0xE01, 0x002F}, - { 0xE02, 0x0032}, - { 0xE03, 0x000A}, - { 0xE04, 0x0023}, - { 0xE05, 0x0024}, - { 0xE06, 0x0022}, - { 0xE07, 0x0012}, - { 0xE08, 0x000D}, - { 0xE09, 0x0035}, - { 0xE0A, 0x000E}, - { 0xE0B, 0x001A}, - { 0xE0C, 0x003C}, - { 0xE0D, 0x003A}, - { 0xE0E, 0x0050}, - { 0xE0F, 0x0069}, - { 0xE10, 0x0006}, - { 0xE11, 0x001F}, - { 0xE12, 0x0035}, - { 0xE13, 0x0020}, - { 0xE14, 0x0043}, - { 0xE15, 0x0030}, - { 0xE16, 0x003C}, - { 0xE17, 0x0010}, - { 0xE18, 0x0009}, - { 0xE19, 0x0051}, - { 0xE1A, 0x001D}, - { 0xE1B, 0x003C}, - { 0xE1C, 0x0053}, - { 0xE1D, 0x0041}, - { 0xE1E, 0x0045}, - { 0xE1F, 0x004B}, - { 0xE20, 0x000A}, - { 0xE21, 0x0014}, - { 0xE22, 0x001C}, - { 0xE23, 0x0013}, - { 0xE24, 0x002E}, - { 0xE25, 0x0029}, - { 0xE26, 0x001B}, - { 0xE27, 0x0014}, - { 0xE28, 0x000E}, - { 0xE29, 0x0032}, - { 0xE2A, 0x000D}, - { 0xE2B, 0x001B}, - { 0xE2C, 0x0033}, - { 0xE2D, 0x0033}, - { 0xE2E, 0x005B}, - { 0xE2F, 0x0069}, - { 0xE30, 0x0006}, - { 0xE31, 0x0014}, - { 0xE32, 0x003D}, - { 0xE33, 0x0029}, - { 0xE34, 0x0042}, - { 0xE35, 0x0032}, - { 0xE36, 0x003F}, - { 0xE37, 0x000E}, - { 0xE38, 0x0008}, - { 0xE39, 0x0059}, - { 0xE3A, 0x0015}, - { 0xE3B, 0x002E}, - { 0xE3C, 0x0049}, - { 0xE3D, 0x0058}, - { 0xE3E, 0x0061}, - { 0xE3F, 0x006B}, - { 0xE40, 0x000A}, - { 0xE41, 0x001A}, - { 0xE42, 0x0022}, - { 0xE43, 0x0014}, - { 0xE44, 0x002F}, - { 0xE45, 0x002A}, - { 0xE46, 0x001A}, - { 0xE47, 0x0014}, - { 0xE48, 0x000E}, - { 0xE49, 0x002F}, - { 0xE4A, 0x000F}, - { 0xE4B, 0x001B}, - { 0xE4C, 0x0030}, - { 0xE4D, 0x002C}, - { 0xE4E, 0x0051}, - { 0xE4F, 0x0069}, - { 0xE50, 0x0006}, - { 0xE51, 0x001E}, - { 0xE52, 0x0043}, - { 0xE53, 0x002F}, - { 0xE54, 0x0043}, - { 0xE55, 0x0032}, - { 0xE56, 0x0043}, - { 0xE57, 0x000D}, - { 0xE58, 0x0008}, - { 0xE59, 0x0059}, - { 0xE5A, 0x0016}, - { 0xE5B, 0x0030}, - { 0xE5C, 0x004B}, - { 0xE5D, 0x0051}, - { 0xE5E, 0x005A}, - { 0xE5F, 0x006B}, - - { 0x0290, 0x01 }, -}; - -#undef TPO2_ONE_GAMMA -/* Initial sequence of TPO panel with Novatek NT35399 MDDI client */ - -static const struct mddi_table tpo2_init_table[] = { - /* Panel interface control */ - { 0xB30, 0x44 }, - { 0xB40, 0x00 }, - { 0xB41, 0x87 }, - { 0xB50, 0x06 }, - { 0xB51, 0x7B }, - { 0xB60, 0x0E }, - { 0xB70, 0x0F }, - { 0xB80, 0x03 }, - { 0xB90, 0x00 }, - { 0x350, 0x70 }, /* FTE is at line 0x70 */ - - /* Entry Mode */ - { 0x360, 0x30 }, - { 0x361, 0xC1 }, - { 0x362, 0x04 }, - -/* 0x2 for gray scale gamma correction, 0x12 for RGB gamma correction */ -#ifdef TPO2_ONE_GAMMA - { 0xB00, 0x02 }, -#else - { 0xB00, 0x12 }, -#endif - /* Driver output control */ - { 0x371, 0xEF }, - { 0x372, 0x03 }, - - /* DCDC on glass control */ - { 0xC31, 0x10 }, - { 0xBA0, 0x00 }, - { 0xBA1, 0x86 }, - - /* VCOMH voltage control */ - { 0xC50, 0x3b }, - - /* Special function control */ - { 0xC10, 0x82 }, - - /* Power control */ - { 0xC40, 0x44 }, - { 0xC41, 0x02 }, - - /* Source output control */ - { 0xBE0, 0x01 }, - { 0xBE1, 0x00 }, - - /* Windows address setting */ - { 0x2A0, 0x00 }, - { 0x2A1, 0x00 }, - { 0x2A2, 0x3F }, - { 0x2A3, 0x01 }, - { 0x2B0, 0x00 }, - { 0x2B1, 0x00 }, - { 0x2B2, 0xDF }, - { 0x2B3, 0x01 }, - - /* RAM address setting */ - { 0x2D0, 0x00 }, - { 0x2D1, 0x00 }, - { 0x2D2, 0x00 }, - { 0x2D3, 0x00 }, - - { 0xF20, 0x55 }, - { 0xF21, 0xAA }, - { 0xF22, 0x66 }, - { 0xF57, 0x45 }, - -/* - * The NT35399 provides gray or RGB gamma correction table, - * which determinated by register-0xb00, and following table - */ -#ifdef TPO2_ONE_GAMMA - /* Positive Gamma setting */ - { 0xE00, 0x04 }, - { 0xE01, 0x12 }, - { 0xE02, 0x18 }, - { 0xE03, 0x10 }, - { 0xE04, 0x29 }, - { 0xE05, 0x26 }, - { 0xE06, 0x1f }, - { 0xE07, 0x11 }, - { 0xE08, 0x0c }, - { 0xE09, 0x3a }, - { 0xE0A, 0x0d }, - { 0xE0B, 0x28 }, - { 0xE0C, 0x40 }, - { 0xE0D, 0x4e }, - { 0xE0E, 0x6f }, - { 0xE0F, 0x5E }, - - /* Negative Gamma setting */ - { 0xE10, 0x0B }, - { 0xE11, 0x00 }, - { 0xE12, 0x00 }, - { 0xE13, 0x1F }, - { 0xE14, 0x4b }, - { 0xE15, 0x33 }, - { 0xE16, 0x13 }, - { 0xE17, 0x12 }, - { 0xE18, 0x0d }, - { 0xE19, 0x2f }, - { 0xE1A, 0x16 }, - { 0xE1B, 0x2e }, - { 0xE1C, 0x49 }, - { 0xE1D, 0x41 }, - { 0xE1E, 0x46 }, - { 0xE1F, 0x55 }, -#else - /* Red Positive Gamma */ - { 0xE00, 0x0f }, - { 0xE01, 0x19 }, - { 0xE02, 0x22 }, - { 0xE03, 0x0b }, - { 0xE04, 0x23 }, - { 0xE05, 0x23 }, - { 0xE06, 0x14 }, - { 0xE07, 0x13 }, - { 0xE08, 0x0f }, - { 0xE09, 0x2a }, - { 0xE0A, 0x0d }, - { 0xE0B, 0x26 }, - { 0xE0C, 0x43 }, - { 0xE0D, 0x20 }, - { 0xE0E, 0x2a }, - { 0xE0F, 0x5c }, - - /* Red Negative Gamma */ - { 0xE10, 0x0d }, - { 0xE11, 0x45 }, - { 0xE12, 0x4c }, - { 0xE13, 0x1c }, - { 0xE14, 0x4d }, - { 0xE15, 0x33 }, - { 0xE16, 0x23 }, - { 0xE17, 0x0f }, - { 0xE18, 0x0b }, - { 0xE19, 0x3a }, - { 0xE1A, 0x19 }, - { 0xE1B, 0x32 }, - { 0xE1C, 0x4e }, - { 0xE1D, 0x37 }, - { 0xE1E, 0x38 }, - { 0xE1F, 0x3b }, - - /* Green Positive Gamma */ - { 0xE20, 0x00 }, - { 0xE21, 0x09 }, - { 0xE22, 0x10 }, - { 0xE23, 0x0f }, - { 0xE24, 0x29 }, - { 0xE25, 0x23 }, - { 0xE26, 0x0b }, - { 0xE27, 0x14 }, - { 0xE28, 0x12 }, - { 0xE29, 0x25 }, - { 0xE2A, 0x12 }, - { 0xE2B, 0x2f }, - { 0xE2C, 0x43 }, - { 0xE2D, 0x2d }, - { 0xE2E, 0x52 }, - { 0xE2F, 0x61 }, - - /* Green Negative Gamma */ - { 0xE30, 0x08 }, - { 0xE31, 0x1d }, - { 0xE32, 0x3f }, - { 0xE33, 0x1c }, - { 0xE34, 0x44 }, - { 0xE35, 0x2e }, - { 0xE36, 0x28 }, - { 0xE37, 0x0c }, - { 0xE38, 0x0a }, - { 0xE39, 0x42 }, - { 0xE3A, 0x17 }, - { 0xE3B, 0x30 }, - { 0xE3C, 0x4b }, - { 0xE3D, 0x3f }, - { 0xE3E, 0x43 }, - { 0xE3F, 0x45 }, - - /* Blue Positive Gamma */ - { 0xE40, 0x32 }, - { 0xE41, 0x32 }, - { 0xE42, 0x31 }, - { 0xE43, 0x06 }, - { 0xE44, 0x08 }, - { 0xE45, 0x0d }, - { 0xE46, 0x04 }, - { 0xE47, 0x14 }, - { 0xE48, 0x0f }, - { 0xE49, 0x1d }, - { 0xE4A, 0x1a }, - { 0xE4B, 0x39 }, - { 0xE4C, 0x4c }, - { 0xE4D, 0x1e }, - { 0xE4E, 0x43 }, - { 0xE4F, 0x61 }, - - /* Blue Negative Gamma */ - { 0xE50, 0x08 }, - { 0xE51, 0x2c }, - { 0xE52, 0x4e }, - { 0xE53, 0x13 }, - { 0xE54, 0x3a }, - { 0xE55, 0x26 }, - { 0xE56, 0x30 }, - { 0xE57, 0x0f }, - { 0xE58, 0x0a }, - { 0xE59, 0x49 }, - { 0xE5A, 0x34 }, - { 0xE5B, 0x4a }, - { 0xE5C, 0x53 }, - { 0xE5D, 0x28 }, - { 0xE5E, 0x26 }, - { 0xE5F, 0x27 }, - -#endif - /* Sleep in mode */ - { 0x110, 0x00 }, - { 0x1, 0x23 }, - /* Display on mode */ - { 0x290, 0x00 }, - { 0x1, 0x27 }, - /* Driver output control */ - { 0x372, 0x01 }, - { 0x1, 0x40 }, - /* Display on mode */ - { 0x290, 0x01 }, -}; - -static const struct mddi_table tpo2_display_on[] = { - { 0x290, 0x01 }, -}; - -static const struct mddi_table tpo2_display_off[] = { - { 0x110, 0x01 }, - { 0x290, 0x00 }, - { 0x1, 100 }, -}; - -static const struct mddi_table tpo2_power_off[] = { - { 0x0110, 0x01 }, -}; - -static int nt35399_detect_panel(struct msm_mddi_client_data *client_data) -{ - int id = -1, i ; - - /* If the MDDI client is failed to report the panel ID, - * perform retrial 5 times. - */ - for( i=0; i < 5; i++ ) { - client_data->remote_write(client_data, 0, 0x110); - msleep(5); - id = client_data->remote_read(client_data, userid) ; - if( id == 0 || id == 1 ) { - if(i==0) { - printk(KERN_ERR "%s: got valid panel ID=%d, " - "without retry\n", - __FUNCTION__, id); - } - else { - printk(KERN_ERR "%s: got valid panel ID=%d, " - "after %d retry\n", - __FUNCTION__, id, i+1); - } - break ; - } - printk(KERN_ERR "%s: got invalid panel ID:%d, trial #%d\n", - __FUNCTION__, id, i+1); - - gpio_set_value(MDDI_RST_N, 0); - msleep(5); - - gpio_set_value(MDDI_RST_N, 1); - msleep(10); - gpio_set_value(MDDI_RST_N, 0); - udelay(100); - gpio_set_value(MDDI_RST_N, 1); - mdelay(10); - } - printk(KERN_INFO "%s: final panel id=%d\n", __FUNCTION__, id); - - switch(id) { - case 0: - return SAPPHIRE_PANEL_TOPPOLY; - case 1: - return SAPPHIRE_PANEL_SHARP; - default : - printk(KERN_ERR "%s(): Invalid panel ID: %d, " - "treat as sharp panel.", __FUNCTION__, id); - return SAPPHIRE_PANEL_SHARP; - } -} - -static int nt35399_client_init( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int panel_id; - - if (g_panel_inited == 0) { - g_panel_id = panel_id = nt35399_detect_panel(client_data); - g_panel_inited = 1 ; - } else { - gpio_set_value(MDDI_RST_N, 1); - msleep(10); - gpio_set_value(MDDI_RST_N, 0); - udelay(100); - gpio_set_value(MDDI_RST_N, 1); - mdelay(10); - - g_panel_id = panel_id = nt35399_detect_panel(client_data); - if (panel_id == -1) { - printk("Invalid panel id\n"); - return -1; - } - - client_data->auto_hibernate(client_data, 0); - if (panel_id == SAPPHIRE_PANEL_TOPPOLY) { - sapphire_process_mddi_table(client_data, tpo2_init_table, - ARRAY_SIZE(tpo2_init_table)); - } else if(panel_id == SAPPHIRE_PANEL_SHARP) { - sapphire_process_mddi_table(client_data, sharp2_init_table, - ARRAY_SIZE(sharp2_init_table)); - } - - client_data->auto_hibernate(client_data, 1); - } - - return 0; -} - -static int nt35399_client_uninit( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *cdata) -{ - return 0; -} - -static int nt35399_panel_unblank( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int ret = 0; - - mdelay(20); - sapphire_set_backlight_level(0); - client_data->auto_hibernate(client_data, 0); - - mutex_lock(&sapphire_backlight_lock); - sapphire_set_backlight_level(sapphire_backlight_brightness); - sapphire_backlight_off = 0; - mutex_unlock(&sapphire_backlight_lock); - - client_data->auto_hibernate(client_data, 1); - - return ret; -} - -static int nt35399_panel_blank( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int ret = 0; - - client_data->auto_hibernate(client_data, 0); - sapphire_process_mddi_table(client_data, tpo2_display_off, - ARRAY_SIZE(tpo2_display_off)); - client_data->auto_hibernate(client_data, 1); - - mutex_lock(&sapphire_backlight_lock); - sapphire_set_backlight_level(0); - sapphire_backlight_off = 1; - mutex_unlock(&sapphire_backlight_lock); - - return ret; -} - -static void sapphire_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) -{ - mutex_lock(&sapphire_backlight_lock); - sapphire_backlight_brightness = value; - if (!sapphire_backlight_off) - sapphire_set_backlight_level(sapphire_backlight_brightness); - mutex_unlock(&sapphire_backlight_lock); -} - -static struct led_classdev sapphire_backlight_led = { - .name = "lcd-backlight", - .brightness = SAPPHIRE_DEFAULT_BACKLIGHT_BRIGHTNESS, - .brightness_set = sapphire_brightness_set, -}; - -static int sapphire_backlight_probe(struct platform_device *pdev) -{ - led_classdev_register(&pdev->dev, &sapphire_backlight_led); - return 0; -} - -static int sapphire_backlight_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&sapphire_backlight_led); - return 0; -} - -static struct platform_driver sapphire_backlight_driver = { - .probe = sapphire_backlight_probe, - .remove = sapphire_backlight_remove, - .driver = { - .name = "sapphire-backlight", - .owner = THIS_MODULE, - }, -}; - -static struct resource resources_msm_fb[] = { - { - .start = SMI64_MSM_FB_BASE, - .end = SMI64_MSM_FB_BASE + SMI64_MSM_FB_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_mddi_bridge_platform_data toshiba_client_data = { - .init = sapphire_mddi_toshiba_client_init, - .uninit = sapphire_mddi_toshiba_client_uninit, - .blank = sapphire_mddi_panel_blank, - .unblank = sapphire_mddi_panel_unblank, - .fb_data = { - .xres = 320, - .yres = 480, - .width = 45, - .height = 67, - .output_format = 0, - }, -}; - -#define NT35399_MFR_NAME 0x0bda -#define NT35399_PRODUCT_CODE 0x8a47 - -static void nt35399_fixup(uint16_t * mfr_name, uint16_t * product_code) -{ - printk(KERN_DEBUG "%s: enter.\n", __func__); - *mfr_name = NT35399_MFR_NAME ; - *product_code= NT35399_PRODUCT_CODE ; -} - -static struct msm_mddi_bridge_platform_data nt35399_client_data = { - - .init = nt35399_client_init, - .uninit = nt35399_client_uninit, - .blank = nt35399_panel_blank, - .unblank = nt35399_panel_unblank, - .fb_data = { - .xres = 320, - .yres = 480, - .output_format = 0, - }, -}; - -static struct msm_mddi_platform_data mddi_pdata = { - .clk_rate = 122880000, - .power_client = sapphire_mddi_power_client, - .fixup = nt35399_fixup, - .vsync_irq = MSM_GPIO_TO_INT(VSYNC_GPIO), - .fb_resource = resources_msm_fb, - .num_clients = 2, - .client_platform_data = { - { - .product_id = (0xd263 << 16 | 0), - .name = "mddi_c_d263_0000", - .id = 0, - .client_data = &toshiba_client_data, - .clk_rate = 0, - }, - { - .product_id = - (NT35399_MFR_NAME << 16 | NT35399_PRODUCT_CODE), - .name = "mddi_c_simple" , - .id = 0, - .client_data = &nt35399_client_data, - .clk_rate = 0, - }, - }, -}; - -static struct platform_device sapphire_backlight = { - .name = "sapphire-backlight", -}; - -int __init sapphire_init_panel(void) -{ - int rc = -1; - uint32_t config = PCOM_GPIO_CFG(27, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA); /* GPIO27 */ - - if (!machine_is_sapphire()) - return 0; - - /* checking board as soon as possible */ - printk("sapphire_init_panel:machine_is_sapphire=%d, machine_arch_type=%d, MACH_TYPE_SAPPHIRE=%d\r\n", machine_is_sapphire(), machine_arch_type, MACH_TYPE_SAPPHIRE); - if (!machine_is_sapphire()) - return 0; - - vreg_lcm_2v85 = vreg_get(0, "gp4"); - if (IS_ERR(vreg_lcm_2v85)) - return PTR_ERR(vreg_lcm_2v85); - - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, 0); - - /* setup FB by SMI size */ - if (sapphire_get_smi_size() == 32) { - resources_msm_fb[0].start = SMI32_MSM_FB_BASE; - resources_msm_fb[0].end = SMI32_MSM_FB_BASE + SMI32_MSM_FB_SIZE - 1; - } - - rc = gpio_request(VSYNC_GPIO, "vsync"); - if (rc) - return rc; - rc = gpio_direction_input(VSYNC_GPIO); - if (rc) - return rc; - rc = platform_device_register(&msm_device_mdp); - if (rc) - return rc; - msm_device_mddi0.dev.platform_data = &mddi_pdata; - rc = platform_device_register(&msm_device_mddi0); - if (rc) - return rc; - platform_device_register(&sapphire_backlight); - return platform_driver_register(&sapphire_backlight_driver); -} - -device_initcall(sapphire_init_panel); diff --git a/arch/arm/mach-msm/board-sapphire-rfkill.c b/arch/arm/mach-msm/board-sapphire-rfkill.c deleted file mode 100644 index 2fd6ea198e3d..000000000000 --- a/arch/arm/mach-msm/board-sapphire-rfkill.c +++ /dev/null @@ -1,105 +0,0 @@ -/* linux/arch/arm/mach-msm/board-sapphire-rfkill.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -/* Control bluetooth power for sapphire platform */ - -#include -#include -#include -#include -#include -#include -#include -#include "gpio_chip.h" -#include "board-sapphire.h" - -static struct rfkill *bt_rfk; -static const char bt_name[] = "brf6300"; - -extern int sapphire_bt_fastclock_power(int on); - -static int bluetooth_set_power(void *data, bool blocked) -{ - if (!blocked) { - sapphire_bt_fastclock_power(1); - gpio_set_value(SAPPHIRE_GPIO_BT_32K_EN, 1); - udelay(10); - gpio_direction_output(101, 1); - } else { - gpio_direction_output(101, 0); - gpio_set_value(SAPPHIRE_GPIO_BT_32K_EN, 0); - sapphire_bt_fastclock_power(0); - } - return 0; -} - -static struct rfkill_ops sapphire_rfkill_ops = { - .set_block = bluetooth_set_power, -}; - -static int sapphire_rfkill_probe(struct platform_device *pdev) -{ - int rc = 0; - bool default_state = true; /* off */ - - bluetooth_set_power(NULL, default_state); - - bt_rfk = rfkill_alloc(bt_name, &pdev->dev, RFKILL_TYPE_BLUETOOTH, - &sapphire_rfkill_ops, NULL); - if (!bt_rfk) - return -ENOMEM; - - /* userspace cannot take exclusive control */ - - rfkill_set_states(bt_rfk, default_state, false); - - rc = rfkill_register(bt_rfk); - - if (rc) - rfkill_destroy(bt_rfk); - return rc; -} - -static int sapphire_rfkill_remove(struct platform_device *dev) -{ - rfkill_unregister(bt_rfk); - rfkill_destroy(bt_rfk); - - return 0; -} - -static struct platform_driver sapphire_rfkill_driver = { - .probe = sapphire_rfkill_probe, - .remove = sapphire_rfkill_remove, - .driver = { - .name = "sapphire_rfkill", - .owner = THIS_MODULE, - }, -}; - -static int __init sapphire_rfkill_init(void) -{ - return platform_driver_register(&sapphire_rfkill_driver); -} - -static void __exit sapphire_rfkill_exit(void) -{ - platform_driver_unregister(&sapphire_rfkill_driver); -} - -module_init(sapphire_rfkill_init); -module_exit(sapphire_rfkill_exit); -MODULE_DESCRIPTION("sapphire rfkill"); -MODULE_AUTHOR("Nick Pelly "); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-sapphire-wifi.c b/arch/arm/mach-msm/board-sapphire-wifi.c deleted file mode 100644 index 43f827c60f13..000000000000 --- a/arch/arm/mach-msm/board-sapphire-wifi.c +++ /dev/null @@ -1,74 +0,0 @@ -/* arch/arm/mach-msm/board-sapphire-wifi.c - * - * Copyright (C) 2008 Google, Inc. - * Author: Dmitry Shmidt - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifdef CONFIG_WIFI_CONTROL_FUNC -#include -#include -#include -#include -#include -#include - -extern int sapphire_wifi_set_carddetect(int val); -extern int sapphire_wifi_power(int on); -extern int sapphire_wifi_reset(int on); - -#ifdef CONFIG_WIFI_MEM_PREALLOC -typedef struct wifi_mem_prealloc_struct { - void *mem_ptr; - unsigned long size; -} wifi_mem_prealloc_t; - -static wifi_mem_prealloc_t wifi_mem_array[WMPA_NUMBER_OF_SECTIONS] = { - { NULL, (WMPA_SECTION_SIZE_0 + WMPA_SECTION_HEADER) }, - { NULL, (WMPA_SECTION_SIZE_1 + WMPA_SECTION_HEADER) }, - { NULL, (WMPA_SECTION_SIZE_2 + WMPA_SECTION_HEADER) } -}; - -static void *sapphire_wifi_mem_prealloc(int section, unsigned long size) -{ - if ((section < 0) || (section >= WMPA_NUMBER_OF_SECTIONS)) - return NULL; - if (wifi_mem_array[section].size < size) - return NULL; - return wifi_mem_array[section].mem_ptr; -} - -int __init sapphire_init_wifi_mem (void) -{ - int i; - - for (i = 0; (i < WMPA_NUMBER_OF_SECTIONS); i++) { - wifi_mem_array[i].mem_ptr = vmalloc(wifi_mem_array[i].size); - if (wifi_mem_array[i].mem_ptr == NULL) - return -ENOMEM; - } - return 0; -} -#endif - -struct wifi_platform_data sapphire_wifi_control = { - .set_power = sapphire_wifi_power, - .set_reset = sapphire_wifi_reset, - .set_carddetect = sapphire_wifi_set_carddetect, -#ifdef CONFIG_WIFI_MEM_PREALLOC - .mem_prealloc = sapphire_wifi_mem_prealloc, -#else - .mem_prealloc = NULL, -#endif -}; - -#endif diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c deleted file mode 100644 index 19723f219921..000000000000 --- a/arch/arm/mach-msm/board-sapphire.c +++ /dev/null @@ -1,117 +0,0 @@ -/* linux/arch/arm/mach-msm/board-sapphire.c - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include "gpio_chip.h" -#include "board-sapphire.h" -#include "devices.h" - -void msm_init_irq(void); -void msm_init_gpio(void); - -static struct platform_device *devices[] __initdata = { - &msm_device_smd, - &msm_device_dmov, - &msm_device_nand, - &msm_device_uart1, - &msm_device_uart3, -}; - -void msm_timer_init(void); - -static void __init sapphire_init_irq(void) -{ - msm_init_irq(); -} - -static void __init sapphire_init(void) -{ - platform_add_devices(devices, ARRAY_SIZE(devices)); -} - -static struct map_desc sapphire_io_desc[] __initdata = { - { - .virtual = SAPPHIRE_CPLD_BASE, - .pfn = __phys_to_pfn(SAPPHIRE_CPLD_START), - .length = SAPPHIRE_CPLD_SIZE, - .type = MT_DEVICE_NONSHARED - } -}; - -static void __init sapphire_fixup(struct tag *tags, char **cmdline, - struct meminfo *mi) -{ - int smi_sz = parse_tag_smi((const struct tag *)tags); - - mi->nr_banks = 1; - mi->bank[0].start = PHYS_OFFSET; - mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET); - if (smi_sz == 32) { - mi->bank[0].size = (84*1024*1024); - } else if (smi_sz == 64) { - mi->bank[0].size = (101*1024*1024); - } else { - /* Give a default value when not get smi size */ - smi_sz = 64; - mi->bank[0].size = (101*1024*1024); - } -} - -static void __init sapphire_map_io(void) -{ - msm_map_common_io(); - iotable_init(sapphire_io_desc, ARRAY_SIZE(sapphire_io_desc)); - msm_clock_init(); -} - -static void __init sapphire_init_late(void) -{ - smd_debugfs_init(); -} - -MACHINE_START(SAPPHIRE, "sapphire") -/* Maintainer: Brian Swetland */ - .atag_offset = 0x100, - .fixup = sapphire_fixup, - .map_io = sapphire_map_io, - .init_irq = sapphire_init_irq, - .init_machine = sapphire_init, - .init_late = sapphire_init_late, - .init_time = msm_timer_init, -MACHINE_END diff --git a/arch/arm/mach-msm/board-sapphire.h b/arch/arm/mach-msm/board-sapphire.h deleted file mode 100644 index d96760a25ef8..000000000000 --- a/arch/arm/mach-msm/board-sapphire.h +++ /dev/null @@ -1,224 +0,0 @@ -/* linux/arch/arm/mach-msm/board-sapphire.h - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ -#ifndef __ARCH_ARM_MACH_MSM_BOARD_SAPPHIRE_H -#define __ARCH_ARM_MACH_MSM_BOARD_SAPPHIRE_H - -#include - -#define MSM_SMI_BASE 0x00000000 -#define MSM_SMI_SIZE 0x00800000 - -#define MSM_EBI_BASE 0x10000000 -#define MSM_EBI_SIZE 0x07100000 - -#define MSM_PMEM_GPU0_BASE 0x00000000 -#define MSM_PMEM_GPU0_SIZE 0x00700000 - -#define SMI64_MSM_PMEM_MDP_BASE 0x15900000 -#define SMI64_MSM_PMEM_MDP_SIZE 0x00800000 - -#define SMI64_MSM_PMEM_ADSP_BASE 0x16100000 -#define SMI64_MSM_PMEM_ADSP_SIZE 0x00800000 - -#define SMI64_MSM_PMEM_CAMERA_BASE 0x15400000 -#define SMI64_MSM_PMEM_CAMERA_SIZE 0x00500000 - -#define SMI64_MSM_FB_BASE 0x00700000 -#define SMI64_MSM_FB_SIZE 0x00100000 - -#define SMI64_MSM_LINUX_BASE MSM_EBI_BASE -#define SMI64_MSM_LINUX_SIZE 0x068e0000 - -#define SMI64_MSM_LINUX_BASE_1 0x02000000 -#define SMI64_MSM_LINUX_SIZE_1 0x02000000 - -#define SMI64_MSM_LINUX_BASE_2 MSM_EBI_BASE -#define SMI64_MSM_LINUX_SIZE_2 0x05400000 - -#define SMI32_MSM_LINUX_BASE MSM_EBI_BASE -#define SMI32_MSM_LINUX_SIZE 0x5400000 - -#define SMI32_MSM_PMEM_MDP_BASE SMI32_MSM_LINUX_BASE + SMI32_MSM_LINUX_SIZE -#define SMI32_MSM_PMEM_MDP_SIZE 0x800000 - -#define SMI32_MSM_PMEM_ADSP_BASE SMI32_MSM_PMEM_MDP_BASE + SMI32_MSM_PMEM_MDP_SIZE -#define SMI32_MSM_PMEM_ADSP_SIZE 0x800000 - -#define SMI32_MSM_FB_BASE SMI32_MSM_PMEM_ADSP_BASE + SMI32_MSM_PMEM_ADSP_SIZE -#define SMI32_MSM_FB_SIZE 0x9b000 - - -#define MSM_PMEM_GPU1_SIZE 0x800000 -#define MSM_PMEM_GPU1_BASE (MSM_RAM_CONSOLE_BASE + MSM_RAM_CONSOLE_SIZE) - -#define MSM_RAM_CONSOLE_BASE 0x169E0000 -#define MSM_RAM_CONSOLE_SIZE 128 * SZ_1K - -#if (SMI32_MSM_FB_BASE + SMI32_MSM_FB_SIZE) >= (MSM_PMEM_GPU1_BASE) -#error invalid memory map -#endif - -#if (SMI64_MSM_FB_BASE + SMI64_MSM_FB_SIZE) >= (MSM_PMEM_GPU1_BASE) -#error invalid memory map -#endif - -#define DECLARE_MSM_IOMAP -#include - -/* -** SOC GPIO -*/ -#define SAPPHIRE_BALL_UP_0 94 -#define SAPPHIRE_BALL_LEFT_0 18 -#define SAPPHIRE_BALL_DOWN_0 49 -#define SAPPHIRE_BALL_RIGHT_0 19 - -#define SAPPHIRE_POWER_KEY 20 -#define SAPPHIRE_VOLUME_UP 36 -#define SAPPHIRE_VOLUME_DOWN 39 - -#define SAPPHIRE_GPIO_PS_HOLD (25) -#define SAPPHIRE_MDDI_1V5_EN (28) -#define SAPPHIRE_BL_PWM (27) -#define SAPPHIRE_TP_LS_EN (1) -#define SAPPHIRE20_TP_LS_EN (88) - -/* H2W */ -#define SAPPHIRE_GPIO_CABLE_IN1 (83) -#define SAPPHIRE_GPIO_CABLE_IN2 (37) -#define SAPPHIRE_GPIO_UART3_RX (86) -#define SAPPHIRE_GPIO_UART3_TX (87) -#define SAPPHIRE_GPIO_H2W_DATA (86) -#define SAPPHIRE_GPIO_H2W_CLK (87) - -#define SAPPHIRE_GPIO_UART1_RTS (43) -#define SAPPHIRE_GPIO_UART1_CTS (44) - -/* -** CPLD GPIO -** -** Sapphire Altera CPLD can keep the registers value and -** doesn't need a shadow to backup. -**/ -#define SAPPHIRE_CPLD_BASE 0xFA000000 /* VA */ -#define SAPPHIRE_CPLD_START 0x98000000 /* PA */ -#define SAPPHIRE_CPLD_SIZE SZ_4K - -#define SAPPHIRE_GPIO_START (128) /* Pseudo GPIO number */ - -/* Sapphire has one INT BANK only. */ -#define SAPPHIRE_GPIO_INT_B0_MASK_REG (0x0c) /*INT3 MASK*/ -#define SAPPHIRE_GPIO_INT_B0_STAT_REG (0x0e) /*INT1 STATUS*/ - -/* LED control register */ -#define SAPPHIRE_CPLD_LED_BASE (SAPPHIRE_CPLD_BASE + 0x10) /* VA */ -#define SAPPHIRE_CPLD_LED_START (SAPPHIRE_CPLD_START + 0x10) /* PA */ -#define SAPPHIRE_CPLD_LED_SIZE 0x08 - -/* MISCn: GPO pin to Enable/Disable some functions. */ -#define SAPPHIRE_GPIO_MISC1_BASE (SAPPHIRE_GPIO_START + 0x00) -#define SAPPHIRE_GPIO_MISC2_BASE (SAPPHIRE_GPIO_START + 0x08) -#define SAPPHIRE_GPIO_MISC3_BASE (SAPPHIRE_GPIO_START + 0x10) -#define SAPPHIRE_GPIO_MISC4_BASE (SAPPHIRE_GPIO_START + 0x18) -#define SAPPHIRE_GPIO_MISC5_BASE (SAPPHIRE_GPIO_START + 0x20) - -/* INT BANK0: INT1: int status, INT2: int level, INT3: int Mask */ -#define SAPPHIRE_GPIO_INT_B0_BASE (SAPPHIRE_GPIO_START + 0x28) - -/* MISCn GPIO: */ -#define SAPPHIRE_GPIO_CPLD128_VER_0 (SAPPHIRE_GPIO_MISC1_BASE + 4) -#define SAPPHIRE_GPIO_CPLD128_VER_1 (SAPPHIRE_GPIO_MISC1_BASE + 5) -#define SAPPHIRE_GPIO_CPLD128_VER_2 (SAPPHIRE_GPIO_MISC1_BASE + 6) -#define SAPPHIRE_GPIO_CPLD128_VER_3 (SAPPHIRE_GPIO_MISC1_BASE + 7) - -#define SAPPHIRE_GPIO_H2W_DAT_DIR (SAPPHIRE_GPIO_MISC2_BASE + 2) -#define SAPPHIRE_GPIO_H2W_CLK_DIR (SAPPHIRE_GPIO_MISC2_BASE + 3) -#define SAPPHIRE_GPIO_H2W_SEL0 (SAPPHIRE_GPIO_MISC2_BASE + 6) -#define SAPPHIRE_GPIO_H2W_SEL1 (SAPPHIRE_GPIO_MISC2_BASE + 7) - -#define SAPPHIRE_GPIO_I2C_PULL (SAPPHIRE_GPIO_MISC3_BASE + 2) -#define SAPPHIRE_GPIO_TP_EN (SAPPHIRE_GPIO_MISC3_BASE + 4) -#define SAPPHIRE_GPIO_JOG_EN (SAPPHIRE_GPIO_MISC3_BASE + 5) -#define SAPPHIRE_GPIO_JOG_LED_EN (SAPPHIRE_GPIO_MISC3_BASE + 6) -#define SAPPHIRE_GPIO_APKEY_LED_EN (SAPPHIRE_GPIO_MISC3_BASE + 7) - -#define SAPPHIRE_GPIO_VCM_PWDN (SAPPHIRE_GPIO_MISC4_BASE + 0) -#define SAPPHIRE_GPIO_USB_H2W_SW (SAPPHIRE_GPIO_MISC4_BASE + 1) -#define SAPPHIRE_GPIO_COMPASS_RST_N (SAPPHIRE_GPIO_MISC4_BASE + 2) -#define SAPPHIRE_GPIO_USB_PHY_RST_N (SAPPHIRE_GPIO_MISC4_BASE + 5) -#define SAPPHIRE_GPIO_WIFI_PA_RESETX (SAPPHIRE_GPIO_MISC4_BASE + 6) -#define SAPPHIRE_GPIO_WIFI_EN (SAPPHIRE_GPIO_MISC4_BASE + 7) - -#define SAPPHIRE_GPIO_BT_32K_EN (SAPPHIRE_GPIO_MISC5_BASE + 0) -#define SAPPHIRE_GPIO_MAC_32K_EN (SAPPHIRE_GPIO_MISC5_BASE + 1) -#define SAPPHIRE_GPIO_MDDI_32K_EN (SAPPHIRE_GPIO_MISC5_BASE + 2) -#define SAPPHIRE_GPIO_COMPASS_32K_EN (SAPPHIRE_GPIO_MISC5_BASE + 3) - -/* INT STATUS/LEVEL/MASK : INT GPIO should be the last. */ -#define SAPPHIRE_GPIO_NAVI_ACT_N (SAPPHIRE_GPIO_INT_B0_BASE + 0) -#define SAPPHIRE_GPIO_COMPASS_IRQ (SAPPHIRE_GPIO_INT_B0_BASE + 1) -#define SAPPHIRE_GPIO_SEARCH_ACT_N (SAPPHIRE_GPIO_INT_B0_BASE + 2) -#define SAPPHIRE_GPIO_AUD_HSMIC_DET_N (SAPPHIRE_GPIO_INT_B0_BASE + 3) -#define SAPPHIRE_GPIO_SDMC_CD_N (SAPPHIRE_GPIO_INT_B0_BASE + 4) -#define SAPPHIRE_GPIO_CAM_BTN_STEP1_N (SAPPHIRE_GPIO_INT_B0_BASE + 5) -#define SAPPHIRE_GPIO_CAM_BTN_STEP2_N (SAPPHIRE_GPIO_INT_B0_BASE + 6) -#define SAPPHIRE_GPIO_TP_ATT_N (SAPPHIRE_GPIO_INT_B0_BASE + 7) - -#define SAPPHIRE_GPIO_END SAPPHIRE_GPIO_TP_ATT_N -#define SAPPHIRE_GPIO_LAST_INT (SAPPHIRE_GPIO_TP_ATT_N) - -/* Bit position in the CPLD MISCn by the CPLD GPIOn: only bit0-7 is used. */ -#define CPLD_GPIO_BIT_POS_MASK(n) (1U << ((n) & 7)) -#define CPLD_GPIO_REG_OFFSET(n) _g_CPLD_MISCn_Offset[((n)-SAPPHIRE_GPIO_START) >> 3] -#define CPLD_GPIO_REG(n) (CPLD_GPIO_REG_OFFSET(n) + SAPPHIRE_CPLD_BASE) - -/* -** CPLD INT Start -*/ -#define SAPPHIRE_INT_START (NR_MSM_IRQS + NR_GPIO_IRQS) /* pseudo number for CPLD INT */ -/* Using INT status/Bank0 for GPIO to INT */ -#define SAPPHIRE_GPIO_TO_INT(n) ((n-SAPPHIRE_GPIO_INT_B0_BASE) + SAPPHIRE_INT_START) -#define SAPPHIRE_INT_END (SAPPHIRE_GPIO_TO_INT(SAPPHIRE_GPIO_END)) - -/* get the INT reg by GPIO number */ -#define CPLD_INT_GPIO_TO_BANK(n) (((n)-SAPPHIRE_GPIO_INT_B0_BASE) >> 3) -#define CPLD_INT_STATUS_REG_OFFSET_G(n) _g_INT_BANK_Offset[CPLD_INT_GPIO_TO_BANK(n)][0] -#define CPLD_INT_LEVEL_REG_OFFSET_G(n) _g_INT_BANK_Offset[CPLD_INT_GPIO_TO_BANK(n)][1] -#define CPLD_INT_MASK_REG_OFFSET_G(n) _g_INT_BANK_Offset[CPLD_INT_GPIO_TO_BANK(n)][2] -#define CPLD_INT_STATUS_REG_G(n) (SAPPHIRE_CPLD_BASE + CPLD_INT_STATUS_REG_OFFSET_G(n)) -#define CPLD_INT_LEVEL_REG_G(n) (SAPPHIRE_CPLD_BASE + CPLD_INT_LEVEL_REG_OFFSET_G(n)) -#define CPLD_INT_MASK_REG_G(n) (SAPPHIRE_CPLD_BASE + CPLD_INT_MASK_REG_OFFSET_G(n)) - -/* get the INT reg by INT number */ -#define CPLD_INT_TO_BANK(i) ((i-SAPPHIRE_INT_START) >> 3) -#define CPLD_INT_STATUS_REG_OFFSET(i) _g_INT_BANK_Offset[CPLD_INT_TO_BANK(i)][0] -#define CPLD_INT_LEVEL_REG_OFFSET(i) _g_INT_BANK_Offset[CPLD_INT_TO_BANK(i)][1] -#define CPLD_INT_MASK_REG_OFFSET(i) _g_INT_BANK_Offset[CPLD_INT_TO_BANK(i)][2] -#define CPLD_INT_STATUS_REG(i) (SAPPHIRE_CPLD_BASE + CPLD_INT_STATUS_REG_OFFSET(i)) -#define CPLD_INT_LEVEL_REG(i) (SAPPHIRE_CPLD_BASE + CPLD_INT_LEVEL_REG_OFFSET(i)) -#define CPLD_INT_MASK_REG(i) (SAPPHIRE_CPLD_BASE + CPLD_INT_MASK_REG_OFFSET(i) ) - -/* return the bit mask by INT number */ -#define SAPPHIRE_INT_BIT_MASK(i) (1U << ((i - SAPPHIRE_INT_START) & 7)) - -void config_sapphire_camera_on_gpios(void); -void config_sapphire_camera_off_gpios(void); -int sapphire_get_smi_size(void); -unsigned int sapphire_get_hwid(void); -unsigned int sapphire_get_skuid(void); -unsigned int is_12pin_camera(void); -int sapphire_is_5M_camera(void); -int sapphire_gpio_write(struct gpio_chip *chip, unsigned n, unsigned on); - -#endif /* GUARD */ diff --git a/arch/arm/mach-msm/board-storage-common-a.h b/arch/arm/mach-msm/board-storage-common-a.h deleted file mode 100644 index f6516778a892..000000000000 --- a/arch/arm/mach-msm/board-storage-common-a.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _BOARD_STORAGE_A_H -#define _BOARD_STORAGE_A_H - -#include -#include -#include - -#define MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(num, _ib) \ -static struct msm_bus_vectors sps_to_ddr_perf_vectors_##num[] = { \ - { \ - .src = MSM_BUS_MASTER_SPS, \ - .dst = MSM_BUS_SLAVE_EBI_CH0, \ - .ib = (_ib), \ - .ab = ((_ib) / 2), \ - } \ -} - -#define MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(num) \ - { \ - ARRAY_SIZE(sps_to_ddr_perf_vectors_##num), \ - sps_to_ddr_perf_vectors_##num, \ - } - -/* no bandwidth required */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(0, 0); -/* - * 13 MB/s bandwidth - * 4-bit MMC_TIMING_LEGACY - * 4-bit MMC_TIMING_UHS_SDR12 - */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(1, 13 * 1024 * 1024); -/* - * 26 MB/s bandwidth - * 8-bit MMC_TIMING_LEGACY - * 4-bit MMC_TIMING_MMC_HS / MMC_TIMING_SD_HS / - * MMC_TIMING_UHS_SDR25 - */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(2, 26 * 1024 * 1024); -/* - * 52 MB/s bandwidth - * 8-bit MMC_TIMING_MMC_HS - * 4-bit MMC_TIMING_UHS_SDR50 / MMC_TIMING_UHS_DDR50 - */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(3, 52 * 1024 * 1024); -/* - * 104 MB/s bandwidth - * 8-bit MMC_TIMING_UHS_DDR50 - * 4-bit MMC_TIMING_UHS_SDR104 / MMC_TIMING_MMC_HS200 - */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(4, 104 * 1024 * 1024); -/* - * 200 MB/s bandwidth - * 8-bit MMC_TIMING_MMC_HS200 - */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(5, 200 * 1024 * 1024); -/* max. possible bandwidth */ -MSM_BUS_SPS_TO_DDR_VOTE_VECTOR(6, UINT_MAX); - -static unsigned int sdcc_bw_vectors[] = {0, (13 * 1024 * 1024), - (26 * 1024 * 1024), (52 * 1024 * 1024), - (104 * 1024 * 1024), (200 * 1024 * 1024), - UINT_MAX}; - -static struct msm_bus_paths sps_to_ddr_bus_scale_usecases[] = { - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(0), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(1), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(2), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(3), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(4), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(5), - MSM_BUS_SPS_TO_DDR_VOTE_VECTOR_USECASE(6), -}; - -static struct msm_bus_scale_pdata sps_to_ddr_bus_scale_data = { - sps_to_ddr_bus_scale_usecases, - ARRAY_SIZE(sps_to_ddr_bus_scale_usecases), - .name = "msm_sdcc", -}; - -static struct msm_mmc_bus_voting_data sps_to_ddr_bus_voting_data = { - .use_cases = &sps_to_ddr_bus_scale_data, - .bw_vecs = sdcc_bw_vectors, - .bw_vecs_size = sizeof(sdcc_bw_vectors), -}; - -#endif /* _BOARD_STORAGE_A_H */ diff --git a/arch/arm/mach-msm/board-swordfish-keypad.c b/arch/arm/mach-msm/board-swordfish-keypad.c deleted file mode 100644 index f2c2f3962f65..000000000000 --- a/arch/arm/mach-msm/board-swordfish-keypad.c +++ /dev/null @@ -1,177 +0,0 @@ -/* linux/arch/arm/mach-msm/board-swordfish-keypad.c - * - * Copyright (C) 2007 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#undef MODULE_PARAM_PREFIX -#define MODULE_PARAM_PREFIX "board_swordfish." -static int swordfish_ffa; -module_param_named(ffa, swordfish_ffa, int, S_IRUGO | S_IWUSR | S_IWGRP); - -#define SCAN_FUNCTION_KEYS 0 /* don't turn this on without updating the ffa support */ - -static unsigned int swordfish_row_gpios[] = { - 31, 32, 33, 34, 35, 41 -#if SCAN_FUNCTION_KEYS - , 42 -#endif -}; - -static unsigned int swordfish_col_gpios[] = { 36, 37, 38, 39, 40 }; - -/* FFA: - 36: KEYSENSE_N(0) - 37: KEYSENSE_N(1) - 38: KEYSENSE_N(2) - 39: KEYSENSE_N(3) - 40: KEYSENSE_N(4) - - 31: KYPD_17 - 32: KYPD_15 - 33: KYPD_13 - 34: KYPD_11 - 35: KYPD_9 - 41: KYPD_MEMO -*/ - -#define KEYMAP_INDEX(row, col) ((row)*ARRAY_SIZE(swordfish_col_gpios) + (col)) - -static const unsigned short swordfish_keymap[ARRAY_SIZE(swordfish_col_gpios) * ARRAY_SIZE(swordfish_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_5, - [KEYMAP_INDEX(0, 1)] = KEY_9, - [KEYMAP_INDEX(0, 2)] = 229, /* SOFT1 */ - [KEYMAP_INDEX(0, 3)] = KEY_6, - [KEYMAP_INDEX(0, 4)] = KEY_LEFT, - - [KEYMAP_INDEX(1, 0)] = KEY_0, - [KEYMAP_INDEX(1, 1)] = KEY_RIGHT, - [KEYMAP_INDEX(1, 2)] = KEY_1, - [KEYMAP_INDEX(1, 3)] = 228, /* KEY_SHARP */ - [KEYMAP_INDEX(1, 4)] = KEY_SEND, - - [KEYMAP_INDEX(2, 0)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(2, 1)] = KEY_HOME, /* FA */ - [KEYMAP_INDEX(2, 2)] = KEY_F8, /* QCHT */ - [KEYMAP_INDEX(2, 3)] = KEY_F6, /* R+ */ - [KEYMAP_INDEX(2, 4)] = KEY_F7, /* R- */ - - [KEYMAP_INDEX(3, 0)] = KEY_UP, - [KEYMAP_INDEX(3, 1)] = KEY_CLEAR, - [KEYMAP_INDEX(3, 2)] = KEY_4, - [KEYMAP_INDEX(3, 3)] = KEY_MUTE, /* SPKR */ - [KEYMAP_INDEX(3, 4)] = KEY_2, - - [KEYMAP_INDEX(4, 0)] = 230, /* SOFT2 */ - [KEYMAP_INDEX(4, 1)] = 232, /* KEY_CENTER */ - [KEYMAP_INDEX(4, 2)] = KEY_DOWN, - [KEYMAP_INDEX(4, 3)] = KEY_BACK, /* FB */ - [KEYMAP_INDEX(4, 4)] = KEY_8, - - [KEYMAP_INDEX(5, 0)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */ - [KEYMAP_INDEX(5, 2)] = KEY_MAIL, /* MESG */ - [KEYMAP_INDEX(5, 3)] = KEY_3, - [KEYMAP_INDEX(5, 4)] = KEY_7, - -#if SCAN_FUNCTION_KEYS - [KEYMAP_INDEX(6, 0)] = KEY_F5, - [KEYMAP_INDEX(6, 1)] = KEY_F4, - [KEYMAP_INDEX(6, 2)] = KEY_F3, - [KEYMAP_INDEX(6, 3)] = KEY_F2, - [KEYMAP_INDEX(6, 4)] = KEY_F1 -#endif -}; - -static const unsigned short swordfish_keymap_ffa[ARRAY_SIZE(swordfish_col_gpios) * ARRAY_SIZE(swordfish_row_gpios)] = { - /*[KEYMAP_INDEX(0, 0)] = ,*/ - /*[KEYMAP_INDEX(0, 1)] = ,*/ - [KEYMAP_INDEX(0, 2)] = KEY_1, - [KEYMAP_INDEX(0, 3)] = KEY_SEND, - [KEYMAP_INDEX(0, 4)] = KEY_LEFT, - - [KEYMAP_INDEX(1, 0)] = KEY_3, - [KEYMAP_INDEX(1, 1)] = KEY_RIGHT, - [KEYMAP_INDEX(1, 2)] = KEY_VOLUMEUP, - /*[KEYMAP_INDEX(1, 3)] = ,*/ - [KEYMAP_INDEX(1, 4)] = KEY_6, - - [KEYMAP_INDEX(2, 0)] = KEY_HOME, /* A */ - [KEYMAP_INDEX(2, 1)] = KEY_BACK, /* B */ - [KEYMAP_INDEX(2, 2)] = KEY_0, - [KEYMAP_INDEX(2, 3)] = 228, /* KEY_SHARP */ - [KEYMAP_INDEX(2, 4)] = KEY_9, - - [KEYMAP_INDEX(3, 0)] = KEY_UP, - [KEYMAP_INDEX(3, 1)] = 232, /* KEY_CENTER */ /* i */ - [KEYMAP_INDEX(3, 2)] = KEY_4, - /*[KEYMAP_INDEX(3, 3)] = ,*/ - [KEYMAP_INDEX(3, 4)] = KEY_2, - - [KEYMAP_INDEX(4, 0)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(4, 1)] = KEY_SOUND, - [KEYMAP_INDEX(4, 2)] = KEY_DOWN, - [KEYMAP_INDEX(4, 3)] = KEY_8, - [KEYMAP_INDEX(4, 4)] = KEY_5, - - /*[KEYMAP_INDEX(5, 0)] = ,*/ - [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */ - [KEYMAP_INDEX(5, 2)] = 230, /*SOFT2*/ /* 2 */ - [KEYMAP_INDEX(5, 3)] = KEY_MENU, /* 1 */ - [KEYMAP_INDEX(5, 4)] = KEY_7, -}; - -static struct gpio_event_matrix_info swordfish_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = swordfish_keymap, - .output_gpios = swordfish_row_gpios, - .input_gpios = swordfish_col_gpios, - .noutputs = ARRAY_SIZE(swordfish_row_gpios), - .ninputs = ARRAY_SIZE(swordfish_col_gpios), - .settle_time.tv.nsec = 0, - .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE | GPIOKPF_PRINT_UNMAPPED_KEYS /*| GPIOKPF_PRINT_MAPPED_KEYS*/ -}; - -struct gpio_event_info *swordfish_keypad_info[] = { - &swordfish_matrix_info.info -}; - -static struct gpio_event_platform_data swordfish_keypad_data = { - .name = "swordfish_keypad", - .info = swordfish_keypad_info, - .info_count = ARRAY_SIZE(swordfish_keypad_info) -}; - -static struct platform_device swordfish_keypad_device = { - .name = GPIO_EVENT_DEV_NAME, - .id = -1, - .dev = { - .platform_data = &swordfish_keypad_data, - }, -}; - -static int __init swordfish_init_keypad(void) -{ - if (!machine_is_swordfish()) - return 0; - if (swordfish_ffa) - swordfish_matrix_info.keymap = swordfish_keymap_ffa; - return platform_device_register(&swordfish_keypad_device); -} - -device_initcall(swordfish_init_keypad); diff --git a/arch/arm/mach-msm/board-swordfish-mmc.c b/arch/arm/mach-msm/board-swordfish-mmc.c deleted file mode 100644 index e4a2a64df0d0..000000000000 --- a/arch/arm/mach-msm/board-swordfish-mmc.c +++ /dev/null @@ -1,263 +0,0 @@ -/* linux/arch/arm/mach-msm/board-swordfish-mmc.c - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include "devices.h" - -#define FPGA_BASE 0x70000000 -#define FPGA_SDIO_STATUS 0x280 - -static void __iomem *fpga_base; - -#define DEBUG_SWORDFISH_MMC 1 - -extern int msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat, - unsigned int stat_irq, unsigned long stat_irq_flags); - -static int config_gpio_table(unsigned *table, int len, int enable) -{ - int n; - int rc = 0; - - for (n = 0; n < len; n++) { - unsigned dis = !enable; - unsigned id = table[n]; - - if (msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, &dis)) { - pr_err("%s: id=0x%08x dis=%d\n", __func__, table[n], - dis); - rc = -1; - } - } - - return rc; -} - -static unsigned sdc1_gpio_table[] = { - PCOM_GPIO_CFG(51, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(52, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(53, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(54, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(55, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(56, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), -}; - -static unsigned sdc2_gpio_table[] = { - PCOM_GPIO_CFG(62, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), - PCOM_GPIO_CFG(63, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(64, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(65, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(66, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(67, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), -}; - -static unsigned sdc3_gpio_table[] = { - PCOM_GPIO_CFG(88, 1, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), - PCOM_GPIO_CFG(89, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(90, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(91, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(92, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(93, 1, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), -}; - -static unsigned sdc4_gpio_table[] = { - PCOM_GPIO_CFG(142, 3, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), - PCOM_GPIO_CFG(143, 3, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(144, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(145, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(146, 3, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), - PCOM_GPIO_CFG(147, 3, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), -}; - -struct sdc_info { - unsigned *table; - unsigned len; -}; - -static struct sdc_info sdcc_gpio_tables[] = { - [0] = { - .table = sdc1_gpio_table, - .len = ARRAY_SIZE(sdc1_gpio_table), - }, - [1] = { - .table = sdc2_gpio_table, - .len = ARRAY_SIZE(sdc2_gpio_table), - }, - [2] = { - .table = sdc3_gpio_table, - .len = ARRAY_SIZE(sdc3_gpio_table), - }, - [3] = { - .table = sdc4_gpio_table, - .len = ARRAY_SIZE(sdc4_gpio_table), - }, -}; - -static int swordfish_sdcc_setup_gpio(int dev_id, unsigned enable) -{ - struct sdc_info *info; - - if (dev_id < 1 || dev_id > 4) - return -1; - - info = &sdcc_gpio_tables[dev_id - 1]; - return config_gpio_table(info->table, info->len, enable); -} - -struct mmc_vdd_xlat { - int mask; - int level; -}; - -static struct mmc_vdd_xlat mmc_vdd_table[] = { - { MMC_VDD_165_195, 1800 }, - { MMC_VDD_20_21, 2050 }, - { MMC_VDD_21_22, 2150 }, - { MMC_VDD_22_23, 2250 }, - { MMC_VDD_23_24, 2350 }, - { MMC_VDD_24_25, 2450 }, - { MMC_VDD_25_26, 2550 }, - { MMC_VDD_26_27, 2650 }, - { MMC_VDD_27_28, 2750 }, - { MMC_VDD_28_29, 2850 }, - { MMC_VDD_29_30, 2950 }, -}; - -static struct vreg *vreg_sdcc; -static unsigned int vreg_sdcc_enabled; -static unsigned int sdcc_vdd = 0xffffffff; - -static uint32_t sdcc_translate_vdd(struct device *dev, unsigned int vdd) -{ - int i; - int rc = 0; - struct platform_device *pdev; - - pdev = container_of(dev, struct platform_device, dev); - BUG_ON(!vreg_sdcc); - - if (vdd == sdcc_vdd) - return 0; - - sdcc_vdd = vdd; - - /* enable/disable the signals to the slot */ - swordfish_sdcc_setup_gpio(pdev->id, !!vdd); - - /* power down */ - if (vdd == 0) { -#if DEBUG_SWORDFISH_MMC - pr_info("%s: disable sdcc power\n", __func__); -#endif - vreg_disable(vreg_sdcc); - vreg_sdcc_enabled = 0; - return 0; - } - - if (!vreg_sdcc_enabled) { - rc = vreg_enable(vreg_sdcc); - if (rc) - pr_err("%s: Error enabling vreg (%d)\n", __func__, rc); - vreg_sdcc_enabled = 1; - } - - for (i = 0; i < ARRAY_SIZE(mmc_vdd_table); i++) { - if (mmc_vdd_table[i].mask != (1 << vdd)) - continue; -#if DEBUG_SWORDFISH_MMC - pr_info("%s: Setting level to %u\n", __func__, - mmc_vdd_table[i].level); -#endif - rc = vreg_set_level(vreg_sdcc, mmc_vdd_table[i].level); - if (rc) - pr_err("%s: Error setting vreg level (%d)\n", __func__, rc); - return 0; - } - - pr_err("%s: Invalid VDD %d specified\n", __func__, vdd); - return 0; -} - -static unsigned int swordfish_sdcc_slot_status (struct device *dev) -{ - struct platform_device *pdev; - uint32_t sdcc_stat; - - pdev = container_of(dev, struct platform_device, dev); - - sdcc_stat = readl(fpga_base + FPGA_SDIO_STATUS); - - /* bit 0 - sdcc1 crd_det - * bit 1 - sdcc1 wr_prt - * bit 2 - sdcc2 crd_det - * bit 3 - sdcc2 wr_prt - * etc... - */ - - /* crd_det is active low */ - return !(sdcc_stat & (1 << ((pdev->id - 1) << 1))); -} - -#define SWORDFISH_MMC_VDD (MMC_VDD_165_195 | MMC_VDD_20_21 | MMC_VDD_21_22 \ - | MMC_VDD_22_23 | MMC_VDD_23_24 | MMC_VDD_24_25 \ - | MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 \ - | MMC_VDD_28_29 | MMC_VDD_29_30) - -static struct mmc_platform_data swordfish_sdcc_data = { - .ocr_mask = SWORDFISH_MMC_VDD/*MMC_VDD_27_28 | MMC_VDD_28_29*/, - .status = swordfish_sdcc_slot_status, - .translate_vdd = sdcc_translate_vdd, -}; - -int __init swordfish_init_mmc(void) -{ - vreg_sdcc_enabled = 0; - vreg_sdcc = vreg_get(NULL, "gp5"); - if (IS_ERR(vreg_sdcc)) { - pr_err("%s: vreg get failed (%ld)\n", - __func__, PTR_ERR(vreg_sdcc)); - return PTR_ERR(vreg_sdcc); - } - - fpga_base = ioremap(FPGA_BASE, SZ_4K); - if (!fpga_base) { - pr_err("%s: Can't ioremap FPGA base address (0x%08x)\n", - __func__, FPGA_BASE); - vreg_put(vreg_sdcc); - return -EIO; - } - - msm_add_sdcc(1, &swordfish_sdcc_data, 0, 0); - msm_add_sdcc(4, &swordfish_sdcc_data, 0, 0); - - return 0; -} - diff --git a/arch/arm/mach-msm/board-swordfish-panel.c b/arch/arm/mach-msm/board-swordfish-panel.c deleted file mode 100644 index cf5f3f62b767..000000000000 --- a/arch/arm/mach-msm/board-swordfish-panel.c +++ /dev/null @@ -1,116 +0,0 @@ -/* linux/arch/arm/mach-msm/board-swordfish-panel.c - * - * Copyright (c) 2009 Google Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * Author: Dima Zavin - */ - -#include -#include -#include -#include - -#include -#include - -#include - -#include "board-swordfish.h" -#include "devices.h" - -#define CLK_NS_TO_RATE(ns) (1000000000UL / (ns)) - -int swordfish_panel_blank(struct msm_lcdc_panel_ops *ops) -{ - /* TODO: Turn backlight off? */ - return 0; -} - -int swordfish_panel_unblank(struct msm_lcdc_panel_ops *ops) -{ - /* TODO: Turn backlight on? */ - return 0; -} - -int swordfish_panel_init(struct msm_lcdc_panel_ops *ops) -{ - return 0; -} - -static struct resource resources_msm_fb[] = { - { - .start = MSM_FB_BASE, - .end = MSM_FB_BASE + MSM_FB_SIZE, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_lcdc_timing swordfish_lcdc_timing = { - .clk_rate = CLK_NS_TO_RATE(26), - .hsync_pulse_width = 60, - .hsync_back_porch = 81, - .hsync_front_porch = 81, - .hsync_skew = 0, - .vsync_pulse_width = 2, - .vsync_back_porch = 20, - .vsync_front_porch = 27, - .vsync_act_low = 0, - .hsync_act_low = 0, - .den_act_low = 0, -}; - -static struct msm_fb_data swordfish_lcdc_fb_data = { - .xres = 800, - .yres = 480, - .width = 94, - .height = 57, - .output_format = 0, -}; - -static struct msm_lcdc_panel_ops swordfish_lcdc_panel_ops = { - .init = swordfish_panel_init, - .blank = swordfish_panel_blank, - .unblank = swordfish_panel_unblank, -}; - -static struct msm_lcdc_platform_data swordfish_lcdc_platform_data = { - .panel_ops = &swordfish_lcdc_panel_ops, - .timing = &swordfish_lcdc_timing, - .fb_id = 0, - .fb_data = &swordfish_lcdc_fb_data, - .fb_resource = &resources_msm_fb[0], -}; - -static struct platform_device swordfish_lcdc_device = { - .name = "msm_mdp_lcdc", - .id = -1, - .dev = { - .platform_data = &swordfish_lcdc_platform_data, - }, -}; - -int __init swordfish_init_panel(void) -{ - int rc; - if (!machine_is_swordfish()) - return 0; - - if ((rc = platform_device_register(&msm_device_mdp)) != 0) - return rc; - - if ((rc = platform_device_register(&swordfish_lcdc_device)) != 0) - return rc; - - return 0; -} - -device_initcall(swordfish_init_panel); diff --git a/arch/arm/mach-msm/board-swordfish.c b/arch/arm/mach-msm/board-swordfish.c deleted file mode 100644 index 7262277739e8..000000000000 --- a/arch/arm/mach-msm/board-swordfish.c +++ /dev/null @@ -1,366 +0,0 @@ -/* linux/arch/arm/mach-msm/board-swordfish.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "board-swordfish.h" -#include "devices.h" - -extern int swordfish_init_mmc(void); - -static struct resource smc91x_resources[] = { - [0] = { - .start = 0x70000300, - .end = 0x70000400, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = MSM_GPIO_TO_INT(156), - .end = MSM_GPIO_TO_INT(156), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device smc91x_device = { - .name = "smc91x", - .id = 0, - .num_resources = ARRAY_SIZE(smc91x_resources), - .resource = smc91x_resources, -}; - -static int swordfish_phy_init_seq[] = { - 0x0C, 0x31, - 0x1D, 0x0D, - 0x1D, 0x10, - -1 -}; - -static void swordfish_usb_phy_reset(void) -{ - u32 id; - int ret; - - id = PCOM_CLKRGM_APPS_RESET_USB_PHY; - ret = msm_proc_comm(PCOM_CLK_REGIME_SEC_RESET_ASSERT, &id, NULL); - if (ret) { - pr_err("%s: Cannot assert (%d)\n", __func__, ret); - return; - } - - msleep(1); - - id = PCOM_CLKRGM_APPS_RESET_USB_PHY; - ret = msm_proc_comm(PCOM_CLK_REGIME_SEC_RESET_DEASSERT, &id, NULL); - if (ret) { - pr_err("%s: Cannot assert (%d)\n", __func__, ret); - return; - } -} - -static void swordfish_usb_hw_reset(bool enable) -{ - u32 id; - int ret; - u32 func; - - id = PCOM_CLKRGM_APPS_RESET_USBH; - if (enable) - func = PCOM_CLK_REGIME_SEC_RESET_ASSERT; - else - func = PCOM_CLK_REGIME_SEC_RESET_DEASSERT; - ret = msm_proc_comm(func, &id, NULL); - if (ret) - pr_err("%s: Cannot set reset to %d (%d)\n", __func__, enable, - ret); -} - - -static struct msm_hsusb_platform_data msm_hsusb_pdata = { - .phy_init_seq = swordfish_phy_init_seq, - .phy_reset = swordfish_usb_phy_reset, - .hw_reset = swordfish_usb_hw_reset, -}; - -static struct usb_mass_storage_platform_data mass_storage_pdata = { - .nluns = 1, - .vendor = "Qualcomm", - .product = "Swordfish", - .release = 0x0100, -}; - -static struct platform_device usb_mass_storage_device = { - .name = "usb_mass_storage", - .id = -1, - .dev = { - .platform_data = &mass_storage_pdata, - }, -}; - -static struct resource msm_kgsl_resources[] = { - { - .name = "kgsl_reg_memory", - .start = MSM_GPU_REG_PHYS, - .end = MSM_GPU_REG_PHYS + MSM_GPU_REG_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "kgsl_phys_memory", - .start = MSM_GPU_MEM_BASE, - .end = MSM_GPU_MEM_BASE + MSM_GPU_MEM_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_GRAPHICS, - .end = INT_GRAPHICS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_kgsl_device = { - .name = "kgsl", - .id = -1, - .resource = msm_kgsl_resources, - .num_resources = ARRAY_SIZE(msm_kgsl_resources), -}; - -static struct android_pmem_platform_data mdp_pmem_pdata = { - .name = "pmem", - .start = MSM_PMEM_MDP_BASE, - .size = MSM_PMEM_MDP_SIZE, - .no_allocator = 0, - .cached = 1, -}; - -static struct android_pmem_platform_data android_pmem_gpu0_pdata = { - .name = "pmem_gpu0", - .start = MSM_PMEM_GPU0_BASE, - .size = MSM_PMEM_GPU0_SIZE, - .no_allocator = 0, - .cached = 0, -}; - -static struct android_pmem_platform_data android_pmem_gpu1_pdata = { - .name = "pmem_gpu1", - .start = MSM_PMEM_GPU1_BASE, - .size = MSM_PMEM_GPU1_SIZE, - .no_allocator = 0, - .cached = 0, -}; - -static struct android_pmem_platform_data android_pmem_adsp_pdata = { - .name = "pmem_adsp", - .start = MSM_PMEM_ADSP_BASE, - .size = MSM_PMEM_ADSP_SIZE, - .no_allocator = 0, - .cached = 0, -}; - -static struct platform_device android_pmem_mdp_device = { - .name = "android_pmem", - .id = 0, - .dev = { - .platform_data = &mdp_pmem_pdata - }, -}; - -static struct platform_device android_pmem_adsp_device = { - .name = "android_pmem", - .id = 1, - .dev = { - .platform_data = &android_pmem_adsp_pdata, - }, -}; - -static struct platform_device android_pmem_gpu0_device = { - .name = "android_pmem", - .id = 2, - .dev = { - .platform_data = &android_pmem_gpu0_pdata, - }, -}; - -static struct platform_device android_pmem_gpu1_device = { - .name = "android_pmem", - .id = 3, - .dev = { - .platform_data = &android_pmem_gpu1_pdata, - }, -}; - -static char *usb_functions[] = { "usb_mass_storage" }; -static char *usb_functions_adb[] = { "usb_mass_storage", "adb" }; - -static struct android_usb_product usb_products[] = { - { - .product_id = 0x0c01, - .num_functions = ARRAY_SIZE(usb_functions), - .functions = usb_functions, - }, - { - .product_id = 0x0c02, - .num_functions = ARRAY_SIZE(usb_functions_adb), - .functions = usb_functions_adb, - }, -}; - -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x18d1, - .product_id = 0x0d01, - .version = 0x0100, - .serial_number = "42", - .product_name = "Swordfishdroid", - .manufacturer_name = "Qualcomm", - .num_products = ARRAY_SIZE(usb_products), - .products = usb_products, - .num_functions = ARRAY_SIZE(usb_functions_adb), - .functions = usb_functions_adb, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; - -static struct platform_device fish_battery_device = { - .name = "fish_battery", -}; - -static struct msm_ts_platform_data swordfish_ts_pdata = { - .min_x = 296, - .max_x = 3800, - .min_y = 296, - .max_y = 3800, - .min_press = 0, - .max_press = 256, - .inv_x = 4096, - .inv_y = 4096, -}; - -static struct platform_device *devices[] __initdata = { -#if !defined(CONFIG_MSM_SERIAL_DEBUGGER) - &msm_device_uart3, -#endif - &msm_device_smd, - &msm_device_dmov, - &msm_device_nand, - &msm_device_hsusb, - &usb_mass_storage_device, - &android_usb_device, - &fish_battery_device, - &smc91x_device, - &msm_device_touchscreen, - &android_pmem_mdp_device, - &android_pmem_adsp_device, - &android_pmem_gpu0_device, - &android_pmem_gpu1_device, - &msm_kgsl_device, -}; - -extern struct sys_timer msm_timer; - -static struct msm_acpu_clock_platform_data swordfish_clock_data = { - .acpu_switch_time_us = 20, - .max_speed_delta_khz = 256000, - .vdd_switch_time_us = 62, - .power_collapse_khz = 128000000, - .wait_for_irq_khz = 128000000, -}; - -void msm_serial_debug_init(unsigned int base, int irq, - struct device *clk_device, int signal_irq); - -static void __init swordfish_init(void) -{ - int rc; - - msm_acpu_clock_init(&swordfish_clock_data); -#if defined(CONFIG_MSM_SERIAL_DEBUGGER) - msm_serial_debug_init(MSM_UART3_PHYS, INT_UART3, - &msm_device_uart3.dev, 1); -#endif - msm_device_hsusb.dev.platform_data = &msm_hsusb_pdata; - msm_device_touchscreen.dev.platform_data = &swordfish_ts_pdata; - platform_add_devices(devices, ARRAY_SIZE(devices)); - msm_hsusb_set_vbus_state(1); - rc = swordfish_init_mmc(); - if (rc) - pr_crit("%s: MMC init failure (%d)\n", __func__, rc); -} - -static void __init swordfish_fixup(struct machine_desc *desc, struct tag *tags, - char **cmdline, struct meminfo *mi) -{ - mi->nr_banks = 1; - mi->bank[0].start = PHYS_OFFSET; - mi->bank[0].node = PHYS_TO_NID(PHYS_OFFSET); - mi->bank[0].size = (101*1024*1024); -} - -static void __init swordfish_map_io(void) -{ - msm_map_qsd8x50_io(); - msm_clock_init(msm_clocks_8x50, msm_num_clocks_8x50); -} - -MACHINE_START(SWORDFISH, "Swordfish Board (QCT SURF8250)") -#ifdef CONFIG_MSM_DEBUG_UART - .phys_io = MSM_DEBUG_UART_PHYS, - .io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc, -#endif - .atag_offset = 0x100, - .fixup = swordfish_fixup, - .map_io = swordfish_map_io, - .init_irq = msm_init_irq, - .init_machine = swordfish_init, - .timer = &msm_timer, -MACHINE_END - -MACHINE_START(QSD8X50_FFA, "qsd8x50 FFA Board (QCT FFA8250)") -#ifdef CONFIG_MSM_DEBUG_UART - .phys_io = MSM_DEBUG_UART_PHYS, - .io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc, -#endif - .atag_offset = 0x100, - .fixup = swordfish_fixup, - .map_io = swordfish_map_io, - .init_irq = msm_init_irq, - .init_machine = swordfish_init, - .timer = &msm_timer, -MACHINE_END diff --git a/arch/arm/mach-msm/board-swordfish.h b/arch/arm/mach-msm/board-swordfish.h deleted file mode 100644 index b9ea54f680db..000000000000 --- a/arch/arm/mach-msm/board-swordfish.h +++ /dev/null @@ -1,48 +0,0 @@ -/* arch/arm/mach-msm/board-swordfish.h - * - * Copyright (C) 2009 Google Inc. - * Author: Dima Zavin - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. -*/ - -#ifndef __ARCH_ARM_MACH_MSM_BOARD_SWORDFISH_H -#define __ARCH_ARM_MACH_MSM_BOARD_SWORDFISH_H - -#include - -#define MSM_SMI_BASE 0x02B00000 -#define MSM_SMI_SIZE 0x01500000 - -#define MSM_PMEM_MDP_BASE 0x03000000 -#define MSM_PMEM_MDP_SIZE 0x01000000 - -#define MSM_EBI1_BASE 0x20000000 -#define MSM_EBI1_SIZE 0x0E000000 - -#define MSM_PMEM_ADSP_BASE 0x2A300000 -#define MSM_PMEM_ADSP_SIZE 0x02000000 - -#define MSM_PMEM_GPU1_BASE 0x2C300000 -#define MSM_PMEM_GPU1_SIZE 0x01400000 - -#define MSM_PMEM_GPU0_BASE 0x2D700000 -#define MSM_PMEM_GPU0_SIZE 0x00400000 - -#define MSM_GPU_MEM_BASE 0x2DB00000 -#define MSM_GPU_MEM_SIZE 0x00200000 - -#define MSM_RAM_CONSOLE_BASE 0x2DD00000 -#define MSM_RAM_CONSOLE_SIZE 0x00040000 - -#define MSM_FB_BASE 0x2DE00000 -#define MSM_FB_SIZE 0x00200000 - -#endif /* __ARCH_ARM_MACH_MSM_BOARD_SWORDFISH_H */ diff --git a/arch/arm/mach-msm/board-trout-gpio.c b/arch/arm/mach-msm/board-trout-gpio.c deleted file mode 100644 index 87e1d01edecc..000000000000 --- a/arch/arm/mach-msm/board-trout-gpio.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * linux/arch/arm/mach-msm/gpio.c - * - * Copyright (C) 2005 HP Labs - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2009 Pavel Machek - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#include -#include -#include -#include -#include -#include - -#include "board-trout.h" - -static uint8_t trout_int_mask[2] = { - [0] = 0xff, /* mask all interrupts */ - [1] = 0xff, -}; -static uint8_t trout_sleep_int_mask[] = { - [0] = 0xff, - [1] = 0xff, -}; - -struct msm_gpio_chip { - struct gpio_chip chip; - void __iomem *reg; /* Base of register bank */ - u8 shadow; -}; - -#define to_msm_gpio_chip(c) container_of(c, struct msm_gpio_chip, chip) - -static int msm_gpiolib_get(struct gpio_chip *chip, unsigned offset) -{ - struct msm_gpio_chip *msm_gpio = to_msm_gpio_chip(chip); - unsigned mask = 1 << offset; - - return !!(readb(msm_gpio->reg) & mask); -} - -static void msm_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val) -{ - struct msm_gpio_chip *msm_gpio = to_msm_gpio_chip(chip); - unsigned mask = 1 << offset; - - if (val) - msm_gpio->shadow |= mask; - else - msm_gpio->shadow &= ~mask; - - writeb(msm_gpio->shadow, msm_gpio->reg); -} - -static int msm_gpiolib_direction_input(struct gpio_chip *chip, - unsigned offset) -{ - msm_gpiolib_set(chip, offset, 0); - return 0; -} - -static int msm_gpiolib_direction_output(struct gpio_chip *chip, - unsigned offset, int val) -{ - msm_gpiolib_set(chip, offset, val); - return 0; -} - -static int trout_gpio_to_irq(struct gpio_chip *chip, unsigned offset) -{ - return TROUT_GPIO_TO_INT(offset + chip->base); -} - -#define TROUT_GPIO_BANK(name, reg_num, base_gpio, shadow_val) \ - { \ - .chip = { \ - .label = name, \ - .direction_input = msm_gpiolib_direction_input,\ - .direction_output = msm_gpiolib_direction_output, \ - .get = msm_gpiolib_get, \ - .set = msm_gpiolib_set, \ - .to_irq = trout_gpio_to_irq, \ - .base = base_gpio, \ - .ngpio = 8, \ - }, \ - .reg = (void *) reg_num + TROUT_CPLD_BASE, \ - .shadow = shadow_val, \ - } - -static struct msm_gpio_chip msm_gpio_banks[] = { -#if defined(CONFIG_MSM_DEBUG_UART1) - /* H2W pins <-> UART1 */ - TROUT_GPIO_BANK("MISC2", 0x00, TROUT_GPIO_MISC2_BASE, 0x40), -#else - /* H2W pins <-> UART3, Bluetooth <-> UART1 */ - TROUT_GPIO_BANK("MISC2", 0x00, TROUT_GPIO_MISC2_BASE, 0x80), -#endif - /* I2C pull */ - TROUT_GPIO_BANK("MISC3", 0x02, TROUT_GPIO_MISC3_BASE, 0x04), - TROUT_GPIO_BANK("MISC4", 0x04, TROUT_GPIO_MISC4_BASE, 0), - /* mmdi 32k en */ - TROUT_GPIO_BANK("MISC5", 0x06, TROUT_GPIO_MISC5_BASE, 0x04), - TROUT_GPIO_BANK("INT2", 0x08, TROUT_GPIO_INT2_BASE, 0), - TROUT_GPIO_BANK("MISC1", 0x0a, TROUT_GPIO_MISC1_BASE, 0), - TROUT_GPIO_BANK("VIRTUAL", 0x12, TROUT_GPIO_VIRTUAL_BASE, 0), -}; - -static void trout_gpio_irq_ack(struct irq_data *d) -{ - int bank = TROUT_INT_TO_BANK(d->irq); - uint8_t mask = TROUT_INT_TO_MASK(d->irq); - int reg = TROUT_BANK_TO_STAT_REG(bank); - /*printk(KERN_INFO "trout_gpio_irq_ack irq %d\n", d->irq);*/ - writeb(mask, TROUT_CPLD_BASE + reg); -} - -static void trout_gpio_irq_mask(struct irq_data *d) -{ - unsigned long flags; - uint8_t reg_val; - int bank = TROUT_INT_TO_BANK(d->irq); - uint8_t mask = TROUT_INT_TO_MASK(d->irq); - int reg = TROUT_BANK_TO_MASK_REG(bank); - - local_irq_save(flags); - reg_val = trout_int_mask[bank] |= mask; - /*printk(KERN_INFO "trout_gpio_irq_mask irq %d => %d:%02x\n", - d->irq, bank, reg_val);*/ - writeb(reg_val, TROUT_CPLD_BASE + reg); - local_irq_restore(flags); -} - -static void trout_gpio_irq_unmask(struct irq_data *d) -{ - unsigned long flags; - uint8_t reg_val; - int bank = TROUT_INT_TO_BANK(d->irq); - uint8_t mask = TROUT_INT_TO_MASK(d->irq); - int reg = TROUT_BANK_TO_MASK_REG(bank); - - local_irq_save(flags); - reg_val = trout_int_mask[bank] &= ~mask; - /*printk(KERN_INFO "trout_gpio_irq_unmask irq %d => %d:%02x\n", - d->irq, bank, reg_val);*/ - writeb(reg_val, TROUT_CPLD_BASE + reg); - local_irq_restore(flags); -} - -int trout_gpio_irq_set_wake(struct irq_data *d, unsigned int on) -{ - unsigned long flags; - int bank = TROUT_INT_TO_BANK(d->irq); - uint8_t mask = TROUT_INT_TO_MASK(d->irq); - - local_irq_save(flags); - if(on) - trout_sleep_int_mask[bank] &= ~mask; - else - trout_sleep_int_mask[bank] |= mask; - local_irq_restore(flags); - return 0; -} - -static void trout_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) -{ - int j, m; - unsigned v; - int bank; - int stat_reg; - int int_base = TROUT_INT_START; - uint8_t int_mask; - - for (bank = 0; bank < 2; bank++) { - stat_reg = TROUT_BANK_TO_STAT_REG(bank); - v = readb(TROUT_CPLD_BASE + stat_reg); - int_mask = trout_int_mask[bank]; - if (v & int_mask) { - writeb(v & int_mask, TROUT_CPLD_BASE + stat_reg); - printk(KERN_ERR "trout_gpio_irq_handler: got masked " - "interrupt: %d:%02x\n", bank, v & int_mask); - } - v &= ~int_mask; - while (v) { - m = v & -v; - j = fls(m) - 1; - /*printk(KERN_INFO "msm_gpio_irq_handler %d:%02x %02x b" - "it %d irq %d\n", bank, v, m, j, int_base + j);*/ - v &= ~m; - generic_handle_irq(int_base + j); - } - int_base += TROUT_INT_BANK0_COUNT; - } - desc->irq_data.chip->irq_ack(&desc->irq_data); -} - -static struct irq_chip trout_gpio_irq_chip = { - .name = "troutgpio", - .irq_ack = trout_gpio_irq_ack, - .irq_mask = trout_gpio_irq_mask, - .irq_unmask = trout_gpio_irq_unmask, - .irq_set_wake = trout_gpio_irq_set_wake, -}; - -/* - * Called from the processor-specific init to enable GPIO pin support. - */ -int __init trout_init_gpio(void) -{ - int i; - for(i = TROUT_INT_START; i <= TROUT_INT_END; i++) { - irq_set_chip_and_handler(i, &trout_gpio_irq_chip, - handle_edge_irq); - set_irq_flags(i, IRQF_VALID); - } - - for (i = 0; i < ARRAY_SIZE(msm_gpio_banks); i++) - gpiochip_add(&msm_gpio_banks[i].chip); - - irq_set_irq_type(MSM_GPIO_TO_INT(17), IRQF_TRIGGER_HIGH); - irq_set_chained_handler(MSM_GPIO_TO_INT(17), trout_gpio_irq_handler); - irq_set_irq_wake(MSM_GPIO_TO_INT(17), 1); - - return 0; -} - -postcore_initcall(trout_init_gpio); - diff --git a/arch/arm/mach-msm/board-trout-keypad.c b/arch/arm/mach-msm/board-trout-keypad.c deleted file mode 100644 index 0299d0686de9..000000000000 --- a/arch/arm/mach-msm/board-trout-keypad.c +++ /dev/null @@ -1,345 +0,0 @@ -/* arch/arm/mach-msm/board-trout-keypad.c - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include "board-trout.h" - -static char *keycaps = "--qwerty"; -#undef MODULE_PARAM_PREFIX -#define MODULE_PARAM_PREFIX "board_trout." -module_param_named(keycaps, keycaps, charp, 0); - - -static unsigned int trout_col_gpios[] = { 35, 34, 33, 32, 31, 23, 30, 78 }; -static unsigned int trout_row_gpios[] = { 42, 41, 40, 39, 38, 37, 36 }; - -#define KEYMAP_INDEX(col, row) ((col)*ARRAY_SIZE(trout_row_gpios) + (row)) - -static const unsigned short trout_keymap[ARRAY_SIZE(trout_col_gpios) * ARRAY_SIZE(trout_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_BACK, - [KEYMAP_INDEX(0, 1)] = KEY_HOME, -// [KEYMAP_INDEX(0, 2)] = KEY_, - [KEYMAP_INDEX(0, 3)] = KEY_BACKSPACE, - [KEYMAP_INDEX(0, 4)] = KEY_ENTER, - [KEYMAP_INDEX(0, 5)] = KEY_RIGHTALT, - [KEYMAP_INDEX(0, 6)] = KEY_P, - - [KEYMAP_INDEX(1, 0)] = KEY_MENU, -// [KEYMAP_INDEX(1, 0)] = 229, // SOFT1 - [KEYMAP_INDEX(1, 1)] = KEY_SEND, - [KEYMAP_INDEX(1, 2)] = KEY_END, - [KEYMAP_INDEX(1, 3)] = KEY_LEFTALT, - [KEYMAP_INDEX(1, 4)] = KEY_A, - [KEYMAP_INDEX(1, 5)] = KEY_LEFTSHIFT, - [KEYMAP_INDEX(1, 6)] = KEY_Q, - - [KEYMAP_INDEX(2, 0)] = KEY_U, - [KEYMAP_INDEX(2, 1)] = KEY_7, - [KEYMAP_INDEX(2, 2)] = KEY_K, - [KEYMAP_INDEX(2, 3)] = KEY_J, - [KEYMAP_INDEX(2, 4)] = KEY_M, - [KEYMAP_INDEX(2, 5)] = KEY_SLASH, - [KEYMAP_INDEX(2, 6)] = KEY_8, - - [KEYMAP_INDEX(3, 0)] = KEY_5, - [KEYMAP_INDEX(3, 1)] = KEY_6, - [KEYMAP_INDEX(3, 2)] = KEY_B, - [KEYMAP_INDEX(3, 3)] = KEY_H, - [KEYMAP_INDEX(3, 4)] = KEY_N, - [KEYMAP_INDEX(3, 5)] = KEY_SPACE, - [KEYMAP_INDEX(3, 6)] = KEY_Y, - - [KEYMAP_INDEX(4, 0)] = KEY_4, - [KEYMAP_INDEX(4, 1)] = KEY_R, - [KEYMAP_INDEX(4, 2)] = KEY_V, - [KEYMAP_INDEX(4, 3)] = KEY_G, - [KEYMAP_INDEX(4, 4)] = KEY_C, - //[KEYMAP_INDEX(4, 5)] = KEY_, - [KEYMAP_INDEX(4, 6)] = KEY_T, - - [KEYMAP_INDEX(5, 0)] = KEY_2, - [KEYMAP_INDEX(5, 1)] = KEY_W, - [KEYMAP_INDEX(5, 2)] = KEY_COMPOSE, - [KEYMAP_INDEX(5, 3)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(5, 4)] = KEY_S, - [KEYMAP_INDEX(5, 5)] = KEY_Z, - [KEYMAP_INDEX(5, 6)] = KEY_1, - - [KEYMAP_INDEX(6, 0)] = KEY_I, - [KEYMAP_INDEX(6, 1)] = KEY_0, - [KEYMAP_INDEX(6, 2)] = KEY_O, - [KEYMAP_INDEX(6, 3)] = KEY_L, - [KEYMAP_INDEX(6, 4)] = KEY_DOT, - [KEYMAP_INDEX(6, 5)] = KEY_COMMA, - [KEYMAP_INDEX(6, 6)] = KEY_9, - - [KEYMAP_INDEX(7, 0)] = KEY_3, - [KEYMAP_INDEX(7, 1)] = KEY_E, - [KEYMAP_INDEX(7, 2)] = KEY_EMAIL, // @ - [KEYMAP_INDEX(7, 3)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(7, 4)] = KEY_X, - [KEYMAP_INDEX(7, 5)] = KEY_F, - [KEYMAP_INDEX(7, 6)] = KEY_D -}; - -static unsigned int trout_col_gpios_evt2[] = { 35, 34, 33, 32, 31, 23, 30, 109 }; -static unsigned int trout_row_gpios_evt2[] = { 42, 41, 40, 39, 38, 37, 36 }; - -static const unsigned short trout_keymap_evt2_1[ARRAY_SIZE(trout_col_gpios) * ARRAY_SIZE(trout_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_BACK, - [KEYMAP_INDEX(0, 1)] = KEY_HOME, -// [KEYMAP_INDEX(0, 2)] = KEY_, - [KEYMAP_INDEX(0, 3)] = KEY_BACKSPACE, - [KEYMAP_INDEX(0, 4)] = KEY_ENTER, - [KEYMAP_INDEX(0, 5)] = KEY_RIGHTSHIFT, - [KEYMAP_INDEX(0, 6)] = KEY_P, - - [KEYMAP_INDEX(1, 0)] = KEY_MENU, - [KEYMAP_INDEX(1, 1)] = KEY_SEND, -// [KEYMAP_INDEX(1, 2)] = KEY_, - [KEYMAP_INDEX(1, 3)] = KEY_LEFTSHIFT, - [KEYMAP_INDEX(1, 4)] = KEY_A, - [KEYMAP_INDEX(1, 5)] = KEY_COMPOSE, - [KEYMAP_INDEX(1, 6)] = KEY_Q, - - [KEYMAP_INDEX(2, 0)] = KEY_U, - [KEYMAP_INDEX(2, 1)] = KEY_7, - [KEYMAP_INDEX(2, 2)] = KEY_K, - [KEYMAP_INDEX(2, 3)] = KEY_J, - [KEYMAP_INDEX(2, 4)] = KEY_M, - [KEYMAP_INDEX(2, 5)] = KEY_SLASH, - [KEYMAP_INDEX(2, 6)] = KEY_8, - - [KEYMAP_INDEX(3, 0)] = KEY_5, - [KEYMAP_INDEX(3, 1)] = KEY_6, - [KEYMAP_INDEX(3, 2)] = KEY_B, - [KEYMAP_INDEX(3, 3)] = KEY_H, - [KEYMAP_INDEX(3, 4)] = KEY_N, - [KEYMAP_INDEX(3, 5)] = KEY_SPACE, - [KEYMAP_INDEX(3, 6)] = KEY_Y, - - [KEYMAP_INDEX(4, 0)] = KEY_4, - [KEYMAP_INDEX(4, 1)] = KEY_R, - [KEYMAP_INDEX(4, 2)] = KEY_V, - [KEYMAP_INDEX(4, 3)] = KEY_G, - [KEYMAP_INDEX(4, 4)] = KEY_C, -// [KEYMAP_INDEX(4, 5)] = KEY_, - [KEYMAP_INDEX(4, 6)] = KEY_T, - - [KEYMAP_INDEX(5, 0)] = KEY_2, - [KEYMAP_INDEX(5, 1)] = KEY_W, - [KEYMAP_INDEX(5, 2)] = KEY_LEFTALT, - [KEYMAP_INDEX(5, 3)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(5, 4)] = KEY_S, - [KEYMAP_INDEX(5, 5)] = KEY_Z, - [KEYMAP_INDEX(5, 6)] = KEY_1, - - [KEYMAP_INDEX(6, 0)] = KEY_I, - [KEYMAP_INDEX(6, 1)] = KEY_0, - [KEYMAP_INDEX(6, 2)] = KEY_O, - [KEYMAP_INDEX(6, 3)] = KEY_L, - [KEYMAP_INDEX(6, 4)] = KEY_COMMA, - [KEYMAP_INDEX(6, 5)] = KEY_DOT, - [KEYMAP_INDEX(6, 6)] = KEY_9, - - [KEYMAP_INDEX(7, 0)] = KEY_3, - [KEYMAP_INDEX(7, 1)] = KEY_E, - [KEYMAP_INDEX(7, 2)] = KEY_EMAIL, // @ - [KEYMAP_INDEX(7, 3)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(7, 4)] = KEY_X, - [KEYMAP_INDEX(7, 5)] = KEY_F, - [KEYMAP_INDEX(7, 6)] = KEY_D -}; - -static const unsigned short trout_keymap_evt2_2[ARRAY_SIZE(trout_col_gpios) * ARRAY_SIZE(trout_row_gpios)] = { - [KEYMAP_INDEX(0, 0)] = KEY_BACK, - [KEYMAP_INDEX(0, 1)] = KEY_HOME, -// [KEYMAP_INDEX(0, 2)] = KEY_, - [KEYMAP_INDEX(0, 3)] = KEY_BACKSPACE, - [KEYMAP_INDEX(0, 4)] = KEY_ENTER, - [KEYMAP_INDEX(0, 5)] = KEY_RIGHTSHIFT, - [KEYMAP_INDEX(0, 6)] = KEY_P, - - [KEYMAP_INDEX(1, 0)] = KEY_MENU, /* external menu key */ - [KEYMAP_INDEX(1, 1)] = KEY_SEND, -// [KEYMAP_INDEX(1, 2)] = KEY_, - [KEYMAP_INDEX(1, 3)] = KEY_LEFTSHIFT, - [KEYMAP_INDEX(1, 4)] = KEY_A, - [KEYMAP_INDEX(1, 5)] = KEY_F1, /* qwerty menu key */ - [KEYMAP_INDEX(1, 6)] = KEY_Q, - - [KEYMAP_INDEX(2, 0)] = KEY_U, - [KEYMAP_INDEX(2, 1)] = KEY_7, - [KEYMAP_INDEX(2, 2)] = KEY_K, - [KEYMAP_INDEX(2, 3)] = KEY_J, - [KEYMAP_INDEX(2, 4)] = KEY_M, - [KEYMAP_INDEX(2, 5)] = KEY_DOT, - [KEYMAP_INDEX(2, 6)] = KEY_8, - - [KEYMAP_INDEX(3, 0)] = KEY_5, - [KEYMAP_INDEX(3, 1)] = KEY_6, - [KEYMAP_INDEX(3, 2)] = KEY_B, - [KEYMAP_INDEX(3, 3)] = KEY_H, - [KEYMAP_INDEX(3, 4)] = KEY_N, - [KEYMAP_INDEX(3, 5)] = KEY_SPACE, - [KEYMAP_INDEX(3, 6)] = KEY_Y, - - [KEYMAP_INDEX(4, 0)] = KEY_4, - [KEYMAP_INDEX(4, 1)] = KEY_R, - [KEYMAP_INDEX(4, 2)] = KEY_V, - [KEYMAP_INDEX(4, 3)] = KEY_G, - [KEYMAP_INDEX(4, 4)] = KEY_C, - [KEYMAP_INDEX(4, 5)] = KEY_EMAIL, // @ - [KEYMAP_INDEX(4, 6)] = KEY_T, - - [KEYMAP_INDEX(5, 0)] = KEY_2, - [KEYMAP_INDEX(5, 1)] = KEY_W, - [KEYMAP_INDEX(5, 2)] = KEY_LEFTALT, - [KEYMAP_INDEX(5, 3)] = KEY_VOLUMEUP, - [KEYMAP_INDEX(5, 4)] = KEY_S, - [KEYMAP_INDEX(5, 5)] = KEY_Z, - [KEYMAP_INDEX(5, 6)] = KEY_1, - - [KEYMAP_INDEX(6, 0)] = KEY_I, - [KEYMAP_INDEX(6, 1)] = KEY_0, - [KEYMAP_INDEX(6, 2)] = KEY_O, - [KEYMAP_INDEX(6, 3)] = KEY_L, - [KEYMAP_INDEX(6, 4)] = KEY_COMMA, - [KEYMAP_INDEX(6, 5)] = KEY_RIGHTALT, - [KEYMAP_INDEX(6, 6)] = KEY_9, - - [KEYMAP_INDEX(7, 0)] = KEY_3, - [KEYMAP_INDEX(7, 1)] = KEY_E, - [KEYMAP_INDEX(7, 2)] = KEY_COMPOSE, - [KEYMAP_INDEX(7, 3)] = KEY_VOLUMEDOWN, - [KEYMAP_INDEX(7, 4)] = KEY_X, - [KEYMAP_INDEX(7, 5)] = KEY_F, - [KEYMAP_INDEX(7, 6)] = KEY_D -}; - -static struct gpio_event_matrix_info trout_keypad_matrix_info = { - .info.func = gpio_event_matrix_func, - .keymap = trout_keymap, - .output_gpios = trout_col_gpios, - .input_gpios = trout_row_gpios, - .noutputs = ARRAY_SIZE(trout_col_gpios), - .ninputs = ARRAY_SIZE(trout_row_gpios), - .settle_time.tv.nsec = 40 * NSEC_PER_USEC, - .poll_time.tv.nsec = 20 * NSEC_PER_MSEC, - .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_REMOVE_PHANTOM_KEYS |GPIOKPF_PRINT_UNMAPPED_KEYS /*| GPIOKPF_PRINT_MAPPED_KEYS*/ -}; - -static struct gpio_event_direct_entry trout_keypad_nav_map[] = { - { TROUT_POWER_KEY, KEY_POWER }, - { TROUT_GPIO_CAM_BTN_STEP1_N, KEY_CAMERA-1 }, //steal KEY_HP - { TROUT_GPIO_CAM_BTN_STEP2_N, KEY_CAMERA }, -}; - -static struct gpio_event_direct_entry trout_keypad_nav_map_evt2[] = { - { TROUT_POWER_KEY, KEY_END }, - { TROUT_GPIO_CAM_BTN_STEP1_N, KEY_CAMERA-1 }, //steal KEY_HP - { TROUT_GPIO_CAM_BTN_STEP2_N, KEY_CAMERA }, -}; - -static struct gpio_event_input_info trout_keypad_nav_info = { - .info.func = gpio_event_input_func, - .flags = 0, - .type = EV_KEY, - .keymap = trout_keypad_nav_map, - .keymap_size = ARRAY_SIZE(trout_keypad_nav_map) -}; - -static struct gpio_event_direct_entry trout_keypad_switch_map[] = { - { TROUT_GPIO_SLIDING_DET, SW_LID } -}; - -static struct gpio_event_input_info trout_keypad_switch_info = { - .info.func = gpio_event_input_func, - .flags = 0, - .type = EV_SW, - .keymap = trout_keypad_switch_map, - .keymap_size = ARRAY_SIZE(trout_keypad_switch_map) -}; - -static struct gpio_event_info *trout_keypad_info[] = { - &trout_keypad_matrix_info.info, - &trout_keypad_nav_info.info, - &trout_keypad_switch_info.info, -}; - -static struct gpio_event_platform_data trout_keypad_data = { - .name = "trout-keypad", - .info = trout_keypad_info, - .info_count = ARRAY_SIZE(trout_keypad_info) -}; - -static struct platform_device trout_keypad_device = { - .name = GPIO_EVENT_DEV_NAME, - .id = 0, - .dev = { - .platform_data = &trout_keypad_data, - }, -}; - -static int __init trout_init_keypad(void) -{ - if (!machine_is_trout()) - return 0; - - switch (system_rev) { - case 0: - /* legacy default keylayout */ - break; - case 1: - /* v1 has a new keyboard layout */ - trout_keypad_matrix_info.keymap = trout_keymap_evt2_1; - trout_keypad_matrix_info.output_gpios = trout_col_gpios_evt2; - trout_keypad_matrix_info.input_gpios = trout_row_gpios_evt2; - - /* v1 has new direct keys */ - trout_keypad_nav_info.keymap = trout_keypad_nav_map_evt2; - trout_keypad_nav_info.keymap_size = ARRAY_SIZE(trout_keypad_nav_map_evt2); - - /* userspace needs to know about these changes as well */ - trout_keypad_data.name = "trout-keypad-v2"; - break; - default: /* 2, 3, 4 currently */ - /* v2 has a new keyboard layout */ - trout_keypad_matrix_info.keymap = trout_keymap_evt2_2; - trout_keypad_matrix_info.output_gpios = trout_col_gpios_evt2; - trout_keypad_matrix_info.input_gpios = trout_row_gpios_evt2; - - /* v2 has new direct keys */ - trout_keypad_nav_info.keymap = trout_keypad_nav_map_evt2; - trout_keypad_nav_info.keymap_size = ARRAY_SIZE(trout_keypad_nav_map_evt2); - - /* userspace needs to know about these changes as well */ - if (!strcmp(keycaps, "qwertz")) { - trout_keypad_data.name = "trout-keypad-qwertz"; - } else { - trout_keypad_data.name = "trout-keypad-v3"; - } - break; - } - return platform_device_register(&trout_keypad_device); -} - -device_initcall(trout_init_keypad); - diff --git a/arch/arm/mach-msm/board-trout-mmc.c b/arch/arm/mach-msm/board-trout-mmc.c deleted file mode 100644 index 6b2aac57a5b2..000000000000 --- a/arch/arm/mach-msm/board-trout-mmc.c +++ /dev/null @@ -1,184 +0,0 @@ -/* linux/arch/arm/mach-msm/board-trout-mmc.c -** Author: Brian Swetland -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include "devices.h" - -#include "board-trout.h" - -#define DEBUG_SDSLOT_VDD 1 - -/* ---- COMMON ---- */ -static void config_gpio_table(uint32_t *table, int len) -{ - int n; - unsigned id; - for(n = 0; n < len; n++) { - id = table[n]; - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - -/* ---- SDCARD ---- */ - -static uint32_t sdcard_on_gpio_table[] = { - PCOM_GPIO_CFG(62, 2, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_8MA), /* CLK */ - PCOM_GPIO_CFG(63, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* CMD */ - PCOM_GPIO_CFG(64, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_8MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 2, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_4MA), /* DAT0 */ -}; - -static uint32_t sdcard_off_gpio_table[] = { - PCOM_GPIO_CFG(62, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CLK */ - PCOM_GPIO_CFG(63, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* CMD */ - PCOM_GPIO_CFG(64, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT3 */ - PCOM_GPIO_CFG(65, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT2 */ - PCOM_GPIO_CFG(66, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT1 */ - PCOM_GPIO_CFG(67, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_4MA), /* DAT0 */ -}; - -static uint opt_disable_sdcard; - -static int __init trout_disablesdcard_setup(char *str) -{ - int cal = simple_strtol(str, NULL, 0); - - opt_disable_sdcard = cal; - return 1; -} - -__setup("board_trout.disable_sdcard=", trout_disablesdcard_setup); - -static struct vreg *vreg_sdslot; /* SD slot power */ - -struct mmc_vdd_xlat { - int mask; - int level; -}; - -static struct mmc_vdd_xlat mmc_vdd_table[] = { - { MMC_VDD_165_195, 1800 }, - { MMC_VDD_20_21, 2050 }, - { MMC_VDD_21_22, 2150 }, - { MMC_VDD_22_23, 2250 }, - { MMC_VDD_23_24, 2350 }, - { MMC_VDD_24_25, 2450 }, - { MMC_VDD_25_26, 2550 }, - { MMC_VDD_26_27, 2650 }, - { MMC_VDD_27_28, 2750 }, - { MMC_VDD_28_29, 2850 }, - { MMC_VDD_29_30, 2950 }, -}; - -static unsigned int sdslot_vdd = 0xffffffff; -static unsigned int sdslot_vreg_enabled; - -static uint32_t trout_sdslot_switchvdd(struct device *dev, unsigned int vdd) -{ - int i, rc; - - BUG_ON(!vreg_sdslot); - - if (vdd == sdslot_vdd) - return 0; - - sdslot_vdd = vdd; - - if (vdd == 0) { -#if DEBUG_SDSLOT_VDD - printk("%s: Disabling SD slot power\n", __func__); -#endif - config_gpio_table(sdcard_off_gpio_table, - ARRAY_SIZE(sdcard_off_gpio_table)); - vreg_disable(vreg_sdslot); - sdslot_vreg_enabled = 0; - return 0; - } - - if (!sdslot_vreg_enabled) { - rc = vreg_enable(vreg_sdslot); - if (rc) { - printk(KERN_ERR "%s: Error enabling vreg (%d)\n", - __func__, rc); - } - config_gpio_table(sdcard_on_gpio_table, - ARRAY_SIZE(sdcard_on_gpio_table)); - sdslot_vreg_enabled = 1; - } - - for (i = 0; i < ARRAY_SIZE(mmc_vdd_table); i++) { - if (mmc_vdd_table[i].mask == (1 << vdd)) { -#if DEBUG_SDSLOT_VDD - printk("%s: Setting level to %u\n", - __func__, mmc_vdd_table[i].level); -#endif - rc = vreg_set_level(vreg_sdslot, - mmc_vdd_table[i].level); - if (rc) { - printk(KERN_ERR - "%s: Error setting vreg level (%d)\n", - __func__, rc); - } - return 0; - } - } - - printk(KERN_ERR "%s: Invalid VDD %d specified\n", __func__, vdd); - return 0; -} - -static unsigned int trout_sdslot_status(struct device *dev) -{ - unsigned int status; - - status = (unsigned int) gpio_get_value(TROUT_GPIO_SDMC_CD_N); - return (!status); -} - -#define TROUT_MMC_VDD MMC_VDD_165_195 | MMC_VDD_20_21 | MMC_VDD_21_22 \ - | MMC_VDD_22_23 | MMC_VDD_23_24 | MMC_VDD_24_25 \ - | MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 \ - | MMC_VDD_28_29 | MMC_VDD_29_30 - -static struct msm_mmc_platform_data trout_sdslot_data = { - .ocr_mask = TROUT_MMC_VDD, - .status = trout_sdslot_status, - .translate_vdd = trout_sdslot_switchvdd, -}; - -int __init trout_init_mmc(unsigned int sys_rev) -{ - sdslot_vreg_enabled = 0; - - vreg_sdslot = vreg_get(0, "gp6"); - if (IS_ERR(vreg_sdslot)) - return PTR_ERR(vreg_sdslot); - - irq_set_irq_wake(TROUT_GPIO_TO_INT(TROUT_GPIO_SDMC_CD_N), 1); - - if (!opt_disable_sdcard) - msm_add_sdcc(2, &trout_sdslot_data, - TROUT_GPIO_TO_INT(TROUT_GPIO_SDMC_CD_N), 0); - else - printk(KERN_INFO "trout: SD-Card interface disabled\n"); - return 0; -} - diff --git a/arch/arm/mach-msm/board-trout-panel.c b/arch/arm/mach-msm/board-trout-panel.c deleted file mode 100644 index 3d59bf7330c5..000000000000 --- a/arch/arm/mach-msm/board-trout-panel.c +++ /dev/null @@ -1,297 +0,0 @@ -/* linux/arch/arm/mach-msm/board-trout-mddi.c -** Author: Brian Swetland -*/ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "board-trout.h" -#include "devices.h" - -#define TROUT_DEFAULT_BACKLIGHT_BRIGHTNESS 255 - -#define MDDI_CLIENT_CORE_BASE 0x108000 -#define LCD_CONTROL_BLOCK_BASE 0x110000 -#define SPI_BLOCK_BASE 0x120000 -#define I2C_BLOCK_BASE 0x130000 -#define PWM_BLOCK_BASE 0x140000 -#define GPIO_BLOCK_BASE 0x150000 -#define SYSTEM_BLOCK1_BASE 0x160000 -#define SYSTEM_BLOCK2_BASE 0x170000 - - -#define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) -#define SYSCLKENA (MDDI_CLIENT_CORE_BASE|0x2C) -#define PWM0OFF (PWM_BLOCK_BASE|0x1C) - -#define V_VDDE2E_VDD2_GPIO 0 -#define MDDI_RST_N 82 - -#define MDDICAP0 (MDDI_CLIENT_CORE_BASE|0x00) -#define MDDICAP1 (MDDI_CLIENT_CORE_BASE|0x04) -#define MDDICAP2 (MDDI_CLIENT_CORE_BASE|0x08) -#define MDDICAP3 (MDDI_CLIENT_CORE_BASE|0x0C) -#define MDCAPCHG (MDDI_CLIENT_CORE_BASE|0x10) -#define MDCRCERC (MDDI_CLIENT_CORE_BASE|0x14) -#define TTBUSSEL (MDDI_CLIENT_CORE_BASE|0x18) -#define DPSET0 (MDDI_CLIENT_CORE_BASE|0x1C) -#define DPSET1 (MDDI_CLIENT_CORE_BASE|0x20) -#define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) -#define DPRUN (MDDI_CLIENT_CORE_BASE|0x28) -#define SYSCKENA (MDDI_CLIENT_CORE_BASE|0x2C) -#define TESTMODE (MDDI_CLIENT_CORE_BASE|0x30) -#define FIFOMONI (MDDI_CLIENT_CORE_BASE|0x34) -#define INTMONI (MDDI_CLIENT_CORE_BASE|0x38) -#define MDIOBIST (MDDI_CLIENT_CORE_BASE|0x3C) -#define MDIOPSET (MDDI_CLIENT_CORE_BASE|0x40) -#define BITMAP0 (MDDI_CLIENT_CORE_BASE|0x44) -#define BITMAP1 (MDDI_CLIENT_CORE_BASE|0x48) -#define BITMAP2 (MDDI_CLIENT_CORE_BASE|0x4C) -#define BITMAP3 (MDDI_CLIENT_CORE_BASE|0x50) -#define BITMAP4 (MDDI_CLIENT_CORE_BASE|0x54) - -#define SRST (LCD_CONTROL_BLOCK_BASE|0x00) -#define PORT_ENB (LCD_CONTROL_BLOCK_BASE|0x04) -#define START (LCD_CONTROL_BLOCK_BASE|0x08) -#define PORT (LCD_CONTROL_BLOCK_BASE|0x0C) -#define CMN (LCD_CONTROL_BLOCK_BASE|0x10) -#define GAMMA (LCD_CONTROL_BLOCK_BASE|0x14) -#define INTFLG (LCD_CONTROL_BLOCK_BASE|0x18) -#define INTMSK (LCD_CONTROL_BLOCK_BASE|0x1C) -#define MPLFBUF (LCD_CONTROL_BLOCK_BASE|0x20) -#define HDE_LEFT (LCD_CONTROL_BLOCK_BASE|0x24) -#define VDE_TOP (LCD_CONTROL_BLOCK_BASE|0x28) -#define PXL (LCD_CONTROL_BLOCK_BASE|0x30) -#define HCYCLE (LCD_CONTROL_BLOCK_BASE|0x34) -#define HSW (LCD_CONTROL_BLOCK_BASE|0x38) -#define HDE_START (LCD_CONTROL_BLOCK_BASE|0x3C) -#define HDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x40) -#define VCYCLE (LCD_CONTROL_BLOCK_BASE|0x44) -#define VSW (LCD_CONTROL_BLOCK_BASE|0x48) -#define VDE_START (LCD_CONTROL_BLOCK_BASE|0x4C) -#define VDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x50) -#define WAKEUP (LCD_CONTROL_BLOCK_BASE|0x54) -#define WSYN_DLY (LCD_CONTROL_BLOCK_BASE|0x58) -#define REGENB (LCD_CONTROL_BLOCK_BASE|0x5C) -#define VSYNIF (LCD_CONTROL_BLOCK_BASE|0x60) -#define WRSTB (LCD_CONTROL_BLOCK_BASE|0x64) -#define RDSTB (LCD_CONTROL_BLOCK_BASE|0x68) -#define ASY_DATA (LCD_CONTROL_BLOCK_BASE|0x6C) -#define ASY_DATB (LCD_CONTROL_BLOCK_BASE|0x70) -#define ASY_DATC (LCD_CONTROL_BLOCK_BASE|0x74) -#define ASY_DATD (LCD_CONTROL_BLOCK_BASE|0x78) -#define ASY_DATE (LCD_CONTROL_BLOCK_BASE|0x7C) -#define ASY_DATF (LCD_CONTROL_BLOCK_BASE|0x80) -#define ASY_DATG (LCD_CONTROL_BLOCK_BASE|0x84) -#define ASY_DATH (LCD_CONTROL_BLOCK_BASE|0x88) -#define ASY_CMDSET (LCD_CONTROL_BLOCK_BASE|0x8C) - -#define SSICTL (SPI_BLOCK_BASE|0x00) -#define SSITIME (SPI_BLOCK_BASE|0x04) -#define SSITX (SPI_BLOCK_BASE|0x08) -#define SSIRX (SPI_BLOCK_BASE|0x0C) -#define SSIINTC (SPI_BLOCK_BASE|0x10) -#define SSIINTS (SPI_BLOCK_BASE|0x14) -#define SSIDBG1 (SPI_BLOCK_BASE|0x18) -#define SSIDBG2 (SPI_BLOCK_BASE|0x1C) -#define SSIID (SPI_BLOCK_BASE|0x20) - -#define WKREQ (SYSTEM_BLOCK1_BASE|0x00) -#define CLKENB (SYSTEM_BLOCK1_BASE|0x04) -#define DRAMPWR (SYSTEM_BLOCK1_BASE|0x08) -#define INTMASK (SYSTEM_BLOCK1_BASE|0x0C) -#define GPIOSEL (SYSTEM_BLOCK2_BASE|0x00) - -#define GPIODATA (GPIO_BLOCK_BASE|0x00) -#define GPIODIR (GPIO_BLOCK_BASE|0x04) -#define GPIOIS (GPIO_BLOCK_BASE|0x08) -#define GPIOIBE (GPIO_BLOCK_BASE|0x0C) -#define GPIOIEV (GPIO_BLOCK_BASE|0x10) -#define GPIOIE (GPIO_BLOCK_BASE|0x14) -#define GPIORIS (GPIO_BLOCK_BASE|0x18) -#define GPIOMIS (GPIO_BLOCK_BASE|0x1C) -#define GPIOIC (GPIO_BLOCK_BASE|0x20) -#define GPIOOMS (GPIO_BLOCK_BASE|0x24) -#define GPIOPC (GPIO_BLOCK_BASE|0x28) -#define GPIOID (GPIO_BLOCK_BASE|0x30) - -#define SPI_WRITE(reg, val) \ - { SSITX, 0x00010000 | (((reg) & 0xff) << 8) | ((val) & 0xff) }, \ - { 0, 5 }, - -#define SPI_WRITE1(reg) \ - { SSITX, (reg) & 0xff }, \ - { 0, 5 }, - -struct mddi_table { - uint32_t reg; - uint32_t value; -}; -static struct mddi_table mddi_toshiba_init_table[] = { - { DPSET0, 0x09e90046 }, - { DPSET1, 0x00000118 }, - { DPSUS, 0x00000000 }, - { DPRUN, 0x00000001 }, - { 1, 14 }, /* msleep 14 */ - { SYSCKENA, 0x00000001 }, - { CLKENB, 0x0000A1EF }, /* # SYS.CLKENB # Enable clocks for each module (without DCLK , i2cCLK) */ - - { GPIODATA, 0x02000200 }, /* # GPI .GPIODATA # GPIO2(RESET_LCD_N) set to 0 , GPIO3(eDRAM_Power) set to 0 */ - { GPIODIR, 0x000030D }, /* 24D # GPI .GPIODIR # Select direction of GPIO port (0,2,3,6,9 output) */ - { GPIOSEL, 0/*0x00000173*/}, /* # SYS.GPIOSEL # GPIO port multiplexing control */ - { GPIOPC, 0x03C300C0 }, /* # GPI .GPIOPC # GPIO2,3 PD cut */ - { WKREQ, 0x00000000 }, /* # SYS.WKREQ # Wake-up request event is VSYNC alignment */ - - { GPIOIBE, 0x000003FF }, - { GPIOIS, 0x00000000 }, - { GPIOIC, 0x000003FF }, - { GPIOIE, 0x00000000 }, - - { GPIODATA, 0x00040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ - { 1, 1 }, /* msleep 1 */ - { GPIODATA, 0x02040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ - { DRAMPWR, 0x00000001 }, /* eDRAM power */ -}; - -#define GPIOSEL_VWAKEINT (1U << 0) -#define INTMASK_VWAKEOUT (1U << 0) - - -static struct clk *gp_clk; -static int trout_new_backlight = 1; -static struct vreg *vreg_mddi_1v5; -static struct vreg *vreg_lcm_2v85; - -static void trout_process_mddi_table(struct msm_mddi_client_data *client_data, - struct mddi_table *table, size_t count) -{ - int i; - for (i = 0; i < count; i++) { - uint32_t reg = table[i].reg; - uint32_t value = table[i].value; - - if (reg == 0) - udelay(value); - else if (reg == 1) - msleep(value); - else - client_data->remote_write(client_data, value, reg); - } -} - -static int trout_mddi_toshiba_client_init( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - int panel_id; - - client_data->auto_hibernate(client_data, 0); - trout_process_mddi_table(client_data, mddi_toshiba_init_table, - ARRAY_SIZE(mddi_toshiba_init_table)); - client_data->auto_hibernate(client_data, 1); - panel_id = (client_data->remote_read(client_data, GPIODATA) >> 4) & 3; - if (panel_id > 1) { - printk(KERN_WARNING "unknown panel id at mddi_enable\n"); - return -1; - } - return 0; -} - -static int trout_mddi_toshiba_client_uninit( - struct msm_mddi_bridge_platform_data *bridge_data, - struct msm_mddi_client_data *client_data) -{ - return 0; -} - -static struct resource resources_msm_fb[] = { - { - .start = MSM_FB_BASE, - .end = MSM_FB_BASE + MSM_FB_SIZE, - .flags = IORESOURCE_MEM, - }, -}; - -struct msm_mddi_bridge_platform_data toshiba_client_data = { - .init = trout_mddi_toshiba_client_init, - .uninit = trout_mddi_toshiba_client_uninit, - .fb_data = { - .xres = 320, - .yres = 480, - .width = 45, - .height = 67, - .output_format = 0, - }, -}; - -static struct msm_mddi_platform_data mddi_pdata = { - .clk_rate = 122880000, - .fb_resource = resources_msm_fb, - .num_clients = 1, - .client_platform_data = { - { - .product_id = (0xd263 << 16 | 0), - .name = "mddi_c_d263_0000", - .id = 0, - .client_data = &toshiba_client_data, - .clk_rate = 0, - }, - }, -}; - -int __init trout_init_panel(void) -{ - int rc; - - if (!machine_is_trout()) - return 0; - vreg_mddi_1v5 = vreg_get(0, "gp2"); - if (IS_ERR(vreg_mddi_1v5)) - return PTR_ERR(vreg_mddi_1v5); - vreg_lcm_2v85 = vreg_get(0, "gp4"); - if (IS_ERR(vreg_lcm_2v85)) - return PTR_ERR(vreg_lcm_2v85); - - trout_new_backlight = system_rev >= 5; - if (trout_new_backlight) { - uint32_t config = PCOM_GPIO_CFG(27, 0, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_8MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, 0); - } else { - uint32_t config = PCOM_GPIO_CFG(27, 1, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_8MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, 0); - - gp_clk = clk_get(NULL, "gp_clk"); - if (IS_ERR(gp_clk)) { - printk(KERN_ERR "trout_init_panel: could not get gp" - "clock\n"); - gp_clk = NULL; - } - rc = clk_set_rate(gp_clk, 19200000); - if (rc) - printk(KERN_ERR "trout_init_panel: set clock rate " - "failed\n"); - } - - rc = platform_device_register(&msm_device_mdp); - if (rc) - return rc; - msm_device_mddi0.dev.platform_data = &mddi_pdata; - return platform_device_register(&msm_device_mddi0); -} - -device_initcall(trout_init_panel); diff --git a/arch/arm/mach-msm/board-trout-rfkill.c b/arch/arm/mach-msm/board-trout-rfkill.c deleted file mode 100644 index e68eb2ae4c51..000000000000 --- a/arch/arm/mach-msm/board-trout-rfkill.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Author: Nick Pelly - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* Control bluetooth power for trout platform */ - -#include -#include -#include -#include -#include -#include - -#include "board-trout.h" - -static struct rfkill *bt_rfk; -static const char bt_name[] = "brf6300"; - -static int bluetooth_set_power(void *data, bool blocked) -{ - if (!blocked) { - gpio_set_value(TROUT_GPIO_BT_32K_EN, 1); - udelay(10); - gpio_direction_output(101, 1); - } else { - gpio_direction_output(101, 0); - gpio_set_value(TROUT_GPIO_BT_32K_EN, 0); - } - return 0; -} - -static struct rfkill_ops trout_rfkill_ops = { - .set_block = bluetooth_set_power, -}; - -static int trout_rfkill_probe(struct platform_device *pdev) -{ - int rc = 0; - bool default_state = true; /* off */ - - bluetooth_set_power(NULL, default_state); - - bt_rfk = rfkill_alloc(bt_name, &pdev->dev, RFKILL_TYPE_BLUETOOTH, - &trout_rfkill_ops, NULL); - if (!bt_rfk) - return -ENOMEM; - - rfkill_set_states(bt_rfk, default_state, false); - - /* userspace cannot take exclusive control */ - - rc = rfkill_register(bt_rfk); - - if (rc) - rfkill_destroy(bt_rfk); - return rc; -} - -static int trout_rfkill_remove(struct platform_device *dev) -{ - rfkill_unregister(bt_rfk); - rfkill_destroy(bt_rfk); - - return 0; -} - -static struct platform_driver trout_rfkill_driver = { - .probe = trout_rfkill_probe, - .remove = trout_rfkill_remove, - .driver = { - .name = "trout_rfkill", - .owner = THIS_MODULE, - }, -}; - -static int __init trout_rfkill_init(void) -{ - return platform_driver_register(&trout_rfkill_driver); -} - -static void __exit trout_rfkill_exit(void) -{ - platform_driver_unregister(&trout_rfkill_driver); -} - -module_init(trout_rfkill_init); -module_exit(trout_rfkill_exit); -MODULE_DESCRIPTION("trout rfkill"); -MODULE_AUTHOR("Nick Pelly "); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-trout-wifi.c b/arch/arm/mach-msm/board-trout-wifi.c deleted file mode 100644 index 51b26a405369..000000000000 --- a/arch/arm/mach-msm/board-trout-wifi.c +++ /dev/null @@ -1,74 +0,0 @@ -/* arch/arm/mach-msm/board-trout-wifi.c - * - * Copyright (C) 2008 Google, Inc. - * Author: Dmitry Shmidt - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifdef CONFIG_WIFI_CONTROL_FUNC -#include -#include -#include -#include -#include -#include - -extern int trout_wifi_set_carddetect(int val); -extern int trout_wifi_power(int on); -extern int trout_wifi_reset(int on); - -#ifdef CONFIG_WIFI_MEM_PREALLOC -typedef struct wifi_mem_prealloc_struct { - void *mem_ptr; - unsigned long size; -} wifi_mem_prealloc_t; - -static wifi_mem_prealloc_t wifi_mem_array[WMPA_NUMBER_OF_SECTIONS] = { - { NULL, (WMPA_SECTION_SIZE_0 + WMPA_SECTION_HEADER) }, - { NULL, (WMPA_SECTION_SIZE_1 + WMPA_SECTION_HEADER) }, - { NULL, (WMPA_SECTION_SIZE_2 + WMPA_SECTION_HEADER) } -}; - -static void *trout_wifi_mem_prealloc(int section, unsigned long size) -{ - if( (section < 0) || (section >= WMPA_NUMBER_OF_SECTIONS) ) - return NULL; - if( wifi_mem_array[section].size < size ) - return NULL; - return wifi_mem_array[section].mem_ptr; -} - -int __init trout_init_wifi_mem( void ) -{ - int i; - - for(i=0;( i < WMPA_NUMBER_OF_SECTIONS );i++) { - wifi_mem_array[i].mem_ptr = vmalloc(wifi_mem_array[i].size); - if( wifi_mem_array[i].mem_ptr == NULL ) - return -ENOMEM; - } - return 0; -} -#endif - -struct wifi_platform_data trout_wifi_control = { - .set_power = trout_wifi_power, - .set_reset = trout_wifi_reset, - .set_carddetect = trout_wifi_set_carddetect, -#ifdef CONFIG_WIFI_MEM_PREALLOC - .mem_prealloc = trout_wifi_mem_prealloc, -#else - .mem_prealloc = NULL, -#endif -}; - -#endif diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c deleted file mode 100644 index 919bfa32871a..000000000000 --- a/arch/arm/mach-msm/board-trout.c +++ /dev/null @@ -1,114 +0,0 @@ -/* linux/arch/arm/mach-msm/board-trout.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "devices.h" -#include "board-trout.h" -#include "common.h" - -extern int trout_init_mmc(unsigned int); - -static struct platform_device *devices[] __initdata = { - &msm_device_uart3, - &msm_device_smd, - &msm_device_nand, - &msm_device_hsusb, - &msm_device_i2c, -}; - -static void __init trout_init_early(void) -{ - arch_ioremap_caller = __msm_ioremap_caller; -} - -static void __init trout_init_irq(void) -{ - msm_init_irq(); -} - -static void __init trout_fixup(struct tag *tags, char **cmdline, - struct meminfo *mi) -{ - mi->nr_banks = 1; - mi->bank[0].start = PHYS_OFFSET; - mi->bank[0].size = (101*1024*1024); -} - -static void __init trout_init(void) -{ - int rc; - - platform_add_devices(devices, ARRAY_SIZE(devices)); - -#ifdef CONFIG_MMC - rc = trout_init_mmc(system_rev); - if (rc) - printk(KERN_CRIT "%s: MMC init failure (%d)\n", __func__, rc); -#endif - -} - -static struct map_desc trout_io_desc[] __initdata = { - { - .virtual = TROUT_CPLD_BASE, - .pfn = __phys_to_pfn(TROUT_CPLD_START), - .length = TROUT_CPLD_SIZE, - .type = MT_DEVICE_NONSHARED - } -}; - -static void __init trout_map_io(void) -{ - msm_map_common_io(); - iotable_init(trout_io_desc, ARRAY_SIZE(trout_io_desc)); - -#ifdef CONFIG_MSM_DEBUG_UART3 - /* route UART3 to the "H2W" extended usb connector */ - writeb(0x80, TROUT_CPLD_BASE + 0x00); -#endif - - msm_clock_init(msm_clocks_7x01a, msm_num_clocks_7x01a); -} - -static void __init trout_init_late(void) -{ - smd_debugfs_init(); -} - -MACHINE_START(TROUT, "HTC Dream") - .atag_offset = 0x100, - .fixup = trout_fixup, - .map_io = trout_map_io, - .init_early = trout_init_early, - .init_irq = trout_init_irq, - .init_machine = trout_init, - .init_late = trout_init_late, - .init_time = msm7x01_timer_init, -MACHINE_END diff --git a/arch/arm/mach-msm/board-trout.h b/arch/arm/mach-msm/board-trout.h deleted file mode 100644 index 651851c3e1dd..000000000000 --- a/arch/arm/mach-msm/board-trout.h +++ /dev/null @@ -1,162 +0,0 @@ -/* linux/arch/arm/mach-msm/board-trout.h -** Author: Brian Swetland -*/ -#ifndef __ARCH_ARM_MACH_MSM_BOARD_TROUT_H -#define __ARCH_ARM_MACH_MSM_BOARD_TROUT_H - -#include - -#define MSM_SMI_BASE 0x00000000 -#define MSM_SMI_SIZE 0x00800000 - -#define MSM_EBI_BASE 0x10000000 -#define MSM_EBI_SIZE 0x06e00000 - -#define MSM_PMEM_GPU0_BASE 0x00000000 -#define MSM_PMEM_GPU0_SIZE 0x00700000 - -#define MSM_PMEM_MDP_BASE 0x02000000 -#define MSM_PMEM_MDP_SIZE 0x00800000 - -#define MSM_PMEM_ADSP_BASE 0x02800000 -#define MSM_PMEM_ADSP_SIZE 0x00800000 - -#define MSM_PMEM_CAMERA_BASE 0x03000000 -#define MSM_PMEM_CAMERA_SIZE 0x00800000 - -#define MSM_FB_BASE 0x03800000 -#define MSM_FB_SIZE 0x00100000 - -#define MSM_LINUX_BASE MSM_EBI_BASE -#define MSM_LINUX_SIZE 0x06500000 - -#define MSM_PMEM_GPU1_SIZE 0x800000 -#define MSM_PMEM_GPU1_BASE (MSM_RAM_CONSOLE_BASE - MSM_PMEM_GPU1_SIZE) - -#define MSM_RAM_CONSOLE_BASE (MSM_EBI_BASE + 0x6d00000) -#define MSM_RAM_CONSOLE_SIZE (128 * SZ_1K) - -#if (MSM_FB_BASE + MSM_FB_SIZE) >= (MSM_PMEM_GPU1_BASE) -#error invalid memory map -#endif - -#define DECLARE_MSM_IOMAP -#include - -#define TROUT_4_BALL_UP_0 1 -#define TROUT_4_BALL_LEFT_0 18 -#define TROUT_4_BALL_DOWN_0 57 -#define TROUT_4_BALL_RIGHT_0 91 - -#define TROUT_5_BALL_UP_0 94 -#define TROUT_5_BALL_LEFT_0 18 -#define TROUT_5_BALL_DOWN_0 90 -#define TROUT_5_BALL_RIGHT_0 19 - -#define TROUT_POWER_KEY 20 - -#define TROUT_4_TP_LS_EN 19 -#define TROUT_5_TP_LS_EN 1 - -#define TROUT_CPLD_BASE 0xE8100000 -#define TROUT_CPLD_START 0x98000000 -#define TROUT_CPLD_SIZE SZ_4K - -#define TROUT_GPIO_CABLE_IN1 (83) -#define TROUT_GPIO_CABLE_IN2 (49) - -#define TROUT_GPIO_START (128) - -#define TROUT_GPIO_INT_MASK0_REG (0x0c) -#define TROUT_GPIO_INT_STAT0_REG (0x0e) -#define TROUT_GPIO_INT_MASK1_REG (0x14) -#define TROUT_GPIO_INT_STAT1_REG (0x10) - -#define TROUT_GPIO_HAPTIC_PWM (28) -#define TROUT_GPIO_PS_HOLD (25) - -#define TROUT_GPIO_MISC2_BASE (TROUT_GPIO_START + 0x00) -#define TROUT_GPIO_MISC3_BASE (TROUT_GPIO_START + 0x08) -#define TROUT_GPIO_MISC4_BASE (TROUT_GPIO_START + 0x10) -#define TROUT_GPIO_MISC5_BASE (TROUT_GPIO_START + 0x18) -#define TROUT_GPIO_INT2_BASE (TROUT_GPIO_START + 0x20) -#define TROUT_GPIO_MISC1_BASE (TROUT_GPIO_START + 0x28) -#define TROUT_GPIO_VIRTUAL_BASE (TROUT_GPIO_START + 0x30) -#define TROUT_GPIO_INT5_BASE (TROUT_GPIO_START + 0x48) - -#define TROUT_GPIO_CHARGER_EN (TROUT_GPIO_MISC2_BASE + 0) -#define TROUT_GPIO_ISET (TROUT_GPIO_MISC2_BASE + 1) -#define TROUT_GPIO_H2W_DAT_DIR (TROUT_GPIO_MISC2_BASE + 2) -#define TROUT_GPIO_H2W_CLK_DIR (TROUT_GPIO_MISC2_BASE + 3) -#define TROUT_GPIO_H2W_DAT_GPO (TROUT_GPIO_MISC2_BASE + 4) -#define TROUT_GPIO_H2W_CLK_GPO (TROUT_GPIO_MISC2_BASE + 5) -#define TROUT_GPIO_H2W_SEL0 (TROUT_GPIO_MISC2_BASE + 6) -#define TROUT_GPIO_H2W_SEL1 (TROUT_GPIO_MISC2_BASE + 7) - -#define TROUT_GPIO_SPOTLIGHT_EN (TROUT_GPIO_MISC3_BASE + 0) -#define TROUT_GPIO_FLASH_EN (TROUT_GPIO_MISC3_BASE + 1) -#define TROUT_GPIO_I2C_PULL (TROUT_GPIO_MISC3_BASE + 2) -#define TROUT_GPIO_TP_I2C_PULL (TROUT_GPIO_MISC3_BASE + 3) -#define TROUT_GPIO_TP_EN (TROUT_GPIO_MISC3_BASE + 4) -#define TROUT_GPIO_JOG_EN (TROUT_GPIO_MISC3_BASE + 5) -#define TROUT_GPIO_UI_LED_EN (TROUT_GPIO_MISC3_BASE + 6) -#define TROUT_GPIO_QTKEY_LED_EN (TROUT_GPIO_MISC3_BASE + 7) - -#define TROUT_GPIO_VCM_PWDN (TROUT_GPIO_MISC4_BASE + 0) -#define TROUT_GPIO_USB_H2W_SW (TROUT_GPIO_MISC4_BASE + 1) -#define TROUT_GPIO_COMPASS_RST_N (TROUT_GPIO_MISC4_BASE + 2) -#define TROUT_GPIO_HAPTIC_EN_UP (TROUT_GPIO_MISC4_BASE + 3) -#define TROUT_GPIO_HAPTIC_EN_MAIN (TROUT_GPIO_MISC4_BASE + 4) -#define TROUT_GPIO_USB_PHY_RST_N (TROUT_GPIO_MISC4_BASE + 5) -#define TROUT_GPIO_WIFI_PA_RESETX (TROUT_GPIO_MISC4_BASE + 6) -#define TROUT_GPIO_WIFI_EN (TROUT_GPIO_MISC4_BASE + 7) - -#define TROUT_GPIO_BT_32K_EN (TROUT_GPIO_MISC5_BASE + 0) -#define TROUT_GPIO_MAC_32K_EN (TROUT_GPIO_MISC5_BASE + 1) -#define TROUT_GPIO_MDDI_32K_EN (TROUT_GPIO_MISC5_BASE + 2) -#define TROUT_GPIO_COMPASS_32K_EN (TROUT_GPIO_MISC5_BASE + 3) - -#define TROUT_GPIO_NAVI_ACT_N (TROUT_GPIO_INT2_BASE + 0) -#define TROUT_GPIO_COMPASS_IRQ (TROUT_GPIO_INT2_BASE + 1) -#define TROUT_GPIO_SLIDING_DET (TROUT_GPIO_INT2_BASE + 2) -#define TROUT_GPIO_AUD_HSMIC_DET_N (TROUT_GPIO_INT2_BASE + 3) -#define TROUT_GPIO_SD_DOOR_N (TROUT_GPIO_INT2_BASE + 4) -#define TROUT_GPIO_CAM_BTN_STEP1_N (TROUT_GPIO_INT2_BASE + 5) -#define TROUT_GPIO_CAM_BTN_STEP2_N (TROUT_GPIO_INT2_BASE + 6) -#define TROUT_GPIO_TP_ATT_N (TROUT_GPIO_INT2_BASE + 7) -#define TROUT_GPIO_BANK0_FIRST_INT_SOURCE (TROUT_GPIO_NAVI_ACT_N) -#define TROUT_GPIO_BANK0_LAST_INT_SOURCE (TROUT_GPIO_TP_ATT_N) - -#define TROUT_GPIO_H2W_DAT_GPI (TROUT_GPIO_MISC1_BASE + 0) -#define TROUT_GPIO_H2W_CLK_GPI (TROUT_GPIO_MISC1_BASE + 1) -#define TROUT_GPIO_CPLD128_VER_0 (TROUT_GPIO_MISC1_BASE + 4) -#define TROUT_GPIO_CPLD128_VER_1 (TROUT_GPIO_MISC1_BASE + 5) -#define TROUT_GPIO_CPLD128_VER_2 (TROUT_GPIO_MISC1_BASE + 6) -#define TROUT_GPIO_CPLD128_VER_3 (TROUT_GPIO_MISC1_BASE + 7) - -#define TROUT_GPIO_SDMC_CD_N (TROUT_GPIO_VIRTUAL_BASE + 0) -#define TROUT_GPIO_END (TROUT_GPIO_SDMC_CD_N) -#define TROUT_GPIO_BANK1_FIRST_INT_SOURCE (TROUT_GPIO_SDMC_CD_N) -#define TROUT_GPIO_BANK1_LAST_INT_SOURCE (TROUT_GPIO_SDMC_CD_N) - -#define TROUT_GPIO_VIRTUAL_TO_REAL_OFFSET \ - (TROUT_GPIO_INT5_BASE - TROUT_GPIO_VIRTUAL_BASE) - -#define TROUT_INT_START (NR_MSM_IRQS + NR_GPIO_IRQS) -#define TROUT_INT_BANK0_COUNT (8) -#define TROUT_INT_BANK1_START (TROUT_INT_START + TROUT_INT_BANK0_COUNT) -#define TROUT_INT_BANK1_COUNT (1) -#define TROUT_INT_END (TROUT_INT_START + TROUT_INT_BANK0_COUNT + \ - TROUT_INT_BANK1_COUNT - 1) -#define TROUT_GPIO_TO_INT(n) (((n) <= TROUT_GPIO_BANK0_LAST_INT_SOURCE) ? \ - (TROUT_INT_START - TROUT_GPIO_BANK0_FIRST_INT_SOURCE + (n)) : \ - (TROUT_INT_BANK1_START - TROUT_GPIO_BANK1_FIRST_INT_SOURCE + (n))) - -#define TROUT_INT_TO_BANK(n) ((n - TROUT_INT_START) / TROUT_INT_BANK0_COUNT) -#define TROUT_INT_TO_MASK(n) (1U << ((n - TROUT_INT_START) & 7)) -#define TROUT_BANK_TO_MASK_REG(bank) \ - (bank ? TROUT_GPIO_INT_MASK1_REG : TROUT_GPIO_INT_MASK0_REG) -#define TROUT_BANK_TO_STAT_REG(bank) \ - (bank ? TROUT_GPIO_INT_STAT1_REG : TROUT_GPIO_INT_STAT0_REG) - -#endif /* GUARD */ diff --git a/arch/arm/mach-msm/btpintest.c b/arch/arm/mach-msm/btpintest.c deleted file mode 100644 index 543d557b0149..000000000000 --- a/arch/arm/mach-msm/btpintest.c +++ /dev/null @@ -1,234 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define VERSION "1.0" -struct dentry *pin_debugfs_dent; - -/* UART GPIO lines for 8660 */ -enum uartpins { - UARTDM_TX = 53, - UARTDM_RX = 54, - UARTDM_CTS = 55, - UARTDM_RFR = 56 -}; - -/* Aux PCM GPIO lines for 8660 */ -enum auxpcmpins { - AUX_PCM_CLK = 114, - AUX_PCM_SYNC = 113, - AUX_PCM_DIN = 112, - AUX_PCM_DOUT = 111 -}; -/*Number of UART and PCM pins */ -#define PIN_COUNT 8 - -static struct gpiomux_setting pin_test_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; -/* Static array to intialise the return config */ -static struct gpiomux_setting currentconfig[2*PIN_COUNT]; - -static struct msm_gpiomux_config pin_test_configs[] = { - { - .gpio = AUX_PCM_DOUT, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = AUX_PCM_DIN, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = AUX_PCM_SYNC, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = AUX_PCM_CLK, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = UARTDM_TX, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = UARTDM_RX, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = UARTDM_CTS, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, - { - .gpio = UARTDM_RFR, - .settings = { - [GPIOMUX_ACTIVE] = &pin_test_config, - [GPIOMUX_SUSPENDED] = &pin_test_config, - }, - }, -}; -static struct msm_gpiomux_config pin_config[PIN_COUNT]; - -static int pintest_open(struct inode *inode, struct file *file) -{ - /* non-seekable */ - file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE); - return 0; -} - -static int pintest_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static int configure_pins(struct msm_gpiomux_config *config, - struct msm_gpiomux_config *oldconfig, - unsigned int num_configs) -{ - int rc = 0, j, i; - for (i = 0; i < num_configs; i++) { - for (j = 0; j < GPIOMUX_NSETTINGS; j++) { - (oldconfig + i)->gpio = (config + i)->gpio; - rc = msm_gpiomux_write((config + i)->gpio, - j, - (config + i)->settings[j], - (oldconfig + i)->settings[j]); - if (rc < 0) - break; - } - - } - return rc; -} - -static void init_current_config_pointers(void) -{ - int i = 0, j = 0; - /* The current config variables will hold the current configuration - * which is getting overwritten during a msm_gpiomux_write call - */ - for (i = 0, j = 0; i < PIN_COUNT; i += 1, j += 2) { - pin_config[i].settings[GPIOMUX_ACTIVE] = ¤tconfig[j]; - pin_config[i].settings[GPIOMUX_SUSPENDED] = - ¤tconfig[j + 1]; - } - -} - -static ssize_t pintest_write( - struct file *file, - const char __user *buff, - size_t count, - loff_t *ppos) -{ - char mode; - int rc = 0; - - if (count < 1) - return -EINVAL; - - if (buff == NULL) - return -EINVAL; - - if (copy_from_user(&mode, buff, count)) - return -EFAULT; - mode = mode - '0'; - - init_current_config_pointers(); - - if (mode) { - /* Configure all pin test gpios for the custom settings */ - rc = configure_pins(pin_test_configs, pin_config, - ARRAY_SIZE(pin_test_configs)); - if (rc < 0) - return rc; - } else { - /* Configure all pin test gpios for the original settings */ - rc = configure_pins(pin_config, pin_test_configs, - ARRAY_SIZE(pin_test_configs)); - if (rc < 0) - return rc; - } - return rc; -} - -static const struct file_operations pintest_debugfs_fops = { - .open = pintest_open, - .release = pintest_release, - .write = pintest_write, -}; - -static int __init bluepintest_init(void) -{ - pin_debugfs_dent = debugfs_create_dir("btpintest", NULL); - - if (IS_ERR(pin_debugfs_dent)) { - printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n", - __FILE__, __LINE__, PTR_ERR(pin_debugfs_dent)); - return -ENOMEM; - } - - if (debugfs_create_file("enable", 0644, pin_debugfs_dent, - 0, &pintest_debugfs_fops) == NULL) { - printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n", - __FILE__, __LINE__); - return -ENOMEM; - } - return 0; -} - -static void __exit bluepintest_exit(void) -{ - debugfs_remove_recursive(pin_debugfs_dent); -} - -module_init(bluepintest_init); -module_exit(bluepintest_exit); - -MODULE_DESCRIPTION("Bluetooth Pin Connectivty Test Driver ver %s " VERSION); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/clock-7x30.c b/arch/arm/mach-msm/clock-7x30.c deleted file mode 100644 index c9914943dd5a..000000000000 --- a/arch/arm/mach-msm/clock-7x30.c +++ /dev/null @@ -1,3015 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "clock.h" -#include "clock-local.h" -#include "clock-pcom.h" -#include "clock-voter.h" -#include "clock-pll.h" - -#define REG_BASE(off) (MSM_CLK_CTL_BASE + (off)) -#define REG(off) (MSM_CLK_CTL_SH2_BASE + (off)) - -/* Shadow-region 2 (SH2) registers. */ -#define QUP_I2C_NS_REG REG(0x04F0) -#define CAM_NS_REG REG(0x0374) -#define CAM_VFE_NS_REG REG(0x0044) -#define CLK_HALT_STATEA_REG REG(0x0108) -#define CLK_HALT_STATEB_REG REG(0x010C) -#define CLK_HALT_STATEC_REG REG(0x02D4) -#define CSI_NS_REG REG(0x0174) -#define EMDH_NS_REG REG(0x0050) -#define GLBL_CLK_ENA_2_SC_REG REG(0x03C0) -#define GLBL_CLK_ENA_SC_REG REG(0x03BC) -#define GLBL_CLK_STATE_2_REG REG(0x037C) -#define GLBL_CLK_STATE_REG REG(0x0004) -#define GRP_2D_NS_REG REG(0x0034) -#define GRP_NS_REG REG(0x0084) -#define HDMI_NS_REG REG(0x0484) -#define I2C_2_NS_REG REG(0x02D8) -#define I2C_NS_REG REG(0x0068) -#define JPEG_NS_REG REG(0x0164) -#define LPA_CORE_CLK_MA0_REG REG(0x04F4) -#define LPA_CORE_CLK_MA2_REG REG(0x04FC) -#define LPA_NS_REG REG(0x02E8) -#define MDC_NS_REG REG(0x007C) -#define MDP_LCDC_NS_REG REG(0x0390) -#define MDP_NS_REG REG(0x014C) -#define MDP_VSYNC_REG REG(0x0460) -#define MFC_NS_REG REG(0x0154) -#define MI2S_CODEC_RX_DIV_REG REG(0x02EC) -#define MI2S_CODEC_TX_DIV_REG REG(0x02F0) -#define MI2S_DIV_REG REG(0x02E4) -#define MI2S_NS_REG REG(0x02E0) -#define MI2S_RX_NS_REG REG(0x0070) -#define MI2S_TX_NS_REG REG(0x0078) -#define PLL_ENA_REG REG(0x0264) -#define PMDH_NS_REG REG(0x008C) -#define SDAC_NS_REG REG(0x009C) -#define SDCn_NS_REG(n) REG(0x00A4+(0x8*((n)-1))) -#define SPI_NS_REG REG(0x02C8) -#define TSIF_NS_REG REG(0x00C4) -#define TV_NS_REG REG(0x00CC) -#define UART1DM_NS_REG REG(0x00D4) -#define UART2DM_NS_REG REG(0x00DC) -#define UART2_NS_REG REG(0x0464) -#define UART_NS_REG REG(0x00E0) -#define USBH2_NS_REG REG(0x046C) -#define USBH3_NS_REG REG(0x0470) -#define USBH_MD_REG REG(0x02BC) -#define USBH_NS_REG REG(0x02C0) -#define VPE_NS_REG REG(0x015C) - -/* Registers in the base (non-shadow) region. */ -#define CLK_TEST_BASE_REG REG_BASE(0x011C) -#define CLK_TEST_2_BASE_REG REG_BASE(0x0384) -#define MISC_CLK_CTL_BASE_REG REG_BASE(0x0110) -#define PRPH_WEB_NS_BASE_REG REG_BASE(0x0080) -#define PLL0_STATUS_BASE_REG REG_BASE(0x0318) -#define PLL1_STATUS_BASE_REG REG_BASE(0x0334) -#define PLL2_STATUS_BASE_REG REG_BASE(0x0350) -#define PLL3_STATUS_BASE_REG REG_BASE(0x036C) -#define PLL4_STATUS_BASE_REG REG_BASE(0x0254) -#define PLL5_STATUS_BASE_REG REG_BASE(0x0258) -#define PLL6_STATUS_BASE_REG REG_BASE(0x04EC) -#define RINGOSC_CNT_BASE_REG REG_BASE(0x00FC) -#define SH2_OWN_APPS1_BASE_REG REG_BASE(0x040C) -#define SH2_OWN_APPS2_BASE_REG REG_BASE(0x0414) -#define SH2_OWN_APPS3_BASE_REG REG_BASE(0x0444) -#define SH2_OWN_GLBL_BASE_REG REG_BASE(0x0404) -#define SH2_OWN_ROW1_BASE_REG REG_BASE(0x041C) -#define SH2_OWN_ROW2_BASE_REG REG_BASE(0x0424) -#define TCXO_CNT_BASE_REG REG_BASE(0x00F8) -#define TCXO_CNT_DONE_BASE_REG REG_BASE(0x00F8) - - -/* MUX source input identifiers. */ -#define SRC_SEL_pll0 4 /* Modem PLL */ -#define SRC_SEL_pll1 1 /* Global PLL */ -#define SRC_SEL_pll3 3 /* Multimedia/Peripheral PLL or Backup PLL1 */ -#define SRC_SEL_pll4 2 /* Display PLL */ -#define SRC_SEL_SDAC_lpxo 5 /* Low-power XO for SDAC */ -#define SRC_SEL_lpxo 6 /* Low-power XO */ -#define SRC_SEL_tcxo 0 /* Used for rates from TCXO */ -#define SRC_SEL_axi 0 /* Used for rates that sync to AXI */ -#define SRC_SEL_gnd 7 /* No clock */ - -/* Clock declaration macros. */ -#define N8(msb, lsb, m, n) (BVAL(msb, lsb, ~(n-m)) | BVAL(6, 5, \ - (MN_MODE_DUAL_EDGE * !!(n)))) -#define N16(m, n) (BVAL(31, 16, ~(n-m)) | BVAL(6, 5, \ - (MN_MODE_DUAL_EDGE * !!(n)))) -#define SPDIV(s, d) (BVAL(4, 3, d-1) | BVAL(2, 0, s)) -#define SDIV(s, d) (BVAL(6, 3, d-1) | BVAL(2, 0, s)) -#define F_MASK_BASIC (BM(6, 3)|BM(2, 0)) -#define F_MASK_MND16 (BM(31, 16)|BM(6, 5)|BM(4, 3)|BM(2, 0)) -#define F_MASK_MND8(m, l) (BM(m, l)|BM(6, 5)|BM(4, 3)|BM(2, 0)) - -/* - * Clock frequency definitions and macros - */ -#define F_BASIC(f, s, div) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = SDIV(SRC_SEL_##s, div), \ - } - -#define F_MND16(f, s, div, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = N16(m, n) | SPDIV(SRC_SEL_##s, div), \ - } - -#define F_MND8(f, nmsb, nlsb, s, div, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = N8(nmsb, nlsb, m, n) | SPDIV(SRC_SEL_##s, div), \ - } - -enum vdd_dig_levels { - VDD_DIG_NONE, - VDD_DIG_LOW, - VDD_DIG_NOMINAL, - VDD_DIG_HIGH, - VDD_DIG_NUM -}; - -static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level) -{ - int rc, target_mv; - - static const int mv[] = { - [VDD_DIG_NONE] = 1000, - [VDD_DIG_LOW] = 1000, - [VDD_DIG_NOMINAL] = 1100, - [VDD_DIG_HIGH] = 1200 - }; - - target_mv = mv[level]; - rc = msm_proc_comm(PCOM_CLKCTL_RPC_MIN_MSMC1, &target_mv, NULL); - if (rc) - return rc; - if (target_mv) - rc = -EINVAL; - - return rc; -} - -static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM); - -#define VDD_DIG_FMAX_MAP1(l1, f1) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - }, \ - .num_fmax = VDD_DIG_NUM - -#define PCOM_XO_DISABLE 0 -#define PCOM_XO_ENABLE 1 -#define PCOM_XO_TCXO 0 -#define PCOM_XO_LPXO 1 - -static bool pcom_is_local(struct clk *c) -{ - return false; -} - -static int pcom_xo_enable(unsigned pcom_id, unsigned enable) -{ - /* TODO: Check return code in pcom_id */ - return msm_proc_comm(PCOM_CLKCTL_RPC_SRC_REQUEST, &pcom_id, &enable); -} - -static int tcxo_clk_enable(struct clk *clk) -{ - return pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_ENABLE); -} - -static void tcxo_clk_disable(struct clk *clk) -{ - pcom_xo_enable(PCOM_XO_TCXO, PCOM_XO_DISABLE); -} - -static enum handoff xo_clk_handoff(struct clk *clk) -{ - return HANDOFF_ENABLED_CLK; -} - -static struct clk_ops clk_ops_tcxo = { - .enable = tcxo_clk_enable, - .disable = tcxo_clk_disable, - .handoff = xo_clk_handoff, - .is_local = pcom_is_local, -}; - -static struct fixed_clk tcxo_clk = { - .c = { - .dbg_name = "tcxo_clk", - .rate = 19200000, - .ops = &clk_ops_tcxo, - CLK_INIT(tcxo_clk.c), - }, -}; - -static int lpxo_clk_enable(struct clk *clk) -{ - return pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_ENABLE); -} - -static void lpxo_clk_disable(struct clk *clk) -{ - pcom_xo_enable(PCOM_XO_LPXO, PCOM_XO_DISABLE); -} - -static struct clk_ops clk_ops_lpxo = { - .enable = lpxo_clk_enable, - .disable = lpxo_clk_disable, - .handoff = xo_clk_handoff, - .is_local = pcom_is_local, -}; - -static struct fixed_clk lpxo_clk = { - .c = { - .dbg_name = "lpxo_clk", - .rate = 24576000, - .ops = &clk_ops_lpxo, - CLK_INIT(lpxo_clk.c), - }, -}; - -static struct pll_vote_clk pll1_clk = { - .en_reg = PLL_ENA_REG, - .en_mask = BIT(1), - .status_reg = PLL1_STATUS_BASE_REG, - .status_mask = BIT(16), - .c = { - .parent = &tcxo_clk.c, - .dbg_name = "pll1_clk", - .rate = 768000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll1_clk.c), - }, -}; - -static struct pll_vote_clk pll2_clk = { - .en_reg = PLL_ENA_REG, - .en_mask = BIT(2), - .status_reg = PLL2_STATUS_BASE_REG, - .status_mask = BIT(16), - .c = { - .parent = &tcxo_clk.c, - .dbg_name = "pll2_clk", - .rate = 806400000, /* TODO: Support scaling */ - .ops = &clk_ops_pll_vote, - CLK_INIT(pll2_clk.c), - }, -}; - -static struct pll_vote_clk pll3_clk = { - .en_reg = PLL_ENA_REG, - .en_mask = BIT(3), - .status_reg = PLL3_STATUS_BASE_REG, - .status_mask = BIT(16), - .c = { - .parent = &lpxo_clk.c, - .dbg_name = "pll3_clk", - .rate = 737280000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll3_clk.c), - }, -}; - -static struct pll_vote_clk pll4_clk = { - .en_reg = PLL_ENA_REG, - .en_mask = BIT(4), - .status_reg = PLL4_STATUS_BASE_REG, - .status_mask = BIT(16), - .c = { - .parent = &lpxo_clk.c, - .dbg_name = "pll4_clk", - .rate = 891000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll4_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_axi[] = { - F_RAW(1, &lpxo_clk.c, 0, 0, 0, NULL), - F_END, -}; - -/* For global clocks to be on we must have GLBL_ROOT_ENA set */ -static struct rcg_clk glbl_root_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(29), - .halt_check = NOCHECK, - }, - .freq_tbl = clk_tbl_axi, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_nop, - .c = { - .dbg_name = "glbl_root_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 1), - CLK_INIT(glbl_root_clk.c), - }, -}; - -/* AXI bridge clocks. */ -static struct branch_clk axi_li_apps_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(2), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 2, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "axi_li_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_apps_clk.c), - }, -}; - -static struct branch_clk axi_li_adsp_a_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(14), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 14, - }, - .c = { - .parent = &axi_li_apps_clk.c, - .dbg_name = "axi_li_adsp_a_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_adsp_a_clk.c), - }, -}; - -static struct branch_clk axi_li_jpeg_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(19), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 19, - }, - .c = { - .parent = &axi_li_apps_clk.c, - .dbg_name = "axi_li_jpeg_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_jpeg_clk.c), - }, -}; - -static struct branch_clk axi_li_vfe_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(23), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 23, - }, - .c = { - .parent = &axi_li_apps_clk.c, - .dbg_name = "axi_li_vfe_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_vfe_clk.c), - }, -}; - -static struct branch_clk axi_mdp_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(29), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 29, - }, - .c = { - .parent = &axi_li_apps_clk.c, - .dbg_name = "axi_mdp_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_mdp_clk.c), - }, -}; - -static struct branch_clk axi_li_vg_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(3), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 3, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "axi_li_vg_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_vg_clk.c), - }, -}; - -static struct branch_clk axi_grp_2d_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(21), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 21, - }, - .c = { - .parent = &axi_li_vg_clk.c, - .dbg_name = "axi_grp_2d_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_grp_2d_clk.c), - }, -}; - -static struct branch_clk axi_li_grp_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(22), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 22, - }, - .c = { - .parent = &axi_li_vg_clk.c, - .dbg_name = "axi_li_grp_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_li_grp_clk.c), - }, -}; - -static struct branch_clk axi_mfc_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(20), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 20, - }, - .c = { - .parent = &axi_li_vg_clk.c, - .dbg_name = "axi_mfc_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_mfc_clk.c), - }, -}; - -static struct branch_clk axi_rotator_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(22), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 22, - .reset_mask = P_AXI_ROTATOR_CLK, - }, - .c = { - .parent = &axi_li_vg_clk.c, - .dbg_name = "axi_rotator_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_rotator_clk.c), - }, -}; - -static struct branch_clk axi_vpe_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(21), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 21, - }, - .c = { - .parent = &axi_li_vg_clk.c, - .dbg_name = "axi_vpe_clk", - .ops = &clk_ops_branch, - CLK_INIT(axi_vpe_clk.c), - }, -}; - -/* Peripheral bus clocks. */ -static struct branch_clk adm_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(5), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 5, - .reset_mask = P_ADM_CLK, - }, - .c = { - .parent = &axi_li_apps_clk.c, - .dbg_name = "adm_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm_clk.c), - }, -}; - -static struct branch_clk adm_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(15), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 15, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "adm_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm_p_clk.c), - }, -}; - -static struct branch_clk ce_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(6), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 6, - .reset_mask = P_CE_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "ce_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce_clk.c), - }, -}; - -static struct branch_clk camif_pad_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(9), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 9, - .reset_mask = P_CAMIF_PAD_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "camif_pad_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(camif_pad_p_clk.c), - }, -}; - -static struct branch_clk csi0_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(30), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 30, - .reset_mask = P_CSI0_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "csi0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_p_clk.c), - }, -}; - -static struct branch_clk emdh_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(3), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 3, - .reset_mask = P_EMDH_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "emdh_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(emdh_p_clk.c), - }, -}; - -static struct branch_clk grp_2d_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(24), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 24, - .reset_mask = P_GRP_2D_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "grp_2d_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(grp_2d_p_clk.c), - }, -}; - -static struct branch_clk grp_3d_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(17), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 17, - .reset_mask = P_GRP_3D_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "grp_3d_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(grp_3d_p_clk.c), - }, -}; - -static struct branch_clk jpeg_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(24), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 24, - .reset_mask = P_JPEG_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "jpeg_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(jpeg_p_clk.c), - }, -}; - -static struct branch_clk lpa_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(7), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 7, - .reset_mask = P_LPA_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "lpa_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(lpa_p_clk.c), - }, -}; - -static struct branch_clk mdp_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(6), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 6, - .reset_mask = P_MDP_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "mdp_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_p_clk.c), - }, -}; - -static struct branch_clk mfc_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(26), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 26, - .reset_mask = P_MFC_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "mfc_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(mfc_p_clk.c), - }, -}; - -static struct branch_clk pmdh_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(4), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 4, - .reset_mask = P_PMDH_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "pmdh_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmdh_p_clk.c), - }, -}; - -static struct branch_clk rotator_imem_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(23), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 23, - .reset_mask = P_ROTATOR_IMEM_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "rotator_imem_clk", - .ops = &clk_ops_branch, - CLK_INIT(rotator_imem_clk.c), - }, -}; - -static struct branch_clk rotator_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(25), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 25, - .reset_mask = P_ROTATOR_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "rotator_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rotator_p_clk.c), - }, -}; - -static struct branch_clk sdc1_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(7), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 7, - .reset_mask = P_SDC1_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "sdc1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc1_p_clk.c), - }, -}; - -static struct branch_clk sdc2_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(8), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 8, - .reset_mask = P_SDC2_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "sdc2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc2_p_clk.c), - }, -}; - -static struct branch_clk sdc3_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(27), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 27, - .reset_mask = P_SDC3_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "sdc3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc3_p_clk.c), - }, -}; - -static struct branch_clk sdc4_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(28), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 28, - .reset_mask = P_SDC4_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "sdc4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc4_p_clk.c), - }, -}; - -static struct branch_clk spi_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(10), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 10, - .reset_mask = P_SPI_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "spi_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(spi_p_clk.c), - }, -}; - -static struct branch_clk tsif_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(18), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 18, - .reset_mask = P_TSIF_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "tsif_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(tsif_p_clk.c), - }, -}; - -static struct branch_clk uart1dm_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(17), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 17, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "uart1dm_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(uart1dm_p_clk.c), - }, -}; - -static struct branch_clk uart2dm_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(26), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 26, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "uart2dm_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(uart2dm_p_clk.c), - }, -}; - -static struct branch_clk usb_hs2_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(8), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 8, - .reset_mask = P_USB_HS2_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "usb_hs2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs2_p_clk.c), - }, -}; - -static struct branch_clk usb_hs3_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(9), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 9, - .reset_mask = P_USB_HS3_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "usb_hs3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs3_p_clk.c), - }, -}; - -static struct branch_clk usb_hs_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_SC_REG, - .en_mask = BIT(25), - .halt_reg = GLBL_CLK_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 25, - .reset_mask = P_USB_HS_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "usb_hs_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs_p_clk.c), - }, -}; - -static struct branch_clk vfe_p_clk = { - .b = { - .ctl_reg = GLBL_CLK_ENA_2_SC_REG, - .en_mask = BIT(27), - .halt_reg = GLBL_CLK_STATE_2_REG, - .halt_check = HALT_VOTED, - .halt_bit = 27, - .reset_mask = P_VFE_P_CLK, - }, - .c = { - .parent = &glbl_root_clk.c, - .dbg_name = "vfe_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_p_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_csi[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8(153600000, 24, 17, pll1, 2, 2, 5), - F_MND8(192000000, 24, 17, pll1, 4, 0, 0), - F_MND8(384000000, 24, 17, pll1, 2, 0, 0), - F_END, -}; - -static struct rcg_clk csi0_clk = { - .b = { - .ctl_reg = CSI_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 17, - .reset_mask = P_CSI0_CLK, - }, - .ns_reg = CSI_NS_REG, - .md_reg = CSI_NS_REG - 4, - .ns_mask = F_MASK_MND8(24, 17), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_csi, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "csi0_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 384000000), - CLK_INIT(csi0_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_tcxo[] = { - F_RAW(19200000, &tcxo_clk.c, 0, 0, 0, NULL), - F_END, -}; - -static struct rcg_clk i2c_clk = { - .b = { - .ctl_reg = I2C_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 15, - .reset_mask = P_I2C_CLK, - }, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_tcxo, - .root_en_mask = BIT(11), - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "i2c_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 19200000), - CLK_INIT(i2c_clk.c), - }, -}; - -static struct rcg_clk i2c_2_clk = { - .b = { - .ctl_reg = I2C_2_NS_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 2, - .reset_mask = P_I2C_2_CLK, - }, - .root_en_mask = BIT(2), - .freq_tbl = clk_tbl_tcxo, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "i2c_2_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 19200000), - CLK_INIT(i2c_2_clk.c), - }, -}; - -static struct rcg_clk qup_i2c_clk = { - .b = { - .ctl_reg = QUP_I2C_NS_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 31, - .reset_mask = P_QUP_I2C_CLK, - }, - .root_en_mask = BIT(2), - .freq_tbl = clk_tbl_tcxo, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "qup_i2c_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 19200000), - CLK_INIT(qup_i2c_clk.c), - }, -}; - -static struct rcg_clk uart1_clk = { - .b = { - .ctl_reg = UART_NS_REG, - .en_mask = BIT(5), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 7, - .reset_mask = P_UART1_CLK, - }, - .root_en_mask = BIT(4), - .freq_tbl = clk_tbl_tcxo, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "uart1_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 19200000), - CLK_INIT(uart1_clk.c), - }, -}; - -static struct rcg_clk uart2_clk = { - .b = { - .ctl_reg = UART2_NS_REG, - .en_mask = BIT(5), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 5, - .reset_mask = P_UART2_CLK, - }, - .root_en_mask = BIT(4), - .freq_tbl = clk_tbl_tcxo, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "uart2_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 19200000), - CLK_INIT(uart2_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_uartdm[] = { - F_MND16( 0, gnd, 1, 0, 0), - F_MND16( 3686400, pll3, 3, 3, 200), - F_MND16( 7372800, pll3, 3, 3, 100), - F_MND16(14745600, pll3, 3, 3, 50), - F_MND16(32000000, pll3, 3, 25, 192), - F_MND16(40000000, pll3, 3, 125, 768), - F_MND16(46400000, pll3, 3, 145, 768), - F_MND16(48000000, pll3, 3, 25, 128), - F_MND16(51200000, pll3, 3, 5, 24), - F_MND16(56000000, pll3, 3, 175, 768), - F_MND16(58982400, pll3, 3, 6, 25), - F_MND16(64000000, pll1, 4, 1, 3), - F_END, -}; - -static struct rcg_clk uart1dm_clk = { - .b = { - .ctl_reg = UART1DM_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 6, - .reset_mask = P_UART1DM_CLK, - }, - .ns_reg = UART1DM_NS_REG, - .md_reg = UART1DM_NS_REG - 4, - .root_en_mask = BIT(11), - .mnd_en_mask = BIT(8), - .freq_tbl = clk_tbl_uartdm, - .ns_mask = F_MASK_MND16, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "uart1dm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 64000000), - CLK_INIT(uart1dm_clk.c), - }, -}; - -static struct rcg_clk uart2dm_clk = { - .b = { - .ctl_reg = UART2DM_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 23, - .reset_mask = P_UART2DM_CLK, - }, - .ns_reg = UART2DM_NS_REG, - .md_reg = UART2DM_NS_REG - 4, - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_uartdm, - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "uart2dm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 64000000), - CLK_INIT(uart2dm_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mdh[] = { - F_BASIC( 0, gnd, 1), - F_BASIC( 49150000, pll3, 15), - F_BASIC( 92160000, pll3, 8), - F_BASIC(122880000, pll3, 6), - F_BASIC(184320000, pll3, 4), - F_BASIC(245760000, pll3, 3), - F_BASIC(368640000, pll3, 2), - F_BASIC(384000000, pll1, 2), - F_BASIC(445500000, pll4, 2), - F_END, -}; - -static struct rcg_clk emdh_clk = { - .b = { - .ctl_reg = EMDH_NS_REG, - .halt_check = DELAY, - .reset_mask = P_EMDH_CLK, - }, - .root_en_mask = BIT(11), - .ns_reg = EMDH_NS_REG, - .ns_mask = F_MASK_BASIC, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_mdh, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "emdh_clk", - .flags = CLKFLAG_MIN | CLKFLAG_MAX, - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 445500000), - CLK_INIT(emdh_clk.c), - .depends = &axi_li_adsp_a_clk.c, - }, -}; - -static struct rcg_clk pmdh_clk = { - .b = { - .ctl_reg = PMDH_NS_REG, - .halt_check = DELAY, - .reset_mask = P_PMDH_CLK, - }, - .root_en_mask = BIT(11), - .ns_reg = PMDH_NS_REG, - .ns_mask = F_MASK_BASIC, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_mdh, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pmdh_clk", - .flags = CLKFLAG_MIN | CLKFLAG_MAX, - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 445500000), - CLK_INIT(pmdh_clk.c), - .depends = &axi_li_adsp_a_clk.c, - }, -}; - -static struct clk_freq_tbl clk_tbl_grp[] = { - F_BASIC( 24576000, lpxo, 1), - F_BASIC( 46080000, pll3, 16), - F_BASIC( 49152000, pll3, 15), - F_BASIC( 52662875, pll3, 14), - F_BASIC( 56713846, pll3, 13), - F_BASIC( 61440000, pll3, 12), - F_BASIC( 67025454, pll3, 11), - F_BASIC( 73728000, pll3, 10), - F_BASIC( 81920000, pll3, 9), - F_BASIC( 92160000, pll3, 8), - F_BASIC(105325714, pll3, 7), - F_BASIC(122880000, pll3, 6), - F_BASIC(147456000, pll3, 5), - F_BASIC(184320000, pll3, 4), - F_BASIC(192000000, pll1, 4), - F_BASIC(245760000, pll3, 3), - /* Sync to AXI. Hence this "rate" is not fixed. */ - F_RAW(1, &lpxo_clk.c, 0, BIT(14), 0, NULL), - F_END, -}; - -static struct rcg_clk grp_2d_clk = { - .b = { - .ctl_reg = GRP_2D_NS_REG, - .en_mask = BIT(7), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 31, - .reset_mask = P_GRP_2D_CLK, - }, - .ns_reg = GRP_2D_NS_REG, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_BASIC | (7 << 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_grp, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "grp_2d_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(NOMINAL, 192000000, HIGH, 245760000), - CLK_INIT(grp_2d_clk.c), - .depends = &axi_grp_2d_clk.c, - }, -}; - -static struct rcg_clk grp_3d_src_clk = { - .ns_reg = GRP_NS_REG, - .b = { - .ctl_reg = GRP_NS_REG, - .halt_check = NOCHECK, - }, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_BASIC | (7 << 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_grp, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "grp_3d_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(NOMINAL, 192000000, HIGH, 245760000), - CLK_INIT(grp_3d_src_clk.c), - .depends = &axi_li_grp_clk.c, - }, -}; - -static struct branch_clk grp_3d_clk = { - .b = { - .ctl_reg = GRP_NS_REG, - .en_mask = BIT(7), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 18, - .reset_mask = P_GRP_3D_CLK, - }, - .c = { - .parent = &grp_3d_src_clk.c, - .dbg_name = "grp_3d_clk", - .ops = &clk_ops_branch, - CLK_INIT(grp_3d_clk.c), - }, -}; - -static struct branch_clk imem_clk = { - .b = { - .ctl_reg = GRP_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 19, - .reset_mask = P_IMEM_CLK, - }, - .c = { - .parent = &grp_3d_src_clk.c, - .dbg_name = "imem_clk", - .ops = &clk_ops_branch, - CLK_INIT(imem_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_sdc1_3[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8( 144000, 19, 12, lpxo, 1, 1, 171), - F_MND8( 400000, 19, 12, lpxo, 1, 2, 123), - F_MND8(16027000, 19, 12, pll3, 3, 14, 215), - F_MND8(17000000, 19, 12, pll3, 4, 19, 206), - F_MND8(20480000, 19, 12, pll3, 4, 23, 212), - F_MND8(24576000, 19, 12, lpxo, 1, 0, 0), - F_MND8(49152000, 19, 12, pll3, 3, 1, 5), - F_END, -}; - -static struct rcg_clk sdc1_clk = { - .b = { - .ctl_reg = SDCn_NS_REG(1), - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 1, - .reset_mask = P_SDC1_CLK, - }, - .ns_reg = SDCn_NS_REG(1), - .md_reg = SDCn_NS_REG(1) - 4, - .ns_mask = F_MASK_MND8(19, 12), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_sdc1_3, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "sdc1_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 49152000), - CLK_INIT(sdc1_clk.c), - }, -}; - -static struct rcg_clk sdc3_clk = { - .b = { - .ctl_reg = SDCn_NS_REG(3), - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 24, - .reset_mask = P_SDC3_CLK, - }, - .ns_reg = SDCn_NS_REG(3), - .md_reg = SDCn_NS_REG(3) - 4, - .ns_mask = F_MASK_MND8(19, 12), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_sdc1_3, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "sdc3_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 49152000), - CLK_INIT(sdc3_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_sdc2_4[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8( 144000, 20, 13, lpxo, 1, 1, 171), - F_MND8( 400000, 20, 13, lpxo, 1, 2, 123), - F_MND8(16027000, 20, 13, pll3, 3, 14, 215), - F_MND8(17000000, 20, 13, pll3, 4, 19, 206), - F_MND8(20480000, 20, 13, pll3, 4, 23, 212), - F_MND8(24576000, 20, 13, lpxo, 1, 0, 0), - F_MND8(49152000, 20, 13, pll3, 3, 1, 5), - F_END, -}; - -static struct rcg_clk sdc2_clk = { - .b = { - .ctl_reg = SDCn_NS_REG(2), - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 0, - .reset_mask = P_SDC2_CLK, - }, - .ns_reg = SDCn_NS_REG(2), - .md_reg = SDCn_NS_REG(2) - 4, - .ns_mask = F_MASK_MND8(20, 13), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_sdc2_4, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "sdc2_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 49152000), - CLK_INIT(sdc2_clk.c), - }, -}; - -static struct rcg_clk sdc4_clk = { - .b = { - .ctl_reg = SDCn_NS_REG(4), - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 25, - .reset_mask = P_SDC4_CLK, - }, - .ns_reg = SDCn_NS_REG(4), - .md_reg = SDCn_NS_REG(4) - 4, - .ns_mask = F_MASK_MND8(20, 13), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_sdc2_4, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "sdc4_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 49152000), - CLK_INIT(sdc4_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mdp_core[] = { - F_BASIC( 24576000, lpxo, 1), - F_BASIC( 46080000, pll3, 16), - F_BASIC( 49152000, pll3, 15), - F_BASIC( 52663000, pll3, 14), - F_BASIC( 92160000, pll3, 8), - F_BASIC(122880000, pll3, 6), - F_BASIC(147456000, pll3, 5), - F_BASIC(153600000, pll1, 5), - F_BASIC(192000000, pll1, 4), - F_END, -}; - -static struct rcg_clk mdp_clk = { - .b = { - .ctl_reg = MDP_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 16, - .reset_mask = P_MDP_CLK, - }, - .ns_reg = MDP_NS_REG, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_BASIC, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_mdp_core, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000), - CLK_INIT(mdp_clk.c), - .depends = &axi_mdp_clk.c, - }, -}; - -static struct clk_freq_tbl clk_tbl_mdp_lcdc[] = { - F_MND16( 0, gnd, 1, 0, 0), - F_MND16(24576000, lpxo, 1, 0, 0), - F_MND16(30720000, pll3, 4, 1, 6), - F_MND16(32768000, pll3, 3, 2, 15), - F_MND16(40960000, pll3, 2, 1, 9), - F_MND16(73728000, pll3, 2, 1, 5), - F_END, -}; - -static struct rcg_clk mdp_lcdc_pclk_clk = { - .b = { - .ctl_reg = MDP_LCDC_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 28, - .reset_mask = P_MDP_LCDC_PCLK_CLK, - }, - .ns_reg = MDP_LCDC_NS_REG, - .md_reg = MDP_LCDC_NS_REG - 4, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_mdp_lcdc, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_lcdc_pclk_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 73728000), - CLK_INIT(mdp_lcdc_pclk_clk.c), - }, -}; - -static struct branch_clk mdp_lcdc_pad_pclk_clk = { - .b = { - .ctl_reg = MDP_LCDC_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 29, - .reset_mask = P_MDP_LCDC_PAD_PCLK_CLK, - }, - .c = { - .parent = &mdp_lcdc_pclk_clk.c, - .dbg_name = "mdp_lcdc_pad_pclk_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_lcdc_pad_pclk_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mdp_vsync[] = { - F_RAW( 0, &gnd_clk.c, 0, (0x3<<2), 0, NULL), - F_RAW(24576000, &lpxo_clk.c, 0, (0x1<<2), 0, NULL), - F_END, -}; - -static struct rcg_clk mdp_vsync_clk = { - .b = { - .ctl_reg = MDP_VSYNC_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 30, - .reset_mask = P_MDP_VSYNC_CLK, - }, - .ns_reg = MDP_VSYNC_REG, - .ns_mask = BM(3, 2), - .freq_tbl = clk_tbl_mdp_vsync, - .set_rate = set_rate_nop, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_vsync_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 24576000), - CLK_INIT(mdp_vsync_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mi2s_codec[] = { - F_MND16( 0, gnd, 1, 0, 0), - F_MND16( 2048000, lpxo, 4, 1, 3), - F_MND16(12288000, lpxo, 2, 0, 0), - F_END, -}; - -static struct rcg_clk mi2s_codec_rx_m_clk = { - .b = { - .ctl_reg = MI2S_RX_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 12, - .reset_mask = P_MI2S_CODEC_RX_M_CLK, - }, - .ns_reg = MI2S_RX_NS_REG, - .md_reg = MI2S_RX_NS_REG - 4, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_mi2s_codec, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mi2s_codec_rx_m_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 12288000), - CLK_INIT(mi2s_codec_rx_m_clk.c), - }, -}; - -static struct branch_clk mi2s_codec_rx_s_clk = { - .b = { - .ctl_reg = MI2S_RX_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 13, - .reset_mask = P_MI2S_CODEC_RX_S_CLK, - }, - .c = { - .parent = &mi2s_codec_rx_m_clk.c, - .dbg_name = "mi2s_codec_rx_s_clk", - .ops = &clk_ops_branch, - CLK_INIT(mi2s_codec_rx_s_clk.c), - }, -}; - -static struct rcg_clk mi2s_codec_tx_m_clk = { - .b = { - .ctl_reg = MI2S_TX_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 8, - .reset_mask = P_MI2S_CODEC_TX_M_CLK, - }, - .ns_reg = MI2S_TX_NS_REG, - .md_reg = MI2S_TX_NS_REG - 4, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_mi2s_codec, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mi2s_codec_tx_m_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 12288000), - CLK_INIT(mi2s_codec_tx_m_clk.c), - }, -}; - -static struct branch_clk mi2s_codec_tx_s_clk = { - .b = { - .ctl_reg = MI2S_TX_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 11, - .reset_mask = P_MI2S_CODEC_TX_S_CLK, - }, - .c = { - .parent = &mi2s_codec_tx_m_clk.c, - .dbg_name = "mi2s_codec_tx_s_clk", - .ops = &clk_ops_branch, - CLK_INIT(mi2s_codec_tx_s_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mi2s[] = { - F_MND16( 0, gnd, 1, 0, 0), - F_MND16(12288000, lpxo, 2, 0, 0), - F_END, -}; - -static struct rcg_clk mi2s_m_clk = { - .b = { - .ctl_reg = MI2S_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 4, - .reset_mask = P_MI2S_M_CLK, - }, - .ns_reg = MI2S_NS_REG, - .md_reg = MI2S_NS_REG - 4, - .root_en_mask = BIT(11), - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_mi2s, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mi2s_m_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 12288000), - CLK_INIT(mi2s_m_clk.c), - }, -}; - -static struct branch_clk mi2s_s_clk = { - .b = { - .ctl_reg = MI2S_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 3, - .reset_mask = P_MI2S_S_CLK, - }, - .c = { - .parent = &mi2s_m_clk.c, - .dbg_name = "mi2s_s_clk", - .ops = &clk_ops_branch, - CLK_INIT(mi2s_s_clk.c), - }, -}; - -#define F_SDAC(f, s, div, m, n) \ - { \ - .freq_hz = f, \ - .md_val = MD16(m, n), \ - .ns_val = N16(m, n) | SPDIV(SRC_SEL_SDAC_##s, div), \ - .src_clk = &s##_clk.c, \ - } - -static struct clk_freq_tbl clk_tbl_sdac[] = { - F_SDAC( 256000, lpxo, 4, 1, 24), - F_SDAC( 352800, lpxo, 1, 147, 10240), - F_SDAC( 384000, lpxo, 4, 1, 16), - F_SDAC( 512000, lpxo, 4, 1, 12), - F_SDAC( 705600, lpxo, 1, 147, 5120), - F_SDAC( 768000, lpxo, 4, 1, 8), - F_SDAC(1024000, lpxo, 4, 1, 6), - F_SDAC(1411200, lpxo, 1, 147, 2560), - F_SDAC(1536000, lpxo, 4, 1, 4), - F_END, -}; - -static struct rcg_clk sdac_clk = { - .b = { - .ctl_reg = SDAC_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 2, - .reset_mask = P_SDAC_CLK, - }, - .ns_reg = SDAC_NS_REG, - .md_reg = SDAC_NS_REG - 4, - .root_en_mask = BIT(11), - .mnd_en_mask = BIT(8), - .freq_tbl = clk_tbl_sdac, - .ns_mask = F_MASK_MND16, - .set_rate = set_rate_mnd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "sdac_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 1536000), - CLK_INIT(sdac_clk.c), - }, -}; - -static struct branch_clk sdac_m_clk = { - .b = { - .ctl_reg = SDAC_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 17, - .reset_mask = P_SDAC_M_CLK, - }, - .c = { - .parent = &sdac_clk.c, - .dbg_name = "sdac_m_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdac_m_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_tv[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8(27000000, 23, 16, pll4, 2, 2, 33), - F_MND8(74250000, 23, 16, pll4, 2, 1, 6), - F_END, -}; - -static struct rcg_clk tv_clk = { - .ns_reg = TV_NS_REG, - .b = { - .ctl_reg = TV_NS_REG, - .halt_check = NOCHECK, - }, - .md_reg = TV_NS_REG - 4, - .ns_mask = F_MASK_MND8(23, 16), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_tv, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "tv_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 74250000), - CLK_INIT(tv_clk.c), - }, -}; - -static struct branch_clk hdmi_clk = { - .b = { - .ctl_reg = HDMI_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 7, - .reset_mask = P_HDMI_CLK, - }, - .c = { - .parent = &tv_clk.c, - .dbg_name = "hdmi_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_clk.c), - }, -}; - -static struct branch_clk tv_dac_clk = { - .b = { - .ctl_reg = TV_NS_REG, - .en_mask = BIT(12), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 27, - .reset_mask = P_TV_DAC_CLK, - }, - .c = { - .parent = &tv_clk.c, - .dbg_name = "tv_dac_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_dac_clk.c), - }, -}; - -static struct branch_clk tv_enc_clk = { - .b = { - .ctl_reg = TV_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 10, - .reset_mask = P_TV_ENC_CLK, - }, - .c = { - .parent = &tv_clk.c, - .dbg_name = "tv_enc_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_enc_clk.c), - }, -}; - -/* Hacking root & branch into one param. */ -static struct branch_clk tsif_ref_clk = { - .b = { - .ctl_reg = TSIF_NS_REG, - .en_mask = BIT(9)|BIT(11), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 11, - .reset_mask = P_TSIF_REF_CLK, - }, - .c = { - .parent = &tv_clk.c, - .dbg_name = "tsif_ref_clk", - .ops = &clk_ops_branch, - CLK_INIT(tsif_ref_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_usb[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8(60000000, 23, 16, pll1, 2, 5, 32), - F_END, -}; - -static struct rcg_clk usb_hs_src_clk = { - .ns_reg = USBH_NS_REG, - .b = { - .ctl_reg = USBH_NS_REG, - .halt_check = NOCHECK, - }, - .md_reg = USBH_NS_REG - 4, - .ns_mask = F_MASK_MND8(23, 16), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_usb, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "usb_hs_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), - CLK_INIT(usb_hs_src_clk.c), - .depends = &axi_li_adsp_a_clk.c, - }, -}; - -static struct branch_clk usb_hs_clk = { - .b = { - .ctl_reg = USBH_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 26, - .reset_mask = P_USB_HS_CLK, - }, - .c = { - .dbg_name = "usb_hs_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs_clk.c), - }, -}; - -static struct branch_clk usb_hs_core_clk = { - .b = { - .ctl_reg = USBH_NS_REG, - .en_mask = BIT(13), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 27, - .reset_mask = P_USB_HS_CORE_CLK, - }, - .c = { - .parent = &usb_hs_src_clk.c, - .dbg_name = "usb_hs_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs_core_clk.c), - }, -}; - -static struct branch_clk usb_hs2_clk = { - .b = { - .ctl_reg = USBH2_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 3, - .reset_mask = P_USB_HS2_CLK, - }, - .c = { - .parent = &usb_hs_src_clk.c, - .dbg_name = "usb_hs2_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs2_clk.c), - }, -}; - -static struct branch_clk usb_hs2_core_clk = { - .b = { - .ctl_reg = USBH2_NS_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 28, - .reset_mask = P_USB_HS2_CORE_CLK, - }, - .c = { - .parent = &usb_hs_src_clk.c, - .dbg_name = "usb_hs2_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs2_core_clk.c), - }, -}; - -static struct branch_clk usb_hs3_clk = { - .b = { - .ctl_reg = USBH3_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 2, - .reset_mask = P_USB_HS3_CLK, - }, - .c = { - .parent = &usb_hs_src_clk.c, - .dbg_name = "usb_hs3_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs3_clk.c), - }, -}; - -static struct branch_clk usb_hs3_core_clk = { - .b = { - .ctl_reg = USBH3_NS_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 29, - .reset_mask = P_USB_HS3_CORE_CLK, - }, - .c = { - .parent = &usb_hs_src_clk.c, - .dbg_name = "usb_hs3_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs3_core_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_vfe_jpeg[] = { - F_MND16( 24576000, lpxo, 1, 0, 0), - F_MND16( 36864000, pll3, 4, 1, 5), - F_MND16( 46080000, pll3, 4, 1, 4), - F_MND16( 61440000, pll3, 4, 1, 3), - F_MND16( 73728000, pll3, 2, 1, 5), - F_MND16( 81920000, pll3, 3, 1, 3), - F_MND16( 92160000, pll3, 4, 1, 2), - F_MND16( 98304000, pll3, 3, 2, 5), - F_MND16(105326000, pll3, 2, 2, 7), - F_MND16(122880000, pll3, 2, 1, 3), - F_MND16(147456000, pll3, 2, 2, 5), - F_MND16(153600000, pll1, 2, 2, 5), - F_MND16(192000000, pll1, 4, 0, 0), - F_END, -}; - -static struct rcg_clk jpeg_clk = { - .b = { - .ctl_reg = JPEG_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 1, - .reset_mask = P_JPEG_CLK, - }, - .ns_reg = JPEG_NS_REG, - .md_reg = JPEG_NS_REG - 4, - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_vfe_jpeg, - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "jpeg_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000), - CLK_INIT(jpeg_clk.c), - .depends = &axi_li_jpeg_clk.c, - }, -}; - -static struct rcg_clk vfe_clk = { - .b = { - .ctl_reg = CAM_VFE_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEB_REG, - .halt_bit = 0, - .reset_mask = P_VFE_CLK, - }, - .ns_reg = CAM_VFE_NS_REG, - .md_reg = CAM_VFE_NS_REG - 4, - .root_en_mask = BIT(13), - .freq_tbl = clk_tbl_vfe_jpeg, - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vfe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(NOMINAL, 153600000, HIGH, 192000000), - CLK_INIT(vfe_clk.c), - .depends = &axi_li_vfe_clk.c, - }, -}; - -static struct branch_clk vfe_mdc_clk = { - .b = { - .ctl_reg = CAM_VFE_NS_REG, - .en_mask = BIT(11), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 9, - .reset_mask = P_VFE_MDC_CLK, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "vfe_mdc_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_mdc_clk.c), - }, -}; - -static struct branch_clk vfe_camif_clk = { - .b = { - .ctl_reg = CAM_VFE_NS_REG, - .en_mask = BIT(15), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 13, - .reset_mask = P_VFE_CAMIF_CLK, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "vfe_camif_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_camif_clk.c), - }, -}; - -static struct branch_clk csi0_vfe_clk = { - .b = { - .ctl_reg = CSI_NS_REG, - .en_mask = BIT(15), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 16, - .reset_mask = P_CSI0_VFE_CLK, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "csi0_vfe_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_vfe_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_cam[] = { - F_MND16( 0, gnd, 1, 0, 0), - F_MND16( 6000000, pll1, 4, 1, 32), - F_MND16( 8000000, pll1, 4, 1, 24), - F_MND16(12000000, pll1, 4, 1, 16), - F_MND16(16000000, pll1, 4, 1, 12), - F_MND16(19200000, pll1, 4, 1, 10), - F_MND16(24000000, pll1, 4, 1, 8), - F_MND16(32000000, pll1, 4, 1, 6), - F_MND16(48000000, pll1, 4, 1, 4), - F_MND16(64000000, pll1, 4, 1, 3), - F_END, -}; - -static struct rcg_clk cam_m_clk = { - .b = { - .ctl_reg = CAM_NS_REG, - .halt_check = DELAY, - .reset_mask = P_CAM_M_CLK, - }, - .ns_reg = CAM_NS_REG, - .md_reg = CAM_NS_REG - 4, - .root_en_mask = BIT(9), - .freq_tbl = clk_tbl_cam, - .ns_mask = F_MASK_MND16, - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "cam_m_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 64000000), - CLK_INIT(cam_m_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_vpe[] = { - F_MND8( 24576000, 22, 15, lpxo, 1, 0, 0), - F_MND8( 30720000, 22, 15, pll3, 4, 1, 6), - F_MND8( 61440000, 22, 15, pll3, 4, 1, 3), - F_MND8( 81920000, 22, 15, pll3, 3, 1, 3), - F_MND8(122880000, 22, 15, pll3, 3, 1, 2), - F_MND8(147456000, 22, 15, pll3, 1, 1, 5), - F_MND8(153600000, 22, 15, pll1, 1, 1, 5), - F_END, -}; - -static struct rcg_clk vpe_clk = { - .b = { - .ctl_reg = VPE_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 10, - .reset_mask = P_VPE_CLK, - }, - .ns_reg = VPE_NS_REG, - .md_reg = VPE_NS_REG - 4, - .ns_mask = F_MASK_MND8(22, 15), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_vpe, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "vpe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 153600000), - CLK_INIT(vpe_clk.c), - .depends = &axi_vpe_clk.c, - }, -}; - -static struct clk_freq_tbl clk_tbl_mfc[] = { - F_MND8( 24576000, 24, 17, lpxo, 1, 0, 0), - F_MND8( 30720000, 24, 17, pll3, 4, 1, 6), - F_MND8( 61440000, 24, 17, pll3, 4, 1, 3), - F_MND8( 81920000, 24, 17, pll3, 3, 1, 3), - F_MND8(122880000, 24, 17, pll3, 3, 1, 2), - F_MND8(147456000, 24, 17, pll3, 1, 1, 5), - F_MND8(153600000, 24, 17, pll1, 1, 1, 5), - F_MND8(170667000, 24, 17, pll1, 1, 2, 9), - F_END, -}; - -static struct rcg_clk mfc_clk = { - .b = { - .ctl_reg = MFC_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 12, - .reset_mask = P_MFC_CLK, - }, - .ns_reg = MFC_NS_REG, - .md_reg = MFC_NS_REG - 4, - .ns_mask = F_MASK_MND8(24, 17), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_mfc, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "mfc_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 170667000), - CLK_INIT(mfc_clk.c), - .depends = &axi_mfc_clk.c, - }, -}; - -static struct branch_clk mfc_div2_clk = { - .b = { - .ctl_reg = MFC_NS_REG, - .en_mask = BIT(15), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 11, - .reset_mask = P_MFC_DIV2_CLK, - }, - .c = { - .parent = &mfc_clk.c, - .dbg_name = "mfc_div2_clk", - .ops = &clk_ops_branch, - CLK_INIT(mfc_div2_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_spi[] = { - F_MND8( 0, 0, 0, gnd, 1, 0, 0), - F_MND8( 9963243, 19, 12, pll3, 4, 2, 37), - F_MND8(24576000, 19, 12, lpxo, 1, 0, 0), - F_MND8(26331429, 19, 12, pll3, 4, 1, 7), - F_END, -}; - -static struct rcg_clk spi_clk = { - .b = { - .ctl_reg = SPI_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 0, - .reset_mask = P_SPI_CLK, - }, - .ns_reg = SPI_NS_REG, - .md_reg = SPI_NS_REG - 4, - .ns_mask = F_MASK_MND8(19, 12), - .mnd_en_mask = BIT(8), - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_spi, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_mnd, - .c = { - .dbg_name = "spi_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 26331429), - CLK_INIT(spi_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_lpa_codec[] = { - F_RAW(1, NULL, 0, 0, 0, NULL), /* src MI2S_CODEC_RX */ - F_RAW(2, NULL, 0, 1, 0, NULL), /* src ECODEC_CIF */ - F_RAW(3, NULL, 0, 2, 0, NULL), /* src MI2S */ - F_RAW(4, NULL, 0, 3, 0, NULL), /* src SDAC */ - F_END, -}; - -static struct rcg_clk lpa_codec_clk = { - .b = { - .ctl_reg = LPA_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 6, - .reset_mask = P_LPA_CODEC_CLK, - }, - .ns_reg = LPA_NS_REG, - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_lpa_codec, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "lpa_codec_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 4), - CLK_INIT(lpa_codec_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_mdc[] = { - F_RAW(1, NULL, 0, 0, 0, NULL), - F_END -}; - -static struct rcg_clk mdc_clk = { - .b = { - .ctl_reg = MDC_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_STATEA_REG, - .halt_bit = 10, - .reset_mask = P_MDC_CLK, - }, - .ns_reg = MDC_NS_REG, - .root_en_mask = BIT(11), - .freq_tbl = clk_tbl_mdc, - .current_freq = &rcg_dummy_freq, - .set_rate = set_rate_nop, - .c = { - .dbg_name = "mdc_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 1), - CLK_INIT(mdc_clk.c), - }, -}; - -static struct branch_clk lpa_core_clk = { - .b = { - .ctl_reg = LPA_NS_REG, - .en_mask = BIT(5), - .halt_reg = CLK_HALT_STATEC_REG, - .halt_bit = 5, - .reset_mask = P_LPA_CORE_CLK, - }, - .c = { - .dbg_name = "lpa_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(lpa_core_clk.c), - }, -}; - -static DEFINE_CLK_PCOM(adsp_clk, ADSP_CLK, 0); -static DEFINE_CLK_PCOM(codec_ssbi_clk, CODEC_SSBI_CLK, 0); -static DEFINE_CLK_PCOM(ebi1_clk, EBI1_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(ebi1_fixed_clk, EBI1_FIXED_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(ecodec_clk, ECODEC_CLK, 0); -static DEFINE_CLK_PCOM(gp_clk, GP_CLK, 0); -static DEFINE_CLK_PCOM(uart3_clk, UART3_CLK, 0); -static DEFINE_CLK_PCOM(usb_phy_clk, USB_PHY_CLK, CLKFLAG_MIN); - -static DEFINE_CLK_PCOM(p_grp_2d_clk, GRP_2D_CLK, 0); -static DEFINE_CLK_PCOM(p_grp_2d_p_clk, GRP_2D_P_CLK, 0); -static DEFINE_CLK_PCOM(p_hdmi_clk, HDMI_CLK, 0); -static DEFINE_CLK_PCOM(p_jpeg_clk, JPEG_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(p_jpeg_p_clk, JPEG_P_CLK, 0); -static DEFINE_CLK_PCOM(p_lpa_codec_clk, LPA_CODEC_CLK, 0); -static DEFINE_CLK_PCOM(p_lpa_core_clk, LPA_CORE_CLK, 0); -static DEFINE_CLK_PCOM(p_lpa_p_clk, LPA_P_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_m_clk, MI2S_M_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_s_clk, MI2S_S_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_codec_rx_m_clk, MI2S_CODEC_RX_M_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_codec_rx_s_clk, MI2S_CODEC_RX_S_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_codec_tx_m_clk, MI2S_CODEC_TX_M_CLK, 0); -static DEFINE_CLK_PCOM(p_mi2s_codec_tx_s_clk, MI2S_CODEC_TX_S_CLK, 0); -static DEFINE_CLK_PCOM(p_sdac_clk, SDAC_CLK, 0); -static DEFINE_CLK_PCOM(p_sdac_m_clk, SDAC_M_CLK, 0); -static DEFINE_CLK_PCOM(p_vfe_clk, VFE_CLK, 0); -static DEFINE_CLK_PCOM(p_vfe_camif_clk, VFE_CAMIF_CLK, 0); -static DEFINE_CLK_PCOM(p_vfe_mdc_clk, VFE_MDC_CLK, 0); -static DEFINE_CLK_PCOM(p_vfe_p_clk, VFE_P_CLK, 0); -static DEFINE_CLK_PCOM(p_grp_3d_clk, GRP_3D_CLK, 0); -static DEFINE_CLK_PCOM(p_grp_3d_p_clk, GRP_3D_P_CLK, 0); -static DEFINE_CLK_PCOM(p_imem_clk, IMEM_CLK, 0); -static DEFINE_CLK_PCOM(p_mdp_lcdc_pad_pclk_clk, MDP_LCDC_PAD_PCLK_CLK, 0); -static DEFINE_CLK_PCOM(p_mdp_lcdc_pclk_clk, MDP_LCDC_PCLK_CLK, 0); -static DEFINE_CLK_PCOM(p_mdp_p_clk, MDP_P_CLK, 0); -static DEFINE_CLK_PCOM(p_mdp_vsync_clk, MDP_VSYNC_CLK, 0); -static DEFINE_CLK_PCOM(p_tsif_ref_clk, TSIF_REF_CLK, 0); -static DEFINE_CLK_PCOM(p_tsif_p_clk, TSIF_P_CLK, 0); -static DEFINE_CLK_PCOM(p_tv_dac_clk, TV_DAC_CLK, 0); -static DEFINE_CLK_PCOM(p_tv_enc_clk, TV_ENC_CLK, 0); -static DEFINE_CLK_PCOM(p_emdh_clk, EMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX); -static DEFINE_CLK_PCOM(p_emdh_p_clk, EMDH_P_CLK, 0); -static DEFINE_CLK_PCOM(p_i2c_clk, I2C_CLK, 0); -static DEFINE_CLK_PCOM(p_i2c_2_clk, I2C_2_CLK, 0); -static DEFINE_CLK_PCOM(p_mdc_clk, MDC_CLK, 0); -static DEFINE_CLK_PCOM(p_pmdh_clk, PMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX); -static DEFINE_CLK_PCOM(p_pmdh_p_clk, PMDH_P_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc1_clk, SDC1_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc1_p_clk, SDC1_P_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc2_clk, SDC2_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc2_p_clk, SDC2_P_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc3_clk, SDC3_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc3_p_clk, SDC3_P_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc4_clk, SDC4_CLK, 0); -static DEFINE_CLK_PCOM(p_sdc4_p_clk, SDC4_P_CLK, 0); -static DEFINE_CLK_PCOM(p_uart2_clk, UART2_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs2_clk, USB_HS2_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs2_core_clk, USB_HS2_CORE_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs2_p_clk, USB_HS2_P_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs3_clk, USB_HS3_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs3_core_clk, USB_HS3_CORE_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs3_p_clk, USB_HS3_P_CLK, 0); -static DEFINE_CLK_PCOM(p_qup_i2c_clk, QUP_I2C_CLK, 0); -static DEFINE_CLK_PCOM(p_spi_clk, SPI_CLK, 0); -static DEFINE_CLK_PCOM(p_spi_p_clk, SPI_P_CLK, 0); -static DEFINE_CLK_PCOM(p_uart1_clk, UART1_CLK, 0); -static DEFINE_CLK_PCOM(p_uart1dm_clk, UART1DM_CLK, 0); -static DEFINE_CLK_PCOM(p_uart2dm_clk, UART2DM_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs_clk, USB_HS_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs_core_clk, USB_HS_CORE_CLK, 0); -static DEFINE_CLK_PCOM(p_usb_hs_p_clk, USB_HS_P_CLK, 0); -static DEFINE_CLK_PCOM(p_cam_m_clk, CAM_M_CLK, 0); -static DEFINE_CLK_PCOM(p_camif_pad_p_clk, CAMIF_PAD_P_CLK, 0); -static DEFINE_CLK_PCOM(p_csi0_clk, CSI0_CLK, 0); -static DEFINE_CLK_PCOM(p_csi0_vfe_clk, CSI0_VFE_CLK, 0); -static DEFINE_CLK_PCOM(p_csi0_p_clk, CSI0_P_CLK, 0); -static DEFINE_CLK_PCOM(p_mdp_clk, MDP_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(p_mfc_clk, MFC_CLK, 0); -static DEFINE_CLK_PCOM(p_mfc_div2_clk, MFC_DIV2_CLK, 0); -static DEFINE_CLK_PCOM(p_mfc_p_clk, MFC_P_CLK, 0); -static DEFINE_CLK_PCOM(p_vpe_clk, VPE_CLK, 0); -static DEFINE_CLK_PCOM(p_adm_clk, ADM_CLK, 0); -static DEFINE_CLK_PCOM(p_ce_clk, CE_CLK, 0); -static DEFINE_CLK_PCOM(p_axi_rotator_clk, AXI_ROTATOR_CLK, 0); -static DEFINE_CLK_PCOM(p_rotator_imem_clk, ROTATOR_IMEM_CLK, 0); -static DEFINE_CLK_PCOM(p_rotator_p_clk, ROTATOR_P_CLK, 0); - -static DEFINE_CLK_VOTER(ebi_dtv_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_grp_3d_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_grp_2d_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_lcdc_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_mddi_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_tv_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_vcd_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_vfe_clk, &ebi1_fixed_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_adm_clk, &ebi1_fixed_clk.c, 0); - -#ifdef CONFIG_DEBUG_FS - -#define CLK_TEST_2(s) (s) -#define CLK_TEST_HS(s) (0x4000 | ((s) << 8)) -#define CLK_TEST_LS(s) (0x4D40 | (s)) - -struct measure_sel { - u32 test_vector; - struct clk *c; -}; - -static struct measure_sel measure_mux[] = { - { CLK_TEST_2(0x03), &emdh_p_clk.c }, - { CLK_TEST_2(0x04), &pmdh_p_clk.c }, - { CLK_TEST_2(0x06), &mdp_p_clk.c }, - { CLK_TEST_2(0x07), &lpa_p_clk.c }, - { CLK_TEST_2(0x08), &usb_hs2_p_clk.c }, - { CLK_TEST_2(0x09), &spi_clk.c }, - { CLK_TEST_2(0x0B), &i2c_2_clk.c }, - { CLK_TEST_2(0x0D), &mi2s_m_clk.c }, - { CLK_TEST_2(0x0E), &lpa_core_clk.c }, - { CLK_TEST_2(0x0F), &lpa_codec_clk.c }, - { CLK_TEST_2(0x10), &usb_hs3_p_clk.c }, - { CLK_TEST_2(0x11), &adm_p_clk.c }, - { CLK_TEST_2(0x13), &hdmi_clk.c }, - { CLK_TEST_2(0x14), &usb_hs_core_clk.c }, - { CLK_TEST_2(0x15), &usb_hs2_core_clk.c }, - { CLK_TEST_2(0x16), &usb_hs3_core_clk.c }, - { CLK_TEST_2(0x17), &mi2s_codec_tx_s_clk.c }, - { CLK_TEST_2(0x18), &spi_p_clk.c }, - { CLK_TEST_2(0x1A), &camif_pad_p_clk.c }, - { CLK_TEST_2(0x1C), &qup_i2c_clk.c }, - { CLK_TEST_2(0x1F), &mfc_div2_clk.c }, - { CLK_TEST_2(0x38), &mfc_clk.c }, - - { CLK_TEST_HS(0x00), &adm_clk.c }, - { CLK_TEST_HS(0x01), &mdp_lcdc_pad_pclk_clk.c }, - { CLK_TEST_HS(0x02), &mdp_lcdc_pclk_clk.c }, - { CLK_TEST_HS(0x03), &axi_rotator_clk.c }, - { CLK_TEST_HS(0x07), &axi_li_vg_clk.c }, - { CLK_TEST_HS(0x09), &axi_li_apps_clk.c }, - { CLK_TEST_HS(0x0E), &axi_li_jpeg_clk.c }, - { CLK_TEST_HS(0x0F), &emdh_clk.c }, - { CLK_TEST_HS(0x14), &mdp_clk.c }, - { CLK_TEST_HS(0x15), &pmdh_clk.c }, - { CLK_TEST_HS(0x19), &axi_grp_2d_clk.c }, - { CLK_TEST_HS(0x1A), &axi_li_grp_clk.c }, - { CLK_TEST_HS(0x1B), &axi_li_vfe_clk.c }, - { CLK_TEST_HS(0x1C), &grp_2d_clk.c }, - { CLK_TEST_HS(0x1E), &grp_3d_clk.c }, - { CLK_TEST_HS(0x1F), &imem_clk.c }, - { CLK_TEST_HS(0x20), &jpeg_clk.c }, - { CLK_TEST_HS(0x24), &axi_li_adsp_a_clk.c }, - { CLK_TEST_HS(0x26), &rotator_imem_clk.c }, - { CLK_TEST_HS(0x27), &axi_vpe_clk.c }, - { CLK_TEST_HS(0x2A), &axi_mfc_clk.c }, - { CLK_TEST_HS(0x2B), &axi_mdp_clk.c }, - { CLK_TEST_HS(0x2C), &vpe_clk.c }, - { CLK_TEST_HS(0x30), &vfe_camif_clk.c }, - { CLK_TEST_HS(0x31), &csi0_clk.c }, - { CLK_TEST_HS(0x32), &csi0_vfe_clk.c }, - { CLK_TEST_HS(0x33), &csi0_p_clk.c }, - - { CLK_TEST_LS(0x03), &ce_clk.c }, - { CLK_TEST_LS(0x04), &cam_m_clk.c }, - { CLK_TEST_LS(0x0C), &grp_2d_p_clk.c }, - { CLK_TEST_LS(0x0D), &i2c_clk.c }, - { CLK_TEST_LS(0x0E), &mi2s_codec_rx_m_clk.c }, - { CLK_TEST_LS(0x0F), &mi2s_codec_rx_s_clk.c }, - { CLK_TEST_LS(0x10), &mi2s_codec_tx_m_clk.c }, - { CLK_TEST_LS(0x13), &mdp_vsync_clk.c }, - { CLK_TEST_LS(0x15), &vfe_p_clk.c }, - { CLK_TEST_LS(0x16), &mdc_clk.c }, - { CLK_TEST_LS(0x17), &vfe_mdc_clk.c }, - { CLK_TEST_LS(0x18), &usb_hs_p_clk.c }, - { CLK_TEST_LS(0x1C), &uart1dm_p_clk.c }, - { CLK_TEST_LS(0x1E), &jpeg_p_clk.c }, - { CLK_TEST_LS(0x20), &sdac_clk.c }, - { CLK_TEST_LS(0x21), &sdc1_p_clk.c }, - { CLK_TEST_LS(0x22), &sdc1_clk.c }, - { CLK_TEST_LS(0x23), &sdc2_p_clk.c }, - { CLK_TEST_LS(0x24), &sdc2_clk.c }, - { CLK_TEST_LS(0x25), &tsif_p_clk.c }, - { CLK_TEST_LS(0x26), &sdac_m_clk.c }, - { CLK_TEST_LS(0x27), &grp_3d_p_clk.c }, - { CLK_TEST_LS(0x2A), &tsif_ref_clk.c }, - { CLK_TEST_LS(0x2B), &tv_enc_clk.c }, - { CLK_TEST_LS(0x2C), &tv_dac_clk.c }, - { CLK_TEST_LS(0x2D), &rotator_p_clk.c }, - { CLK_TEST_LS(0x2F), &uart1_clk.c }, - { CLK_TEST_LS(0x30), &uart1dm_clk.c }, - { CLK_TEST_LS(0x31), &uart2_clk.c }, - { CLK_TEST_LS(0x33), &usb_hs2_clk.c }, - { CLK_TEST_LS(0x34), &usb_hs3_clk.c }, - { CLK_TEST_LS(0x35), &mfc_p_clk.c }, - { CLK_TEST_LS(0x36), &vfe_clk.c }, - { CLK_TEST_LS(0x39), &sdc3_p_clk.c }, - { CLK_TEST_LS(0x3A), &sdc3_clk.c }, - { CLK_TEST_LS(0x3B), &sdc4_p_clk.c }, - { CLK_TEST_LS(0x3C), &sdc4_clk.c }, - { CLK_TEST_LS(0x3D), &uart2dm_clk.c }, - { CLK_TEST_LS(0x3E), &uart2dm_p_clk.c }, - { CLK_TEST_LS(0x3F), &usb_hs_clk.c }, -}; - -static struct measure_sel *find_measure_sel(struct clk *c) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(measure_mux); i++) - if (measure_mux[i].c == c) - return &measure_mux[i]; - return NULL; -} - -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - struct measure_sel *p; - unsigned long flags; - - if (!parent) - return -EINVAL; - - p = find_measure_sel(parent); - if (!p) - return -EINVAL; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Program test vector. */ - if (p->test_vector <= 0xFF) { - /* Select CLK_TEST_2 */ - writel_relaxed(0x4D40, CLK_TEST_BASE_REG); - writel_relaxed(p->test_vector, CLK_TEST_2_BASE_REG); - } else - writel_relaxed(p->test_vector, CLK_TEST_BASE_REG); - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return 0; -} - -/* Sample clock for 'tcxo4_ticks' reference clock ticks. */ -static unsigned long run_measurement(unsigned tcxo4_ticks) -{ - /* TCXO4_CNT_EN and RINGOSC_CNT_EN register values. */ - u32 reg_val_enable = readl_relaxed(MISC_CLK_CTL_BASE_REG) | 0x3; - u32 reg_val_disable = reg_val_enable & ~0x3; - - /* Stop counters and set the TCXO4 counter start value. */ - writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG); - writel_relaxed(tcxo4_ticks, TCXO_CNT_BASE_REG); - - /* Run measurement and wait for completion. */ - writel_relaxed(reg_val_enable, MISC_CLK_CTL_BASE_REG); - while (readl_relaxed(TCXO_CNT_DONE_BASE_REG) == 0) - cpu_relax(); - - /* Stop counters. */ - writel_relaxed(reg_val_disable, MISC_CLK_CTL_BASE_REG); - - return readl_relaxed(RINGOSC_CNT_BASE_REG); -} - -/* Perform a hardware rate measurement for a given clock. - FOR DEBUG USE ONLY: Measurements take ~15 ms! */ -static unsigned long measure_clk_get_rate(struct clk *c) -{ - unsigned long flags; - u32 regval, prph_web_reg_old; - u64 raw_count_short, raw_count_full; - unsigned ret; - - clk_prepare_enable(&tcxo_clk.c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Enable TCXO4 clock branch and root. */ - prph_web_reg_old = readl_relaxed(PRPH_WEB_NS_BASE_REG); - regval = prph_web_reg_old | BIT(9) | BIT(11); - writel_relaxed(regval, PRPH_WEB_NS_BASE_REG); - - /* - * The ring oscillator counter will not reset if the measured clock - * is not running. To detect this, run a short measurement before - * the full measurement. If the raw results of the two are the same - * then the clock must be off. - */ - - /* Run a short measurement. (~1 ms) */ - raw_count_short = run_measurement(0x1000); - /* Run a full measurement. (~14 ms) */ - raw_count_full = run_measurement(0x10000); - - /* Disable TCXO4 clock branch and root. */ - writel_relaxed(prph_web_reg_old, PRPH_WEB_NS_BASE_REG); - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - /* Return 0 if the clock is off. */ - if (raw_count_full == raw_count_short) - ret = 0; - else { - /* Compute rate in Hz. */ - raw_count_full = ((raw_count_full * 10) + 15) * 4800000; - do_div(raw_count_full, ((0x10000 * 10) + 35)); - ret = raw_count_full; - } - - clk_disable_unprepare(&tcxo_clk.c); - - return ret; -} -#else /* !CONFIG_DEBUG_FS */ -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - return -EINVAL; -} - -static unsigned long measure_clk_get_rate(struct clk *c) -{ - return 0; -} -#endif /* CONFIG_DEBUG_FS */ - -static struct clk_ops clk_ops_measure = { - .set_parent = measure_clk_set_parent, - .get_rate = measure_clk_get_rate, -}; - -static struct clk measure_clk = { - .dbg_name = "measure_clk", - .ops = &clk_ops_measure, - CLK_INIT(measure_clk), -}; - -/* Implementation for clk_set_flags(). */ -int soc_clk_set_flags(struct clk *c, unsigned clk_flags) -{ - uint32_t regval, ret = 0; - unsigned long flags; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - if (c == &vfe_clk.c) { - regval = readl_relaxed(CAM_VFE_NS_REG); - /* Flag values chosen for backward compatibility - * with proc_comm remote clock control. */ - if (clk_flags == 0x00000100) { - /* Select external source. */ - regval |= BIT(14); - } else if (clk_flags == 0x00000200) { - /* Select internal source. */ - regval &= ~BIT(14); - } else - ret = -EINVAL; - - writel_relaxed(regval, CAM_VFE_NS_REG); - /* Make sure write is issued before returning. */ - mb(); - } else - ret = -EPERM; - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} - -static int msm7x30_clk_reset(struct clk *c, enum clk_reset_action action) -{ - /* reset_mask is actually a proc_comm id */ - return pc_clk_reset(to_rcg_clk(c)->b.reset_mask, action); -} - -static int soc_branch_clk_reset(struct clk *c, enum clk_reset_action action) -{ - return pc_clk_reset(to_branch_clk(c)->b.reset_mask, action); -} - -/* - * Clock ownership detection code - */ - -enum { - SH2_OWN_GLBL, - SH2_OWN_APPS1, - SH2_OWN_APPS2, - SH2_OWN_ROW1, - SH2_OWN_ROW2, - SH2_OWN_APPS3, - NUM_OWNERSHIP -}; -static __initdata uint32_t ownership_regs[NUM_OWNERSHIP]; - -static void __init cache_ownership(void) -{ - ownership_regs[SH2_OWN_GLBL] = readl_relaxed(SH2_OWN_GLBL_BASE_REG); - ownership_regs[SH2_OWN_APPS1] = readl_relaxed(SH2_OWN_APPS1_BASE_REG); - ownership_regs[SH2_OWN_APPS2] = readl_relaxed(SH2_OWN_APPS2_BASE_REG); - ownership_regs[SH2_OWN_ROW1] = readl_relaxed(SH2_OWN_ROW1_BASE_REG); - ownership_regs[SH2_OWN_ROW2] = readl_relaxed(SH2_OWN_ROW2_BASE_REG); - ownership_regs[SH2_OWN_APPS3] = readl_relaxed(SH2_OWN_APPS3_BASE_REG); -} - -static void __init print_ownership(void) -{ - pr_info("Clock ownership\n"); - pr_info(" GLBL : %08x\n", ownership_regs[SH2_OWN_GLBL]); - pr_info(" APPS : %08x %08x %08x\n", ownership_regs[SH2_OWN_APPS1], - ownership_regs[SH2_OWN_APPS2], ownership_regs[SH2_OWN_APPS3]); - pr_info(" ROW : %08x %08x\n", ownership_regs[SH2_OWN_ROW1], - ownership_regs[SH2_OWN_ROW2]); -} - -#define O(x) (&ownership_regs[(SH2_OWN_##x)]) -#define OWN(r, b, name, clk, dev) \ - { \ - .lk = CLK_LOOKUP(name, clk.c, dev), \ - .remote = &p_##clk.c, \ - .reg = O(r), \ - .bit = BIT(b), \ - } - -static struct clk_local_ownership { - struct clk_lookup lk; - const u32 *reg; - const u32 bit; - struct clk *remote; -} ownership_map[] __initdata = { - /* Sources */ - { CLK_LOOKUP("pll1_clk", pll1_clk.c, "acpu") }, - { CLK_LOOKUP("pll2_clk", pll2_clk.c, "acpu") }, - { CLK_LOOKUP("pll3_clk", pll3_clk.c, "acpu") }, - { CLK_LOOKUP("measure", measure_clk, "debug") }, - - /* PCOM */ - { CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL) }, - { CLK_LOOKUP("codec_ssbi_clk", codec_ssbi_clk.c, NULL) }, - { CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL) }, - { CLK_LOOKUP("ebi1_fixed_clk", ebi1_fixed_clk.c, NULL) }, - { CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL) }, - { CLK_LOOKUP("core_clk", gp_clk.c, "") }, - { CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2") }, - { CLK_LOOKUP("phy_clk", usb_phy_clk.c, "msm_otg") }, - - /* Voters */ - { CLK_LOOKUP("mem_clk", ebi_dtv_clk.c, "dtv.0") }, - { CLK_LOOKUP("bus_clk", ebi_grp_2d_clk.c, "kgsl-2d0.0") }, - { CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0") }, - { CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "lcdc.0") }, - { CLK_LOOKUP("mem_clk", ebi_mddi_clk.c, "mddi.0") }, - { CLK_LOOKUP("mem_clk", ebi_tv_clk.c, "tvenc.0") }, - { CLK_LOOKUP("mem_clk", ebi_vcd_clk.c, "msm_vidc.0") }, - { CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL) }, - { CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov") }, - - /* - * This is a many-to-one mapping because we don't know how the remote - * clock code has decided to handle the dependencies between clocks for - * a particular hardware block. We determine the ownership for all the - * clocks going into a block by checking the ownership bit of one - * register (usually the ns register). - */ - OWN(APPS1, 6, "core_clk", grp_2d_clk, "kgsl-2d0.0"), - OWN(APPS1, 6, "core_clk", grp_2d_clk, "footswitch-pcom.0"), - OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "kgsl-2d0.0"), - OWN(APPS1, 6, "iface_clk", grp_2d_p_clk, "footswitch-pcom.0"), - OWN(APPS1, 31, "hdmi_clk", hdmi_clk, "dtv.0"), - OWN(APPS1, 0, "core_clk", jpeg_clk, "msm_gemini.0"), - OWN(APPS1, 0, "iface_clk", jpeg_p_clk, "msm_gemini.0"), - OWN(APPS1, 23, "lpa_codec_clk", lpa_codec_clk, NULL), - OWN(APPS1, 23, "lpa_core_clk", lpa_core_clk, NULL), - OWN(APPS1, 23, "lpa_pclk", lpa_p_clk, NULL), - OWN(APPS1, 28, "mi2s_m_clk", mi2s_m_clk, NULL), - OWN(APPS1, 28, "mi2s_s_clk", mi2s_s_clk, NULL), - OWN(APPS1, 12, "mi2s_codec_rx_m_clk", mi2s_codec_rx_m_clk, NULL), - OWN(APPS1, 12, "mi2s_codec_rx_s_clk", mi2s_codec_rx_s_clk, NULL), - OWN(APPS1, 14, "mi2s_codec_tx_m_clk", mi2s_codec_tx_m_clk, NULL), - OWN(APPS1, 14, "mi2s_codec_tx_s_clk", mi2s_codec_tx_s_clk, NULL), - OWN(APPS1, 26, "sdac_clk", sdac_clk, NULL), - OWN(APPS1, 26, "sdac_m_clk", sdac_m_clk, NULL), - OWN(APPS1, 8, "vfe_clk", vfe_clk, NULL), - OWN(APPS1, 8, "core_clk", vfe_clk, "footswitch-pcom.8"), - OWN(APPS1, 8, "vfe_camif_clk", vfe_camif_clk, NULL), - OWN(APPS1, 8, "vfe_mdc_clk", vfe_mdc_clk, NULL), - OWN(APPS1, 8, "vfe_pclk", vfe_p_clk, NULL), - OWN(APPS1, 8, "iface_clk", vfe_p_clk, "footswitch-pcom.8"), - - OWN(APPS2, 0, "core_clk", grp_3d_clk, "kgsl-3d0.0"), - OWN(APPS2, 0, "core_clk", grp_3d_clk, "footswitch-pcom.2"), - OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "kgsl-3d0.0"), - OWN(APPS2, 0, "iface_clk", grp_3d_p_clk, "footswitch-pcom.2"), - { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "kgsl-3d0.0"), - O(APPS2), BIT(0), &p_grp_3d_clk.c }, - { CLK_LOOKUP("src_clk", grp_3d_src_clk.c, "footswitch-pcom.2"), - O(APPS2), BIT(0), &p_grp_3d_clk.c }, - OWN(APPS2, 0, "mem_clk", imem_clk, "kgsl-3d0.0"), - OWN(APPS2, 4, "lcdc_clk", mdp_lcdc_pad_pclk_clk, "lcdc.0"), - OWN(APPS2, 4, "mdp_clk", mdp_lcdc_pclk_clk, "lcdc.0"), - OWN(APPS2, 4, "iface_clk", mdp_p_clk, "mdp.0"), - OWN(APPS2, 4, "iface_clk", mdp_p_clk, "footswitch-pcom.4"), - OWN(APPS2, 28, "vsync_clk", mdp_vsync_clk, "mdp.0"), - OWN(APPS2, 5, "ref_clk", tsif_ref_clk, "msm_tsif.0"), - OWN(APPS2, 5, "iface_clk", tsif_p_clk, "msm_tsif.0"), - { CLK_LOOKUP("src_clk", tv_clk.c, "dtv.0"), - O(APPS2), BIT(2), &p_tv_enc_clk.c }, - OWN(APPS2, 2, "tv_dac_clk", tv_dac_clk, NULL), - OWN(APPS2, 2, "tv_enc_clk", tv_enc_clk, NULL), - - OWN(ROW1, 7, "core_clk", emdh_clk, "msm_mddi.1"), - OWN(ROW1, 7, "iface_clk", emdh_p_clk, "msm_mddi.1"), - OWN(ROW1, 11, "core_clk", i2c_clk, "msm_i2c.0"), - OWN(ROW1, 12, "core_clk", i2c_2_clk, "msm_i2c.2"), - OWN(ROW1, 17, "mdc_clk", mdc_clk, NULL), - OWN(ROW1, 19, "core_clk", pmdh_clk, "mddi.0"), - OWN(ROW1, 19, "iface_clk", pmdh_p_clk, "mddi.0"), - OWN(ROW1, 23, "core_clk", sdc1_clk, "msm_sdcc.1"), - OWN(ROW1, 23, "iface_clk", sdc1_p_clk, "msm_sdcc.1"), - OWN(ROW1, 25, "core_clk", sdc2_clk, "msm_sdcc.2"), - OWN(ROW1, 25, "iface_clk", sdc2_p_clk, "msm_sdcc.2"), - OWN(ROW1, 27, "core_clk", sdc3_clk, "msm_sdcc.3"), - OWN(ROW1, 27, "iface_clk", sdc3_p_clk, "msm_sdcc.3"), - OWN(ROW1, 29, "core_clk", sdc4_clk, "msm_sdcc.4"), - OWN(ROW1, 29, "iface_clk", sdc4_p_clk, "msm_sdcc.4"), - OWN(ROW1, 0, "core_clk", uart2_clk, "msm_serial.1"), - OWN(ROW1, 2, "alt_core_clk", usb_hs2_clk, "msm_hsusb_host.0"), - OWN(ROW1, 2, "core_clk", usb_hs2_core_clk, "msm_hsusb_host.0"), - OWN(ROW1, 2, "iface_clk", usb_hs2_p_clk, "msm_hsusb_host.0"), - OWN(ROW1, 4, "alt_core_clk", usb_hs3_clk, ""), - OWN(ROW1, 4, "core_clk", usb_hs3_core_clk, ""), - OWN(ROW1, 4, "iface_clk", usb_hs3_p_clk, ""), - - OWN(ROW2, 3, "core_clk", qup_i2c_clk, "qup_i2c.4"), - OWN(ROW2, 1, "core_clk", spi_clk, "spi_qsd.0"), - OWN(ROW2, 1, "iface_clk", spi_p_clk, "spi_qsd.0"), - OWN(ROW2, 9, "core_clk", uart1_clk, "msm_serial.0"), - OWN(ROW2, 6, "core_clk", uart1dm_clk, "msm_serial_hs.0"), - OWN(ROW2, 8, "core_clk", uart2dm_clk, "msm_serial_hs.1"), - OWN(ROW2, 11, "alt_core_clk", usb_hs_clk, "msm_otg"), - OWN(ROW2, 11, "core_clk", usb_hs_core_clk, "msm_otg"), - OWN(ROW2, 11, "iface_clk", usb_hs_p_clk, "msm_otg"), - - OWN(APPS3, 6, "cam_m_clk", cam_m_clk, NULL), - OWN(APPS3, 6, "cam_clk", cam_m_clk, "4-0020"), - OWN(APPS3, 6, "camif_pad_pclk", camif_pad_p_clk, NULL), - OWN(APPS3, 6, "iface_clk", camif_pad_p_clk, "qup_i2c.4"), - OWN(APPS3, 11, "csi_clk", csi0_clk, NULL), - OWN(APPS3, 11, "csi_vfe_clk", csi0_vfe_clk, NULL), - OWN(APPS3, 11, "csi_pclk", csi0_p_clk, NULL), - OWN(APPS3, 0, "core_clk", mdp_clk, "mdp.0"), - OWN(APPS3, 0, "core_clk", mdp_clk, "footswitch-pcom.4"), - OWN(APPS3, 2, "core_clk", mfc_clk, "msm_vidc.0"), - OWN(APPS3, 2, "core_clk", mfc_clk, "footswitch-pcom.5"), - OWN(APPS3, 2, "core_div2_clk", mfc_div2_clk, "msm_vidc.0"), - OWN(APPS3, 2, "iface_clk", mfc_p_clk, "msm_vidc.0"), - OWN(APPS3, 2, "iface_clk", mfc_p_clk, "footswitch-pcom.5"), - OWN(APPS3, 4, "vpe_clk", vpe_clk, NULL), - OWN(APPS3, 4, "core_clk", vpe_clk, "footswitch-pcom.9"), - - OWN(GLBL, 8, "core_clk", adm_clk, "msm_dmov"), - { CLK_LOOKUP("iface_clk", adm_p_clk.c, "msm_dmov"), - O(GLBL), BIT(13), &dummy_clk }, - OWN(GLBL, 8, "core_clk", ce_clk, "qce.0"), - OWN(GLBL, 8, "core_clk", ce_clk, "crypto.0"), - OWN(GLBL, 13, "core_clk", axi_rotator_clk, "msm_rotator.0"), - OWN(GLBL, 13, "core_clk", axi_rotator_clk, "footswitch-pcom.6"), - OWN(GLBL, 13, "mem_clk", rotator_imem_clk, "msm_rotator.0"), - OWN(GLBL, 13, "iface_clk", rotator_p_clk, "msm_rotator.0"), - OWN(GLBL, 13, "iface_clk", rotator_p_clk, "footswitch-pcom.6"), - { CLK_LOOKUP("iface_clk", uart1dm_p_clk.c, "msm_serial_hs.0"), - O(GLBL), BIT(8), &dummy_clk }, - { CLK_LOOKUP("iface_clk", uart2dm_p_clk.c, "msm_serial_hs.1"), - O(GLBL), BIT(8), &dummy_clk }, -}; - -static struct clk_lookup msm_clocks_7x30[ARRAY_SIZE(ownership_map)]; - -static void __init set_clock_ownership(void) -{ - unsigned i; - struct clk_lookup *lk; - - for (i = 0; i < ARRAY_SIZE(ownership_map); i++) { - const u32 *reg = ownership_map[i].reg; - u32 bit = ownership_map[i].bit; - struct clk *remote = ownership_map[i].remote; - - lk = &ownership_map[i].lk; - memcpy(&msm_clocks_7x30[i], lk, sizeof(*lk)); - - if (reg && !(*reg & bit)) - msm_clocks_7x30[i].clk = remote; - } -} - -/* - * Miscellaneous clock register initializations - */ -static const struct reg_init { - const void __iomem *reg; - uint32_t mask; - uint32_t val; -} ri_list[] __initconst = { - /* Enable UMDX_P clock. Known to causes issues, so never turn off. */ - {GLBL_CLK_ENA_2_SC_REG, BIT(2), BIT(2)}, - - /* Disable all the child clocks of USB_HS_SRC. */ - { USBH_NS_REG, BIT(13) | BIT(9), 0 }, - { USBH2_NS_REG, BIT(9) | BIT(4), 0 }, - { USBH3_NS_REG, BIT(9) | BIT(4), 0 }, - - {EMDH_NS_REG, BM(18, 17) , BVAL(18, 17, 0x3)}, /* RX div = div-4. */ - {PMDH_NS_REG, BM(18, 17), BVAL(18, 17, 0x3)}, /* RX div = div-4. */ - /* MI2S_CODEC_RX_S src = MI2S_CODEC_RX_M. */ - {MI2S_RX_NS_REG, BIT(14), 0x0}, - /* MI2S_CODEC_TX_S src = MI2S_CODEC_TX_M. */ - {MI2S_TX_NS_REG, BIT(14), 0x0}, - {MI2S_NS_REG, BIT(14), 0x0}, /* MI2S_S src = MI2S_M. */ - /* Allow DSP to decide the LPA CORE src. */ - {LPA_CORE_CLK_MA0_REG, BIT(0), BIT(0)}, - {LPA_CORE_CLK_MA2_REG, BIT(0), BIT(0)}, - {MI2S_CODEC_RX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_RX_S div = div-8. */ - {MI2S_CODEC_TX_DIV_REG, 0xF, 0xD}, /* MI2S_CODEC_TX_S div = div-8. */ - {MI2S_DIV_REG, 0xF, 0x7}, /* MI2S_S div = div-8. */ - {MDC_NS_REG, 0x3, 0x3}, /* MDC src = external MDH src. */ - {SDAC_NS_REG, BM(15, 14), 0x0}, /* SDAC div = div-1. */ - /* Disable sources TCXO/5 & TCXO/6. UART1 src = TCXO*/ - {UART_NS_REG, BM(26, 25) | BM(2, 0), 0x0}, - /* HDMI div = div-1, non-inverted. tv_enc_src = tv_clk_src */ - {HDMI_NS_REG, 0x7, 0x0}, - {TV_NS_REG, BM(15, 14), 0x0}, /* tv_clk_src_div2 = div-1 */ - - /* USBH core clocks src = USB_HS_SRC. */ - {USBH_NS_REG, BIT(15), BIT(15)}, - {USBH2_NS_REG, BIT(6), BIT(6)}, - {USBH3_NS_REG, BIT(6), BIT(6)}, -}; - -static void __init msm7x30_clock_pre_init(void) -{ - int i; - uint32_t val; - - clk_ops_branch.reset = soc_branch_clk_reset; - clk_ops_rcg.reset = msm7x30_clk_reset; - clk_ops_rcg.set_flags = soc_clk_set_flags; - - cache_ownership(); - print_ownership(); - set_clock_ownership(); - - /* When we have no local clock control, the rest of the code in this - * function is a NOP since writes to shadow regions that we don't own - * are ignored. */ - - for (i = 0; i < ARRAY_SIZE(ri_list); i++) { - val = readl_relaxed(ri_list[i].reg); - val &= ~ri_list[i].mask; - val |= ri_list[i].val; - writel_relaxed(val, ri_list[i].reg); - } -} - -static void __init msm7x30_clock_post_init(void) -{ - clk_set_rate(&usb_hs_src_clk.c, 60000000); - clk_set_rate(&i2c_clk.c, 19200000); - clk_set_rate(&i2c_2_clk.c, 19200000); - clk_set_rate(&qup_i2c_clk.c, 19200000); - clk_set_rate(&uart1_clk.c, 19200000); - clk_set_rate(&uart2_clk.c, 19200000); - clk_set_rate(&mi2s_m_clk.c, 12288000); - clk_set_rate(&mdp_vsync_clk.c, 24576000); - clk_set_rate(&glbl_root_clk.c, 1); - clk_set_rate(&mdc_clk.c, 1); - /* Sync the LPA_CODEC clock to MI2S_CODEC_RX */ - clk_set_rate(&lpa_codec_clk.c, 1); - /* Sync the GRP2D clock to AXI */ - clk_set_rate(&grp_2d_clk.c, 1); -} - -struct clock_init_data msm7x30_clock_init_data __initdata = { - .table = msm_clocks_7x30, - .size = ARRAY_SIZE(msm_clocks_7x30), - .pre_init = msm7x30_clock_pre_init, - .post_init = msm7x30_clock_post_init, -}; diff --git a/arch/arm/mach-msm/clock-7x30.h b/arch/arm/mach-msm/clock-7x30.h deleted file mode 100644 index 9fb3240bd83f..000000000000 --- a/arch/arm/mach-msm/clock-7x30.h +++ /dev/null @@ -1,155 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_CLOCK_7X30_H -#define __ARCH_ARM_MACH_MSM_CLOCK_7X30_H - -enum { - L_7X30_NONE_CLK = -1, - L_7X30_ADM_CLK, - L_7X30_I2C_CLK, - L_7X30_I2C_2_CLK, - L_7X30_QUP_I2C_CLK, - L_7X30_UART1DM_CLK, - L_7X30_UART1DM_P_CLK, - L_7X30_UART2DM_CLK, - L_7X30_UART2DM_P_CLK, - L_7X30_EMDH_CLK, - L_7X30_EMDH_P_CLK, - L_7X30_PMDH_CLK, - L_7X30_PMDH_P_CLK, - L_7X30_GRP_2D_CLK, - L_7X30_GRP_2D_P_CLK, - L_7X30_GRP_3D_SRC_CLK, - L_7X30_GRP_3D_CLK, - L_7X30_GRP_3D_P_CLK, - L_7X30_IMEM_CLK, - L_7X30_SDC1_CLK, - L_7X30_SDC1_P_CLK, - L_7X30_SDC2_CLK, - L_7X30_SDC2_P_CLK, - L_7X30_SDC3_CLK, - L_7X30_SDC3_P_CLK, - L_7X30_SDC4_CLK, - L_7X30_SDC4_P_CLK, - L_7X30_MDP_CLK, - L_7X30_MDP_P_CLK, - L_7X30_MDP_LCDC_PCLK_CLK, - L_7X30_MDP_LCDC_PAD_PCLK_CLK, - L_7X30_MDP_VSYNC_CLK, - L_7X30_MI2S_CODEC_RX_M_CLK, - L_7X30_MI2S_CODEC_RX_S_CLK, - L_7X30_MI2S_CODEC_TX_M_CLK, - L_7X30_MI2S_CODEC_TX_S_CLK, - L_7X30_MI2S_M_CLK, - L_7X30_MI2S_S_CLK, - L_7X30_LPA_CODEC_CLK, - L_7X30_LPA_CORE_CLK, - L_7X30_LPA_P_CLK, - L_7X30_MIDI_CLK, - L_7X30_MDC_CLK, - L_7X30_ROTATOR_IMEM_CLK, - L_7X30_ROTATOR_P_CLK, - L_7X30_SDAC_M_CLK, - L_7X30_SDAC_CLK, - L_7X30_UART1_CLK, - L_7X30_UART2_CLK, - L_7X30_UART3_CLK, - L_7X30_TV_CLK, - L_7X30_TV_DAC_CLK, - L_7X30_TV_ENC_CLK, - L_7X30_HDMI_CLK, - L_7X30_TSIF_REF_CLK, - L_7X30_TSIF_P_CLK, - L_7X30_USB_HS_SRC_CLK, - L_7X30_USB_HS_CLK, - L_7X30_USB_HS_CORE_CLK, - L_7X30_USB_HS_P_CLK, - L_7X30_USB_HS2_CLK, - L_7X30_USB_HS2_CORE_CLK, - L_7X30_USB_HS2_P_CLK, - L_7X30_USB_HS3_CLK, - L_7X30_USB_HS3_CORE_CLK, - L_7X30_USB_HS3_P_CLK, - L_7X30_VFE_CLK, - L_7X30_VFE_P_CLK, - L_7X30_VFE_MDC_CLK, - L_7X30_VFE_CAMIF_CLK, - L_7X30_CAMIF_PAD_P_CLK, - L_7X30_CAM_M_CLK, - L_7X30_JPEG_CLK, - L_7X30_JPEG_P_CLK, - L_7X30_VPE_CLK, - L_7X30_MFC_CLK, - L_7X30_MFC_DIV2_CLK, - L_7X30_MFC_P_CLK, - L_7X30_SPI_CLK, - L_7X30_SPI_P_CLK, - L_7X30_CSI0_CLK, - L_7X30_CSI0_VFE_CLK, - L_7X30_CSI0_P_CLK, - L_7X30_CSI1_CLK, - L_7X30_CSI1_VFE_CLK, - L_7X30_CSI1_P_CLK, - L_7X30_GLBL_ROOT_CLK, - - L_7X30_AXI_LI_VG_CLK, - L_7X30_AXI_LI_GRP_CLK, - L_7X30_AXI_LI_JPEG_CLK, - L_7X30_AXI_GRP_2D_CLK, - L_7X30_AXI_MFC_CLK, - L_7X30_AXI_VPE_CLK, - L_7X30_AXI_LI_VFE_CLK, - L_7X30_AXI_LI_APPS_CLK, - L_7X30_AXI_MDP_CLK, - L_7X30_AXI_IMEM_CLK, - L_7X30_AXI_LI_ADSP_A_CLK, - L_7X30_AXI_ROTATOR_CLK, - - L_7X30_NR_CLKS -}; - -struct clk_ops; -extern struct clk_ops clk_ops_7x30; - -struct clk_ops *clk_7x30_is_local(uint32_t id); -int clk_7x30_init(void); - -void pll_enable(uint32_t pll); -void pll_disable(uint32_t pll); - -extern int internal_pwr_rail_ctl_auto(unsigned rail_id, bool enable); - -#define CLK_7X30(clk_name, clk_id, clk_dev, clk_flags) { \ - .con_id = clk_name, \ - .dev_id = clk_dev, \ - .clk = &(struct clk){ \ - .id = L_7X30_##clk_id, \ - .remote_id = P_##clk_id, \ - .flags = clk_flags, \ - .dbg_name = #clk_id, \ - }, \ - } - -#define CLK_7X30S(clk_name, l_id, r_id, clk_dev, clk_flags) { \ - .con_id = clk_name, \ - .dev_id = clk_dev, \ - .clk = &(struct clk){ \ - .id = L_7X30_##l_id, \ - .remote_id = P_##r_id, \ - .flags = clk_flags, \ - .dbg_name = #l_id, \ - .ops = &clk_ops_pcom, \ - }, \ - } - -#endif diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c deleted file mode 100644 index 0677525b3e4a..000000000000 --- a/arch/arm/mach-msm/clock-8960.c +++ /dev/null @@ -1,7056 +0,0 @@ -/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include "clock.h" -#include "clock-local.h" -#include "clock-rpm.h" -#include "clock-voter.h" -#include "clock-dss-8960.h" -#include "devices.h" -#include "clock-pll.h" - -#define REG(off) (MSM_CLK_CTL_BASE + (off)) -#define REG_MM(off) (MSM_MMSS_CLK_CTL_BASE + (off)) -#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off)) -#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off)) - -/* Peripheral clock registers. */ -#define ADM0_PBUS_CLK_CTL_REG REG(0x2208) -#define SFAB_SATA_S_HCLK_CTL_REG REG(0x2480) -#define CE1_HCLK_CTL_REG REG(0x2720) -#define CE1_CORE_CLK_CTL_REG REG(0x2724) -#define PRNG_CLK_NS_REG REG(0x2E80) -#define CE3_HCLK_CTL_REG REG(0x36C4) -#define CE3_CORE_CLK_CTL_REG REG(0x36CC) -#define CE3_CLK_SRC_NS_REG REG(0x36C0) -#define DMA_BAM_HCLK_CTL REG(0x25C0) -#define CLK_HALT_AFAB_SFAB_STATEA_REG REG(0x2FC0) -#define CLK_HALT_AFAB_SFAB_STATEB_REG REG(0x2FC4) -#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC) -#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0) -#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4) -#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8) -/* 8064 name CLK_HALT_GSS_KPSS_MISC_STATE_REG */ -#define CLK_HALT_MSS_SMPSS_MISC_STATE_REG REG(0x2FDC) -#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8) -#define CLK_HALT_AFAB_SFAB_STATEB_REG REG(0x2FC4) -#define CLK_TEST_REG REG(0x2FA0) -#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n))) -#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n))) -#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1))) -#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1))) -#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1))) -#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1))) -#define PDM_CLK_NS_REG REG(0x2CC0) -/* 8064 name BB_PLL_ENA_APCS_REG */ -#define BB_PLL_ENA_SC0_REG REG(0x34C0) -#define BB_PLL_ENA_RPM_REG REG(0x34A0) -#define BB_PLL0_STATUS_REG REG(0x30D8) -#define BB_PLL5_STATUS_REG REG(0x30F8) -#define BB_PLL6_STATUS_REG REG(0x3118) -#define BB_PLL7_STATUS_REG REG(0x3138) -#define BB_PLL8_L_VAL_REG REG(0x3144) -#define BB_PLL8_M_VAL_REG REG(0x3148) -#define BB_PLL8_MODE_REG REG(0x3140) -#define BB_PLL8_N_VAL_REG REG(0x314C) -#define BB_PLL8_STATUS_REG REG(0x3158) -#define BB_PLL8_CONFIG_REG REG(0x3154) -#define BB_PLL8_TEST_CTL_REG REG(0x3150) -#define BB_MMCC_PLL2_MODE_REG REG(0x3160) -#define BB_MMCC_PLL2_L_REG REG(0x3164) -#define BB_MMCC_PLL2_M_REG REG(0x3168) -#define BB_MMCC_PLL2_N_REG REG(0x316C) -#define BB_MMCC_PLL2_TEST_CTL_REG REG(0x3170) -#define BB_MMCC_PLL2_CONFIG_REG REG(0x3174) -#define BB_MMCC_PLL2_STATUS_REG REG(0x3178) -#define BB_PLL14_MODE_REG REG(0x31C0) -#define BB_PLL14_L_VAL_REG REG(0x31C4) -#define BB_PLL14_M_VAL_REG REG(0x31C8) -#define BB_PLL14_N_VAL_REG REG(0x31CC) -#define BB_PLL14_TEST_CTL_REG REG(0x31D0) -#define BB_PLL14_CONFIG_REG REG(0x31D4) -#define BB_PLL14_STATUS_REG REG(0x31D8) -#define PLLTEST_PAD_CFG_REG REG(0x2FA4) -#define PMEM_ACLK_CTL_REG REG(0x25A0) -#define RINGOSC_NS_REG REG(0x2DC0) -#define RINGOSC_STATUS_REG REG(0x2DCC) -#define RINGOSC_TCXO_CTL_REG REG(0x2DC4) -#define RPM_MSG_RAM_HCLK_CTL_REG REG(0x27E0) -#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080) -#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1))) -#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1))) -#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1))) -#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1))) -#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628) -#define TSIF_HCLK_CTL_REG REG(0x2700) -#define TSIF_REF_CLK_MD_REG REG(0x270C) -#define TSIF_REF_CLK_NS_REG REG(0x2710) -#define TSSC_CLK_CTL_REG REG(0x2CA0) -#define SATA_HCLK_CTL_REG REG(0x2C00) -#define SATA_CLK_SRC_NS_REG REG(0x2C08) -#define SATA_RXOOB_CLK_CTL_REG REG(0x2C0C) -#define SATA_PMALIVE_CLK_CTL_REG REG(0x2C10) -#define SATA_PHY_REF_CLK_CTL_REG REG(0x2C14) -#define SATA_RESET REG(0x2C1C) -#define SATA_ACLK_CTL_REG REG(0x2C20) -#define SATA_PHY_CFG_CLK_CTL_REG REG(0x2C40) -#define USB_FSn_HCLK_CTL_REG(n) REG(0x2960+(0x20*((n)-1))) -#define USB_FSn_RESET_REG(n) REG(0x2974+(0x20*((n)-1))) -#define USB_FSn_SYSTEM_CLK_CTL_REG(n) REG(0x296C+(0x20*((n)-1))) -#define USB_FSn_XCVR_FS_CLK_MD_REG(n) REG(0x2964+(0x20*((n)-1))) -#define USB_FSn_XCVR_FS_CLK_NS_REG(n) REG(0x2968+(0x20*((n)-1))) -#define USB_HS1_HCLK_CTL_REG REG(0x2900) -#define USB_HS1_HCLK_FS_REG REG(0x2904) -#define USB_HS1_RESET_REG REG(0x2910) -#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908) -#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C) -#define USB_HS3_HCLK_CTL_REG REG(0x3700) -#define USB_HS3_HCLK_FS_REG REG(0x3704) -#define USB_HS3_RESET_REG REG(0x3710) -#define USB_HS3_XCVR_FS_CLK_MD_REG REG(0X3708) -#define USB_HS3_XCVR_FS_CLK_NS_REG REG(0X370C) -#define USB_HS4_HCLK_CTL_REG REG(0x3720) -#define USB_HS4_HCLK_FS_REG REG(0x3724) -#define USB_HS4_RESET_REG REG(0x3730) -#define USB_HS4_XCVR_FS_CLK_MD_REG REG(0X3728) -#define USB_HS4_XCVR_FS_CLK_NS_REG REG(0X372C) -#define USB_HSIC_HCLK_CTL_REG REG(0x2920) -#define USB_HSIC_HSIC_CLK_CTL_REG REG(0x2B44) -#define USB_HSIC_HSIC_CLK_SRC_CTL_REG REG(0x2B40) -#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48) -#define USB_HSIC_RESET_REG REG(0x2934) -#define USB_HSIC_SYSTEM_CLK_CTL_REG REG(0x292C) -#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924) -#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928) -#define USB_PHY0_RESET_REG REG(0x2E20) -#define PCIE_ALT_REF_CLK_NS_REG REG(0x3860) -#define PCIE_ACLK_CTL_REG REG(0x22C0) -#define PCIE_HCLK_CTL_REG REG(0x22CC) -#define PCIE_PCLK_CTL_REG REG(0x22D0) -#define GPLL1_MODE_REG REG(0x3160) -#define GPLL1_L_VAL_REG REG(0x3164) -#define GPLL1_M_VAL_REG REG(0x3168) -#define GPLL1_N_VAL_REG REG(0x316C) -#define GPLL1_CONFIG_REG REG(0x3174) -#define GPLL1_STATUS_REG REG(0x3178) -#define PXO_SRC_CLK_CTL_REG REG(0x2EA0) - -/* Multimedia clock registers. */ -#define AHB_EN_REG REG_MM(0x0008) -#define AHB_EN2_REG REG_MM(0x0038) -#define AHB_EN3_REG REG_MM(0x0248) -#define AHB_NS_REG REG_MM(0x0004) -#define AXI_NS_REG REG_MM(0x0014) -#define CAMCLK0_NS_REG REG_MM(0x0148) -#define CAMCLK0_CC_REG REG_MM(0x0140) -#define CAMCLK0_MD_REG REG_MM(0x0144) -#define CAMCLK1_NS_REG REG_MM(0x015C) -#define CAMCLK1_CC_REG REG_MM(0x0154) -#define CAMCLK1_MD_REG REG_MM(0x0158) -#define CAMCLK2_NS_REG REG_MM(0x0228) -#define CAMCLK2_CC_REG REG_MM(0x0220) -#define CAMCLK2_MD_REG REG_MM(0x0224) -#define CSI0_NS_REG REG_MM(0x0048) -#define CSI0_CC_REG REG_MM(0x0040) -#define CSI0_MD_REG REG_MM(0x0044) -#define CSI1_NS_REG REG_MM(0x0010) -#define CSI1_CC_REG REG_MM(0x0024) -#define CSI1_MD_REG REG_MM(0x0028) -#define CSI2_NS_REG REG_MM(0x0234) -#define CSI2_CC_REG REG_MM(0x022C) -#define CSI2_MD_REG REG_MM(0x0230) -#define CSIPHYTIMER_CC_REG REG_MM(0x0160) -#define CSIPHYTIMER_MD_REG REG_MM(0x0164) -#define CSIPHYTIMER_NS_REG REG_MM(0x0168) -#define DSI1_BYTE_NS_REG REG_MM(0x00B0) -#define DSI1_BYTE_CC_REG REG_MM(0x0090) -#define DSI2_BYTE_NS_REG REG_MM(0x00BC) -#define DSI2_BYTE_CC_REG REG_MM(0x00B4) -#define DSI1_ESC_NS_REG REG_MM(0x011C) -#define DSI1_ESC_CC_REG REG_MM(0x00CC) -#define DSI2_ESC_NS_REG REG_MM(0x0150) -#define DSI2_ESC_CC_REG REG_MM(0x013C) -#define DSI_PIXEL_CC_REG REG_MM(0x0130) -#define DSI2_PIXEL_CC_REG REG_MM(0x0094) -#define DSI2_PIXEL_CC2_REG REG_MM(0x0264) -#define DBG_BUS_VEC_A_REG REG_MM(0x01C8) -#define DBG_BUS_VEC_B_REG REG_MM(0x01CC) -#define DBG_BUS_VEC_C_REG REG_MM(0x01D0) -#define DBG_BUS_VEC_D_REG REG_MM(0x01D4) -#define DBG_BUS_VEC_E_REG REG_MM(0x01D8) -#define DBG_BUS_VEC_F_REG REG_MM(0x01DC) -#define DBG_BUS_VEC_G_REG REG_MM(0x01E0) -#define DBG_BUS_VEC_H_REG REG_MM(0x01E4) -#define DBG_BUS_VEC_I_REG REG_MM(0x01E8) -#define DBG_BUS_VEC_J_REG REG_MM(0x0240) -#define DBG_CFG_REG_HS_REG REG_MM(0x01B4) -#define DBG_CFG_REG_LS_REG REG_MM(0x01B8) -#define GFX2D0_CC_REG REG_MM(0x0060) -#define GFX2D0_MD0_REG REG_MM(0x0064) -#define GFX2D0_MD1_REG REG_MM(0x0068) -#define GFX2D0_NS_REG REG_MM(0x0070) -#define GFX2D1_CC_REG REG_MM(0x0074) -#define GFX2D1_MD0_REG REG_MM(0x0078) -#define GFX2D1_MD1_REG REG_MM(0x006C) -#define GFX2D1_NS_REG REG_MM(0x007C) -#define GFX3D_CC_REG REG_MM(0x0080) -#define GFX3D_MD0_REG REG_MM(0x0084) -#define GFX3D_MD1_REG REG_MM(0x0088) -#define GFX3D_NS_REG REG_MM(0x008C) -#define IJPEG_CC_REG REG_MM(0x0098) -#define IJPEG_MD_REG REG_MM(0x009C) -#define IJPEG_NS_REG REG_MM(0x00A0) -#define JPEGD_CC_REG REG_MM(0x00A4) -#define JPEGD_NS_REG REG_MM(0x00AC) -#define VCAP_CC_REG REG_MM(0x0178) -#define VCAP_NS_REG REG_MM(0x021C) -#define VCAP_MD0_REG REG_MM(0x01EC) -#define VCAP_MD1_REG REG_MM(0x0218) -#define MAXI_EN_REG REG_MM(0x0018) -#define MAXI_EN2_REG REG_MM(0x0020) -#define MAXI_EN3_REG REG_MM(0x002C) -#define MAXI_EN4_REG REG_MM(0x0114) -#define MAXI_EN5_REG REG_MM(0x0244) -#define MDP_CC_REG REG_MM(0x00C0) -#define MDP_LUT_CC_REG REG_MM(0x016C) -#define MDP_MD0_REG REG_MM(0x00C4) -#define MDP_MD1_REG REG_MM(0x00C8) -#define MDP_NS_REG REG_MM(0x00D0) -#define MISC_CC_REG REG_MM(0x0058) -#define MISC_CC2_REG REG_MM(0x005C) -#define MISC_CC3_REG REG_MM(0x0238) -#define MM_PLL1_MODE_REG REG_MM(0x031C) -#define MM_PLL1_L_VAL_REG REG_MM(0x0320) -#define MM_PLL1_M_VAL_REG REG_MM(0x0324) -#define MM_PLL1_N_VAL_REG REG_MM(0x0328) -#define MM_PLL1_CONFIG_REG REG_MM(0x032C) -#define MM_PLL1_TEST_CTL_REG REG_MM(0x0330) -#define MM_PLL1_STATUS_REG REG_MM(0x0334) -#define MM_PLL3_MODE_REG REG_MM(0x0338) -#define MM_PLL3_L_VAL_REG REG_MM(0x033C) -#define MM_PLL3_M_VAL_REG REG_MM(0x0340) -#define MM_PLL3_N_VAL_REG REG_MM(0x0344) -#define MM_PLL3_CONFIG_REG REG_MM(0x0348) -#define MM_PLL3_TEST_CTL_REG REG_MM(0x034C) -#define MM_PLL3_STATUS_REG REG_MM(0x0350) -#define ROT_CC_REG REG_MM(0x00E0) -#define ROT_NS_REG REG_MM(0x00E8) -#define SAXI_EN_REG REG_MM(0x0030) -#define SW_RESET_AHB_REG REG_MM(0x020C) -#define SW_RESET_AHB2_REG REG_MM(0x0200) -#define SW_RESET_ALL_REG REG_MM(0x0204) -#define SW_RESET_AXI_REG REG_MM(0x0208) -#define SW_RESET_CORE_REG REG_MM(0x0210) -#define SW_RESET_CORE2_REG REG_MM(0x0214) -#define TV_CC_REG REG_MM(0x00EC) -#define TV_CC2_REG REG_MM(0x0124) -#define TV_MD_REG REG_MM(0x00F0) -#define TV_NS_REG REG_MM(0x00F4) -#define VCODEC_CC_REG REG_MM(0x00F8) -#define VCODEC_MD0_REG REG_MM(0x00FC) -#define VCODEC_MD1_REG REG_MM(0x0128) -#define VCODEC_NS_REG REG_MM(0x0100) -#define VFE_CC_REG REG_MM(0x0104) -#define VFE_MD_REG REG_MM(0x0108) -#define VFE_NS_REG REG_MM(0x010C) -#define VFE_CC2_REG REG_MM(0x023C) -#define VPE_CC_REG REG_MM(0x0110) -#define VPE_NS_REG REG_MM(0x0118) - -/* Low-power Audio clock registers. */ -#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4) -#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8) -#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064) -#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060) -#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068) -#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070) -#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C) -#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074) -#define LCC_MI2S_MD_REG REG_LPA(0x004C) -#define LCC_MI2S_NS_REG REG_LPA(0x0048) -#define LCC_MI2S_STATUS_REG REG_LPA(0x0050) -#define LCC_PCM_MD_REG REG_LPA(0x0058) -#define LCC_PCM_NS_REG REG_LPA(0x0054) -#define LCC_PCM_STATUS_REG REG_LPA(0x005C) -#define LCC_PLL0_MODE_REG REG_LPA(0x0000) -#define LCC_PLL0_L_VAL_REG REG_LPA(0x0004) -#define LCC_PLL0_M_VAL_REG REG_LPA(0x0008) -#define LCC_PLL0_N_VAL_REG REG_LPA(0x000C) -#define LCC_PLL0_CONFIG_REG REG_LPA(0x0014) -#define LCC_PLL0_STATUS_REG REG_LPA(0x0018) -#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C) -#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078) -#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080) -#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088) -#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084) -#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C) -#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC) -#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0) -#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4) -#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4) -#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4) - -#define GCC_APCS_CLK_DIAG REG_GCC(0x001C) - -/* MUX source input identifiers. */ -#define pxo_to_bb_mux 0 -#define cxo_to_bb_mux 5 -#define pll0_to_bb_mux 2 -#define pll8_to_bb_mux 3 -#define pll6_to_bb_mux 4 -#define gnd_to_bb_mux 5 -#define pll3_to_bb_mux 6 -#define pxo_to_mm_mux 0 -#define pll1_to_mm_mux 1 -#define pll2_to_mm_mux 1 /* or MMCC_PLL1 */ -#define pll8_to_mm_mux 2 /* or GCC_PERF */ -#define pll0_to_mm_mux 3 -#define pll15_to_mm_mux 3 /* or MM_PLL3 */ -#define gnd_to_mm_mux 4 -#define pll3_to_mm_mux 3 /* or MMCC_PLL2 */ -#define hdmi_pll_to_mm_mux 3 -#define cxo_to_xo_mux 0 -#define pxo_to_xo_mux 1 -#define gnd_to_xo_mux 3 -#define pxo_to_lpa_mux 0 -#define cxo_to_lpa_mux 1 -#define pll4_to_lpa_mux 2 -#define gnd_to_lpa_mux 6 -#define pxo_to_pcie_mux 0 -#define pll3_to_pcie_mux 1 - -/* Test Vector Macros */ -#define TEST_TYPE_PER_LS 1 -#define TEST_TYPE_PER_HS 2 -#define TEST_TYPE_MM_LS 3 -#define TEST_TYPE_MM_HS 4 -#define TEST_TYPE_LPA 5 -#define TEST_TYPE_CPUL2 6 -#define TEST_TYPE_LPA_HS 7 -#define TEST_TYPE_SHIFT 24 -#define TEST_CLK_SEL_MASK BM(23, 0) -#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s))) -#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS) -#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS) -#define TEST_MM_LS(s) TEST_VECTOR((s), TEST_TYPE_MM_LS) -#define TEST_MM_HS(s) TEST_VECTOR((s), TEST_TYPE_MM_HS) -#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA) -#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS) -#define TEST_CPUL2(s) TEST_VECTOR((s), TEST_TYPE_CPUL2) - -#define MN_MODE_DUAL_EDGE 0x2 - -struct pll_rate { - const uint32_t l_val; - const uint32_t m_val; - const uint32_t n_val; - const uint32_t vco; - const uint32_t post_div; - const uint32_t i_bits; -}; -#define PLL_RATE(l, m, n, v, d, i) { l, m, n, v, (d>>1), i } - -enum vdd_dig_levels { - VDD_DIG_NONE, - VDD_DIG_LOW, - VDD_DIG_NOMINAL, - VDD_DIG_HIGH, - VDD_DIG_NUM -}; - -static int set_vdd_dig_8960(struct clk_vdd_class *vdd_class, int level) -{ - static const int vdd_uv[] = { - [VDD_DIG_NONE] = 0, - [VDD_DIG_LOW] = 945000, - [VDD_DIG_NOMINAL] = 1050000, - [VDD_DIG_HIGH] = 1150000 - }; - return rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S3, RPM_VREG_VOTER3, - vdd_uv[level], 1150000, 1); -} - -static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig_8960, VDD_DIG_NUM); - -static int rpm_vreg_dig_8930 = RPM_VREG_ID_PM8038_VDD_DIG_CORNER; -static int set_vdd_dig_8930(struct clk_vdd_class *vdd_class, int level) -{ - static const int vdd_corner[] = { - [VDD_DIG_NONE] = RPM_VREG_CORNER_NONE, - [VDD_DIG_LOW] = RPM_VREG_CORNER_LOW, - [VDD_DIG_NOMINAL] = RPM_VREG_CORNER_NOMINAL, - [VDD_DIG_HIGH] = RPM_VREG_CORNER_HIGH, - }; - return rpm_vreg_set_voltage(rpm_vreg_dig_8930, - RPM_VREG_VOTER3, - vdd_corner[level], - RPM_VREG_CORNER_HIGH, 1); -} - -#define VDD_DIG_FMAX_MAP1(l1, f1) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - [VDD_DIG_##l3] = (f3), \ - }, \ - .num_fmax = VDD_DIG_NUM - -enum vdd_sr2_hdmi_pll_levels { - VDD_SR2_HDMI_PLL_OFF, - VDD_SR2_HDMI_PLL_ON, - VDD_SR2_HDMI_PLL_NUM -}; - -static int set_vdd_sr2_hdmi_pll_8960(struct clk_vdd_class *vdd_class, int level) -{ - int rc = 0; - - if (level == VDD_SR2_HDMI_PLL_OFF) { - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23, - RPM_VREG_VOTER3, 0, 0, 1); - if (rc) - return rc; - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8, - RPM_VREG_VOTER3, 0, 0, 1); - if (rc) - rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23, - RPM_VREG_VOTER3, 1800000, 1800000, 1); - } else { - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8, - RPM_VREG_VOTER3, 2050000, 2100000, 1); - if (rc) - return rc; - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23, - RPM_VREG_VOTER3, 1800000, 1800000, 1); - if (rc) - rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8, - RPM_VREG_VOTER3, 0, 0, 1); - } - - return rc; -} - -static DEFINE_VDD_CLASS(vdd_sr2_hdmi_pll, set_vdd_sr2_hdmi_pll_8960, - VDD_SR2_HDMI_PLL_NUM); - -static int sr2_lreg_uv[] = { - [VDD_SR2_HDMI_PLL_OFF] = 0, - [VDD_SR2_HDMI_PLL_ON] = 1800000, -}; - -static int set_vdd_sr2_hdmi_pll_8064(struct clk_vdd_class *vdd_class, int level) -{ - return rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_LVS7, RPM_VREG_VOTER3, - sr2_lreg_uv[level], sr2_lreg_uv[level], 1); -} - -static int set_vdd_sr2_hdmi_pll_8930_pm8917(struct clk_vdd_class *vdd_class, - int level) -{ - int rc = 0; - - if (level == VDD_SR2_HDMI_PLL_OFF) { - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23, - RPM_VREG_VOTER3, 0, 0, 1); - if (rc) - return rc; - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8, - RPM_VREG_VOTER3, 0, 0, 1); - if (rc) - rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23, - RPM_VREG_VOTER3, 1800000, 1800000, 1); - } else { - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8, - RPM_VREG_VOTER3, 2050000, 2100000, 1); - if (rc) - return rc; - rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23, - RPM_VREG_VOTER3, 1800000, 1800000, 1); - if (rc) - rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8, - RPM_VREG_VOTER3, 0, 0, 1); - } - - return rc; -} - -static int set_vdd_sr2_hdmi_pll_8930(struct clk_vdd_class *vdd_class, int level) -{ - return rpm_vreg_set_voltage(RPM_VREG_ID_PM8038_L23, RPM_VREG_VOTER3, - sr2_lreg_uv[level], sr2_lreg_uv[level], 1); -} - -/* - * Clock Descriptions - */ - -DEFINE_CLK_RPM_BRANCH(pxo_clk, pxo_a_clk, PXO, 27000000); -DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000); - -static struct pll_clk pll2_clk = { - .mode_reg = MM_PLL1_MODE_REG, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll2_clk", - .rate = 800000000, - .ops = &clk_ops_local_pll, - CLK_INIT(pll2_clk.c), - }, -}; - -static struct pll_clk pll3_clk = { - .mode_reg = BB_MMCC_PLL2_MODE_REG, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll3_clk", - .rate = 1200000000, - .ops = &clk_ops_local_pll, - .vdd_class = &vdd_sr2_hdmi_pll, - .fmax = (unsigned long[VDD_SR2_HDMI_PLL_NUM]) { - [VDD_SR2_HDMI_PLL_ON] = ULONG_MAX - }, - .num_fmax = VDD_SR2_HDMI_PLL_NUM, - CLK_INIT(pll3_clk.c), - }, -}; - -static struct pll_vote_clk pll4_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(4), - .status_reg = LCC_PLL0_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll4_clk", - .rate = 393216000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll4_clk.c), - }, -}; - -static struct pll_vote_clk pll8_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(8), - .status_reg = BB_PLL8_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll8_clk", - .rate = 384000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll8_clk.c), - }, -}; - -static struct pll_vote_clk pll14_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(14), - .status_reg = BB_PLL14_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll14_clk", - .rate = 480000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll14_clk.c), - }, -}; - -static struct pll_clk pll15_clk = { - .mode_reg = MM_PLL3_MODE_REG, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll15_clk", - .rate = 975000000, - .ops = &clk_ops_local_pll, - CLK_INIT(pll15_clk.c), - }, -}; - -/* AXI Interfaces */ -static struct branch_clk gmem_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(24), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 6, - .retain_reg = MAXI_EN2_REG, - .retain_mask = BIT(21), - }, - .c = { - .dbg_name = "gmem_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(gmem_axi_clk.c), - }, -}; - -static struct branch_clk ijpeg_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(21), - .hwcg_reg = MAXI_EN_REG, - .hwcg_mask = BIT(11), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 4, - }, - .c = { - .dbg_name = "ijpeg_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(ijpeg_axi_clk.c), - }, -}; - -static struct branch_clk imem_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(22), - .hwcg_reg = MAXI_EN_REG, - .hwcg_mask = BIT(15), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 7, - .retain_reg = MAXI_EN2_REG, - .retain_mask = BIT(10), - }, - .c = { - .dbg_name = "imem_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(imem_axi_clk.c), - }, -}; - -static struct branch_clk jpegd_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(25), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 5, - }, - .c = { - .dbg_name = "jpegd_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(jpegd_axi_clk.c), - }, -}; - -static struct branch_clk vcodec_axi_b_clk = { - .b = { - .ctl_reg = MAXI_EN4_REG, - .en_mask = BIT(23), - .hwcg_reg = MAXI_EN4_REG, - .hwcg_mask = BIT(22), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 25, - .retain_reg = MAXI_EN4_REG, - .retain_mask = BIT(21), - }, - .c = { - .dbg_name = "vcodec_axi_b_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_axi_b_clk.c), - }, -}; - -static struct branch_clk vcodec_axi_a_clk = { - .b = { - .ctl_reg = MAXI_EN4_REG, - .en_mask = BIT(25), - .hwcg_reg = MAXI_EN4_REG, - .hwcg_mask = BIT(24), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 26, - .retain_reg = MAXI_EN4_REG, - .retain_mask = BIT(10), - }, - .c = { - .dbg_name = "vcodec_axi_a_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_axi_a_clk.c), - .depends = &vcodec_axi_b_clk.c, - }, -}; - -static struct branch_clk vcodec_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(19), - .hwcg_reg = MAXI_EN_REG, - .hwcg_mask = BIT(13), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(4)|BIT(5)|BIT(7), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 3, - .retain_reg = MAXI_EN2_REG, - .retain_mask = BIT(28), - }, - .c = { - .dbg_name = "vcodec_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_axi_clk.c), - .depends = &vcodec_axi_a_clk.c, - }, -}; - -static struct branch_clk vfe_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(18), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 0, - }, - .c = { - .dbg_name = "vfe_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_axi_clk.c), - }, -}; - -static struct branch_clk mdp_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(23), - .hwcg_reg = MAXI_EN_REG, - .hwcg_mask = BIT(16), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(13), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 8, - .retain_reg = MAXI_EN_REG, - .retain_mask = BIT(0), - }, - .c = { - .dbg_name = "mdp_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_axi_clk.c), - }, -}; - -static struct branch_clk rot_axi_clk = { - .b = { - .ctl_reg = MAXI_EN2_REG, - .en_mask = BIT(24), - .hwcg_reg = MAXI_EN2_REG, - .hwcg_mask = BIT(25), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 2, - .retain_reg = MAXI_EN3_REG, - .retain_mask = BIT(10), - }, - .c = { - .dbg_name = "rot_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(rot_axi_clk.c), - }, -}; - -static struct branch_clk vpe_axi_clk = { - .b = { - .ctl_reg = MAXI_EN2_REG, - .en_mask = BIT(26), - .hwcg_reg = MAXI_EN2_REG, - .hwcg_mask = BIT(27), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 1, - .retain_reg = MAXI_EN3_REG, - .retain_mask = BIT(21), - - }, - .c = { - .dbg_name = "vpe_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vpe_axi_clk.c), - }, -}; - -static struct branch_clk vcap_axi_clk = { - .b = { - .ctl_reg = MAXI_EN5_REG, - .en_mask = BIT(12), - .hwcg_reg = MAXI_EN5_REG, - .hwcg_mask = BIT(11), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(16), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "vcap_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcap_axi_clk.c), - }, -}; - -/* gfx3d_axi_clk is set as a dependency of gmem_axi_clk at runtime */ -static struct branch_clk gfx3d_axi_clk = { - .b = { - .ctl_reg = MAXI_EN5_REG, - .en_mask = BIT(25), - .hwcg_reg = MAXI_EN5_REG, - .hwcg_mask = BIT(24), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(17), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 30, - }, - .c = { - .dbg_name = "gfx3d_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(gfx3d_axi_clk.c), - }, -}; - -static struct branch_clk gfx3d_axi_clk_8930 = { - .b = { - .ctl_reg = MAXI_EN5_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(16), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "gfx3d_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(gfx3d_axi_clk_8930.c), - }, -}; - -/* AHB Interfaces */ -static struct branch_clk amp_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(24), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(20), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "amp_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(amp_p_clk.c), - }, -}; - -static struct branch_clk csi_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(7), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(17), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 16, - }, - .c = { - .dbg_name = "csi_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi_p_clk.c), - }, -}; - -static struct branch_clk dsi1_m_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(9), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "dsi1_m_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi1_m_p_clk.c), - }, -}; - -static struct branch_clk dsi1_s_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(18), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(20), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(5), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 21, - }, - .c = { - .dbg_name = "dsi1_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi1_s_p_clk.c), - }, -}; - -static struct branch_clk dsi2_m_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(17), - .reset_reg = SW_RESET_AHB2_REG, - .reset_mask = BIT(1), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "dsi2_m_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi2_m_p_clk.c), - }, -}; - -static struct branch_clk dsi2_s_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(22), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(15), - .reset_reg = SW_RESET_AHB2_REG, - .reset_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "dsi2_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi2_s_p_clk.c), - }, -}; - -static struct branch_clk gfx2d0_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(19), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(28), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(12), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 2, - }, - .c = { - .dbg_name = "gfx2d0_p_clk", - .ops = &clk_ops_branch, - .flags = CLKFLAG_SKIP_HANDOFF, - CLK_INIT(gfx2d0_p_clk.c), - }, -}; - -static struct branch_clk gfx2d1_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(2), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(29), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(11), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gfx2d1_p_clk", - .ops = &clk_ops_branch, - .flags = CLKFLAG_SKIP_HANDOFF, - CLK_INIT(gfx2d1_p_clk.c), - }, -}; - -static struct branch_clk gfx3d_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(3), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(27), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 4, - }, - .c = { - .dbg_name = "gfx3d_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gfx3d_p_clk.c), - }, -}; - -static struct branch_clk hdmi_m_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(14), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(21), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 5, - }, - .c = { - .dbg_name = "hdmi_m_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_m_p_clk.c), - }, -}; - -static struct branch_clk hdmi_s_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(4), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(22), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 6, - }, - .c = { - .dbg_name = "hdmi_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_s_p_clk.c), - }, -}; - -static struct branch_clk ijpeg_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(5), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(7), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 9, - }, - .c = { - .dbg_name = "ijpeg_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ijpeg_p_clk.c), - }, -}; - -static struct branch_clk imem_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(6), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(12), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(8), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 10, - }, - .c = { - .dbg_name = "imem_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(imem_p_clk.c), - }, -}; - -static struct branch_clk jpegd_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(21), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(4), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "jpegd_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(jpegd_p_clk.c), - }, -}; - -static struct branch_clk mdp_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(10), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(3), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "mdp_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_p_clk.c), - }, -}; - -static struct branch_clk rot_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 13, - }, - .c = { - .dbg_name = "rot_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rot_p_clk.c), - }, -}; - -static struct branch_clk smmu_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(15), - .hwcg_reg = AHB_EN_REG, - .hwcg_mask = BIT(26), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 22, - }, - .c = { - .dbg_name = "smmu_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(smmu_p_clk.c), - }, -}; - -static struct branch_clk tv_enc_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(25), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "tv_enc_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_enc_p_clk.c), - }, -}; - -static struct branch_clk vcodec_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(11), - .hwcg_reg = AHB_EN2_REG, - .hwcg_mask = BIT(26), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(1), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "vcodec_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_p_clk.c), - }, -}; - -static struct branch_clk vfe_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(13), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 14, - .retain_reg = AHB_EN2_REG, - .retain_mask = BIT(0), - }, - .c = { - .dbg_name = "vfe_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_p_clk.c), - }, -}; - -static struct branch_clk vpe_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(16), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 15, - }, - .c = { - .dbg_name = "vpe_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vpe_p_clk.c), - }, -}; - -static struct branch_clk vcap_p_clk = { - .b = { - .ctl_reg = AHB_EN3_REG, - .en_mask = BIT(1), - .reset_reg = SW_RESET_AHB2_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "vcap_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcap_p_clk.c), - }, -}; - -/* - * Peripheral Clocks - */ -#define CLK_GP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GPn_NS_REG(n), \ - .en_mask = BIT(9), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GPn_NS_REG(n), \ - .md_reg = GPn_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gp, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gp[] = { - F_GP( 0, gnd, 1, 0, 0), - F_GP( 9600000, cxo, 2, 0, 0), - F_GP( 13500000, pxo, 2, 0, 0), - F_GP( 19200000, cxo, 1, 0, 0), - F_GP( 27000000, pxo, 1, 0, 0), - F_GP( 64000000, pll8, 2, 1, 3), - F_GP( 76800000, pll8, 1, 1, 5), - F_GP( 96000000, pll8, 4, 0, 0), - F_GP(128000000, pll8, 3, 0, 0), - F_GP(192000000, pll8, 2, 0, 0), - F_END -}; - -static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7); -static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6); -static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5); - -#define CLK_GSBI_UART(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_UART_APPS_NS_REG(n), \ - .md_reg = GSBIn_UART_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(31, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_uart, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_UART(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_uart[] = { - F_GSBI_UART( 0, gnd, 1, 0, 0), - F_GSBI_UART( 1843200, pll8, 2, 6, 625), - F_GSBI_UART( 3686400, pll8, 2, 12, 625), - F_GSBI_UART( 7372800, pll8, 2, 24, 625), - F_GSBI_UART(14745600, pll8, 2, 48, 625), - F_GSBI_UART(16000000, pll8, 4, 1, 6), - F_GSBI_UART(24000000, pll8, 4, 1, 4), - F_GSBI_UART(32000000, pll8, 4, 1, 3), - F_GSBI_UART(40000000, pll8, 1, 5, 48), - F_GSBI_UART(46400000, pll8, 1, 29, 240), - F_GSBI_UART(48000000, pll8, 4, 1, 2), - F_GSBI_UART(51200000, pll8, 1, 2, 15), - F_GSBI_UART(56000000, pll8, 1, 7, 48), - F_GSBI_UART(58982400, pll8, 1, 96, 625), - F_GSBI_UART(64000000, pll8, 2, 1, 3), - F_END -}; - -static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10); -static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6); -static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2); -static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26); -static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22); -static CLK_GSBI_UART(gsbi6_uart, 6, CLK_HALT_CFPB_STATEB_REG, 18); -static CLK_GSBI_UART(gsbi7_uart, 7, CLK_HALT_CFPB_STATEB_REG, 14); -static CLK_GSBI_UART(gsbi8_uart, 8, CLK_HALT_CFPB_STATEB_REG, 10); -static CLK_GSBI_UART(gsbi9_uart, 9, CLK_HALT_CFPB_STATEB_REG, 6); -static CLK_GSBI_UART(gsbi10_uart, 10, CLK_HALT_CFPB_STATEB_REG, 2); -static CLK_GSBI_UART(gsbi11_uart, 11, CLK_HALT_CFPB_STATEC_REG, 17); -static CLK_GSBI_UART(gsbi12_uart, 12, CLK_HALT_CFPB_STATEC_REG, 13); - -#define CLK_GSBI_QUP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .md_reg = GSBIn_QUP_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_qup, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_QUP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_qup[] = { - F_GSBI_QUP( 0, gnd, 1, 0, 0), - F_GSBI_QUP( 1100000, pxo, 1, 2, 49), - F_GSBI_QUP( 5400000, pxo, 1, 1, 5), - F_GSBI_QUP(10800000, pxo, 1, 2, 5), - F_GSBI_QUP(15060000, pll8, 1, 2, 51), - F_GSBI_QUP(24000000, pll8, 4, 1, 4), - F_GSBI_QUP(25600000, pll8, 1, 1, 15), - F_GSBI_QUP(27000000, pxo, 1, 0, 0), - F_GSBI_QUP(48000000, pll8, 4, 1, 2), - F_GSBI_QUP(51200000, pll8, 1, 2, 15), - F_END -}; - -static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9); -static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4); -static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0); -static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24); -static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20); -static CLK_GSBI_QUP(gsbi6_qup, 6, CLK_HALT_CFPB_STATEB_REG, 16); -static CLK_GSBI_QUP(gsbi7_qup, 7, CLK_HALT_CFPB_STATEB_REG, 12); -static CLK_GSBI_QUP(gsbi8_qup, 8, CLK_HALT_CFPB_STATEB_REG, 8); -static CLK_GSBI_QUP(gsbi9_qup, 9, CLK_HALT_CFPB_STATEB_REG, 4); -static CLK_GSBI_QUP(gsbi10_qup, 10, CLK_HALT_CFPB_STATEB_REG, 0); -static CLK_GSBI_QUP(gsbi11_qup, 11, CLK_HALT_CFPB_STATEC_REG, 15); -static CLK_GSBI_QUP(gsbi12_qup, 12, CLK_HALT_CFPB_STATEC_REG, 11); - -#define F_PDM(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \ - } -static struct clk_freq_tbl clk_tbl_pdm[] = { - F_PDM( 0, gnd, 1), - F_PDM(27000000, pxo, 1), - F_END -}; - -static struct rcg_clk pdm_clk = { - .b = { - .ctl_reg = PDM_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = PDM_CLK_NS_REG, - .reset_mask = BIT(12), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 3, - }, - .ns_reg = PDM_CLK_NS_REG, - .root_en_mask = BIT(11), - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_pdm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pdm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(pdm_clk.c), - }, -}; - -static struct branch_clk pmem_clk = { - .b = { - .ctl_reg = PMEM_ACLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = PMEM_ACLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "pmem_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmem_clk.c), - }, -}; - -#define F_PRNG(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - } -static struct clk_freq_tbl clk_tbl_prng_32[] = { - F_PRNG(32000000, pll8), - F_END -}; - -static struct clk_freq_tbl clk_tbl_prng_64[] = { - F_PRNG(64000000, pll8), - F_END -}; - -static struct rcg_clk prng_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(10), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 10, - }, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_prng_32, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "prng_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), - CLK_INIT(prng_clk.c), - }, -}; - -#define CLK_SDC(name, n, h_b, fmax_low, fmax_nom) \ - struct rcg_clk name = { \ - .b = { \ - .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = SDCn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = CLK_HALT_DFAB_STATE_REG, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = SDCn_APPS_CLK_NS_REG(n), \ - .md_reg = SDCn_APPS_CLK_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_sdc, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #name, \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, fmax_low, NOMINAL, fmax_nom), \ - CLK_INIT(name.c), \ - }, \ - } -#define F_SDC(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_sdc[] = { - F_SDC( 0, gnd, 1, 0, 0), - F_SDC( 144000, pxo, 3, 2, 125), - F_SDC( 400000, pll8, 4, 1, 240), - F_SDC( 16000000, pll8, 4, 1, 6), - F_SDC( 17070000, pll8, 1, 2, 45), - F_SDC( 20210000, pll8, 1, 1, 19), - F_SDC( 24000000, pll8, 4, 1, 4), - F_SDC( 48000000, pll8, 4, 1, 2), - F_SDC( 64000000, pll8, 3, 1, 2), - F_SDC( 96000000, pll8, 4, 0, 0), - F_SDC(192000000, pll8, 2, 0, 0), - F_END -}; - -static CLK_SDC(sdc1_clk, 1, 6, 52000000, 208000000); -static CLK_SDC(sdc2_clk, 2, 5, 52000000, 104000000); -static CLK_SDC(sdc3_clk, 3, 4, 104000000, 208000000); -static CLK_SDC(sdc4_clk, 4, 3, 33000000, 67000000); -static CLK_SDC(sdc5_clk, 5, 2, 33000000, 67000000); - -static unsigned long fmax_sdc1_8064v2[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 100000000, - [VDD_DIG_NOMINAL] = 200000000, -}; - -#define F_TSIF_REF(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_tsif_ref[] = { - F_TSIF_REF( 0, gnd, 1, 0, 0), - F_TSIF_REF(105000, pxo, 1, 1, 256), - F_END -}; - -static struct rcg_clk tsif_ref_clk = { - .b = { - .ctl_reg = TSIF_REF_CLK_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 5, - }, - .ns_reg = TSIF_REF_CLK_NS_REG, - .md_reg = TSIF_REF_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(31, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_tsif_ref, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tsif_ref_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 27000000, NOMINAL, 54000000), - CLK_INIT(tsif_ref_clk.c), - }, -}; - -#define F_TSSC(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \ - } -static struct clk_freq_tbl clk_tbl_tssc[] = { - F_TSSC( 0, gnd), - F_TSSC(27000000, pxo), - F_END -}; - -static struct rcg_clk tssc_clk = { - .b = { - .ctl_reg = TSSC_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 4, - }, - .ns_reg = TSSC_CLK_CTL_REG, - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_tssc, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tssc_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(tssc_clk.c), - }, -}; - -#define CLK_USB_HS(name, n, h_b) \ - static struct rcg_clk name = { \ - .b = { \ - .ctl_reg = USB_HS##n##_XCVR_FS_CLK_NS_REG, \ - .en_mask = BIT(9), \ - .reset_reg = USB_HS##n##_RESET_REG, \ - .reset_mask = BIT(0), \ - .halt_reg = CLK_HALT_DFAB_STATE_REG, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = USB_HS##n##_XCVR_FS_CLK_NS_REG, \ - .md_reg = USB_HS##n##_XCVR_FS_CLK_MD_REG, \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_usb, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #name, \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(NOMINAL, 64000000), \ - CLK_INIT(name.c), \ - }, \ -} - -#define F_USB(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_usb[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(60000000, pll8, 1, 5, 32), - F_END -}; - -CLK_USB_HS(usb_hs1_xcvr_clk, 1, 0); -CLK_USB_HS(usb_hs3_xcvr_clk, 3, 30); -CLK_USB_HS(usb_hs4_xcvr_clk, 4, 2); - -static struct clk_freq_tbl clk_tbl_usb_hsic[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(60000000, pll8, 1, 5, 32), - F_END -}; - -static struct rcg_clk usb_hsic_xcvr_fs_clk = { - .b = { - .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 26, - }, - .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG, - .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb_hsic, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_xcvr_fs_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 60000000), - CLK_INIT(usb_hsic_xcvr_fs_clk.c), - }, -}; - -static struct branch_clk usb_hsic_system_clk = { - .b = { - .ctl_reg = USB_HSIC_SYSTEM_CLK_CTL_REG, - .en_mask = BIT(4), - .reset_reg = USB_HSIC_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 24, - }, - .c = { - .parent = &usb_hsic_xcvr_fs_clk.c, - .dbg_name = "usb_hsic_system_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hsic_system_clk.c), - }, -}; - -#define F_USB_HSIC(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - } -static struct clk_freq_tbl clk_tbl_usb2_hsic[] = { - F_USB_HSIC(480000000, pll14), - F_END -}; - -static struct rcg_clk usb_hsic_hsic_src_clk = { - .b = { - .ctl_reg = USB_HSIC_HSIC_CLK_SRC_CTL_REG, - .halt_check = NOCHECK, - }, - .root_en_mask = BIT(0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_usb2_hsic, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_hsic_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 480000000), - CLK_INIT(usb_hsic_hsic_src_clk.c), - }, -}; - -static struct branch_clk usb_hsic_hsic_clk = { - .b = { - .ctl_reg = USB_HSIC_HSIC_CLK_CTL_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 19, - }, - .c = { - .parent = &usb_hsic_hsic_src_clk.c, - .dbg_name = "usb_hsic_hsic_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hsic_hsic_clk.c), - }, -}; - -#define F_USB_HSIO_CAL(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - } -static struct clk_freq_tbl clk_tbl_usb_hsio_cal[] = { - F_USB_HSIO_CAL(9000000, pxo), - F_END -}; - -static struct rcg_clk usb_hsic_hsio_cal_clk = { - .b = { - .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 23, - }, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_usb_hsio_cal, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_hsio_cal_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 10000000), - CLK_INIT(usb_hsic_hsio_cal_clk.c), - }, -}; - -static struct branch_clk usb_phy0_clk = { - .b = { - .reset_reg = USB_PHY0_RESET_REG, - .reset_mask = BIT(0), - }, - .c = { - .dbg_name = "usb_phy0_clk", - .ops = &clk_ops_reset, - CLK_INIT(usb_phy0_clk.c), - }, -}; - -#define CLK_USB_FS(i, n, fmax_nom) \ - struct rcg_clk i##_clk = { \ - .ns_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \ - .b = { \ - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \ - .halt_check = NOCHECK, \ - }, \ - .md_reg = USB_FSn_XCVR_FS_CLK_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_usb, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(NOMINAL, fmax_nom), \ - CLK_INIT(i##_clk.c), \ - }, \ - } - -static CLK_USB_FS(usb_fs1_src, 1, 64000000); -static struct branch_clk usb_fs1_xcvr_clk = { - .b = { - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(1), - .en_mask = BIT(9), - .reset_reg = USB_FSn_RESET_REG(1), - .reset_mask = BIT(1), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 15, - }, - .c = { - .parent = &usb_fs1_src_clk.c, - .dbg_name = "usb_fs1_xcvr_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_xcvr_clk.c), - }, -}; - -static struct branch_clk usb_fs1_sys_clk = { - .b = { - .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(1), - .en_mask = BIT(4), - .reset_reg = USB_FSn_RESET_REG(1), - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 16, - }, - .c = { - .parent = &usb_fs1_src_clk.c, - .dbg_name = "usb_fs1_sys_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_sys_clk.c), - }, -}; - -static CLK_USB_FS(usb_fs2_src, 2, 60000000); -static struct branch_clk usb_fs2_xcvr_clk = { - .b = { - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(2), - .en_mask = BIT(9), - .reset_reg = USB_FSn_RESET_REG(2), - .reset_mask = BIT(1), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 12, - }, - .c = { - .parent = &usb_fs2_src_clk.c, - .dbg_name = "usb_fs2_xcvr_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_xcvr_clk.c), - }, -}; - -static struct branch_clk usb_fs2_sys_clk = { - .b = { - .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(2), - .en_mask = BIT(4), - .reset_reg = USB_FSn_RESET_REG(2), - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 13, - }, - .c = { - .parent = &usb_fs2_src_clk.c, - .dbg_name = "usb_fs2_sys_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_sys_clk.c), - }, -}; - -/* Fast Peripheral Bus Clocks */ -static struct branch_clk ce1_core_clk = { - .b = { - .ctl_reg = CE1_CORE_CLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = CE1_CORE_CLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 27, - }, - .c = { - .dbg_name = "ce1_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce1_core_clk.c), - }, -}; - -static struct branch_clk ce1_p_clk = { - .b = { - .ctl_reg = CE1_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "ce1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce1_p_clk.c), - }, -}; - -#define F_CE3(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(6, 3, d, 2, 0, s##_to_bb_mux), \ - } - -static struct clk_freq_tbl clk_tbl_ce3[] = { - F_CE3( 0, gnd, 1), - F_CE3( 48000000, pll8, 8), - F_CE3(100000000, pll3, 12), - F_CE3(120000000, pll3, 10), - F_END -}; - -static struct rcg_clk ce3_src_clk = { - .b = { - .ctl_reg = CE3_CLK_SRC_NS_REG, - .halt_check = NOCHECK, - }, - .ns_reg = CE3_CLK_SRC_NS_REG, - .root_en_mask = BIT(7), - .ns_mask = BM(6, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_ce3, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "ce3_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000), - CLK_INIT(ce3_src_clk.c), - }, -}; - -static unsigned long fmax_ce3_8064v2[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 57000000, - [VDD_DIG_NOMINAL] = 120000000, -}; - -static struct branch_clk ce3_core_clk = { - .b = { - .ctl_reg = CE3_CORE_CLK_CTL_REG, - .en_mask = BIT(4), - .reset_reg = CE3_CORE_CLK_CTL_REG, - .reset_mask = BIT(7), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 5, - }, - .c = { - .parent = &ce3_src_clk.c, - .dbg_name = "ce3_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce3_core_clk.c), - } -}; - -static struct branch_clk ce3_p_clk = { - .b = { - .ctl_reg = CE3_HCLK_CTL_REG, - .en_mask = BIT(4), - .reset_reg = CE3_HCLK_CTL_REG, - .reset_mask = BIT(7), - .halt_reg = CLK_HALT_AFAB_SFAB_STATEB_REG, - .halt_bit = 16, - }, - .c = { - .parent = &ce3_src_clk.c, - .dbg_name = "ce3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce3_p_clk.c), - } -}; - -#define F_SATA(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(6, 3, d, 2, 0, s##_to_bb_mux), \ - } - -static struct clk_freq_tbl clk_tbl_sata[] = { - F_SATA( 0, gnd, 1), - F_SATA( 48000000, pll8, 8), - F_SATA(100000000, pll3, 12), - F_END -}; - -static struct rcg_clk sata_src_clk = { - .b = { - .ctl_reg = SATA_CLK_SRC_NS_REG, - .halt_check = NOCHECK, - }, - .ns_reg = SATA_CLK_SRC_NS_REG, - .root_en_mask = BIT(7), - .ns_mask = BM(6, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_sata, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "sata_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000), - CLK_INIT(sata_src_clk.c), - }, -}; - -static struct branch_clk sata_rxoob_clk = { - .b = { - .ctl_reg = SATA_RXOOB_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 26, - }, - .c = { - .parent = &sata_src_clk.c, - .dbg_name = "sata_rxoob_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_rxoob_clk.c), - }, -}; - -static struct branch_clk sata_pmalive_clk = { - .b = { - .ctl_reg = SATA_PMALIVE_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 25, - }, - .c = { - .parent = &sata_src_clk.c, - .dbg_name = "sata_pmalive_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_pmalive_clk.c), - }, -}; - -static struct branch_clk sata_phy_ref_clk = { - .b = { - .ctl_reg = SATA_PHY_REF_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 24, - }, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "sata_phy_ref_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_phy_ref_clk.c), - }, -}; - -static struct branch_clk sata_a_clk = { - .b = { - .ctl_reg = SATA_ACLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_AFAB_SFAB_STATEA_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "sata_a_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_a_clk.c), - }, -}; - -static struct branch_clk sata_p_clk = { - .b = { - .ctl_reg = SATA_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 27, - .reset_reg = SATA_RESET, - .reset_mask = BIT(0), - }, - .c = { - .dbg_name = "sata_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_p_clk.c), - }, -}; - -static struct branch_clk sfab_sata_s_p_clk = { - .b = { - .ctl_reg = SFAB_SATA_S_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_AFAB_SFAB_STATEB_REG, - .halt_bit = 14, - }, - .c = { - .dbg_name = "sfab_sata_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sfab_sata_s_p_clk.c), - }, -}; -static struct branch_clk pcie_p_clk = { - .b = { - .ctl_reg = PCIE_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 8, - }, - .c = { - .dbg_name = "pcie_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pcie_p_clk.c), - }, -}; - -static struct branch_clk pcie_phy_ref_clk = { - .b = { - .ctl_reg = PCIE_PCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_bit = 29, - }, - .c = { - .dbg_name = "pcie_phy_ref_clk", - .ops = &clk_ops_branch, - CLK_INIT(pcie_phy_ref_clk.c), - }, -}; - -static struct branch_clk pcie_a_clk = { - .b = { - .ctl_reg = PCIE_ACLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_AFAB_SFAB_STATEA_REG, - .halt_bit = 13, - }, - .c = { - .dbg_name = "pcie_a_clk", - .ops = &clk_ops_branch, - CLK_INIT(pcie_a_clk.c), - }, -}; - -static struct branch_clk dma_bam_p_clk = { - .b = { - .ctl_reg = DMA_BAM_HCLK_CTL, - .en_mask = BIT(4), - .hwcg_reg = DMA_BAM_HCLK_CTL, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "dma_bam_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dma_bam_p_clk.c), - }, -}; - -static struct branch_clk gsbi1_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(1), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "gsbi1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi1_p_clk.c), - }, -}; - -static struct branch_clk gsbi2_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(2), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "gsbi2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi2_p_clk.c), - }, -}; - -static struct branch_clk gsbi3_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(3), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(3), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gsbi3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi3_p_clk.c), - }, -}; - -static struct branch_clk gsbi4_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(4), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(4), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 27, - }, - .c = { - .dbg_name = "gsbi4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi4_p_clk.c), - }, -}; - -static struct branch_clk gsbi5_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(5), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(5), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "gsbi5_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi5_p_clk.c), - }, -}; - -static struct branch_clk gsbi6_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(6), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(6), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "gsbi6_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi6_p_clk.c), - }, -}; - -static struct branch_clk gsbi7_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(7), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(7), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 15, - }, - .c = { - .dbg_name = "gsbi7_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi7_p_clk.c), - }, -}; - -static struct branch_clk gsbi8_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(8), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(8), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "gsbi8_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi8_p_clk.c), - }, -}; - -static struct branch_clk gsbi9_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(9), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(9), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "gsbi9_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi9_p_clk.c), - }, -}; - -static struct branch_clk gsbi10_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(10), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(10), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gsbi10_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi10_p_clk.c), - }, -}; - -static struct branch_clk gsbi11_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(11), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(11), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "gsbi11_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi11_p_clk.c), - }, -}; - -static struct branch_clk gsbi12_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(12), - .en_mask = BIT(4), - .hwcg_reg = GSBIn_HCLK_CTL_REG(12), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 14, - }, - .c = { - .dbg_name = "gsbi12_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi12_p_clk.c), - }, -}; - -static struct branch_clk sata_phy_cfg_clk = { - .b = { - .ctl_reg = SATA_PHY_CFG_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "sata_phy_cfg_clk", - .ops = &clk_ops_branch, - CLK_INIT(sata_phy_cfg_clk.c), - }, -}; - -static struct branch_clk tsif_p_clk = { - .b = { - .ctl_reg = TSIF_HCLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = TSIF_HCLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "tsif_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(tsif_p_clk.c), - }, -}; - -static struct branch_clk usb_fs1_p_clk = { - .b = { - .ctl_reg = USB_FSn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 17, - }, - .c = { - .dbg_name = "usb_fs1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_p_clk.c), - }, -}; - -static struct branch_clk usb_fs2_p_clk = { - .b = { - .ctl_reg = USB_FSn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 14, - }, - .c = { - .dbg_name = "usb_fs2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_p_clk.c), - }, -}; - -static struct branch_clk usb_hs1_p_clk = { - .b = { - .ctl_reg = USB_HS1_HCLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = USB_HS1_HCLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "usb_hs1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs1_p_clk.c), - }, -}; - -static struct branch_clk usb_hs3_p_clk = { - .b = { - .ctl_reg = USB_HS3_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 31, - }, - .c = { - .dbg_name = "usb_hs3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs3_p_clk.c), - }, -}; - -static struct branch_clk usb_hs4_p_clk = { - .b = { - .ctl_reg = USB_HS4_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "usb_hs4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs4_p_clk.c), - }, -}; - -static struct branch_clk usb_hsic_p_clk = { - .b = { - .ctl_reg = USB_HSIC_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 28, - }, - .c = { - .dbg_name = "usb_hsic_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hsic_p_clk.c), - }, -}; - -static struct branch_clk sdc1_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(1), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "sdc1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc1_p_clk.c), - }, -}; - -static struct branch_clk sdc2_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(2), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 10, - }, - .c = { - .dbg_name = "sdc2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc2_p_clk.c), - }, -}; - -static struct branch_clk sdc3_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(3), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(3), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 9, - }, - .c = { - .dbg_name = "sdc3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc3_p_clk.c), - }, -}; - -static struct branch_clk sdc4_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(4), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(4), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 8, - }, - .c = { - .dbg_name = "sdc4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc4_p_clk.c), - }, -}; - -static struct branch_clk sdc5_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(5), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(5), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "sdc5_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc5_p_clk.c), - }, -}; - -/* HW-Voteable Clocks */ -static struct branch_clk adm0_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(2), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 14, - }, - .c = { - .dbg_name = "adm0_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_clk.c), - }, -}; - -static struct branch_clk adm0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(3), - .hwcg_reg = ADM0_PBUS_CLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 13, - }, - .c = { - .dbg_name = "adm0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(8), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 22, - }, - .c = { - .dbg_name = "pmic_arb0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb0_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb1_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 21, - }, - .c = { - .dbg_name = "pmic_arb1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb1_p_clk.c), - }, -}; - -static struct branch_clk pmic_ssbi2_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(7), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 23, - }, - .c = { - .dbg_name = "pmic_ssbi2_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_ssbi2_clk.c), - }, -}; - -static struct branch_clk rpm_msg_ram_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(6), - .hwcg_reg = RPM_MSG_RAM_HCLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 12, - }, - .c = { - .dbg_name = "rpm_msg_ram_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rpm_msg_ram_p_clk.c), - }, -}; - -/* - * Multimedia Clocks - */ - -#define CLK_CAM(name, n, hb) \ - struct rcg_clk name = { \ - .b = { \ - .ctl_reg = CAMCLK##n##_CC_REG, \ - .en_mask = BIT(0), \ - .halt_reg = DBG_BUS_VEC_I_REG, \ - .halt_bit = hb, \ - }, \ - .ns_reg = CAMCLK##n##_NS_REG, \ - .md_reg = CAMCLK##n##_MD_REG, \ - .root_en_mask = BIT(2), \ - .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0), \ - .mnd_en_mask = BIT(5), \ - .ctl_mask = BM(7, 6), \ - .set_rate = set_rate_mnd_8, \ - .freq_tbl = clk_tbl_cam, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #name, \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 64000000, NOMINAL, 128000000), \ - CLK_INIT(name.c), \ - }, \ - } -#define F_CAM(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_cam[] = { - F_CAM( 0, gnd, 1, 0, 0), - F_CAM( 6000000, pll8, 4, 1, 16), - F_CAM( 8000000, pll8, 4, 1, 12), - F_CAM( 12000000, pll8, 4, 1, 8), - F_CAM( 16000000, pll8, 4, 1, 6), - F_CAM( 19200000, pll8, 4, 1, 5), - F_CAM( 24000000, pll8, 4, 1, 4), - F_CAM( 32000000, pll8, 4, 1, 3), - F_CAM( 48000000, pll8, 4, 1, 2), - F_CAM( 64000000, pll8, 3, 1, 2), - F_CAM( 96000000, pll8, 4, 0, 0), - F_CAM(128000000, pll8, 3, 0, 0), - F_END -}; - -static CLK_CAM(cam0_clk, 0, 15); -static CLK_CAM(cam1_clk, 1, 16); -static CLK_CAM(cam2_clk, 2, 31); - -#define F_CSI(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_csi[] = { - F_CSI( 0, gnd, 1, 0, 0), - F_CSI( 27000000, pxo, 1, 0, 0), - F_CSI( 85330000, pll8, 1, 2, 9), - F_CSI(177780000, pll2, 1, 2, 9), - F_END -}; - -static struct rcg_clk csi0_src_clk = { - .ns_reg = CSI0_NS_REG, - .b = { - .ctl_reg = CSI0_CC_REG, - .halt_check = NOCHECK, - }, - .md_reg = CSI0_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_csi, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "csi0_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000), - CLK_INIT(csi0_src_clk.c), - }, -}; - -static struct branch_clk csi0_clk = { - .b = { - .ctl_reg = CSI0_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(8), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 13, - }, - .c = { - .parent = &csi0_src_clk.c, - .dbg_name = "csi0_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_clk.c), - }, -}; - -static struct branch_clk csi0_phy_clk = { - .b = { - .ctl_reg = CSI0_CC_REG, - .en_mask = BIT(8), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(29), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 9, - }, - .c = { - .parent = &csi0_src_clk.c, - .dbg_name = "csi0_phy_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_phy_clk.c), - }, -}; - -static struct rcg_clk csi1_src_clk = { - .ns_reg = CSI1_NS_REG, - .b = { - .ctl_reg = CSI1_CC_REG, - .halt_check = NOCHECK, - }, - .md_reg = CSI1_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_csi, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "csi1_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000), - CLK_INIT(csi1_src_clk.c), - }, -}; - -static struct branch_clk csi1_clk = { - .b = { - .ctl_reg = CSI1_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(18), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 14, - }, - .c = { - .parent = &csi1_src_clk.c, - .dbg_name = "csi1_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1_clk.c), - }, -}; - -static struct branch_clk csi1_phy_clk = { - .b = { - .ctl_reg = CSI1_CC_REG, - .en_mask = BIT(8), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(28), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 10, - }, - .c = { - .parent = &csi1_src_clk.c, - .dbg_name = "csi1_phy_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1_phy_clk.c), - }, -}; - -static struct rcg_clk csi2_src_clk = { - .ns_reg = CSI2_NS_REG, - .b = { - .ctl_reg = CSI2_CC_REG, - .halt_check = NOCHECK, - }, - .md_reg = CSI2_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_csi, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "csi2_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000), - CLK_INIT(csi2_src_clk.c), - }, -}; - -static struct branch_clk csi2_clk = { - .b = { - .ctl_reg = CSI2_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE2_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 29, - }, - .c = { - .parent = &csi2_src_clk.c, - .dbg_name = "csi2_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi2_clk.c), - }, -}; - -static struct branch_clk csi2_phy_clk = { - .b = { - .ctl_reg = CSI2_CC_REG, - .en_mask = BIT(8), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(31), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 29, - }, - .c = { - .parent = &csi2_src_clk.c, - .dbg_name = "csi2_phy_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi2_phy_clk.c), - }, -}; - -static struct clk *pix_rdi_mux_map[] = { - [0] = &csi0_clk.c, - [1] = &csi1_clk.c, - [2] = &csi2_clk.c, - NULL, -}; - -struct pix_rdi_clk { - bool prepared; - bool enabled; - unsigned long cur_rate; - - void __iomem *const s_reg; - u32 s_mask; - - void __iomem *const s2_reg; - u32 s2_mask; - - struct branch b; - struct clk c; -}; - -static inline struct pix_rdi_clk *to_pix_rdi_clk(struct clk *c) -{ - return container_of(c, struct pix_rdi_clk, c); -} - -static int pix_rdi_clk_set_rate(struct clk *c, unsigned long rate) -{ - int ret, i; - u32 reg; - unsigned long flags; - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - struct clk **mux_map = pix_rdi_mux_map; - unsigned long old_rate = rdi->cur_rate; - - /* - * These clocks select three inputs via two muxes. One mux selects - * between csi0 and csi1 and the second mux selects between that mux's - * output and csi2. The source and destination selections for each - * mux must be clocking for the switch to succeed so just turn on - * all three sources because it's easier than figuring out what source - * needs to be on at what time. - */ - for (i = 0; mux_map[i]; i++) { - ret = clk_prepare_enable(mux_map[i]); - if (ret) - goto err; - } - if (rate >= i) { - ret = -EINVAL; - goto err; - } - /* Keep the new source on when switching inputs of an enabled clock */ - if (rdi->prepared) { - ret = clk_prepare(mux_map[rate]); - if (ret) - goto err; - } - spin_lock_irqsave(&c->lock, flags); - if (rdi->enabled) { - ret = clk_enable(mux_map[rate]); - if (ret) { - spin_unlock_irqrestore(&c->lock, flags); - clk_unprepare(mux_map[rate]); - goto err; - } - } - spin_lock(&local_clock_reg_lock); - reg = readl_relaxed(rdi->s2_reg); - reg &= ~rdi->s2_mask; - reg |= rate == 2 ? rdi->s2_mask : 0; - writel_relaxed(reg, rdi->s2_reg); - /* - * Wait at least 6 cycles of slowest clock - * for the glitch-free MUX to fully switch sources. - */ - mb(); - udelay(1); - reg = readl_relaxed(rdi->s_reg); - reg &= ~rdi->s_mask; - reg |= rate == 1 ? rdi->s_mask : 0; - writel_relaxed(reg, rdi->s_reg); - /* - * Wait at least 6 cycles of slowest clock - * for the glitch-free MUX to fully switch sources. - */ - mb(); - udelay(1); - rdi->cur_rate = rate; - c->parent = mux_map[rate]; - spin_unlock(&local_clock_reg_lock); - - if (rdi->enabled) - clk_disable(mux_map[old_rate]); - spin_unlock_irqrestore(&c->lock, flags); - if (rdi->prepared) - clk_unprepare(mux_map[old_rate]); -err: - for (i--; i >= 0; i--) - clk_disable_unprepare(mux_map[i]); - - return 0; -} - -static unsigned long pix_rdi_clk_get_rate(struct clk *c) -{ - return to_pix_rdi_clk(c)->cur_rate; -} - -static int pix_rdi_clk_prepare(struct clk *c) -{ - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - rdi->prepared = true; - return 0; -} - -static int pix_rdi_clk_enable(struct clk *c) -{ - unsigned long flags; - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_enable_reg(&rdi->b, rdi->c.dbg_name); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - rdi->enabled = true; - - return 0; -} - -static void pix_rdi_clk_disable(struct clk *c) -{ - unsigned long flags; - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_disable_reg(&rdi->b, rdi->c.dbg_name); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - rdi->enabled = false; -} - -static void pix_rdi_clk_unprepare(struct clk *c) -{ - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - rdi->prepared = false; -} - -static int pix_rdi_clk_reset(struct clk *c, enum clk_reset_action action) -{ - return branch_reset(&to_pix_rdi_clk(c)->b, action); -} - -static long pix_rdi_clk_list_rate(struct clk *c, unsigned n) -{ - if (pix_rdi_mux_map[n]) - return n; - return -ENXIO; -} - -static struct clk *pix_rdi_clk_get_parent(struct clk *c) -{ - u32 reg; - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - - reg = readl_relaxed(rdi->s_reg); - rdi->cur_rate = reg & rdi->s_mask ? 1 : 0; - reg = readl_relaxed(rdi->s2_reg); - rdi->cur_rate = reg & rdi->s2_mask ? 2 : rdi->cur_rate; - - return pix_rdi_mux_map[rdi->cur_rate]; -} - -static enum handoff pix_rdi_clk_handoff(struct clk *c) -{ - struct pix_rdi_clk *rdi = to_pix_rdi_clk(c); - enum handoff ret; - - ret = branch_handoff(&rdi->b, &rdi->c); - if (ret == HANDOFF_DISABLED_CLK) - return ret; - - rdi->prepared = true; - rdi->enabled = true; - return HANDOFF_ENABLED_CLK; -} - -static struct clk_ops clk_ops_pix_rdi_8960 = { - .prepare = pix_rdi_clk_prepare, - .enable = pix_rdi_clk_enable, - .disable = pix_rdi_clk_disable, - .unprepare = pix_rdi_clk_unprepare, - .handoff = pix_rdi_clk_handoff, - .set_rate = pix_rdi_clk_set_rate, - .get_rate = pix_rdi_clk_get_rate, - .list_rate = pix_rdi_clk_list_rate, - .reset = pix_rdi_clk_reset, - .get_parent = pix_rdi_clk_get_parent, -}; - -static struct pix_rdi_clk csi_pix_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .en_mask = BIT(26), - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(26), - }, - .s_reg = MISC_CC_REG, - .s_mask = BIT(25), - .s2_reg = MISC_CC3_REG, - .s2_mask = BIT(13), - .c = { - .dbg_name = "csi_pix_clk", - .ops = &clk_ops_pix_rdi_8960, - CLK_INIT(csi_pix_clk.c), - }, -}; - -static struct pix_rdi_clk csi_pix1_clk = { - .b = { - .ctl_reg = MISC_CC3_REG, - .en_mask = BIT(10), - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(30), - }, - .s_reg = MISC_CC3_REG, - .s_mask = BIT(8), - .s2_reg = MISC_CC3_REG, - .s2_mask = BIT(9), - .c = { - .dbg_name = "csi_pix1_clk", - .ops = &clk_ops_pix_rdi_8960, - CLK_INIT(csi_pix1_clk.c), - }, -}; - -static struct pix_rdi_clk csi_rdi_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .en_mask = BIT(13), - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(27), - }, - .s_reg = MISC_CC_REG, - .s_mask = BIT(12), - .s2_reg = MISC_CC3_REG, - .s2_mask = BIT(12), - .c = { - .dbg_name = "csi_rdi_clk", - .ops = &clk_ops_pix_rdi_8960, - CLK_INIT(csi_rdi_clk.c), - }, -}; - -static struct pix_rdi_clk csi_rdi1_clk = { - .b = { - .ctl_reg = MISC_CC3_REG, - .en_mask = BIT(2), - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE2_REG, - .reset_mask = BIT(1), - }, - .s_reg = MISC_CC3_REG, - .s_mask = BIT(0), - .s2_reg = MISC_CC3_REG, - .s2_mask = BIT(1), - .c = { - .dbg_name = "csi_rdi1_clk", - .ops = &clk_ops_pix_rdi_8960, - CLK_INIT(csi_rdi1_clk.c), - }, -}; - -static struct pix_rdi_clk csi_rdi2_clk = { - .b = { - .ctl_reg = MISC_CC3_REG, - .en_mask = BIT(6), - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE2_REG, - .reset_mask = BIT(0), - }, - .s_reg = MISC_CC3_REG, - .s_mask = BIT(4), - .s2_reg = MISC_CC3_REG, - .s2_mask = BIT(5), - .c = { - .dbg_name = "csi_rdi2_clk", - .ops = &clk_ops_pix_rdi_8960, - CLK_INIT(csi_rdi2_clk.c), - }, -}; - -#define F_CSI_PHYTIMER(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_csi_phytimer[] = { - F_CSI_PHYTIMER( 0, gnd, 1, 0, 0), - F_CSI_PHYTIMER( 85330000, pll8, 1, 2, 9), - F_CSI_PHYTIMER(177780000, pll2, 1, 2, 9), - F_END -}; - -static struct rcg_clk csiphy_timer_src_clk = { - .ns_reg = CSIPHYTIMER_NS_REG, - .b = { - .ctl_reg = CSIPHYTIMER_CC_REG, - .halt_check = NOCHECK, - }, - .md_reg = CSIPHYTIMER_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(31, 24) | BM(15, 14) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd_8, - .freq_tbl = clk_tbl_csi_phytimer, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "csiphy_timer_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000), - CLK_INIT(csiphy_timer_src_clk.c), - }, -}; - -static struct branch_clk csi0phy_timer_clk = { - .b = { - .ctl_reg = CSIPHYTIMER_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 17, - }, - .c = { - .parent = &csiphy_timer_src_clk.c, - .dbg_name = "csi0phy_timer_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0phy_timer_clk.c), - }, -}; - -static struct branch_clk csi1phy_timer_clk = { - .b = { - .ctl_reg = CSIPHYTIMER_CC_REG, - .en_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 18, - }, - .c = { - .parent = &csiphy_timer_src_clk.c, - .dbg_name = "csi1phy_timer_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1phy_timer_clk.c), - }, -}; - -static struct branch_clk csi2phy_timer_clk = { - .b = { - .ctl_reg = CSIPHYTIMER_CC_REG, - .en_mask = BIT(11), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 30, - }, - .c = { - .parent = &csiphy_timer_src_clk.c, - .dbg_name = "csi2phy_timer_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi2phy_timer_clk.c), - }, -}; - -#define F_DSI(d) \ - { \ - .freq_hz = d, \ - .ns_val = BVAL(15, 12, (d-1)), \ - } -/* - * The DSI_BYTE/ESC clock is sourced from the DSI PHY PLL, which may change rate - * without this clock driver knowing. So, overload the clk_set_rate() to set - * the divider (1 to 16) of the clock with respect to the PLL rate. - */ -static struct clk_freq_tbl clk_tbl_dsi_byte[] = { - F_DSI(1), F_DSI(2), F_DSI(3), F_DSI(4), - F_DSI(5), F_DSI(6), F_DSI(7), F_DSI(8), - F_DSI(9), F_DSI(10), F_DSI(11), F_DSI(12), - F_DSI(13), F_DSI(14), F_DSI(15), F_DSI(16), - F_END -}; - -static struct branch_clk dsi1_reset_clk = { - .b = { - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(7), - .halt_check = NOCHECK, - }, - .c = { - .dbg_name = "dsi1_reset_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi1_reset_clk.c), - }, -}; - -static struct branch_clk dsi2_reset_clk = { - .b = { - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(25), - .halt_check = NOCHECK, - }, - .c = { - .dbg_name = "dsi2_reset_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi2_reset_clk.c), - }, -}; - -static struct rcg_clk dsi1_byte_clk = { - .b = { - .ctl_reg = DSI1_BYTE_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 21, - .retain_reg = DSI1_BYTE_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = DSI1_BYTE_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(15, 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_dsi_byte, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "dsi1_byte_clk", - .ops = &clk_ops_rcg, - CLK_INIT(dsi1_byte_clk.c), - }, -}; - -static struct rcg_clk dsi2_byte_clk = { - .b = { - .ctl_reg = DSI2_BYTE_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 20, - .retain_reg = DSI2_BYTE_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = DSI2_BYTE_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(15, 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_dsi_byte, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "dsi2_byte_clk", - .ops = &clk_ops_rcg, - CLK_INIT(dsi2_byte_clk.c), - }, -}; - -static struct rcg_clk dsi1_esc_clk = { - .b = { - .ctl_reg = DSI1_ESC_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 1, - }, - .ns_reg = DSI1_ESC_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(15, 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_dsi_byte, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "dsi1_esc_clk", - .ops = &clk_ops_rcg, - CLK_INIT(dsi1_esc_clk.c), - }, -}; - -static struct rcg_clk dsi2_esc_clk = { - .b = { - .ctl_reg = DSI2_ESC_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 3, - }, - .ns_reg = DSI2_ESC_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(15, 12), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_dsi_byte, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "dsi2_esc_clk", - .ops = &clk_ops_rcg, - CLK_INIT(dsi2_esc_clk.c), - }, -}; - -#define F_GFX2D(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD4(4, m, 0, n), \ - .ns_val = NS_MND_BANKED4(20, 16, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } -static struct clk_freq_tbl clk_tbl_gfx2d[] = { - F_GFX2D( 0, gnd, 0, 0), - F_GFX2D( 27000000, pxo, 0, 0), - F_GFX2D( 48000000, pll8, 1, 8), - F_GFX2D( 54857000, pll8, 1, 7), - F_GFX2D( 64000000, pll8, 1, 6), - F_GFX2D( 76800000, pll8, 1, 5), - F_GFX2D( 96000000, pll8, 1, 4), - F_GFX2D(128000000, pll8, 1, 3), - F_GFX2D(145455000, pll2, 2, 11), - F_GFX2D(160000000, pll2, 1, 5), - F_GFX2D(177778000, pll2, 2, 9), - F_GFX2D(200000000, pll2, 1, 4), - F_GFX2D(228571000, pll2, 2, 7), - F_END -}; - -static struct bank_masks bmnd_info_gfx2d0 = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX2D0_MD0_REG, - .ns_mask = BM(23, 20) | BM(5, 3), - .rst_mask = BIT(25), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX2D0_MD1_REG, - .ns_mask = BM(19, 16) | BM(2, 0), - .rst_mask = BIT(24), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx2d0_clk = { - .b = { - .ctl_reg = GFX2D0_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 9, - .retain_reg = GFX2D0_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX2D0_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx2d, - .bank_info = &bmnd_info_gfx2d0, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx2d0_clk", - .ops = &clk_ops_rcg, - .flags = CLKFLAG_SKIP_HANDOFF, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(gfx2d0_clk.c), - }, -}; - -static struct bank_masks bmnd_info_gfx2d1 = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX2D1_MD0_REG, - .ns_mask = BM(23, 20) | BM(5, 3), - .rst_mask = BIT(25), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX2D1_MD1_REG, - .ns_mask = BM(19, 16) | BM(2, 0), - .rst_mask = BIT(24), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx2d1_clk = { - .b = { - .ctl_reg = GFX2D1_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(13), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 14, - .retain_reg = GFX2D1_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX2D1_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx2d, - .bank_info = &bmnd_info_gfx2d1, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx2d1_clk", - .ops = &clk_ops_rcg, - .flags = CLKFLAG_SKIP_HANDOFF, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(gfx2d1_clk.c), - }, -}; - -#define F_GFX3D(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD4(4, m, 0, n), \ - .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } - -/*Shared by 8064, and 8930*/ -static struct clk_freq_tbl clk_tbl_gfx3d[] = { - F_GFX3D( 0, gnd, 0, 0), - F_GFX3D( 1800000, pxo, 1, 15), - F_GFX3D( 27000000, pxo, 0, 0), - F_GFX3D( 48000000, pll8, 1, 8), - F_GFX3D( 54857000, pll8, 1, 7), - F_GFX3D( 64000000, pll8, 1, 6), - F_GFX3D( 76800000, pll8, 1, 5), - F_GFX3D( 96000000, pll8, 1, 4), - F_GFX3D(128000000, pll8, 1, 3), - F_GFX3D(145455000, pll2, 2, 11), - F_GFX3D(160000000, pll2, 1, 5), - F_GFX3D(177778000, pll2, 2, 9), - F_GFX3D(192000000, pll8, 1, 2), - F_GFX3D(200000000, pll2, 1, 4), - F_GFX3D(228571000, pll2, 2, 7), - F_GFX3D(266667000, pll2, 1, 3), - F_GFX3D(320000000, pll2, 2, 5), - F_GFX3D(400000000, pll2, 1, 2), - F_GFX3D(450000000, pll15, 1, 2), - F_END -}; - -static struct clk_freq_tbl clk_tbl_gfx3d_8960ab[] = { - F_GFX3D( 0, gnd, 0, 0), - F_GFX3D( 27000000, pxo, 0, 0), - F_GFX3D( 48000000, pll8, 1, 8), - F_GFX3D( 54857000, pll8, 1, 7), - F_GFX3D( 64000000, pll8, 1, 6), - F_GFX3D( 76800000, pll8, 1, 5), - F_GFX3D( 96000000, pll8, 1, 4), - F_GFX3D(128000000, pll8, 1, 3), - F_GFX3D(145455000, pll2, 2, 11), - F_GFX3D(160000000, pll2, 1, 5), - F_GFX3D(177778000, pll2, 2, 9), - F_GFX3D(192000000, pll8, 1, 2), - F_GFX3D(200000000, pll2, 1, 4), - F_GFX3D(228571000, pll2, 2, 7), - F_GFX3D(266667000, pll2, 1, 3), - F_GFX3D(320000000, pll2, 2, 5), - F_GFX3D(400000000, pll2, 1, 2), - F_GFX3D(440000000, pll3, 1, 2), - F_END -}; - -static struct clk_freq_tbl clk_tbl_gfx3d_8960[] = { - F_GFX3D( 0, gnd, 0, 0), - F_GFX3D( 27000000, pxo, 0, 0), - F_GFX3D( 48000000, pll8, 1, 8), - F_GFX3D( 54857000, pll8, 1, 7), - F_GFX3D( 64000000, pll8, 1, 6), - F_GFX3D( 76800000, pll8, 1, 5), - F_GFX3D( 96000000, pll8, 1, 4), - F_GFX3D(128000000, pll8, 1, 3), - F_GFX3D(145455000, pll2, 2, 11), - F_GFX3D(160000000, pll2, 1, 5), - F_GFX3D(177778000, pll2, 2, 9), - F_GFX3D(200000000, pll2, 1, 4), - F_GFX3D(228571000, pll2, 2, 7), - F_GFX3D(266667000, pll2, 1, 3), - F_GFX3D(300000000, pll3, 1, 4), - F_GFX3D(320000000, pll2, 2, 5), - F_GFX3D(400000000, pll2, 1, 2), - F_END -}; - -static struct clk_freq_tbl clk_tbl_gfx3d_8930ab[] = { - F_GFX3D( 0, gnd, 0, 0), - F_GFX3D( 27000000, pxo, 0, 0), - F_GFX3D( 48000000, pll8, 1, 8), - F_GFX3D( 54857000, pll8, 1, 7), - F_GFX3D( 64000000, pll8, 1, 6), - F_GFX3D( 76800000, pll8, 1, 5), - F_GFX3D( 96000000, pll8, 1, 4), - F_GFX3D(128000000, pll8, 1, 3), - F_GFX3D(145455000, pll2, 2, 11), - F_GFX3D(160000000, pll2, 1, 5), - F_GFX3D(177778000, pll2, 2, 9), - F_GFX3D(192000000, pll8, 1, 2), - F_GFX3D(200000000, pll2, 1, 4), - F_GFX3D(228571000, pll2, 2, 7), - F_GFX3D(266667000, pll2, 1, 3), - F_GFX3D(320000000, pll2, 2, 5), - F_GFX3D(400000000, pll2, 1, 2), - F_GFX3D(500000000, pll15, 1, 2), - F_END -}; - -static unsigned long fmax_gfx3d_8064ab[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 325000000, - [VDD_DIG_HIGH] = 450000000 -}; - -static unsigned long fmax_gfx3d_8064[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 325000000, - [VDD_DIG_HIGH] = 400000000 -}; - -static unsigned long fmax_gfx3d_8930[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 192000000, - [VDD_DIG_NOMINAL] = 320000000, - [VDD_DIG_HIGH] = 400000000 -}; - -static unsigned long fmax_gfx3d_8930aa[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 192000000, - [VDD_DIG_NOMINAL] = 320000000, - [VDD_DIG_HIGH] = 450000000 -}; - -static unsigned long fmax_gfx3d_8930ab[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 192000000, - [VDD_DIG_NOMINAL] = 320000000, - [VDD_DIG_HIGH] = 500000000 -}; - -static unsigned long fmax_gfx3d_8960ab_400[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 192000000, - [VDD_DIG_NOMINAL] = 325000000, - [VDD_DIG_HIGH] = 400000000 -}; - -static unsigned long fmax_gfx3d_8960ab_440[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 192000000, - [VDD_DIG_NOMINAL] = 325000000, - [VDD_DIG_HIGH] = 440000000 -}; - -static unsigned long *fmax_gfx3d_8960ab[] = { - [0] = fmax_gfx3d_8960ab_400, - [1] = fmax_gfx3d_8960ab_440, -}; - -static struct bank_masks bmnd_info_gfx3d = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX3D_MD0_REG, - .ns_mask = BM(21, 18) | BM(5, 3), - .rst_mask = BIT(23), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX3D_MD1_REG, - .ns_mask = BM(17, 14) | BM(2, 0), - .rst_mask = BIT(22), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx3d_clk = { - .b = { - .ctl_reg = GFX3D_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(12), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 4, - .retain_reg = GFX3D_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX3D_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx3d, - .bank_info = &bmnd_info_gfx3d, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx3d_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 128000000, NOMINAL, 300000000, - HIGH, 400000000), - CLK_INIT(gfx3d_clk.c), - .depends = &gmem_axi_clk.c, - }, -}; - -#define F_VCAP(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD4(4, m, 0, n), \ - .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } - -static struct clk_freq_tbl clk_tbl_vcap[] = { - F_VCAP( 0, gnd, 0, 0), - F_VCAP( 27000000, pxo, 0, 0), - F_VCAP( 54860000, pll8, 1, 7), - F_VCAP( 64000000, pll8, 1, 6), - F_VCAP( 76800000, pll8, 1, 5), - F_VCAP(128000000, pll8, 1, 3), - F_VCAP(160000000, pll2, 1, 5), - F_VCAP(200000000, pll2, 1, 4), - F_END -}; - -static struct bank_masks bmnd_info_vcap = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = VCAP_MD0_REG, - .ns_mask = BM(21, 18) | BM(5, 3), - .rst_mask = BIT(23), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = VCAP_MD1_REG, - .ns_mask = BM(17, 14) | BM(2, 0), - .rst_mask = BIT(22), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk vcap_clk = { - .b = { - .ctl_reg = VCAP_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 15, - }, - .ns_reg = VCAP_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_vcap, - .bank_info = &bmnd_info_vcap, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vcap_clk", - .ops = &clk_ops_rcg, - .depends = &vcap_axi_clk.c, - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), - CLK_INIT(vcap_clk.c), - }, -}; - -static struct branch_clk vcap_npl_clk = { - .b = { - .ctl_reg = VCAP_CC_REG, - .en_mask = BIT(13), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 25, - }, - .c = { - .parent = &vcap_clk.c, - .dbg_name = "vcap_npl_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcap_npl_clk.c), - }, -}; - -#define F_IJPEG(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 15, 12, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } - -static struct clk_freq_tbl clk_tbl_ijpeg[] = { - F_IJPEG( 0, gnd, 1, 0, 0), - F_IJPEG( 27000000, pxo, 1, 0, 0), - F_IJPEG( 36570000, pll8, 1, 2, 21), - F_IJPEG( 54860000, pll8, 7, 0, 0), - F_IJPEG( 96000000, pll8, 4, 0, 0), - F_IJPEG(109710000, pll8, 1, 2, 7), - F_IJPEG(128000000, pll8, 3, 0, 0), - F_IJPEG(153600000, pll8, 1, 2, 5), - F_IJPEG(200000000, pll2, 4, 0, 0), - F_IJPEG(228571000, pll2, 1, 2, 7), - F_IJPEG(266667000, pll2, 1, 1, 3), - F_IJPEG(320000000, pll2, 1, 2, 5), - F_END -}; - -static unsigned long fmax_ijpeg_8064[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 266667000, - [VDD_DIG_HIGH] = 320000000 -}; - -static struct rcg_clk ijpeg_clk = { - .b = { - .ctl_reg = IJPEG_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 24, - .retain_reg = IJPEG_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = IJPEG_NS_REG, - .md_reg = IJPEG_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(15, 12) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_ijpeg, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "ijpeg_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 266667000, - HIGH, 320000000), - CLK_INIT(ijpeg_clk.c), - .depends = &ijpeg_axi_clk.c, - }, -}; - -#define F_JPEGD(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_jpegd[] = { - F_JPEGD( 0, gnd, 1), - F_JPEGD( 64000000, pll8, 6), - F_JPEGD( 76800000, pll8, 5), - F_JPEGD( 96000000, pll8, 4), - F_JPEGD(160000000, pll2, 5), - F_JPEGD(200000000, pll2, 4), - F_END -}; - -static struct rcg_clk jpegd_clk = { - .b = { - .ctl_reg = JPEGD_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(19), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 19, - .retain_reg = JPEGD_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = JPEGD_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(15, 12) | BM(2, 0)), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_jpegd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "jpegd_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000), - CLK_INIT(jpegd_clk.c), - .depends = &jpegd_axi_clk.c, - }, -}; - -#define F_MDP(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MND_BANKED8(22, 14, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } - -static struct clk_freq_tbl clk_tbl_mdp[] = { - F_MDP( 0, gnd, 0, 0), - F_MDP( 9600000, pll8, 1, 40), - F_MDP( 13710000, pll8, 1, 28), - F_MDP( 27000000, pxo, 0, 0), - F_MDP( 29540000, pll8, 1, 13), - F_MDP( 34910000, pll8, 1, 11), - F_MDP( 38400000, pll8, 1, 10), - F_MDP( 59080000, pll8, 2, 13), - F_MDP( 76800000, pll8, 1, 5), - F_MDP( 85330000, pll8, 2, 9), - F_MDP( 96000000, pll8, 1, 4), - F_MDP(128000000, pll8, 1, 3), - F_MDP(160000000, pll2, 1, 5), - F_MDP(177780000, pll2, 2, 9), - F_MDP(200000000, pll2, 1, 4), - F_MDP(228571000, pll2, 2, 7), - F_MDP(266667000, pll2, 1, 3), - F_END -}; - -static unsigned long fmax_mdp_8064[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 266667000 -}; - -static struct bank_masks bmnd_info_mdp = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = MDP_MD0_REG, - .ns_mask = BM(29, 22) | BM(5, 3), - .rst_mask = BIT(31), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = MDP_MD1_REG, - .ns_mask = BM(21, 14) | BM(2, 0), - .rst_mask = BIT(30), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk mdp_clk = { - .b = { - .ctl_reg = MDP_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(21), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 10, - .retain_reg = MDP_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = MDP_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_mdp, - .bank_info = &bmnd_info_mdp, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000), - CLK_INIT(mdp_clk.c), - .depends = &mdp_axi_clk.c, - }, -}; - -static unsigned long fmax_mdp_8960ab[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 266667000 -}; - -static struct branch_clk lut_mdp_clk = { - .b = { - .ctl_reg = MDP_LUT_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 13, - .retain_reg = MDP_LUT_CC_REG, - .retain_mask = BIT(31), - }, - .c = { - .parent = &mdp_clk.c, - .dbg_name = "lut_mdp_clk", - .ops = &clk_ops_branch, - CLK_INIT(lut_mdp_clk.c), - }, -}; - -#define F_MDP_VSYNC(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(13, 13, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_mdp_vsync[] = { - F_MDP_VSYNC(27000000, pxo), - F_END -}; - -static struct rcg_clk mdp_vsync_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .en_mask = BIT(6), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(3), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 22, - }, - .ns_reg = MISC_CC2_REG, - .ns_mask = BIT(13), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_mdp_vsync, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_vsync_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(mdp_vsync_clk.c), - }, -}; - -#define F_ROT(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC_BANKED(29, 26, 25, 22, d, \ - 21, 19, 18, 16, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_rot[] = { - F_ROT( 0, gnd, 1), - F_ROT( 27000000, pxo, 1), - F_ROT( 29540000, pll8, 13), - F_ROT( 32000000, pll8, 12), - F_ROT( 38400000, pll8, 10), - F_ROT( 48000000, pll8, 8), - F_ROT( 54860000, pll8, 7), - F_ROT( 64000000, pll8, 6), - F_ROT( 76800000, pll8, 5), - F_ROT( 96000000, pll8, 4), - F_ROT(100000000, pll2, 8), - F_ROT(114290000, pll2, 7), - F_ROT(133330000, pll2, 6), - F_ROT(160000000, pll2, 5), - F_ROT(200000000, pll2, 4), - F_END -}; - -static struct bank_masks bdiv_info_rot = { - .bank_sel_mask = BIT(30), - .bank0_mask = { - .ns_mask = BM(25, 22) | BM(18, 16), - }, - .bank1_mask = { - .ns_mask = BM(29, 26) | BM(21, 19), - }, -}; - -static struct rcg_clk rot_clk = { - .b = { - .ctl_reg = ROT_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 15, - .retain_reg = ROT_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = ROT_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_div_banked, - .freq_tbl = clk_tbl_rot, - .bank_info = &bdiv_info_rot, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "rot_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000), - CLK_INIT(rot_clk.c), - .depends = &rot_axi_clk.c, - }, -}; - -static int hdmi_pll_clk_enable(struct clk *c) -{ - int ret; - unsigned long flags; - spin_lock_irqsave(&local_clock_reg_lock, flags); - ret = hdmi_pll_enable(); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - return ret; -} - -static void hdmi_pll_clk_disable(struct clk *c) -{ - unsigned long flags; - spin_lock_irqsave(&local_clock_reg_lock, flags); - hdmi_pll_disable(); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static struct clk_ops clk_ops_hdmi_pll = { - .enable = hdmi_pll_clk_enable, - .disable = hdmi_pll_clk_disable, -}; - -static struct clk hdmi_pll_clk = { - .parent = &pxo_clk.c, - .dbg_name = "hdmi_pll_clk", - .ops = &clk_ops_hdmi_pll, - .vdd_class = &vdd_sr2_hdmi_pll, - .fmax = (unsigned long [VDD_SR2_HDMI_PLL_NUM]) { - [VDD_SR2_HDMI_PLL_ON] = ULONG_MAX, - }, - .num_fmax = VDD_SR2_HDMI_PLL_NUM, - CLK_INIT(hdmi_pll_clk), -}; - -#define F_TV_GND(f, s, p_r, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -#define F_TV(f, s, p_r, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - .extra_freq_data = (void *)p_r, \ - } -/* Switching TV freqs requires PLL reconfiguration. */ -static struct clk_freq_tbl clk_tbl_tv[] = { - F_TV_GND( 0, gnd, 0, 1, 0, 0), - F_TV( 25200000, hdmi_pll, 25200000, 1, 0, 0), - F_TV( 27000000, hdmi_pll, 27000000, 1, 0, 0), - F_TV( 27030000, hdmi_pll, 27030000, 1, 0, 0), - F_TV( 74250000, hdmi_pll, 74250000, 1, 0, 0), - F_TV(108000000, hdmi_pll, 108000000, 1, 0, 0), - F_TV(148500000, hdmi_pll, 148500000, 1, 0, 0), - F_END -}; - -static unsigned long fmax_tv_src_8064[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 74250000, - [VDD_DIG_NOMINAL] = 149000000 -}; - -/* - * Unlike other clocks, the TV rate is adjusted through PLL - * re-programming. It is also routed through an MND divider. - */ -void set_rate_tv(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - unsigned long pll_rate = (unsigned long)nf->extra_freq_data; - if (pll_rate) { - hdmi_pll_set_rate(pll_rate); - hdmi_pll_clk.rate = pll_rate; - } - set_rate_mnd(rcg, nf); -} - -static struct rcg_clk tv_src_clk = { - .ns_reg = TV_NS_REG, - .b = { - .ctl_reg = TV_CC_REG, - .halt_check = NOCHECK, - .retain_reg = TV_CC_REG, - .retain_mask = BIT(31), - }, - .md_reg = TV_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(15, 14) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_tv, - .freq_tbl = clk_tbl_tv, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tv_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 27030000, NOMINAL, 149000000), - CLK_INIT(tv_src_clk.c), - }, -}; - -static struct cdiv_clk tv_src_div_clk = { - .b = { - .ctl_reg = TV_NS_REG, - .halt_check = NOCHECK, - }, - .ns_reg = TV_NS_REG, - .div_offset = 6, - .max_div = 2, - .c = { - .dbg_name = "tv_src_div_clk", - .ops = &clk_ops_cdiv, - CLK_INIT(tv_src_div_clk.c), - .rate = ULONG_MAX, - }, -}; - -static struct branch_clk tv_enc_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(8), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 9, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "tv_enc_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_enc_clk.c), - }, -}; - -static struct branch_clk tv_dac_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 10, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "tv_dac_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_dac_clk.c), - }, -}; - -static struct branch_clk mdp_tv_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(4), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 12, - .retain_reg = TV_CC2_REG, - .retain_mask = BIT(10), - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "mdp_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_tv_clk.c), - }, -}; - -static struct branch_clk hdmi_tv_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(1), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 11, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "hdmi_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_tv_clk.c), - }, -}; - -static struct branch_clk rgb_tv_clk = { - .b = { - .ctl_reg = TV_CC2_REG, - .en_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 27, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "rgb_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(rgb_tv_clk.c), - }, -}; - -static struct branch_clk npl_tv_clk = { - .b = { - .ctl_reg = TV_CC2_REG, - .en_mask = BIT(16), - .halt_reg = DBG_BUS_VEC_J_REG, - .halt_bit = 26, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "npl_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(npl_tv_clk.c), - }, -}; - -static struct branch_clk hdmi_app_clk = { - .b = { - .ctl_reg = MISC_CC2_REG, - .en_mask = BIT(11), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(11), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 25, - }, - .c = { - .dbg_name = "hdmi_app_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_app_clk.c), - }, -}; - -static struct bank_masks bmnd_info_vcodec = { - .bank_sel_mask = BIT(13), - .bank0_mask = { - .md_reg = VCODEC_MD0_REG, - .ns_mask = BM(18, 11) | BM(2, 0), - .rst_mask = BIT(31), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, - .bank1_mask = { - .md_reg = VCODEC_MD1_REG, - .ns_mask = BM(26, 19) | BM(29, 27), - .rst_mask = BIT(30), - .mnd_en_mask = BIT(10), - .mode_mask = BM(12, 11), - }, -}; -#define F_VCODEC(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MND_BANKED8(11, 19, n, m, 0, 27, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(6, 11, n), \ - } -static struct clk_freq_tbl clk_tbl_vcodec[] = { - F_VCODEC( 0, gnd, 0, 0), - F_VCODEC( 27000000, pxo, 0, 0), - F_VCODEC( 32000000, pll8, 1, 12), - F_VCODEC( 48000000, pll8, 1, 8), - F_VCODEC( 54860000, pll8, 1, 7), - F_VCODEC( 96000000, pll8, 1, 4), - F_VCODEC(133330000, pll2, 1, 6), - F_VCODEC(200000000, pll2, 1, 4), - F_VCODEC(228570000, pll2, 2, 7), - F_VCODEC(266670000, pll2, 1, 3), - F_END -}; - -static struct rcg_clk vcodec_clk = { - .b = { - .ctl_reg = VCODEC_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 29, - .retain_reg = VCODEC_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VCODEC_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .bank_info = &bmnd_info_vcodec, - .freq_tbl = clk_tbl_vcodec, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vcodec_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(vcodec_clk.c), - .depends = &vcodec_axi_clk.c, - }, -}; - -static unsigned long fmax_vcodec_8064v2[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 100000000, - [VDD_DIG_NOMINAL] = 200000000, - [VDD_DIG_HIGH] = 266670000, -}; - -static unsigned long fmax_vcodec_8930ab[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 100000000, - [VDD_DIG_NOMINAL] = 200000000, - [VDD_DIG_HIGH] = 266670000 -}; - -#define F_VPE(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_vpe[] = { - F_VPE( 0, gnd, 1), - F_VPE( 27000000, pxo, 1), - F_VPE( 34909000, pll8, 11), - F_VPE( 38400000, pll8, 10), - F_VPE( 64000000, pll8, 6), - F_VPE( 76800000, pll8, 5), - F_VPE( 96000000, pll8, 4), - F_VPE(100000000, pll2, 8), - F_VPE(160000000, pll2, 5), - F_END -}; - -static struct rcg_clk vpe_clk = { - .b = { - .ctl_reg = VPE_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(17), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 28, - .retain_reg = VPE_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VPE_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(15, 12) | BM(2, 0)), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_vpe, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vpe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 76800000, NOMINAL, 160000000), - CLK_INIT(vpe_clk.c), - .depends = &vpe_axi_clk.c, - }, -}; - -#define F_VFE(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 11, 10, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } - -static struct clk_freq_tbl clk_tbl_vfe[] = { - F_VFE( 0, gnd, 1, 0, 0), - F_VFE( 13960000, pll8, 1, 2, 55), - F_VFE( 27000000, pxo, 1, 0, 0), - F_VFE( 36570000, pll8, 1, 2, 21), - F_VFE( 38400000, pll8, 2, 1, 5), - F_VFE( 45180000, pll8, 1, 2, 17), - F_VFE( 48000000, pll8, 2, 1, 4), - F_VFE( 54860000, pll8, 1, 1, 7), - F_VFE( 64000000, pll8, 2, 1, 3), - F_VFE( 76800000, pll8, 1, 1, 5), - F_VFE( 96000000, pll8, 2, 1, 2), - F_VFE(109710000, pll8, 1, 2, 7), - F_VFE(128000000, pll8, 1, 1, 3), - F_VFE(153600000, pll8, 1, 2, 5), - F_VFE(200000000, pll2, 2, 1, 2), - F_VFE(228570000, pll2, 1, 2, 7), - F_VFE(266667000, pll2, 1, 1, 3), - F_VFE(320000000, pll2, 1, 2, 5), - F_END -}; - -static unsigned long fmax_vfe_8064[VDD_DIG_NUM] = { - [VDD_DIG_LOW] = 128000000, - [VDD_DIG_NOMINAL] = 266667000, - [VDD_DIG_HIGH] = 320000000 -}; - -static struct rcg_clk vfe_clk = { - .b = { - .ctl_reg = VFE_CC_REG, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 6, - .en_mask = BIT(0), - .retain_reg = VFE_CC2_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VFE_NS_REG, - .md_reg = VFE_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(11, 10) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_vfe, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vfe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 266667000, - HIGH, 320000000), - CLK_INIT(vfe_clk.c), - .depends = &vfe_axi_clk.c, - }, -}; - -static struct branch_clk csi_vfe_clk = { - .b = { - .ctl_reg = VFE_CC_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(24), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 8, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "csi_vfe_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi_vfe_clk.c), - }, -}; - -/* - * Low Power Audio Clocks - */ -#define F_AIF_OSR(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_aif_osr_492[] = { - F_AIF_OSR( 0, gnd, 1, 0, 0), - F_AIF_OSR( 512000, pll4, 4, 1, 240), - F_AIF_OSR( 768000, pll4, 4, 1, 160), - F_AIF_OSR( 1024000, pll4, 4, 1, 120), - F_AIF_OSR( 1536000, pll4, 4, 1, 80), - F_AIF_OSR( 2048000, pll4, 4, 1, 60), - F_AIF_OSR( 3072000, pll4, 4, 1, 40), - F_AIF_OSR( 4096000, pll4, 4, 1, 30), - F_AIF_OSR( 6144000, pll4, 4, 1, 20), - F_AIF_OSR( 8192000, pll4, 4, 1, 15), - F_AIF_OSR(12288000, pll4, 4, 1, 10), - F_AIF_OSR(24576000, pll4, 4, 1, 5), - F_AIF_OSR(27000000, pxo, 1, 0, 0), - F_END -}; - -static struct clk_freq_tbl clk_tbl_aif_osr_393[] = { - F_AIF_OSR( 0, gnd, 1, 0, 0), - F_AIF_OSR( 512000, pll4, 4, 1, 192), - F_AIF_OSR( 768000, pll4, 4, 1, 128), - F_AIF_OSR( 1024000, pll4, 4, 1, 96), - F_AIF_OSR( 1536000, pll4, 4, 1, 64), - F_AIF_OSR( 2048000, pll4, 4, 1, 48), - F_AIF_OSR( 3072000, pll4, 4, 1, 32), - F_AIF_OSR( 4096000, pll4, 4, 1, 24), - F_AIF_OSR( 6144000, pll4, 4, 1, 16), - F_AIF_OSR( 8192000, pll4, 4, 1, 12), - F_AIF_OSR(12288000, pll4, 4, 1, 8), - F_AIF_OSR(24576000, pll4, 4, 1, 4), - F_AIF_OSR(27000000, pxo, 1, 0, 0), - F_END -}; - -#define CLK_AIF_OSR(i, ns, md, h_r) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(17), \ - .reset_reg = ns, \ - .reset_mask = BIT(19), \ - .halt_reg = h_r, \ - .halt_check = ENABLE, \ - .halt_bit = 1, \ - }, \ - .ns_reg = ns, \ - .md_reg = md, \ - .root_en_mask = BIT(9), \ - .ns_mask = (BM(31, 24) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_aif_osr_393, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(LOW, 27000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(21), \ - .reset_reg = ns, \ - .reset_mask = BIT(23), \ - .halt_reg = h_r, \ - .halt_check = ENABLE, \ - .halt_bit = 1, \ - }, \ - .ns_reg = ns, \ - .md_reg = md, \ - .root_en_mask = BIT(9), \ - .ns_mask = (BM(31, 24) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_aif_osr_393, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(LOW, 27000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } - -#define CLK_AIF_BIT(i, ns, h_r) \ - struct cdiv_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(15), \ - .halt_reg = h_r, \ - .halt_check = DELAY, \ - }, \ - .ns_reg = ns, \ - .ext_mask = BIT(14), \ - .div_offset = 10, \ - .max_div = 16, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_cdiv, \ - CLK_INIT(i##_clk.c), \ - .rate = ULONG_MAX, \ - }, \ - } - -#define CLK_AIF_BIT_DIV(i, ns, h_r) \ - struct cdiv_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(19), \ - .halt_reg = h_r, \ - .halt_check = DELAY, \ - }, \ - .ns_reg = ns, \ - .ext_mask = BIT(18), \ - .div_offset = 10, \ - .max_div = 256, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_cdiv, \ - CLK_INIT(i##_clk.c), \ - .rate = ULONG_MAX, \ - }, \ - } - -static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG, - LCC_MI2S_STATUS_REG); -static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG); - -static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_STATUS_REG); - -static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_STATUS_REG); - -#define F_PCM(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_pcm_492[] = { - { .ns_val = BIT(10) /* external input */ }, - F_PCM( 256000, pll4, 4, 1, 480), - F_PCM( 512000, pll4, 4, 1, 240), - F_PCM( 768000, pll4, 4, 1, 160), - F_PCM( 1024000, pll4, 4, 1, 120), - F_PCM( 1536000, pll4, 4, 1, 80), - F_PCM( 2048000, pll4, 4, 1, 60), - F_PCM( 3072000, pll4, 4, 1, 40), - F_PCM( 4096000, pll4, 4, 1, 30), - F_PCM( 6144000, pll4, 4, 1, 20), - F_PCM( 8192000, pll4, 4, 1, 15), - F_PCM(12288000, pll4, 4, 1, 10), - F_PCM(24576000, pll4, 4, 1, 5), - F_PCM(27000000, pxo, 1, 0, 0), - F_END -}; - -static struct clk_freq_tbl clk_tbl_pcm_393[] = { - { .ns_val = BIT(10) /* external input */ }, - F_PCM( 256000, pll4, 4, 1, 384), - F_PCM( 512000, pll4, 4, 1, 192), - F_PCM( 768000, pll4, 4, 1, 128), - F_PCM( 1024000, pll4, 4, 1, 96), - F_PCM( 1536000, pll4, 4, 1, 64), - F_PCM( 2048000, pll4, 4, 1, 48), - F_PCM( 3072000, pll4, 4, 1, 32), - F_PCM( 4096000, pll4, 4, 1, 24), - F_PCM( 6144000, pll4, 4, 1, 16), - F_PCM( 8192000, pll4, 4, 1, 12), - F_PCM(12288000, pll4, 4, 1, 8), - F_PCM(24576000, pll4, 4, 1, 4), - F_PCM(27000000, pxo, 1, 0, 0), - F_END -}; - -static struct rcg_clk pcm_clk = { - .b = { - .ctl_reg = LCC_PCM_NS_REG, - .en_mask = BIT(11), - .reset_reg = LCC_PCM_NS_REG, - .reset_mask = BIT(13), - .halt_reg = LCC_PCM_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_PCM_NS_REG, - .md_reg = LCC_PCM_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_pcm_393, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pcm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(pcm_clk.c), - .rate = ULONG_MAX, - }, -}; - -static struct rcg_clk audio_slimbus_clk = { - .b = { - .ctl_reg = LCC_SLIMBUS_NS_REG, - .en_mask = BIT(10), - .reset_reg = LCC_AHBEX_BRANCH_CTL_REG, - .reset_mask = BIT(5), - .halt_reg = LCC_SLIMBUS_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_SLIMBUS_NS_REG, - .md_reg = LCC_SLIMBUS_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = (BM(31, 24) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_aif_osr_393, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "audio_slimbus_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(audio_slimbus_clk.c), - }, -}; - -static struct branch_clk sps_slimbus_clk = { - .b = { - .ctl_reg = LCC_SLIMBUS_NS_REG, - .en_mask = BIT(12), - .halt_reg = LCC_SLIMBUS_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 1, - }, - .c = { - .parent = &audio_slimbus_clk.c, - .dbg_name = "sps_slimbus_clk", - .ops = &clk_ops_branch, - CLK_INIT(sps_slimbus_clk.c), - }, -}; - -static struct branch_clk slimbus_xo_src_clk = { - .b = { - .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG, - .en_mask = BIT(2), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 28, - }, - .c = { - .parent = &sps_slimbus_clk.c, - .dbg_name = "slimbus_xo_src_clk", - .ops = &clk_ops_branch, - CLK_INIT(slimbus_xo_src_clk.c), - }, -}; - -DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL); -DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL); -DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL); -DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL); -DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL); -DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL); -DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL); -DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL); -DEFINE_CLK_RPM_QDSS(qdss_clk, qdss_a_clk); - -static DEFINE_CLK_VOTER(sfab_msmbus_a_clk, &sfab_a_clk.c, 0); -static DEFINE_CLK_VOTER(sfab_tmr_a_clk, &sfab_a_clk.c, 0); - -static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_usb_hs3_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_usb_hs4_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc3_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc4_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc5_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_scm_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0); - -static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0); - -static DEFINE_CLK_VOTER(ebi1_acpu_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_msmbus_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(afab_acpu_a_clk, &afab_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(afab_msmbus_a_clk, &afab_a_clk.c, LONG_MAX); - -#ifdef CONFIG_DEBUG_FS -struct measure_sel { - u32 test_vector; - struct clk *c; -}; - -static DEFINE_CLK_MEASURE(l2_m_clk); -static DEFINE_CLK_MEASURE(krait0_m_clk); -static DEFINE_CLK_MEASURE(krait1_m_clk); -static DEFINE_CLK_MEASURE(krait2_m_clk); -static DEFINE_CLK_MEASURE(krait3_m_clk); -static DEFINE_CLK_MEASURE(q6sw_clk); -static DEFINE_CLK_MEASURE(q6fw_clk); -static DEFINE_CLK_MEASURE(q6_func_clk); - -static struct measure_sel measure_mux[] = { - { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c }, - { TEST_PER_LS(0x12), &sdc1_p_clk.c }, - { TEST_PER_LS(0x13), &sdc1_clk.c }, - { TEST_PER_LS(0x14), &sdc2_p_clk.c }, - { TEST_PER_LS(0x15), &sdc2_clk.c }, - { TEST_PER_LS(0x16), &sdc3_p_clk.c }, - { TEST_PER_LS(0x17), &sdc3_clk.c }, - { TEST_PER_LS(0x18), &sdc4_p_clk.c }, - { TEST_PER_LS(0x19), &sdc4_clk.c }, - { TEST_PER_LS(0x1A), &sdc5_p_clk.c }, - { TEST_PER_LS(0x1B), &sdc5_clk.c }, - { TEST_PER_LS(0x1F), &gp0_clk.c }, - { TEST_PER_LS(0x20), &gp1_clk.c }, - { TEST_PER_LS(0x21), &gp2_clk.c }, - { TEST_PER_LS(0x25), &dfab_clk.c }, - { TEST_PER_LS(0x25), &dfab_a_clk.c }, - { TEST_PER_LS(0x26), &pmem_clk.c }, - { TEST_PER_LS(0x32), &dma_bam_p_clk.c }, - { TEST_PER_LS(0x33), &cfpb_clk.c }, - { TEST_PER_LS(0x33), &cfpb_a_clk.c }, - { TEST_PER_LS(0x3D), &gsbi1_p_clk.c }, - { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c }, - { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c }, - { TEST_PER_LS(0x41), &gsbi2_p_clk.c }, - { TEST_PER_LS(0x42), &gsbi2_uart_clk.c }, - { TEST_PER_LS(0x44), &gsbi2_qup_clk.c }, - { TEST_PER_LS(0x45), &gsbi3_p_clk.c }, - { TEST_PER_LS(0x46), &gsbi3_uart_clk.c }, - { TEST_PER_LS(0x48), &gsbi3_qup_clk.c }, - { TEST_PER_LS(0x49), &gsbi4_p_clk.c }, - { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c }, - { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c }, - { TEST_PER_LS(0x4D), &gsbi5_p_clk.c }, - { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c }, - { TEST_PER_LS(0x50), &gsbi5_qup_clk.c }, - { TEST_PER_LS(0x51), &gsbi6_p_clk.c }, - { TEST_PER_LS(0x52), &gsbi6_uart_clk.c }, - { TEST_PER_LS(0x54), &gsbi6_qup_clk.c }, - { TEST_PER_LS(0x55), &gsbi7_p_clk.c }, - { TEST_PER_LS(0x56), &gsbi7_uart_clk.c }, - { TEST_PER_LS(0x58), &gsbi7_qup_clk.c }, - { TEST_PER_LS(0x59), &gsbi8_p_clk.c }, - { TEST_PER_LS(0x59), &sfab_sata_s_p_clk.c }, - { TEST_PER_LS(0x5A), &gsbi8_uart_clk.c }, - { TEST_PER_LS(0x5A), &sata_p_clk.c }, - { TEST_PER_LS(0x5B), &sata_rxoob_clk.c }, - { TEST_PER_LS(0x5C), &sata_pmalive_clk.c }, - { TEST_PER_LS(0x5C), &gsbi8_qup_clk.c }, - { TEST_PER_LS(0x5D), &gsbi9_p_clk.c }, - { TEST_PER_LS(0x5E), &gsbi9_uart_clk.c }, - { TEST_PER_LS(0x60), &gsbi9_qup_clk.c }, - { TEST_PER_LS(0x61), &gsbi10_p_clk.c }, - { TEST_PER_LS(0x62), &gsbi10_uart_clk.c }, - { TEST_PER_LS(0x64), &gsbi10_qup_clk.c }, - { TEST_PER_LS(0x65), &gsbi11_p_clk.c }, - { TEST_PER_LS(0x66), &gsbi11_uart_clk.c }, - { TEST_PER_LS(0x68), &gsbi11_qup_clk.c }, - { TEST_PER_LS(0x69), &gsbi12_p_clk.c }, - { TEST_PER_LS(0x6A), &gsbi12_uart_clk.c }, - { TEST_PER_LS(0x6C), &gsbi12_qup_clk.c }, - { TEST_PER_LS(0x5E), &pcie_p_clk.c }, - { TEST_PER_LS(0x5F), &ce3_p_clk.c }, - { TEST_PER_LS(0x60), &ce3_core_clk.c }, - { TEST_PER_LS(0x63), &usb_hs3_p_clk.c }, - { TEST_PER_LS(0x64), &usb_hs3_xcvr_clk.c }, - { TEST_PER_LS(0x65), &usb_hs4_p_clk.c }, - { TEST_PER_LS(0x66), &usb_hs4_xcvr_clk.c }, - { TEST_PER_LS(0x6B), &sata_phy_ref_clk.c }, - { TEST_PER_LS(0x6C), &sata_phy_cfg_clk.c }, - { TEST_PER_LS(0x78), &sfpb_clk.c }, - { TEST_PER_LS(0x78), &sfpb_a_clk.c }, - { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c }, - { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c }, - { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c }, - { TEST_PER_LS(0x7D), &prng_clk.c }, - { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c }, - { TEST_PER_LS(0x80), &adm0_p_clk.c }, - { TEST_PER_LS(0x84), &usb_hs1_p_clk.c }, - { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c }, - { TEST_PER_LS(0x86), &usb_hsic_p_clk.c }, - { TEST_PER_LS(0x87), &usb_hsic_system_clk.c }, - { TEST_PER_LS(0x88), &usb_hsic_xcvr_fs_clk.c }, - { TEST_PER_LS(0x89), &usb_fs1_p_clk.c }, - { TEST_PER_LS(0x8A), &usb_fs1_sys_clk.c }, - { TEST_PER_LS(0x8B), &usb_fs1_xcvr_clk.c }, - { TEST_PER_LS(0x8C), &usb_fs2_p_clk.c }, - { TEST_PER_LS(0x8D), &usb_fs2_sys_clk.c }, - { TEST_PER_LS(0x8E), &usb_fs2_xcvr_clk.c }, - { TEST_PER_LS(0x8F), &tsif_p_clk.c }, - { TEST_PER_LS(0x91), &tsif_ref_clk.c }, - { TEST_PER_LS(0x92), &ce1_p_clk.c }, - { TEST_PER_LS(0x94), &tssc_clk.c }, - { TEST_PER_LS(0x9D), &usb_hsic_hsio_cal_clk.c }, - { TEST_PER_LS(0xA4), &ce1_core_clk.c }, - - { TEST_PER_HS(0x07), &afab_clk.c }, - { TEST_PER_HS(0x07), &afab_a_clk.c }, - { TEST_PER_HS(0x18), &sfab_clk.c }, - { TEST_PER_HS(0x18), &sfab_a_clk.c }, - { TEST_PER_HS(0x26), &q6sw_clk }, - { TEST_PER_HS(0x27), &q6fw_clk }, - { TEST_PER_HS(0x2A), &adm0_clk.c }, - { TEST_PER_HS(0x31), &sata_a_clk.c }, - { TEST_PER_HS(0x2D), &pcie_phy_ref_clk.c }, - { TEST_PER_HS(0x32), &pcie_a_clk.c }, - { TEST_PER_HS(0x34), &ebi1_clk.c }, - { TEST_PER_HS(0x34), &ebi1_a_clk.c }, - { TEST_PER_HS(0x50), &usb_hsic_hsic_clk.c }, - - { TEST_MM_LS(0x00), &dsi1_byte_clk.c }, - { TEST_MM_LS(0x01), &dsi2_byte_clk.c }, - { TEST_MM_LS(0x02), &cam1_clk.c }, - { TEST_MM_LS(0x06), &_p_clk.c }, - { TEST_MM_LS(0x07), &csi_p_clk.c }, - { TEST_MM_LS(0x08), &dsi2_s_p_clk.c }, - { TEST_MM_LS(0x09), &dsi1_m_p_clk.c }, - { TEST_MM_LS(0x0A), &dsi1_s_p_clk.c }, - { TEST_MM_LS(0x0C), &gfx2d0_p_clk.c }, - { TEST_MM_LS(0x0D), &gfx2d1_p_clk.c }, - { TEST_MM_LS(0x0E), &gfx3d_p_clk.c }, - { TEST_MM_LS(0x0F), &hdmi_m_p_clk.c }, - { TEST_MM_LS(0x10), &hdmi_s_p_clk.c }, - { TEST_MM_LS(0x11), &ijpeg_p_clk.c }, - { TEST_MM_LS(0x12), &imem_p_clk.c }, - { TEST_MM_LS(0x13), &jpegd_p_clk.c }, - { TEST_MM_LS(0x14), &mdp_p_clk.c }, - { TEST_MM_LS(0x16), &rot_p_clk.c }, - { TEST_MM_LS(0x17), &dsi1_esc_clk.c }, - { TEST_MM_LS(0x18), &smmu_p_clk.c }, - { TEST_MM_LS(0x19), &tv_enc_p_clk.c }, - { TEST_MM_LS(0x1A), &vcodec_p_clk.c }, - { TEST_MM_LS(0x1B), &vfe_p_clk.c }, - { TEST_MM_LS(0x1C), &vpe_p_clk.c }, - { TEST_MM_LS(0x1D), &cam0_clk.c }, - { TEST_MM_LS(0x1F), &hdmi_app_clk.c }, - { TEST_MM_LS(0x20), &mdp_vsync_clk.c }, - { TEST_MM_LS(0x21), &tv_dac_clk.c }, - { TEST_MM_LS(0x22), &tv_enc_clk.c }, - { TEST_MM_LS(0x23), &dsi2_esc_clk.c }, - { TEST_MM_LS(0x25), &mmfpb_clk.c }, - { TEST_MM_LS(0x25), &mmfpb_a_clk.c }, - { TEST_MM_LS(0x26), &dsi2_m_p_clk.c }, - { TEST_MM_LS(0x27), &cam2_clk.c }, - { TEST_MM_LS(0x28), &vcap_p_clk.c }, - - { TEST_MM_HS(0x00), &csi0_clk.c }, - { TEST_MM_HS(0x01), &csi1_clk.c }, - { TEST_MM_HS(0x04), &csi_vfe_clk.c }, - { TEST_MM_HS(0x05), &ijpeg_clk.c }, - { TEST_MM_HS(0x06), &vfe_clk.c }, - { TEST_MM_HS(0x07), &gfx2d0_clk.c }, - { TEST_MM_HS(0x08), &gfx2d1_clk.c }, - { TEST_MM_HS(0x09), &gfx3d_clk.c }, - { TEST_MM_HS(0x0A), &jpegd_clk.c }, - { TEST_MM_HS(0x0B), &vcodec_clk.c }, - { TEST_MM_HS(0x0F), &mmfab_clk.c }, - { TEST_MM_HS(0x0F), &mmfab_a_clk.c }, - { TEST_MM_HS(0x11), &gmem_axi_clk.c }, - { TEST_MM_HS(0x12), &ijpeg_axi_clk.c }, - { TEST_MM_HS(0x13), &imem_axi_clk.c }, - { TEST_MM_HS(0x14), &jpegd_axi_clk.c }, - { TEST_MM_HS(0x15), &mdp_axi_clk.c }, - { TEST_MM_HS(0x16), &rot_axi_clk.c }, - { TEST_MM_HS(0x17), &vcodec_axi_clk.c }, - { TEST_MM_HS(0x18), &vfe_axi_clk.c }, - { TEST_MM_HS(0x19), &vpe_axi_clk.c }, - { TEST_MM_HS(0x1A), &mdp_clk.c }, - { TEST_MM_HS(0x1B), &rot_clk.c }, - { TEST_MM_HS(0x1C), &vpe_clk.c }, - { TEST_MM_HS(0x1E), &hdmi_tv_clk.c }, - { TEST_MM_HS(0x1F), &mdp_tv_clk.c }, - { TEST_MM_HS(0x24), &csi0_phy_clk.c }, - { TEST_MM_HS(0x25), &csi1_phy_clk.c }, - { TEST_MM_HS(0x26), &csi_pix_clk.c }, - { TEST_MM_HS(0x27), &csi_rdi_clk.c }, - { TEST_MM_HS(0x28), &lut_mdp_clk.c }, - { TEST_MM_HS(0x29), &vcodec_axi_a_clk.c }, - { TEST_MM_HS(0x2A), &vcodec_axi_b_clk.c }, - { TEST_MM_HS(0x2B), &csi1phy_timer_clk.c }, - { TEST_MM_HS(0x2C), &csi0phy_timer_clk.c }, - { TEST_MM_HS(0x2D), &csi2_clk.c }, - { TEST_MM_HS(0x2E), &csi2_phy_clk.c }, - { TEST_MM_HS(0x2F), &csi2phy_timer_clk.c }, - { TEST_MM_HS(0x30), &csi_pix1_clk.c }, - { TEST_MM_HS(0x31), &csi_rdi1_clk.c }, - { TEST_MM_HS(0x32), &csi_rdi2_clk.c }, - { TEST_MM_HS(0x33), &vcap_clk.c }, - { TEST_MM_HS(0x34), &vcap_npl_clk.c }, - { TEST_MM_HS(0x34), &gfx3d_axi_clk_8930.c }, - { TEST_MM_HS(0x35), &vcap_axi_clk.c }, - { TEST_MM_HS(0x36), &rgb_tv_clk.c }, - { TEST_MM_HS(0x37), &npl_tv_clk.c }, - { TEST_MM_HS(0x38), &gfx3d_axi_clk.c }, - - { TEST_LPA(0x0F), &mi2s_bit_clk.c }, - { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c }, - { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c }, - { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x14), &pcm_clk.c }, - { TEST_LPA(0x1D), &audio_slimbus_clk.c }, - - { TEST_LPA_HS(0x00), &q6_func_clk }, - - { TEST_CPUL2(0x2), &l2_m_clk }, - { TEST_CPUL2(0x0), &krait0_m_clk }, - { TEST_CPUL2(0x1), &krait1_m_clk }, - { TEST_CPUL2(0x4), &krait2_m_clk }, - { TEST_CPUL2(0x5), &krait3_m_clk }, -}; - -static struct measure_sel *find_measure_sel(struct clk *c) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(measure_mux); i++) - if (measure_mux[i].c == c) - return &measure_mux[i]; - return NULL; -} - -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - int ret = 0; - u32 clk_sel; - struct measure_sel *p; - struct measure_clk *measure = to_measure_clk(c); - unsigned long flags; - - if (!parent) - return -EINVAL; - - p = find_measure_sel(parent); - if (!p) - return -EINVAL; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* - * Program the test vector, measurement period (sample_ticks) - * and scaling multiplier. - */ - measure->sample_ticks = 0x10000; - clk_sel = p->test_vector & TEST_CLK_SEL_MASK; - measure->multiplier = 1; - switch (p->test_vector >> TEST_TYPE_SHIFT) { - case TEST_TYPE_PER_LS: - writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_PER_HS: - writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_MM_LS: - writel_relaxed(0x4030D97, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_LS_REG); - break; - case TEST_TYPE_MM_HS: - writel_relaxed(0x402B800, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_HS_REG); - break; - case TEST_TYPE_LPA: - writel_relaxed(0x4030D98, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), - LCC_CLK_LS_DEBUG_CFG_REG); - break; - case TEST_TYPE_LPA_HS: - writel_relaxed(0x402BC00, CLK_TEST_REG); - writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0), - LCC_CLK_HS_DEBUG_CFG_REG); - break; - case TEST_TYPE_CPUL2: - writel_relaxed(0x4030400, CLK_TEST_REG); - writel_relaxed(0x80|BVAL(5, 3, clk_sel), GCC_APCS_CLK_DIAG); - measure->sample_ticks = 0x4000; - measure->multiplier = 2; - if (cpu_is_krait_v3()) - measure->multiplier = 8; - break; - default: - ret = -EPERM; - } - /* Make sure test vector is set before starting measurements. */ - mb(); - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} - -/* Sample clock for 'ticks' reference clock ticks. */ -static u32 run_measurement(unsigned ticks) -{ - /* Stop counters and set the XO4 counter start value. */ - writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG); - - /* Wait for timer to become ready. */ - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0) - cpu_relax(); - - /* Run measurement and wait for completion. */ - writel_relaxed(BIT(20)|ticks, RINGOSC_TCXO_CTL_REG); - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0) - cpu_relax(); - - /* Stop counters. */ - writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG); - - /* Return measured ticks. */ - return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0); -} - - -/* Perform a hardware rate measurement for a given clock. - FOR DEBUG USE ONLY: Measurements take ~15 ms! */ -static unsigned long measure_clk_get_rate(struct clk *c) -{ - unsigned long flags; - u32 pdm_reg_backup, ringosc_reg_backup; - u64 raw_count_short, raw_count_full; - struct measure_clk *measure = to_measure_clk(c); - unsigned ret; - - ret = clk_prepare_enable(&cxo_clk.c); - if (ret) { - pr_warning("CXO clock failed to enable. Can't measure\n"); - return 0; - } - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Enable CXO/4 and RINGOSC branch and root. */ - pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG); - ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG); - writel_relaxed(0x2898, PDM_CLK_NS_REG); - writel_relaxed(0xA00, RINGOSC_NS_REG); - - /* - * The ring oscillator counter will not reset if the measured clock - * is not running. To detect this, run a short measurement before - * the full measurement. If the raw results of the two are the same - * then the clock must be off. - */ - - /* Run a short measurement. (~1 ms) */ - raw_count_short = run_measurement(0x1000); - /* Run a full measurement. (~14 ms) */ - raw_count_full = run_measurement(measure->sample_ticks); - - writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG); - writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG); - - /* Return 0 if the clock is off. */ - if (raw_count_full == raw_count_short) - ret = 0; - else { - /* Compute rate in Hz. */ - raw_count_full = ((raw_count_full * 10) + 15) * 4800000; - do_div(raw_count_full, ((measure->sample_ticks * 10) + 35)); - ret = (raw_count_full * measure->multiplier); - } - - /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */ - writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - clk_disable_unprepare(&cxo_clk.c); - - return ret; -} -#else /* !CONFIG_DEBUG_FS */ -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - return -EINVAL; -} - -static unsigned long measure_clk_get_rate(struct clk *c) -{ - return 0; -} -#endif /* CONFIG_DEBUG_FS */ - -static struct clk_ops clk_ops_measure = { - .set_parent = measure_clk_set_parent, - .get_rate = measure_clk_get_rate, -}; - -static struct measure_clk measure_clk = { - .c = { - .dbg_name = "measure_clk", - .ops = &clk_ops_measure, - CLK_INIT(measure_clk.c), - }, - .multiplier = 1, -}; - -static struct clk_lookup msm_clocks_8064[] = { - CLK_LOOKUP("xo", cxo_a_clk.c, ""), - CLK_LOOKUP("xo", pxo_a_clk.c, ""), - CLK_LOOKUP("pwm_clk", cxo_clk.c, "0-0048"), - CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"), - CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"), - CLK_LOOKUP("xo", pxo_clk.c, "pil-q6v4-lpass"), - CLK_LOOKUP("xo", cxo_clk.c, "pil_gss"), - CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"), - CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"), - CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"), - CLK_LOOKUP("pll2", pll2_clk.c, NULL), - CLK_LOOKUP("pll8", pll8_clk.c, NULL), - CLK_LOOKUP("pll4", pll4_clk.c, NULL), - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("bus_clk", afab_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"), - CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"), - CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"), - - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, ""), - CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"), - CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"), - - CLK_LOOKUP("core_clk", gp0_clk.c, ""), - CLK_LOOKUP("core_clk", gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gp2_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, "msm_serial_hsl.1"), - CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, "msm_serial_hsl.3"), - CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.4"), - CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, "msm_serial_hsl.2"), - CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "qup_i2c.0"), - CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"), - CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "spi_qsd.0"), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.5"), - CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, "spi_qsd.1"), - CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""), - CLK_LOOKUP("core_clk", pdm_clk.c, ""), - CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"), - CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.1"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.1"), - CLK_LOOKUP("core_clk", tssc_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs3_xcvr_clk.c, "msm_ehci_host.0"), - CLK_LOOKUP("alt_core_clk", usb_hs4_xcvr_clk.c, "msm_ehci_host.1"), - CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""), - CLK_LOOKUP("ref_clk", sata_phy_ref_clk.c, "msm_sata.0"), - CLK_LOOKUP("cfg_clk", sata_phy_cfg_clk.c, "msm_sata.0"), - CLK_LOOKUP("src_clk", sata_src_clk.c, "msm_sata.0"), - CLK_LOOKUP("core_rxoob_clk", sata_rxoob_clk.c, "msm_sata.0"), - CLK_LOOKUP("core_pmalive_clk", sata_pmalive_clk.c, "msm_sata.0"), - CLK_LOOKUP("bus_clk", sata_a_clk.c, "msm_sata.0"), - CLK_LOOKUP("iface_clk", sata_p_clk.c, "msm_sata.0"), - CLK_LOOKUP("slave_iface_clk", sfab_sata_s_p_clk.c, "msm_sata.0"), - CLK_LOOKUP("iface_clk", ce3_p_clk.c, "qce.0"), - CLK_LOOKUP("iface_clk", ce3_p_clk.c, "qcrypto.0"), - CLK_LOOKUP("core_clk", ce3_core_clk.c, "qce.0"), - CLK_LOOKUP("core_clk", ce3_core_clk.c, "qcrypto.0"), - CLK_LOOKUP("ce3_core_src_clk", ce3_src_clk.c, "qce.0"), - CLK_LOOKUP("ce3_core_src_clk", ce3_src_clk.c, "qcrypto.0"), - CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "msm_serial_hsl.1"), - CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "qup_i2c.0"), - CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, "msm_serial_hsl.3"), - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"), - CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "msm_serial_hsl.2"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "spi_qsd.0"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.5"), - CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "spi_qsd.1"), - CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, "msm_serial_hsl.4"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tspp.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tspp.0"), - CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs3_p_clk.c, "msm_ehci_host.0"), - CLK_LOOKUP("iface_clk", usb_hs4_p_clk.c, "msm_ehci_host.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", pcie_p_clk.c, "msm_pcie"), - CLK_LOOKUP("ref_clk", pcie_phy_ref_clk.c, "msm_pcie"), - CLK_LOOKUP("bus_clk", pcie_a_clk.c, "msm_pcie"), - CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""), - CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""), - CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0010"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0034"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"), - CLK_LOOKUP("cam_clk", cam1_clk.c, "4-0048"), - CLK_LOOKUP("cam_clk", cam1_clk.c, "4-006c"), - CLK_LOOKUP("cam_clk", cam2_clk.c, ""), - CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("byte_clk", dsi2_byte_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("esc_clk", dsi2_esc_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("rgb_clk", rgb_tv_clk.c, ""), - CLK_LOOKUP("npl_clk", npl_tv_clk.c, ""), - - CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.11"), - CLK_LOOKUP("bus_clk", - gfx3d_axi_clk.c, "footswitch-8x60.11"), - CLK_LOOKUP("iface_clk", vcap_p_clk.c, ""), - CLK_LOOKUP("iface_clk", vcap_p_clk.c, "msm_vcap.0"), - CLK_LOOKUP("iface_clk", vcap_p_clk.c, "footswitch-8x60.10"), - CLK_LOOKUP("bus_clk", vcap_axi_clk.c, "footswitch-8x60.10"), - CLK_LOOKUP("core_clk", vcap_clk.c, ""), - CLK_LOOKUP("core_clk", vcap_clk.c, "msm_vcap.0"), - CLK_LOOKUP("core_clk", vcap_clk.c, "footswitch-8x60.10"), - CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, ""), - CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, "msm_vcap.0"), - CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("core_clk", jpegd_clk.c, ""), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"), - CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"), - CLK_LOOKUP("div_clk", tv_src_div_clk.c, ""), - CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"), - CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"), - CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"), - CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"), - CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("master_iface_clk", dsi2_m_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("slave_iface_clk", dsi2_s_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.11"), - CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("iface_clk", jpegd_p_clk.c, ""), - CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.11"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"), - CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"), - CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"), - - CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, - "msm-dai-q6-mi2s"), - CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, - "msm-dai-q6-mi2s"), - CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"), - CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, ""), - CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"), - CLK_LOOKUP("core_clk", jpegd_axi_clk.c, ""), - CLK_LOOKUP("core_clk", vpe_axi_clk.c, ""), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, ""), - CLK_LOOKUP("core_clk", vcap_axi_clk.c, ""), - CLK_LOOKUP("core_clk", rot_axi_clk.c, ""), - CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, ""), - CLK_LOOKUP("core_clk", vfe_axi_clk.c, ""), - CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, ""), - CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, ""), - CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, ""), - - CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL), - CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("core_clk", dfab_usb_hs3_clk.c, "msm_ehci_host.0"), - CLK_LOOKUP("core_clk", dfab_usb_hs3_clk.c, "msm_ehci_host.1"), - CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"), - CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"), - CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"), - - CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"), - CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"), - CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"), - CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"), - - CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu-v0.10"), - - CLK_LOOKUP("core_clk", vcap_axi_clk.c, "msm_iommu-v0.11"), - - CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"), - - CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"), - CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""), - - CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("reset2_clk", dsi2_reset_clk.c, "footswitch-8x60.4"), - - CLK_LOOKUP("l2_mclk", l2_m_clk, ""), - CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""), - CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""), - CLK_LOOKUP("krait2_mclk", krait2_m_clk, ""), - CLK_LOOKUP("krait3_mclk", krait3_m_clk, ""), -}; - -static struct clk_lookup msm_clocks_8960_common[] __initdata = { - CLK_LOOKUP("xo", cxo_a_clk.c, ""), - CLK_LOOKUP("xo", pxo_a_clk.c, ""), - CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"), - CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"), - CLK_LOOKUP("xo", pxo_clk.c, "pil-q6v4-lpass"), - CLK_LOOKUP("xo", cxo_clk.c, "pil-q6v4-modem"), - CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"), - CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"), - CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"), - CLK_LOOKUP("pll2", pll2_clk.c, NULL), - CLK_LOOKUP("pll8", pll8_clk.c, NULL), - CLK_LOOKUP("pll4", pll4_clk.c, NULL), - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("bus_clk", afab_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"), - CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"), - CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"), - - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL), - CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"), - CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"), - - CLK_LOOKUP("core_clk", gp0_clk.c, ""), - CLK_LOOKUP("core_clk", gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gp2_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""), - /* used on 8960 SGLTE for console */ - CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, "msm_serial_hsl.1"), - /* used on 8960 standalone with Atheros Bluetooth */ - CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, "msm_serial_hs.2"), - CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"), - CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"), - CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "qup_i2c.10"), - CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.12"), - CLK_LOOKUP("core_clk", pdm_clk.c, ""), - CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"), - CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("slimbus_xo_src_clk", slimbus_xo_src_clk.c, NULL), - CLK_LOOKUP("core_clk", tssc_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"), - CLK_LOOKUP("phy_clk", usb_phy0_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_fs2_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs2_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs2_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"), - CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"), - CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"), - CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"), - CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"), - CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"), - CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, ""), - /* used on 8960 SGLTE for serial console */ - CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "msm_serial_hsl.1"), - /* used on 8960 standalone with Atheros Bluetooth */ - CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "msm_serial_hs.2"), - CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "qup_i2c.10"), - CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.12"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, ""), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tspp.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tspp.0"), - CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_fs2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""), - CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""), - CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-006c"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0048"), - CLK_LOOKUP("cam_clk", cam2_clk.c, NULL), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0034"), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0010"), - CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_pix_clk", csi_pix_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi_clk", csi_rdi_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, NULL), - CLK_LOOKUP("csi_clk", csi2_clk.c, NULL), - CLK_LOOKUP("csi_pix1_clk", csi_pix1_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi1_clk", csi_rdi1_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi2_clk", csi_rdi2_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, NULL), - CLK_LOOKUP("csi2phy_timer_clk", csi2phy_timer_clk.c, NULL), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("byte_clk", dsi2_byte_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("esc_clk", dsi2_esc_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("core_clk", jpegd_clk.c, "msm_mercury.0"), - CLK_LOOKUP("iface_clk", jpegd_p_clk.c, "msm_mercury.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"), - CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "tvenc.0"), - CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "tvenc.0"), - CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"), - CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"), - CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"), - CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("master_iface_clk", dsi2_m_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("slave_iface_clk", dsi2_s_p_clk.c, "mipi_dsi.2"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("iface_clk", jpegd_p_clk.c, ""), - CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"), - CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"), - CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, - "msm-dai-q6-mi2s"), - CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, - "msm-dai-q6-mi2s"), - CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"), - CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL), - CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"), - CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "msm_iommu-v0.9"), - - CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"), - - CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL), - CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"), - CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"), - CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"), - - CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"), - CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""), - - CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("reset2_clk", dsi2_reset_clk.c, "footswitch-8x60.4"), - - CLK_LOOKUP("l2_mclk", l2_m_clk, ""), - CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""), - CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""), - CLK_LOOKUP("q6sw_clk", q6sw_clk, ""), - CLK_LOOKUP("q6fw_clk", q6fw_clk, ""), - CLK_LOOKUP("q6_func_clk", q6_func_clk, ""), -}; - -static struct clk_lookup msm_clocks_8960_only[] __initdata = { - CLK_LOOKUP("enc_clk", tv_enc_clk.c, "tvenc.0"), - CLK_LOOKUP("dac_clk", tv_dac_clk.c, "tvenc.0"), - CLK_LOOKUP("iface_clk", tv_enc_p_clk.c, "tvenc.0"), - - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "footswitch-8x60.0"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "kgsl-2d1.1"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "footswitch-8x60.1"), - CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "footswitch-8x60.0"), - CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "kgsl-2d1.1"), - CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "footswitch-8x60.1"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.11"), - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "msm_iommu-v0.11"), -}; - -static struct clk_lookup msm_clocks_8960ab_only[] __initdata = { - CLK_LOOKUP("bus_clk", gfx3d_axi_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("div_clk", tv_src_div_clk.c, ""), -}; - -static struct clk_lookup msm_clocks_8960[ARRAY_SIZE(msm_clocks_8960_common) - + ARRAY_SIZE(msm_clocks_8960_only) - + ARRAY_SIZE(msm_clocks_8960ab_only)]; - -static struct clk_lookup msm_clocks_8930[] = { - CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"), - CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"), - CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"), - CLK_LOOKUP("xo", pxo_clk.c, "pil-q6v4-lpass"), - CLK_LOOKUP("xo", cxo_clk.c, "pil-q6v4-modem"), - CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"), - CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"), - CLK_LOOKUP("pll2", pll2_clk.c, NULL), - CLK_LOOKUP("pll8", pll8_clk.c, NULL), - CLK_LOOKUP("pll4", pll4_clk.c, NULL), - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("bus_clk", afab_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"), - CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"), - CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"), - CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"), - - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL), - CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"), - CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"), - - CLK_LOOKUP("core_clk", gp0_clk.c, ""), - CLK_LOOKUP("core_clk", gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gp2_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"), - CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"), - CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, "qup_i2c.0"), - CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "qup_i2c.10"), - CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.12"), - CLK_LOOKUP("core_clk", pdm_clk.c, ""), - CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"), - CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, ""), - CLK_LOOKUP("core_clk", tssc_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"), - CLK_LOOKUP("phy_clk", usb_phy0_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_fs2_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs2_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs2_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"), - CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"), - CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"), - CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"), - CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"), - CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"), - CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "qup_i2c.0"), - CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "qup_i2c.10"), - CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.12"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_fs2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""), - CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""), - CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"), - CLK_LOOKUP("cam_clk", cam1_clk.c, "4-006c"), - CLK_LOOKUP("cam_clk", cam1_clk.c, "4-0048"), - CLK_LOOKUP("cam_clk", cam2_clk.c, NULL), - CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"), - CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"), - CLK_LOOKUP("csi_pix_clk", csi_pix_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi_clk", csi_rdi_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, NULL), - CLK_LOOKUP("csi_clk", csi2_clk.c, NULL), - CLK_LOOKUP("csi_pix1_clk", csi_pix1_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi1_clk", csi_rdi1_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_rdi2_clk", csi_rdi2_clk.c, "msm_ispif.0"), - CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, NULL), - CLK_LOOKUP("csi2phy_timer_clk", csi2phy_timer_clk.c, NULL), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_src_clk", - csiphy_timer_src_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"), - CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"), - CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"), - CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("bus_clk", - gfx3d_axi_clk_8930.c, "footswitch-8x60.2"), - CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"), - CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"), - CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "tvenc.0"), - CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("dac_clk", tv_dac_clk.c, "tvenc.0"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "tvenc.0"), - CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"), - CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"), - CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"), - CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"), - CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"), - CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"), - CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"), - CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"), - CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"), - CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL), - CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"), - CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("core_clk", gfx3d_axi_clk_8930.c, "msm_iommu-v0.9"), - CLK_LOOKUP("core_clk", gfx3d_axi_clk_8930.c, "msm_iommu-v0.10"), - - CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"), - - CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL), - CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"), - CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"), - CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"), - - CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"), - CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""), - - CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"), - - CLK_LOOKUP("l2_mclk", l2_m_clk, ""), - CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""), - CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""), - CLK_LOOKUP("q6sw_clk", q6sw_clk, ""), - CLK_LOOKUP("q6fw_clk", q6fw_clk, ""), - CLK_LOOKUP("q6_func_clk", q6_func_clk, ""), -}; -/* - * Miscellaneous clock register initializations - */ - -/* Read, modify, then write-back a register. */ -static void __init rmwreg(uint32_t val, void *reg, uint32_t mask) -{ - uint32_t regval = readl_relaxed(reg); - regval &= ~mask; - regval |= val; - writel_relaxed(regval, reg); -} - -static struct pll_config_regs pll3_regs __initdata = { - .l_reg = BB_MMCC_PLL2_L_REG, - .m_reg = BB_MMCC_PLL2_M_REG, - .n_reg = BB_MMCC_PLL2_N_REG, - .config_reg = BB_MMCC_PLL2_CONFIG_REG, - .mode_reg = BB_MMCC_PLL2_MODE_REG, -}; - -/* Program PLL3 to 880MHZ */ -static struct pll_config pll3_config __initdata = { - .l = (32 | BVAL(31, 7, 0x8)), - .m = 16, - .n = 27, - .vco_val = 0x0, - .vco_mask = BM(8, 7), - .pre_div_val = 0x0, - .pre_div_mask = BIT(15), - .post_div_val = 0x0, - .post_div_mask = BIT(16), - .mn_ena_val = 0, - .mn_ena_mask = 0, - .main_output_val = 0, - .main_output_mask = 0, -}; - -static struct pll_config_regs pll4_regs __initdata = { - .l_reg = LCC_PLL0_L_VAL_REG, - .m_reg = LCC_PLL0_M_VAL_REG, - .n_reg = LCC_PLL0_N_VAL_REG, - .config_reg = LCC_PLL0_CONFIG_REG, - .mode_reg = LCC_PLL0_MODE_REG, -}; - -static struct pll_config pll4_config_393 __initdata = { - .l = 0xE, - .m = 0x27A, - .n = 0x465, - .vco_val = 0x0, - .vco_mask = BM(17, 16), - .pre_div_val = 0x0, - .pre_div_mask = BIT(19), - .post_div_val = 0x0, - .post_div_mask = BM(21, 20), - .mn_ena_val = BIT(22), - .mn_ena_mask = BIT(22), - .main_output_val = BIT(23), - .main_output_mask = BIT(23), -}; - -static struct pll_config_regs pll15_regs __initdata = { - .l_reg = MM_PLL3_L_VAL_REG, - .m_reg = MM_PLL3_M_VAL_REG, - .n_reg = MM_PLL3_N_VAL_REG, - .config_reg = MM_PLL3_CONFIG_REG, - .mode_reg = MM_PLL3_MODE_REG, -}; - -static struct pll_config pll15_config __initdata = { - .l = (0x24 | BVAL(31, 7, 0x620)), - .m = 0x1, - .n = 0x9, - .vco_val = BVAL(17, 16, 0x2), - .vco_mask = BM(17, 16), - .pre_div_val = 0x0, - .pre_div_mask = BIT(19), - .post_div_val = 0x0, - .post_div_mask = BM(21, 20), - .mn_ena_val = BIT(22), - .mn_ena_mask = BIT(22), - .main_output_val = BIT(23), - .main_output_mask = BIT(23), -}; - -static struct pll_config_regs pll14_regs __initdata = { - .l_reg = BB_PLL14_L_VAL_REG, - .m_reg = BB_PLL14_M_VAL_REG, - .n_reg = BB_PLL14_N_VAL_REG, - .config_reg = BB_PLL14_CONFIG_REG, - .mode_reg = BB_PLL14_MODE_REG, -}; - -static struct pll_config pll14_config __initdata = { - .l = (0x11 | BVAL(31, 7, 0x620)), - .m = 0x7, - .n = 0x9, - .vco_val = 0x0, - .vco_mask = BM(17, 16), - .pre_div_val = 0x0, - .pre_div_mask = BIT(19), - .post_div_val = 0x0, - .post_div_mask = BM(21, 20), - .mn_ena_val = BIT(22), - .mn_ena_mask = BIT(22), - .main_output_val = BIT(23), - .main_output_mask = BIT(23), -}; - - -static void __init init_mm_cc(void) -{ - /* - * Initialize MM CC registers: Set MM FORCE_CORE_ON bits so that core - * memories retain state even when not clocked. Also, set sleep and - * wake-up delays to safe values. - */ - rmwreg(0x00000000, CSI0_CC_REG, 0x00000410); - rmwreg(0x00000000, CSI1_CC_REG, 0x00000410); - rmwreg(0x80FF0000, DSI1_BYTE_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, DSI_PIXEL_CC_REG, 0xE0FF0010); - rmwreg(0xC0FF0000, GFX3D_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, IJPEG_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, MDP_CC_REG, 0xE1FF0010); - rmwreg(0x80FF0000, MDP_LUT_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, ROT_CC_REG, 0xE0FF0010); - rmwreg(0x000004FF, TV_CC2_REG, 0x000007FF); - rmwreg(0xC0FF0000, VCODEC_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, VFE_CC_REG, 0xE0FF4010); - rmwreg(0x800000FF, VFE_CC2_REG, 0xE00000FF); - rmwreg(0x80FF0000, VPE_CC_REG, 0xE0FF0010); -} - -static void __init enable_imem_clk(unsigned long phys) -{ - void __iomem *imem_reg; - - /* Enable IMEM's clk_on signal */ - imem_reg = ioremap(phys, SZ_4); - if (imem_reg) { - writel_relaxed(0x3, imem_reg); - iounmap(imem_reg); - } -} - -static void __init reg_init_8930(void) -{ - /* MM-AHB default values */ - u32 en_reg = 0x40000000, en2_reg = 0x3C7097F9; - /* MM-AXI default values */ - u32 aen_reg = 0x0003AFF9, aen2_reg = 0x3A27FCFF, - saen_reg = 0x00003C38; - - - /* Deassert MM SW_RESET_ALL signal. */ - writel_relaxed(0, SW_RESET_ALL_REG); - - /* - * Initialize MM AHB registers: Enable the FPB clock and disable HW - * gating on 8627 and 8930ab for all clocks. Also set VFE_AHB's - * FORCE_CORE_ON bit to prevent its memory from being collapsed when - * the clock is halted. The sleep and wake-up delays are set to safe - * values. - */ - if (cpu_is_msm8627() || cpu_is_msm8930ab()) { - en_reg = 0x00000003; - en2_reg = 0x000007F9; - } - rmwreg(en_reg, AHB_EN_REG, 0x6C000103); - writel_relaxed(en2_reg, AHB_EN2_REG); - - /* Deassert all locally-owned MM AHB resets. */ - rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF); - rmwreg(0, SW_RESET_AHB2_REG, 0x0000000F); - - /* - * Initialize MM AXI registers: Enable HW gating for all clocks that - * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up - * delays to safe values. - */ - if (cpu_is_msm8627() || cpu_is_msm8930ab()) { - aen_reg = 0x000007F9; - aen2_reg = 0x3027FCFF; - } - rmwreg(aen_reg, MAXI_EN_REG, 0x0803FFFF); - rmwreg(aen2_reg, MAXI_EN2_REG, 0x3A3FFFFF); - rmwreg(0x0027FCFF, MAXI_EN3_REG, 0x003FFFFF); - rmwreg(0x0027FCFF, MAXI_EN4_REG, 0x017FFFFF); - rmwreg(0x000004FF, MAXI_EN5_REG, 0x00000FFF); - if (cpu_is_msm8627() || cpu_is_msm8930ab()) - saen_reg = 0x000003C7; - rmwreg(saen_reg, SAXI_EN_REG, 0x00003FFF); - - enable_imem_clk(0x04b00040); - - init_mm_cc(); - rmwreg(0x80FF0000, TV_CC_REG, 0xE1FFC010); - - /* - * Initialize USB_HS_HCLK_FS registers: Set FORCE_C_ON bits so that - * core remain active during halt state of the clk. Also, set sleep - * and wake-up value to max. - */ - rmwreg(0x0000004F, USB_HS1_HCLK_FS_REG, 0x0000007F); - - /* De-assert MM AXI resets to all hardware blocks. */ - writel_relaxed(0, SW_RESET_AXI_REG); - - /* Deassert all MM core resets. */ - writel_relaxed(0, SW_RESET_CORE_REG); - writel_relaxed(0, SW_RESET_CORE2_REG); - - /* Enable TSSC and PDM PXO sources. */ - writel_relaxed(BIT(11), TSSC_CLK_CTL_REG); - writel_relaxed(BIT(15), PDM_CLK_NS_REG); - - /* Source the dsi1_byte_clks/dsi1_esc_clk from the DSI PHY PLLs */ - rmwreg(0x1, DSI1_BYTE_NS_REG, 0x7); - rmwreg(0x1, DSI1_ESC_NS_REG, 0x7); - - /* - * Change PLL15 configuration based on the SoC we're running on. - * - * Default pll15 l, m, n values for 8930/8930aa/8627() - */ - pll15_config.l = 0x21 | BVAL(31, 7, 0x600); - pll15_config.m = 0x1; - pll15_config.n = 0x3; - - if (cpu_is_msm8930ab()) { - pll15_config.l = 0x25 | BVAL(31, 7, 0x600); - pll15_config.m = 0x25; - pll15_config.n = 0x3E7; - } - configure_sr_pll(&pll15_config, &pll15_regs, 0); - - /* Disable AUX and BIST outputs */ - writel_relaxed(0, MM_PLL3_TEST_CTL_REG); -} - -static void __init reg_init_8064(void) -{ - u32 is_pll_enabled; - - /* Deassert MM SW_RESET_ALL signal. */ - writel_relaxed(0, SW_RESET_ALL_REG); - - /* - * Initialize MM AHB registers: - * Also set VFE_AHB's FORCE_CORE_ON bit to prevent its memory - * from being collapsed when the clock is halted. The sleep and - * wake-up delays are set to safe values. - */ - rmwreg(0x40000000, AHB_EN_REG, 0x6C000103); - writel_relaxed(0x3C7097F9, AHB_EN2_REG); - rmwreg(0x00000000, AHB_EN3_REG, 0x00000001); - - /* Deassert all locally-owned MM AHB resets. */ - rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF); - rmwreg(0, SW_RESET_AHB2_REG, 0x0000000F); - - /* - * Initialize MM AXI registers: Enable HW gating for all clocks that - * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up - * delays to safe values. - */ - rmwreg(0x0003AFF9, MAXI_EN_REG, 0x0803FFFF); - rmwreg(0x3A27FCFF, MAXI_EN2_REG, 0x3A3FFFFF); - rmwreg(0x0027FCFF, MAXI_EN3_REG, 0x003FFFFF); - rmwreg(0x0027FCFF, MAXI_EN4_REG, 0x017FFFFF); - rmwreg(0x019FECFF, MAXI_EN5_REG, 0x01FFEFFF); - rmwreg(0x00003C38, SAXI_EN_REG, 0x00003FFF); - - enable_imem_clk(0x04b00040); - - init_mm_cc(); - rmwreg(0x80FF0000, DSI2_BYTE_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, DSI2_PIXEL_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, JPEGD_CC_REG, 0xE0FF0010); - rmwreg(0x00000000, TV_CC_REG, 0x00004010); - rmwreg(0x80FF0000, VCAP_CC_REG, 0xE0FF1010); - - /* - * Initialize USB_HS_HCLK_FS registers: Set FORCE_C_ON bits so that - * core remain active during halt state of the clk. Also, set sleep - * and wake-up value to max. - */ - rmwreg(0x0000004F, USB_HS1_HCLK_FS_REG, 0x0000007F); - rmwreg(0x0000004F, USB_HS3_HCLK_FS_REG, 0x0000007F); - rmwreg(0x0000004F, USB_HS4_HCLK_FS_REG, 0x0000007F); - - /* De-assert MM AXI resets to all hardware blocks. */ - writel_relaxed(0, SW_RESET_AXI_REG); - - /* Deassert all MM core resets. */ - writel_relaxed(0, SW_RESET_CORE_REG); - writel_relaxed(0, SW_RESET_CORE2_REG); - - /* Enable TSSC and PDM PXO sources. */ - writel_relaxed(BIT(11), TSSC_CLK_CTL_REG); - writel_relaxed(BIT(15), PDM_CLK_NS_REG); - - /* Source the dsi1_byte_clks/dsi1_esc_clk from the DSI PHY PLLs */ - rmwreg(0x1, DSI1_BYTE_NS_REG, 0x7); - rmwreg(0x1, DSI1_ESC_NS_REG, 0x7); - - /* Source the dsi2_byte_clks from the DSI PHY PLLs */ - rmwreg(0x2, DSI2_BYTE_NS_REG, 0x7); - - /* - * Source the sata_phy_ref_clk from PXO and set predivider of - * sata_pmalive_clk to 1. - */ - rmwreg(0, SATA_PHY_REF_CLK_CTL_REG, 0x1); - rmwreg(0, SATA_PMALIVE_CLK_CTL_REG, 0x3); - - /* - * TODO: Programming below PLLs and prng_clk is temporary and - * needs to be removed after bootloaders program them. - */ - - /* Program pxo_src_clk to source from PXO */ - rmwreg(0x1, PXO_SRC_CLK_CTL_REG, 0x7); - - /* Check if PLL14 is active */ - is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16); - if (!is_pll_enabled) - /* Ref clk = 27MHz and program pll14 to 480MHz */ - configure_sr_pll(&pll14_config, &pll14_regs, 1); - - /* Check if PLL4 is active */ - is_pll_enabled = readl_relaxed(LCC_PLL0_STATUS_REG) & BIT(16); - if (!is_pll_enabled) - /* Ref clk = 27MHz and program pll4 to 393.2160MHz */ - configure_sr_pll(&pll4_config_393, &pll4_regs, 1); - - /* Enable PLL4 source on the LPASS Primary PLL Mux */ - writel_relaxed(0x1, LCC_PRI_PLL_CLK_CTL_REG); - - /* Program prng_clk to 64MHz if it isn't configured */ - if (!readl_relaxed(PRNG_CLK_NS_REG)) - writel_relaxed(0x2B, PRNG_CLK_NS_REG); - - if (cpu_is_apq8064ab()) { - /* Program PLL15 to 900MHZ */ - pll15_config.l = 0x21 | BVAL(31, 7, 0x620); - pll15_config.m = 0x1; - pll15_config.n = 0x3; - } - /* - * Default Program PLL15 to 975MHz with ref clk = 27MHz - * In case of apq8064ab PLL15 is set to 900MHZ - */ - configure_sr_pll(&pll15_config, &pll15_regs, 0); -} - -static void __init reg_init_8960(void) -{ - u32 aen_reg = 0x0003AFF9, aen2_reg = 0x3A27FCFF; - - /* Deassert MM SW_RESET_ALL signal. */ - writel_relaxed(0, SW_RESET_ALL_REG); - - /* - * Initialize MM AHB registers: - * Also set VFE_AHB's FORCE_CORE_ON bit to prevent its memory - * from being collapsed when the clock is halted. The sleep and - * wake-up delays are set to safe values. - */ - rmwreg(0x40000000, AHB_EN_REG, 0x6C000103); - writel_relaxed(0x3C7097F9, AHB_EN2_REG); - - /* Deassert all locally-owned MM AHB resets. */ - rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF); - rmwreg(0, SW_RESET_AHB2_REG, 0x0000000F); - - /* - * Initialize MM AXI registers: Enable HW gating for all clocks that - * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up - * delays to safe values. - */ - if (cpu_is_msm8960() && - SOCINFO_VERSION_MAJOR(socinfo_get_version()) < 3) { - aen_reg = 0x000007F9; - aen2_reg = 0x3027FCFF; - } - rmwreg(aen_reg, MAXI_EN_REG, 0x0803FFFF); - rmwreg(aen2_reg, MAXI_EN2_REG, 0x3A3FFFFF); - rmwreg(0x0027FCFF, MAXI_EN3_REG, 0x003FFFFF); - rmwreg(0x0027FCFF, MAXI_EN4_REG, 0x017FFFFF); - if (cpu_is_msm8960ab()) - rmwreg(0x009FE000, MAXI_EN5_REG, 0x01FFE000); - rmwreg(0x00003C38, SAXI_EN_REG, 0x00003FFF); - - enable_imem_clk(0x04b00040); - - init_mm_cc(); - rmwreg(0x80FF0000, DSI2_BYTE_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, DSI2_PIXEL_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, JPEGD_CC_REG, 0xE0FF0010); - if (cpu_is_msm8960ab()) { - rmwreg(0x00000001, DSI2_PIXEL_CC2_REG, 0x00000001); - rmwreg(0x00000000, TV_CC_REG, 0x00004010); - } - if (cpu_is_msm8960()) { - rmwreg(0x80FF0000, TV_CC_REG, 0xE1FFC010); - rmwreg(0x80FF0000, GFX2D0_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, GFX2D1_CC_REG, 0xE0FF0010); - } - - /* - * Initialize USB_HS_HCLK_FS registers: Set FORCE_C_ON bits so that - * core remain active during halt state of the clk. Also, set sleep - * and wake-up value to max. - */ - rmwreg(0x0000004F, USB_HS1_HCLK_FS_REG, 0x0000007F); - - /* De-assert MM AXI resets to all hardware blocks. */ - writel_relaxed(0, SW_RESET_AXI_REG); - - /* Deassert all MM core resets. */ - writel_relaxed(0, SW_RESET_CORE_REG); - writel_relaxed(0, SW_RESET_CORE2_REG); - - /* Enable TSSC and PDM PXO sources. */ - writel_relaxed(BIT(11), TSSC_CLK_CTL_REG); - writel_relaxed(BIT(15), PDM_CLK_NS_REG); - - /* Source the dsi1_byte_clks/dsi1_esc_clk from the DSI PHY PLLs */ - rmwreg(0x1, DSI1_BYTE_NS_REG, 0x7); - rmwreg(0x1, DSI1_ESC_NS_REG, 0x7); - - /* Source SLIMBus xo src from slimbus reference clock */ - writel_relaxed(0x3, SLIMBUS_XO_SRC_CLK_CTL_REG); - - /* Source the dsi2_byte_clks from the DSI PHY PLLs */ - rmwreg(0x2, DSI2_BYTE_NS_REG, 0x7); - - if (cpu_is_msm8960ab()) { - pll3_clk.c.rate = 880000000; - configure_sr_pll(&pll3_config, &pll3_regs, 0); - } -} - -#define PTE_EFUSE_GFX_PHYS (0x007000BC) - -static unsigned long *select_gfx_fmax_plan(unsigned long **gfx_fmax, int size) -{ - void __iomem *pte_efuse; - u32 gfx_speed_bin; - - pte_efuse = ioremap(PTE_EFUSE_GFX_PHYS, 4); - gfx_speed_bin = readl_relaxed(pte_efuse); - gfx_speed_bin = (gfx_speed_bin & BM(25, 24)) >> 24; - iounmap(pte_efuse); - - if (gfx_speed_bin >= size) { - pr_err("GFX_SPEED_BIN: defaulting to 0\n"); - gfx_speed_bin = 0; - } - - pr_info("GFX_SPEED_BIN: %d\n", gfx_speed_bin); - return gfx_fmax[gfx_speed_bin]; -} - -struct clock_init_data msm8960_clock_init_data __initdata; - -static void __init msm8960_clock_pre_init(void) -{ - struct clk_lookup *clk_lkup; - size_t clk_size; - struct clk_freq_tbl *tbl; - - /* Initialize clock registers. */ - reg_init_8960(); - - /* Detect PLL4 programmed for alternate 491.52MHz clock plan. */ - if (readl_relaxed(LCC_PLL0_L_VAL_REG) == 0x12) { - pll4_clk.c.rate = 491520000; - audio_slimbus_clk.freq_tbl = clk_tbl_aif_osr_492; - mi2s_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - pcm_clk.freq_tbl = clk_tbl_pcm_492; - } - - if (cpu_is_msm8960()) { - tbl = clk_tbl_gfx3d_8960; - clk_lkup = msm_clocks_8960_only; - clk_size = sizeof(msm_clocks_8960_only); - msm8960_clock_init_data.size -= - ARRAY_SIZE(msm_clocks_8960ab_only); - } - - if (cpu_is_msm8960ab()) { - mdp_clk.c.fmax = fmax_mdp_8960ab; - gmem_axi_clk.c.depends = &gfx3d_axi_clk.c; - tbl = clk_tbl_gfx3d_8960ab; - gfx3d_clk.c.fmax = select_gfx_fmax_plan(fmax_gfx3d_8960ab, - ARRAY_SIZE(fmax_gfx3d_8960ab)); - - clk_lkup = msm_clocks_8960ab_only; - clk_size = sizeof(msm_clocks_8960ab_only); - msm8960_clock_init_data.size -= - ARRAY_SIZE(msm_clocks_8960_only); - } - - gfx3d_clk.freq_tbl = tbl; - - memcpy(msm_clocks_8960, msm_clocks_8960_common, - sizeof(msm_clocks_8960_common)); - memcpy(msm_clocks_8960 + ARRAY_SIZE(msm_clocks_8960_common), - clk_lkup, clk_size); - - if ((readl_relaxed(PRNG_CLK_NS_REG) & 0x7F) == 0x2B) - prng_clk.freq_tbl = clk_tbl_prng_64; - - clk_ops_local_pll.enable = sr_pll_clk_enable; -} - -static void __init msm8064_clock_pre_init(void) -{ - unsigned long *fmax = fmax_gfx3d_8064; - - /* Initialize clock registers. */ - reg_init_8064(); - - vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8064; - - /* Detect PLL4 programmed for alternate 491.52MHz clock plan. */ - if (readl_relaxed(LCC_PLL0_L_VAL_REG) == 0x12) { - pll4_clk.c.rate = 491520000; - audio_slimbus_clk.freq_tbl = clk_tbl_aif_osr_492; - mi2s_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - pcm_clk.freq_tbl = clk_tbl_pcm_492; - } - - if (cpu_is_apq8064ab()) - fmax = fmax_gfx3d_8064ab; - - if ((cpu_is_apq8064() && - SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) || - cpu_is_apq8064ab() || cpu_is_apq8064aa()) { - vcodec_clk.c.fmax = fmax_vcodec_8064v2; - ce3_src_clk.c.fmax = fmax_ce3_8064v2; - sdc1_clk.c.fmax = fmax_sdc1_8064v2; - } - - gfx3d_clk.c.fmax = fmax; - ijpeg_clk.c.fmax = fmax_ijpeg_8064; - mdp_clk.c.fmax = fmax_mdp_8064; - tv_src_clk.c.fmax = fmax_tv_src_8064; - vfe_clk.c.fmax = fmax_vfe_8064; - - gmem_axi_clk.c.depends = &gfx3d_axi_clk.c; - - if ((readl_relaxed(PRNG_CLK_NS_REG) & 0x7F) == 0x2B) - prng_clk.freq_tbl = clk_tbl_prng_64; - - clk_ops_local_pll.enable = sr_pll_clk_enable; -} - -static void __init __msm8930_clock_pre_init(void) -{ - unsigned long rate = 900000000; - unsigned long *fmax = fmax_gfx3d_8930; - - /* Initialize clock registers. */ - reg_init_8930(); - - /* Detect PLL4 programmed for alternate 491.52MHz clock plan. */ - if (readl_relaxed(LCC_PLL0_L_VAL_REG) == 0x12) { - pll4_clk.c.rate = 491520000; - audio_slimbus_clk.freq_tbl = clk_tbl_aif_osr_492; - mi2s_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - codec_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - spare_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492; - pcm_clk.freq_tbl = clk_tbl_pcm_492; - } - - if (cpu_is_msm8930aa()) - fmax = fmax_gfx3d_8930aa; - - if (cpu_is_msm8930ab()) { - rate = 1000000000; - fmax = fmax_gfx3d_8930ab; - gfx3d_clk.freq_tbl = clk_tbl_gfx3d_8930ab; - vcodec_clk.c.fmax = fmax_vcodec_8930ab; - } - - pll15_clk.c.rate = rate; - gfx3d_clk.c.fmax = fmax; - gmem_axi_clk.c.depends = &gfx3d_axi_clk_8930.c; - - if ((readl_relaxed(PRNG_CLK_NS_REG) & 0x7F) == 0x2B) - prng_clk.freq_tbl = clk_tbl_prng_64; - - clk_ops_local_pll.enable = sr_pll_clk_enable; -} - -static void __init msm8930_pm8917_clock_pre_init(void) -{ - /* detect pmic8917 from board file, and call this init function */ - - vdd_dig.set_vdd = set_vdd_dig_8930; - rpm_vreg_dig_8930 = RPM_VREG_ID_PM8917_VDD_DIG_CORNER; - vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8930_pm8917; - - __msm8930_clock_pre_init(); -} - -static void __init msm8930_clock_pre_init(void) -{ - vdd_dig.set_vdd = set_vdd_dig_8930; - vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8930; - - __msm8930_clock_pre_init(); -} - -static void __init common_clock_post_init(void) -{ - /* Keep PXO on whenever APPS cpu is active */ - clk_prepare_enable(&pxo_a_clk.c); - - /* Reset 3D core while clocked to ensure it resets completely. */ - clk_set_rate(&gfx3d_clk.c, 27000000); - clk_prepare_enable(&gfx3d_clk.c); - clk_reset(&gfx3d_clk.c, CLK_RESET_ASSERT); - udelay(5); - clk_reset(&gfx3d_clk.c, CLK_RESET_DEASSERT); - clk_disable_unprepare(&gfx3d_clk.c); - - /* Initialize rates for clocks that only support one. */ - clk_set_rate(&pdm_clk.c, 27000000); - clk_set_rate(&prng_clk.c, prng_clk.freq_tbl->freq_hz); - clk_set_rate(&mdp_vsync_clk.c, 27000000); - clk_set_rate(&tsif_ref_clk.c, 105000); - clk_set_rate(&tssc_clk.c, 27000000); - clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000); - clk_set_rate(&usb_fs1_src_clk.c, 60000000); - clk_set_rate(&usb_hsic_xcvr_fs_clk.c, 60000000); - clk_set_rate(&usb_hsic_hsic_src_clk.c, 480000000); - clk_set_rate(&usb_hsic_hsio_cal_clk.c, 9000000); - clk_set_rate(&usb_hsic_system_clk.c, 60000000); - - /* - * Set the CSI rates to a safe default to avoid warnings when - * switching csi pix and rdi clocks. - */ - clk_set_rate(&csi0_src_clk.c, 27000000); - clk_set_rate(&csi1_src_clk.c, 27000000); - clk_set_rate(&csi2_src_clk.c, 27000000); - - /* - * The halt status bits for these clocks may be incorrect at boot. - * Toggle these clocks on and off to refresh them. - */ - clk_prepare_enable(&pdm_clk.c); - clk_disable_unprepare(&pdm_clk.c); - clk_prepare_enable(&tssc_clk.c); - clk_disable_unprepare(&tssc_clk.c); - clk_prepare_enable(&usb_hsic_hsic_clk.c); - clk_disable_unprepare(&usb_hsic_hsic_clk.c); - - /* - * Keep sfab floor @ 54MHz so that Krait AHB is at least 27MHz at all - * times when Apps CPU is active. This ensures the timer's requirement - * of Krait AHB running 4 times as fast as the timer itself. - */ - clk_set_rate(&sfab_tmr_a_clk.c, 54000000); - clk_prepare_enable(&sfab_tmr_a_clk.c); -} - -static void __init msm8960_clock_post_init(void) -{ - common_clock_post_init(); - clk_set_rate(&usb_fs2_src_clk.c, 60000000); -} - -static void __init msm8064_clock_post_init(void) -{ - common_clock_post_init(); - clk_set_rate(&usb_hs3_xcvr_clk.c, 60000000); - clk_set_rate(&usb_hs4_xcvr_clk.c, 60000000); -} - -static int __init msm8960_clock_late_init(void) -{ - int rc; - struct clk *mmfpb_a_clk = clk_get_sys("clock-8960", "mmfpb_a_clk"); - struct clk *cfpb_a_clk = clk_get_sys("clock-8960", "cfpb_a_clk"); - - /* Vote for MMFPB to be on when Apps is active. */ - if (WARN(IS_ERR(mmfpb_a_clk), "mmfpb_a_clk not found (%ld)\n", - PTR_ERR(mmfpb_a_clk))) - return PTR_ERR(mmfpb_a_clk); - rc = clk_set_rate(mmfpb_a_clk, 38400000); - if (WARN(rc, "mmfpb_a_clk rate was not set (%d)\n", rc)) - return rc; - rc = clk_prepare_enable(mmfpb_a_clk); - if (WARN(rc, "mmfpb_a_clk not enabled (%d)\n", rc)) - return rc; - - /* Vote for CFPB to be on when Apps is active. */ - if (WARN(IS_ERR(cfpb_a_clk), "cfpb_a_clk not found (%ld)\n", - PTR_ERR(cfpb_a_clk))) - return PTR_ERR(cfpb_a_clk); - rc = clk_set_rate(cfpb_a_clk, 32000000); - if (WARN(rc, "cfpb_a_clk rate was not set (%d)\n", rc)) - return rc; - rc = clk_prepare_enable(cfpb_a_clk); - if (WARN(rc, "cfpb_a_clk not enabled (%d)\n", rc)) - return rc; - - return 0; -} - -struct clock_init_data msm8960_clock_init_data __initdata = { - .table = msm_clocks_8960, - .size = ARRAY_SIZE(msm_clocks_8960), - .pre_init = msm8960_clock_pre_init, - .post_init = msm8960_clock_post_init, - .late_init = msm8960_clock_late_init, -}; - -struct clock_init_data apq8064_clock_init_data __initdata = { - .table = msm_clocks_8064, - .size = ARRAY_SIZE(msm_clocks_8064), - .pre_init = msm8064_clock_pre_init, - .post_init = msm8064_clock_post_init, - .late_init = msm8960_clock_late_init, -}; - -struct clock_init_data msm8930_clock_init_data __initdata = { - .table = msm_clocks_8930, - .size = ARRAY_SIZE(msm_clocks_8930), - .pre_init = msm8930_clock_pre_init, - .post_init = msm8960_clock_post_init, - .late_init = msm8960_clock_late_init, -}; - -struct clock_init_data msm8930_pm8917_clock_init_data __initdata = { - .table = msm_clocks_8930, - .size = ARRAY_SIZE(msm_clocks_8930), - .pre_init = msm8930_pm8917_clock_pre_init, - .post_init = msm8960_clock_post_init, - .late_init = msm8960_clock_late_init, -}; diff --git a/arch/arm/mach-msm/clock-8x60.c b/arch/arm/mach-msm/clock-8x60.c deleted file mode 100644 index 5d559663497d..000000000000 --- a/arch/arm/mach-msm/clock-8x60.c +++ /dev/null @@ -1,3910 +0,0 @@ -/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "clock.h" -#include "clock-local.h" -#include "clock-rpm.h" -#include "clock-voter.h" -#include "clock-pll.h" - -#ifdef CONFIG_MSM_SECURE_IO -#undef readl_relaxed -#undef writel_relaxed -#define readl_relaxed secure_readl -#define writel_relaxed secure_writel -#endif - -#define REG(off) (MSM_CLK_CTL_BASE + (off)) -#define REG_MM(off) (MSM_MMSS_CLK_CTL_BASE + (off)) -#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off)) - -/* Peripheral clock registers. */ -#define CE2_HCLK_CTL_REG REG(0x2740) -#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC) -#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0) -#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4) -#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8) -#define CLK_HALT_MSS_SMPSS_MISC_STATE_REG REG(0x2FDC) -#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8) -#define CLK_TEST_REG REG(0x2FA0) -#define EBI2_2X_CLK_CTL_REG REG(0x2660) -#define EBI2_CLK_CTL_REG REG(0x2664) -#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n))) -#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n))) -#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1))) -#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1))) -#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1))) -#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1))) -#define PDM_CLK_NS_REG REG(0x2CC0) -#define BB_PLL_ENA_SC0_REG REG(0x34C0) -#define BB_PLL0_STATUS_REG REG(0x30D8) -#define BB_PLL6_STATUS_REG REG(0x3118) -#define BB_PLL8_L_VAL_REG REG(0x3144) -#define BB_PLL8_M_VAL_REG REG(0x3148) -#define BB_PLL8_MODE_REG REG(0x3140) -#define BB_PLL8_N_VAL_REG REG(0x314C) -#define BB_PLL8_STATUS_REG REG(0x3158) -#define PLLTEST_PAD_CFG_REG REG(0x2FA4) -#define PMEM_ACLK_CTL_REG REG(0x25A0) -#define PPSS_HCLK_CTL_REG REG(0x2580) -#define PRNG_CLK_NS_REG REG(0x2E80) -#define RINGOSC_NS_REG REG(0x2DC0) -#define RINGOSC_STATUS_REG REG(0x2DCC) -#define RINGOSC_TCXO_CTL_REG REG(0x2DC4) -#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080) -#define SC1_U_CLK_BRANCH_ENA_VOTE_REG REG(0x30A0) -#define SC0_U_CLK_SLEEP_ENA_VOTE_REG REG(0x3084) -#define SC1_U_CLK_SLEEP_ENA_VOTE_REG REG(0x30A4) -#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1))) -#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1))) -#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1))) -#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1))) -#define TSIF_HCLK_CTL_REG REG(0x2700) -#define TSIF_REF_CLK_MD_REG REG(0x270C) -#define TSIF_REF_CLK_NS_REG REG(0x2710) -#define TSSC_CLK_CTL_REG REG(0x2CA0) -#define USB_FSn_HCLK_CTL_REG(n) REG(0x2960+(0x20*((n)-1))) -#define USB_FSn_RESET_REG(n) REG(0x2974+(0x20*((n)-1))) -#define USB_FSn_SYSTEM_CLK_CTL_REG(n) REG(0x296C+(0x20*((n)-1))) -#define USB_FSn_XCVR_FS_CLK_MD_REG(n) REG(0x2964+(0x20*((n)-1))) -#define USB_FSn_XCVR_FS_CLK_NS_REG(n) REG(0x2968+(0x20*((n)-1))) -#define USB_HS1_HCLK_CTL_REG REG(0x2900) -#define USB_HS1_RESET_REG REG(0x2910) -#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908) -#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C) -#define USB_PHY0_RESET_REG REG(0x2E20) - -/* Multimedia clock registers. */ -#define AHB_EN_REG REG_MM(0x0008) -#define AHB_EN2_REG REG_MM(0x0038) -#define AHB_NS_REG REG_MM(0x0004) -#define AXI_NS_REG REG_MM(0x0014) -#define CAMCLK_CC_REG REG_MM(0x0140) -#define CAMCLK_MD_REG REG_MM(0x0144) -#define CAMCLK_NS_REG REG_MM(0x0148) -#define CSI_CC_REG REG_MM(0x0040) -#define CSI_NS_REG REG_MM(0x0048) -#define DBG_BUS_VEC_A_REG REG_MM(0x01C8) -#define DBG_BUS_VEC_B_REG REG_MM(0x01CC) -#define DBG_BUS_VEC_C_REG REG_MM(0x01D0) -#define DBG_BUS_VEC_D_REG REG_MM(0x01D4) -#define DBG_BUS_VEC_E_REG REG_MM(0x01D8) -#define DBG_BUS_VEC_F_REG REG_MM(0x01DC) -#define DBG_BUS_VEC_H_REG REG_MM(0x01E4) -#define DBG_BUS_VEC_I_REG REG_MM(0x01E8) -#define DBG_CFG_REG_HS_REG REG_MM(0x01B4) -#define DBG_CFG_REG_LS_REG REG_MM(0x01B8) -#define GFX2D0_CC_REG REG_MM(0x0060) -#define GFX2D0_MD0_REG REG_MM(0x0064) -#define GFX2D0_MD1_REG REG_MM(0x0068) -#define GFX2D0_NS_REG REG_MM(0x0070) -#define GFX2D1_CC_REG REG_MM(0x0074) -#define GFX2D1_MD0_REG REG_MM(0x0078) -#define GFX2D1_MD1_REG REG_MM(0x006C) -#define GFX2D1_NS_REG REG_MM(0x007C) -#define GFX3D_CC_REG REG_MM(0x0080) -#define GFX3D_MD0_REG REG_MM(0x0084) -#define GFX3D_MD1_REG REG_MM(0x0088) -#define GFX3D_NS_REG REG_MM(0x008C) -#define IJPEG_CC_REG REG_MM(0x0098) -#define IJPEG_MD_REG REG_MM(0x009C) -#define IJPEG_NS_REG REG_MM(0x00A0) -#define JPEGD_CC_REG REG_MM(0x00A4) -#define JPEGD_NS_REG REG_MM(0x00AC) -#define MAXI_EN_REG REG_MM(0x0018) -#define MAXI_EN2_REG REG_MM(0x0020) -#define MAXI_EN3_REG REG_MM(0x002C) -#define MDP_CC_REG REG_MM(0x00C0) -#define MDP_MD0_REG REG_MM(0x00C4) -#define MDP_MD1_REG REG_MM(0x00C8) -#define MDP_NS_REG REG_MM(0x00D0) -#define MISC_CC_REG REG_MM(0x0058) -#define MISC_CC2_REG REG_MM(0x005C) -#define PIXEL_CC_REG REG_MM(0x00D4) -#define PIXEL_CC2_REG REG_MM(0x0120) -#define PIXEL_MD_REG REG_MM(0x00D8) -#define PIXEL_NS_REG REG_MM(0x00DC) -#define MM_PLL0_MODE_REG REG_MM(0x0300) -#define MM_PLL1_MODE_REG REG_MM(0x031C) -#define MM_PLL2_CONFIG_REG REG_MM(0x0348) -#define MM_PLL2_L_VAL_REG REG_MM(0x033C) -#define MM_PLL2_M_VAL_REG REG_MM(0x0340) -#define MM_PLL2_MODE_REG REG_MM(0x0338) -#define MM_PLL2_N_VAL_REG REG_MM(0x0344) -#define ROT_CC_REG REG_MM(0x00E0) -#define ROT_NS_REG REG_MM(0x00E8) -#define SAXI_EN_REG REG_MM(0x0030) -#define SW_RESET_AHB_REG REG_MM(0x020C) -#define SW_RESET_ALL_REG REG_MM(0x0204) -#define SW_RESET_AXI_REG REG_MM(0x0208) -#define SW_RESET_CORE_REG REG_MM(0x0210) -#define TV_CC_REG REG_MM(0x00EC) -#define TV_CC2_REG REG_MM(0x0124) -#define TV_MD_REG REG_MM(0x00F0) -#define TV_NS_REG REG_MM(0x00F4) -#define VCODEC_CC_REG REG_MM(0x00F8) -#define VCODEC_MD0_REG REG_MM(0x00FC) -#define VCODEC_MD1_REG REG_MM(0x0128) -#define VCODEC_NS_REG REG_MM(0x0100) -#define VFE_CC_REG REG_MM(0x0104) -#define VFE_MD_REG REG_MM(0x0108) -#define VFE_NS_REG REG_MM(0x010C) -#define VPE_CC_REG REG_MM(0x0110) -#define VPE_NS_REG REG_MM(0x0118) - -/* Low-power Audio clock registers. */ -#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8) -#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064) -#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060) -#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068) -#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070) -#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C) -#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074) -#define LCC_MI2S_MD_REG REG_LPA(0x004C) -#define LCC_MI2S_NS_REG REG_LPA(0x0048) -#define LCC_MI2S_STATUS_REG REG_LPA(0x0050) -#define LCC_PCM_MD_REG REG_LPA(0x0058) -#define LCC_PCM_NS_REG REG_LPA(0x0054) -#define LCC_PCM_STATUS_REG REG_LPA(0x005C) -#define LCC_PLL0_CONFIG_REG REG_LPA(0x0014) -#define LCC_PLL0_L_VAL_REG REG_LPA(0x0004) -#define LCC_PLL0_M_VAL_REG REG_LPA(0x0008) -#define LCC_PLL0_MODE_REG REG_LPA(0x0000) -#define LCC_PLL0_N_VAL_REG REG_LPA(0x000C) -#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4) -#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C) -#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078) -#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080) -#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088) -#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084) -#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C) - -/* MUX source input identifiers. */ -#define pxo_to_bb_mux 0 -#define mxo_to_bb_mux 1 -#define cxo_to_bb_mux 5 -#define pll0_to_bb_mux 2 -#define pll8_to_bb_mux 3 -#define pll6_to_bb_mux 4 -#define gnd_to_bb_mux 6 -#define pxo_to_mm_mux 0 -#define pll1_to_mm_mux 1 /* or MMSS_PLL0 */ -#define pll2_to_mm_mux 1 /* or MMSS_PLL1 */ -#define pll3_to_mm_mux 3 /* or MMSS_PLL2 */ -#define pll8_to_mm_mux 2 /* or MMSS_GPERF */ -#define pll0_to_mm_mux 3 /* or MMSS_GPLL0 */ -#define mxo_to_mm_mux 4 -#define gnd_to_mm_mux 6 -#define cxo_to_xo_mux 0 -#define pxo_to_xo_mux 1 -#define mxo_to_xo_mux 2 -#define gnd_to_xo_mux 3 -#define pxo_to_lpa_mux 0 -#define cxo_to_lpa_mux 1 -#define pll4_to_lpa_mux 2 /* or LPA_PLL0 */ -#define gnd_to_lpa_mux 6 - -/* Test Vector Macros */ -#define TEST_TYPE_PER_LS 1 -#define TEST_TYPE_PER_HS 2 -#define TEST_TYPE_MM_LS 3 -#define TEST_TYPE_MM_HS 4 -#define TEST_TYPE_LPA 5 -#define TEST_TYPE_SC 6 -#define TEST_TYPE_MM_HS2X 7 -#define TEST_TYPE_SHIFT 24 -#define TEST_CLK_SEL_MASK BM(23, 0) -#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s))) -#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS) -#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS) -#define TEST_MM_LS(s) TEST_VECTOR((s), TEST_TYPE_MM_LS) -#define TEST_MM_HS(s) TEST_VECTOR((s), TEST_TYPE_MM_HS) -#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA) -#define TEST_SC(s) TEST_VECTOR((s), TEST_TYPE_SC) -#define TEST_MM_HS2X(s) TEST_VECTOR((s), TEST_TYPE_MM_HS2X) - -struct pll_rate { - const uint32_t l_val; - const uint32_t m_val; - const uint32_t n_val; - const uint32_t vco; - const uint32_t post_div; - const uint32_t i_bits; -}; -#define PLL_RATE(l, m, n, v, d, i) { l, m, n, v, (d>>1), i } -/* - * Clock frequency definitions and macros - */ - -enum vdd_dig_levels { - VDD_DIG_NONE, - VDD_DIG_LOW, - VDD_DIG_NOMINAL, - VDD_DIG_HIGH, - VDD_DIG_NUM -}; - -static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level) -{ - static const int vdd_uv[] = { - [VDD_DIG_NONE] = 500000, - [VDD_DIG_LOW] = 1000000, - [VDD_DIG_NOMINAL] = 1100000, - [VDD_DIG_HIGH] = 1200000 - }; - - return rpm_vreg_set_voltage(RPM_VREG_ID_PM8058_S1, RPM_VREG_VOTER3, - vdd_uv[level], 1200000, 1); -} - -static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM); - -#define VDD_DIG_FMAX_MAP1(l1, f1) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - [VDD_DIG_##l3] = (f3), \ - }, \ - .num_fmax = VDD_DIG_NUM - -DEFINE_CLK_RPM_BRANCH(pxo_clk, pxo_a_clk, PXO, 27000000); -DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000); - -static struct pll_vote_clk pll8_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(8), - .status_reg = BB_PLL8_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll8_clk", - .rate = 384000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll8_clk.c), - }, -}; - -static struct pll_clk pll2_clk = { - .mode_reg = MM_PLL1_MODE_REG, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll2_clk", - .rate = 800000000, - .ops = &clk_ops_local_pll, - CLK_INIT(pll2_clk.c), - }, -}; - -static struct pll_clk pll3_clk = { - .mode_reg = MM_PLL2_MODE_REG, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll3_clk", - .rate = 0, /* TODO: Detect rate dynamically */ - .ops = &clk_ops_local_pll, - CLK_INIT(pll3_clk.c), - }, -}; - -static int pll4_clk_enable(struct clk *c) -{ - struct msm_rpm_iv_pair iv = { MSM_RPM_ID_PLL_4, 1 }; - return msm_rpm_set_noirq(MSM_RPM_CTX_SET_0, &iv, 1); -} - -static void pll4_clk_disable(struct clk *c) -{ - struct msm_rpm_iv_pair iv = { MSM_RPM_ID_PLL_4, 0 }; - msm_rpm_set_noirq(MSM_RPM_CTX_SET_0, &iv, 1); -} - -static bool pll4_clk_is_local(struct clk *c) -{ - return false; -} - -static enum handoff pll4_clk_handoff(struct clk *clk) -{ - struct msm_rpm_iv_pair iv = { MSM_RPM_ID_PLL_4 }; - int rc = msm_rpm_get_status(&iv, 1); - if (rc < 0 || !iv.value) - return HANDOFF_DISABLED_CLK; - - return HANDOFF_ENABLED_CLK; -} - -static struct clk_ops clk_ops_pll4 = { - .enable = pll4_clk_enable, - .disable = pll4_clk_disable, - .is_local = pll4_clk_is_local, - .handoff = pll4_clk_handoff, -}; - -static struct fixed_clk pll4_clk = { - .c = { - .parent = &pxo_clk.c, - .dbg_name = "pll4_clk", - .rate = 540672000, - .ops = &clk_ops_pll4, - CLK_INIT(pll4_clk.c), - }, -}; - -/* - * SoC-specific Set-Rate Functions - */ - -/* Unlike other clocks, the TV rate is adjusted through PLL - * re-programming. It is also routed through an MND divider. */ -static void set_rate_tv(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - struct pll_rate *rate = nf->extra_freq_data; - uint32_t pll_mode, pll_config, misc_cc2; - - /* Disable PLL output. */ - pll_mode = readl_relaxed(MM_PLL2_MODE_REG); - pll_mode &= ~BIT(0); - writel_relaxed(pll_mode, MM_PLL2_MODE_REG); - - /* Assert active-low PLL reset. */ - pll_mode &= ~BIT(2); - writel_relaxed(pll_mode, MM_PLL2_MODE_REG); - - /* Program L, M and N values. */ - writel_relaxed(rate->l_val, MM_PLL2_L_VAL_REG); - writel_relaxed(rate->m_val, MM_PLL2_M_VAL_REG); - writel_relaxed(rate->n_val, MM_PLL2_N_VAL_REG); - - /* Configure MN counter, post-divide, VCO, and i-bits. */ - pll_config = readl_relaxed(MM_PLL2_CONFIG_REG); - pll_config &= ~(BM(22, 20) | BM(18, 0)); - pll_config |= rate->n_val ? BIT(22) : 0; - pll_config |= BVAL(21, 20, rate->post_div); - pll_config |= BVAL(17, 16, rate->vco); - pll_config |= rate->i_bits; - writel_relaxed(pll_config, MM_PLL2_CONFIG_REG); - - /* Configure MND. */ - set_rate_mnd(rcg, nf); - - /* Configure hdmi_ref_clk to be equal to the TV clock rate. */ - misc_cc2 = readl_relaxed(MISC_CC2_REG); - misc_cc2 &= ~(BIT(28)|BM(21, 18)); - misc_cc2 |= (BIT(28)|BVAL(21, 18, (nf->ns_val >> 14) & 0x3)); - writel_relaxed(misc_cc2, MISC_CC2_REG); - - /* De-assert active-low PLL reset. */ - pll_mode |= BIT(2); - writel_relaxed(pll_mode, MM_PLL2_MODE_REG); - - /* Enable PLL output. */ - pll_mode |= BIT(0); - writel_relaxed(pll_mode, MM_PLL2_MODE_REG); -} - -/* - * Clock Descriptions - */ - -/* AXI Interfaces */ -static struct branch_clk gmem_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(24), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 6, - }, - .c = { - .dbg_name = "gmem_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(gmem_axi_clk.c), - }, -}; - -static struct branch_clk ijpeg_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(21), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 4, - }, - .c = { - .dbg_name = "ijpeg_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(ijpeg_axi_clk.c), - }, -}; - -static struct branch_clk imem_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(22), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 7, - .retain_reg = MAXI_EN2_REG, - .retain_mask = BIT(10), - }, - .c = { - .dbg_name = "imem_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(imem_axi_clk.c), - }, -}; - -static struct branch_clk jpegd_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(25), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 5, - }, - .c = { - .dbg_name = "jpegd_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(jpegd_axi_clk.c), - }, -}; - -static struct branch_clk mdp_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(23), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(13), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 8, - .retain_reg = MAXI_EN_REG, - .retain_mask = BIT(0), - }, - .c = { - .dbg_name = "mdp_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_axi_clk.c), - }, -}; - -static struct branch_clk vcodec_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(19), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(4)|BIT(5), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "vcodec_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_axi_clk.c), - }, -}; - -static struct branch_clk vfe_axi_clk = { - .b = { - .ctl_reg = MAXI_EN_REG, - .en_mask = BIT(18), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 0, - }, - .c = { - .dbg_name = "vfe_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_axi_clk.c), - }, -}; - -static struct branch_clk rot_axi_clk = { - .b = { - .ctl_reg = MAXI_EN2_REG, - .en_mask = BIT(24), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 2, - }, - .c = { - .dbg_name = "rot_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(rot_axi_clk.c), - }, -}; - -static struct branch_clk vpe_axi_clk = { - .b = { - .ctl_reg = MAXI_EN2_REG, - .en_mask = BIT(26), - .reset_reg = SW_RESET_AXI_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_E_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "vpe_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(vpe_axi_clk.c), - }, -}; - -static struct branch_clk smi_2x_axi_clk = { - .b = { - .ctl_reg = MAXI_EN2_REG, - .en_mask = BIT(30), - .halt_reg = DBG_BUS_VEC_I_REG, - .halt_bit = 0, - }, - .c = { - .dbg_name = "smi_2x_axi_clk", - .ops = &clk_ops_smi_2x, - CLK_INIT(smi_2x_axi_clk.c), - }, -}; - -/* AHB Interfaces */ -static struct branch_clk amp_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(24), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(20), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "amp_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(amp_p_clk.c), - }, -}; - -static struct branch_clk csi0_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(7), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(17), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 16, - }, - .c = { - .dbg_name = "csi0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_p_clk.c), - }, -}; - -static struct branch_clk csi1_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(20), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(16), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 17, - }, - .c = { - .dbg_name = "csi1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1_p_clk.c), - }, -}; - -static struct branch_clk dsi_m_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(9), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "dsi_m_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi_m_p_clk.c), - }, -}; - -static struct branch_clk dsi_s_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(18), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(5), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "dsi_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi_s_p_clk.c), - }, -}; - -static struct branch_clk gfx2d0_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(19), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(12), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 2, - }, - .c = { - .dbg_name = "gfx2d0_p_clk", - .ops = &clk_ops_branch, - .flags = CLKFLAG_SKIP_HANDOFF, - CLK_INIT(gfx2d0_p_clk.c), - }, -}; - -static struct branch_clk gfx2d1_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(2), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(11), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gfx2d1_p_clk", - .ops = &clk_ops_branch, - .flags = CLKFLAG_SKIP_HANDOFF, - CLK_INIT(gfx2d1_p_clk.c), - }, -}; - -static struct branch_clk gfx3d_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(3), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 4, - }, - .c = { - .dbg_name = "gfx3d_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gfx3d_p_clk.c), - }, -}; - -static struct branch_clk hdmi_m_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(14), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 5, - }, - .c = { - .dbg_name = "hdmi_m_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_m_p_clk.c), - }, -}; - -static struct branch_clk hdmi_s_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(4), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 6, - }, - .c = { - .dbg_name = "hdmi_s_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_s_p_clk.c), - }, -}; - -static struct branch_clk ijpeg_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(5), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(7), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 9, - }, - .c = { - .dbg_name = "ijpeg_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ijpeg_p_clk.c), - }, -}; - -static struct branch_clk imem_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(6), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(8), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 10, - }, - .c = { - .dbg_name = "imem_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(imem_p_clk.c), - }, -}; - -static struct branch_clk jpegd_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(21), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(4), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "jpegd_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(jpegd_p_clk.c), - }, -}; - -static struct branch_clk mdp_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(10), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(3), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "mdp_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_p_clk.c), - }, -}; - -static struct branch_clk rot_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 13, - }, - .c = { - .dbg_name = "rot_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rot_p_clk.c), - }, -}; - -static struct branch_clk smmu_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 22, - }, - .c = { - .dbg_name = "smmu_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(smmu_p_clk.c), - }, -}; - -static struct branch_clk tv_enc_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(25), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "tv_enc_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_enc_p_clk.c), - }, -}; - -static struct branch_clk vcodec_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(11), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(1), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "vcodec_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vcodec_p_clk.c), - }, -}; - -static struct branch_clk vfe_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(13), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 14, - .retain_reg = AHB_EN2_REG, - .retain_mask = BIT(0), - }, - .c = { - .dbg_name = "vfe_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vfe_p_clk.c), - }, -}; - -static struct branch_clk vpe_p_clk = { - .b = { - .ctl_reg = AHB_EN_REG, - .en_mask = BIT(16), - .reset_reg = SW_RESET_AHB_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_F_REG, - .halt_bit = 15, - }, - .c = { - .dbg_name = "vpe_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(vpe_p_clk.c), - }, -}; - -/* - * Peripheral Clocks - */ -#define CLK_GP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GPn_NS_REG(n), \ - .en_mask = BIT(9), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GPn_NS_REG(n), \ - .md_reg = GPn_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gp, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(LOW, 27000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gp[] = { - F_GP( 0, gnd, 1, 0, 0), - F_GP( 9600000, cxo, 2, 0, 0), - F_GP( 13500000, pxo, 2, 0, 0), - F_GP( 19200000, cxo, 1, 0, 0), - F_GP( 27000000, pxo, 1, 0, 0), - F_END -}; - -static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7); -static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6); -static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5); - -#define CLK_GSBI_UART(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_UART_APPS_NS_REG(n), \ - .md_reg = GSBIn_UART_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(31, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_uart, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_UART(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_uart[] = { - F_GSBI_UART( 0, gnd, 1, 0, 0), - F_GSBI_UART( 1843200, pll8, 1, 3, 625), - F_GSBI_UART( 3686400, pll8, 1, 6, 625), - F_GSBI_UART( 7372800, pll8, 1, 12, 625), - F_GSBI_UART(14745600, pll8, 1, 24, 625), - F_GSBI_UART(16000000, pll8, 4, 1, 6), - F_GSBI_UART(24000000, pll8, 4, 1, 4), - F_GSBI_UART(32000000, pll8, 4, 1, 3), - F_GSBI_UART(40000000, pll8, 1, 5, 48), - F_GSBI_UART(46400000, pll8, 1, 29, 240), - F_GSBI_UART(48000000, pll8, 4, 1, 2), - F_GSBI_UART(51200000, pll8, 1, 2, 15), - F_GSBI_UART(56000000, pll8, 1, 7, 48), - F_GSBI_UART(58982400, pll8, 1, 96, 625), - F_GSBI_UART(64000000, pll8, 2, 1, 3), - F_END -}; - -static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10); -static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6); -static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2); -static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26); -static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22); -static CLK_GSBI_UART(gsbi6_uart, 6, CLK_HALT_CFPB_STATEB_REG, 18); -static CLK_GSBI_UART(gsbi7_uart, 7, CLK_HALT_CFPB_STATEB_REG, 14); -static CLK_GSBI_UART(gsbi8_uart, 8, CLK_HALT_CFPB_STATEB_REG, 10); -static CLK_GSBI_UART(gsbi9_uart, 9, CLK_HALT_CFPB_STATEB_REG, 6); -static CLK_GSBI_UART(gsbi10_uart, 10, CLK_HALT_CFPB_STATEB_REG, 2); -static CLK_GSBI_UART(gsbi11_uart, 11, CLK_HALT_CFPB_STATEC_REG, 17); -static CLK_GSBI_UART(gsbi12_uart, 12, CLK_HALT_CFPB_STATEC_REG, 13); - -#define CLK_GSBI_QUP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .md_reg = GSBIn_QUP_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_qup, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_QUP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_qup[] = { - F_GSBI_QUP( 0, gnd, 1, 0, 0), - F_GSBI_QUP( 1100000, pxo, 1, 2, 49), - F_GSBI_QUP( 5400000, pxo, 1, 1, 5), - F_GSBI_QUP(10800000, pxo, 1, 2, 5), - F_GSBI_QUP(15060000, pll8, 1, 2, 51), - F_GSBI_QUP(24000000, pll8, 4, 1, 4), - F_GSBI_QUP(25600000, pll8, 1, 1, 15), - F_GSBI_QUP(27000000, pxo, 1, 0, 0), - F_GSBI_QUP(48000000, pll8, 4, 1, 2), - F_GSBI_QUP(51200000, pll8, 1, 2, 15), - F_END -}; - -static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9); -static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4); -static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0); -static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24); -static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20); -static CLK_GSBI_QUP(gsbi6_qup, 6, CLK_HALT_CFPB_STATEB_REG, 16); -static CLK_GSBI_QUP(gsbi7_qup, 7, CLK_HALT_CFPB_STATEB_REG, 12); -static CLK_GSBI_QUP(gsbi8_qup, 8, CLK_HALT_CFPB_STATEB_REG, 8); -static CLK_GSBI_QUP(gsbi9_qup, 9, CLK_HALT_CFPB_STATEB_REG, 4); -static CLK_GSBI_QUP(gsbi10_qup, 10, CLK_HALT_CFPB_STATEB_REG, 0); -static CLK_GSBI_QUP(gsbi11_qup, 11, CLK_HALT_CFPB_STATEC_REG, 15); -static CLK_GSBI_QUP(gsbi12_qup, 12, CLK_HALT_CFPB_STATEC_REG, 11); - -#define F_PDM(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \ - } -static struct clk_freq_tbl clk_tbl_pdm[] = { - F_PDM( 0, gnd, 1), - F_PDM(27000000, pxo, 1), - F_END -}; - -static struct rcg_clk pdm_clk = { - .b = { - .ctl_reg = PDM_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = PDM_CLK_NS_REG, - .reset_mask = BIT(12), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 3, - }, - .ns_reg = PDM_CLK_NS_REG, - .root_en_mask = BIT(11), - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_pdm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pdm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(pdm_clk.c), - }, -}; - -static struct branch_clk pmem_clk = { - .b = { - .ctl_reg = PMEM_ACLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "pmem_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmem_clk.c), - }, -}; - -#define F_PRNG(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - } -static struct clk_freq_tbl clk_tbl_prng_32[] = { - F_PRNG(32000000, pll8), - F_END -}; - -static struct clk_freq_tbl clk_tbl_prng_64[] = { - F_PRNG(64000000, pll8), - F_END -}; - -static struct rcg_clk prng_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(10), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 10, - }, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_prng_32, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "prng_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), - CLK_INIT(prng_clk.c), - }, -}; - -#define CLK_SDC(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = SDCn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = SDCn_APPS_CLK_NS_REG(n), \ - .md_reg = SDCn_APPS_CLK_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_sdc, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_SDC(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_sdc[] = { - F_SDC( 0, gnd, 1, 0, 0), - F_SDC( 144000, pxo, 3, 2, 125), - F_SDC( 400000, pll8, 4, 1, 240), - F_SDC(16000000, pll8, 4, 1, 6), - F_SDC(17070000, pll8, 1, 2, 45), - F_SDC(20210000, pll8, 1, 1, 19), - F_SDC(24000000, pll8, 4, 1, 4), - F_SDC(48000000, pll8, 4, 1, 2), - F_END -}; - -static CLK_SDC(sdc1, 1, CLK_HALT_DFAB_STATE_REG, 6); -static CLK_SDC(sdc2, 2, CLK_HALT_DFAB_STATE_REG, 5); -static CLK_SDC(sdc3, 3, CLK_HALT_DFAB_STATE_REG, 4); -static CLK_SDC(sdc4, 4, CLK_HALT_DFAB_STATE_REG, 3); -static CLK_SDC(sdc5, 5, CLK_HALT_DFAB_STATE_REG, 2); - -#define F_TSIF_REF(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_tsif_ref[] = { - F_TSIF_REF( 0, gnd, 1, 0, 0), - F_TSIF_REF(105000, pxo, 1, 1, 256), - F_END -}; - -static struct rcg_clk tsif_ref_clk = { - .b = { - .ctl_reg = TSIF_REF_CLK_NS_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 5, - }, - .ns_reg = TSIF_REF_CLK_NS_REG, - .md_reg = TSIF_REF_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(31, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_tsif_ref, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tsif_ref_clk", - .ops = &clk_ops_rcg, - CLK_INIT(tsif_ref_clk.c), - }, -}; - -#define F_TSSC(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \ - } -static struct clk_freq_tbl clk_tbl_tssc[] = { - F_TSSC( 0, gnd), - F_TSSC(27000000, pxo), - F_END -}; - -static struct rcg_clk tssc_clk = { - .b = { - .ctl_reg = TSSC_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 4, - }, - .ns_reg = TSSC_CLK_CTL_REG, - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_tssc, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tssc_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(tssc_clk.c), - }, -}; - -#define F_USB(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_usb[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(60000000, pll8, 1, 5, 32), - F_END -}; - -static struct rcg_clk usb_hs1_xcvr_clk = { - .b = { - .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HS1_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 0, - }, - .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG, - .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hs1_xcvr_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), - CLK_INIT(usb_hs1_xcvr_clk.c), - }, -}; - -static struct branch_clk usb_phy0_clk = { - .b = { - .reset_reg = USB_PHY0_RESET_REG, - .reset_mask = BIT(0), - }, - .c = { - .dbg_name = "usb_phy0_clk", - .ops = &clk_ops_reset, - CLK_INIT(usb_phy0_clk.c), - }, -}; - -#define CLK_USB_FS(i, n) \ - struct rcg_clk i##_clk = { \ - .ns_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \ - .b = { \ - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \ - .halt_check = NOCHECK, \ - }, \ - .md_reg = USB_FSn_XCVR_FS_CLK_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_usb, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } - -static CLK_USB_FS(usb_fs1_src, 1); -static struct branch_clk usb_fs1_xcvr_clk = { - .b = { - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(1), - .en_mask = BIT(9), - .reset_reg = USB_FSn_RESET_REG(1), - .reset_mask = BIT(1), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 15, - }, - .c = { - .parent = &usb_fs1_src_clk.c, - .dbg_name = "usb_fs1_xcvr_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_xcvr_clk.c), - }, -}; - -static struct branch_clk usb_fs1_sys_clk = { - .b = { - .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(1), - .en_mask = BIT(4), - .reset_reg = USB_FSn_RESET_REG(1), - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 16, - }, - .c = { - .parent = &usb_fs1_src_clk.c, - .dbg_name = "usb_fs1_sys_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_sys_clk.c), - }, -}; - -static CLK_USB_FS(usb_fs2_src, 2); -static struct branch_clk usb_fs2_xcvr_clk = { - .b = { - .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(2), - .en_mask = BIT(9), - .reset_reg = USB_FSn_RESET_REG(2), - .reset_mask = BIT(1), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 12, - }, - .c = { - .parent = &usb_fs2_src_clk.c, - .dbg_name = "usb_fs2_xcvr_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_xcvr_clk.c), - }, -}; - -static struct branch_clk usb_fs2_sys_clk = { - .b = { - .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(2), - .en_mask = BIT(4), - .reset_reg = USB_FSn_RESET_REG(2), - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 13, - }, - .c = { - .parent = &usb_fs2_src_clk.c, - .dbg_name = "usb_fs2_sys_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_sys_clk.c), - }, -}; - -/* Fast Peripheral Bus Clocks */ -static struct branch_clk ce2_p_clk = { - .b = { - .ctl_reg = CE2_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 0, - }, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "ce2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce2_p_clk.c), - }, -}; - -static struct branch_clk gsbi1_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "gsbi1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi1_p_clk.c), - }, -}; - -static struct branch_clk gsbi2_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "gsbi2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi2_p_clk.c), - }, -}; - -static struct branch_clk gsbi3_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(3), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gsbi3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi3_p_clk.c), - }, -}; - -static struct branch_clk gsbi4_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(4), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 27, - }, - .c = { - .dbg_name = "gsbi4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi4_p_clk.c), - }, -}; - -static struct branch_clk gsbi5_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(5), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "gsbi5_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi5_p_clk.c), - }, -}; - -static struct branch_clk gsbi6_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(6), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "gsbi6_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi6_p_clk.c), - }, -}; - -static struct branch_clk gsbi7_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(7), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 15, - }, - .c = { - .dbg_name = "gsbi7_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi7_p_clk.c), - }, -}; - -static struct branch_clk gsbi8_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(8), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "gsbi8_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi8_p_clk.c), - }, -}; - -static struct branch_clk gsbi9_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(9), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "gsbi9_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi9_p_clk.c), - }, -}; - -static struct branch_clk gsbi10_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(10), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gsbi10_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi10_p_clk.c), - }, -}; - -static struct branch_clk gsbi11_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(11), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "gsbi11_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi11_p_clk.c), - }, -}; - -static struct branch_clk gsbi12_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(12), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 14, - }, - .c = { - .dbg_name = "gsbi12_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi12_p_clk.c), - }, -}; - -static struct branch_clk ppss_p_clk = { - .b = { - .ctl_reg = PPSS_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "ppss_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ppss_p_clk.c), - }, -}; - -static struct branch_clk tsif_p_clk = { - .b = { - .ctl_reg = TSIF_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "tsif_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(tsif_p_clk.c), - }, -}; - -static struct branch_clk usb_fs1_p_clk = { - .b = { - .ctl_reg = USB_FSn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 17, - }, - .c = { - .dbg_name = "usb_fs1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs1_p_clk.c), - }, -}; - -static struct branch_clk usb_fs2_p_clk = { - .b = { - .ctl_reg = USB_FSn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 14, - }, - .c = { - .dbg_name = "usb_fs2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_fs2_p_clk.c), - }, -}; - -static struct branch_clk usb_hs1_p_clk = { - .b = { - .ctl_reg = USB_HS1_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "usb_hs1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs1_p_clk.c), - }, -}; - -static struct branch_clk sdc1_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "sdc1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc1_p_clk.c), - }, -}; - -static struct branch_clk sdc2_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 10, - }, - .c = { - .dbg_name = "sdc2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc2_p_clk.c), - }, -}; - -static struct branch_clk sdc3_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(3), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 9, - }, - .c = { - .dbg_name = "sdc3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc3_p_clk.c), - }, -}; - -static struct branch_clk sdc4_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(4), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 8, - }, - .c = { - .dbg_name = "sdc4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc4_p_clk.c), - }, -}; - -static struct branch_clk sdc5_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(5), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "sdc5_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc5_p_clk.c), - }, -}; - -static struct branch_clk ebi2_2x_clk = { - .b = { - .ctl_reg = EBI2_2X_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 18, - }, - .c = { - .dbg_name = "ebi2_2x_clk", - .ops = &clk_ops_branch, - CLK_INIT(ebi2_2x_clk.c), - }, -}; - -static struct branch_clk ebi2_clk = { - .b = { - .ctl_reg = EBI2_CLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 19, - }, - .c = { - .dbg_name = "ebi2_clk", - .ops = &clk_ops_branch, - CLK_INIT(ebi2_clk.c), - .depends = &ebi2_2x_clk.c, - }, -}; - -/* HW-Voteable Clocks */ -static struct branch_clk adm0_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(2), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 14, - }, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "adm0_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_clk.c), - }, -}; - -static struct branch_clk adm0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(3), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 13, - }, - .c = { - .dbg_name = "adm0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_p_clk.c), - }, -}; - -static struct branch_clk adm1_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 12, - }, - .c = { - .parent = &pxo_clk.c, - .dbg_name = "adm1_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm1_clk.c), - }, -}; - -static struct branch_clk adm1_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(5), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 11, - }, - .c = { - .dbg_name = "adm1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm1_p_clk.c), - }, -}; - -static struct branch_clk modem_ahb1_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 8, - }, - .c = { - .dbg_name = "modem_ahb1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(modem_ahb1_p_clk.c), - }, -}; - -static struct branch_clk modem_ahb2_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(1), - .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 7, - }, - .c = { - .dbg_name = "modem_ahb2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(modem_ahb2_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(8), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 22, - }, - .c = { - .dbg_name = "pmic_arb0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb0_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb1_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 21, - }, - .c = { - .dbg_name = "pmic_arb1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb1_p_clk.c), - }, -}; - -static struct branch_clk pmic_ssbi2_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(7), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 23, - }, - .c = { - .dbg_name = "pmic_ssbi2_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_ssbi2_clk.c), - }, -}; - -static struct branch_clk rpm_msg_ram_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(6), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 12, - }, - .c = { - .dbg_name = "rpm_msg_ram_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rpm_msg_ram_p_clk.c), - }, -}; - -/* - * Multimedia Clocks - */ - -#define F_CAM(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_cam[] = { - F_CAM( 0, gnd, 1, 0, 0), - F_CAM( 6000000, pll8, 4, 1, 16), - F_CAM( 8000000, pll8, 4, 1, 12), - F_CAM( 12000000, pll8, 4, 1, 8), - F_CAM( 16000000, pll8, 4, 1, 6), - F_CAM( 19200000, pll8, 4, 1, 5), - F_CAM( 24000000, pll8, 4, 1, 4), - F_CAM( 32000000, pll8, 4, 1, 3), - F_CAM( 48000000, pll8, 4, 1, 2), - F_CAM( 64000000, pll8, 3, 1, 2), - F_CAM( 96000000, pll8, 4, 0, 0), - F_CAM(128000000, pll8, 3, 0, 0), - F_END -}; - -static struct rcg_clk cam_clk = { - .b = { - .ctl_reg = CAMCLK_CC_REG, - .en_mask = BIT(0), - .halt_check = DELAY, - }, - .ns_reg = CAMCLK_NS_REG, - .md_reg = CAMCLK_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(31, 24) | BM(15, 14) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd_8, - .freq_tbl = clk_tbl_cam, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "cam_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 64000000, NOMINAL, 128000000), - CLK_INIT(cam_clk.c), - }, -}; - -#define F_CSI(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_csi[] = { - F_CSI( 0, gnd, 1), - F_CSI(192000000, pll8, 2), - F_CSI(384000000, pll8, 1), - F_END -}; - -static struct rcg_clk csi_src_clk = { - .ns_reg = CSI_NS_REG, - .b = { - .ctl_reg = CSI_CC_REG, - .halt_check = NOCHECK, - }, - .root_en_mask = BIT(2), - .ns_mask = (BM(15, 12) | BM(2, 0)), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_csi, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "csi_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 192000000, NOMINAL, 384000000), - CLK_INIT(csi_src_clk.c), - }, -}; - -static struct branch_clk csi0_clk = { - .b = { - .ctl_reg = CSI_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(8), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 13, - }, - .c = { - .parent = &csi_src_clk.c, - .dbg_name = "csi0_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_clk.c), - }, -}; - -static struct branch_clk csi1_clk = { - .b = { - .ctl_reg = CSI_CC_REG, - .en_mask = BIT(7), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(18), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 14, - }, - .c = { - .parent = &csi_src_clk.c, - .dbg_name = "csi1_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1_clk.c), - }, -}; - -#define F_DSI(d) \ - { \ - .freq_hz = d, \ - .ns_val = BVAL(27, 24, (d-1)), \ - } -/* The DSI_BYTE clock is sourced from the DSI PHY PLL, which may change rate - * without this clock driver knowing. So, overload the clk_set_rate() to set - * the divider (1 to 16) of the clock with respect to the PLL rate. */ -static struct clk_freq_tbl clk_tbl_dsi_byte[] = { - F_DSI(1), F_DSI(2), F_DSI(3), F_DSI(4), - F_DSI(5), F_DSI(6), F_DSI(7), F_DSI(8), - F_DSI(9), F_DSI(10), F_DSI(11), F_DSI(12), - F_DSI(13), F_DSI(14), F_DSI(15), F_DSI(16), - F_END -}; - - -static struct rcg_clk dsi_byte_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .halt_check = DELAY, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(7), - .retain_reg = MISC_CC2_REG, - .retain_mask = BIT(10), - }, - .ns_reg = MISC_CC2_REG, - .root_en_mask = BIT(2), - .ns_mask = BM(27, 24), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_dsi_byte, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "dsi_byte_clk", - .ops = &clk_ops_rcg, - CLK_INIT(dsi_byte_clk.c), - }, -}; - -static struct branch_clk dsi_esc_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .en_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 24, - }, - .c = { - .dbg_name = "dsi_esc_clk", - .ops = &clk_ops_branch, - CLK_INIT(dsi_esc_clk.c), - }, -}; - -#define F_GFX2D(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD4(4, m, 0, n), \ - .ns_val = NS_MND_BANKED4(20, 16, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } -static struct clk_freq_tbl clk_tbl_gfx2d[] = { - F_GFX2D( 0, gnd, 0, 0), - F_GFX2D( 27000000, pxo, 0, 0), - F_GFX2D( 48000000, pll8, 1, 8), - F_GFX2D( 54857000, pll8, 1, 7), - F_GFX2D( 64000000, pll8, 1, 6), - F_GFX2D( 76800000, pll8, 1, 5), - F_GFX2D( 96000000, pll8, 1, 4), - F_GFX2D(128000000, pll8, 1, 3), - F_GFX2D(145455000, pll2, 2, 11), - F_GFX2D(160000000, pll2, 1, 5), - F_GFX2D(177778000, pll2, 2, 9), - F_GFX2D(200000000, pll2, 1, 4), - F_GFX2D(228571000, pll2, 2, 7), - F_END -}; - -static struct bank_masks bmnd_info_gfx2d0 = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX2D0_MD0_REG, - .ns_mask = BM(23, 20) | BM(5, 3), - .rst_mask = BIT(25), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX2D0_MD1_REG, - .ns_mask = BM(19, 16) | BM(2, 0), - .rst_mask = BIT(24), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx2d0_clk = { - .b = { - .ctl_reg = GFX2D0_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(14), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 9, - .retain_reg = GFX2D0_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX2D0_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx2d, - .bank_info = &bmnd_info_gfx2d0, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx2d0_clk", - .ops = &clk_ops_rcg, - .flags = CLKFLAG_SKIP_HANDOFF, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(gfx2d0_clk.c), - }, -}; - -static struct bank_masks bmnd_info_gfx2d1 = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX2D1_MD0_REG, - .ns_mask = BM(23, 20) | BM(5, 3), - .rst_mask = BIT(25), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX2D1_MD1_REG, - .ns_mask = BM(19, 16) | BM(2, 0), - .rst_mask = BIT(24), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx2d1_clk = { - .b = { - .ctl_reg = GFX2D1_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(13), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 14, - .retain_reg = GFX2D1_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX2D1_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx2d, - .bank_info = &bmnd_info_gfx2d1, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx2d1_clk", - .ops = &clk_ops_rcg, - .flags = CLKFLAG_SKIP_HANDOFF, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(gfx2d1_clk.c), - }, -}; - -#define F_GFX3D(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD4(4, m, 0, n), \ - .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } -static struct clk_freq_tbl clk_tbl_gfx3d[] = { - F_GFX3D( 0, gnd, 0, 0), - F_GFX3D( 27000000, pxo, 0, 0), - F_GFX3D( 48000000, pll8, 1, 8), - F_GFX3D( 54857000, pll8, 1, 7), - F_GFX3D( 64000000, pll8, 1, 6), - F_GFX3D( 76800000, pll8, 1, 5), - F_GFX3D( 96000000, pll8, 1, 4), - F_GFX3D(128000000, pll8, 1, 3), - F_GFX3D(145455000, pll2, 2, 11), - F_GFX3D(160000000, pll2, 1, 5), - F_GFX3D(177778000, pll2, 2, 9), - F_GFX3D(200000000, pll2, 1, 4), - F_GFX3D(228571000, pll2, 2, 7), - F_GFX3D(266667000, pll2, 1, 3), - F_GFX3D(320000000, pll2, 2, 5), - F_END -}; - -static struct bank_masks bmnd_info_gfx3d = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = GFX3D_MD0_REG, - .ns_mask = BM(21, 18) | BM(5, 3), - .rst_mask = BIT(23), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = GFX3D_MD1_REG, - .ns_mask = BM(17, 14) | BM(2, 0), - .rst_mask = BIT(22), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk gfx3d_clk = { - .b = { - .ctl_reg = GFX3D_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(12), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 4, - .retain_reg = GFX3D_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = GFX3D_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_gfx3d, - .bank_info = &bmnd_info_gfx3d, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "gfx3d_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 96000000, NOMINAL, 200000000, - HIGH, 320000000), - CLK_INIT(gfx3d_clk.c), - .depends = &gmem_axi_clk.c, - }, -}; - -#define F_IJPEG(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 15, 12, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_ijpeg[] = { - F_IJPEG( 0, gnd, 1, 0, 0), - F_IJPEG( 27000000, pxo, 1, 0, 0), - F_IJPEG( 36570000, pll8, 1, 2, 21), - F_IJPEG( 54860000, pll8, 7, 0, 0), - F_IJPEG( 96000000, pll8, 4, 0, 0), - F_IJPEG(109710000, pll8, 1, 2, 7), - F_IJPEG(128000000, pll8, 3, 0, 0), - F_IJPEG(153600000, pll8, 1, 2, 5), - F_IJPEG(200000000, pll2, 4, 0, 0), - F_IJPEG(228571000, pll2, 1, 2, 7), - F_END -}; - -static struct rcg_clk ijpeg_clk = { - .b = { - .ctl_reg = IJPEG_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(9), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 24, - .retain_reg = IJPEG_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = IJPEG_NS_REG, - .md_reg = IJPEG_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(15, 12) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_ijpeg, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "ijpeg_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 110000000, NOMINAL, 228571000), - CLK_INIT(ijpeg_clk.c), - .depends = &ijpeg_axi_clk.c, - }, -}; - -#define F_JPEGD(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_jpegd[] = { - F_JPEGD( 0, gnd, 1), - F_JPEGD( 64000000, pll8, 6), - F_JPEGD( 76800000, pll8, 5), - F_JPEGD( 96000000, pll8, 4), - F_JPEGD(160000000, pll2, 5), - F_JPEGD(200000000, pll2, 4), - F_END -}; - -static struct rcg_clk jpegd_clk = { - .b = { - .ctl_reg = JPEGD_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(19), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 19, - .retain_reg = JPEGD_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = JPEGD_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(15, 12) | BM(2, 0)), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_jpegd, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "jpegd_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000), - CLK_INIT(jpegd_clk.c), - .depends = &jpegd_axi_clk.c, - }, -}; - -#define F_MDP(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MND_BANKED8(22, 14, n, m, 3, 0, s##_to_mm_mux), \ - .ctl_val = CC_BANKED(9, 6, n), \ - } -static struct clk_freq_tbl clk_tbl_mdp[] = { - F_MDP( 0, gnd, 0, 0), - F_MDP( 9600000, pll8, 1, 40), - F_MDP( 13710000, pll8, 1, 28), - F_MDP( 27000000, pxo, 0, 0), - F_MDP( 29540000, pll8, 1, 13), - F_MDP( 34910000, pll8, 1, 11), - F_MDP( 38400000, pll8, 1, 10), - F_MDP( 59080000, pll8, 2, 13), - F_MDP( 76800000, pll8, 1, 5), - F_MDP( 85330000, pll8, 2, 9), - F_MDP( 96000000, pll8, 1, 4), - F_MDP(128000000, pll8, 1, 3), - F_MDP(160000000, pll2, 1, 5), - F_MDP(177780000, pll2, 2, 9), - F_MDP(200000000, pll2, 1, 4), - F_END -}; - -static struct bank_masks bmnd_info_mdp = { - .bank_sel_mask = BIT(11), - .bank0_mask = { - .md_reg = MDP_MD0_REG, - .ns_mask = BM(29, 22) | BM(5, 3), - .rst_mask = BIT(31), - .mnd_en_mask = BIT(8), - .mode_mask = BM(10, 9), - }, - .bank1_mask = { - .md_reg = MDP_MD1_REG, - .ns_mask = BM(21, 14) | BM(2, 0), - .rst_mask = BIT(30), - .mnd_en_mask = BIT(5), - .mode_mask = BM(7, 6), - }, -}; - -static struct rcg_clk mdp_clk = { - .b = { - .ctl_reg = MDP_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(21), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 10, - .retain_reg = MDP_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = MDP_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_mnd_banked, - .freq_tbl = clk_tbl_mdp, - .bank_info = &bmnd_info_mdp, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 85330000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(mdp_clk.c), - .depends = &mdp_axi_clk.c, - }, -}; - -#define F_MDP_VSYNC(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(13, 13, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_mdp_vsync[] = { - F_MDP_VSYNC(27000000, pxo), - F_END -}; - -static struct rcg_clk mdp_vsync_clk = { - .b = { - .ctl_reg = MISC_CC_REG, - .en_mask = BIT(6), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(3), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 22, - }, - .ns_reg = MISC_CC2_REG, - .ns_mask = BIT(13), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_mdp_vsync, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "mdp_vsync_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(mdp_vsync_clk.c), - }, -}; - -#define F_PIXEL_MDP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS_MM(31, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_pixel_mdp[] = { - F_PIXEL_MDP( 0, gnd, 1, 0, 0), - F_PIXEL_MDP( 25600000, pll8, 3, 1, 5), - F_PIXEL_MDP( 42667000, pll8, 1, 1, 9), - F_PIXEL_MDP( 43192000, pll8, 1, 64, 569), - F_PIXEL_MDP( 48000000, pll8, 4, 1, 2), - F_PIXEL_MDP( 53990000, pll8, 2, 169, 601), - F_PIXEL_MDP( 64000000, pll8, 2, 1, 3), - F_PIXEL_MDP( 69300000, pll8, 1, 231, 1280), - F_PIXEL_MDP( 76800000, pll8, 1, 1, 5), - F_PIXEL_MDP( 85333000, pll8, 1, 2, 9), - F_PIXEL_MDP(106500000, pll8, 1, 71, 256), - F_PIXEL_MDP(109714000, pll8, 1, 2, 7), - F_END -}; - -static struct rcg_clk pixel_mdp_clk = { - .ns_reg = PIXEL_NS_REG, - .md_reg = PIXEL_MD_REG, - .b = { - .ctl_reg = PIXEL_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(5), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 23, - .retain_reg = PIXEL_CC_REG, - .retain_mask = BIT(31), - }, - .root_en_mask = BIT(2), - .ns_mask = (BM(31, 16) | BM(15, 14) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_pixel_mdp, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pixel_mdp_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 85333000, NOMINAL, 170000000), - CLK_INIT(pixel_mdp_clk.c), - }, -}; - -static struct branch_clk pixel_lcdc_clk = { - .b = { - .ctl_reg = PIXEL_CC_REG, - .en_mask = BIT(8), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 21, - }, - .c = { - .parent = &pixel_mdp_clk.c, - .dbg_name = "pixel_lcdc_clk", - .ops = &clk_ops_branch, - CLK_INIT(pixel_lcdc_clk.c), - }, -}; - -#define F_ROT(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC_BANKED(29, 26, 25, 22, d, \ - 21, 19, 18, 16, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_rot[] = { - F_ROT( 0, gnd, 1), - F_ROT( 27000000, pxo, 1), - F_ROT( 29540000, pll8, 13), - F_ROT( 32000000, pll8, 12), - F_ROT( 38400000, pll8, 10), - F_ROT( 48000000, pll8, 8), - F_ROT( 54860000, pll8, 7), - F_ROT( 64000000, pll8, 6), - F_ROT( 76800000, pll8, 5), - F_ROT( 96000000, pll8, 4), - F_ROT(100000000, pll2, 8), - F_ROT(114290000, pll2, 7), - F_ROT(133330000, pll2, 6), - F_ROT(160000000, pll2, 5), - F_END -}; - -static struct bank_masks bdiv_info_rot = { - .bank_sel_mask = BIT(30), - .bank0_mask = { - .ns_mask = BM(25, 22) | BM(18, 16), - }, - .bank1_mask = { - .ns_mask = BM(29, 26) | BM(21, 19), - }, -}; - -static struct rcg_clk rot_clk = { - .b = { - .ctl_reg = ROT_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(2), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 15, - .retain_reg = ROT_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = ROT_NS_REG, - .root_en_mask = BIT(2), - .set_rate = set_rate_div_banked, - .freq_tbl = clk_tbl_rot, - .bank_info = &bdiv_info_rot, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "rot_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 80000000, NOMINAL, 160000000), - CLK_INIT(rot_clk.c), - .depends = &rot_axi_clk.c, - }, -}; - -#define F_TV(f, s, p_r, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - .extra_freq_data = p_r, \ - } -/* Switching TV freqs requires PLL reconfiguration. */ -static struct pll_rate mm_pll2_rate[] = { - [0] = PLL_RATE( 7, 6301, 13500, 0, 4, 0x4248B), /* 50400500 Hz */ - [1] = PLL_RATE( 8, 0, 0, 0, 4, 0x4248B), /* 54000000 Hz */ - [2] = PLL_RATE(16, 2, 125, 0, 4, 0x5248F), /* 108108000 Hz */ - [3] = PLL_RATE(22, 0, 0, 2, 4, 0x6248B), /* 148500000 Hz */ - [4] = PLL_RATE(44, 0, 0, 2, 4, 0x6248F), /* 297000000 Hz */ -}; -static struct clk_freq_tbl clk_tbl_tv[] = { - F_TV( 0, gnd, &mm_pll2_rate[0], 1, 0, 0), - F_TV( 25200000, pll3, &mm_pll2_rate[0], 2, 0, 0), - F_TV( 27000000, pll3, &mm_pll2_rate[1], 2, 0, 0), - F_TV( 27030000, pll3, &mm_pll2_rate[2], 4, 0, 0), - F_TV( 74250000, pll3, &mm_pll2_rate[3], 2, 0, 0), - F_TV(148500000, pll3, &mm_pll2_rate[4], 2, 0, 0), - F_END -}; - -static struct rcg_clk tv_src_clk = { - .ns_reg = TV_NS_REG, - .b = { - .ctl_reg = TV_CC_REG, - .halt_check = NOCHECK, - .retain_reg = TV_CC_REG, - .retain_mask = BIT(31), - }, - .md_reg = TV_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(15, 14) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_tv, - .freq_tbl = clk_tbl_tv, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "tv_src_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 27030000, NOMINAL, 149000000), - CLK_INIT(tv_src_clk.c), - }, -}; - -static struct branch_clk tv_enc_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(8), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(0), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 8, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "tv_enc_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_enc_clk.c), - }, -}; - -static struct branch_clk tv_dac_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(10), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 9, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "tv_dac_clk", - .ops = &clk_ops_branch, - CLK_INIT(tv_dac_clk.c), - }, -}; - -static struct branch_clk mdp_tv_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(4), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 11, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "mdp_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(mdp_tv_clk.c), - }, -}; - -static struct branch_clk hdmi_tv_clk = { - .b = { - .ctl_reg = TV_CC_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(1), - .halt_reg = DBG_BUS_VEC_D_REG, - .halt_bit = 10, - }, - .c = { - .parent = &tv_src_clk.c, - .dbg_name = "hdmi_tv_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_tv_clk.c), - }, -}; - -static struct branch_clk hdmi_app_clk = { - .b = { - .ctl_reg = MISC_CC2_REG, - .en_mask = BIT(11), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(11), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 25, - }, - .c = { - .dbg_name = "hdmi_app_clk", - .ops = &clk_ops_branch, - CLK_INIT(hdmi_app_clk.c), - }, -}; - -#define F_VCODEC(f, s, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(18, 11, n, m, 0, 0, 1, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_vcodec[] = { - F_VCODEC( 0, gnd, 0, 0), - F_VCODEC( 27000000, pxo, 0, 0), - F_VCODEC( 32000000, pll8, 1, 12), - F_VCODEC( 48000000, pll8, 1, 8), - F_VCODEC( 54860000, pll8, 1, 7), - F_VCODEC( 96000000, pll8, 1, 4), - F_VCODEC(133330000, pll2, 1, 6), - F_VCODEC(200000000, pll2, 1, 4), - F_VCODEC(228570000, pll2, 2, 7), - F_END -}; - -static struct rcg_clk vcodec_clk = { - .b = { - .ctl_reg = VCODEC_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(6), - .halt_reg = DBG_BUS_VEC_C_REG, - .halt_bit = 29, - .retain_reg = VCODEC_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VCODEC_NS_REG, - .md_reg = VCODEC_MD0_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(18, 11) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_vcodec, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vcodec_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, - HIGH, 228571000), - CLK_INIT(vcodec_clk.c), - .depends = &vcodec_axi_clk.c, - }, -}; - -#define F_VPE(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \ - } -static struct clk_freq_tbl clk_tbl_vpe[] = { - F_VPE( 0, gnd, 1), - F_VPE( 27000000, pxo, 1), - F_VPE( 34909000, pll8, 11), - F_VPE( 38400000, pll8, 10), - F_VPE( 64000000, pll8, 6), - F_VPE( 76800000, pll8, 5), - F_VPE( 96000000, pll8, 4), - F_VPE(100000000, pll2, 8), - F_VPE(160000000, pll2, 5), - F_VPE(200000000, pll2, 4), - F_END -}; - -static struct rcg_clk vpe_clk = { - .b = { - .ctl_reg = VPE_CC_REG, - .en_mask = BIT(0), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(17), - .halt_reg = DBG_BUS_VEC_A_REG, - .halt_bit = 28, - .retain_reg = VPE_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VPE_NS_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(15, 12) | BM(2, 0)), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_vpe, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vpe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 76800000, NOMINAL, 160000000, - HIGH, 200000000), - CLK_INIT(vpe_clk.c), - .depends = &vpe_axi_clk.c, - }, -}; - -#define F_VFE(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS_MM(23, 16, n, m, 11, 10, d, 2, 0, s##_to_mm_mux), \ - .ctl_val = CC(6, n), \ - } -static struct clk_freq_tbl clk_tbl_vfe[] = { - F_VFE( 0, gnd, 1, 0, 0), - F_VFE( 13960000, pll8, 1, 2, 55), - F_VFE( 27000000, pxo, 1, 0, 0), - F_VFE( 36570000, pll8, 1, 2, 21), - F_VFE( 38400000, pll8, 2, 1, 5), - F_VFE( 45180000, pll8, 1, 2, 17), - F_VFE( 48000000, pll8, 2, 1, 4), - F_VFE( 54860000, pll8, 1, 1, 7), - F_VFE( 64000000, pll8, 2, 1, 3), - F_VFE( 76800000, pll8, 1, 1, 5), - F_VFE( 96000000, pll8, 2, 1, 2), - F_VFE(109710000, pll8, 1, 2, 7), - F_VFE(128000000, pll8, 1, 1, 3), - F_VFE(153600000, pll8, 1, 2, 5), - F_VFE(200000000, pll2, 2, 1, 2), - F_VFE(228570000, pll2, 1, 2, 7), - F_VFE(266667000, pll2, 1, 1, 3), - F_END -}; - -static struct rcg_clk vfe_clk = { - .b = { - .ctl_reg = VFE_CC_REG, - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(15), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 6, - .en_mask = BIT(0), - .retain_reg = VFE_CC_REG, - .retain_mask = BIT(31), - }, - .ns_reg = VFE_NS_REG, - .md_reg = VFE_MD_REG, - .root_en_mask = BIT(2), - .ns_mask = (BM(23, 16) | BM(11, 10) | BM(2, 0)), - .mnd_en_mask = BIT(5), - .ctl_mask = BM(7, 6), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_vfe, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "vfe_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 228570000, - HIGH, 266667000), - CLK_INIT(vfe_clk.c), - .depends = &vfe_axi_clk.c, - }, -}; - -static struct branch_clk csi0_vfe_clk = { - .b = { - .ctl_reg = VFE_CC_REG, - .en_mask = BIT(12), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(24), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 7, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "csi0_vfe_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi0_vfe_clk.c), - }, -}; - -static struct branch_clk csi1_vfe_clk = { - .b = { - .ctl_reg = VFE_CC_REG, - .en_mask = BIT(10), - .reset_reg = SW_RESET_CORE_REG, - .reset_mask = BIT(23), - .halt_reg = DBG_BUS_VEC_B_REG, - .halt_bit = 8, - }, - .c = { - .parent = &vfe_clk.c, - .dbg_name = "csi1_vfe_clk", - .ops = &clk_ops_branch, - CLK_INIT(csi1_vfe_clk.c), - }, -}; - -/* - * Low Power Audio Clocks - */ -#define F_AIF_OSR(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_aif_osr[] = { - F_AIF_OSR( 0, gnd, 1, 0, 0), - F_AIF_OSR( 768000, pll4, 4, 1, 176), - F_AIF_OSR( 1024000, pll4, 4, 1, 132), - F_AIF_OSR( 1536000, pll4, 4, 1, 88), - F_AIF_OSR( 2048000, pll4, 4, 1, 66), - F_AIF_OSR( 3072000, pll4, 4, 1, 44), - F_AIF_OSR( 4096000, pll4, 4, 1, 33), - F_AIF_OSR( 6144000, pll4, 4, 1, 22), - F_AIF_OSR( 8192000, pll4, 2, 1, 33), - F_AIF_OSR(12288000, pll4, 4, 1, 11), - F_AIF_OSR(24576000, pll4, 2, 1, 11), - F_AIF_OSR(27000000, pxo, 1, 0, 0), - F_END -}; - -#define CLK_AIF_OSR(i, ns, md, h_r) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(17), \ - .reset_reg = ns, \ - .reset_mask = BIT(19), \ - .halt_reg = h_r, \ - .halt_check = ENABLE, \ - .halt_bit = 1, \ - }, \ - .ns_reg = ns, \ - .md_reg = md, \ - .root_en_mask = BIT(9), \ - .ns_mask = (BM(31, 24) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_aif_osr, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(LOW, 27000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } - -#define CLK_AIF_BIT(i, ns, h_r) \ - struct cdiv_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(15), \ - .halt_reg = h_r, \ - .halt_check = DELAY, \ - }, \ - .ns_reg = ns, \ - .ext_mask = BIT(14), \ - .div_offset = 10, \ - .max_div = 16, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_cdiv, \ - CLK_INIT(i##_clk.c), \ - .rate = ULONG_MAX, \ - }, \ - } - -static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG, - LCC_MI2S_STATUS_REG); -static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG); - -static CLK_AIF_OSR(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_STATUS_REG); - -static CLK_AIF_OSR(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_STATUS_REG); - -#define F_PCM(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_pcm[] = { - { .ns_val = BIT(10) /* external input */ }, - F_PCM( 512000, pll4, 4, 1, 264), - F_PCM( 768000, pll4, 4, 1, 176), - F_PCM( 1024000, pll4, 4, 1, 132), - F_PCM( 1536000, pll4, 4, 1, 88), - F_PCM( 2048000, pll4, 4, 1, 66), - F_PCM( 3072000, pll4, 4, 1, 44), - F_PCM( 4096000, pll4, 4, 1, 33), - F_PCM( 6144000, pll4, 4, 1, 22), - F_PCM( 8192000, pll4, 2, 1, 33), - F_PCM(12288000, pll4, 4, 1, 11), - F_PCM(24580000, pll4, 2, 1, 11), - F_PCM(27000000, pxo, 1, 0, 0), - F_END -}; - -static struct rcg_clk pcm_clk = { - .b = { - .ctl_reg = LCC_PCM_NS_REG, - .en_mask = BIT(11), - .reset_reg = LCC_PCM_NS_REG, - .reset_mask = BIT(13), - .halt_reg = LCC_PCM_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_PCM_NS_REG, - .md_reg = LCC_PCM_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_pcm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pcm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 27000000), - CLK_INIT(pcm_clk.c), - .rate = ULONG_MAX, - }, -}; - -DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL); -DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL); -DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL); -DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL); -DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL); -DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL); -DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL); -DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL); -DEFINE_CLK_RPM(smi_clk, smi_a_clk, SMI, &smi_2x_axi_clk.c); - -static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc3_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc4_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc5_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_scm_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_qseecom_clk, &dfab_clk.c, 0); - -static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_adm0_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi1_adm1_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi1_acpu_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_msmbus_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(afab_acpu_a_clk, &afab_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(afab_msmbus_a_clk, &afab_a_clk.c, LONG_MAX); - -static DEFINE_CLK_MEASURE(sc0_m_clk); -static DEFINE_CLK_MEASURE(sc1_m_clk); -static DEFINE_CLK_MEASURE(l2_m_clk); - -#ifdef CONFIG_DEBUG_FS -struct measure_sel { - u32 test_vector; - struct clk *c; -}; - -static struct measure_sel measure_mux[] = { - { TEST_PER_LS(0x08), &modem_ahb1_p_clk.c }, - { TEST_PER_LS(0x09), &modem_ahb2_p_clk.c }, - { TEST_PER_LS(0x12), &sdc1_p_clk.c }, - { TEST_PER_LS(0x13), &sdc1_clk.c }, - { TEST_PER_LS(0x14), &sdc2_p_clk.c }, - { TEST_PER_LS(0x15), &sdc2_clk.c }, - { TEST_PER_LS(0x16), &sdc3_p_clk.c }, - { TEST_PER_LS(0x17), &sdc3_clk.c }, - { TEST_PER_LS(0x18), &sdc4_p_clk.c }, - { TEST_PER_LS(0x19), &sdc4_clk.c }, - { TEST_PER_LS(0x1A), &sdc5_p_clk.c }, - { TEST_PER_LS(0x1B), &sdc5_clk.c }, - { TEST_PER_LS(0x1D), &ebi2_2x_clk.c }, - { TEST_PER_LS(0x1E), &ebi2_clk.c }, - { TEST_PER_LS(0x1F), &gp0_clk.c }, - { TEST_PER_LS(0x20), &gp1_clk.c }, - { TEST_PER_LS(0x21), &gp2_clk.c }, - { TEST_PER_LS(0x25), &dfab_clk.c }, - { TEST_PER_LS(0x25), &dfab_a_clk.c }, - { TEST_PER_LS(0x26), &pmem_clk.c }, - { TEST_PER_LS(0x2B), &ppss_p_clk.c }, - { TEST_PER_LS(0x33), &cfpb_clk.c }, - { TEST_PER_LS(0x33), &cfpb_a_clk.c }, - { TEST_PER_LS(0x3D), &gsbi1_p_clk.c }, - { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c }, - { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c }, - { TEST_PER_LS(0x41), &gsbi2_p_clk.c }, - { TEST_PER_LS(0x42), &gsbi2_uart_clk.c }, - { TEST_PER_LS(0x44), &gsbi2_qup_clk.c }, - { TEST_PER_LS(0x45), &gsbi3_p_clk.c }, - { TEST_PER_LS(0x46), &gsbi3_uart_clk.c }, - { TEST_PER_LS(0x48), &gsbi3_qup_clk.c }, - { TEST_PER_LS(0x49), &gsbi4_p_clk.c }, - { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c }, - { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c }, - { TEST_PER_LS(0x4D), &gsbi5_p_clk.c }, - { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c }, - { TEST_PER_LS(0x50), &gsbi5_qup_clk.c }, - { TEST_PER_LS(0x51), &gsbi6_p_clk.c }, - { TEST_PER_LS(0x52), &gsbi6_uart_clk.c }, - { TEST_PER_LS(0x54), &gsbi6_qup_clk.c }, - { TEST_PER_LS(0x55), &gsbi7_p_clk.c }, - { TEST_PER_LS(0x56), &gsbi7_uart_clk.c }, - { TEST_PER_LS(0x58), &gsbi7_qup_clk.c }, - { TEST_PER_LS(0x59), &gsbi8_p_clk.c }, - { TEST_PER_LS(0x5A), &gsbi8_uart_clk.c }, - { TEST_PER_LS(0x5C), &gsbi8_qup_clk.c }, - { TEST_PER_LS(0x5D), &gsbi9_p_clk.c }, - { TEST_PER_LS(0x5E), &gsbi9_uart_clk.c }, - { TEST_PER_LS(0x60), &gsbi9_qup_clk.c }, - { TEST_PER_LS(0x61), &gsbi10_p_clk.c }, - { TEST_PER_LS(0x62), &gsbi10_uart_clk.c }, - { TEST_PER_LS(0x64), &gsbi10_qup_clk.c }, - { TEST_PER_LS(0x65), &gsbi11_p_clk.c }, - { TEST_PER_LS(0x66), &gsbi11_uart_clk.c }, - { TEST_PER_LS(0x68), &gsbi11_qup_clk.c }, - { TEST_PER_LS(0x69), &gsbi12_p_clk.c }, - { TEST_PER_LS(0x6A), &gsbi12_uart_clk.c }, - { TEST_PER_LS(0x6C), &gsbi12_qup_clk.c }, - { TEST_PER_LS(0x78), &sfpb_clk.c }, - { TEST_PER_LS(0x78), &sfpb_a_clk.c }, - { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c }, - { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c }, - { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c }, - { TEST_PER_LS(0x7D), &prng_clk.c }, - { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c }, - { TEST_PER_LS(0x80), &adm0_p_clk.c }, - { TEST_PER_LS(0x81), &adm1_p_clk.c }, - { TEST_PER_LS(0x84), &usb_hs1_p_clk.c }, - { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c }, - { TEST_PER_LS(0x89), &usb_fs1_p_clk.c }, - { TEST_PER_LS(0x8A), &usb_fs1_sys_clk.c }, - { TEST_PER_LS(0x8B), &usb_fs1_xcvr_clk.c }, - { TEST_PER_LS(0x8C), &usb_fs2_p_clk.c }, - { TEST_PER_LS(0x8D), &usb_fs2_sys_clk.c }, - { TEST_PER_LS(0x8E), &usb_fs2_xcvr_clk.c }, - { TEST_PER_LS(0x8F), &tsif_p_clk.c }, - { TEST_PER_LS(0x91), &tsif_ref_clk.c }, - { TEST_PER_LS(0x93), &ce2_p_clk.c }, - { TEST_PER_LS(0x94), &tssc_clk.c }, - - { TEST_PER_HS(0x07), &afab_clk.c }, - { TEST_PER_HS(0x07), &afab_a_clk.c }, - { TEST_PER_HS(0x18), &sfab_clk.c }, - { TEST_PER_HS(0x18), &sfab_a_clk.c }, - { TEST_PER_HS(0x2A), &adm0_clk.c }, - { TEST_PER_HS(0x2B), &adm1_clk.c }, - { TEST_PER_HS(0x34), &ebi1_clk.c }, - { TEST_PER_HS(0x34), &ebi1_a_clk.c }, - - { TEST_MM_LS(0x00), &dsi_byte_clk.c }, - { TEST_MM_LS(0x01), &pixel_lcdc_clk.c }, - { TEST_MM_LS(0x04), &pixel_mdp_clk.c }, - { TEST_MM_LS(0x06), &_p_clk.c }, - { TEST_MM_LS(0x07), &csi0_p_clk.c }, - { TEST_MM_LS(0x08), &csi1_p_clk.c }, - { TEST_MM_LS(0x09), &dsi_m_p_clk.c }, - { TEST_MM_LS(0x0A), &dsi_s_p_clk.c }, - { TEST_MM_LS(0x0C), &gfx2d0_p_clk.c }, - { TEST_MM_LS(0x0D), &gfx2d1_p_clk.c }, - { TEST_MM_LS(0x0E), &gfx3d_p_clk.c }, - { TEST_MM_LS(0x0F), &hdmi_m_p_clk.c }, - { TEST_MM_LS(0x10), &hdmi_s_p_clk.c }, - { TEST_MM_LS(0x11), &ijpeg_p_clk.c }, - { TEST_MM_LS(0x12), &imem_p_clk.c }, - { TEST_MM_LS(0x13), &jpegd_p_clk.c }, - { TEST_MM_LS(0x14), &mdp_p_clk.c }, - { TEST_MM_LS(0x16), &rot_p_clk.c }, - { TEST_MM_LS(0x18), &smmu_p_clk.c }, - { TEST_MM_LS(0x19), &tv_enc_p_clk.c }, - { TEST_MM_LS(0x1A), &vcodec_p_clk.c }, - { TEST_MM_LS(0x1B), &vfe_p_clk.c }, - { TEST_MM_LS(0x1C), &vpe_p_clk.c }, - { TEST_MM_LS(0x1D), &cam_clk.c }, - { TEST_MM_LS(0x1F), &hdmi_app_clk.c }, - { TEST_MM_LS(0x20), &mdp_vsync_clk.c }, - { TEST_MM_LS(0x21), &tv_dac_clk.c }, - { TEST_MM_LS(0x22), &tv_enc_clk.c }, - { TEST_MM_LS(0x23), &dsi_esc_clk.c }, - { TEST_MM_LS(0x25), &mmfpb_clk.c }, - { TEST_MM_LS(0x25), &mmfpb_a_clk.c }, - - { TEST_MM_HS(0x00), &csi0_clk.c }, - { TEST_MM_HS(0x01), &csi1_clk.c }, - { TEST_MM_HS(0x03), &csi0_vfe_clk.c }, - { TEST_MM_HS(0x04), &csi1_vfe_clk.c }, - { TEST_MM_HS(0x05), &ijpeg_clk.c }, - { TEST_MM_HS(0x06), &vfe_clk.c }, - { TEST_MM_HS(0x07), &gfx2d0_clk.c }, - { TEST_MM_HS(0x08), &gfx2d1_clk.c }, - { TEST_MM_HS(0x09), &gfx3d_clk.c }, - { TEST_MM_HS(0x0A), &jpegd_clk.c }, - { TEST_MM_HS(0x0B), &vcodec_clk.c }, - { TEST_MM_HS(0x0F), &mmfab_clk.c }, - { TEST_MM_HS(0x0F), &mmfab_a_clk.c }, - { TEST_MM_HS(0x11), &gmem_axi_clk.c }, - { TEST_MM_HS(0x12), &ijpeg_axi_clk.c }, - { TEST_MM_HS(0x13), &imem_axi_clk.c }, - { TEST_MM_HS(0x14), &jpegd_axi_clk.c }, - { TEST_MM_HS(0x15), &mdp_axi_clk.c }, - { TEST_MM_HS(0x16), &rot_axi_clk.c }, - { TEST_MM_HS(0x17), &vcodec_axi_clk.c }, - { TEST_MM_HS(0x18), &vfe_axi_clk.c }, - { TEST_MM_HS(0x19), &vpe_axi_clk.c }, - { TEST_MM_HS(0x1A), &mdp_clk.c }, - { TEST_MM_HS(0x1B), &rot_clk.c }, - { TEST_MM_HS(0x1C), &vpe_clk.c }, - { TEST_MM_HS(0x1E), &hdmi_tv_clk.c }, - { TEST_MM_HS(0x1F), &mdp_tv_clk.c }, - { TEST_MM_HS(0x24), &smi_2x_axi_clk.c }, - - { TEST_MM_HS2X(0x24), &smi_clk.c }, - { TEST_MM_HS2X(0x24), &smi_a_clk.c }, - - { TEST_LPA(0x0A), &mi2s_osr_clk.c }, - { TEST_LPA(0x0B), &mi2s_bit_clk.c }, - { TEST_LPA(0x0C), &codec_i2s_mic_osr_clk.c }, - { TEST_LPA(0x0D), &codec_i2s_mic_bit_clk.c }, - { TEST_LPA(0x0E), &codec_i2s_spkr_osr_clk.c }, - { TEST_LPA(0x0F), &codec_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x10), &spare_i2s_mic_osr_clk.c }, - { TEST_LPA(0x11), &spare_i2s_mic_bit_clk.c }, - { TEST_LPA(0x12), &spare_i2s_spkr_osr_clk.c }, - { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x14), &pcm_clk.c }, - - { TEST_SC(0x40), &sc0_m_clk }, - { TEST_SC(0x41), &sc1_m_clk }, - { TEST_SC(0x42), &l2_m_clk }, -}; - -static struct measure_sel *find_measure_sel(struct clk *c) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(measure_mux); i++) - if (measure_mux[i].c == c) - return &measure_mux[i]; - return NULL; -} - -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - int ret = 0; - u32 clk_sel; - struct measure_sel *p; - struct measure_clk *measure = to_measure_clk(c); - unsigned long flags; - - if (!parent) - return -EINVAL; - - p = find_measure_sel(parent); - if (!p) - return -EINVAL; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* - * Program the test vector, measurement period (sample_ticks) - * and scaling factors (multiplier, divider). - */ - clk_sel = p->test_vector & TEST_CLK_SEL_MASK; - measure->sample_ticks = 0x10000; - measure->multiplier = 1; - measure->divider = 1; - switch (p->test_vector >> TEST_TYPE_SHIFT) { - case TEST_TYPE_PER_LS: - writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_PER_HS: - writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_MM_LS: - writel_relaxed(0x4030D97, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_LS_REG); - break; - case TEST_TYPE_MM_HS2X: - measure->divider = 2; - case TEST_TYPE_MM_HS: - writel_relaxed(0x402B800, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_HS_REG); - break; - case TEST_TYPE_LPA: - writel_relaxed(0x4030D98, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), - LCC_CLK_LS_DEBUG_CFG_REG); - break; - case TEST_TYPE_SC: - writel_relaxed(0x5020000|BVAL(16, 10, clk_sel), CLK_TEST_REG); - measure->sample_ticks = 0x4000; - measure->multiplier = 2; - break; - default: - ret = -EPERM; - } - /* Make sure test vector is set before starting measurements. */ - mb(); - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} - -/* Sample clock for 'ticks' reference clock ticks. */ -static u32 run_measurement(unsigned ticks) -{ - /* Stop counters and set the XO4 counter start value. */ - writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG); - - /* Wait for timer to become ready. */ - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0) - cpu_relax(); - - /* Run measurement and wait for completion. */ - writel_relaxed(BIT(20)|ticks, RINGOSC_TCXO_CTL_REG); - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0) - cpu_relax(); - - /* Stop counters. */ - writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG); - - /* Return measured ticks. */ - return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0); -} - -/* Perform a hardware rate measurement for a given clock. - FOR DEBUG USE ONLY: Measurements take ~15 ms! */ -static unsigned long measure_clk_get_rate(struct clk *c) -{ - unsigned long flags; - u32 pdm_reg_backup, ringosc_reg_backup; - u64 raw_count_short, raw_count_full; - struct measure_clk *measure = to_measure_clk(c); - unsigned ret; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Enable CXO/4 and RINGOSC branch and root. */ - pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG); - ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG); - writel_relaxed(0x2898, PDM_CLK_NS_REG); - writel_relaxed(0xA00, RINGOSC_NS_REG); - - /* - * The ring oscillator counter will not reset if the measured clock - * is not running. To detect this, run a short measurement before - * the full measurement. If the raw results of the two are the same - * then the clock must be off. - */ - - /* Run a short measurement. (~1 ms) */ - raw_count_short = run_measurement(0x1000); - /* Run a full measurement. (~14 ms) */ - raw_count_full = run_measurement(measure->sample_ticks); - - writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG); - writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG); - - /* Return 0 if the clock is off. */ - if (raw_count_full == raw_count_short) - ret = 0; - else { - /* Compute rate in Hz. */ - raw_count_full = ((raw_count_full * 10) + 15) * 4800000; - do_div(raw_count_full, (((measure->sample_ticks * 10) + 35) - * measure->divider)); - ret = (raw_count_full * measure->multiplier); - } - - /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */ - writel_relaxed(0x3CF8, PLLTEST_PAD_CFG_REG); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} -#else /* !CONFIG_DEBUG_FS */ -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - return -EINVAL; -} - -static unsigned long measure_clk_get_rate(struct clk *c) -{ - return 0; -} -#endif /* CONFIG_DEBUG_FS */ - -static struct clk_ops clk_ops_measure = { - .set_parent = measure_clk_set_parent, - .get_rate = measure_clk_get_rate, -}; - -static struct measure_clk measure_clk = { - .c = { - .dbg_name = "measure_clk", - .ops = &clk_ops_measure, - CLK_INIT(measure_clk.c), - }, - .multiplier = 1, - .divider = 1, -}; - -static struct clk_lookup msm_clocks_8x60[] = { - CLK_LOOKUP("xo", cxo_clk.c, ""), - CLK_LOOKUP("xo", cxo_a_clk.c, ""), - CLK_LOOKUP("xo", pxo_a_clk.c, ""), - CLK_LOOKUP("xo", pxo_clk.c, "pil_modem"), - CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"), - CLK_LOOKUP("pll4", pll4_clk.c, "pil_qdsp6v3"), - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("bus_clk", afab_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""), - CLK_LOOKUP("mem_clk", smi_clk.c, ""), - CLK_LOOKUP("mem_clk", smi_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"), - CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_a_clk", sfab_a_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"), - CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"), - CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"), - CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"), - CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("smi_clk", smi_clk.c, "msm_bus"), - CLK_LOOKUP("smi_a_clk", smi_a_clk.c, "msm_bus"), - CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8x60"), - - CLK_LOOKUP("core_clk", gp0_clk.c, ""), - CLK_LOOKUP("core_clk", gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gp2_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, "msm_serial_hsl.2"), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, "msm_serial_hsl.1"), - CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"), - CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.0"), - CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.1"), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, "qup_i2c.4"), - CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, "qup_i2c.3"), - CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, "qup_i2c.2"), - CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "spi_qsd.1"), - CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, ""), - CLK_LOOKUP("gsbi_qup_clk", gsbi12_qup_clk.c, "msm_dsps"), - CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.5"), - CLK_LOOKUP("core_clk", pdm_clk.c, ""), - CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_dsps"), - CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.1"), - CLK_LOOKUP("core_clk", tssc_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"), - CLK_LOOKUP("phy_clk", usb_phy0_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""), - CLK_LOOKUP("alt_core_clk", usb_fs2_xcvr_clk.c, ""), - CLK_LOOKUP("sys_clk", usb_fs2_sys_clk.c, ""), - CLK_LOOKUP("src_clk", usb_fs2_src_clk.c, ""), - CLK_LOOKUP("core_clk", ce2_p_clk.c, "qce.0"), - CLK_LOOKUP("core_clk", ce2_p_clk.c, "qcrypto.0"), - CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"), - CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "msm_serial_hsl.2"), - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.0"), - CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.1"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, "qup_i2c.4"), - CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "qup_i2c.3"), - CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "msm_serial_hsl.1"), - CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "qup_i2c.2"), - CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "spi_qsd.1"), - CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, ""), - CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.5"), - CLK_LOOKUP("iface_clk", ppss_p_clk.c, "msm_dsps"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.1"), - CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_fs2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("mem_clk", ebi2_2x_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi2_clk.c, "msm_ebi2"), - CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov.0"), - CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov.0"), - CLK_LOOKUP("core_clk", adm1_clk.c, "msm_dmov.1"), - CLK_LOOKUP("iface_clk", adm1_p_clk.c, "msm_dmov.1"), - CLK_LOOKUP("iface_clk", modem_ahb1_p_clk.c, ""), - CLK_LOOKUP("iface_clk", modem_ahb2_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""), - CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""), - CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""), - CLK_LOOKUP("cam_clk", cam_clk.c, NULL), - CLK_LOOKUP("csi_clk", csi0_clk.c, NULL), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csic.1"), - CLK_LOOKUP("csi_src_clk", csi_src_clk.c, NULL), - CLK_LOOKUP("byte_clk", dsi_byte_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("esc_clk", dsi_esc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "footswitch-8x60.0"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "kgsl-2d1.1"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "footswitch-8x60.1"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"), - CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("core_clk", jpegd_clk.c, NULL), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("lcdc_clk", pixel_lcdc_clk.c, "lcdc.0"), - CLK_LOOKUP("pixel_lcdc_clk", pixel_lcdc_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("mdp_clk", pixel_mdp_clk.c, "lcdc.0"), - CLK_LOOKUP("pixel_mdp_clk", pixel_mdp_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"), - CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("tv_enc_clk", tv_enc_clk.c, NULL), - CLK_LOOKUP("tv_dac_clk", tv_dac_clk.c, NULL), - CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"), - CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"), - CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"), - CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("vpe_clk", vpe_clk.c, NULL), - CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("csi_vfe_clk", csi0_vfe_clk.c, NULL), - CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_csic.1"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("mem_clk", imem_axi_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("csi_pclk", csi0_p_clk.c, NULL), - CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_csic.1"), - CLK_LOOKUP("master_iface_clk", dsi_m_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("slave_iface_clk", dsi_s_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "footswitch-8x60.0"), - CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "kgsl-2d1.1"), - CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "footswitch-8x60.1"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"), - CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"), - CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"), - CLK_LOOKUP("iface_clk", jpegd_p_clk.c, NULL), - CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"), - CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu-v0.11"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"), - CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"), - CLK_LOOKUP("tv_enc_pclk", tv_enc_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"), - CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"), - CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, NULL), - CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"), - CLK_LOOKUP("mi2s_osr_clk", mi2s_osr_clk.c, NULL), - CLK_LOOKUP("mi2s_bit_clk", mi2s_bit_clk.c, NULL), - CLK_LOOKUP("i2s_mic_osr_clk", codec_i2s_mic_osr_clk.c, NULL), - CLK_LOOKUP("i2s_mic_bit_clk", codec_i2s_mic_bit_clk.c, NULL), - CLK_LOOKUP("i2s_mic_osr_clk", spare_i2s_mic_osr_clk.c, NULL), - CLK_LOOKUP("i2s_mic_bit_clk", spare_i2s_mic_bit_clk.c, NULL), - CLK_LOOKUP("i2s_spkr_osr_clk", codec_i2s_spkr_osr_clk.c, NULL), - CLK_LOOKUP("i2s_spkr_bit_clk", codec_i2s_spkr_bit_clk.c, NULL), - CLK_LOOKUP("i2s_spkr_osr_clk", spare_i2s_spkr_osr_clk.c, NULL), - CLK_LOOKUP("i2s_spkr_bit_clk", spare_i2s_spkr_bit_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu-v0.0"), - CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu-v0.1"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.2"), - CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu-v0.3"), - CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu-v0.4"), - CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu-v0.5"), - CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu-v0.6"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "msm_iommu-v0.7"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "msm_iommu-v0.8"), - CLK_LOOKUP("core_clk", gfx3d_clk.c, "msm_iommu-v0.9"), - CLK_LOOKUP("core_clk", gfx2d0_clk.c, "msm_iommu-v0.10"), - CLK_LOOKUP("core_clk", gfx2d1_clk.c, "msm_iommu-v0.11"), - - CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_clk.c, "msm_vidc.0"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"), - CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"), - CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"), - - CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL), - CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"), - CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"), - CLK_LOOKUP("bus_clk", dfab_qseecom_clk.c, "qseecom"), - - CLK_LOOKUP("mem_clk", ebi1_adm0_clk.c, "msm_dmov.0"), - CLK_LOOKUP("mem_clk", ebi1_adm1_clk.c, "msm_dmov.1"), - CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""), - CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""), - - CLK_LOOKUP("sc0_mclk", sc0_m_clk, ""), - CLK_LOOKUP("sc1_mclk", sc1_m_clk, ""), - CLK_LOOKUP("l2_mclk", l2_m_clk, ""), -}; - -/* - * Miscellaneous clock register initializations - */ - -/* Read, modify, then write-back a register. */ -static void __init rmwreg(uint32_t val, void *reg, uint32_t mask) -{ - uint32_t regval = readl_relaxed(reg); - regval &= ~mask; - regval |= val; - writel_relaxed(regval, reg); -} - -static void __init msm8660_clock_pre_init(void) -{ - /* Setup MM_PLL2 (PLL3), but turn it off. Rate set by set_rate_tv(). */ - rmwreg(0, MM_PLL2_MODE_REG, BIT(0)); /* Disable output */ - /* Set ref, bypass, assert reset, disable output, disable test mode */ - writel_relaxed(0, MM_PLL2_MODE_REG); /* PXO */ - writel_relaxed(0x00800000, MM_PLL2_CONFIG_REG); /* Enable main out. */ - - /* The clock driver doesn't use SC1's voting register to control - * HW-voteable clocks. Clear its bits so that disabling bits in the - * SC0 register will cause the corresponding clocks to be disabled. */ - rmwreg(BIT(12)|BIT(11), SC0_U_CLK_BRANCH_ENA_VOTE_REG, BM(12, 11)); - writel_relaxed(BIT(12)|BIT(11), SC1_U_CLK_BRANCH_ENA_VOTE_REG); - /* Let sc_aclk and sc_clk halt when both Scorpions are collapsed. */ - writel_relaxed(BIT(12)|BIT(11), SC0_U_CLK_SLEEP_ENA_VOTE_REG); - writel_relaxed(BIT(12)|BIT(11), SC1_U_CLK_SLEEP_ENA_VOTE_REG); - - /* Deassert MM SW_RESET_ALL signal. */ - writel_relaxed(0, SW_RESET_ALL_REG); - - /* Initialize MM AHB registers: Enable the FPB clock and disable HW - * gating for all clocks. Also set VFE_AHB's FORCE_CORE_ON bit to - * prevent its memory from being collapsed when the clock is halted. - * The sleep and wake-up delays are set to safe values. */ - rmwreg(0x00000003, AHB_EN_REG, 0x6C000003); - writel_relaxed(0x000007F9, AHB_EN2_REG); - - /* Deassert all locally-owned MM AHB resets. */ - rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF); - - /* Initialize MM AXI registers: Enable HW gating for all clocks that - * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up - * delays to safe values. */ - rmwreg(0x100207F9, MAXI_EN_REG, 0x1803FFFF); - rmwreg(0x7027FCFF, MAXI_EN2_REG, 0x7A3FFFFF); - writel_relaxed(0x3FE7FCFF, MAXI_EN3_REG); - writel_relaxed(0x000001D8, SAXI_EN_REG); - - /* Initialize MM CC registers: Set MM FORCE_CORE_ON bits so that core - * memories retain state even when not clocked. Also, set sleep and - * wake-up delays to safe values. */ - rmwreg(0x00000000, CSI_CC_REG, 0x00000018); - rmwreg(0x00000400, MISC_CC_REG, 0x017C0400); - rmwreg(0x000007FD, MISC_CC2_REG, 0x70C2E7FF); - rmwreg(0x80FF0000, GFX2D0_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, GFX2D1_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, GFX3D_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, IJPEG_CC_REG, 0xE0FF0018); - rmwreg(0x80FF0000, JPEGD_CC_REG, 0xE0FF0018); - rmwreg(0x80FF0000, MDP_CC_REG, 0xE1FF0010); - rmwreg(0x80FF0000, PIXEL_CC_REG, 0xE1FF0010); - rmwreg(0x000004FF, PIXEL_CC2_REG, 0x000007FF); - rmwreg(0x80FF0000, ROT_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, TV_CC_REG, 0xE1FFC010); - rmwreg(0x000004FF, TV_CC2_REG, 0x000027FF); - rmwreg(0xC0FF0000, VCODEC_CC_REG, 0xE0FF0010); - rmwreg(0x80FF0000, VFE_CC_REG, 0xE0FFC010); - rmwreg(0x80FF0000, VPE_CC_REG, 0xE0FF0010); - - /* De-assert MM AXI resets to all hardware blocks. */ - writel_relaxed(0, SW_RESET_AXI_REG); - - /* Deassert all MM core resets. */ - writel_relaxed(0, SW_RESET_CORE_REG); - - /* Enable TSSC and PDM PXO sources. */ - writel_relaxed(BIT(11), TSSC_CLK_CTL_REG); - writel_relaxed(BIT(15), PDM_CLK_NS_REG); - /* Set the dsi_byte_clk src to the DSI PHY PLL, - * dsi_esc_clk to PXO/2, and the hdmi_app_clk src to PXO */ - rmwreg(0x400001, MISC_CC2_REG, 0x424003); - - if ((readl_relaxed(PRNG_CLK_NS_REG) & 0x7F) == 0x2B) - prng_clk.freq_tbl = clk_tbl_prng_64; -} - -static void __init msm8660_clock_post_init(void) -{ - /* Keep PXO on whenever APPS cpu is active */ - clk_prepare_enable(&pxo_a_clk.c); - - /* Reset 3D core while clocked to ensure it resets completely. */ - clk_set_rate(&gfx3d_clk.c, 27000000); - clk_prepare_enable(&gfx3d_clk.c); - clk_reset(&gfx3d_clk.c, CLK_RESET_ASSERT); - udelay(5); - clk_reset(&gfx3d_clk.c, CLK_RESET_DEASSERT); - clk_disable_unprepare(&gfx3d_clk.c); - - /* Initialize rates for clocks that only support one. */ - clk_set_rate(&pdm_clk.c, 27000000); - clk_set_rate(&prng_clk.c, prng_clk.freq_tbl->freq_hz); - clk_set_rate(&mdp_vsync_clk.c, 27000000); - clk_set_rate(&tsif_ref_clk.c, 105000); - clk_set_rate(&tssc_clk.c, 27000000); - clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000); - clk_set_rate(&usb_fs1_src_clk.c, 60000000); - clk_set_rate(&usb_fs2_src_clk.c, 60000000); - - /* The halt status bits for PDM and TSSC may be incorrect at boot. - * Toggle these clocks on and off to refresh them. */ - clk_prepare_enable(&pdm_clk.c); - clk_disable_unprepare(&pdm_clk.c); - clk_prepare_enable(&tssc_clk.c); - clk_disable_unprepare(&tssc_clk.c); -} - -static int __init msm8660_clock_late_init(void) -{ - int rc; - - /* Vote for MMFPB to be at least 64MHz when an Apps CPU is active. */ - struct clk *mmfpb_a_clk = clk_get_sys("clock-8x60", "mmfpb_a_clk"); - if (WARN(IS_ERR(mmfpb_a_clk), "mmfpb_a_clk not found (%ld)\n", - PTR_ERR(mmfpb_a_clk))) - return PTR_ERR(mmfpb_a_clk); - rc = clk_set_rate(mmfpb_a_clk, 64000000); - if (WARN(rc, "mmfpb_a_clk rate was not set (%d)\n", rc)) - return rc; - rc = clk_prepare_enable(mmfpb_a_clk); - if (WARN(rc, "mmfpb_a_clk not enabled (%d)\n", rc)) - return rc; - - return 0; -} - -struct clock_init_data msm8x60_clock_init_data __initdata = { - .table = msm_clocks_8x60, - .size = ARRAY_SIZE(msm_clocks_8x60), - .pre_init = msm8660_clock_pre_init, - .post_init = msm8660_clock_post_init, - .late_init = msm8660_clock_late_init, -}; diff --git a/arch/arm/mach-msm/clock-9615.c b/arch/arm/mach-msm/clock-9615.c deleted file mode 100644 index 6b218a19c790..000000000000 --- a/arch/arm/mach-msm/clock-9615.c +++ /dev/null @@ -1,1837 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "clock.h" -#include "clock-local.h" -#include "clock-voter.h" -#include "clock-rpm.h" -#include "devices.h" -#include "clock-pll.h" - -#define REG(off) (MSM_CLK_CTL_BASE + (off)) -#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off)) -#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off)) - -/* Peripheral clock registers. */ -#define CE1_HCLK_CTL_REG REG(0x2720) -#define CE1_CORE_CLK_CTL_REG REG(0x2724) -#define DMA_BAM_HCLK_CTL REG(0x25C0) -#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC) -#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0) -#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4) -#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8) - -#define CLK_HALT_MSS_KPSS_MISC_STATE_REG REG(0x2FDC) -#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8) -#define CLK_TEST_REG REG(0x2FA0) -#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n))) -#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n))) -#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1))) -#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1))) -#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1))) -#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1))) -#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1))) -#define PDM_CLK_NS_REG REG(0x2CC0) -#define BB_PLL_ENA_SC0_REG REG(0x34C0) - -#define BB_PLL0_L_VAL_REG REG(0x30C4) -#define BB_PLL0_M_VAL_REG REG(0x30C8) -#define BB_PLL0_MODE_REG REG(0x30C0) -#define BB_PLL0_N_VAL_REG REG(0x30CC) -#define BB_PLL0_STATUS_REG REG(0x30D8) -#define BB_PLL0_CONFIG_REG REG(0x30D4) -#define BB_PLL0_TEST_CTL_REG REG(0x30D0) - -#define BB_PLL8_L_VAL_REG REG(0x3144) -#define BB_PLL8_M_VAL_REG REG(0x3148) -#define BB_PLL8_MODE_REG REG(0x3140) -#define BB_PLL8_N_VAL_REG REG(0x314C) -#define BB_PLL8_STATUS_REG REG(0x3158) -#define BB_PLL8_CONFIG_REG REG(0x3154) -#define BB_PLL8_TEST_CTL_REG REG(0x3150) - -#define BB_PLL14_L_VAL_REG REG(0x31C4) -#define BB_PLL14_M_VAL_REG REG(0x31C8) -#define BB_PLL14_MODE_REG REG(0x31C0) -#define BB_PLL14_N_VAL_REG REG(0x31CC) -#define BB_PLL14_STATUS_REG REG(0x31D8) -#define BB_PLL14_CONFIG_REG REG(0x31D4) -#define BB_PLL14_TEST_CTL_REG REG(0x31D0) - -#define SC_PLL0_L_VAL_REG REG(0x3208) -#define SC_PLL0_M_VAL_REG REG(0x320C) -#define SC_PLL0_MODE_REG REG(0x3200) -#define SC_PLL0_N_VAL_REG REG(0x3210) -#define SC_PLL0_STATUS_REG REG(0x321C) -#define SC_PLL0_CONFIG_REG REG(0x3204) -#define SC_PLL0_TEST_CTL_REG REG(0x3218) - -#define PLLTEST_PAD_CFG_REG REG(0x2FA4) -#define PMEM_ACLK_CTL_REG REG(0x25A0) -#define RINGOSC_NS_REG REG(0x2DC0) -#define RINGOSC_STATUS_REG REG(0x2DCC) -#define RINGOSC_TCXO_CTL_REG REG(0x2DC4) -#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080) -#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1))) -#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1))) -#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1))) -#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1))) -#define USB_HS1_HCLK_CTL_REG REG(0x2900) -#define USB_HS1_RESET_REG REG(0x2910) -#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908) -#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C) -#define USB_HS1_SYS_CLK_MD_REG REG(0x36A0) -#define USB_HS1_SYS_CLK_NS_REG REG(0x36A4) -#define USB_HSIC_HCLK_CTL_REG REG(0x2920) -#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924) -#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928) -#define USB_HSIC_RESET_REG REG(0x2934) -#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48) -#define USB_HSIC_CLK_MD_REG REG(0x2B4C) -#define USB_HSIC_CLK_NS_REG REG(0x2B50) -#define USB_HSIC_SYSTEM_CLK_MD_REG REG(0x2B54) -#define USB_HSIC_SYSTEM_CLK_NS_REG REG(0x2B58) -#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628) - -/* Low-power Audio clock registers. */ -#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4) -#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8) -#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064) -#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060) -#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068) -#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070) -#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C) -#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074) -#define LCC_MI2S_MD_REG REG_LPA(0x004C) -#define LCC_MI2S_NS_REG REG_LPA(0x0048) -#define LCC_MI2S_STATUS_REG REG_LPA(0x0050) -#define LCC_PCM_MD_REG REG_LPA(0x0058) -#define LCC_PCM_NS_REG REG_LPA(0x0054) -#define LCC_PCM_STATUS_REG REG_LPA(0x005C) -#define LCC_SEC_PCM_MD_REG REG_LPA(0x00F4) -#define LCC_SEC_PCM_NS_REG REG_LPA(0x00F0) -#define LCC_SEC_PCM_STATUS_REG REG_LPA(0x00F8) -#define LCC_PLL0_STATUS_REG REG_LPA(0x0018) -#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C) -#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078) -#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080) -#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088) -#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084) -#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C) -#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC) -#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0) -#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4) -#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4) -#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4) - -#define GCC_APCS_CLK_DIAG REG_GCC(0x001C) - -/* MUX source input identifiers. */ -#define cxo_to_bb_mux 0 -#define pll8_to_bb_mux 3 -#define pll8_activeonly_to_bb_mux 3 -#define pll14_to_bb_mux 4 -#define gnd_to_bb_mux 6 -#define cxo_to_xo_mux 0 -#define gnd_to_xo_mux 3 -#define cxo_to_lpa_mux 1 -#define pll4_to_lpa_mux 2 -#define gnd_to_lpa_mux 6 - -/* Test Vector Macros */ -#define TEST_TYPE_PER_LS 1 -#define TEST_TYPE_PER_HS 2 -#define TEST_TYPE_LPA 5 -#define TEST_TYPE_LPA_HS 6 -#define TEST_TYPE_SHIFT 24 -#define TEST_CLK_SEL_MASK BM(23, 0) -#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s))) -#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS) -#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS) -#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA) -#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS) - -enum vdd_dig_levels { - VDD_DIG_NONE, - VDD_DIG_LOW, - VDD_DIG_NOMINAL, - VDD_DIG_HIGH, - VDD_DIG_NUM -}; - -static int set_vdd_dig(struct clk_vdd_class *vdd_class, int level) -{ - static const int vdd_corner[] = { - [VDD_DIG_NONE] = RPM_VREG_CORNER_NONE, - [VDD_DIG_LOW] = RPM_VREG_CORNER_LOW, - [VDD_DIG_NOMINAL] = RPM_VREG_CORNER_NOMINAL, - [VDD_DIG_HIGH] = RPM_VREG_CORNER_HIGH, - }; - - return rpm_vreg_set_voltage(RPM_VREG_ID_PM8018_VDD_DIG_CORNER, - RPM_VREG_VOTER3, vdd_corner[level], RPM_VREG_CORNER_HIGH, 1); -} - -static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig, VDD_DIG_NUM); - -#define VDD_DIG_FMAX_MAP1(l1, f1) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - }, \ - .num_fmax = VDD_DIG_NUM - -/* - * Clock Descriptions - */ - -DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000); - -static unsigned int soft_vote_pll0; - -static struct pll_vote_clk pll0_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(0), - .status_reg = BB_PLL0_STATUS_REG, - .status_mask = BIT(16), - .soft_vote = &soft_vote_pll0, - .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY, - .c = { - .parent = &cxo_clk.c, - .dbg_name = "pll0_clk", - .rate = 276000000, - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(pll0_clk.c), - }, -}; - -static struct pll_vote_clk pll0_activeonly_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(0), - .status_reg = BB_PLL0_STATUS_REG, - .status_mask = BIT(16), - .soft_vote = &soft_vote_pll0, - .soft_vote_mask = PLL_SOFT_VOTE_ACPU, - .c = { - .dbg_name = "pll0_activeonly_clk", - .rate = 276000000, - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(pll0_activeonly_clk.c), - }, -}; - -static struct pll_vote_clk pll4_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(4), - .status_reg = LCC_PLL0_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &cxo_clk.c, - .dbg_name = "pll4_clk", - .rate = 393216000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll4_clk.c), - }, -}; - -static unsigned int soft_vote_pll8; - -static struct pll_vote_clk pll8_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(8), - .status_reg = BB_PLL8_STATUS_REG, - .status_mask = BIT(16), - .soft_vote = &soft_vote_pll8, - .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY, - .c = { - .parent = &cxo_clk.c, - .dbg_name = "pll8_clk", - .rate = 384000000, - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(pll8_clk.c), - }, -}; - -static struct pll_vote_clk pll8_activeonly_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(8), - .status_reg = BB_PLL8_STATUS_REG, - .status_mask = BIT(16), - .soft_vote = &soft_vote_pll8, - .soft_vote_mask = PLL_SOFT_VOTE_ACPU, - .c = { - .dbg_name = "pll8_activeonly_clk", - .rate = 384000000, - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(pll8_activeonly_clk.c), - }, -}; - -static struct pll_clk pll9_activeonly_clk = { - .mode_reg = SC_PLL0_MODE_REG, - .c = { - .dbg_name = "pll9_activeonly_clk", - .rate = 440000000, - .ops = &clk_ops_local_pll, - CLK_INIT(pll9_activeonly_clk.c), - }, -}; - -static struct pll_vote_clk pll14_clk = { - .en_reg = BB_PLL_ENA_SC0_REG, - .en_mask = BIT(11), - .status_reg = BB_PLL14_STATUS_REG, - .status_mask = BIT(16), - .c = { - .parent = &cxo_clk.c, - .dbg_name = "pll14_clk", - .rate = 480000000, - .ops = &clk_ops_pll_vote, - CLK_INIT(pll14_clk.c), - }, -}; - -/* - * Peripheral Clocks - */ -#define CLK_GP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GPn_NS_REG(n), \ - .en_mask = BIT(9), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GPn_NS_REG(n), \ - .md_reg = GPn_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gp, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP1(LOW, 27000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gp[] = { - F_GP( 0, gnd, 1, 0, 0), - F_GP( 9600000, cxo, 2, 0, 0), - F_GP( 19200000, cxo, 1, 0, 0), - F_END -}; - -static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7); -static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6); -static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5); - -#define CLK_GSBI_UART(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_UART_APPS_NS_REG(n), \ - .md_reg = GSBIn_UART_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(31, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_uart, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_UART(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_uart[] = { - F_GSBI_UART( 0, gnd, 1, 0, 0), - F_GSBI_UART( 3686400, pll8, 2, 12, 625), - F_GSBI_UART( 7372800, pll8, 2, 24, 625), - F_GSBI_UART(14745600, pll8, 2, 48, 625), - F_GSBI_UART(16000000, pll8, 4, 1, 6), - F_GSBI_UART(24000000, pll8, 4, 1, 4), - F_GSBI_UART(32000000, pll8, 4, 1, 3), - F_GSBI_UART(40000000, pll8, 1, 5, 48), - F_GSBI_UART(46400000, pll8, 1, 29, 240), - F_GSBI_UART(48000000, pll8, 4, 1, 2), - F_GSBI_UART(51200000, pll8, 1, 2, 15), - F_GSBI_UART(56000000, pll8, 1, 7, 48), - F_GSBI_UART(58982400, pll8, 1, 96, 625), - F_GSBI_UART(64000000, pll8, 2, 1, 3), - F_END -}; - -static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10); -static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6); -static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2); -static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26); -static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22); - -#define CLK_GSBI_QUP(i, n, h_r, h_b) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = GSBIn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = h_r, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \ - .md_reg = GSBIn_QUP_APPS_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_gsbi_qup, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define F_GSBI_QUP(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_gsbi_qup[] = { - F_GSBI_QUP( 0, gnd, 1, 0, 0), - F_GSBI_QUP( 960000, cxo, 4, 1, 5), - F_GSBI_QUP( 4800000, cxo, 4, 0, 1), - F_GSBI_QUP( 9600000, cxo, 2, 0, 1), - F_GSBI_QUP(15058800, pll8, 1, 2, 51), - F_GSBI_QUP(24000000, pll8, 4, 1, 4), - F_GSBI_QUP(25600000, pll8, 1, 1, 15), - F_GSBI_QUP(48000000, pll8, 4, 1, 2), - F_GSBI_QUP(51200000, pll8, 1, 2, 15), - F_END -}; - -static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9); -static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4); -static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0); -static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24); -static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20); - -#define F_PDM(f, s, d) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \ - } -static struct clk_freq_tbl clk_tbl_pdm[] = { - F_PDM( 0, gnd, 1), - F_PDM(19200000, cxo, 1), - F_END -}; - -static struct rcg_clk pdm_clk = { - .b = { - .ctl_reg = PDM_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = PDM_CLK_NS_REG, - .reset_mask = BIT(12), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 3, - }, - .ns_reg = PDM_CLK_NS_REG, - .root_en_mask = BIT(11), - .ns_mask = BM(1, 0), - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_pdm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pdm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 19200000), - CLK_INIT(pdm_clk.c), - }, -}; - -static struct branch_clk pmem_clk = { - .b = { - .ctl_reg = PMEM_ACLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = PMEM_ACLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 20, - }, - .c = { - .dbg_name = "pmem_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmem_clk.c), - }, -}; - -#define F_PRNG(f, s) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - } -static struct clk_freq_tbl clk_tbl_prng[] = { - F_PRNG(32000000, pll8), - F_END -}; - -static struct rcg_clk prng_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(10), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 10, - }, - .set_rate = set_rate_nop, - .freq_tbl = clk_tbl_prng, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "prng_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 65000000), - CLK_INIT(prng_clk.c), - }, -}; - -#define CLK_SDC(name, n, h_b, f_table) \ - struct rcg_clk name = { \ - .b = { \ - .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \ - .en_mask = BIT(9), \ - .reset_reg = SDCn_RESET_REG(n), \ - .reset_mask = BIT(0), \ - .halt_reg = CLK_HALT_DFAB_STATE_REG, \ - .halt_bit = h_b, \ - }, \ - .ns_reg = SDCn_APPS_CLK_NS_REG(n), \ - .md_reg = SDCn_APPS_CLK_MD_REG(n), \ - .root_en_mask = BIT(11), \ - .ns_mask = (BM(23, 16) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = f_table, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #name, \ - .ops = &clk_ops_rcg, \ - VDD_DIG_FMAX_MAP2(LOW, 26000000, NOMINAL, 52000000), \ - CLK_INIT(name.c), \ - }, \ - } -#define F_SDC(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_sdc1_2[] = { - F_SDC( 0, gnd, 1, 0, 0), - F_SDC( 144300, cxo, 1, 1, 133), - F_SDC( 400000, pll8, 4, 1, 240), - F_SDC( 16000000, pll8, 4, 1, 6), - F_SDC( 17070000, pll8, 1, 2, 45), - F_SDC( 20210000, pll8, 1, 1, 19), - F_SDC( 24000000, pll8, 4, 1, 4), - F_SDC( 38400000, pll8, 2, 1, 5), - F_SDC( 48000000, pll8, 4, 1, 2), - F_SDC( 64000000, pll8, 3, 1, 2), - F_SDC( 76800000, pll8, 1, 1, 5), - F_END -}; - -static CLK_SDC(sdc1_clk, 1, 6, clk_tbl_sdc1_2); -static CLK_SDC(sdc2_clk, 2, 5, clk_tbl_sdc1_2); - -#define F_USB(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(16, m, 0, n), \ - .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \ - } -static struct clk_freq_tbl clk_tbl_usb[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(60000000, pll8, 1, 5, 32), - F_END -}; - -static struct clk_freq_tbl clk_tbl_usb_hs1_sys[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(60000000, pll8_activeonly, 1, 5, 32), - F_END -}; - -static struct clk_freq_tbl clk_tbl_usb_hsic_sys[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(64000000, pll8_activeonly, 1, 1, 6), - F_END -}; - -static struct rcg_clk usb_hs1_xcvr_clk = { - .b = { - .ctl_reg = USB_HS1_XCVR_FS_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HS1_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 0, - }, - .ns_reg = USB_HS1_XCVR_FS_CLK_NS_REG, - .md_reg = USB_HS1_XCVR_FS_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hs1_xcvr_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), - CLK_INIT(usb_hs1_xcvr_clk.c), - }, -}; - -static struct rcg_clk usb_hs1_sys_clk = { - .b = { - .ctl_reg = USB_HS1_SYS_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HS1_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 4, - }, - .ns_reg = USB_HS1_SYS_CLK_NS_REG, - .md_reg = USB_HS1_SYS_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb_hs1_sys, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hs1_sys_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(NOMINAL, 60000000), - CLK_INIT(usb_hs1_sys_clk.c), - }, -}; - -static struct rcg_clk usb_hsic_xcvr_clk = { - .b = { - .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HSIC_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 9, - }, - .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG, - .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_xcvr_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 60000000), - CLK_INIT(usb_hsic_xcvr_clk.c), - }, -}; - -static struct rcg_clk usb_hsic_sys_clk = { - .b = { - .ctl_reg = USB_HSIC_SYSTEM_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HSIC_RESET_REG, - .reset_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 7, - }, - .ns_reg = USB_HSIC_SYSTEM_CLK_NS_REG, - .md_reg = USB_HSIC_SYSTEM_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb_hsic_sys, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_sys_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 64000000), - CLK_INIT(usb_hsic_sys_clk.c), - }, -}; - -static struct clk_freq_tbl clk_tbl_usb_hsic[] = { - F_USB( 0, gnd, 1, 0, 0), - F_USB(480000000, pll14, 1, 0, 0), - F_END -}; - -static struct rcg_clk usb_hsic_clk = { - .b = { - .ctl_reg = USB_HSIC_CLK_NS_REG, - .en_mask = BIT(9), - .reset_reg = USB_HSIC_RESET_REG, - .reset_mask = BIT(0), - .halt_check = DELAY, - }, - .ns_reg = USB_HSIC_CLK_NS_REG, - .md_reg = USB_HSIC_CLK_MD_REG, - .root_en_mask = BIT(11), - .ns_mask = (BM(23, 16) | BM(6, 0)), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_usb_hsic, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "usb_hsic_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 480000000), - CLK_INIT(usb_hsic_clk.c), - }, -}; - -static struct branch_clk usb_hsic_hsio_cal_clk = { - .b = { - .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG, - .en_mask = BIT(0), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 8, - }, - .c = { - .parent = &cxo_clk.c, - .dbg_name = "usb_hsic_hsio_cal_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hsic_hsio_cal_clk.c), - }, -}; - -/* Fast Peripheral Bus Clocks */ -static struct branch_clk ce1_core_clk = { - .b = { - .ctl_reg = CE1_CORE_CLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = CE1_CORE_CLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 27, - }, - .c = { - .dbg_name = "ce1_core_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce1_core_clk.c), - }, -}; -static struct branch_clk ce1_p_clk = { - .b = { - .ctl_reg = CE1_HCLK_CTL_REG, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEC_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "ce1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(ce1_p_clk.c), - }, -}; - -static struct branch_clk dma_bam_p_clk = { - .b = { - .ctl_reg = DMA_BAM_HCLK_CTL, - .en_mask = BIT(4), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 12, - }, - .c = { - .dbg_name = "dma_bam_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(dma_bam_p_clk.c), - }, -}; - -static struct branch_clk gsbi1_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "gsbi1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi1_p_clk.c), - }, -}; - -static struct branch_clk gsbi2_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 7, - }, - .c = { - .dbg_name = "gsbi2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi2_p_clk.c), - }, -}; - -static struct branch_clk gsbi3_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(3), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEA_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "gsbi3_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi3_p_clk.c), - }, -}; - -static struct branch_clk gsbi4_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(4), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 27, - }, - .c = { - .dbg_name = "gsbi4_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi4_p_clk.c), - }, -}; - -static struct branch_clk gsbi5_p_clk = { - .b = { - .ctl_reg = GSBIn_HCLK_CTL_REG(5), - .en_mask = BIT(4), - .halt_reg = CLK_HALT_CFPB_STATEB_REG, - .halt_bit = 23, - }, - .c = { - .dbg_name = "gsbi5_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(gsbi5_p_clk.c), - }, -}; - -static struct branch_clk usb_hs1_p_clk = { - .b = { - .ctl_reg = USB_HS1_HCLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = USB_HS1_HCLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 1, - }, - .c = { - .dbg_name = "usb_hs1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hs1_p_clk.c), - }, -}; - -static struct branch_clk usb_hsic_p_clk = { - .b = { - .ctl_reg = USB_HSIC_HCLK_CTL_REG, - .en_mask = BIT(4), - .hwcg_reg = USB_HSIC_HCLK_CTL_REG, - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 3, - }, - .c = { - .dbg_name = "usb_hsic_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(usb_hsic_p_clk.c), - }, -}; - -static struct branch_clk sdc1_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(1), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(1), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 11, - }, - .c = { - .dbg_name = "sdc1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc1_p_clk.c), - }, -}; - -static struct branch_clk sdc2_p_clk = { - .b = { - .ctl_reg = SDCn_HCLK_CTL_REG(2), - .en_mask = BIT(4), - .hwcg_reg = SDCn_HCLK_CTL_REG(2), - .hwcg_mask = BIT(6), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 10, - }, - .c = { - .dbg_name = "sdc2_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(sdc2_p_clk.c), - }, -}; - -/* HW-Voteable Clocks */ -static struct branch_clk adm0_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(2), - .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 14, - }, - .c = { - .dbg_name = "adm0_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_clk.c), - }, -}; - -static struct branch_clk adm0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(3), - .halt_reg = CLK_HALT_MSS_KPSS_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 13, - }, - .c = { - .dbg_name = "adm0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(adm0_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb0_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(8), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 22, - }, - .c = { - .dbg_name = "pmic_arb0_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb0_p_clk.c), - }, -}; - -static struct branch_clk pmic_arb1_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(9), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 21, - }, - .c = { - .dbg_name = "pmic_arb1_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_arb1_p_clk.c), - }, -}; - -static struct branch_clk pmic_ssbi2_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(7), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 23, - }, - .c = { - .dbg_name = "pmic_ssbi2_clk", - .ops = &clk_ops_branch, - CLK_INIT(pmic_ssbi2_clk.c), - }, -}; - -static struct branch_clk rpm_msg_ram_p_clk = { - .b = { - .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG, - .en_mask = BIT(6), - .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG, - .halt_check = HALT_VOTED, - .halt_bit = 12, - }, - .c = { - .dbg_name = "rpm_msg_ram_p_clk", - .ops = &clk_ops_branch, - CLK_INIT(rpm_msg_ram_p_clk.c), - }, -}; - -/* - * Low Power Audio Clocks - */ -#define F_AIF_OSR(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD8(8, m, 0, n), \ - .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_aif_osr[] = { - F_AIF_OSR( 0, gnd, 1, 0, 0), - F_AIF_OSR( 512000, pll4, 4, 1, 192), - F_AIF_OSR( 768000, pll4, 4, 1, 128), - F_AIF_OSR( 1024000, pll4, 4, 1, 96), - F_AIF_OSR( 1536000, pll4, 4, 1, 64), - F_AIF_OSR( 2048000, pll4, 4, 1, 48), - F_AIF_OSR( 3072000, pll4, 4, 1, 32), - F_AIF_OSR( 4096000, pll4, 4, 1, 24), - F_AIF_OSR( 6144000, pll4, 4, 1, 16), - F_AIF_OSR( 8192000, pll4, 4, 1, 12), - F_AIF_OSR(12288000, pll4, 4, 1, 8), - F_AIF_OSR(24576000, pll4, 4, 1, 4), - F_END -}; - -#define CLK_AIF_OSR(i, ns, md, h_r) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(17), \ - .reset_reg = ns, \ - .reset_mask = BIT(19), \ - .halt_reg = h_r, \ - .halt_check = ENABLE, \ - .halt_bit = 1, \ - }, \ - .ns_reg = ns, \ - .md_reg = md, \ - .root_en_mask = BIT(9), \ - .ns_mask = (BM(31, 24) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_aif_osr, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - CLK_INIT(i##_clk.c), \ - }, \ - } -#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \ - struct rcg_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(21), \ - .reset_reg = ns, \ - .reset_mask = BIT(23), \ - .halt_reg = h_r, \ - .halt_check = ENABLE, \ - .halt_bit = 1, \ - }, \ - .ns_reg = ns, \ - .md_reg = md, \ - .root_en_mask = BIT(9), \ - .ns_mask = (BM(31, 24) | BM(6, 0)), \ - .mnd_en_mask = BIT(8), \ - .set_rate = set_rate_mnd, \ - .freq_tbl = clk_tbl_aif_osr, \ - .current_freq = &rcg_dummy_freq, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_rcg, \ - CLK_INIT(i##_clk.c), \ - }, \ - } - -#define CLK_AIF_BIT(i, ns, h_r) \ - struct cdiv_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(15), \ - .halt_reg = h_r, \ - .halt_check = DELAY, \ - }, \ - .ns_reg = ns, \ - .ext_mask = BIT(14), \ - .div_offset = 10, \ - .max_div = 16, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_cdiv, \ - CLK_INIT(i##_clk.c), \ - .rate = ULONG_MAX, \ - }, \ - } - -#define CLK_AIF_BIT_DIV(i, ns, h_r) \ - struct cdiv_clk i##_clk = { \ - .b = { \ - .ctl_reg = ns, \ - .en_mask = BIT(19), \ - .halt_reg = h_r, \ - .halt_check = DELAY, \ - }, \ - .ns_reg = ns, \ - .ext_mask = BIT(18), \ - .div_offset = 10, \ - .max_div = 256, \ - .c = { \ - .dbg_name = #i "_clk", \ - .ops = &clk_ops_cdiv, \ - CLK_INIT(i##_clk.c), \ - .rate = ULONG_MAX, \ - }, \ - } - -static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG, - LCC_MI2S_STATUS_REG); -static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG); - -static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG, - LCC_CODEC_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG); -static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG, - LCC_SPARE_I2S_MIC_STATUS_REG); - -static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG, - LCC_CODEC_I2S_SPKR_STATUS_REG); - -static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG); -static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG, - LCC_SPARE_I2S_SPKR_STATUS_REG); - -#define F_PCM(f, s, d, m, n) \ - { \ - .freq_hz = f, \ - .src_clk = &s##_clk.c, \ - .md_val = MD16(m, n), \ - .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \ - } -static struct clk_freq_tbl clk_tbl_pcm[] = { - { .ns_val = BIT(10) /* external input */ }, - F_PCM( 512000, pll4, 4, 1, 192), - F_PCM( 768000, pll4, 4, 1, 128), - F_PCM( 1024000, pll4, 4, 1, 96), - F_PCM( 1536000, pll4, 4, 1, 64), - F_PCM( 2048000, pll4, 4, 1, 48), - F_PCM( 3072000, pll4, 4, 1, 32), - F_PCM( 4096000, pll4, 4, 1, 24), - F_PCM( 6144000, pll4, 4, 1, 16), - F_PCM( 8192000, pll4, 4, 1, 12), - F_PCM(12288000, pll4, 4, 1, 8), - F_PCM(24576000, pll4, 4, 1, 4), - F_END -}; - -static struct rcg_clk pcm_clk = { - .b = { - .ctl_reg = LCC_PCM_NS_REG, - .en_mask = BIT(11), - .reset_reg = LCC_PCM_NS_REG, - .reset_mask = BIT(13), - .halt_reg = LCC_PCM_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_PCM_NS_REG, - .md_reg = LCC_PCM_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_pcm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "pcm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 24576000), - CLK_INIT(pcm_clk.c), - .rate = ULONG_MAX, - }, -}; - -static struct rcg_clk sec_pcm_clk = { - .b = { - .ctl_reg = LCC_SEC_PCM_NS_REG, - .en_mask = BIT(11), - .reset_reg = LCC_SEC_PCM_NS_REG, - .reset_mask = BIT(13), - .halt_reg = LCC_SEC_PCM_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_SEC_PCM_NS_REG, - .md_reg = LCC_SEC_PCM_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_pcm, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "sec_pcm_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 24576000), - CLK_INIT(sec_pcm_clk.c), - }, -}; - -static struct rcg_clk audio_slimbus_clk = { - .b = { - .ctl_reg = LCC_SLIMBUS_NS_REG, - .en_mask = BIT(10), - .reset_reg = LCC_AHBEX_BRANCH_CTL_REG, - .reset_mask = BIT(5), - .halt_reg = LCC_SLIMBUS_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 0, - }, - .ns_reg = LCC_SLIMBUS_NS_REG, - .md_reg = LCC_SLIMBUS_MD_REG, - .root_en_mask = BIT(9), - .ns_mask = (BM(31, 24) | BM(6, 0)), - .mnd_en_mask = BIT(8), - .set_rate = set_rate_mnd, - .freq_tbl = clk_tbl_aif_osr, - .current_freq = &rcg_dummy_freq, - .c = { - .dbg_name = "audio_slimbus_clk", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 24576000), - CLK_INIT(audio_slimbus_clk.c), - }, -}; - -static struct branch_clk sps_slimbus_clk = { - .b = { - .ctl_reg = LCC_SLIMBUS_NS_REG, - .en_mask = BIT(12), - .halt_reg = LCC_SLIMBUS_STATUS_REG, - .halt_check = ENABLE, - .halt_bit = 1, - }, - .c = { - .parent = &audio_slimbus_clk.c, - .dbg_name = "sps_slimbus_clk", - .ops = &clk_ops_branch, - CLK_INIT(sps_slimbus_clk.c), - }, -}; - -static struct branch_clk slimbus_xo_src_clk = { - .b = { - .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG, - .en_mask = BIT(2), - .halt_reg = CLK_HALT_DFAB_STATE_REG, - .halt_bit = 28, - }, - .c = { - .parent = &sps_slimbus_clk.c, - .dbg_name = "slimbus_xo_src_clk", - .ops = &clk_ops_branch, - CLK_INIT(slimbus_xo_src_clk.c), - }, -}; - -DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL); -DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL); -DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL); -DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL); -DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL); - -static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0); -static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0); -static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_msmbus_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_acpu_a_clk, &ebi1_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(sfab_msmbus_a_clk, &sfab_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(sfab_acpu_a_clk, &sfab_a_clk.c, LONG_MAX); - -#ifdef CONFIG_DEBUG_FS -struct measure_sel { - u32 test_vector; - struct clk *c; -}; - -static DEFINE_CLK_MEASURE(q6sw_clk); -static DEFINE_CLK_MEASURE(q6fw_clk); -static DEFINE_CLK_MEASURE(q6_func_clk); - -static struct measure_sel measure_mux[] = { - { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c }, - { TEST_PER_LS(0x12), &sdc1_p_clk.c }, - { TEST_PER_LS(0x13), &sdc1_clk.c }, - { TEST_PER_LS(0x14), &sdc2_p_clk.c }, - { TEST_PER_LS(0x15), &sdc2_clk.c }, - { TEST_PER_LS(0x1F), &gp0_clk.c }, - { TEST_PER_LS(0x20), &gp1_clk.c }, - { TEST_PER_LS(0x21), &gp2_clk.c }, - { TEST_PER_LS(0x26), &pmem_clk.c }, - { TEST_PER_LS(0x25), &dfab_clk.c }, - { TEST_PER_LS(0x25), &dfab_a_clk.c }, - { TEST_PER_LS(0x32), &dma_bam_p_clk.c }, - { TEST_PER_LS(0x33), &cfpb_clk.c }, - { TEST_PER_LS(0x33), &cfpb_a_clk.c }, - { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c }, - { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c }, - { TEST_PER_LS(0x41), &gsbi2_p_clk.c }, - { TEST_PER_LS(0x42), &gsbi2_uart_clk.c }, - { TEST_PER_LS(0x44), &gsbi2_qup_clk.c }, - { TEST_PER_LS(0x45), &gsbi3_p_clk.c }, - { TEST_PER_LS(0x46), &gsbi3_uart_clk.c }, - { TEST_PER_LS(0x48), &gsbi3_qup_clk.c }, - { TEST_PER_LS(0x49), &gsbi4_p_clk.c }, - { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c }, - { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c }, - { TEST_PER_LS(0x4D), &gsbi5_p_clk.c }, - { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c }, - { TEST_PER_LS(0x50), &gsbi5_qup_clk.c }, - { TEST_PER_LS(0x78), &sfpb_clk.c }, - { TEST_PER_LS(0x78), &sfpb_a_clk.c }, - { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c }, - { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c }, - { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c }, - { TEST_PER_LS(0x7D), &prng_clk.c }, - { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c }, - { TEST_PER_LS(0x80), &adm0_p_clk.c }, - { TEST_PER_LS(0x84), &usb_hs1_p_clk.c }, - { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c }, - { TEST_PER_LS(0x86), &usb_hsic_sys_clk.c }, - { TEST_PER_LS(0x87), &usb_hsic_p_clk.c }, - { TEST_PER_LS(0x88), &usb_hsic_xcvr_clk.c }, - { TEST_PER_LS(0x8B), &usb_hsic_hsio_cal_clk.c }, - { TEST_PER_LS(0x8D), &usb_hs1_sys_clk.c }, - { TEST_PER_LS(0x92), &ce1_p_clk.c }, - { TEST_PER_HS(0x18), &sfab_clk.c }, - { TEST_PER_HS(0x18), &sfab_a_clk.c }, - { TEST_PER_HS(0x26), &q6sw_clk }, - { TEST_PER_HS(0x27), &q6fw_clk }, - { TEST_PER_LS(0xA4), &ce1_core_clk.c }, - { TEST_PER_HS(0x2A), &adm0_clk.c }, - { TEST_PER_HS(0x34), &ebi1_clk.c }, - { TEST_PER_HS(0x34), &ebi1_a_clk.c }, - { TEST_PER_HS(0x3E), &usb_hsic_clk.c }, - { TEST_LPA(0x0F), &mi2s_bit_clk.c }, - { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c }, - { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c }, - { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c }, - { TEST_LPA(0x14), &pcm_clk.c }, - { TEST_LPA(0x1D), &audio_slimbus_clk.c }, - { TEST_LPA_HS(0x00), &q6_func_clk }, -}; - -static struct measure_sel *find_measure_sel(struct clk *c) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(measure_mux); i++) - if (measure_mux[i].c == c) - return &measure_mux[i]; - return NULL; -} - -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - int ret = 0; - u32 clk_sel; - struct measure_sel *p; - struct measure_clk *measure = to_measure_clk(c); - unsigned long flags; - - if (!parent) - return -EINVAL; - - p = find_measure_sel(parent); - if (!p) - return -EINVAL; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* - * Program the test vector, measurement period (sample_ticks) - * and scaling multiplier. - */ - measure->sample_ticks = 0x10000; - clk_sel = p->test_vector & TEST_CLK_SEL_MASK; - measure->multiplier = 1; - switch (p->test_vector >> TEST_TYPE_SHIFT) { - case TEST_TYPE_PER_LS: - writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_PER_HS: - writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG); - break; - case TEST_TYPE_LPA: - writel_relaxed(0x4030D98, CLK_TEST_REG); - writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), - LCC_CLK_LS_DEBUG_CFG_REG); - break; - case TEST_TYPE_LPA_HS: - writel_relaxed(0x402BC00, CLK_TEST_REG); - writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0), - LCC_CLK_HS_DEBUG_CFG_REG); - break; - default: - ret = -EPERM; - } - /* Make sure test vector is set before starting measurements. */ - mb(); - - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} - -/* Sample clock for 'ticks' reference clock ticks. */ -static unsigned long run_measurement(unsigned ticks) -{ - /* Stop counters and set the XO4 counter start value. */ - writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG); - - /* Wait for timer to become ready. */ - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0) - cpu_relax(); - - /* Run measurement and wait for completion. */ - writel_relaxed(BIT(28)|ticks, RINGOSC_TCXO_CTL_REG); - while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0) - cpu_relax(); - - /* Stop counters. */ - writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG); - - /* Return measured ticks. */ - return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0); -} - - -/* Perform a hardware rate measurement for a given clock. - FOR DEBUG USE ONLY: Measurements take ~15 ms! */ -static unsigned long measure_clk_get_rate(struct clk *c) -{ - unsigned long flags; - u32 pdm_reg_backup, ringosc_reg_backup; - u64 raw_count_short, raw_count_full; - struct measure_clk *measure = to_measure_clk(c); - unsigned ret; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Enable CXO/4 and RINGOSC branch and root. */ - pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG); - ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG); - writel_relaxed(0x2898, PDM_CLK_NS_REG); - writel_relaxed(0xA00, RINGOSC_NS_REG); - - /* - * The ring oscillator counter will not reset if the measured clock - * is not running. To detect this, run a short measurement before - * the full measurement. If the raw results of the two are the same - * then the clock must be off. - */ - - /* Run a short measurement. (~1 ms) */ - raw_count_short = run_measurement(0x1000); - /* Run a full measurement. (~14 ms) */ - raw_count_full = run_measurement(measure->sample_ticks); - - writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG); - writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG); - - /* Return 0 if the clock is off. */ - if (raw_count_full == raw_count_short) - ret = 0; - else { - /* Compute rate in Hz. */ - raw_count_full = ((raw_count_full * 10) + 15) * 4800000; - do_div(raw_count_full, ((measure->sample_ticks * 10) + 35)); - ret = (raw_count_full * measure->multiplier); - } - - /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */ - writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return ret; -} -#else /* !CONFIG_DEBUG_FS */ -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - return -EINVAL; -} - -static unsigned long measure_clk_get_rate(struct clk *c) -{ - return 0; -} -#endif /* CONFIG_DEBUG_FS */ - -static struct clk_ops clk_ops_measure = { - .set_parent = measure_clk_set_parent, - .get_rate = measure_clk_get_rate, -}; - -static struct measure_clk measure_clk = { - .c = { - .dbg_name = "measure_clk", - .ops = &clk_ops_measure, - CLK_INIT(measure_clk.c), - }, - .multiplier = 1, -}; - -static struct clk_lookup msm_clocks_9615[] = { - CLK_LOOKUP("xo", cxo_a_clk.c, ""), - CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"), - CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"), - CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"), - CLK_LOOKUP("pll0", pll0_clk.c, NULL), - CLK_LOOKUP("pll8", pll8_clk.c, NULL), - CLK_LOOKUP("pll14", pll14_clk.c, NULL), - - CLK_LOOKUP("pll0", pll0_activeonly_clk.c, "acpu"), - CLK_LOOKUP("pll8", pll8_activeonly_clk.c, "acpu"), - CLK_LOOKUP("pll9", pll9_activeonly_clk.c, "acpu"), - - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("bus_clk", cfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_clk.c, ""), - CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_clk.c, ""), - CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_clk.c, ""), - CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"), - CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"), - CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"), - CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"), - - CLK_LOOKUP("core_clk", gp0_clk.c, ""), - CLK_LOOKUP("core_clk", gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gp2_clk.c, ""), - - CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""), - - CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "spi_qsd.0"), - CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, ""), - CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.0"), - - CLK_LOOKUP("core_clk", pdm_clk.c, ""), - CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"), - CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, ""), - CLK_LOOKUP("core_clk", ce1_core_clk.c, ""), - CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL), - - CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "spi_qsd.0"), - CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.0"), - - CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"), - CLK_LOOKUP("core_clk", usb_hs1_sys_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_host"), - CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"), - CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_host"), - CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"), - CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_host"), - CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_clk.c, "msm_hsic_peripheral"), - CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_peripheral"), - CLK_LOOKUP("core_clk", usb_hsic_sys_clk.c, "msm_hsic_peripheral"), - CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_peripheral"), - CLK_LOOKUP("phy_clk", usb_hsic_clk.c, "msm_hsic_peripheral"), - - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"), - CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""), - CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""), - CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""), - CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""), - CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"), - CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"), - - CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c, - "msm-dai-q6.1"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.0"), - CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c, - "msm-dai-q6.5"), - CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c, - "msm-dai-q6.16384"), - CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c, - "msm-dai-q6.4"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"), - CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"), - CLK_LOOKUP("sec_pcm_clk", sec_pcm_clk.c, "msm-dai-q6.12"), - CLK_LOOKUP("sec_pcm_clk", sec_pcm_clk.c, "msm-dai-q6.13"), - - CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL), - CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"), - CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"), - CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"), - CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"), - CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""), - CLK_LOOKUP("bus_clk", sfab_acpu_a_clk.c, ""), - - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"), - CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"), - CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"), - - CLK_LOOKUP("q6sw_clk", q6sw_clk, NULL), - CLK_LOOKUP("q6fw_clk", q6fw_clk, NULL), - CLK_LOOKUP("q6_func_clk", q6_func_clk, NULL), -}; - -static struct pll_config_regs pll0_regs __initdata = { - .l_reg = BB_PLL0_L_VAL_REG, - .m_reg = BB_PLL0_M_VAL_REG, - .n_reg = BB_PLL0_N_VAL_REG, - .config_reg = BB_PLL0_CONFIG_REG, - .mode_reg = BB_PLL0_MODE_REG, -}; - -static struct pll_config pll0_config __initdata = { - .l = 0xE, - .m = 0x3, - .n = 0x8, - .vco_val = 0x0, - .vco_mask = BM(17, 16), - .pre_div_val = 0x0, - .pre_div_mask = BIT(19), - .post_div_val = 0x0, - .post_div_mask = BM(21, 20), - .mn_ena_val = BIT(22), - .mn_ena_mask = BIT(22), - .main_output_val = BIT(23), - .main_output_mask = BIT(23), -}; - -static struct pll_config_regs pll14_regs __initdata = { - .l_reg = BB_PLL14_L_VAL_REG, - .m_reg = BB_PLL14_M_VAL_REG, - .n_reg = BB_PLL14_N_VAL_REG, - .config_reg = BB_PLL14_CONFIG_REG, - .mode_reg = BB_PLL14_MODE_REG, -}; - -static struct pll_config pll14_config __initdata = { - .l = 0x19, - .m = 0x0, - .n = 0x1, - .vco_val = 0x0, - .vco_mask = BM(17, 16), - .pre_div_val = 0x0, - .pre_div_mask = BIT(19), - .post_div_val = 0x0, - .post_div_mask = BM(21, 20), - .main_output_val = BIT(23), - .main_output_mask = BIT(23), -}; - -/* - * Miscellaneous clock register initializations - */ -static void __init msm9615_clock_pre_init(void) -{ - u32 regval, is_pll_enabled, pll9_lval; - - clk_ops_local_pll.enable = sr_pll_clk_enable; - - /* Enable PDM CXO source. */ - regval = readl_relaxed(PDM_CLK_NS_REG); - writel_relaxed(BIT(13) | regval, PDM_CLK_NS_REG); - - /* Check if PLL0 is active */ - is_pll_enabled = readl_relaxed(BB_PLL0_STATUS_REG) & BIT(16); - - if (!is_pll_enabled) { - /* Enable AUX output */ - regval = readl_relaxed(BB_PLL0_TEST_CTL_REG); - regval |= BIT(12); - writel_relaxed(regval, BB_PLL0_TEST_CTL_REG); - - configure_sr_pll(&pll0_config, &pll0_regs, 1); - } - - /* Check if PLL14 is enabled in FSM mode */ - is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16); - - if (!is_pll_enabled) - configure_sr_pll(&pll14_config, &pll14_regs, 1); - else if (!(readl_relaxed(BB_PLL14_MODE_REG) & BIT(20))) - WARN(1, "PLL14 enabled in non-FSM mode!\n"); - - /* Detect PLL9 rate and fixup structure accordingly */ - pll9_lval = readl_relaxed(SC_PLL0_L_VAL_REG); - - if (pll9_lval == 0x1C) - pll9_activeonly_clk.c.rate = 550000000; - - /* Enable PLL4 source on the LPASS Primary PLL Mux */ - regval = readl_relaxed(LCC_PRI_PLL_CLK_CTL_REG); - writel_relaxed(regval | BIT(0), LCC_PRI_PLL_CLK_CTL_REG); - - /* - * Disable hardware clock gating for pmem_clk. Leaving it enabled - * results in the clock staying on. - */ - regval = readl_relaxed(PMEM_ACLK_CTL_REG); - regval &= ~BIT(6); - writel_relaxed(regval, PMEM_ACLK_CTL_REG); - - /* - * Disable hardware clock gating for dma_bam_p_clk, which does - * not have working support for the feature. - */ - regval = readl_relaxed(DMA_BAM_HCLK_CTL); - regval &= ~BIT(6); - writel_relaxed(regval, DMA_BAM_HCLK_CTL); -} - -static void __init msm9615_clock_post_init(void) -{ - /* Keep CXO on whenever APPS cpu is active */ - clk_prepare_enable(&cxo_a_clk.c); - - /* Initialize rates for clocks that only support one. */ - clk_set_rate(&pdm_clk.c, 19200000); - clk_set_rate(&prng_clk.c, 32000000); - clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000); - clk_set_rate(&usb_hs1_sys_clk.c, 60000000); - clk_set_rate(&usb_hsic_xcvr_clk.c, 60000000); - clk_set_rate(&usb_hsic_sys_clk.c, 64000000); - clk_set_rate(&usb_hsic_clk.c, 480000000); - - /* - * The halt status bits for PDM may be incorrect at boot. - * Toggle these clocks on and off to refresh them. - */ - clk_prepare_enable(&pdm_clk.c); - clk_disable_unprepare(&pdm_clk.c); -} - -struct clock_init_data msm9615_clock_init_data __initdata = { - .table = msm_clocks_9615, - .size = ARRAY_SIZE(msm_clocks_9615), - .pre_init = msm9615_clock_pre_init, - .post_init = msm9615_clock_post_init, -}; diff --git a/arch/arm/mach-msm/clock-9625.c b/arch/arm/mach-msm/clock-9625.c deleted file mode 100644 index 709aa5b308c6..000000000000 --- a/arch/arm/mach-msm/clock-9625.c +++ /dev/null @@ -1,2068 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "clock-local2.h" -#include "clock-pll.h" -#include "clock-rpm.h" -#include "clock-voter.h" -#include "clock.h" - -enum { - GCC_BASE, - APCS_BASE, - APCS_PLL_BASE, - N_BASES, -}; - -static void __iomem *virt_bases[N_BASES]; - -#define GCC_REG_BASE(x) (void __iomem *)(virt_bases[GCC_BASE] + (x)) -#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x)) -#define APCS_PLL_REG_BASE(x) (void __iomem *)(virt_bases[APCS_PLL_BASE] + (x)) - -/* GCC registers */ -#define GPLL0_MODE_REG 0x0000 -#define GPLL0_L_REG 0x0004 -#define GPLL0_M_REG 0x0008 -#define GPLL0_N_REG 0x000C -#define GPLL0_USER_CTL_REG 0x0010 -#define GPLL0_CONFIG_CTL_REG 0x0014 -#define GPLL0_TEST_CTL_REG 0x0018 -#define GPLL0_STATUS_REG 0x001C - -#define GPLL1_MODE_REG 0x0040 -#define GPLL1_L_REG 0x0044 -#define GPLL1_M_REG 0x0048 -#define GPLL1_N_REG 0x004C -#define GPLL1_USER_CTL_REG 0x0050 -#define GPLL1_CONFIG_CTL_REG 0x0054 -#define GPLL1_TEST_CTL_REG 0x0058 -#define GPLL1_STATUS_REG 0x005C - -#define GCC_DEBUG_CLK_CTL_REG 0x1880 -#define CLOCK_FRQ_MEASURE_CTL_REG 0x1884 -#define CLOCK_FRQ_MEASURE_STATUS_REG 0x1888 -#define GCC_PLLTEST_PAD_CFG_REG 0x188C -#define GCC_XO_DIV4_CBCR_REG 0x10C8 -#define APCS_GPLL_ENA_VOTE_REG 0x1480 -#define APCS_CLOCK_BRANCH_ENA_VOTE 0x1484 -#define APCS_CLOCK_SLEEP_ENA_VOTE 0x1488 - -#define APCS_CLK_DIAG_REG 0x001C - -#define APCS_CPU_PLL_MODE_REG 0x0000 -#define APCS_CPU_PLL_L_REG 0x0004 -#define APCS_CPU_PLL_M_REG 0x0008 -#define APCS_CPU_PLL_N_REG 0x000C -#define APCS_CPU_PLL_USER_CTL_REG 0x0010 -#define APCS_CPU_PLL_CONFIG_CTL_REG 0x0014 -#define APCS_CPU_PLL_TEST_CTL_REG 0x0018 -#define APCS_CPU_PLL_STATUS_REG 0x001C - -#define USB_HSIC_SYSTEM_CMD_RCGR 0x041C -#define USB_HSIC_XCVR_FS_CMD_RCGR 0x0424 -#define USB_HSIC_CMD_RCGR 0x0440 -#define USB_HSIC_IO_CAL_CMD_RCGR 0x0458 -#define USB_HS_SYSTEM_CMD_RCGR 0x0490 -#define SDCC2_APPS_CMD_RCGR 0x0510 -#define SDCC3_APPS_CMD_RCGR 0x0550 -#define BLSP1_QUP1_SPI_APPS_CMD_RCGR 0x064C -#define BLSP1_QUP1_I2C_APPS_CMD_RCGR 0x0660 -#define BLSP1_UART1_APPS_CMD_RCGR 0x068C -#define BLSP1_QUP2_SPI_APPS_CMD_RCGR 0x06CC -#define BLSP1_QUP2_I2C_APPS_CMD_RCGR 0x06E0 -#define BLSP1_UART2_APPS_CMD_RCGR 0x070C -#define BLSP1_QUP3_SPI_APPS_CMD_RCGR 0x074C -#define BLSP1_QUP3_I2C_APPS_CMD_RCGR 0x0760 -#define BLSP1_UART3_APPS_CMD_RCGR 0x078C -#define BLSP1_QUP4_SPI_APPS_CMD_RCGR 0x07CC -#define BLSP1_QUP4_I2C_APPS_CMD_RCGR 0x07E0 -#define BLSP1_UART4_APPS_CMD_RCGR 0x080C -#define BLSP1_QUP5_SPI_APPS_CMD_RCGR 0x084C -#define BLSP1_QUP5_I2C_APPS_CMD_RCGR 0x0860 -#define BLSP1_UART5_APPS_CMD_RCGR 0x088C -#define BLSP1_QUP6_SPI_APPS_CMD_RCGR 0x08CC -#define BLSP1_QUP6_I2C_APPS_CMD_RCGR 0x08E0 -#define BLSP1_UART6_APPS_CMD_RCGR 0x090C -#define PDM2_CMD_RCGR 0x0CD0 -#define CE1_CMD_RCGR 0x1050 -#define GP1_CMD_RCGR 0x1904 -#define GP2_CMD_RCGR 0x1944 -#define GP3_CMD_RCGR 0x1984 -#define QPIC_CMD_RCGR 0x1A50 -#define IPA_CMD_RCGR 0x1A90 - -#define USB_HS_HSIC_BCR 0x0400 -#define USB_HS_BCR 0x0480 -#define SDCC2_BCR 0x0500 -#define SDCC3_BCR 0x0540 -#define BLSP1_BCR 0x05C0 -#define BLSP1_QUP1_BCR 0x0640 -#define BLSP1_UART1_BCR 0x0680 -#define BLSP1_QUP2_BCR 0x06C0 -#define BLSP1_UART2_BCR 0x0700 -#define BLSP1_QUP3_BCR 0x0740 -#define BLSP1_UART3_BCR 0x0780 -#define BLSP1_QUP4_BCR 0x07C0 -#define BLSP1_UART4_BCR 0x0800 -#define BLSP1_QUP5_BCR 0x0840 -#define BLSP1_UART5_BCR 0x0880 -#define BLSP1_QUP6_BCR 0x08C0 -#define BLSP1_UART6_BCR 0x0900 -#define PDM_BCR 0x0CC0 -#define PRNG_BCR 0x0D00 -#define BAM_DMA_BCR 0x0D40 -#define BOOT_ROM_BCR 0x0E00 -#define CE1_BCR 0x1040 -#define QPIC_BCR 0x1040 -#define IPA_BCR 0x1A80 - - -#define SYS_NOC_IPA_AXI_CBCR 0x0128 -#define USB_HSIC_AHB_CBCR 0x0408 -#define USB_HSIC_SYSTEM_CBCR 0x040C -#define USB_HSIC_CBCR 0x0410 -#define USB_HSIC_IO_CAL_CBCR 0x0414 -#define USB_HSIC_IO_CAL_SLEEP_CBCR 0x0418 -#define USB_HSIC_XCVR_FS_CBCR 0x042C -#define USB_HS_SYSTEM_CBCR 0x0484 -#define USB_HS_AHB_CBCR 0x0488 -#define SDCC2_APPS_CBCR 0x0504 -#define SDCC2_AHB_CBCR 0x0508 -#define SDCC3_APPS_CBCR 0x0544 -#define SDCC3_AHB_CBCR 0x0548 -#define BLSP1_AHB_CBCR 0x05C4 -#define BLSP1_QUP1_SPI_APPS_CBCR 0x0644 -#define BLSP1_QUP1_I2C_APPS_CBCR 0x0648 -#define BLSP1_UART1_APPS_CBCR 0x0684 -#define BLSP1_UART1_SIM_CBCR 0x0688 -#define BLSP1_QUP2_SPI_APPS_CBCR 0x06C4 -#define BLSP1_QUP2_I2C_APPS_CBCR 0x06C8 -#define BLSP1_UART2_APPS_CBCR 0x0704 -#define BLSP1_UART2_SIM_CBCR 0x0708 -#define BLSP1_QUP3_SPI_APPS_CBCR 0x0744 -#define BLSP1_QUP3_I2C_APPS_CBCR 0x0748 -#define BLSP1_UART3_APPS_CBCR 0x0784 -#define BLSP1_UART3_SIM_CBCR 0x0788 -#define BLSP1_QUP4_SPI_APPS_CBCR 0x07C4 -#define BLSP1_QUP4_I2C_APPS_CBCR 0x07C8 -#define BLSP1_UART4_APPS_CBCR 0x0804 -#define BLSP1_UART4_SIM_CBCR 0x0808 -#define BLSP1_QUP5_SPI_APPS_CBCR 0x0844 -#define BLSP1_QUP5_I2C_APPS_CBCR 0x0848 -#define BLSP1_UART5_APPS_CBCR 0x0884 -#define BLSP1_UART5_SIM_CBCR 0x0888 -#define BLSP1_QUP6_SPI_APPS_CBCR 0x08C4 -#define BLSP1_QUP6_I2C_APPS_CBCR 0x08C8 -#define BLSP1_UART6_APPS_CBCR 0x0904 -#define BLSP1_UART6_SIM_CBCR 0x0908 -#define BOOT_ROM_AHB_CBCR 0x0E04 -#define PDM_AHB_CBCR 0x0CC4 -#define PDM_XO4_CBCR 0x0CC8 -#define PDM_AHB_CBCR 0x0CC4 -#define PDM_XO4_CBCR 0x0CC8 -#define PDM2_CBCR 0x0CCC -#define PRNG_AHB_CBCR 0x0D04 -#define BAM_DMA_AHB_CBCR 0x0D44 -#define BAM_DMA_INACTIVITY_TIMERS_CBCR 0x0D48 -#define MSG_RAM_AHB_CBCR 0x0E44 -#define CE1_CBCR 0x1044 -#define CE1_AXI_CBCR 0x1048 -#define CE1_AHB_CBCR 0x104C -#define GCC_AHB_CBCR 0x10C0 -#define GP1_CBCR 0x1900 -#define GP2_CBCR 0x1940 -#define GP3_CBCR 0x1980 -#define QPIC_CBCR 0x1A44 -#define QPIC_AHB_CBCR 0x1A48 -#define IPA_CBCR 0x1A84 -#define IPA_CNOC_CBCR 0x1A88 -#define IPA_SLEEP_CBCR 0x1A8C - -/* Mux source select values */ -#define cxo_source_val 0 -#define gpll0_source_val 1 -#define gpll1_hsic_source_val 4 -#define gnd_source_val 5 - -#define F_GCC_GND \ - { \ - .freq_hz = 0, \ - .m_val = 0, \ - .n_val = 0, \ - .div_src_val = BVAL(4, 0, 1) | BVAL(10, 8, gnd_source_val), \ - } - -#define F(f, s, div, m, n) \ - { \ - .freq_hz = (f), \ - .src_clk = &s##_clk_src.c, \ - .m_val = (m), \ - .n_val = ~((n)-(m)) * !!(n), \ - .d_val = ~(n),\ - .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \ - | BVAL(10, 8, s##_source_val), \ - } - -#define F_HSIC(f, s, div, m, n) \ - { \ - .freq_hz = (f), \ - .src_clk = &s##_clk_src.c, \ - .m_val = (m), \ - .n_val = ~((n)-(m)) * !!(n), \ - .d_val = ~(n),\ - .div_src_val = BVAL(4, 0, (int)(2*(div) - 1)) \ - | BVAL(10, 8, s##_hsic_source_val), \ - } - -#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \ - { \ - .freq_hz = (f), \ - .l_val = (l), \ - .m_val = (m), \ - .n_val = (n), \ - .pre_div_val = BVAL(14, 12, (pre_div)), \ - .post_div_val = BVAL(9, 8, (post_div)), \ - .vco_val = BVAL(21, 20, (vco)), \ - } - -#define VDD_DIG_FMAX_MAP1(l1, f1) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - }, \ - .num_fmax = VDD_DIG_NUM -#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \ - .vdd_class = &vdd_dig, \ - .fmax = (unsigned long[VDD_DIG_NUM]) { \ - [VDD_DIG_##l1] = (f1), \ - [VDD_DIG_##l2] = (f2), \ - [VDD_DIG_##l3] = (f3), \ - }, \ - .num_fmax = VDD_DIG_NUM - -enum vdd_dig_levels { - VDD_DIG_NONE, - VDD_DIG_LOW, - VDD_DIG_NOMINAL, - VDD_DIG_HIGH, - VDD_DIG_NUM -}; - -static int vdd_corner[] = { - RPM_REGULATOR_CORNER_NONE, /* VDD_DIG_NONE */ - RPM_REGULATOR_CORNER_SVS_SOC, /* VDD_DIG_LOW */ - RPM_REGULATOR_CORNER_NORMAL, /* VDD_DIG_NOMINAL */ - RPM_REGULATOR_CORNER_SUPER_TURBO, /* VDD_DIG_HIGH */ -}; - -static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner, NULL); - -#define RPM_MISC_CLK_TYPE 0x306b6c63 -#define RPM_BUS_CLK_TYPE 0x316b6c63 -#define RPM_MEM_CLK_TYPE 0x326b6c63 -#define RPM_QPIC_CLK_TYPE 0x63697071 - -#define RPM_SMD_KEY_ENABLE 0x62616E45 - -#define CXO_ID 0x0 -#define QDSS_ID 0x1 - -#define PNOC_ID 0x0 -#define SNOC_ID 0x1 -#define CNOC_ID 0x2 - -#define BIMC_ID 0x0 - -#define QPIC_ID 0x0 - -#define D0_ID 1 -#define D1_ID 2 -#define A0_ID 3 -#define A1_ID 4 -#define A2_ID 5 - -DEFINE_CLK_RPM_SMD_BRANCH(cxo_clk_src, cxo_a_clk_src, - RPM_MISC_CLK_TYPE, CXO_ID, 19200000); - -DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL); -DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL); -DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL); - -DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL); - -DEFINE_CLK_RPM_SMD(qpic_clk, qpic_a_clk, RPM_QPIC_CLK_TYPE, QPIC_ID, NULL); - -DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID); - -DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID); - -DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID); -DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID); - -static unsigned int soft_vote_gpll0; - -static struct pll_vote_clk gpll0_clk_src = { - .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG, - .en_mask = BIT(0), - .status_reg = (void __iomem *)GPLL0_STATUS_REG, - .status_mask = BIT(17), - .soft_vote = &soft_vote_gpll0, - .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .rate = 600000000, - .dbg_name = "gpll0_clk_src", - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(gpll0_clk_src.c), - }, -}; - -static struct pll_vote_clk gpll0_activeonly_clk_src = { - .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG, - .en_mask = BIT(0), - .status_reg = (void __iomem *)GPLL0_STATUS_REG, - .status_mask = BIT(17), - .soft_vote = &soft_vote_gpll0, - .soft_vote_mask = PLL_SOFT_VOTE_ACPU, - .base = &virt_bases[GCC_BASE], - .c = { - .rate = 600000000, - .dbg_name = "gpll0_activeonly_clk_src", - .ops = &clk_ops_pll_acpu_vote, - CLK_INIT(gpll0_activeonly_clk_src.c), - }, -}; - -static struct pll_vote_clk gpll1_clk_src = { - .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE_REG, - .en_mask = BIT(1), - .status_reg = (void __iomem *)GPLL1_STATUS_REG, - .status_mask = BIT(17), - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .rate = 480000000, - .dbg_name = "gpll1_clk_src", - .ops = &clk_ops_pll_vote, - CLK_INIT(gpll1_clk_src.c), - }, -}; - -static struct pll_freq_tbl apcs_pll_freq[] = { - F_APCS_PLL(748800000, 0x27, 0x0, 0x1, 0x0, 0x0, 0x0), - F_APCS_PLL(998400000, 0x34, 0x0, 0x1, 0x0, 0x0, 0x0), - PLL_F_END -}; - -static struct pll_clk apcspll_clk_src = { - .mode_reg = (void __iomem *)APCS_CPU_PLL_MODE_REG, - .l_reg = (void __iomem *)APCS_CPU_PLL_L_REG, - .m_reg = (void __iomem *)APCS_CPU_PLL_M_REG, - .n_reg = (void __iomem *)APCS_CPU_PLL_N_REG, - .config_reg = (void __iomem *)APCS_CPU_PLL_USER_CTL_REG, - .status_reg = (void __iomem *)APCS_CPU_PLL_STATUS_REG, - .freq_tbl = apcs_pll_freq, - .masks = { - .vco_mask = BM(21, 20), - .pre_div_mask = BM(14, 12), - .post_div_mask = BM(9, 8), - .mn_en_mask = BIT(24), - .main_output_mask = BIT(0), - }, - .base = &virt_bases[APCS_PLL_BASE], - .c = { - .parent = &cxo_a_clk_src.c, - .dbg_name = "apcspll_clk_src", - .ops = &clk_ops_local_pll, - CLK_INIT(apcspll_clk_src.c), - }, -}; - -static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX); - -static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX); - -static DEFINE_CLK_VOTER(pnoc_sdcc2_clk, &pnoc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(pnoc_sdcc3_clk, &pnoc_clk.c, LONG_MAX); -static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX); - -static DEFINE_CLK_BRANCH_VOTER(cxo_lpm_clk, &cxo_clk_src.c); - -static struct clk_freq_tbl ftbl_gcc_ipa_clk[] = { - F( 50000000, gpll0, 12, 0, 0), - F( 92310000, gpll0, 6.5, 0, 0), - F(100000000, gpll0, 6, 0, 0), - F_END -}; - -static struct rcg_clk ipa_clk_src = { - .cmd_rcgr_reg = IPA_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_ipa_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "ipa_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000), - CLK_INIT(ipa_clk_src.c) - }, -}; - -static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = { - F(19200000, cxo, 1, 0, 0), - F(50000000, gpll0, 12, 0, 0), - F_END -}; - -static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup1_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c), - }, -}; - -static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup2_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c), - }, -}; - -static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup3_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c), - }, -}; - -static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup4_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c), - }, -}; - -static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup5_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c), - }, -}; - -static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup6_i2c_apps_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 50000000), - CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = { - F( 960000, cxo, 10, 1, 2), - F( 4800000, cxo, 4, 0, 0), - F( 9600000, cxo, 2, 0, 0), - F(15000000, gpll0, 10, 1, 4), - F(19200000, cxo, 1, 0, 0), - F(25000000, gpll0, 12, 1, 2), - F(50000000, gpll0, 12, 0, 0), - F_END -}; - -static struct rcg_clk blsp1_qup1_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup1_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup1_spi_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_qup2_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup2_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup2_spi_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_qup3_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup3_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup3_spi_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_qup4_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup4_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup4_spi_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_qup5_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup5_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup5_spi_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_qup6_spi_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_qup6_spi_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000), - CLK_INIT(blsp1_qup6_spi_apps_clk_src.c) - }, -}; - -static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = { - F_GCC_GND, - F( 3686400, gpll0, 1, 96, 15625), - F( 7372800, gpll0, 1, 192, 15625), - F(14745600, gpll0, 1, 384, 15625), - F(16000000, gpll0, 5, 2, 15), - F(19200000, cxo, 1, 0, 0), - F(24000000, gpll0, 5, 1, 5), - F(32000000, gpll0, 1, 4, 75), - F(40000000, gpll0, 15, 0, 0), - F(46400000, gpll0, 1, 29, 375), - F(48000000, gpll0, 12.5, 0, 0), - F(51200000, gpll0, 1, 32, 375), - F(56000000, gpll0, 1, 7, 75), - F(58982400, gpll0, 1, 1536, 15625), - F(60000000, gpll0, 10, 0, 0), - F_END -}; - -static struct rcg_clk blsp1_uart1_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart1_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart1_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_uart2_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart2_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart2_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_uart3_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart3_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart3_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_uart4_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart4_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart4_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_uart5_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart5_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart5_apps_clk_src.c) - }, -}; - -static struct rcg_clk blsp1_uart6_apps_clk_src = { - .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "blsp1_uart6_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000), - CLK_INIT(blsp1_uart6_apps_clk_src.c) - }, -}; - -static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = { - F( 50000000, gpll0, 12, 0, 0), - F(100000000, gpll0, 6, 0, 0), - F_END -}; - -static struct rcg_clk ce1_clk_src = { - .cmd_rcgr_reg = CE1_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_ce1_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "ce1_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000), - CLK_INIT(ce1_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_gp_clk[] = { - F(19200000, cxo, 1, 0, 0), - F_END -}; - -static struct rcg_clk gp1_clk_src = { - .cmd_rcgr_reg = GP1_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_gp_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gp1_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), - CLK_INIT(gp1_clk_src.c) - }, -}; - -static struct rcg_clk gp2_clk_src = { - .cmd_rcgr_reg = GP2_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_gp_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gp2_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), - CLK_INIT(gp2_clk_src.c) - }, -}; - -static struct rcg_clk gp3_clk_src = { - .cmd_rcgr_reg = GP3_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_gp_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gp3_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), - CLK_INIT(gp3_clk_src.c) - }, -}; - -static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = { - F(60000000, gpll0, 10, 0, 0), - F_END -}; - -static struct rcg_clk pdm2_clk_src = { - .cmd_rcgr_reg = PDM2_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_pdm2_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "pdm2_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 60000000), - CLK_INIT(pdm2_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_sdcc2_apps_clk[] = { - F( 144000, cxo, 16, 3, 25), - F( 400000, cxo, 12, 1, 4), - F( 20000000, gpll0, 15, 1, 2), - F( 25000000, gpll0, 12, 1, 2), - F( 50000000, gpll0, 12, 0, 0), - F(100000000, gpll0, 6, 0, 0), - F(200000000, gpll0, 3, 0, 0), - F_END -}; - -static struct clk_freq_tbl ftbl_gcc_sdcc3_apps_clk[] = { - F( 144000, cxo, 16, 3, 25), - F( 400000, cxo, 12, 1, 4), - F( 20000000, gpll0, 15, 1, 2), - F( 25000000, gpll0, 12, 1, 2), - F( 50000000, gpll0, 12, 0, 0), - F(100000000, gpll0, 6, 0, 0), - F_END -}; - -static struct rcg_clk sdcc2_apps_clk_src = { - .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_sdcc2_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "sdcc2_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), - CLK_INIT(sdcc2_apps_clk_src.c) - }, -}; - -static struct rcg_clk sdcc3_apps_clk_src = { - .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR, - .set_rate = set_rate_mnd, - .freq_tbl = ftbl_gcc_sdcc3_apps_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "sdcc3_apps_clk_src", - .ops = &clk_ops_rcg_mnd, - VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000), - CLK_INIT(sdcc3_apps_clk_src.c) - }, -}; - -static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = { - F(75000000, gpll0, 8, 0, 0), - F_END -}; - -static struct rcg_clk usb_hs_system_clk_src = { - .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_usb_hs_system_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "usb_hs_system_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000), - CLK_INIT(usb_hs_system_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = { - F_HSIC(480000000, gpll1, 1, 0, 0), - F_END -}; - -static struct rcg_clk usb_hsic_clk_src = { - .cmd_rcgr_reg = USB_HSIC_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_usb_hsic_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "usb_hsic_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 480000000), - CLK_INIT(usb_hsic_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = { - F(9600000, cxo, 2, 0, 0), - F_END -}; - -static struct rcg_clk usb_hsic_io_cal_clk_src = { - .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "usb_hsic_io_cal_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 9600000), - CLK_INIT(usb_hsic_io_cal_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = { - F(75000000, gpll0, 8, 0, 0), - F_END -}; - -static struct rcg_clk usb_hsic_system_clk_src = { - .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_usb_hsic_system_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "usb_hsic_system_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP2(LOW, 60000000, NOMINAL, 75000000), - CLK_INIT(usb_hsic_system_clk_src.c), - }, -}; - -static struct clk_freq_tbl ftbl_gcc_usb_hsic_xcvr_fs_clk[] = { - F(60000000, gpll0, 10, 0, 0), - F_END -}; - -static struct rcg_clk usb_hsic_xcvr_fs_clk_src = { - .cmd_rcgr_reg = USB_HSIC_XCVR_FS_CMD_RCGR, - .set_rate = set_rate_hid, - .freq_tbl = ftbl_gcc_usb_hsic_xcvr_fs_clk, - .current_freq = &rcg_dummy_freq, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "usb_hsic_xcvr_fs_clk_src", - .ops = &clk_ops_rcg, - VDD_DIG_FMAX_MAP1(LOW, 60000000), - CLK_INIT(usb_hsic_xcvr_fs_clk_src.c), - }, -}; - -static struct local_vote_clk gcc_bam_dma_ahb_clk = { - .cbcr_reg = BAM_DMA_AHB_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(12), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_bam_dma_ahb_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_bam_dma_ahb_clk.c), - }, -}; - -static struct local_vote_clk gcc_bam_dma_inactivity_timers_clk = { - .cbcr_reg = BAM_DMA_INACTIVITY_TIMERS_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(11), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_bam_dma_inactivity_timers_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_bam_dma_inactivity_timers_clk.c), - }, -}; - -static struct local_vote_clk gcc_blsp1_ahb_clk = { - .cbcr_reg = BLSP1_AHB_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(17), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_blsp1_ahb_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_blsp1_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup1_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup1_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup2_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup2_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup3_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup3_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup4_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup4_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup5_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup5_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = { - .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &cxo_clk_src.c, - .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = { - .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_qup6_spi_apps_clk_src.c, - .dbg_name = "gcc_blsp1_qup6_spi_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart1_apps_clk = { - .cbcr_reg = BLSP1_UART1_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart1_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart1_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart1_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart2_apps_clk = { - .cbcr_reg = BLSP1_UART2_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart2_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart2_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart2_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart3_apps_clk = { - .cbcr_reg = BLSP1_UART3_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart3_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart3_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart3_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart4_apps_clk = { - .cbcr_reg = BLSP1_UART4_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart4_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart4_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart4_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart5_apps_clk = { - .cbcr_reg = BLSP1_UART5_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart5_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart5_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart5_apps_clk.c), - }, -}; - -static struct branch_clk gcc_blsp1_uart6_apps_clk = { - .cbcr_reg = BLSP1_UART6_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &blsp1_uart6_apps_clk_src.c, - .dbg_name = "gcc_blsp1_uart6_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_blsp1_uart6_apps_clk.c), - }, -}; - -static struct local_vote_clk gcc_boot_rom_ahb_clk = { - .cbcr_reg = BOOT_ROM_AHB_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(10), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_boot_rom_ahb_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_boot_rom_ahb_clk.c), - }, -}; - -static struct local_vote_clk gcc_ce1_ahb_clk = { - .cbcr_reg = CE1_AHB_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(3), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_ce1_ahb_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_ce1_ahb_clk.c), - }, -}; - -static struct local_vote_clk gcc_ce1_axi_clk = { - .cbcr_reg = CE1_AXI_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(4), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_ce1_axi_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_ce1_axi_clk.c), - }, -}; - -static struct local_vote_clk gcc_ce1_clk = { - .cbcr_reg = CE1_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(5), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_ce1_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_ce1_clk.c), - }, -}; - -static struct branch_clk gcc_gp1_clk = { - .cbcr_reg = GP1_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &gp1_clk_src.c, - .dbg_name = "gcc_gp1_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_gp1_clk.c), - }, -}; - -static struct branch_clk gcc_gp2_clk = { - .cbcr_reg = GP2_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &gp2_clk_src.c, - .dbg_name = "gcc_gp2_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_gp2_clk.c), - }, -}; - -static struct branch_clk gcc_gp3_clk = { - .cbcr_reg = GP3_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &gp3_clk_src.c, - .dbg_name = "gcc_gp3_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_gp3_clk.c), - }, -}; - -static struct branch_clk gcc_ipa_clk = { - .cbcr_reg = IPA_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &ipa_clk_src.c, - .dbg_name = "gcc_ipa_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_ipa_clk.c), - }, -}; - -static struct branch_clk gcc_ipa_cnoc_clk = { - .cbcr_reg = IPA_CNOC_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_ipa_cnoc_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_ipa_cnoc_clk.c), - }, -}; - -static struct branch_clk gcc_ipa_sleep_clk = { - .cbcr_reg = IPA_SLEEP_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_ipa_sleep_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_ipa_sleep_clk.c), - }, -}; - -static struct branch_clk gcc_pdm2_clk = { - .cbcr_reg = PDM2_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &pdm2_clk_src.c, - .dbg_name = "gcc_pdm2_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_pdm2_clk.c), - }, -}; - -static struct branch_clk gcc_pdm_ahb_clk = { - .cbcr_reg = PDM_AHB_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_pdm_ahb_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_pdm_ahb_clk.c), - }, -}; - -static struct local_vote_clk gcc_prng_ahb_clk = { - .cbcr_reg = PRNG_AHB_CBCR, - .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE, - .en_mask = BIT(13), - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_prng_ahb_clk", - .ops = &clk_ops_vote, - CLK_INIT(gcc_prng_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_sdcc2_ahb_clk = { - .cbcr_reg = SDCC2_AHB_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_sdcc2_ahb_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_sdcc2_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_sdcc2_apps_clk = { - .cbcr_reg = SDCC2_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &sdcc2_apps_clk_src.c, - .dbg_name = "gcc_sdcc2_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_sdcc2_apps_clk.c), - }, -}; - -static struct branch_clk gcc_sdcc3_ahb_clk = { - .cbcr_reg = SDCC3_AHB_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_sdcc3_ahb_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_sdcc3_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_sdcc3_apps_clk = { - .cbcr_reg = SDCC3_APPS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &sdcc3_apps_clk_src.c, - .dbg_name = "gcc_sdcc3_apps_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_sdcc3_apps_clk.c), - }, -}; - -static struct branch_clk gcc_sys_noc_ipa_axi_clk = { - .cbcr_reg = SYS_NOC_IPA_AXI_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &ipa_clk_src.c, - .dbg_name = "gcc_sys_noc_ipa_axi_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_sys_noc_ipa_axi_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hs_ahb_clk = { - .cbcr_reg = USB_HS_AHB_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_usb_hs_ahb_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hs_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hs_system_clk = { - .cbcr_reg = USB_HS_SYSTEM_CBCR, - .bcr_reg = USB_HS_BCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &usb_hs_system_clk_src.c, - .dbg_name = "gcc_usb_hs_system_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hs_system_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_ahb_clk = { - .cbcr_reg = USB_HSIC_AHB_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_usb_hsic_ahb_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_ahb_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_clk = { - .cbcr_reg = USB_HSIC_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &usb_hsic_clk_src.c, - .dbg_name = "gcc_usb_hsic_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_io_cal_clk = { - .cbcr_reg = USB_HSIC_IO_CAL_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &usb_hsic_io_cal_clk_src.c, - .dbg_name = "gcc_usb_hsic_io_cal_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_io_cal_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_io_cal_sleep_clk = { - .cbcr_reg = USB_HSIC_IO_CAL_SLEEP_CBCR, - .has_sibling = 1, - .base = &virt_bases[GCC_BASE], - .c = { - .dbg_name = "gcc_usb_hsic_io_cal_sleep_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_io_cal_sleep_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_system_clk = { - .cbcr_reg = USB_HSIC_SYSTEM_CBCR, - .bcr_reg = USB_HS_HSIC_BCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &usb_hsic_system_clk_src.c, - .dbg_name = "gcc_usb_hsic_system_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_system_clk.c), - }, -}; - -static struct branch_clk gcc_usb_hsic_xcvr_fs_clk = { - .cbcr_reg = USB_HSIC_XCVR_FS_CBCR, - .has_sibling = 0, - .base = &virt_bases[GCC_BASE], - .c = { - .parent = &usb_hsic_xcvr_fs_clk_src.c, - .dbg_name = "gcc_usb_hsic_xcvr_fs_clk", - .ops = &clk_ops_branch, - CLK_INIT(gcc_usb_hsic_xcvr_fs_clk.c), - }, -}; - -static DEFINE_CLK_MEASURE(a5_m_clk); - -#ifdef CONFIG_DEBUG_FS - -struct measure_mux_entry { - struct clk *c; - int base; - u32 debug_mux; -}; - -struct measure_mux_entry measure_mux_common[] __initdata = { - {&snoc_clk.c, GCC_BASE, 0x0000}, - {&cnoc_clk.c, GCC_BASE, 0x0008}, - {&pnoc_clk.c, GCC_BASE, 0x0010}, - {&bimc_clk.c, GCC_BASE, 0x0155}, - {&gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0}, - {&gcc_usb_hsic_io_cal_sleep_clk.c, GCC_BASE, 0x005c}, - {&gcc_usb_hsic_xcvr_fs_clk.c, GCC_BASE, 0x005d}, - {&gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059}, - {&gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b}, - {&gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079}, - {&gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d}, - {&gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a}, - {&gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091}, - {&gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098}, - {&gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093}, - {&gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2}, - {&gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0}, - {&gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078}, - {&gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060}, - {&gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088}, - {&gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a}, - {&gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e}, - {&gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058}, - {&gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095}, - {&gcc_ce1_axi_clk.c, GCC_BASE, 0x0139}, - {&gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c}, - {&gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061}, - {&gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1}, - {&gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8}, - {&gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094}, - {&gcc_usb_hsic_clk.c, GCC_BASE, 0x005a}, - {&gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3}, - {&gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070}, - {&gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c}, - {&gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099}, - {&gcc_bam_dma_inactivity_timers_clk.c, GCC_BASE, 0x00E1}, - {&gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8}, - {&gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a}, - {&gcc_pdm2_clk.c, GCC_BASE, 0x00d2}, - {&gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e}, - {&gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090}, - {&gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b}, - {&gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071}, - {&gcc_ce1_clk.c, GCC_BASE, 0x0138}, - {&gcc_sys_noc_ipa_axi_clk.c, GCC_BASE, 0x0007}, - - {&a5_m_clk, APCS_BASE, 0x3}, - - {&dummy_clk, N_BASES, 0x0000}, -}; - -struct measure_mux_entry measure_mux_v2_only[] __initdata = { - {&gcc_ipa_clk.c, GCC_BASE, 0x01E0}, - {&gcc_ipa_cnoc_clk.c, GCC_BASE, 0x01E1}, - {&gcc_ipa_sleep_clk.c, GCC_BASE, 0x01E2}, - {&qpic_clk.c, GCC_BASE, 0x01D8}, -}; - -struct measure_mux_entry measure_mux[ARRAY_SIZE(measure_mux_common) - + ARRAY_SIZE(measure_mux_v2_only)]; - -static int measure_clk_set_parent(struct clk *c, struct clk *parent) -{ - struct measure_clk *clk = to_measure_clk(c); - unsigned long flags; - u32 regval, clk_sel, i; - - if (!parent) - return -EINVAL; - - for (i = 0; i < (ARRAY_SIZE(measure_mux) - 1); i++) - if (measure_mux[i].c == parent) - break; - - if (measure_mux[i].c == &dummy_clk) - return -EINVAL; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - /* - * Program the test vector, measurement period (sample_ticks) - * and scaling multiplier. - */ - clk->sample_ticks = 0x10000; - clk->multiplier = 1; - - writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG)); - - switch (measure_mux[i].base) { - - case GCC_BASE: - clk_sel = measure_mux[i].debug_mux; - break; - - case APCS_BASE: - clk_sel = 0x16A; - regval = BVAL(5, 3, measure_mux[i].debug_mux); - writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG)); - - /* Activate debug clock output */ - regval |= BIT(7); - writel_relaxed(regval, APCS_REG_BASE(APCS_CLK_DIAG_REG)); - break; - - default: - return -EINVAL; - } - - /* Set debug mux clock index */ - regval = BVAL(8, 0, clk_sel); - writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG)); - - /* Activate debug clock output */ - regval |= BIT(16); - writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL_REG)); - - /* Make sure test vector is set before starting measurements. */ - mb(); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return 0; -} - -/* Sample clock for 'ticks' reference clock ticks. */ -static u32 run_measurement(unsigned ticks) -{ - /* Stop counters and set the XO4 counter start value. */ - writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG)); - - /* Wait for timer to become ready. */ - while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) & - BIT(25)) != 0) - cpu_relax(); - - /* Run measurement and wait for completion. */ - writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL_REG)); - while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) & - BIT(25)) == 0) - cpu_relax(); - - /* Return measured ticks. */ - return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS_REG)) & - BM(24, 0); -} - -/* - * Perform a hardware rate measurement for a given clock. - * FOR DEBUG USE ONLY: Measurements take ~15 ms! - */ -static unsigned long measure_clk_get_rate(struct clk *c) -{ - unsigned long flags; - u32 gcc_xo4_reg_backup; - u64 raw_count_short, raw_count_full; - struct measure_clk *clk = to_measure_clk(c); - unsigned ret; - - ret = clk_prepare_enable(&cxo_clk_src.c); - if (ret) { - pr_warning("CXO clock failed to enable. Can't measure\n"); - return 0; - } - - spin_lock_irqsave(&local_clock_reg_lock, flags); - - /* Enable CXO/4 and RINGOSC branch. */ - gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG)); - writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG)); - - /* - * The ring oscillator counter will not reset if the measured clock - * is not running. To detect this, run a short measurement before - * the full measurement. If the raw results of the two are the same - * then the clock must be off. - */ - - /* Run a short measurement. (~1 ms) */ - raw_count_short = run_measurement(0x1000); - /* Run a full measurement. (~14 ms) */ - raw_count_full = run_measurement(clk->sample_ticks); - - writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR_REG)); - - /* Return 0 if the clock is off. */ - if (raw_count_full == raw_count_short) { - ret = 0; - } else { - /* Compute rate in Hz. */ - raw_count_full = ((raw_count_full * 10) + 15) * 4800000; - do_div(raw_count_full, ((clk->sample_ticks * 10) + 35)); - ret = (raw_count_full * clk->multiplier); - } - - writel_relaxed(0x51A00, GCC_REG_BASE(GCC_PLLTEST_PAD_CFG_REG)); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - clk_disable_unprepare(&cxo_clk_src.c); - - return ret; -} -#else /* !CONFIG_DEBUG_FS */ -static int measure_clk_set_parent(struct clk *clk, struct clk *parent) -{ - return -EINVAL; -} - -static unsigned long measure_clk_get_rate(struct clk *clk) -{ - return 0; -} -#endif /* CONFIG_DEBUG_FS */ - -static struct clk_ops clk_ops_measure = { - .set_parent = measure_clk_set_parent, - .get_rate = measure_clk_get_rate, -}; - -static struct measure_clk measure_clk = { - .c = { - .dbg_name = "measure_clk", - .ops = &clk_ops_measure, - CLK_INIT(measure_clk.c), - }, - .multiplier = 1, -}; - -static struct clk_lookup msm_clocks_9625[] = { - CLK_LOOKUP("xo", cxo_clk_src.c, ""), - CLK_LOOKUP("xo", cxo_lpm_clk.c, "fc4281d0.qcom,mpm"), - CLK_LOOKUP("measure", measure_clk.c, "debug"), - - CLK_LOOKUP("pll0", gpll0_activeonly_clk_src.c, "f9010008.qcom,acpuclk"), - CLK_LOOKUP("pll14", apcspll_clk_src.c, "f9010008.qcom,acpuclk"), - - CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"), - CLK_LOOKUP("inactivity_clk", gcc_bam_dma_inactivity_timers_clk.c, - "msm_sps"), - CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9924000.spi"), - CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9925000.i2c"), - CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991d000.uart"), - CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, "f9924000.spi"), - CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, "f9925000.i2c"), - CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, "f991d000.uart"), - CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""), - - CLK_LOOKUP("core_clk_src", ce1_clk_src.c, ""), - CLK_LOOKUP("core_clk", gcc_ce1_clk.c, ""), - CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, ""), - CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, ""), - - CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""), - CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""), - - CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"), - CLK_LOOKUP("core_src_clk", ipa_clk_src.c, "fd4c0000.qcom,ipa"), - CLK_LOOKUP("core_clk", gcc_ipa_clk.c, "fd4c0000.qcom,ipa"), - CLK_LOOKUP("bus_clk", gcc_sys_noc_ipa_axi_clk.c, "fd4c0000.qcom,ipa"), - CLK_LOOKUP("iface_clk", gcc_ipa_cnoc_clk.c, "fd4c0000.qcom,ipa"), - CLK_LOOKUP("inactivity_clk", gcc_ipa_sleep_clk.c, "fd4c0000.qcom,ipa"), - - CLK_LOOKUP("iface_clk", gcc_sys_noc_ipa_axi_clk.c, "msm_bus_ipa"), - - CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""), - CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""), - - CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("bus_clk", pnoc_sdcc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("bus_clk", pnoc_sdcc3_clk.c, "msm_sdcc.3"), - - CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"), - CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"), - CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"), - CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"), - CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"), - CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"), - CLK_LOOKUP("alt_core_clk", gcc_usb_hsic_xcvr_fs_clk.c, ""), - CLK_LOOKUP("inactivity_clk", gcc_usb_hsic_io_cal_sleep_clk.c, - "msm_hsic_host"), - - CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcedev"), - CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcedev"), - CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcedev"), - CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcedev"), - - CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "fd400000.qcom,qcrypto"), - CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "fd400000.qcom,qcrypto"), - CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "fd400000.qcom,qcrypto"), - CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "fd400000.qcom,qcrypto"), - - /* RPM and voter clocks */ - CLK_LOOKUP("bus_clk", snoc_clk.c, ""), - CLK_LOOKUP("bus_clk", pnoc_clk.c, ""), - CLK_LOOKUP("bus_clk", cnoc_clk.c, ""), - CLK_LOOKUP("mem_clk", bimc_clk.c, ""), - CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""), - CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""), - CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""), - CLK_LOOKUP("mem_clk", bimc_a_clk.c, ""), - CLK_LOOKUP("core_clk", qpic_clk.c, "f9ac0000.qcom,nand"), - CLK_LOOKUP("core_clk", qpic_a_clk.c, ""), - - CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"), - CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"), - CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"), - CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"), - CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"), - CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"), - CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"), - CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"), - - CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"), - - CLK_LOOKUP("a5_m_clk", a5_m_clk, ""), - - /* CoreSight clocks */ - CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.etm"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc332000.jtagmm"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc308000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc309000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30a000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30b000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30c000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30d000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30e000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc30f000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc333000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc350000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc354000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "fc358000.cti"), - CLK_LOOKUP("core_clk", qdss_clk.c, "f9011038.hwevent"), - - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.tmc"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.tpiu"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31c000.replicator"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc307000.tmc"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31b000.funnel"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc319000.funnel"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31a000.funnel"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.stm"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.etm"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc332000.jtagmm"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc308000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc309000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30a000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30b000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30c000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30d000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30e000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30f000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc333000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc350000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc354000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc358000.cti"), - CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "f9011038.hwevent"), -}; - -#define PLL_AUX_OUTPUT_BIT 1 -#define PLL_AUX2_OUTPUT_BIT 2 - -/* - * TODO: Need to remove this function when the v2 hardware - * fix the broken lock status bit. - */ -#define PLL_OUTCTRL BIT(0) -#define PLL_BYPASSNL BIT(1) -#define PLL_RESET_N BIT(2) - -static DEFINE_SPINLOCK(sr_pll_reg_lock); - -static int sr_pll_clk_enable_9625(struct clk *c) -{ - unsigned long flags; - struct pll_clk *pll = to_pll_clk(c); - u32 mode; - void __iomem *mode_reg = *pll->base + (u32)pll->mode_reg; - - spin_lock_irqsave(&sr_pll_reg_lock, flags); - - /* Disable PLL bypass mode and de-assert reset. */ - mode = readl_relaxed(mode_reg); - mode |= PLL_BYPASSNL | PLL_RESET_N; - writel_relaxed(mode, mode_reg); - - /* Wait for pll to lock. */ - udelay(100); - - /* Enable PLL output. */ - mode |= PLL_OUTCTRL; - writel_relaxed(mode, mode_reg); - - /* Ensure the write above goes through before returning. */ - mb(); - - spin_unlock_irqrestore(&sr_pll_reg_lock, flags); - return 0; -} - -static void __init reg_init(void) -{ - u32 regval; - - /* Vote for GPLL0 to turn on. Needed by acpuclock. */ - regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG)); - regval |= BIT(0); - writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE_REG)); -} - -static void __init msm9625_clock_post_init(void) -{ - /* - * Hold an active set vote for CXO; this is because CXO is expected - * to remain on whenever CPUs aren't power collapsed. - */ - clk_prepare_enable(&cxo_a_clk_src.c); - - /* Set rates for single-rate clocks. */ - clk_set_rate(&usb_hs_system_clk_src.c, - usb_hs_system_clk_src.freq_tbl[0].freq_hz); - clk_set_rate(&usb_hsic_clk_src.c, - usb_hsic_clk_src.freq_tbl[0].freq_hz); - clk_set_rate(&usb_hsic_io_cal_clk_src.c, - usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz); - clk_set_rate(&usb_hsic_system_clk_src.c, - usb_hsic_system_clk_src.freq_tbl[0].freq_hz); - clk_set_rate(&usb_hsic_xcvr_fs_clk_src.c, - usb_hsic_xcvr_fs_clk_src.freq_tbl[0].freq_hz); - clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz); - /* - * TODO: set rate on behalf of the i2c driver until the i2c driver - * distinguish v1/v2 and call set rate accordingly. - */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) - clk_set_rate(&blsp1_qup3_i2c_apps_clk_src.c, - blsp1_qup3_i2c_apps_clk_src.freq_tbl[0].freq_hz); -} - -#define GCC_CC_PHYS 0xFC400000 -#define GCC_CC_SIZE SZ_16K - -#define APCS_GCC_CC_PHYS 0xF9011000 -#define APCS_GCC_CC_SIZE SZ_4K - -#define APCS_PLL_PHYS 0xF9008018 -#define APCS_PLL_SIZE 0x18 - -static struct clk *i2c_apps_clks[][2] __initdata = { - {&gcc_blsp1_qup1_i2c_apps_clk.c, &blsp1_qup1_i2c_apps_clk_src.c}, - {&gcc_blsp1_qup2_i2c_apps_clk.c, &blsp1_qup2_i2c_apps_clk_src.c}, - {&gcc_blsp1_qup3_i2c_apps_clk.c, &blsp1_qup3_i2c_apps_clk_src.c}, - {&gcc_blsp1_qup4_i2c_apps_clk.c, &blsp1_qup4_i2c_apps_clk_src.c}, - {&gcc_blsp1_qup5_i2c_apps_clk.c, &blsp1_qup5_i2c_apps_clk_src.c}, - {&gcc_blsp1_qup6_i2c_apps_clk.c, &blsp1_qup6_i2c_apps_clk_src.c}, -}; - -static void __init msm9625_clock_pre_init(void) -{ - virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE); - if (!virt_bases[GCC_BASE]) - panic("clock-9625: Unable to ioremap GCC memory!"); - - virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE); - if (!virt_bases[APCS_BASE]) - panic("clock-9625: Unable to ioremap APCS_GCC_CC memory!"); - - virt_bases[APCS_PLL_BASE] = ioremap(APCS_PLL_PHYS, APCS_PLL_SIZE); - if (!virt_bases[APCS_PLL_BASE]) - panic("clock-9625: Unable to ioremap APCS_PLL memory!"); - - /* The parent of each of the QUP I2C APPS clocks is an RCG on v2 */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) { - int i, num_cores = ARRAY_SIZE(i2c_apps_clks); - for (i = 0; i < num_cores; i++) - i2c_apps_clks[i][0]->parent = i2c_apps_clks[i][1]; - } - - clk_ops_local_pll.enable = sr_pll_clk_enable_9625; - - vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig"); - if (IS_ERR(vdd_dig.regulator[0])) - panic("clock-9625: Unable to get the vdd_dig regulator!"); - - enable_rpm_scaling(); - - reg_init(); - - /* Construct measurement mux array */ - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) { - memcpy(measure_mux, - measure_mux_v2_only, sizeof(measure_mux_v2_only)); - memcpy(measure_mux + ARRAY_SIZE(measure_mux_v2_only), - measure_mux_common, sizeof(measure_mux_common)); - } else - memcpy(measure_mux, - measure_mux_common, sizeof(measure_mux_common)); -} - -struct clock_init_data msm9625_clock_init_data __initdata = { - .table = msm_clocks_9625, - .size = ARRAY_SIZE(msm_clocks_9625), - .pre_init = msm9625_clock_pre_init, - .post_init = msm9625_clock_post_init, -}; diff --git a/arch/arm/mach-msm/clock-dss-8960.c b/arch/arm/mach-msm/clock-dss-8960.c deleted file mode 100644 index c147a336c8bd..000000000000 --- a/arch/arm/mach-msm/clock-dss-8960.c +++ /dev/null @@ -1,395 +0,0 @@ -/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include "clock-dss-8960.h" - -/* HDMI PLL macros */ -#define HDMI_PHY_PLL_REFCLK_CFG (MSM_HDMI_BASE + 0x00000500) -#define HDMI_PHY_PLL_CHRG_PUMP_CFG (MSM_HDMI_BASE + 0x00000504) -#define HDMI_PHY_PLL_LOOP_FLT_CFG0 (MSM_HDMI_BASE + 0x00000508) -#define HDMI_PHY_PLL_LOOP_FLT_CFG1 (MSM_HDMI_BASE + 0x0000050c) -#define HDMI_PHY_PLL_IDAC_ADJ_CFG (MSM_HDMI_BASE + 0x00000510) -#define HDMI_PHY_PLL_I_VI_KVCO_CFG (MSM_HDMI_BASE + 0x00000514) -#define HDMI_PHY_PLL_PWRDN_B (MSM_HDMI_BASE + 0x00000518) -#define HDMI_PHY_PLL_SDM_CFG0 (MSM_HDMI_BASE + 0x0000051c) -#define HDMI_PHY_PLL_SDM_CFG1 (MSM_HDMI_BASE + 0x00000520) -#define HDMI_PHY_PLL_SDM_CFG2 (MSM_HDMI_BASE + 0x00000524) -#define HDMI_PHY_PLL_SDM_CFG3 (MSM_HDMI_BASE + 0x00000528) -#define HDMI_PHY_PLL_SDM_CFG4 (MSM_HDMI_BASE + 0x0000052c) -#define HDMI_PHY_PLL_SSC_CFG0 (MSM_HDMI_BASE + 0x00000530) -#define HDMI_PHY_PLL_SSC_CFG1 (MSM_HDMI_BASE + 0x00000534) -#define HDMI_PHY_PLL_SSC_CFG2 (MSM_HDMI_BASE + 0x00000538) -#define HDMI_PHY_PLL_SSC_CFG3 (MSM_HDMI_BASE + 0x0000053c) -#define HDMI_PHY_PLL_LOCKDET_CFG0 (MSM_HDMI_BASE + 0x00000540) -#define HDMI_PHY_PLL_LOCKDET_CFG1 (MSM_HDMI_BASE + 0x00000544) -#define HDMI_PHY_PLL_LOCKDET_CFG2 (MSM_HDMI_BASE + 0x00000548) -#define HDMI_PHY_PLL_VCOCAL_CFG0 (MSM_HDMI_BASE + 0x0000054c) -#define HDMI_PHY_PLL_VCOCAL_CFG1 (MSM_HDMI_BASE + 0x00000550) -#define HDMI_PHY_PLL_VCOCAL_CFG2 (MSM_HDMI_BASE + 0x00000554) -#define HDMI_PHY_PLL_VCOCAL_CFG3 (MSM_HDMI_BASE + 0x00000558) -#define HDMI_PHY_PLL_VCOCAL_CFG4 (MSM_HDMI_BASE + 0x0000055c) -#define HDMI_PHY_PLL_VCOCAL_CFG5 (MSM_HDMI_BASE + 0x00000560) -#define HDMI_PHY_PLL_VCOCAL_CFG6 (MSM_HDMI_BASE + 0x00000564) -#define HDMI_PHY_PLL_VCOCAL_CFG7 (MSM_HDMI_BASE + 0x00000568) -#define HDMI_PHY_PLL_DEBUG_SEL (MSM_HDMI_BASE + 0x0000056c) -#define HDMI_PHY_PLL_MISC0 (MSM_HDMI_BASE + 0x00000570) -#define HDMI_PHY_PLL_MISC1 (MSM_HDMI_BASE + 0x00000574) -#define HDMI_PHY_PLL_MISC2 (MSM_HDMI_BASE + 0x00000578) -#define HDMI_PHY_PLL_MISC3 (MSM_HDMI_BASE + 0x0000057c) -#define HDMI_PHY_PLL_MISC4 (MSM_HDMI_BASE + 0x00000580) -#define HDMI_PHY_PLL_MISC5 (MSM_HDMI_BASE + 0x00000584) -#define HDMI_PHY_PLL_MISC6 (MSM_HDMI_BASE + 0x00000588) -#define HDMI_PHY_PLL_DEBUG_BUS0 (MSM_HDMI_BASE + 0x0000058c) -#define HDMI_PHY_PLL_DEBUG_BUS1 (MSM_HDMI_BASE + 0x00000590) -#define HDMI_PHY_PLL_DEBUG_BUS2 (MSM_HDMI_BASE + 0x00000594) -#define HDMI_PHY_PLL_STATUS0 (MSM_HDMI_BASE + 0x00000598) -#define HDMI_PHY_PLL_STATUS1 (MSM_HDMI_BASE + 0x0000059c) -#define HDMI_PHY_CTRL (MSM_HDMI_BASE + 0x000002D4) -#define HDMI_PHY_REG_0 (MSM_HDMI_BASE + 0x00000400) -#define HDMI_PHY_REG_1 (MSM_HDMI_BASE + 0x00000404) -#define HDMI_PHY_REG_2 (MSM_HDMI_BASE + 0x00000408) -#define HDMI_PHY_REG_3 (MSM_HDMI_BASE + 0x0000040c) -#define HDMI_PHY_REG_4 (MSM_HDMI_BASE + 0x00000410) -#define HDMI_PHY_REG_5 (MSM_HDMI_BASE + 0x00000414) -#define HDMI_PHY_REG_6 (MSM_HDMI_BASE + 0x00000418) -#define HDMI_PHY_REG_7 (MSM_HDMI_BASE + 0x0000041c) -#define HDMI_PHY_REG_8 (MSM_HDMI_BASE + 0x00000420) -#define HDMI_PHY_REG_9 (MSM_HDMI_BASE + 0x00000424) -#define HDMI_PHY_REG_10 (MSM_HDMI_BASE + 0x00000428) -#define HDMI_PHY_REG_11 (MSM_HDMI_BASE + 0x0000042c) -#define HDMI_PHY_REG_12 (MSM_HDMI_BASE + 0x00000430) -#define HDMI_PHY_REG_BIST_CFG (MSM_HDMI_BASE + 0x00000434) -#define HDMI_PHY_DEBUG_BUS_SEL (MSM_HDMI_BASE + 0x00000438) -#define HDMI_PHY_REG_MISC0 (MSM_HDMI_BASE + 0x0000043c) -#define HDMI_PHY_REG_13 (MSM_HDMI_BASE + 0x00000440) -#define HDMI_PHY_REG_14 (MSM_HDMI_BASE + 0x00000444) -#define HDMI_PHY_REG_15 (MSM_HDMI_BASE + 0x00000448) - -#define AHB_EN_REG (MSM_MMSS_CLK_CTL_BASE + 0x0008) - -/* HDMI PHY/PLL bit field macros */ -#define SW_RESET BIT(2) -#define SW_RESET_PLL BIT(0) -#define PWRDN_B BIT(7) - -#define PLL_PWRDN_B BIT(3) -#define PD_PLL BIT(1) - -static unsigned hdmi_pll_on; - -int hdmi_pll_enable(void) -{ - unsigned int val; - u32 ahb_en_reg, ahb_enabled; - unsigned int timeout_count; - int pll_lock_retry = 10; - - ahb_en_reg = readl_relaxed(AHB_EN_REG); - ahb_enabled = ahb_en_reg & BIT(4); - if (!ahb_enabled) { - writel_relaxed(ahb_en_reg | BIT(4), AHB_EN_REG); - /* Make sure iface clock is enabled before register access */ - mb(); - } - - /* Assert PLL S/W reset */ - writel_relaxed(0x8D, HDMI_PHY_PLL_LOCKDET_CFG2); - writel_relaxed(0x10, HDMI_PHY_PLL_LOCKDET_CFG0); - writel_relaxed(0x1A, HDMI_PHY_PLL_LOCKDET_CFG1); - /* Wait for a short time before de-asserting - * to allow the hardware to complete its job. - * This much of delay should be fine for hardware - * to assert and de-assert. - */ - udelay(10); - /* De-assert PLL S/W reset */ - writel_relaxed(0x0D, HDMI_PHY_PLL_LOCKDET_CFG2); - - val = readl_relaxed(HDMI_PHY_REG_12); - val |= BIT(5); - /* Assert PHY S/W reset */ - writel_relaxed(val, HDMI_PHY_REG_12); - val &= ~BIT(5); - /* Wait for a short time before de-asserting - to allow the hardware to complete its job. - This much of delay should be fine for hardware - to assert and de-assert. */ - udelay(10); - /* De-assert PHY S/W reset */ - writel_relaxed(val, HDMI_PHY_REG_12); - writel_relaxed(0x3f, HDMI_PHY_REG_2); - - val = readl_relaxed(HDMI_PHY_REG_12); - val |= PWRDN_B; - writel_relaxed(val, HDMI_PHY_REG_12); - /* Wait 10 us for enabling global power for PHY */ - mb(); - udelay(10); - - val = readl_relaxed(HDMI_PHY_PLL_PWRDN_B); - val |= PLL_PWRDN_B; - val &= ~PD_PLL; - writel_relaxed(val, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x80, HDMI_PHY_REG_2); - - timeout_count = 1000; - while (!(readl_relaxed(HDMI_PHY_PLL_STATUS0) & BIT(0)) && - timeout_count && pll_lock_retry) { - if (--timeout_count == 0) { - /* - * PLL has still not locked. - * Do a software reset and try again - * Assert PLL S/W reset first - */ - writel_relaxed(0x8D, HDMI_PHY_PLL_LOCKDET_CFG2); - - /* Wait for a short time before de-asserting - * to allow the hardware to complete its job. - * This much of delay should be fine for hardware - * to assert and de-assert. - */ - udelay(10); - writel_relaxed(0x0D, HDMI_PHY_PLL_LOCKDET_CFG2); - - /* - * Wait for a short duration for the PLL calibration - * before checking if the PLL gets locked - */ - udelay(350); - - timeout_count = 1000; - pll_lock_retry--; - } - } - - if (!ahb_enabled) - writel_relaxed(ahb_en_reg & ~BIT(4), AHB_EN_REG); - - if (!pll_lock_retry) { - pr_err("%s: HDMI PLL not locked\n", __func__); - hdmi_pll_disable(); - return -EAGAIN; - } - - hdmi_pll_on = 1; - return 0; -} - -void hdmi_pll_disable(void) -{ - unsigned int val; - u32 ahb_en_reg, ahb_enabled; - - ahb_en_reg = readl_relaxed(AHB_EN_REG); - ahb_enabled = ahb_en_reg & BIT(4); - if (!ahb_enabled) { - writel_relaxed(ahb_en_reg | BIT(4), AHB_EN_REG); - mb(); - } - - val = readl_relaxed(HDMI_PHY_REG_12); - val &= (~PWRDN_B); - writel_relaxed(val, HDMI_PHY_REG_12); - - val = readl_relaxed(HDMI_PHY_PLL_PWRDN_B); - val |= PD_PLL; - val &= (~PLL_PWRDN_B); - writel_relaxed(val, HDMI_PHY_PLL_PWRDN_B); - /* Make sure HDMI PHY/PLL are powered down */ - mb(); - - if (!ahb_enabled) - writel_relaxed(ahb_en_reg & ~BIT(4), AHB_EN_REG); - hdmi_pll_on = 0; -} - -int hdmi_pll_set_rate(unsigned rate) -{ - unsigned int set_power_dwn = 0; - u32 ahb_en_reg = readl_relaxed(AHB_EN_REG); - u32 ahb_enabled = ahb_en_reg & BIT(4); - - if (!ahb_enabled) { - writel_relaxed(ahb_en_reg | BIT(4), AHB_EN_REG); - /* Make sure iface clock is enabled before register access */ - mb(); - } - - if (hdmi_pll_on) { - hdmi_pll_disable(); - set_power_dwn = 1; - } - - switch (rate) { - case 27030000: - /* 480p60/480i60 case */ - writel_relaxed(0xA, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x38, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x2, HDMI_PHY_PLL_CHRG_PUMP_CFG); - writel_relaxed(0x20, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0xFF, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0x4E, HDMI_PHY_PLL_SDM_CFG1); - writel_relaxed(0xD7, HDMI_PHY_PLL_SDM_CFG2); - writel_relaxed(0x03, HDMI_PHY_PLL_SDM_CFG3); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG4); - writel_relaxed(0x2A, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x03, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG3); - writel_relaxed(0x86, HDMI_PHY_PLL_VCOCAL_CFG4); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG5); - writel_relaxed(0x33, HDMI_PHY_PLL_VCOCAL_CFG6); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG7); - break; - - case 25200000: - /* 640x480p60 */ - writel_relaxed(0x32, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x2, HDMI_PHY_PLL_CHRG_PUMP_CFG); - writel_relaxed(0x01, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0x33, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x2C, HDMI_PHY_PLL_IDAC_ADJ_CFG); - writel_relaxed(0x6, HDMI_PHY_PLL_I_VI_KVCO_CFG); - writel_relaxed(0xA, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x77, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0x4C, HDMI_PHY_PLL_SDM_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG2); - writel_relaxed(0xC0, HDMI_PHY_PLL_SDM_CFG3); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG4); - writel_relaxed(0x9A, HDMI_PHY_PLL_SSC_CFG0); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG2); - writel_relaxed(0x20, HDMI_PHY_PLL_SSC_CFG3); - writel_relaxed(0x10, HDMI_PHY_PLL_LOCKDET_CFG0); - writel_relaxed(0x1A, HDMI_PHY_PLL_LOCKDET_CFG1); - writel_relaxed(0x0D, HDMI_PHY_PLL_LOCKDET_CFG2); - writel_relaxed(0xF4, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x02, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG3); - writel_relaxed(0x86, HDMI_PHY_PLL_VCOCAL_CFG4); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG5); - writel_relaxed(0x33, HDMI_PHY_PLL_VCOCAL_CFG6); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG7); - break; - - case 27000000: - /* 576p50/576i50 case */ - writel_relaxed(0x32, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x2, HDMI_PHY_PLL_CHRG_PUMP_CFG); - writel_relaxed(0x01, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0x33, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x2C, HDMI_PHY_PLL_IDAC_ADJ_CFG); - writel_relaxed(0x6, HDMI_PHY_PLL_I_VI_KVCO_CFG); - writel_relaxed(0xA, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x7B, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0x01, HDMI_PHY_PLL_SDM_CFG1); - writel_relaxed(0x4C, HDMI_PHY_PLL_SDM_CFG2); - writel_relaxed(0xC0, HDMI_PHY_PLL_SDM_CFG3); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG4); - writel_relaxed(0x9A, HDMI_PHY_PLL_SSC_CFG0); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG3); - writel_relaxed(0x10, HDMI_PHY_PLL_LOCKDET_CFG0); - writel_relaxed(0x1A, HDMI_PHY_PLL_LOCKDET_CFG1); - writel_relaxed(0x0D, HDMI_PHY_PLL_LOCKDET_CFG2); - writel_relaxed(0x2a, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x03, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG3); - writel_relaxed(0x86, HDMI_PHY_PLL_VCOCAL_CFG4); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG5); - writel_relaxed(0x33, HDMI_PHY_PLL_VCOCAL_CFG6); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG7); - break; - - case 74250000: - /* 720p60/720p50/1080i60/1080i50 - * 1080p24/1080p30/1080p25 case - */ - writel_relaxed(0xA, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x12, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x01, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0x33, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x76, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0xE6, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x02, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - break; - - case 108000000: - writel_relaxed(0x08, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x21, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0xF9, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x1C, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x02, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - writel_relaxed(0x86, HDMI_PHY_PLL_VCOCAL_CFG4); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG5); - writel_relaxed(0x49, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0x49, HDMI_PHY_PLL_SDM_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG3); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG4); - break; - - case 148500000: - /* 1080p60/1080p50 case */ - writel_relaxed(0x2, HDMI_PHY_PLL_REFCLK_CFG); - writel_relaxed(0x2, HDMI_PHY_PLL_CHRG_PUMP_CFG); - writel_relaxed(0x01, HDMI_PHY_PLL_LOOP_FLT_CFG0); - writel_relaxed(0x33, HDMI_PHY_PLL_LOOP_FLT_CFG1); - writel_relaxed(0x2C, HDMI_PHY_PLL_IDAC_ADJ_CFG); - writel_relaxed(0x6, HDMI_PHY_PLL_I_VI_KVCO_CFG); - writel_relaxed(0xA, HDMI_PHY_PLL_PWRDN_B); - writel_relaxed(0x76, HDMI_PHY_PLL_SDM_CFG0); - writel_relaxed(0x01, HDMI_PHY_PLL_SDM_CFG1); - writel_relaxed(0x4C, HDMI_PHY_PLL_SDM_CFG2); - writel_relaxed(0xC0, HDMI_PHY_PLL_SDM_CFG3); - writel_relaxed(0x00, HDMI_PHY_PLL_SDM_CFG4); - writel_relaxed(0x9A, HDMI_PHY_PLL_SSC_CFG0); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG1); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_SSC_CFG3); - writel_relaxed(0x10, HDMI_PHY_PLL_LOCKDET_CFG0); - writel_relaxed(0x1A, HDMI_PHY_PLL_LOCKDET_CFG1); - writel_relaxed(0x0D, HDMI_PHY_PLL_LOCKDET_CFG2); - writel_relaxed(0xe6, HDMI_PHY_PLL_VCOCAL_CFG0); - writel_relaxed(0x02, HDMI_PHY_PLL_VCOCAL_CFG1); - writel_relaxed(0x3B, HDMI_PHY_PLL_VCOCAL_CFG2); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG3); - writel_relaxed(0x86, HDMI_PHY_PLL_VCOCAL_CFG4); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG5); - writel_relaxed(0x33, HDMI_PHY_PLL_VCOCAL_CFG6); - writel_relaxed(0x00, HDMI_PHY_PLL_VCOCAL_CFG7); - break; - } - - /* Make sure writes complete before disabling iface clock */ - mb(); - - if (set_power_dwn) - hdmi_pll_enable(); - - if (!ahb_enabled) - writel_relaxed(ahb_en_reg & ~BIT(4), AHB_EN_REG); - - return 0; -} diff --git a/arch/arm/mach-msm/clock-dss-8960.h b/arch/arm/mach-msm/clock-dss-8960.h deleted file mode 100644 index eb48c7f25182..000000000000 --- a/arch/arm/mach-msm/clock-dss-8960.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_CLOCK_DSS_8960 -#define __ARCH_ARM_MACH_MSM_CLOCK_DSS_8960 - -int hdmi_pll_enable(void); -void hdmi_pll_disable(void); -int hdmi_pll_set_rate(unsigned rate); - -#endif diff --git a/arch/arm/mach-msm/clock-fsm9xxx.c b/arch/arm/mach-msm/clock-fsm9xxx.c deleted file mode 100644 index e3a4818c061b..000000000000 --- a/arch/arm/mach-msm/clock-fsm9xxx.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include "clock.h" - -/* - * Clocks - */ - -static struct clk_lookup msm_clocks_fsm9xxx[] = { - CLK_DUMMY("core_clk", ADM0_CLK, "msm_dmov", OFF), - CLK_DUMMY("core_clk", UART1_CLK, "msm_serial.0", OFF), - CLK_DUMMY("core_clk", UART3_CLK, "msm_uim.2", OFF), - CLK_DUMMY("core_clk", CE_CLK, "qce.0", OFF), - CLK_DUMMY("core_clk", CE_CLK, "qcota.0", OFF), - CLK_DUMMY("core_clk", CE_CLK, "qcrypto.0", OFF), -}; - -struct clock_init_data fsm9xxx_clock_init_data __initdata = { - .table = msm_clocks_fsm9xxx, - .size = ARRAY_SIZE(msm_clocks_fsm9xxx), -}; diff --git a/arch/arm/mach-msm/clock-local.c b/arch/arm/mach-msm/clock-local.c deleted file mode 100644 index 18ea514dc795..000000000000 --- a/arch/arm/mach-msm/clock-local.c +++ /dev/null @@ -1,1000 +0,0 @@ -/* Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "clock-local.h" - -#ifdef CONFIG_MSM_SECURE_IO -#undef readl_relaxed -#undef writel_relaxed -#define readl_relaxed secure_readl -#define writel_relaxed secure_writel -#endif - -/* - * When enabling/disabling a clock, check the halt bit up to this number - * number of times (with a 1 us delay in between) before continuing. - */ -#define HALT_CHECK_MAX_LOOPS 200 -/* For clock without halt checking, wait this long after enables/disables. */ -#define HALT_CHECK_DELAY_US 10 - -DEFINE_SPINLOCK(local_clock_reg_lock); -struct clk_freq_tbl rcg_dummy_freq = F_END; - -/* - * Common Set-Rate Functions - */ - -/* For clocks with MND dividers. */ -void set_rate_mnd(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - uint32_t ns_reg_val, ctl_reg_val; - - /* Assert MND reset. */ - ns_reg_val = readl_relaxed(rcg->ns_reg); - ns_reg_val |= BIT(7); - writel_relaxed(ns_reg_val, rcg->ns_reg); - - /* Program M and D values. */ - writel_relaxed(nf->md_val, rcg->md_reg); - - /* If the clock has a separate CC register, program it. */ - if (rcg->ns_reg != rcg->b.ctl_reg) { - ctl_reg_val = readl_relaxed(rcg->b.ctl_reg); - ctl_reg_val &= ~(rcg->ctl_mask); - ctl_reg_val |= nf->ctl_val; - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - } - - /* Deassert MND reset. */ - ns_reg_val &= ~BIT(7); - writel_relaxed(ns_reg_val, rcg->ns_reg); -} - -void set_rate_nop(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - /* - * Nothing to do for fixed-rate or integer-divider clocks. Any settings - * in NS registers are applied in the enable path, since power can be - * saved by leaving an un-clocked or slowly-clocked source selected - * until the clock is enabled. - */ -} - -void set_rate_mnd_8(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - uint32_t ctl_reg_val; - - /* Assert MND reset. */ - ctl_reg_val = readl_relaxed(rcg->b.ctl_reg); - ctl_reg_val |= BIT(8); - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - - /* Program M and D values. */ - writel_relaxed(nf->md_val, rcg->md_reg); - - /* Program MN counter Enable and Mode. */ - ctl_reg_val &= ~(rcg->ctl_mask); - ctl_reg_val |= nf->ctl_val; - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - - /* Deassert MND reset. */ - ctl_reg_val &= ~BIT(8); - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); -} - -void set_rate_mnd_banked(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - struct bank_masks *banks = rcg->bank_info; - const struct bank_mask_info *new_bank_masks; - const struct bank_mask_info *old_bank_masks; - uint32_t ns_reg_val, ctl_reg_val; - uint32_t bank_sel; - - /* - * Determine active bank and program the other one. If the clock is - * off, program the active bank since bank switching won't work if - * both banks aren't running. - */ - ctl_reg_val = readl_relaxed(rcg->b.ctl_reg); - bank_sel = !!(ctl_reg_val & banks->bank_sel_mask); - /* If clock isn't running, don't switch banks. */ - bank_sel ^= (!rcg->enabled || rcg->current_freq->freq_hz == 0); - if (bank_sel == 0) { - new_bank_masks = &banks->bank1_mask; - old_bank_masks = &banks->bank0_mask; - } else { - new_bank_masks = &banks->bank0_mask; - old_bank_masks = &banks->bank1_mask; - } - - ns_reg_val = readl_relaxed(rcg->ns_reg); - - /* Assert bank MND reset. */ - ns_reg_val |= new_bank_masks->rst_mask; - writel_relaxed(ns_reg_val, rcg->ns_reg); - - /* - * Program NS only if the clock is enabled, since the NS will be set - * as part of the enable procedure and should remain with a low-power - * MUX input selected until then. - */ - if (rcg->enabled) { - ns_reg_val &= ~(new_bank_masks->ns_mask); - ns_reg_val |= (nf->ns_val & new_bank_masks->ns_mask); - writel_relaxed(ns_reg_val, rcg->ns_reg); - } - - writel_relaxed(nf->md_val, new_bank_masks->md_reg); - - /* Enable counter only if clock is enabled. */ - if (rcg->enabled) - ctl_reg_val |= new_bank_masks->mnd_en_mask; - else - ctl_reg_val &= ~(new_bank_masks->mnd_en_mask); - - ctl_reg_val &= ~(new_bank_masks->mode_mask); - ctl_reg_val |= (nf->ctl_val & new_bank_masks->mode_mask); - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - - /* Deassert bank MND reset. */ - ns_reg_val &= ~(new_bank_masks->rst_mask); - writel_relaxed(ns_reg_val, rcg->ns_reg); - - /* - * Switch to the new bank if clock is running. If it isn't, then - * no switch is necessary since we programmed the active bank. - */ - if (rcg->enabled && rcg->current_freq->freq_hz) { - ctl_reg_val ^= banks->bank_sel_mask; - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - /* - * Wait at least 6 cycles of slowest bank's clock - * for the glitch-free MUX to fully switch sources. - */ - mb(); - udelay(1); - - /* Disable old bank's MN counter. */ - ctl_reg_val &= ~(old_bank_masks->mnd_en_mask); - writel_relaxed(ctl_reg_val, rcg->b.ctl_reg); - - /* Program old bank to a low-power source and divider. */ - ns_reg_val &= ~(old_bank_masks->ns_mask); - ns_reg_val |= (rcg->freq_tbl->ns_val & old_bank_masks->ns_mask); - writel_relaxed(ns_reg_val, rcg->ns_reg); - } - - /* Update the MND_EN and NS masks to match the current bank. */ - rcg->mnd_en_mask = new_bank_masks->mnd_en_mask; - rcg->ns_mask = new_bank_masks->ns_mask; -} - -void set_rate_div_banked(struct rcg_clk *rcg, struct clk_freq_tbl *nf) -{ - struct bank_masks *banks = rcg->bank_info; - const struct bank_mask_info *new_bank_masks; - const struct bank_mask_info *old_bank_masks; - uint32_t ns_reg_val, bank_sel; - - /* - * Determine active bank and program the other one. If the clock is - * off, program the active bank since bank switching won't work if - * both banks aren't running. - */ - ns_reg_val = readl_relaxed(rcg->ns_reg); - bank_sel = !!(ns_reg_val & banks->bank_sel_mask); - /* If clock isn't running, don't switch banks. */ - bank_sel ^= (!rcg->enabled || rcg->current_freq->freq_hz == 0); - if (bank_sel == 0) { - new_bank_masks = &banks->bank1_mask; - old_bank_masks = &banks->bank0_mask; - } else { - new_bank_masks = &banks->bank0_mask; - old_bank_masks = &banks->bank1_mask; - } - - /* - * Program NS only if the clock is enabled, since the NS will be set - * as part of the enable procedure and should remain with a low-power - * MUX input selected until then. - */ - if (rcg->enabled) { - ns_reg_val &= ~(new_bank_masks->ns_mask); - ns_reg_val |= (nf->ns_val & new_bank_masks->ns_mask); - writel_relaxed(ns_reg_val, rcg->ns_reg); - } - - /* - * Switch to the new bank if clock is running. If it isn't, then - * no switch is necessary since we programmed the active bank. - */ - if (rcg->enabled && rcg->current_freq->freq_hz) { - ns_reg_val ^= banks->bank_sel_mask; - writel_relaxed(ns_reg_val, rcg->ns_reg); - /* - * Wait at least 6 cycles of slowest bank's clock - * for the glitch-free MUX to fully switch sources. - */ - mb(); - udelay(1); - - /* Program old bank to a low-power source and divider. */ - ns_reg_val &= ~(old_bank_masks->ns_mask); - ns_reg_val |= (rcg->freq_tbl->ns_val & old_bank_masks->ns_mask); - writel_relaxed(ns_reg_val, rcg->ns_reg); - } - - /* Update the NS mask to match the current bank. */ - rcg->ns_mask = new_bank_masks->ns_mask; -} - -/* - * Clock enable/disable functions - */ - -/* Return non-zero if a clock status registers shows the clock is halted. */ -static int branch_clk_is_halted(const struct branch *b) -{ - int invert = (b->halt_check == ENABLE); - int status_bit = readl_relaxed(b->halt_reg) & BIT(b->halt_bit); - return invert ? !status_bit : status_bit; -} - -static int branch_in_hwcg_mode(const struct branch *b) -{ - if (!b->hwcg_mask) - return 0; - - return !!(readl_relaxed(b->hwcg_reg) & b->hwcg_mask); -} - -void __branch_enable_reg(const struct branch *b, const char *name) -{ - u32 reg_val; - - if (b->en_mask) { - reg_val = readl_relaxed(b->ctl_reg); - reg_val |= b->en_mask; - writel_relaxed(reg_val, b->ctl_reg); - } - - /* - * Use a memory barrier since some halt status registers are - * not within the same 1K segment as the branch/root enable - * registers. It's also needed in the udelay() case to ensure - * the delay starts after the branch enable. - */ - mb(); - - /* Skip checking halt bit if the clock is in hardware gated mode */ - if (branch_in_hwcg_mode(b)) - return; - - /* Wait for clock to enable before returning. */ - if (b->halt_check == DELAY) { - udelay(HALT_CHECK_DELAY_US); - } else if (b->halt_check == ENABLE || b->halt_check == HALT - || b->halt_check == ENABLE_VOTED - || b->halt_check == HALT_VOTED) { - int count; - - /* Wait up to HALT_CHECK_MAX_LOOPS for clock to enable. */ - for (count = HALT_CHECK_MAX_LOOPS; branch_clk_is_halted(b) - && count > 0; count--) - udelay(1); - WARN(count == 0, "%s status stuck at 'off'", name); - } -} - -/* Perform any register operations required to enable the clock. */ -static void __rcg_clk_enable_reg(struct rcg_clk *rcg) -{ - u32 reg_val; - void __iomem *const reg = rcg->b.ctl_reg; - - /* - * Program the NS register, if applicable. NS registers are not - * set in the set_rate path because power can be saved by deferring - * the selection of a clocked source until the clock is enabled. - */ - if (rcg->ns_mask) { - reg_val = readl_relaxed(rcg->ns_reg); - reg_val &= ~(rcg->ns_mask); - reg_val |= (rcg->current_freq->ns_val & rcg->ns_mask); - writel_relaxed(reg_val, rcg->ns_reg); - } - - /* Enable MN counter, if applicable. */ - reg_val = readl_relaxed(reg); - if (rcg->current_freq->md_val) { - reg_val |= rcg->mnd_en_mask; - writel_relaxed(reg_val, reg); - } - /* Enable root. */ - if (rcg->root_en_mask) { - reg_val |= rcg->root_en_mask; - writel_relaxed(reg_val, reg); - } - __branch_enable_reg(&rcg->b, rcg->c.dbg_name); -} - -/* Perform any register operations required to disable the branch. */ -u32 __branch_disable_reg(const struct branch *b, const char *name) -{ - u32 reg_val; - - reg_val = b->ctl_reg ? readl_relaxed(b->ctl_reg) : 0; - if (b->ctl_reg && b->en_mask) { - reg_val &= ~(b->en_mask); - writel_relaxed(reg_val, b->ctl_reg); - } - - /* - * Use a memory barrier since some halt status registers are - * not within the same K segment as the branch/root enable - * registers. It's also needed in the udelay() case to ensure - * the delay starts after the branch disable. - */ - mb(); - - /* Skip checking halt bit if the clock is in hardware gated mode */ - if (branch_in_hwcg_mode(b)) - return reg_val; - - /* Wait for clock to disable before continuing. */ - if (b->halt_check == DELAY || b->halt_check == ENABLE_VOTED - || b->halt_check == HALT_VOTED) { - udelay(HALT_CHECK_DELAY_US); - } else if (b->halt_check == ENABLE || b->halt_check == HALT) { - int count; - - /* Wait up to HALT_CHECK_MAX_LOOPS for clock to disable. */ - for (count = HALT_CHECK_MAX_LOOPS; !branch_clk_is_halted(b) - && count > 0; count--) - udelay(1); - WARN(count == 0, "%s status stuck at 'on'", name); - } - - return reg_val; -} - -/* Perform any register operations required to disable the generator. */ -static void __rcg_clk_disable_reg(struct rcg_clk *rcg) -{ - void __iomem *const reg = rcg->b.ctl_reg; - uint32_t reg_val; - - reg_val = __branch_disable_reg(&rcg->b, rcg->c.dbg_name); - /* Disable root. */ - if (rcg->root_en_mask) { - reg_val &= ~(rcg->root_en_mask); - writel_relaxed(reg_val, reg); - } - /* Disable MN counter, if applicable. */ - if (rcg->current_freq->md_val) { - reg_val &= ~(rcg->mnd_en_mask); - writel_relaxed(reg_val, reg); - } - /* - * Program NS register to low-power value with an un-clocked or - * slowly-clocked source selected. - */ - if (rcg->ns_mask) { - reg_val = readl_relaxed(rcg->ns_reg); - reg_val &= ~(rcg->ns_mask); - reg_val |= (rcg->freq_tbl->ns_val & rcg->ns_mask); - writel_relaxed(reg_val, rcg->ns_reg); - } -} - -static int rcg_clk_prepare(struct clk *c) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - - WARN(rcg->current_freq == &rcg_dummy_freq, - "Attempting to prepare %s before setting its rate. " - "Set the rate first!\n", rcg->c.dbg_name); - rcg->prepared = true; - - return 0; -} - -/* Enable a rate-settable clock. */ -static int rcg_clk_enable(struct clk *c) -{ - unsigned long flags; - struct rcg_clk *rcg = to_rcg_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __rcg_clk_enable_reg(rcg); - rcg->enabled = true; - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return 0; -} - -/* Disable a rate-settable clock. */ -static void rcg_clk_disable(struct clk *c) -{ - unsigned long flags; - struct rcg_clk *rcg = to_rcg_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __rcg_clk_disable_reg(rcg); - rcg->enabled = false; - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static void rcg_clk_unprepare(struct clk *c) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - rcg->prepared = false; -} - -/* - * Frequency-related functions - */ - -/* Set a clock to an exact rate. */ -static int rcg_clk_set_rate(struct clk *c, unsigned long rate) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - struct clk_freq_tbl *nf, *cf; - struct clk *chld; - int rc = 0; - unsigned long flags; - - for (nf = rcg->freq_tbl; nf->freq_hz != FREQ_END - && nf->freq_hz != rate; nf++) - ; - - if (nf->freq_hz == FREQ_END) - return -EINVAL; - - cf = rcg->current_freq; - - /* Enable source clock dependency for the new frequency */ - if (rcg->prepared) { - rc = clk_prepare(nf->src_clk); - if (rc) - return rc; - - } - - spin_lock_irqsave(&c->lock, flags); - if (rcg->enabled) { - rc = clk_enable(nf->src_clk); - if (rc) { - spin_unlock_irqrestore(&c->lock, flags); - clk_unprepare(nf->src_clk); - return rc; - } - } - - spin_lock(&local_clock_reg_lock); - - /* Disable branch if clock isn't dual-banked with a glitch-free MUX. */ - if (!rcg->bank_info) { - /* Disable all branches to prevent glitches. */ - list_for_each_entry(chld, &rcg->c.children, siblings) { - struct branch_clk *x = to_branch_clk(chld); - /* - * We don't need to grab the child's lock because - * we hold the local_clock_reg_lock and 'enabled' is - * only modified within lock. - */ - if (x->enabled) - __branch_disable_reg(&x->b, x->c.dbg_name); - } - if (rcg->enabled) - __rcg_clk_disable_reg(rcg); - } - - /* Perform clock-specific frequency switch operations. */ - BUG_ON(!rcg->set_rate); - rcg->set_rate(rcg, nf); - - /* - * Current freq must be updated before __rcg_clk_enable_reg() - * is called to make sure the MNCNTR_EN bit is set correctly. - */ - rcg->current_freq = nf; - c->parent = nf->src_clk; - - /* Enable any clocks that were disabled. */ - if (!rcg->bank_info) { - if (rcg->enabled) - __rcg_clk_enable_reg(rcg); - /* Enable only branches that were ON before. */ - list_for_each_entry(chld, &rcg->c.children, siblings) { - struct branch_clk *x = to_branch_clk(chld); - if (x->enabled) - __branch_enable_reg(&x->b, x->c.dbg_name); - } - } - - spin_unlock(&local_clock_reg_lock); - - /* Release source requirements of the old freq. */ - if (rcg->enabled) - clk_disable(cf->src_clk); - spin_unlock_irqrestore(&c->lock, flags); - - if (rcg->prepared) - clk_unprepare(cf->src_clk); - - return rc; -} - -/* Check if a clock is currently enabled. */ -static int rcg_clk_is_enabled(struct clk *c) -{ - return to_rcg_clk(c)->enabled; -} - -/* - * Return a supported rate that's at least the specified rate or - * the max supported rate if the specified rate is larger than the - * max supported rate. - */ -static long rcg_clk_round_rate(struct clk *c, unsigned long rate) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - struct clk_freq_tbl *f; - - for (f = rcg->freq_tbl; f->freq_hz != FREQ_END; f++) - if (f->freq_hz >= rate) - return f->freq_hz; - - f--; - return f->freq_hz; -} - -/* Return the nth supported frequency for a given clock. */ -static long rcg_clk_list_rate(struct clk *c, unsigned n) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - - if (!rcg->freq_tbl || rcg->freq_tbl->freq_hz == FREQ_END) - return -ENXIO; - - return (rcg->freq_tbl + n)->freq_hz; -} - -/* Disable hw clock gating if not set at boot */ -enum handoff branch_handoff(struct branch *b, struct clk *c) -{ - if (!branch_in_hwcg_mode(b)) { - b->hwcg_mask = 0; - if (b->ctl_reg && readl_relaxed(b->ctl_reg) & b->en_mask) - return HANDOFF_ENABLED_CLK; - } - return HANDOFF_DISABLED_CLK; -} - -static enum handoff branch_clk_handoff(struct clk *c) -{ - struct branch_clk *br = to_branch_clk(c); - if (branch_handoff(&br->b, &br->c) == HANDOFF_ENABLED_CLK) { - br->enabled = true; - return HANDOFF_ENABLED_CLK; - } - - return HANDOFF_DISABLED_CLK; -} - -static struct clk *rcg_clk_get_parent(struct clk *c) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - uint32_t ctl_val, ns_val, md_val, ns_mask; - struct clk_freq_tbl *freq; - - ctl_val = readl_relaxed(rcg->b.ctl_reg); - - if (rcg->bank_info) { - const struct bank_masks *bank_masks = rcg->bank_info; - const struct bank_mask_info *bank_info; - if (!(ctl_val & bank_masks->bank_sel_mask)) - bank_info = &bank_masks->bank0_mask; - else - bank_info = &bank_masks->bank1_mask; - - ns_mask = bank_info->ns_mask; - md_val = bank_info->md_reg ? - readl_relaxed(bank_info->md_reg) : 0; - } else { - ns_mask = rcg->ns_mask; - md_val = rcg->md_reg ? readl_relaxed(rcg->md_reg) : 0; - } - - if (!ns_mask) - return NULL; - - ns_val = readl_relaxed(rcg->ns_reg) & ns_mask; - for (freq = rcg->freq_tbl; freq->freq_hz != FREQ_END; freq++) { - if ((freq->ns_val & ns_mask) == ns_val && - (!freq->md_val || freq->md_val == md_val)) - break; - } - - if (freq->freq_hz == FREQ_END) - return NULL; - - /* Cache the results for the handoff code. */ - rcg->current_freq = freq; - - return freq->src_clk; -} - -static enum handoff rcg_clk_handoff(struct clk *c) -{ - struct rcg_clk *rcg = to_rcg_clk(c); - enum handoff ret; - - if (rcg->current_freq && rcg->current_freq->freq_hz != FREQ_END) - c->rate = rcg->current_freq->freq_hz; - - ret = branch_handoff(&rcg->b, &rcg->c); - if (ret == HANDOFF_DISABLED_CLK) - return HANDOFF_DISABLED_CLK; - - rcg->prepared = true; - rcg->enabled = true; - return HANDOFF_ENABLED_CLK; -} - -struct clk_ops clk_ops_empty; - -struct fixed_clk gnd_clk = { - .c = { - .dbg_name = "ground_clk", - .ops = &clk_ops_empty, - CLK_INIT(gnd_clk.c), - }, -}; - -static int branch_clk_enable(struct clk *c) -{ - unsigned long flags; - struct branch_clk *br = to_branch_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_enable_reg(&br->b, br->c.dbg_name); - br->enabled = true; - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return 0; -} - -static void branch_clk_disable(struct clk *c) -{ - unsigned long flags; - struct branch_clk *br = to_branch_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_disable_reg(&br->b, br->c.dbg_name); - br->enabled = false; - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static int branch_clk_is_enabled(struct clk *c) -{ - return to_branch_clk(c)->enabled; -} - -static void branch_enable_hwcg(struct branch *b) -{ - unsigned long flags; - u32 reg_val; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - reg_val = readl_relaxed(b->hwcg_reg); - reg_val |= b->hwcg_mask; - writel_relaxed(reg_val, b->hwcg_reg); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static void branch_disable_hwcg(struct branch *b) -{ - unsigned long flags; - u32 reg_val; - - spin_lock_irqsave(&local_clock_reg_lock, flags); - reg_val = readl_relaxed(b->hwcg_reg); - reg_val &= ~b->hwcg_mask; - writel_relaxed(reg_val, b->hwcg_reg); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static void branch_clk_enable_hwcg(struct clk *c) -{ - branch_enable_hwcg(&to_branch_clk(c)->b); -} - -static void branch_clk_disable_hwcg(struct clk *c) -{ - branch_disable_hwcg(&to_branch_clk(c)->b); -} - -static int branch_set_flags(struct branch *b, unsigned flags) -{ - unsigned long irq_flags; - u32 reg_val; - int ret = 0; - - if (!b->retain_reg) - return -EPERM; - - spin_lock_irqsave(&local_clock_reg_lock, irq_flags); - reg_val = readl_relaxed(b->retain_reg); - switch (flags) { - case CLKFLAG_RETAIN_MEM: - reg_val |= b->retain_mask; - break; - case CLKFLAG_NORETAIN_MEM: - reg_val &= ~b->retain_mask; - break; - default: - ret = -EINVAL; - } - writel_relaxed(reg_val, b->retain_reg); - spin_unlock_irqrestore(&local_clock_reg_lock, irq_flags); - - return ret; -} - -static int branch_clk_set_flags(struct clk *clk, unsigned flags) -{ - return branch_set_flags(&to_branch_clk(clk)->b, flags); -} - -static int branch_clk_in_hwcg_mode(struct clk *c) -{ - return branch_in_hwcg_mode(&to_branch_clk(c)->b); -} - -static void rcg_clk_enable_hwcg(struct clk *c) -{ - branch_enable_hwcg(&to_rcg_clk(c)->b); -} - -static void rcg_clk_disable_hwcg(struct clk *c) -{ - branch_disable_hwcg(&to_rcg_clk(c)->b); -} - -static int rcg_clk_in_hwcg_mode(struct clk *c) -{ - return branch_in_hwcg_mode(&to_rcg_clk(c)->b); -} - -static int rcg_clk_set_flags(struct clk *clk, unsigned flags) -{ - return branch_set_flags(&to_rcg_clk(clk)->b, flags); -} - -int branch_reset(struct branch *b, enum clk_reset_action action) -{ - int ret = 0; - u32 reg_val; - unsigned long flags; - - if (!b->reset_reg) - return -EPERM; - - /* Disable hw gating when asserting a reset */ - if (b->hwcg_mask && action == CLK_RESET_ASSERT) - branch_disable_hwcg(b); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - /* Assert/Deassert reset */ - reg_val = readl_relaxed(b->reset_reg); - switch (action) { - case CLK_RESET_ASSERT: - reg_val |= b->reset_mask; - break; - case CLK_RESET_DEASSERT: - reg_val &= ~b->reset_mask; - break; - default: - ret = -EINVAL; - } - writel_relaxed(reg_val, b->reset_reg); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - /* Enable hw gating when deasserting a reset */ - if (b->hwcg_mask && action == CLK_RESET_DEASSERT) - branch_enable_hwcg(b); - /* Make sure write is issued before returning. */ - mb(); - return ret; -} - -static int branch_clk_reset(struct clk *c, enum clk_reset_action action) -{ - return branch_reset(&to_branch_clk(c)->b, action); -} - -struct clk_ops clk_ops_branch = { - .enable = branch_clk_enable, - .disable = branch_clk_disable, - .enable_hwcg = branch_clk_enable_hwcg, - .disable_hwcg = branch_clk_disable_hwcg, - .in_hwcg_mode = branch_clk_in_hwcg_mode, - .is_enabled = branch_clk_is_enabled, - .reset = branch_clk_reset, - .handoff = branch_clk_handoff, - .set_flags = branch_clk_set_flags, -}; - -struct clk_ops clk_ops_smi_2x = { - .prepare = branch_clk_enable, - .unprepare = branch_clk_disable, - .is_enabled = branch_clk_is_enabled, - .handoff = branch_clk_handoff, -}; - -struct clk_ops clk_ops_reset = { - .reset = branch_clk_reset, -}; - -static int rcg_clk_reset(struct clk *c, enum clk_reset_action action) -{ - return branch_reset(&to_rcg_clk(c)->b, action); -} - -struct clk_ops clk_ops_rcg = { - .prepare = rcg_clk_prepare, - .enable = rcg_clk_enable, - .disable = rcg_clk_disable, - .unprepare = rcg_clk_unprepare, - .enable_hwcg = rcg_clk_enable_hwcg, - .disable_hwcg = rcg_clk_disable_hwcg, - .in_hwcg_mode = rcg_clk_in_hwcg_mode, - .handoff = rcg_clk_handoff, - .set_rate = rcg_clk_set_rate, - .list_rate = rcg_clk_list_rate, - .is_enabled = rcg_clk_is_enabled, - .round_rate = rcg_clk_round_rate, - .reset = rcg_clk_reset, - .set_flags = rcg_clk_set_flags, - .get_parent = rcg_clk_get_parent, -}; - -static int cdiv_clk_enable(struct clk *c) -{ - unsigned long flags; - struct cdiv_clk *cdiv = to_cdiv_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_enable_reg(&cdiv->b, cdiv->c.dbg_name); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); - - return 0; -} - -static void cdiv_clk_disable(struct clk *c) -{ - unsigned long flags; - struct cdiv_clk *cdiv = to_cdiv_clk(c); - - spin_lock_irqsave(&local_clock_reg_lock, flags); - __branch_disable_reg(&cdiv->b, cdiv->c.dbg_name); - spin_unlock_irqrestore(&local_clock_reg_lock, flags); -} - -static int cdiv_clk_set_rate(struct clk *c, unsigned long rate) -{ - struct cdiv_clk *cdiv = to_cdiv_clk(c); - u32 reg_val; - - if (rate > cdiv->max_div) - return -EINVAL; - - spin_lock(&local_clock_reg_lock); - reg_val = readl_relaxed(cdiv->ns_reg); - reg_val &= ~(cdiv->ext_mask | (cdiv->max_div - 1) << cdiv->div_offset); - /* Non-zero rates mean set a divider, zero means use external input */ - if (rate) - reg_val |= (rate - 1) << cdiv->div_offset; - else - reg_val |= cdiv->ext_mask; - writel_relaxed(reg_val, cdiv->ns_reg); - spin_unlock(&local_clock_reg_lock); - - cdiv->cur_div = rate; - return 0; -} - -static unsigned long cdiv_clk_get_rate(struct clk *c) -{ - return to_cdiv_clk(c)->cur_div; -} - -static long cdiv_clk_round_rate(struct clk *c, unsigned long rate) -{ - return rate > to_cdiv_clk(c)->max_div ? -EPERM : rate; -} - -static long cdiv_clk_list_rate(struct clk *c, unsigned n) -{ - return n > to_cdiv_clk(c)->max_div ? -ENXIO : n; -} - -static enum handoff cdiv_clk_handoff(struct clk *c) -{ - struct cdiv_clk *cdiv = to_cdiv_clk(c); - enum handoff ret; - u32 reg_val; - - ret = branch_handoff(&cdiv->b, &cdiv->c); - if (ret == HANDOFF_DISABLED_CLK) - return ret; - - reg_val = readl_relaxed(cdiv->ns_reg); - if (reg_val & cdiv->ext_mask) { - cdiv->cur_div = 0; - } else { - reg_val >>= cdiv->div_offset; - cdiv->cur_div = (reg_val & (cdiv->max_div - 1)) + 1; - } - c->rate = cdiv->cur_div; - - return HANDOFF_ENABLED_CLK; -} - -static void cdiv_clk_enable_hwcg(struct clk *c) -{ - branch_enable_hwcg(&to_cdiv_clk(c)->b); -} - -static void cdiv_clk_disable_hwcg(struct clk *c) -{ - branch_disable_hwcg(&to_cdiv_clk(c)->b); -} - -static int cdiv_clk_in_hwcg_mode(struct clk *c) -{ - return branch_in_hwcg_mode(&to_cdiv_clk(c)->b); -} - -struct clk_ops clk_ops_cdiv = { - .enable = cdiv_clk_enable, - .disable = cdiv_clk_disable, - .in_hwcg_mode = cdiv_clk_in_hwcg_mode, - .enable_hwcg = cdiv_clk_enable_hwcg, - .disable_hwcg = cdiv_clk_disable_hwcg, - .handoff = cdiv_clk_handoff, - .set_rate = cdiv_clk_set_rate, - .get_rate = cdiv_clk_get_rate, - .list_rate = cdiv_clk_list_rate, - .round_rate = cdiv_clk_round_rate, -}; diff --git a/arch/arm/mach-msm/clock-local.h b/arch/arm/mach-msm/clock-local.h deleted file mode 100644 index 947685051970..000000000000 --- a/arch/arm/mach-msm/clock-local.h +++ /dev/null @@ -1,290 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ARCH_ARM_MACH_MSM_CLOCK_LOCAL_H -#define __ARCH_ARM_MACH_MSM_CLOCK_LOCAL_H - -#include -#include - -#define MN_MODE_DUAL_EDGE 0x2 - -/* MD Registers */ -#define MD4(m_lsb, m, n_lsb, n) \ - ((BVAL((m_lsb+3), m_lsb, m) | BVAL((n_lsb+3), n_lsb, ~(n))) \ - * !!(n)) -#define MD8(m_lsb, m, n_lsb, n) \ - ((BVAL((m_lsb+7), m_lsb, m) | BVAL((n_lsb+7), n_lsb, ~(n))) \ - * !!(n)) -#define MD16(m, n) ((BVAL(31, 16, m) | BVAL(15, 0, ~(n))) * !!(n)) - -/* NS Registers */ -#define NS(n_msb, n_lsb, n, m, mde_lsb, d_msb, d_lsb, d, s_msb, s_lsb, s) \ - (BVAL(n_msb, n_lsb, ~(n-m) * !!(n)) \ - | (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n)) \ - | BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s)) - -#define NS_MM(n_msb, n_lsb, n, m, d_msb, d_lsb, d, s_msb, s_lsb, s) \ - (BVAL(n_msb, n_lsb, ~(n-m) * !!(n))|BVAL(d_msb, d_lsb, (d-1)) \ - | BVAL(s_msb, s_lsb, s)) - -#define NS_DIVSRC(d_msb, d_lsb, d, s_msb, s_lsb, s) \ - (BVAL(d_msb, d_lsb, (d-1)) | BVAL(s_msb, s_lsb, s)) - -#define NS_DIV(d_msb, d_lsb, d) \ - BVAL(d_msb, d_lsb, (d-1)) - -#define NS_SRC_SEL(s_msb, s_lsb, s) \ - BVAL(s_msb, s_lsb, s) - -#define NS_MND_BANKED4(n0_lsb, n1_lsb, n, m, s0_lsb, s1_lsb, s) \ - (BVAL((n0_lsb+3), n0_lsb, ~(n-m) * !!(n)) \ - | BVAL((n1_lsb+3), n1_lsb, ~(n-m) * !!(n)) \ - | BVAL((s0_lsb+2), s0_lsb, s) \ - | BVAL((s1_lsb+2), s1_lsb, s)) - -#define NS_MND_BANKED8(n0_lsb, n1_lsb, n, m, s0_lsb, s1_lsb, s) \ - (BVAL((n0_lsb+7), n0_lsb, ~(n-m) * !!(n)) \ - | BVAL((n1_lsb+7), n1_lsb, ~(n-m) * !!(n)) \ - | BVAL((s0_lsb+2), s0_lsb, s) \ - | BVAL((s1_lsb+2), s1_lsb, s)) - -#define NS_DIVSRC_BANKED(d0_msb, d0_lsb, d1_msb, d1_lsb, d, \ - s0_msb, s0_lsb, s1_msb, s1_lsb, s) \ - (BVAL(d0_msb, d0_lsb, (d-1)) | BVAL(d1_msb, d1_lsb, (d-1)) \ - | BVAL(s0_msb, s0_lsb, s) \ - | BVAL(s1_msb, s1_lsb, s)) - -/* CC Registers */ -#define CC(mde_lsb, n) (BVAL((mde_lsb+1), mde_lsb, MN_MODE_DUAL_EDGE) * !!(n)) -#define CC_BANKED(mde0_lsb, mde1_lsb, n) \ - ((BVAL((mde0_lsb+1), mde0_lsb, MN_MODE_DUAL_EDGE) \ - | BVAL((mde1_lsb+1), mde1_lsb, MN_MODE_DUAL_EDGE)) \ - * !!(n)) - -/* - * Clock Definition Macros - */ -#define DEFINE_CLK_MEASURE(name) \ - struct clk name = { \ - .ops = &clk_ops_empty, \ - .dbg_name = #name, \ - CLK_INIT(name), \ - }; \ - -/* - * Generic frequency-definition structs and macros - */ -struct clk_freq_tbl { - const uint32_t freq_hz; - struct clk *const src_clk; - const uint32_t md_val; - const uint32_t ns_val; - const uint32_t ctl_val; - void *const extra_freq_data; -}; - -/* Some clocks have two banks to avoid glitches when switching frequencies. - * The unused bank is programmed while running on the other bank, and - * switched to afterwards. The following two structs describe the banks. */ -struct bank_mask_info { - void *const md_reg; - const uint32_t ns_mask; - const uint32_t rst_mask; - const uint32_t mnd_en_mask; - const uint32_t mode_mask; -}; - -struct bank_masks { - const uint32_t bank_sel_mask; - const struct bank_mask_info bank0_mask; - const struct bank_mask_info bank1_mask; -}; - -#define F_RAW(f, sc, m_v, n_v, c_v, e) { \ - .freq_hz = f, \ - .src_clk = sc, \ - .md_val = m_v, \ - .ns_val = n_v, \ - .ctl_val = c_v, \ - .extra_freq_data = e, \ - } -#define FREQ_END (UINT_MAX-1) -#define F_END { .freq_hz = FREQ_END } - -/** - * struct branch - branch on/off - * @ctl_reg: clock control register - * @en_mask: ORed with @ctl_reg to enable the clock - * @hwcg_reg: hardware clock gating register - * @hwcg_mask: ORed with @hwcg_reg to enable hardware clock gating - * @halt_reg: halt register - * @halt_check: type of halt check to perform - * @halt_bit: ANDed with @halt_reg to test for clock halted - * @reset_reg: reset register - * @reset_mask: ORed with @reset_reg to reset the clock domain - */ -struct branch { - void __iomem *const ctl_reg; - const u32 en_mask; - - void __iomem *hwcg_reg; - u32 hwcg_mask; - - void __iomem *const halt_reg; - const u16 halt_check; - const u16 halt_bit; - - void __iomem *const reset_reg; - const u32 reset_mask; - - void __iomem *const retain_reg; - const u32 retain_mask; -}; - -extern struct clk_ops clk_ops_branch; -extern struct clk_ops clk_ops_smi_2x; -extern struct clk_ops clk_ops_reset; - -int branch_reset(struct branch *b, enum clk_reset_action action); -void __branch_enable_reg(const struct branch *b, const char *name); -u32 __branch_disable_reg(const struct branch *b, const char *name); -enum handoff branch_handoff(struct branch *b, struct clk *c); - -/* - * Generic clock-definition struct and macros - */ -struct rcg_clk { - bool prepared; - bool enabled; - void *const ns_reg; - void *const md_reg; - - const uint32_t root_en_mask; - uint32_t ns_mask; - const uint32_t ctl_mask; - uint32_t mnd_en_mask; - - void *bank_info; - void (*set_rate)(struct rcg_clk *, struct clk_freq_tbl *); - - struct clk_freq_tbl *freq_tbl; - struct clk_freq_tbl *current_freq; - - struct branch b; - struct clk c; -}; - -static inline struct rcg_clk *to_rcg_clk(struct clk *c) -{ - return container_of(c, struct rcg_clk, c); -} - -extern struct clk_ops clk_ops_rcg; - -extern struct clk_freq_tbl rcg_dummy_freq; - -/** - * struct cdiv_clk - integer divider clock with external source selection - * @ns_reg: source select and divider settings register - * @ext_mask: bit to set to select an external source - * @cur_div: current divider setting (or 0 for external source) - * @max_div: maximum divider value supported (must be power of 2) - * @div_offset: number of bits to shift divider left by in @ns_reg - * @b: branch - * @c: clock - */ -struct cdiv_clk { - void __iomem *const ns_reg; - u32 ext_mask; - - unsigned long cur_div; - u8 div_offset; - u32 max_div; - - struct branch b; - struct clk c; -}; - -static inline struct cdiv_clk *to_cdiv_clk(struct clk *c) -{ - return container_of(c, struct cdiv_clk, c); -} - -extern struct clk_ops clk_ops_cdiv; - -/** - * struct fixed_clk - fixed rate clock (used for crystal oscillators) - * @c: clk - */ -struct fixed_clk { - struct clk c; -}; - -/** - * struct branch_clk - branch - * @enabled: true if clock is on, false otherwise - * @b: branch - * @c: clock - * - * An on/off switch with a rate derived from the parent. - */ -struct branch_clk { - bool enabled; - struct branch b; - struct clk c; -}; - -static inline struct branch_clk *to_branch_clk(struct clk *c) -{ - return container_of(c, struct branch_clk, c); -} - -/** - * struct measure_clk - for rate measurement debug use - * @sample_ticks: sample period in reference clock ticks - * @multiplier: measurement scale-up factor - * @divider: measurement scale-down factor - * @c: clock -*/ -struct measure_clk { - u64 sample_ticks; - u32 multiplier; - u32 divider; - struct clk c; -}; - -extern struct clk_ops clk_ops_empty; - -static inline struct measure_clk *to_measure_clk(struct clk *c) -{ - return container_of(c, struct measure_clk, c); -} - -/* - * Variables from clock-local driver - */ -extern spinlock_t local_clock_reg_lock; -extern struct fixed_clk gnd_clk; - -/* - * Generic set-rate implementations - */ -void set_rate_mnd(struct rcg_clk *rcg, struct clk_freq_tbl *nf); -void set_rate_nop(struct rcg_clk *rcg, struct clk_freq_tbl *nf); -void set_rate_mnd_8(struct rcg_clk *rcg, struct clk_freq_tbl *nf); -void set_rate_mnd_banked(struct rcg_clk *rcg, struct clk_freq_tbl *nf); -void set_rate_div_banked(struct rcg_clk *rcg, struct clk_freq_tbl *nf); - -#endif /* __ARCH_ARM_MACH_MSM_CLOCK_LOCAL_H */ - diff --git a/arch/arm/mach-msm/clock-pcom-lookup.c b/arch/arm/mach-msm/clock-pcom-lookup.c deleted file mode 100644 index 376af367aa91..000000000000 --- a/arch/arm/mach-msm/clock-pcom-lookup.c +++ /dev/null @@ -1,515 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "clock.h" -#include "clock-pll.h" -#include "clock-pcom.h" -#include "clock-voter.h" -#include - -#include -#include - -#define PLLn_MODE(n) (MSM_CLK_CTL_BASE + 0x300 + 28 * (n)) -#define PLL4_MODE (MSM_CLK_CTL_BASE + 0x374) - -static DEFINE_CLK_PCOM(adm_clk, ADM_CLK, 0); -static DEFINE_CLK_PCOM(adsp_clk, ADSP_CLK, 0); -static DEFINE_CLK_PCOM(ahb_m_clk, AHB_M_CLK, 0); -static DEFINE_CLK_PCOM(ahb_s_clk, AHB_S_CLK, 0); -static DEFINE_CLK_PCOM(cam_m_clk, CAM_M_CLK, 0); -static DEFINE_CLK_PCOM(axi_rotator_clk, AXI_ROTATOR_CLK, 0); -static DEFINE_CLK_PCOM(ce_clk, CE_CLK, 0); -static DEFINE_CLK_PCOM(csi0_clk, CSI0_CLK, 0); -static DEFINE_CLK_PCOM(csi0_p_clk, CSI0_P_CLK, 0); -static DEFINE_CLK_PCOM(csi0_vfe_clk, CSI0_VFE_CLK, 0); -static DEFINE_CLK_PCOM(csi1_clk, CSI1_CLK, 0); -static DEFINE_CLK_PCOM(csi1_p_clk, CSI1_P_CLK, 0); -static DEFINE_CLK_PCOM(csi1_vfe_clk, CSI1_VFE_CLK, 0); - -static struct pll_shared_clk pll0_clk = { - .id = PLL_0, - .mode_reg = PLLn_MODE(0), - .c = { - .ops = &clk_ops_pll, - .dbg_name = "pll0_clk", - CLK_INIT(pll0_clk.c), - }, -}; - -static struct pll_shared_clk pll1_clk = { - .id = PLL_1, - .mode_reg = PLLn_MODE(1), - .c = { - .ops = &clk_ops_pll, - .dbg_name = "pll1_clk", - CLK_INIT(pll1_clk.c), - }, -}; - -static struct pll_shared_clk pll2_clk = { - .id = PLL_2, - .mode_reg = PLLn_MODE(2), - .c = { - .ops = &clk_ops_pll, - .dbg_name = "pll2_clk", - CLK_INIT(pll2_clk.c), - }, -}; - -static struct pll_shared_clk pll4_clk = { - .id = PLL_4, - .mode_reg = PLL4_MODE, - .c = { - .ops = &clk_ops_pll, - .dbg_name = "pll4_clk", - CLK_INIT(pll4_clk.c), - }, -}; - -static struct pcom_clk dsi_byte_clk = { - .id = P_DSI_BYTE_CLK, - .c = { - .ops = &clk_ops_pcom_ext_config, - .dbg_name = "dsi_byte_clk", - CLK_INIT(dsi_byte_clk.c), - }, -}; - -static struct pcom_clk dsi_clk = { - .id = P_DSI_CLK, - .c = { - .ops = &clk_ops_pcom_ext_config, - .dbg_name = "dsi_clk", - CLK_INIT(dsi_clk.c), - }, -}; - -static struct pcom_clk dsi_esc_clk = { - .id = P_DSI_ESC_CLK, - .c = { - .ops = &clk_ops_pcom_ext_config, - .dbg_name = "dsi_esc_clk", - CLK_INIT(dsi_esc_clk.c), - }, -}; - -static struct pcom_clk dsi_pixel_clk = { - .id = P_DSI_PIXEL_CLK, - .c = { - .ops = &clk_ops_pcom_ext_config, - .dbg_name = "dsi_pixel_clk", - CLK_INIT(dsi_pixel_clk.c), - }, -}; - -static DEFINE_CLK_PCOM(dsi_ref_clk, DSI_REF_CLK, 0); -static DEFINE_CLK_PCOM(ebi1_clk, EBI1_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(ebi2_clk, EBI2_CLK, 0); -static DEFINE_CLK_PCOM(ecodec_clk, ECODEC_CLK, 0); -static DEFINE_CLK_PCOM(emdh_clk, EMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX); -static DEFINE_CLK_PCOM(gp_clk, GP_CLK, 0); -static DEFINE_CLK_PCOM(grp_2d_clk, GRP_2D_CLK, 0); -static DEFINE_CLK_PCOM(grp_2d_p_clk, GRP_2D_P_CLK, 0); -static DEFINE_CLK_PCOM(grp_3d_clk, GRP_3D_CLK, 0); -static DEFINE_CLK_PCOM(grp_3d_p_clk, GRP_3D_P_CLK, 0); -static DEFINE_CLK_PCOM(gsbi1_qup_clk, GSBI1_QUP_CLK, 0); -static DEFINE_CLK_PCOM(gsbi1_qup_p_clk, GSBI1_QUP_P_CLK, 0); -static DEFINE_CLK_PCOM(gsbi2_qup_clk, GSBI2_QUP_CLK, 0); -static DEFINE_CLK_PCOM(gsbi2_qup_p_clk, GSBI2_QUP_P_CLK, 0); -static DEFINE_CLK_PCOM(gsbi_clk, GSBI_CLK, 0); -static DEFINE_CLK_PCOM(gsbi_p_clk, GSBI_P_CLK, 0); -static DEFINE_CLK_PCOM(hdmi_clk, HDMI_CLK, 0); -static DEFINE_CLK_PCOM(i2c_clk, I2C_CLK, 0); -static DEFINE_CLK_PCOM(icodec_rx_clk, ICODEC_RX_CLK, 0); -static DEFINE_CLK_PCOM(icodec_tx_clk, ICODEC_TX_CLK, 0); -static DEFINE_CLK_PCOM(imem_clk, IMEM_CLK, 0); -static DEFINE_CLK_PCOM(mdc_clk, MDC_CLK, 0); -static DEFINE_CLK_PCOM(mdp_clk, MDP_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(mdp_lcdc_pad_pclk_clk, MDP_LCDC_PAD_PCLK_CLK, - 0); -static DEFINE_CLK_PCOM(mdp_lcdc_pclk_clk, MDP_LCDC_PCLK_CLK, - 0); -static DEFINE_CLK_PCOM(mdp_vsync_clk, MDP_VSYNC_CLK, 0); -static DEFINE_CLK_PCOM(mdp_dsi_p_clk, MDP_DSI_P_CLK, 0); -static DEFINE_CLK_PCOM(pbus_clk, PBUS_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(pcm_clk, PCM_CLK, 0); -static DEFINE_CLK_PCOM(pmdh_clk, PMDH_CLK, CLKFLAG_MIN | CLKFLAG_MAX); -static DEFINE_CLK_PCOM(sdac_clk, SDAC_CLK, 0); -static DEFINE_CLK_PCOM(sdc1_clk, SDC1_CLK, 0); -static DEFINE_CLK_PCOM(sdc1_p_clk, SDC1_P_CLK, 0); -static DEFINE_CLK_PCOM(sdc2_clk, SDC2_CLK, 0); -static DEFINE_CLK_PCOM(sdc2_p_clk, SDC2_P_CLK, 0); -static DEFINE_CLK_PCOM(sdc3_clk, SDC3_CLK, 0); -static DEFINE_CLK_PCOM(sdc3_p_clk, SDC3_P_CLK, 0); -static DEFINE_CLK_PCOM(sdc4_clk, SDC4_CLK, 0); -static DEFINE_CLK_PCOM(sdc4_p_clk, SDC4_P_CLK, 0); -static DEFINE_CLK_PCOM(spi_clk, SPI_CLK, 0); -static DEFINE_CLK_PCOM(tsif_clk, TSIF_CLK, 0); -static DEFINE_CLK_PCOM(tsif_p_clk, TSIF_P_CLK, 0); -static DEFINE_CLK_PCOM(tsif_ref_clk, TSIF_REF_CLK, 0); -static DEFINE_CLK_PCOM(tv_dac_clk, TV_DAC_CLK, 0); -static DEFINE_CLK_PCOM(tv_enc_clk, TV_ENC_CLK, 0); -static DEFINE_CLK_PCOM(uart1_clk, UART1_CLK, 0); -static DEFINE_CLK_PCOM(uart1dm_clk, UART1DM_CLK, 0); -static DEFINE_CLK_PCOM(uart2_clk, UART2_CLK, 0); -static DEFINE_CLK_PCOM(uart2dm_clk, UART2DM_CLK, 0); -static DEFINE_CLK_PCOM(uart3_clk, UART3_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs2_clk, USB_HS2_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs2_p_clk, USB_HS2_P_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs3_clk, USB_HS3_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs3_p_clk, USB_HS3_P_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs_clk, USB_HS_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs_core_clk, USB_HS_CORE_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs_p_clk, USB_HS_P_CLK, 0); -static DEFINE_CLK_PCOM(usb_otg_clk, USB_OTG_CLK, 0); -static DEFINE_CLK_PCOM(usb_phy_clk, USB_PHY_CLK, 0); -static DEFINE_CLK_PCOM(vdc_clk, VDC_CLK, CLKFLAG_MIN); -static DEFINE_CLK_PCOM(vfe_axi_clk, VFE_AXI_CLK, 0); -static DEFINE_CLK_PCOM(vfe_clk, VFE_CLK, 0); -static DEFINE_CLK_PCOM(vfe_mdc_clk, VFE_MDC_CLK, 0); - -static DEFINE_CLK_VOTER(ebi_acpu_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_grp_3d_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_grp_2d_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_lcdc_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_mddi_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_tv_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_usb_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_vfe_clk, &ebi1_clk.c, 0); -static DEFINE_CLK_VOTER(ebi_adm_clk, &ebi1_clk.c, 0); - -static struct clk_lookup msm_clocks_7x01a[] = { - CLK_LOOKUP("core_clk", adm_clk.c, "msm_dmov"), - CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL), - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("ebi2_clk", ebi2_clk.c, NULL), - CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL), - CLK_LOOKUP("core_clk", emdh_clk.c, "msm_mddi.1"), - CLK_LOOKUP("core_clk", gp_clk.c, ""), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", i2c_clk.c, "msm_i2c.0"), - CLK_LOOKUP("icodec_rx_clk", icodec_rx_clk.c, NULL), - CLK_LOOKUP("icodec_tx_clk", icodec_tx_clk.c, NULL), - CLK_LOOKUP("mem_clk", imem_clk.c, NULL), - CLK_LOOKUP("mdc_clk", mdc_clk.c, NULL), - CLK_LOOKUP("core_clk", pmdh_clk.c, "mddi.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("pbus_clk", pbus_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("sdac_clk", sdac_clk.c, NULL), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", tsif_clk.c, "msm_tsif.0"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("tv_dac_clk", tv_dac_clk.c, NULL), - CLK_LOOKUP("tv_enc_clk", tv_enc_clk.c, NULL), - CLK_LOOKUP("core_clk", uart1_clk.c, "msm_serial.0"), - CLK_LOOKUP("core_clk", uart2_clk.c, "msm_serial.1"), - CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2"), - CLK_LOOKUP("core_clk", uart1dm_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", uart2dm_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_hsusb_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_hsusb_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_hsusb_peripheral"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_hsusb_peripheral"), - CLK_LOOKUP("alt_core_clk", usb_otg_clk.c, NULL), - CLK_LOOKUP("vdc_clk", vdc_clk.c, NULL), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("vfe_mdc_clk", vfe_mdc_clk.c, NULL), -}; - -struct clock_init_data msm7x01a_clock_init_data __initdata = { - .table = msm_clocks_7x01a, - .size = ARRAY_SIZE(msm_clocks_7x01a), -}; - -static struct clk_lookup msm_clocks_7x27[] = { - CLK_LOOKUP("core_clk", adm_clk.c, "msm_dmov"), - CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL), - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("ebi2_clk", ebi2_clk.c, NULL), - CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL), - CLK_LOOKUP("core_clk", gp_clk.c, ""), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "footswitch-pcom.2"), - CLK_LOOKUP("iface_clk", grp_3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", i2c_clk.c, "msm_i2c.0"), - CLK_LOOKUP("iface_clk", grp_3d_p_clk.c, "footswitch-pcom.2"), - CLK_LOOKUP("icodec_rx_clk", icodec_rx_clk.c, NULL), - CLK_LOOKUP("icodec_tx_clk", icodec_tx_clk.c, NULL), - CLK_LOOKUP("mem_clk", imem_clk.c, NULL), - CLK_LOOKUP("mdc_clk", mdc_clk.c, NULL), - CLK_LOOKUP("core_clk", pmdh_clk.c, "mddi.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("mdp_clk", mdp_lcdc_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("lcdc_clk", mdp_lcdc_pad_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("pbus_clk", pbus_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("sdac_clk", sdac_clk.c, NULL), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", tsif_clk.c, "msm_tsif.0"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"), - CLK_LOOKUP("core_clk", uart1_clk.c, "msm_serial.0"), - CLK_LOOKUP("core_clk", uart2_clk.c, "msm_serial.1"), - CLK_LOOKUP("core_clk", uart1dm_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", uart2dm_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_otg_clk.c, NULL), - CLK_LOOKUP("phy_clk", usb_phy_clk.c, "msm_otg"), - CLK_LOOKUP("vdc_clk", vdc_clk.c, NULL), - CLK_LOOKUP("core_clk", vdc_clk.c, "footswitch-pcom.7"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-pcom.8"), - CLK_LOOKUP("vfe_mdc_clk", vfe_mdc_clk.c, NULL), - - CLK_LOOKUP("ebi1_acpu_clk", ebi_acpu_clk.c, NULL), - CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "lcdc.0"), - CLK_LOOKUP("mem_clk", ebi_mddi_clk.c, "mddi.0"), - CLK_LOOKUP("core_clk", ebi_usb_clk.c, "msm_otg"), - CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL), - CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov"), - - CLK_LOOKUP("pll0_clk", pll0_clk.c, "acpu"), - CLK_LOOKUP("pll1_clk", pll1_clk.c, "acpu"), - CLK_LOOKUP("pll2_clk", pll2_clk.c, "acpu"), -}; - -struct clock_init_data msm7x27_clock_init_data __initdata = { - .table = msm_clocks_7x27, - .size = ARRAY_SIZE(msm_clocks_7x27), - .pre_init = msm_shared_pll_control_init, -}; - -/* Clock table for common clocks between 7627a and 7625a */ -static struct clk_lookup msm_cmn_clk_7625a_7627a[] __initdata = { - CLK_LOOKUP("core_clk", adm_clk.c, "msm_dmov"), - CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL), - CLK_LOOKUP("master_iface_clk", ahb_m_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("slave_iface_clk", ahb_s_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("cam_m_clk", cam_m_clk.c, NULL), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-0036"), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-001b"), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-0010"), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-0078"), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-006c"), - CLK_LOOKUP("cam_clk", cam_m_clk.c, "0-000d"), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_pclk", csi0_p_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_vfe_clk", csi0_vfe_clk.c, "msm_camera_ov9726.0"), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_pclk", csi0_p_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_vfe_clk", csi0_vfe_clk.c, "msm_camera_ov7692.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, NULL), - CLK_LOOKUP("csi_pclk", csi1_p_clk.c, NULL), - CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, NULL), - CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csic.0"), - CLK_LOOKUP("csi_pclk", csi0_p_clk.c, "msm_csic.0"), - CLK_LOOKUP("csi_vfe_clk", csi0_vfe_clk.c, "msm_csic.0"), - CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csic.1"), - CLK_LOOKUP("csi_pclk", csi1_p_clk.c, "msm_csic.1"), - CLK_LOOKUP("csi_vfe_clk", csi1_vfe_clk.c, "msm_csic.1"), - CLK_LOOKUP("byte_clk", dsi_byte_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("core_clk", dsi_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("esc_clk", dsi_esc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("pixel_clk", dsi_pixel_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("ref_clk", dsi_ref_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("ebi2_clk", ebi2_clk.c, NULL), - CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL), - CLK_LOOKUP("core_clk", gp_clk.c, ""), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "footswitch-pcom.2"), - CLK_LOOKUP("iface_clk", grp_3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("iface_clk", grp_3d_p_clk.c, "footswitch-pcom.2"), - CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "qup_i2c.0"), - CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, "qup_i2c.1"), - CLK_LOOKUP("iface_clk", gsbi1_qup_p_clk.c, "qup_i2c.0"), - CLK_LOOKUP("iface_clk", gsbi2_qup_p_clk.c, "qup_i2c.1"), - CLK_LOOKUP("icodec_rx_clk", icodec_rx_clk.c, NULL), - CLK_LOOKUP("icodec_tx_clk", icodec_tx_clk.c, NULL), - CLK_LOOKUP("mem_clk", imem_clk.c, NULL), - CLK_LOOKUP("core_clk", pmdh_clk.c, "mddi.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("mdp_clk", mdp_lcdc_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("lcdc_clk", mdp_lcdc_pad_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("mdp_clk", mdp_dsi_p_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("pbus_clk", pbus_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("sdac_clk", sdac_clk.c, NULL), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"), - CLK_LOOKUP("core_clk", uart1_clk.c, "msm_serial.0"), - CLK_LOOKUP("core_clk", uart2_clk.c, "msm_serial.1"), - CLK_LOOKUP("core_clk", uart1dm_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", uart2dm_clk.c, "msm_serial_hsl.0"), - CLK_LOOKUP("core_clk", usb_hs_core_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_otg"), - CLK_LOOKUP("phy_clk", usb_phy_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs2_clk.c, "msm_hsusb_host.0"), - CLK_LOOKUP("vdc_clk", vdc_clk.c, NULL), - CLK_LOOKUP("core_clk", vdc_clk.c, "footswitch-pcom.7"), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"), - CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-pcom.8"), - CLK_LOOKUP("vfe_mdc_clk", vfe_mdc_clk.c, NULL), - - CLK_LOOKUP("ebi1_acpu_clk", ebi_acpu_clk.c, NULL), - CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "lcdc.0"), - CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("mem_clk", ebi_mddi_clk.c, "mddi.0"), - CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL), - CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov"), - - CLK_LOOKUP("pll0_clk", pll0_clk.c, "acpu"), - CLK_LOOKUP("pll1_clk", pll1_clk.c, "acpu"), - CLK_LOOKUP("pll2_clk", pll2_clk.c, "acpu"), - -}; - -/* PLL 4 clock is available for 7627a target. */ -static struct clk_lookup msm_clk_7627a[] __initdata = { - CLK_LOOKUP("pll4_clk", pll4_clk.c, "acpu"), -}; - -static struct clk_lookup msm_clk_7627a_7625a[ARRAY_SIZE(msm_cmn_clk_7625a_7627a) - + ARRAY_SIZE(msm_clk_7627a)]; - -static void __init msm7627a_clock_pre_init(void) -{ - int size = ARRAY_SIZE(msm_cmn_clk_7625a_7627a); - - /* Intialize shared PLL control structure */ - msm_shared_pll_control_init(); - - memcpy(&msm_clk_7627a_7625a, &msm_cmn_clk_7625a_7627a, - sizeof(msm_cmn_clk_7625a_7627a)); - if (!cpu_is_msm7x25a()) { - memcpy(&msm_clk_7627a_7625a[size], - &msm_clk_7627a, sizeof(msm_clk_7627a)); - size += ARRAY_SIZE(msm_clk_7627a); - } - msm7x27a_clock_init_data.size = size; -} - -struct clock_init_data msm7x27a_clock_init_data __initdata = { - .table = msm_clk_7627a_7625a, - .pre_init = msm7627a_clock_pre_init, -}; - -static struct clk_lookup msm_clocks_8x50[] = { - CLK_LOOKUP("core_clk", adm_clk.c, "msm_dmov"), - CLK_LOOKUP("core_clk", ce_clk.c, "qce.0"), - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("ebi2_clk", ebi2_clk.c, NULL), - CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL), - CLK_LOOKUP("core_clk", emdh_clk.c, "msm_mddi.1"), - CLK_LOOKUP("core_clk", gp_clk.c, ""), - CLK_LOOKUP("core_clk", grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", i2c_clk.c, "msm_i2c.0"), - CLK_LOOKUP("icodec_rx_clk", icodec_rx_clk.c, NULL), - CLK_LOOKUP("icodec_tx_clk", icodec_tx_clk.c, NULL), - CLK_LOOKUP("mem_clk", imem_clk.c, NULL), - CLK_LOOKUP("mdc_clk", mdc_clk.c, NULL), - CLK_LOOKUP("core_clk", pmdh_clk.c, "mddi.0"), - CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"), - CLK_LOOKUP("mdp_clk", mdp_lcdc_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("lcdc_clk", mdp_lcdc_pad_pclk_clk.c, "lcdc.0"), - CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"), - CLK_LOOKUP("pbus_clk", pbus_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("sdac_clk", sdac_clk.c, NULL), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", spi_clk.c, "spi_qsd.0"), - CLK_DUMMY("iface_clk", SPI_P_CLK, "spi_qsd.0", 0), - CLK_LOOKUP("core_clk", tsif_clk.c, "msm_tsif.0"), - CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"), - CLK_LOOKUP("tv_dac_clk", tv_dac_clk.c, NULL), - CLK_LOOKUP("tv_enc_clk", tv_enc_clk.c, NULL), - CLK_LOOKUP("core_clk", uart1_clk.c, "msm_serial.0"), - CLK_LOOKUP("core_clk", uart2_clk.c, "msm_serial.1"), - CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2"), - CLK_LOOKUP("core_clk", uart1dm_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", uart2dm_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_otg_clk.c, NULL), - CLK_LOOKUP("vdc_clk", vdc_clk.c, NULL), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("vfe_mdc_clk", vfe_mdc_clk.c, NULL), - CLK_LOOKUP("vfe_axi_clk", vfe_axi_clk.c, NULL), - CLK_LOOKUP("alt_core_clk", usb_hs2_clk.c, "msm_hsusb_host.0"), - CLK_LOOKUP("iface_clk", usb_hs2_p_clk.c, "msm_hsusb_host.0"), - CLK_LOOKUP("alt_core_clk", usb_hs3_clk.c, ""), - CLK_LOOKUP("iface_clk", usb_hs3_p_clk.c, ""), - CLK_LOOKUP("phy_clk", usb_phy_clk.c, "msm_otg"), - - CLK_LOOKUP("ebi1_acpu_clk", ebi_acpu_clk.c, NULL), - CLK_LOOKUP("bus_clk", ebi_grp_3d_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("bus_clk", ebi_grp_2d_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "lcdc.0"), - CLK_LOOKUP("mem_clk", ebi_lcdc_clk.c, "mipi_dsi.1"), - CLK_LOOKUP("mem_clk", ebi_mddi_clk.c, "mddi.0"), - CLK_LOOKUP("mem_clk", ebi_tv_clk.c, "tvenc.0"), - CLK_LOOKUP("core_clk", ebi_usb_clk.c, "msm_otg"), - CLK_LOOKUP("core_clk", ebi_usb_clk.c, "msm_hsusb_host.0"), - CLK_LOOKUP("ebi1_vfe_clk", ebi_vfe_clk.c, NULL), - CLK_LOOKUP("mem_clk", ebi_adm_clk.c, "msm_dmov"), - - CLK_LOOKUP("iface_clk", grp_3d_p_clk.c, "kgsl-3d0.0"), - CLK_LOOKUP("core_clk", grp_2d_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("iface_clk", grp_2d_p_clk.c, "kgsl-2d0.0"), - CLK_LOOKUP("core_clk", gsbi_clk.c, "qup_i2c.4"), - CLK_LOOKUP("iface_clk", gsbi_p_clk.c, "qup_i2c.4"), -}; - -struct clock_init_data qds8x50_clock_init_data __initdata = { - .table = msm_clocks_8x50, - .size = ARRAY_SIZE(msm_clocks_8x50), -}; diff --git a/arch/arm/mach-msm/clock-pcom.c b/arch/arm/mach-msm/clock-pcom.c deleted file mode 100644 index 72bb0b4e5ca6..000000000000 --- a/arch/arm/mach-msm/clock-pcom.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2007-2011, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include - -#include "clock.h" -#include "clock-pcom.h" - -/* - * glue for the proc_comm interface - */ -static int pc_clk_enable(struct clk *clk) -{ - int rc; - int id = to_pcom_clk(clk)->id; - - /* Ignore clocks that are always on */ - if (id == P_EBI1_CLK || id == P_EBI1_FIXED_CLK) - return 0; - - rc = msm_proc_comm(PCOM_CLKCTL_RPC_ENABLE, &id, NULL); - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static void pc_clk_disable(struct clk *clk) -{ - int id = to_pcom_clk(clk)->id; - - /* Ignore clocks that are always on */ - if (id == P_EBI1_CLK || id == P_EBI1_FIXED_CLK) - return; - - msm_proc_comm(PCOM_CLKCTL_RPC_DISABLE, &id, NULL); -} - -int pc_clk_reset(unsigned id, enum clk_reset_action action) -{ - int rc; - - if (action == CLK_RESET_ASSERT) - rc = msm_proc_comm(PCOM_CLKCTL_RPC_RESET_ASSERT, &id, NULL); - else - rc = msm_proc_comm(PCOM_CLKCTL_RPC_RESET_DEASSERT, &id, NULL); - - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static int pc_reset(struct clk *clk, enum clk_reset_action action) -{ - int id = to_pcom_clk(clk)->id; - return pc_clk_reset(id, action); -} - -static int _pc_clk_set_rate(struct clk *clk, unsigned long rate) -{ - /* The rate _might_ be rounded off to the nearest KHz value by the - * remote function. So a return value of 0 doesn't necessarily mean - * that the exact rate was set successfully. - */ - unsigned r = rate; - int id = to_pcom_clk(clk)->id; - int rc = msm_proc_comm(PCOM_CLKCTL_RPC_SET_RATE, &id, &r); - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static int _pc_clk_set_min_rate(struct clk *clk, unsigned long rate) -{ - int rc; - int id = to_pcom_clk(clk)->id; - bool ignore_error = (cpu_is_msm7x27() && id == P_EBI1_CLK && - rate >= INT_MAX); - unsigned r = rate; - rc = msm_proc_comm(PCOM_CLKCTL_RPC_MIN_RATE, &id, &r); - if (rc < 0) - return rc; - else if (ignore_error) - return 0; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static int pc_clk_set_rate(struct clk *clk, unsigned long rate) -{ - if (clk->flags & CLKFLAG_MIN) - return _pc_clk_set_min_rate(clk, rate); - else - return _pc_clk_set_rate(clk, rate); -} - -static int pc_clk_set_max_rate(struct clk *clk, unsigned long rate) -{ - int id = to_pcom_clk(clk)->id; - unsigned r = rate; - int rc = msm_proc_comm(PCOM_CLKCTL_RPC_MAX_RATE, &id, &r); - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static int pc_clk_set_flags(struct clk *clk, unsigned flags) -{ - int id = to_pcom_clk(clk)->id; - int rc = msm_proc_comm(PCOM_CLKCTL_RPC_SET_FLAGS, &id, &flags); - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static int pc_clk_set_ext_config(struct clk *clk, unsigned long config) -{ - int id = to_pcom_clk(clk)->id; - unsigned c = config; - int rc = msm_proc_comm(PCOM_CLKCTL_RPC_SET_EXT_CONFIG, &id, &c); - if (rc < 0) - return rc; - else - return (int)id < 0 ? -EINVAL : 0; -} - -static unsigned long pc_clk_get_rate(struct clk *clk) -{ - int id = to_pcom_clk(clk)->id; - if (msm_proc_comm(PCOM_CLKCTL_RPC_RATE, &id, NULL)) - return 0; - else - return id; -} - -static int pc_clk_is_enabled(struct clk *clk) -{ - int id = to_pcom_clk(clk)->id; - if (msm_proc_comm(PCOM_CLKCTL_RPC_ENABLED, &id, NULL)) - return 0; - else - return id; -} - -static long pc_clk_round_rate(struct clk *clk, unsigned long rate) -{ - - /* Not really supported; pc_clk_set_rate() does rounding on it's own. */ - return rate; -} - -static bool pc_clk_is_local(struct clk *clk) -{ - return false; -} - -static enum handoff pc_clk_handoff(struct clk *clk) -{ - /* - * Handoff clock state only since querying and caching the rate here - * would incur more overhead than it would ever save. - */ - if (pc_clk_is_enabled(clk)) - return HANDOFF_ENABLED_CLK; - - return HANDOFF_DISABLED_CLK; -} - -struct clk_ops clk_ops_pcom = { - .enable = pc_clk_enable, - .disable = pc_clk_disable, - .reset = pc_reset, - .set_rate = pc_clk_set_rate, - .set_max_rate = pc_clk_set_max_rate, - .set_flags = pc_clk_set_flags, - .get_rate = pc_clk_get_rate, - .is_enabled = pc_clk_is_enabled, - .round_rate = pc_clk_round_rate, - .is_local = pc_clk_is_local, - .handoff = pc_clk_handoff, -}; - -struct clk_ops clk_ops_pcom_ext_config = { - .enable = pc_clk_enable, - .disable = pc_clk_disable, - .reset = pc_reset, - .set_rate = pc_clk_set_ext_config, - .set_max_rate = pc_clk_set_max_rate, - .set_flags = pc_clk_set_flags, - .get_rate = pc_clk_get_rate, - .is_enabled = pc_clk_is_enabled, - .round_rate = pc_clk_round_rate, - .is_local = pc_clk_is_local, - .handoff = pc_clk_handoff, -}; - diff --git a/arch/arm/mach-msm/clock-pcom.h b/arch/arm/mach-msm/clock-pcom.h deleted file mode 100644 index dcf57365c6c1..000000000000 --- a/arch/arm/mach-msm/clock-pcom.h +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_CLOCK_PCOM_H -#define __ARCH_ARM_MACH_MSM_CLOCK_PCOM_H - -#include - -/* clock IDs used by the modem processor */ - -#define P_ACPU_CLK 0 /* Applications processor clock */ -#define P_ADM_CLK 1 /* Applications data mover clock */ -#define P_ADSP_CLK 2 /* ADSP clock */ -#define P_EBI1_CLK 3 /* External bus interface 1 clock */ -#define P_EBI2_CLK 4 /* External bus interface 2 clock */ -#define P_ECODEC_CLK 5 /* External CODEC clock */ -#define P_EMDH_CLK 6 /* External MDDI host clock */ -#define P_GP_CLK 7 /* General purpose clock */ -#define P_GRP_3D_CLK 8 /* Graphics clock */ -#define P_I2C_CLK 9 /* I2C clock */ -#define P_ICODEC_RX_CLK 10 /* Internal CODEX RX clock */ -#define P_ICODEC_TX_CLK 11 /* Internal CODEX TX clock */ -#define P_IMEM_CLK 12 /* Internal graphics memory clock */ -#define P_MDC_CLK 13 /* MDDI client clock */ -#define P_MDP_CLK 14 /* Mobile display processor clock */ -#define P_PBUS_CLK 15 /* Peripheral bus clock */ -#define P_PCM_CLK 16 /* PCM clock */ -#define P_PMDH_CLK 17 /* Primary MDDI host clock */ -#define P_SDAC_CLK 18 /* Stereo DAC clock */ -#define P_SDC1_CLK 19 /* Secure Digital Card clocks */ -#define P_SDC1_P_CLK 20 -#define P_SDC2_CLK 21 -#define P_SDC2_P_CLK 22 -#define P_SDC3_CLK 23 -#define P_SDC3_P_CLK 24 -#define P_SDC4_CLK 25 -#define P_SDC4_P_CLK 26 -#define P_TSIF_CLK 27 /* Transport Stream Interface clocks */ -#define P_TSIF_REF_CLK 28 -#define P_TV_DAC_CLK 29 /* TV clocks */ -#define P_TV_ENC_CLK 30 -#define P_UART1_CLK 31 /* UART clocks */ -#define P_UART2_CLK 32 -#define P_UART3_CLK 33 -#define P_UART1DM_CLK 34 -#define P_UART2DM_CLK 35 -#define P_USB_HS_CLK 36 /* High speed USB core clock */ -#define P_USB_HS_P_CLK 37 /* High speed USB pbus clock */ -#define P_USB_OTG_CLK 38 /* Full speed USB clock */ -#define P_VDC_CLK 39 /* Video controller clock */ -#define P_VFE_MDC_CLK 40 /* Camera / Video Front End clock */ -#define P_VFE_CLK 41 /* VFE MDDI client clock */ -#define P_MDP_LCDC_PCLK_CLK 42 -#define P_MDP_LCDC_PAD_PCLK_CLK 43 -#define P_MDP_VSYNC_CLK 44 -#define P_SPI_CLK 45 -#define P_VFE_AXI_CLK 46 -#define P_USB_HS2_CLK 47 /* High speed USB 2 core clock */ -#define P_USB_HS2_P_CLK 48 /* High speed USB 2 pbus clock */ -#define P_USB_HS3_CLK 49 /* High speed USB 3 core clock */ -#define P_USB_HS3_P_CLK 50 /* High speed USB 3 pbus clock */ -#define P_GRP_3D_P_CLK 51 /* Graphics pbus clock */ -#define P_USB_PHY_CLK 52 /* USB PHY clock */ -#define P_USB_HS_CORE_CLK 53 /* High speed USB 1 core clock */ -#define P_USB_HS2_CORE_CLK 54 /* High speed USB 2 core clock */ -#define P_USB_HS3_CORE_CLK 55 /* High speed USB 3 core clock */ -#define P_CAM_M_CLK 56 -#define P_CAMIF_PAD_P_CLK 57 -#define P_GRP_2D_CLK 58 -#define P_GRP_2D_P_CLK 59 -#define P_I2S_CLK 60 -#define P_JPEG_CLK 61 -#define P_JPEG_P_CLK 62 -#define P_LPA_CODEC_CLK 63 -#define P_LPA_CORE_CLK 64 -#define P_LPA_P_CLK 65 -#define P_MDC_IO_CLK 66 -#define P_MDC_P_CLK 67 -#define P_MFC_CLK 68 -#define P_MFC_DIV2_CLK 69 -#define P_MFC_P_CLK 70 -#define P_QUP_I2C_CLK 71 -#define P_ROTATOR_IMEM_CLK 72 -#define P_ROTATOR_P_CLK 73 -#define P_VFE_CAMIF_CLK 74 -#define P_VFE_P_CLK 75 -#define P_VPE_CLK 76 -#define P_I2C_2_CLK 77 -#define P_MI2S_CODEC_RX_S_CLK 78 -#define P_MI2S_CODEC_RX_M_CLK 79 -#define P_MI2S_CODEC_TX_S_CLK 80 -#define P_MI2S_CODEC_TX_M_CLK 81 -#define P_PMDH_P_CLK 82 -#define P_EMDH_P_CLK 83 -#define P_SPI_P_CLK 84 -#define P_TSIF_P_CLK 85 -#define P_MDP_P_CLK 86 -#define P_SDAC_M_CLK 87 -#define P_MI2S_S_CLK 88 -#define P_MI2S_M_CLK 89 -#define P_AXI_ROTATOR_CLK 90 -#define P_HDMI_CLK 91 -#define P_CSI0_CLK 92 -#define P_CSI0_VFE_CLK 93 -#define P_CSI0_P_CLK 94 -#define P_CSI1_CLK 95 -#define P_CSI1_VFE_CLK 96 -#define P_CSI1_P_CLK 97 -#define P_GSBI_CLK 98 -#define P_GSBI_P_CLK 99 -#define P_CE_CLK 100 /* Crypto engine */ -#define P_CODEC_SSBI_CLK 101 -#define P_TCXO_DIV4_CLK 102 -#define P_GSBI1_QUP_CLK 103 -#define P_GSBI2_QUP_CLK 104 -#define P_GSBI1_QUP_P_CLK 105 -#define P_GSBI2_QUP_P_CLK 106 -#define P_DSI_CLK 107 -#define P_DSI_ESC_CLK 108 -#define P_DSI_PIXEL_CLK 109 -#define P_DSI_BYTE_CLK 110 -#define P_EBI1_FIXED_CLK 111 /* Not dropped during power-collapse */ -#define P_DSI_REF_CLK 112 -#define P_MDP_DSI_P_CLK 113 -#define P_AHB_M_CLK 114 -#define P_AHB_S_CLK 115 - -#define P_NR_CLKS 116 - -extern int pc_clk_reset(unsigned id, enum clk_reset_action action); - -struct clk_ops; -extern struct clk_ops clk_ops_pcom; -extern struct clk_ops clk_ops_pcom_div2; -extern struct clk_ops clk_ops_pcom_ext_config; - -/* - * struct pcom_clk - proc_comm controlled clock - * @id: proc_comm identifier - * @c: - */ -struct pcom_clk { - unsigned id; - struct clk c; -}; - -static inline struct pcom_clk *to_pcom_clk(struct clk *clk) -{ - return container_of(clk, struct pcom_clk, c); -} - -#define DEFINE_CLK_PCOM(clk_name, clk_id, clk_flags) \ - struct pcom_clk clk_name = { \ - .id = P_##clk_id, \ - .c = { \ - .ops = &clk_ops_pcom, \ - .flags = clk_flags, \ - .dbg_name = #clk_id, \ - CLK_INIT(clk_name.c), \ - }, \ - } - -#endif diff --git a/arch/arm/mach-msm/dal.c b/arch/arm/mach-msm/dal.c deleted file mode 100644 index 74dfe37cd3e4..000000000000 --- a/arch/arm/mach-msm/dal.c +++ /dev/null @@ -1,1326 +0,0 @@ -/* Copyright (c) 2008-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -/* - * Device access library (DAL) implementation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define DALRPC_PROTOCOL_VERSION 0x11 -#define DALRPC_SUCCESS 0 -#define DALRPC_MAX_PORTNAME_LEN 64 -#define DALRPC_MAX_ATTACH_PARAM_LEN 64 -#define DALRPC_MAX_SERVICE_NAME_LEN 32 -#define DALRPC_MAX_PARAMS 128 -#define DALRPC_MAX_PARAMS_SIZE (DALRPC_MAX_PARAMS * 4) -#define DALRPC_MAX_MSG_SIZE (sizeof(struct dalrpc_msg_hdr) + \ - DALRPC_MAX_PARAMS_SIZE) -#define DALRPC_MSGID_DDI 0x0 -#define DALRPC_MSGID_DDI_REPLY 0x80 -#define DALRPC_MSGID_ATTACH_REPLY 0x81 -#define DALRPC_MSGID_DETACH_REPLY 0x82 -#define DALRPC_MSGID_ASYNCH 0xC0 -#define ROUND_BUFLEN(x) (((x + 3) & ~0x3)) - -struct dalrpc_msg_hdr { - uint32_t len:16; - uint32_t proto_ver:8; - uint32_t prio:7; - uint32_t async:1; - uint32_t ddi_idx:16; - uint32_t proto_id:8; - uint32_t msgid:8; - void *from; - void *to; -}; - -struct dalrpc_msg { - struct dalrpc_msg_hdr hdr; - uint32_t param[DALRPC_MAX_PARAMS]; -}; - -struct dalrpc_event_handle { - struct list_head list; - - int flag; - spinlock_t lock; -}; - -struct dalrpc_cb_handle { - struct list_head list; - - void (*fn)(void *, uint32_t, void *, uint32_t); - void *context; -}; - -struct daldevice_handle {; - struct list_head list; - - void *remote_handle; - struct completion read_completion; - struct dalrpc_port *port; - struct dalrpc_msg msg; - struct mutex client_lock; -}; - -struct dalrpc_port { - struct list_head list; - - char port[DALRPC_MAX_PORTNAME_LEN+1]; - int refcount; - - struct workqueue_struct *wq; - struct work_struct port_work; - struct mutex write_lock; - - smd_channel_t *ch; - - struct dalrpc_msg msg_in; - struct daldevice_handle *msg_owner; - unsigned msg_bytes_read; - - struct list_head event_list; - struct mutex event_list_lock; - - struct list_head cb_list; - struct mutex cb_list_lock; -}; - -static LIST_HEAD(port_list); -static LIST_HEAD(client_list); -static DEFINE_MUTEX(pc_lists_lock); - -static DECLARE_WAIT_QUEUE_HEAD(event_wq); - -static int client_exists(void *handle) -{ - struct daldevice_handle *h; - - if (!handle) - return 0; - - mutex_lock(&pc_lists_lock); - - list_for_each_entry(h, &client_list, list) - if (h == handle) { - mutex_unlock(&pc_lists_lock); - return 1; - } - - mutex_unlock(&pc_lists_lock); - - return 0; -} - -static int client_exists_locked(void *handle) -{ - struct daldevice_handle *h; - - /* this function must be called with pc_lists_lock acquired */ - - if (!handle) - return 0; - - list_for_each_entry(h, &client_list, list) - if (h == handle) - return 1; - - return 0; -} - -static int port_exists(struct dalrpc_port *p) -{ - struct dalrpc_port *p_iter; - - /* this function must be called with pc_lists_lock acquired */ - - if (!p) - return 0; - - list_for_each_entry(p_iter, &port_list, list) - if (p_iter == p) - return 1; - - return 0; -} - -static struct dalrpc_port *port_name_exists(char *port) -{ - struct dalrpc_port *p; - - /* this function must be called with pc_lists_lock acquired */ - - list_for_each_entry(p, &port_list, list) - if (!strcmp(p->port, port)) - return p; - - return NULL; -} - -static void port_close(struct dalrpc_port *p) -{ - mutex_lock(&pc_lists_lock); - - p->refcount--; - if (p->refcount == 0) - list_del(&p->list); - - mutex_unlock(&pc_lists_lock); - - if (p->refcount == 0) { - destroy_workqueue(p->wq); - smd_close(p->ch); - kfree(p); - } -} - -static int event_exists(struct dalrpc_port *p, - struct dalrpc_event_handle *ev) -{ - struct dalrpc_event_handle *ev_iter; - - /* this function must be called with event_list_lock acquired */ - - list_for_each_entry(ev_iter, &p->event_list, list) - if (ev_iter == ev) - return 1; - - return 0; -} - -static int cb_exists(struct dalrpc_port *p, - struct dalrpc_cb_handle *cb) -{ - struct dalrpc_cb_handle *cb_iter; - - /* this function must be called with the cb_list_lock acquired */ - - list_for_each_entry(cb_iter, &p->cb_list, list) - if (cb_iter == cb) - return 1; - - return 0; -} - -static int check_version(struct dalrpc_msg_hdr *msg_hdr) -{ - static int version_msg = 1; - - /* disabled because asynch events currently have no version */ - return 0; - - if (msg_hdr->proto_ver != DALRPC_PROTOCOL_VERSION) { - if (version_msg) { - printk(KERN_ERR "dalrpc: incompatible verison\n"); - version_msg = 0; - } - return -1; - } - return 0; -} - -static void process_asynch(struct dalrpc_port *p) -{ - struct dalrpc_event_handle *ev; - struct dalrpc_cb_handle *cb; - - ev = (struct dalrpc_event_handle *)p->msg_in.param[0]; - cb = (struct dalrpc_cb_handle *)p->msg_in.param[0]; - - mutex_lock(&p->event_list_lock); - if (event_exists(p, ev)) { - spin_lock(&ev->lock); - ev->flag = 1; - spin_unlock(&ev->lock); - smp_mb(); - wake_up_all(&event_wq); - mutex_unlock(&p->event_list_lock); - return; - } - mutex_unlock(&p->event_list_lock); - - mutex_lock(&p->cb_list_lock); - if (cb_exists(p, cb)) { - cb->fn(cb->context, p->msg_in.param[1], - &p->msg_in.param[3], p->msg_in.param[2]); - mutex_unlock(&p->cb_list_lock); - return; - } - mutex_unlock(&p->cb_list_lock); -} - -static void process_msg(struct dalrpc_port *p) -{ - switch (p->msg_in.hdr.msgid) { - - case DALRPC_MSGID_DDI_REPLY: - case DALRPC_MSGID_ATTACH_REPLY: - case DALRPC_MSGID_DETACH_REPLY: - complete(&p->msg_owner->read_completion); - break; - - case DALRPC_MSGID_ASYNCH: - process_asynch(p); - break; - - default: - printk(KERN_ERR "process_msg: bad msgid %#x\n", - p->msg_in.hdr.msgid); - } -} - -static void flush_msg(struct dalrpc_port *p) -{ - int bytes_read, len; - - len = p->msg_in.hdr.len - sizeof(struct dalrpc_msg_hdr); - while (len > 0) { - bytes_read = smd_read(p->ch, NULL, len); - if (bytes_read <= 0) - break; - len -= bytes_read; - } - p->msg_bytes_read = 0; -} - -static int check_header(struct dalrpc_port *p) -{ - if (check_version(&p->msg_in.hdr) || - p->msg_in.hdr.len > DALRPC_MAX_MSG_SIZE || - (p->msg_in.hdr.msgid != DALRPC_MSGID_ASYNCH && - !client_exists_locked(p->msg_in.hdr.to))) { - printk(KERN_ERR "dalrpc_read_msg: bad msg\n"); - flush_msg(p); - return 1; - } - p->msg_owner = (struct daldevice_handle *)p->msg_in.hdr.to; - - if (p->msg_in.hdr.msgid != DALRPC_MSGID_ASYNCH) - memcpy(&p->msg_owner->msg.hdr, &p->msg_in.hdr, - sizeof(p->msg_in.hdr)); - - return 0; -} - -static int dalrpc_read_msg(struct dalrpc_port *p) -{ - uint8_t *read_ptr; - int bytes_read; - - /* read msg header */ - while (p->msg_bytes_read < sizeof(p->msg_in.hdr)) { - read_ptr = (uint8_t *)&p->msg_in.hdr + p->msg_bytes_read; - - bytes_read = smd_read(p->ch, read_ptr, - sizeof(p->msg_in.hdr) - - p->msg_bytes_read); - if (bytes_read <= 0) - return 0; - p->msg_bytes_read += bytes_read; - - if (p->msg_bytes_read == sizeof(p->msg_in.hdr) && - check_header(p)) - return 1; - } - - /* read remainder of msg */ - if (p->msg_in.hdr.msgid != DALRPC_MSGID_ASYNCH) - read_ptr = (uint8_t *)&p->msg_owner->msg; - else - read_ptr = (uint8_t *)&p->msg_in; - read_ptr += p->msg_bytes_read; - - while (p->msg_bytes_read < p->msg_in.hdr.len) { - bytes_read = smd_read(p->ch, read_ptr, - p->msg_in.hdr.len - p->msg_bytes_read); - if (bytes_read <= 0) - return 0; - p->msg_bytes_read += bytes_read; - read_ptr += bytes_read; - } - - process_msg(p); - p->msg_bytes_read = 0; - p->msg_owner = NULL; - - return 1; -} - -static void dalrpc_work(struct work_struct *work) -{ - struct dalrpc_port *p = container_of(work, - struct dalrpc_port, - port_work); - - /* must lock port/client lists to ensure port doesn't disappear - under an asynch event */ - mutex_lock(&pc_lists_lock); - if (port_exists(p)) - while (dalrpc_read_msg(p)) - ; - mutex_unlock(&pc_lists_lock); -} - -static void dalrpc_smd_cb(void *priv, unsigned smd_flags) -{ - struct dalrpc_port *p = priv; - - if (smd_flags != SMD_EVENT_DATA) - return; - - queue_work(p->wq, &p->port_work); -} - -static struct dalrpc_port *dalrpc_port_open(char *port, int cpu) -{ - struct dalrpc_port *p; - char wq_name[32]; - - p = port_name_exists(port); - if (p) { - p->refcount++; - return p; - } - - p = kzalloc(sizeof(struct dalrpc_port), GFP_KERNEL); - if (!p) - return NULL; - - strlcpy(p->port, port, sizeof(p->port)); - p->refcount = 1; - - snprintf(wq_name, sizeof(wq_name), "dalrpc_rcv_%s", port); - p->wq = create_singlethread_workqueue(wq_name); - if (!p->wq) { - printk(KERN_ERR "dalrpc_init: unable to create workqueue\n"); - goto no_wq; - } - INIT_WORK(&p->port_work, dalrpc_work); - - mutex_init(&p->write_lock); - mutex_init(&p->event_list_lock); - mutex_init(&p->cb_list_lock); - - INIT_LIST_HEAD(&p->event_list); - INIT_LIST_HEAD(&p->cb_list); - - p->msg_owner = NULL; - p->msg_bytes_read = 0; - - if (smd_named_open_on_edge(port, cpu, &p->ch, p, - dalrpc_smd_cb)) { - printk(KERN_ERR "dalrpc_port_init() failed to open port\n"); - goto no_smd; - } - - list_add(&p->list, &port_list); - - return p; - -no_smd: - destroy_workqueue(p->wq); -no_wq: - kfree(p); - return NULL; -} - -static void dalrpc_sendwait(struct daldevice_handle *h) -{ - u8 *buf = (u8 *)&h->msg; - int len = h->msg.hdr.len; - int written; - - mutex_lock(&h->port->write_lock); - do { - written = smd_write(h->port->ch, buf + (h->msg.hdr.len - len), - len); - if (written < 0) - break; - len -= written; - } while (len); - mutex_unlock(&h->port->write_lock); - - if (!h->msg.hdr.async) - wait_for_completion(&h->read_completion); -} - -int daldevice_attach(uint32_t device_id, char *port, int cpu, - void **handle_ptr) -{ - struct daldevice_handle *h; - char dyn_port[DALRPC_MAX_PORTNAME_LEN + 1] = "DAL00"; - int ret; - int tries = 0; - - if (!port) - port = dyn_port; - - if (strlen(port) > DALRPC_MAX_PORTNAME_LEN) - return -EINVAL; - - h = kzalloc(sizeof(struct daldevice_handle), GFP_KERNEL); - if (!h) { - *handle_ptr = NULL; - return -ENOMEM; - } - - init_completion(&h->read_completion); - mutex_init(&h->client_lock); - - mutex_lock(&pc_lists_lock); - list_add(&h->list, &client_list); - mutex_unlock(&pc_lists_lock); - - /* 3 attempts, enough for one each on the user specified port, the - * dynamic discovery port, and the port recommended by the dynamic - * discovery port */ - while (tries < 3) { - tries++; - - mutex_lock(&pc_lists_lock); - h->port = dalrpc_port_open(port, cpu); - if (!h->port) { - list_del(&h->list); - mutex_unlock(&pc_lists_lock); - printk(KERN_ERR "daldevice_attach: could not " - "open port\n"); - kfree(h); - *handle_ptr = NULL; - return -EIO; - } - mutex_unlock(&pc_lists_lock); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4 + - DALRPC_MAX_ATTACH_PARAM_LEN + - DALRPC_MAX_SERVICE_NAME_LEN; - h->msg.hdr.proto_ver = DALRPC_PROTOCOL_VERSION; - h->msg.hdr.ddi_idx = 0; - h->msg.hdr.msgid = 0x1; - h->msg.hdr.prio = 0; - h->msg.hdr.async = 0; - h->msg.hdr.from = h; - h->msg.hdr.to = 0; - h->msg.param[0] = device_id; - - memset(&h->msg.param[1], 0, - DALRPC_MAX_ATTACH_PARAM_LEN + - DALRPC_MAX_SERVICE_NAME_LEN); - - dalrpc_sendwait(h); - ret = h->msg.param[0]; - - if (ret == DALRPC_SUCCESS) { - h->remote_handle = h->msg.hdr.from; - *handle_ptr = h; - break; - } else if (strnlen((char *)&h->msg.param[1], - DALRPC_MAX_PORTNAME_LEN)) { - /* another port was recommended in the response. */ - strlcpy(dyn_port, (char *)&h->msg.param[1], - sizeof(dyn_port)); - dyn_port[DALRPC_MAX_PORTNAME_LEN] = 0; - port = dyn_port; - } else if (port == dyn_port) { - /* the dynamic discovery port (or port that - * was recommended by it) did not recognize - * the device id, give up */ - daldevice_detach(h); - break; - } else - /* the user specified port did not work, try - * the dynamic discovery port */ - port = dyn_port; - - port_close(h->port); - } - - return ret; -} -EXPORT_SYMBOL(daldevice_attach); - -static void dalrpc_ddi_prologue(uint32_t ddi_idx, struct daldevice_handle *h, - uint32_t idx_async) -{ - h->msg.hdr.proto_ver = DALRPC_PROTOCOL_VERSION; - h->msg.hdr.prio = 0; - h->msg.hdr.async = idx_async; - h->msg.hdr.msgid = DALRPC_MSGID_DDI; - h->msg.hdr.from = h; - h->msg.hdr.to = h->remote_handle; - h->msg.hdr.ddi_idx = ddi_idx; -} - -int daldevice_detach(void *handle) -{ - struct daldevice_handle *h = handle; - - if (!client_exists(h)) - return -EINVAL; - - dalrpc_ddi_prologue(0, h, 0); - - if (!h->remote_handle) - goto norpc; - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4; - h->msg.hdr.msgid = 0x2; - h->msg.param[0] = 0; - - dalrpc_sendwait(h); - -norpc: - mutex_lock(&pc_lists_lock); - list_del(&h->list); - mutex_unlock(&pc_lists_lock); - - port_close(h->port); - - kfree(h); - - return 0; -} -EXPORT_SYMBOL(daldevice_detach); - -uint32_t dalrpc_fcn_0(uint32_t ddi_idx, void *handle, uint32_t s1) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4; - h->msg.hdr.proto_id = 0; - h->msg.param[0] = s1; - - dalrpc_sendwait(h); - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_0); - -uint32_t dalrpc_fcn_1(uint32_t ddi_idx, void *handle, uint32_t s1, - uint32_t s2) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8; - h->msg.hdr.proto_id = 1; - h->msg.param[0] = s1; - h->msg.param[1] = s2; - - dalrpc_sendwait(h); - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_1); - -uint32_t dalrpc_fcn_2(uint32_t ddi_idx, void *handle, uint32_t s1, - uint32_t *p_s2) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4; - h->msg.hdr.proto_id = 2; - h->msg.param[0] = s1; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) - *p_s2 = h->msg.param[1]; - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_2); - -uint32_t dalrpc_fcn_3(uint32_t ddi_idx, void *handle, uint32_t s1, - uint32_t s2, uint32_t s3) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 12; - h->msg.hdr.proto_id = 3; - h->msg.param[0] = s1; - h->msg.param[1] = s2; - h->msg.param[2] = s3; - - dalrpc_sendwait(h); - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_3); - -uint32_t dalrpc_fcn_4(uint32_t ddi_idx, void *handle, uint32_t s1, - uint32_t s2, uint32_t *p_s3) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8; - h->msg.hdr.proto_id = 4; - h->msg.param[0] = s1; - h->msg.param[1] = s2; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) - *p_s3 = h->msg.param[1]; - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_4); - -uint32_t dalrpc_fcn_5(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen) -{ - struct daldevice_handle *h = handle; - uint32_t ret, idx_async; - - if ((ilen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - idx_async = (ddi_idx & 0x80000000) >> 31; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, idx_async); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 5; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - - dalrpc_sendwait(h); - - if (h->msg.hdr.async) - ret = DALRPC_SUCCESS; - else - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_5); - -uint32_t dalrpc_fcn_6(uint32_t ddi_idx, void *handle, uint32_t s1, - const void *ibuf, uint32_t ilen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if ((ilen + 8) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 6; - h->msg.param[0] = s1; - h->msg.param[1] = ilen; - memcpy(&h->msg.param[2], ibuf, ilen); - - dalrpc_sendwait(h); - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_6); - -uint32_t dalrpc_fcn_7(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen, void *obuf, uint32_t olen, - uint32_t *oalen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + 8) > DALRPC_MAX_PARAMS_SIZE || - (olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 7; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 1; - h->msg.param[param_idx] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - *oalen = h->msg.param[1]; - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_7); - -uint32_t dalrpc_fcn_8(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen, void *obuf, uint32_t olen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + 8) > DALRPC_MAX_PARAMS_SIZE || - (olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 8; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 1; - h->msg.param[param_idx] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_8); - -uint32_t dalrpc_fcn_9(uint32_t ddi_idx, void *handle, void *obuf, - uint32_t olen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if ((olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 4; - h->msg.hdr.proto_id = 9; - h->msg.param[0] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_9); - -uint32_t dalrpc_fcn_10(uint32_t ddi_idx, void *handle, uint32_t s1, - const void *ibuf, uint32_t ilen, void *obuf, - uint32_t olen, uint32_t *oalen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + 12) > DALRPC_MAX_PARAMS_SIZE || - (olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 12 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 10; - h->msg.param[0] = s1; - h->msg.param[1] = ilen; - memcpy(&h->msg.param[2], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 2; - h->msg.param[param_idx] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - *oalen = h->msg.param[1]; - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_10); - -uint32_t dalrpc_fcn_11(uint32_t ddi_idx, void *handle, uint32_t s1, - void *obuf, uint32_t olen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if ((olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8; - h->msg.hdr.proto_id = 11; - h->msg.param[0] = s1; - h->msg.param[1] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_11); - -uint32_t dalrpc_fcn_12(uint32_t ddi_idx, void *handle, uint32_t s1, - void *obuf, uint32_t olen, uint32_t *oalen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - - if ((olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 8; - h->msg.hdr.proto_id = 12; - h->msg.param[0] = s1; - h->msg.param[1] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - *oalen = h->msg.param[1]; - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_12); - -uint32_t dalrpc_fcn_13(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen, const void *ibuf2, uint32_t ilen2, - void *obuf, uint32_t olen) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + ilen2 + 12) > DALRPC_MAX_PARAMS_SIZE || - (olen + 4) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 12 + - ROUND_BUFLEN(ilen) + ROUND_BUFLEN(ilen2); - h->msg.hdr.proto_id = 13; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 1; - h->msg.param[param_idx++] = ilen2; - memcpy(&h->msg.param[param_idx], ibuf2, ilen2); - param_idx += (ROUND_BUFLEN(ilen2) / 4); - h->msg.param[param_idx] = olen; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_13); - -uint32_t dalrpc_fcn_14(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen, void *obuf, uint32_t olen, - void *obuf2, uint32_t olen2, uint32_t *oalen2) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + 12) > DALRPC_MAX_PARAMS_SIZE || - (olen + olen2 + 8) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 12 + - ROUND_BUFLEN(ilen); - h->msg.hdr.proto_id = 14; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 1; - h->msg.param[param_idx++] = olen; - h->msg.param[param_idx] = olen2; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - param_idx = (ROUND_BUFLEN(h->msg.param[1]) / 4) + 2; - if (h->msg.param[param_idx] > olen2) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - memcpy(obuf2, &h->msg.param[param_idx + 1], - h->msg.param[param_idx]); - *oalen2 = h->msg.param[param_idx]; - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_14); - -uint32_t dalrpc_fcn_15(uint32_t ddi_idx, void *handle, const void *ibuf, - uint32_t ilen, const void *ibuf2, uint32_t ilen2, - void *obuf, uint32_t olen, uint32_t *oalen, - void *obuf2, uint32_t olen2) -{ - struct daldevice_handle *h = handle; - uint32_t ret; - int param_idx; - - if ((ilen + ilen2 + 16) > DALRPC_MAX_PARAMS_SIZE || - (olen + olen2 + 8) > DALRPC_MAX_PARAMS_SIZE) - return -EINVAL; - - if (!client_exists(h)) - return -EINVAL; - - mutex_lock(&h->client_lock); - - dalrpc_ddi_prologue(ddi_idx, h, 0); - - h->msg.hdr.len = sizeof(struct dalrpc_msg_hdr) + 16 + - ROUND_BUFLEN(ilen) + ROUND_BUFLEN(ilen2); - h->msg.hdr.proto_id = 15; - h->msg.param[0] = ilen; - memcpy(&h->msg.param[1], ibuf, ilen); - param_idx = (ROUND_BUFLEN(ilen) / 4) + 1; - h->msg.param[param_idx++] = ilen2; - memcpy(&h->msg.param[param_idx], ibuf2, ilen2); - param_idx += (ROUND_BUFLEN(ilen2) / 4); - h->msg.param[param_idx++] = olen; - h->msg.param[param_idx] = olen2; - - dalrpc_sendwait(h); - - if (h->msg.param[0] == DALRPC_SUCCESS) { - if (h->msg.param[1] > olen) { - mutex_unlock(&h->client_lock); - return -EIO; - } - param_idx = (ROUND_BUFLEN(h->msg.param[1]) / 4) + 2; - if (h->msg.param[param_idx] > olen2) { - mutex_unlock(&h->client_lock); - return -EIO; - } - memcpy(obuf, &h->msg.param[2], h->msg.param[1]); - memcpy(obuf2, &h->msg.param[param_idx + 1], - h->msg.param[param_idx]); - *oalen = h->msg.param[1]; - } - - ret = h->msg.param[0]; - mutex_unlock(&h->client_lock); - return ret; -} -EXPORT_SYMBOL(dalrpc_fcn_15); - -void *dalrpc_alloc_event(void *handle) -{ - struct daldevice_handle *h; - struct dalrpc_event_handle *ev; - - h = (struct daldevice_handle *)handle; - - if (!client_exists(h)) - return NULL; - - ev = kmalloc(sizeof(struct dalrpc_event_handle), GFP_KERNEL); - if (!ev) - return NULL; - - ev->flag = 0; - spin_lock_init(&ev->lock); - - mutex_lock(&h->port->event_list_lock); - list_add(&ev->list, &h->port->event_list); - mutex_unlock(&h->port->event_list_lock); - - return ev; -} -EXPORT_SYMBOL(dalrpc_alloc_event); - -void *dalrpc_alloc_cb(void *handle, - void (*fn)(void *, uint32_t, void *, uint32_t), - void *context) -{ - struct daldevice_handle *h; - struct dalrpc_cb_handle *cb; - - h = (struct daldevice_handle *)handle; - - if (!client_exists(h)) - return NULL; - - cb = kmalloc(sizeof(struct dalrpc_cb_handle), GFP_KERNEL); - if (!cb) - return NULL; - - cb->fn = fn; - cb->context = context; - - mutex_lock(&h->port->cb_list_lock); - list_add(&cb->list, &h->port->cb_list); - mutex_unlock(&h->port->cb_list_lock); - - return cb; -} -EXPORT_SYMBOL(dalrpc_alloc_cb); - -void dalrpc_dealloc_event(void *handle, - void *ev_h) -{ - struct daldevice_handle *h; - struct dalrpc_event_handle *ev; - - h = (struct daldevice_handle *)handle; - ev = (struct dalrpc_event_handle *)ev_h; - - mutex_lock(&h->port->event_list_lock); - list_del(&ev->list); - mutex_unlock(&h->port->event_list_lock); - kfree(ev); -} -EXPORT_SYMBOL(dalrpc_dealloc_event); - -void dalrpc_dealloc_cb(void *handle, - void *cb_h) -{ - struct daldevice_handle *h; - struct dalrpc_cb_handle *cb; - - h = (struct daldevice_handle *)handle; - cb = (struct dalrpc_cb_handle *)cb_h; - - mutex_lock(&h->port->cb_list_lock); - list_del(&cb->list); - mutex_unlock(&h->port->cb_list_lock); - kfree(cb); -} -EXPORT_SYMBOL(dalrpc_dealloc_cb); - -static int event_occurred(int num_events, struct dalrpc_event_handle **events, - int *occurred) -{ - int i; - - for (i = 0; i < num_events; i++) { - spin_lock(&events[i]->lock); - if (events[i]->flag) { - events[i]->flag = 0; - spin_unlock(&events[i]->lock); - *occurred = i; - return 1; - } - spin_unlock(&events[i]->lock); - } - - return 0; -} - -int dalrpc_event_wait_multiple(int num, void **ev_h, int timeout) -{ - struct dalrpc_event_handle **events; - int ret, occurred; - - events = (struct dalrpc_event_handle **)ev_h; - - if (timeout == DALRPC_TIMEOUT_INFINITE) { - wait_event(event_wq, - event_occurred(num, events, &occurred)); - return occurred; - } - - ret = wait_event_timeout(event_wq, - event_occurred(num, events, &occurred), - timeout); - if (ret > 0) - return occurred; - else - return -ETIMEDOUT; -} -EXPORT_SYMBOL(dalrpc_event_wait_multiple); diff --git a/arch/arm/mach-msm/dal_axi.c b/arch/arm/mach-msm/dal_axi.c deleted file mode 100644 index 7ef154da19ac..000000000000 --- a/arch/arm/mach-msm/dal_axi.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -/* The AXI device ID */ -#define DALDEVICEID_AXI 0x02000053 -#define DALRPC_PORT_NAME "DAL00" - -enum { - DALRPC_AXI_ALLOCATE = DALDEVICE_FIRST_DEVICE_API_IDX + 1, - DALRPC_AXI_FREE = DALDEVICE_FIRST_DEVICE_API_IDX + 2, - DALRPC_AXI_CONFIGURE_BRIDGE = DALDEVICE_FIRST_DEVICE_API_IDX + 11 -}; - -enum { - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_SYNC_MODE = 14, - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_ASYNC_MODE, - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_ISOSYNC_MODE, - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_DEBUG_EN, - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_DEBUG_DIS, - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_SYNC_MODE, - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_ASYNC_MODE, - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_ISOSYNC_MODE, - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_DEBUG_EN, - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_DEBUG_DIS, - /* 7x27(A) Graphics Subsystem Bridge Configuration */ - DAL_AXI_BRIDGE_CFG_GRPSS_XBAR_SYNC_MODE = 58, - DAL_AXI_BRIDGE_CFG_GRPSS_XBAR_ASYNC_MODE = 59, - DAL_AXI_BRIDGE_CFG_GRPSS_XBAR_ISOSYNC_MODE = 60 - -}; - -static void *cam_dev_handle; -static int __axi_free(int mode) -{ - int rc = 0; - - if (!cam_dev_handle) - return rc; - - rc = dalrpc_fcn_0(DALRPC_AXI_FREE, cam_dev_handle, mode); - if (rc) { - printk(KERN_ERR "%s: AXI bus device (%d) failed to be configured\n", - __func__, rc); - goto fail_dal_fcn_0; - } - - /* close device handle */ - rc = daldevice_detach(cam_dev_handle); - if (rc) { - printk(KERN_ERR "%s: failed to detach AXI bus device (%d)\n", - __func__, rc); - goto fail_dal_attach_detach; - } - cam_dev_handle = NULL; - return 0; - -fail_dal_fcn_0: - (void)daldevice_detach(cam_dev_handle); - cam_dev_handle = NULL; -fail_dal_attach_detach: - return rc; -} - -static int __axi_allocate(int mode) -{ - int rc; - - /* get device handle */ - rc = daldevice_attach(DALDEVICEID_AXI, DALRPC_PORT_NAME, - DALRPC_DEST_MODEM, &cam_dev_handle); - if (rc) { - printk(KERN_ERR "%s: failed to attach AXI bus device (%d)\n", - __func__, rc); - goto fail_dal_attach_detach; - } - - rc = dalrpc_fcn_0(DALRPC_AXI_ALLOCATE, cam_dev_handle, mode); - if (rc) { - printk(KERN_ERR "%s: AXI bus device (%d) failed to be configured\n", - __func__, rc); - goto fail_dal_fcn_0; - } - - return 0; - -fail_dal_fcn_0: - (void)daldevice_detach(cam_dev_handle); - cam_dev_handle = NULL; -fail_dal_attach_detach: - return rc; -} - -static int axi_configure_bridge_grfx_sync_mode(int bridge_mode) -{ - int rc; - void *dev_handle; - - /* get device handle */ - rc = daldevice_attach( - DALDEVICEID_AXI, DALRPC_PORT_NAME, - DALRPC_DEST_MODEM, &dev_handle - ); - if (rc) { - printk(KERN_ERR "%s: failed to attach AXI bus device (%d)\n", - __func__, rc); - goto fail_dal_attach_detach; - } - - /* call ConfigureBridge */ - rc = dalrpc_fcn_0( - DALRPC_AXI_CONFIGURE_BRIDGE, dev_handle, - bridge_mode - ); - if (rc) { - printk(KERN_ERR "%s: AXI bus device (%d) failed to be configured\n", - __func__, rc); - goto fail_dal_fcn_0; - } - - /* close device handle */ - rc = daldevice_detach(dev_handle); - if (rc) { - printk(KERN_ERR "%s: failed to detach AXI bus device (%d)\n", - __func__, rc); - goto fail_dal_attach_detach; - } - - return 0; - -fail_dal_fcn_0: - (void)daldevice_detach(dev_handle); -fail_dal_attach_detach: - - return rc; -} - -int axi_free(mode) -{ - return __axi_free(mode); -} - -int axi_allocate(mode) -{ - return __axi_allocate(mode); -} - -int set_grp2d_async(void) -{ - return axi_configure_bridge_grfx_sync_mode( - DAL_AXI_BRIDGE_CFG_CGR_SS_2DGRP_ASYNC_MODE); -} - -int set_grp3d_async(void) -{ - return axi_configure_bridge_grfx_sync_mode( - DAL_AXI_BRIDGE_CFG_CGR_SS_3DGRP_ASYNC_MODE); -} - -int set_grp_xbar_async(void) -{ return axi_configure_bridge_grfx_sync_mode( - DAL_AXI_BRIDGE_CFG_GRPSS_XBAR_ASYNC_MODE); -} diff --git a/arch/arm/mach-msm/dal_remotetest.c b/arch/arm/mach-msm/dal_remotetest.c deleted file mode 100644 index b6fc8dac3d0e..000000000000 --- a/arch/arm/mach-msm/dal_remotetest.c +++ /dev/null @@ -1,410 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -/* - * DAL remote test device test suite. - */ - -#include -#include -#include -#include -#include - -#include "dal_remotetest.h" - -#define BYTEBUF_LEN 64 - -#define rpc_error(num) \ - do { \ - errmask |= (1 << num); \ - printk(KERN_INFO "%s: remote_unittest_%d failed (%d)\n", \ - __func__, num, ret); \ - } while (0) - -#define verify_error(num, field) \ - do { \ - errmask |= (1 << num); \ - printk(KERN_INFO "%s: remote_unittest_%d failed (%s)\n", \ - __func__, num, field); \ - } while (0) - - -static struct dentry *debugfs_dir_entry; -static struct dentry *debugfs_modem_entry; -static struct dentry *debugfs_dsp_entry; - -static uint8_t in_bytebuf[BYTEBUF_LEN]; -static uint8_t out_bytebuf[BYTEBUF_LEN]; -static uint8_t out_bytebuf2[BYTEBUF_LEN]; -static struct remote_test_data in_data; -static struct remote_test_data out_data; -static int block_until_cb = 1; - -static void init_data(struct remote_test_data *data) -{ - int i; - data->regular_event = REMOTE_UNITTEST_INPUT_HANDLE; - data->payload_event = REMOTE_UNITTEST_INPUT_HANDLE; - for (i = 0; i < 32; i++) - data->test[i] = i; -} - -static int verify_data(struct remote_test_data *data) -{ - int i; - if (data->regular_event != REMOTE_UNITTEST_INPUT_HANDLE || - data->payload_event != REMOTE_UNITTEST_INPUT_HANDLE) - return -1; - for (i = 0; i < 32; i++) - if (data->test[i] != i) - return -1; - - return 0; -} - -static int verify_uint32_buffer(uint32_t *buf) -{ - int i; - for (i = 0; i < 32; i++) - if (buf[i] != i) - return -1; - - return 0; -} - -static void init_bytebuf(uint8_t *bytebuf) -{ - int i; - for (i = 0; i < BYTEBUF_LEN; i++) - bytebuf[i] = i & 0xff; -} - -static int verify_bytebuf(uint8_t *bytebuf) -{ - int i; - for (i = 0; i < BYTEBUF_LEN; i++) - if (bytebuf[i] != (i & 0xff)) - return -1; - - return 0; -} - -static void test_cb(void *context, uint32_t param, void *data, uint32_t len) -{ - block_until_cb = 0; -} - -static int remotetest_exec(int dest, u64 *val) -{ - void *dev_handle; - void *event_handles[3]; - void *cb_handle; - int ret; - u64 errmask = 0; - uint32_t ouint; - uint32_t oalen; - - /* test daldevice_attach */ - ret = daldevice_attach(REMOTE_UNITTEST_DEVICEID, NULL, - dest, &dev_handle); - if (ret) { - printk(KERN_INFO "%s: failed to attach (%d)\n", __func__, ret); - *val = 0xffffffff; - return 0; - } - - /* test remote_unittest_0 */ - ret = remote_unittest_0(dev_handle, REMOTE_UNITTEST_INARG_1); - if (ret) - rpc_error(0); - - /* test remote_unittest_1 */ - ret = remote_unittest_1(dev_handle, REMOTE_UNITTEST_INARG_1, - REMOTE_UNITTEST_INARG_2); - if (ret) - rpc_error(1); - - /* test remote_unittest_2 */ - ouint = 0; - ret = remote_unittest_2(dev_handle, REMOTE_UNITTEST_INARG_1, &ouint); - if (ret) - rpc_error(2); - else if (ouint != REMOTE_UNITTEST_OUTARG_1) - verify_error(2, "ouint"); - - /* test remote_unittest_3 */ - ret = remote_unittest_3(dev_handle, REMOTE_UNITTEST_INARG_1, - REMOTE_UNITTEST_INARG_2, - REMOTE_UNITTEST_INARG_3); - if (ret) - rpc_error(3); - - /* test remote_unittest_4 */ - ouint = 0; - ret = remote_unittest_4(dev_handle, REMOTE_UNITTEST_INARG_1, - REMOTE_UNITTEST_INARG_2, &ouint); - if (ret) - rpc_error(4); - else if (ouint != REMOTE_UNITTEST_OUTARG_1) - verify_error(4, "ouint"); - - /* test remote_unittest_5 */ - init_data(&in_data); - ret = remote_unittest_5(dev_handle, &in_data, sizeof(in_data)); - if (ret) - rpc_error(5); - - /* test remote_unittest_6 */ - init_data(&in_data); - ret = remote_unittest_6(dev_handle, REMOTE_UNITTEST_INARG_1, - &in_data.test, sizeof(in_data.test)); - if (ret) - rpc_error(6); - - /* test remote_unittest_7 */ - init_data(&in_data); - memset(&out_data, 0, sizeof(out_data)); - ret = remote_unittest_7(dev_handle, &in_data, sizeof(in_data), - &out_data.test, sizeof(out_data.test), - &oalen); - if (ret) - rpc_error(7); - else if (oalen != sizeof(out_data.test)) - verify_error(7, "oalen"); - else if (verify_uint32_buffer(out_data.test)) - verify_error(7, "obuf"); - - /* test remote_unittest_8 */ - init_bytebuf(in_bytebuf); - memset(&out_data, 0, sizeof(out_data)); - ret = remote_unittest_8(dev_handle, in_bytebuf, sizeof(in_bytebuf), - &out_data, sizeof(out_data)); - if (ret) - rpc_error(8); - else if (verify_data(&out_data)) - verify_error(8, "obuf"); - - /* test remote_unittest_9 */ - memset(&out_bytebuf, 0, sizeof(out_bytebuf)); - ret = remote_unittest_9(dev_handle, out_bytebuf, sizeof(out_bytebuf)); - if (ret) - rpc_error(9); - else if (verify_bytebuf(out_bytebuf)) - verify_error(9, "obuf"); - - /* test remote_unittest_10 */ - init_bytebuf(in_bytebuf); - memset(&out_bytebuf, 0, sizeof(out_bytebuf)); - ret = remote_unittest_10(dev_handle, REMOTE_UNITTEST_INARG_1, - in_bytebuf, sizeof(in_bytebuf), - out_bytebuf, sizeof(out_bytebuf), &oalen); - if (ret) - rpc_error(10); - else if (oalen != sizeof(out_bytebuf)) - verify_error(10, "oalen"); - else if (verify_bytebuf(out_bytebuf)) - verify_error(10, "obuf"); - - /* test remote_unittest_11 */ - memset(&out_bytebuf, 0, sizeof(out_bytebuf)); - ret = remote_unittest_11(dev_handle, REMOTE_UNITTEST_INARG_1, - out_bytebuf, sizeof(out_bytebuf)); - if (ret) - rpc_error(11); - else if (verify_bytebuf(out_bytebuf)) - verify_error(11, "obuf"); - - /* test remote_unittest_12 */ - memset(&out_bytebuf, 0, sizeof(out_bytebuf)); - ret = remote_unittest_12(dev_handle, REMOTE_UNITTEST_INARG_1, - out_bytebuf, sizeof(out_bytebuf), &oalen); - if (ret) - rpc_error(12); - else if (oalen != sizeof(out_bytebuf)) - verify_error(12, "oalen"); - else if (verify_bytebuf(out_bytebuf)) - verify_error(12, "obuf"); - - /* test remote_unittest_13 */ - init_data(&in_data); - memset(&out_data, 0, sizeof(out_data)); - ret = remote_unittest_13(dev_handle, in_data.test, sizeof(in_data.test), - &in_data, sizeof(in_data), - &out_data, sizeof(out_data)); - if (ret) - rpc_error(13); - else if (verify_data(&out_data)) - verify_error(13, "obuf"); - - /* test remote_unittest_14 */ - init_data(&in_data); - memset(out_bytebuf, 0, sizeof(out_bytebuf)); - memset(out_bytebuf2, 0, sizeof(out_bytebuf2)); - ret = remote_unittest_14(dev_handle, - in_data.test, sizeof(in_data.test), - out_bytebuf, sizeof(out_bytebuf), - out_bytebuf2, sizeof(out_bytebuf2), &oalen); - if (ret) - rpc_error(14); - else if (verify_bytebuf(out_bytebuf)) - verify_error(14, "obuf"); - else if (oalen != sizeof(out_bytebuf2)) - verify_error(14, "oalen"); - else if (verify_bytebuf(out_bytebuf2)) - verify_error(14, "obuf2"); - - /* test remote_unittest_15 */ - init_data(&in_data); - memset(out_bytebuf, 0, sizeof(out_bytebuf)); - memset(&out_data, 0, sizeof(out_data)); - ret = remote_unittest_15(dev_handle, - in_data.test, sizeof(in_data.test), - &in_data, sizeof(in_data), - &out_data, sizeof(out_data), &oalen, - out_bytebuf, sizeof(out_bytebuf)); - if (ret) - rpc_error(15); - else if (oalen != sizeof(out_data)) - verify_error(15, "oalen"); - else if (verify_bytebuf(out_bytebuf)) - verify_error(15, "obuf"); - else if (verify_data(&out_data)) - verify_error(15, "obuf2"); - - /* test setting up asynch events */ - event_handles[0] = dalrpc_alloc_event(dev_handle); - event_handles[1] = dalrpc_alloc_event(dev_handle); - event_handles[2] = dalrpc_alloc_event(dev_handle); - cb_handle = dalrpc_alloc_cb(dev_handle, test_cb, &out_data); - in_data.regular_event = (uint32_t)event_handles[2]; - in_data.payload_event = (uint32_t)cb_handle; - ret = remote_unittest_eventcfg(dev_handle, &in_data, sizeof(in_data)); - if (ret) { - errmask |= (1 << 16); - printk(KERN_INFO "%s: failed to configure asynch (%d)\n", - __func__, ret); - } - - /* test event */ - ret = remote_unittest_eventtrig(dev_handle, - REMOTE_UNITTEST_REGULAR_EVENT); - if (ret) { - errmask |= (1 << 17); - printk(KERN_INFO "%s: failed to trigger event (%d)\n", - __func__, ret); - } - ret = dalrpc_event_wait(event_handles[2], 1000); - if (ret) { - errmask |= (1 << 18); - printk(KERN_INFO "%s: failed to receive event (%d)\n", - __func__, ret); - } - - /* test event again */ - ret = remote_unittest_eventtrig(dev_handle, - REMOTE_UNITTEST_REGULAR_EVENT); - if (ret) { - errmask |= (1 << 19); - printk(KERN_INFO "%s: failed to trigger event (%d)\n", - __func__, ret); - } - ret = dalrpc_event_wait_multiple(3, event_handles, 1000); - if (ret != 2) { - errmask |= (1 << 20); - printk(KERN_INFO "%s: failed to receive event (%d)\n", - __func__, ret); - } - - /* test callback */ - ret = remote_unittest_eventtrig(dev_handle, - REMOTE_UNITTEST_CALLBACK_EVENT); - if (ret) { - errmask |= (1 << 21); - printk(KERN_INFO "%s: failed to trigger callback (%d)\n", - __func__, ret); - } else - while (block_until_cb) - ; - - dalrpc_dealloc_cb(dev_handle, cb_handle); - dalrpc_dealloc_event(dev_handle, event_handles[0]); - dalrpc_dealloc_event(dev_handle, event_handles[1]); - dalrpc_dealloc_event(dev_handle, event_handles[2]); - - /* test daldevice_detach */ - ret = daldevice_detach(dev_handle); - if (ret) { - errmask |= (1 << 22); - printk(KERN_INFO "%s: failed to detach (%d)\n", __func__, ret); - } - - printk(KERN_INFO "%s: remote_unittest complete\n", __func__); - - *val = errmask; - return 0; -} - -static int remotetest_modem_exec(void *data, u64 *val) -{ - return remotetest_exec(DALRPC_DEST_MODEM, val); -} - -static int remotetest_dsp_exec(void *data, u64 *val) -{ - return remotetest_exec(DALRPC_DEST_QDSP, val); -} - -DEFINE_SIMPLE_ATTRIBUTE(dal_modemtest_fops, remotetest_modem_exec, - NULL, "%llu\n"); -DEFINE_SIMPLE_ATTRIBUTE(dal_dsptest_fops, remotetest_dsp_exec, - NULL, "%llu\n"); - -static int __init remotetest_init(void) -{ - debugfs_dir_entry = debugfs_create_dir("dal", 0); - if (IS_ERR(debugfs_dir_entry)) - return PTR_ERR(debugfs_dir_entry); - - debugfs_modem_entry = debugfs_create_file("modem_test", 0444, - debugfs_dir_entry, - NULL, &dal_modemtest_fops); - if (IS_ERR(debugfs_modem_entry)) { - debugfs_remove(debugfs_dir_entry); - return PTR_ERR(debugfs_modem_entry); - } - - debugfs_dsp_entry = debugfs_create_file("dsp_test", 0444, - debugfs_dir_entry, - NULL, &dal_dsptest_fops); - if (IS_ERR(debugfs_dsp_entry)) { - debugfs_remove(debugfs_modem_entry); - debugfs_remove(debugfs_dir_entry); - return PTR_ERR(debugfs_dsp_entry); - } - - return 0; -} - -static void __exit remotetest_exit(void) -{ - debugfs_remove(debugfs_modem_entry); - debugfs_remove(debugfs_dsp_entry); - debugfs_remove(debugfs_dir_entry); -} - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Test for DAL RPC"); -MODULE_VERSION("1.0"); - -module_init(remotetest_init); -module_exit(remotetest_exit); diff --git a/arch/arm/mach-msm/dal_remotetest.h b/arch/arm/mach-msm/dal_remotetest.h deleted file mode 100644 index 4fe4079f1f58..000000000000 --- a/arch/arm/mach-msm/dal_remotetest.h +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -/* - * DAL remote test device API. - */ - -#include - -#include - -#define REMOTE_UNITTEST_DEVICEID 0xDA1DA1DA - -enum { - DALRPC_TEST_API_0 = DALDEVICE_FIRST_DEVICE_API_IDX, - DALRPC_TEST_API_1, - DALRPC_TEST_API_2, - DALRPC_TEST_API_3, - DALRPC_TEST_API_4, - DALRPC_TEST_API_5, - DALRPC_TEST_API_6, - DALRPC_TEST_API_7, - DALRPC_TEST_API_8, - DALRPC_TEST_API_9, - DALRPC_TEST_API_10, - DALRPC_TEST_API_11, - DALRPC_TEST_API_12, - DALRPC_TEST_API_13, - DALRPC_TEST_API_14, - DALRPC_TEST_API_15, - DALRPC_TEST_API_16, - DALRPC_TEST_API_17 -}; - -#define REMOTE_UNITTEST_INARG_1 0x01010101 -#define REMOTE_UNITTEST_INARG_2 0x20202020 -#define REMOTE_UNITTEST_INARG_3 0x12121212 -#define REMOTE_UNITTEST_INPUT_HANDLE 0xDA1FDA1F -#define REMOTE_UNITTEST_OUTARG_1 0xBEEFDEAD - -#define REMOTE_UNITTEST_REGULAR_EVENT 0 -#define REMOTE_UNITTEST_CALLBACK_EVENT 1 - -#define REMOTE_UNITTEST_BAD_PARAM 0x10 - -struct remote_test_data { - uint32_t regular_event; - uint32_t test[32]; - uint32_t payload_event; -}; - -static int remote_unittest_0(void *handle, uint32_t s1) -{ - return dalrpc_fcn_0(DALRPC_TEST_API_0, handle, s1); -} - -static int remote_unittest_1(void *handle, uint32_t s1, uint32_t s2) -{ - return dalrpc_fcn_1(DALRPC_TEST_API_1, handle, s1, s2); -} - -static int remote_unittest_2(void *handle, uint32_t s1, uint32_t *p_s2) -{ - return dalrpc_fcn_2(DALRPC_TEST_API_2, handle, s1, p_s2); -} - -static int remote_unittest_3(void *handle, uint32_t s1, uint32_t s2, - uint32_t s3) -{ - return dalrpc_fcn_3(DALRPC_TEST_API_3, handle, s1, s2, s3); -} - -static int remote_unittest_4(void *handle, uint32_t s1, uint32_t s2, - uint32_t *p_s3) -{ - return dalrpc_fcn_4(DALRPC_TEST_API_4, handle, s1, s2, p_s3); -} - -static int remote_unittest_5(void *handle, const void *ibuf, uint32_t ilen) -{ - return dalrpc_fcn_5(DALRPC_TEST_API_5, handle, ibuf, ilen); -} - -static int remote_unittest_6(void *handle, uint32_t s1, const void *ibuf, - uint32_t ilen) -{ - return dalrpc_fcn_6(DALRPC_TEST_API_6, handle, s1, ibuf, ilen); -} - -static int remote_unittest_7(void *handle, const void *ibuf, uint32_t ilen, - void *obuf, uint32_t olen, uint32_t *oalen) -{ - return dalrpc_fcn_7(DALRPC_TEST_API_7, handle, ibuf, ilen, obuf, - olen, oalen); -} - -static int remote_unittest_8(void *handle, const void *ibuf, uint32_t ilen, - void *obuf, uint32_t olen) -{ - return dalrpc_fcn_8(DALRPC_TEST_API_8, handle, ibuf, ilen, obuf, olen); -} - -static int remote_unittest_9(void *handle, void *obuf, uint32_t olen) -{ - return dalrpc_fcn_9(DALRPC_TEST_API_9, handle, obuf, olen); -} - -static int remote_unittest_10(void *handle, uint32_t s1, const void *ibuf, - uint32_t ilen, void *obuf, uint32_t olen, - uint32_t *oalen) -{ - return dalrpc_fcn_10(DALRPC_TEST_API_10, handle, s1, ibuf, ilen, obuf, - olen, oalen); -} - -static int remote_unittest_11(void *handle, uint32_t s1, void *obuf, - uint32_t olen) -{ - return dalrpc_fcn_11(DALRPC_TEST_API_11, handle, s1, obuf, olen); -} - -static int remote_unittest_12(void *handle, uint32_t s1, void *obuf, - uint32_t olen, uint32_t *oalen) -{ - return dalrpc_fcn_12(DALRPC_TEST_API_12, handle, s1, obuf, olen, - oalen); -} - -static int remote_unittest_13(void *handle, const void *ibuf, uint32_t ilen, - const void *ibuf2, uint32_t ilen2, void *obuf, - uint32_t olen) -{ - return dalrpc_fcn_13(DALRPC_TEST_API_13, handle, ibuf, ilen, ibuf2, - ilen2, obuf, olen); -} - -static int remote_unittest_14(void *handle, const void *ibuf, uint32_t ilen, - void *obuf, uint32_t olen, void *obuf2, - uint32_t olen2, uint32_t *oalen2) -{ - return dalrpc_fcn_14(DALRPC_TEST_API_14, handle, ibuf, ilen, obuf, - olen, obuf2, olen2, oalen2); -} - -static int remote_unittest_15(void *handle, const void *ibuf, uint32_t ilen, - const void *ibuf2, uint32_t ilen2, void *obuf, - uint32_t olen, uint32_t *oalen, void *obuf2, - uint32_t olen2) -{ - return dalrpc_fcn_15(DALRPC_TEST_API_15, handle, ibuf, ilen, ibuf2, - ilen2, obuf, olen, oalen, obuf2, olen2); -} - -static int remote_unittest_eventcfg(void *handle, const void *ibuf, - uint32_t ilen) -{ - return dalrpc_fcn_5(DALRPC_TEST_API_16, handle, ibuf, ilen); -} - -static int remote_unittest_eventtrig(void *handle, uint32_t event_idx) -{ - return dalrpc_fcn_0(DALRPC_TEST_API_17, handle, event_idx); -} diff --git a/arch/arm/mach-msm/devices-8064.c b/arch/arm/mach-msm/devices-8064.c deleted file mode 100644 index 2fd1bf30bdea..000000000000 --- a/arch/arm/mach-msm/devices-8064.c +++ /dev/null @@ -1,3466 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "clock.h" -#include "pm.h" -#include "devices.h" -#include "footswitch.h" -#include "msm_watchdog.h" -#include "rpm_stats.h" -#include "rpm_log.h" -#include -#include -#include -#include "pm.h" - -/* Address of GSBI blocks */ -#define MSM_GSBI1_PHYS 0x12440000 -#define MSM_GSBI2_PHYS 0x12480000 -#define MSM_GSBI3_PHYS 0x16200000 -#define MSM_GSBI4_PHYS 0x16300000 -#define MSM_GSBI5_PHYS 0x1A200000 -#define MSM_GSBI6_PHYS 0x16500000 -#define MSM_GSBI7_PHYS 0x16600000 - -/* GSBI UART devices */ -#define MSM_UART1DM_PHYS (MSM_GSBI1_PHYS + 0x10000) -#define MSM_UART2DM_PHYS (MSM_GSBI2_PHYS + 0x10000) -#define MSM_UART3DM_PHYS (MSM_GSBI3_PHYS + 0x40000) -#define MSM_UART4DM_PHYS (MSM_GSBI4_PHYS + 0x40000) -#define MSM_UART5DM_PHYS (MSM_GSBI5_PHYS + 0x40000) -#define MSM_UART6DM_PHYS (MSM_GSBI6_PHYS + 0x40000) -#define MSM_UART7DM_PHYS (MSM_GSBI7_PHYS + 0x40000) - -/* GSBI QUP devices */ -#define MSM_GSBI1_QUP_PHYS (MSM_GSBI1_PHYS + 0x20000) -#define MSM_GSBI3_QUP_PHYS (MSM_GSBI3_PHYS + 0x80000) -#define MSM_GSBI4_QUP_PHYS (MSM_GSBI4_PHYS + 0x80000) -#define MSM_GSBI5_QUP_PHYS (MSM_GSBI5_PHYS + 0x80000) -#define MSM_GSBI6_QUP_PHYS (MSM_GSBI6_PHYS + 0x80000) -#define MSM_GSBI7_QUP_PHYS (MSM_GSBI7_PHYS + 0x80000) -#define MSM_QUP_SIZE SZ_4K - -/* Address of SSBI CMD */ -#define MSM_PMIC1_SSBI_CMD_PHYS 0x00500000 -#define MSM_PMIC2_SSBI_CMD_PHYS 0x00C00000 -#define MSM_PMIC_SSBI_SIZE SZ_4K - -/* Address of HS USBOTG1 */ -#define MSM_HSUSB1_PHYS 0x12500000 -#define MSM_HSUSB1_SIZE SZ_4K - -/* Address of HS USB3 */ -#define MSM_HSUSB3_PHYS 0x12520000 -#define MSM_HSUSB3_SIZE SZ_4K - -/* Address of HS USB4 */ -#define MSM_HSUSB4_PHYS 0x12530000 -#define MSM_HSUSB4_SIZE SZ_4K - -/* Address of PCIE20 PARF */ -#define PCIE20_PARF_PHYS 0x1b600000 -#define PCIE20_PARF_SIZE SZ_128 - -/* Address of PCIE20 ELBI */ -#define PCIE20_ELBI_PHYS 0x1b502000 -#define PCIE20_ELBI_SIZE SZ_256 - -/* Address of PCIE20 */ -#define PCIE20_PHYS 0x1b500000 -#define PCIE20_SIZE SZ_4K -#define MSM8064_PC_CNTR_PHYS (APQ8064_IMEM_PHYS + 0x664) -#define MSM8064_PC_CNTR_SIZE 0x40 -#define MSM8064_RPM_MASTER_STATS_BASE 0x10BB00 -/* avtimer */ -#define AVTIMER_MSW_PHYSICAL_ADDRESS 0x2800900C -#define AVTIMER_LSW_PHYSICAL_ADDRESS 0x28009008 - -static struct resource msm8064_resources_pccntr[] = { - { - .start = MSM8064_PC_CNTR_PHYS, - .end = MSM8064_PC_CNTR_PHYS + MSM8064_PC_CNTR_SIZE, - .flags = IORESOURCE_MEM, - }, -}; - -static uint32_t msm_pm_cp15_regs[] = {0x4501, 0x5501, 0x6501, 0x7501, 0x0500}; - -static struct msm_pm_init_data_type msm_pm_data = { - .retention_calls_tz = true, - .cp15_data.save_cp15 = true, - .cp15_data.qsb_pc_vdd = 0x98, - .cp15_data.reg_data = &msm_pm_cp15_regs[0], - .cp15_data.reg_saved_state_size = ARRAY_SIZE(msm_pm_cp15_regs), -}; - -struct platform_device msm8064_pm_8x60 = { - .name = "pm-8x60", - .id = -1, - .num_resources = ARRAY_SIZE(msm8064_resources_pccntr), - .resource = msm8064_resources_pccntr, - .dev = { - .platform_data = &msm_pm_data, - }, -}; - -static struct msm_pm_sleep_status_data msm_pm_slp_sts_data = { - .base_addr = MSM_ACC0_BASE + 0x08, - .cpu_offset = MSM_ACC1_BASE - MSM_ACC0_BASE, - .mask = 1UL << 13, -}; -struct platform_device msm8064_cpu_slp_status = { - .name = "cpu_slp_status", - .id = -1, - .dev = { - .platform_data = &msm_pm_slp_sts_data, - }, -}; - -static struct msm_watchdog_pdata msm_watchdog_pdata = { - .pet_time = 10000, - .bark_time = 11000, - .has_secure = true, - .needs_expired_enable = true, - .base = MSM_TMR0_BASE + WDT0_OFFSET, -}; - -static struct resource msm_watchdog_resources[] = { - { - .start = WDT0_ACCSCSSNBARK_INT, - .end = WDT0_ACCSCSSNBARK_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8064_device_watchdog = { - .name = "msm_watchdog", - .id = -1, - .dev = { - .platform_data = &msm_watchdog_pdata, - }, - .num_resources = ARRAY_SIZE(msm_watchdog_resources), - .resource = msm_watchdog_resources, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = ADM_0_SCSS_1_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x18320000, - .end = 0x18320000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 1, - .sd_size = 0x800, -}; - -struct platform_device apq8064_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -static struct resource resources_uart_gsbi1[] = { - { - .start = APQ8064_GSBI1_UARTDM_IRQ, - .end = APQ8064_GSBI1_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device apq8064_device_uart_gsbi1 = { - .name = "msm_serial_hsl", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart_gsbi1), - .resource = resources_uart_gsbi1, -}; - -static struct resource resources_uart_gsbi2[] = { - { - .start = APQ8064_GSBI2_UARTDM_IRQ, - .end = APQ8064_GSBI2_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI2_PHYS, - .end = MSM_GSBI2_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_serial_hslite_platform_data uart_gsbi2_pdata = { - .line = 0, -}; - -struct platform_device apq8064_device_uart_gsbi2 = { - .name = "msm_serial_hsl", - .id = 3, - .num_resources = ARRAY_SIZE(resources_uart_gsbi2), - .resource = resources_uart_gsbi2, - .dev.platform_data = &uart_gsbi2_pdata, -}; - -static struct resource resources_uart_gsbi3[] = { - { - .start = GSBI3_UARTDM_IRQ, - .end = GSBI3_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3DM_PHYS, - .end = MSM_UART3DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device apq8064_device_uart_gsbi3 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart_gsbi3), - .resource = resources_uart_gsbi3, -}; - -static struct resource resources_qup_i2c_gsbi3[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI3_QUP_PHYS, - .end = MSM_GSBI3_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI3_QUP_IRQ, - .end = GSBI3_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 9, - .end = 9, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 8, - .end = 8, - .flags = IORESOURCE_IO, - }, -}; - -static struct resource resources_qup_i2c_gsbi1[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = APQ8064_GSBI1_QUP_IRQ, - .end = APQ8064_GSBI1_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 21, - .end = 21, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 20, - .end = 20, - .flags = IORESOURCE_IO, - }, -}; - -struct platform_device apq8064_device_qup_i2c_gsbi1 = { - .name = "qup_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi1), - .resource = resources_qup_i2c_gsbi1, -}; - -struct platform_device apq8064_device_qup_i2c_gsbi3 = { - .name = "qup_i2c", - .id = 3, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi3), - .resource = resources_qup_i2c_gsbi3, -}; - -static struct resource resources_qup_i2c_gsbi4[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI4_PHYS, - .end = MSM_GSBI4_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI4_QUP_PHYS, - .end = MSM_GSBI4_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI4_QUP_IRQ, - .end = GSBI4_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 11, - .end = 11, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 10, - .end = 10, - .flags = IORESOURCE_IO, - }, -}; - -struct platform_device apq8064_device_qup_i2c_gsbi4 = { - .name = "qup_i2c", - .id = 4, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi4), - .resource = resources_qup_i2c_gsbi4, -}; - -static struct resource resources_uart_gsbi4[] = { - { - .start = GSBI4_UARTDM_IRQ, - .end = GSBI4_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART4DM_PHYS, - .end = MSM_UART4DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI4_PHYS, - .end = MSM_GSBI4_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_serial_hslite_platform_data uart_gsbi4_pdata = { - .line = 2, -}; - -struct platform_device apq8064_device_uart_gsbi4 = { - .name = "msm_serial_hsl", - .id = 4, - .num_resources = ARRAY_SIZE(resources_uart_gsbi4), - .resource = resources_uart_gsbi4, - .dev.platform_data = &uart_gsbi4_pdata, -}; - -static struct resource resources_qup_spi_gsbi5[] = { - { - .name = "spi_base", - .start = MSM_GSBI5_QUP_PHYS, - .end = MSM_GSBI5_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI5_PHYS, - .end = MSM_GSBI5_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = GSBI5_QUP_IRQ, - .end = GSBI5_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device apq8064_device_qup_spi_gsbi5 = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_spi_gsbi5), - .resource = resources_qup_spi_gsbi5, -}; - -static struct resource resources_qup_spi_gsbi6[] = { - { - .name = "spi_base", - .start = MSM_GSBI6_QUP_PHYS, - .end = MSM_GSBI6_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI6_PHYS, - .end = MSM_GSBI6_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = GSBI6_QUP_IRQ, - .end = GSBI6_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_clk", - .start = 17, - .end = 17, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_miso", - .start = 15, - .end = 15, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_mosi", - .start = 14, - .end = 14, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_cs", - .start = 16, - .end = 16, - .flags = IORESOURCE_IO, - } -}; - -struct platform_device mpq8064_device_qup_spi_gsbi6 = { - .name = "spi_qsd", - .id = 1, - .num_resources = ARRAY_SIZE(resources_qup_spi_gsbi6), - .resource = resources_qup_spi_gsbi6, -}; - -static struct resource resources_qup_i2c_gsbi5[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI5_PHYS, - .end = MSM_GSBI5_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI5_QUP_PHYS, - .end = MSM_GSBI5_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI5_QUP_IRQ, - .end = GSBI5_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 54, - .end = 54, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 53, - .end = 53, - .flags = IORESOURCE_IO, - }, -}; - -struct platform_device mpq8064_device_qup_i2c_gsbi5 = { - .name = "qup_i2c", - .id = 5, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi5), - .resource = resources_qup_i2c_gsbi5, -}; - -static struct resource resources_uart_gsbi5[] = { - { - .start = GSBI5_UARTDM_IRQ, - .end = GSBI5_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART5DM_PHYS, - .end = MSM_UART5DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI5_PHYS, - .end = MSM_GSBI5_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device mpq8064_device_uart_gsbi5 = { - .name = "msm_serial_hsl", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart_gsbi5), - .resource = resources_uart_gsbi5, -}; - -/* GSBI 6 used into UARTDM Mode */ -static struct resource msm_uart_dm6_resources[] = { - { - .start = MSM_UART6DM_PHYS, - .end = MSM_UART6DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = GSBI6_UARTDM_IRQ, - .end = GSBI6_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GSBI6_PHYS, - .end = MSM_GSBI6_PHYS + 4 - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = DMOV_MPQ8064_HSUART_GSBI6_TX_CHAN, - .end = DMOV_MPQ8064_HSUART_GSBI6_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_MPQ8064_HSUART_GSBI6_TX_CRCI, - .end = DMOV_MPQ8064_HSUART_GSBI6_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; -static u64 msm_uart_dm6_dma_mask = DMA_BIT_MASK(32); -struct platform_device mpq8064_device_uartdm_gsbi6 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart_dm6_resources), - .resource = msm_uart_dm6_resources, - .dev = { - .dma_mask = &msm_uart_dm6_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_uart_gsbi7[] = { - { - .start = GSBI7_UARTDM_IRQ, - .end = GSBI7_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART7DM_PHYS, - .end = MSM_UART7DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI7_PHYS, - .end = MSM_GSBI7_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device apq8064_device_uart_gsbi7 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart_gsbi7), - .resource = resources_uart_gsbi7, -}; - -struct platform_device apq_pcm = { - .name = "msm-pcm-dsp", - .id = -1, -}; - -struct platform_device apq_pcm_routing = { - .name = "msm-pcm-routing", - .id = -1, -}; - -struct platform_device apq_cpudai0 = { - .name = "msm-dai-q6", - .id = 0x4000, -}; - -struct platform_device apq_cpudai1 = { - .name = "msm-dai-q6", - .id = 0x4001, -}; -struct platform_device mpq_cpudai_sec_i2s_rx = { - .name = "msm-dai-q6", - .id = 4, -}; -struct platform_device apq_cpudai_hdmi_rx = { - .name = "msm-dai-q6-hdmi", - .id = 8, -}; - -struct platform_device apq_cpudai_bt_rx = { - .name = "msm-dai-q6", - .id = 0x3000, -}; - -struct platform_device apq_cpudai_bt_tx = { - .name = "msm-dai-q6", - .id = 0x3001, -}; - -struct platform_device apq_cpudai_fm_rx = { - .name = "msm-dai-q6", - .id = 0x3004, -}; - -struct platform_device apq_cpudai_fm_tx = { - .name = "msm-dai-q6", - .id = 0x3005, -}; - -struct platform_device apq_cpudai_slim_4_rx = { - .name = "msm-dai-q6", - .id = 0x4008, -}; - -struct platform_device apq_cpudai_slim_4_tx = { - .name = "msm-dai-q6", - .id = 0x4009, -}; - -struct platform_device mpq_cpudai_pseudo = { - .name = "msm-dai-q6", - .id = 0x8001, -}; -#define MSM_TSIF0_PHYS (0x18200000) -#define MSM_TSIF1_PHYS (0x18201000) -#define MSM_TSIF_SIZE (0x200) - -#define TSIF_0_CLK GPIO_CFG(55, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_EN GPIO_CFG(56, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_DATA GPIO_CFG(57, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_SYNC GPIO_CFG(62, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_CLK GPIO_CFG(59, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_EN GPIO_CFG(60, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_DATA GPIO_CFG(61, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_SYNC GPIO_CFG(58, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif0_gpios[] = { - { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", }, -}; - -static const struct msm_gpio tsif1_gpios[] = { - { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", }, -}; - -struct msm_tsif_platform_data tsif1_8064_platform_data = { - .num_gpios = ARRAY_SIZE(tsif1_gpios), - .gpios = tsif1_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", -}; - -struct resource tsif1_8064_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF2_IRQ, - .end = TSIF2_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF1_PHYS, - .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV8064_TSIF_CHAN, - .end = DMOV8064_TSIF_CRCI, - }, -}; - -struct msm_tsif_platform_data tsif0_8064_platform_data = { - .num_gpios = ARRAY_SIZE(tsif0_gpios), - .gpios = tsif0_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", -}; - -struct resource tsif0_8064_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF1_IRQ, - .end = TSIF1_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF0_PHYS, - .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -struct platform_device msm_8064_device_tsif[2] = { - { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif0_8064_resources), - .resource = tsif0_8064_resources, - .dev = { - .platform_data = &tsif0_8064_platform_data - }, - }, - { - .name = "msm_tsif", - .id = 1, - .num_resources = ARRAY_SIZE(tsif1_8064_resources), - .resource = tsif1_8064_resources, - .dev = { - .platform_data = &tsif1_8064_platform_data - }, - } -}; - -#define MSM_TSPP_PHYS (0x18202000) -#define MSM_TSPP_SIZE (0x1000) -#define MSM_TSPP_BAM_PHYS (0x18204000) -#define MSM_TSPP_BAM_SIZE (0x2000) - -static const struct msm_gpio tspp_gpios[] = { - { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", }, - { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", }, -}; - -static struct resource tspp_resources[] = { - [0] = { - .name = "TSIF_TSPP_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF_TSPP_IRQ, - .end = TSIF_TSPP_IRQ, - }, - [1] = { - .name = "TSIF0_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF1_IRQ, - .end = TSIF1_IRQ, - }, - [2] = { - .name = "TSIF1_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF2_IRQ, - .end = TSIF2_IRQ, - }, - [3] = { - .name = "TSIF_BAM_IRQ", - .flags = IORESOURCE_IRQ, - .start = TSIF_BAM_IRQ, - .end = TSIF_BAM_IRQ, - }, - [4] = { - .name = "MSM_TSIF0_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSIF0_PHYS, - .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1, - }, - [5] = { - .name = "MSM_TSIF1_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSIF1_PHYS, - .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1, - }, - [6] = { - .name = "MSM_TSPP_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSPP_PHYS, - .end = MSM_TSPP_PHYS + MSM_TSPP_SIZE - 1, - }, - [7] = { - .name = "MSM_TSPP_BAM_PHYS", - .flags = IORESOURCE_MEM, - .start = MSM_TSPP_BAM_PHYS, - .end = MSM_TSPP_BAM_PHYS + MSM_TSPP_BAM_SIZE - 1, - }, -}; - -static struct msm_tspp_platform_data tspp_platform_data = { - .num_gpios = ARRAY_SIZE(tspp_gpios), - .gpios = tspp_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", - .tsif_vreg_present = 0, -}; - -struct platform_device msm_8064_device_tspp = { - .name = "msm_tspp", - .id = 0, - .num_resources = ARRAY_SIZE(tspp_resources), - .resource = tspp_resources, - .dev = { - .platform_data = &tspp_platform_data - }, -}; - -/* - * Machine specific data for AUX PCM Interface - * which the driver will be unware of. - */ -struct msm_dai_auxpcm_pdata apq_auxpcm_pdata = { - .clk = "pcm_clk", - .mode_8k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 2048000, - }, - .mode_16k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 4096000, - } -}; - -struct platform_device apq_cpudai_auxpcm_rx = { - .name = "msm-dai-q6", - .id = 2, - .dev = { - .platform_data = &apq_auxpcm_pdata, - }, -}; - -struct platform_device apq_cpudai_auxpcm_tx = { - .name = "msm-dai-q6", - .id = 3, - .dev = { - .platform_data = &apq_auxpcm_pdata, - }, -}; - -struct msm_mi2s_pdata mpq_mi2s_tx_data = { - .rx_sd_lines = 0, - .tx_sd_lines = MSM_MI2S_SD0 | MSM_MI2S_SD1 | MSM_MI2S_SD2 | - MSM_MI2S_SD3, -}; - -struct platform_device mpq_cpudai_mi2s_tx = { - .name = "msm-dai-q6-mi2s", - .id = -1, /*MI2S_TX */ - .dev = { - .platform_data = &mpq_mi2s_tx_data, - }, -}; - -struct msm_mi2s_pdata apq_mi2s_data = { - .rx_sd_lines = MSM_MI2S_SD0, - .tx_sd_lines = MSM_MI2S_SD3, -}; - -struct platform_device apq_cpudai_mi2s = { - .name = "msm-dai-q6-mi2s", - .id = -1, - .dev = { - .platform_data = &apq_mi2s_data, - }, -}; - -struct platform_device apq_cpudai_i2s_rx = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_RX, -}; - -struct platform_device apq_cpudai_i2s_tx = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_TX, -}; - -struct platform_device apq_cpu_fe = { - .name = "msm-dai-fe", - .id = -1, -}; - -struct platform_device apq_stub_codec = { - .name = "msm-stub-codec", - .id = 1, -}; - -struct platform_device apq_voice = { - .name = "msm-pcm-voice", - .id = -1, -}; - -struct platform_device apq_voip = { - .name = "msm-voip-dsp", - .id = -1, -}; - -struct platform_device apq_lpa_pcm = { - .name = "msm-pcm-lpa", - .id = -1, -}; - -struct platform_device apq_compr_dsp = { - .name = "msm-compr-dsp", - .id = -1, -}; - -struct platform_device apq_multi_ch_pcm = { - .name = "msm-multi-ch-pcm-dsp", - .id = -1, -}; - -struct platform_device apq_lowlatency_pcm = { - .name = "msm-lowlatency-pcm-dsp", - .id = -1, -}; - -struct platform_device apq_pcm_hostless = { - .name = "msm-pcm-hostless", - .id = -1, -}; - -struct platform_device apq_cpudai_afe_01_rx = { - .name = "msm-dai-q6", - .id = 0xE0, -}; - -struct platform_device apq_cpudai_afe_01_tx = { - .name = "msm-dai-q6", - .id = 0xF0, -}; - -struct platform_device apq_cpudai_afe_02_rx = { - .name = "msm-dai-q6", - .id = 0xF1, -}; - -struct platform_device apq_cpudai_afe_02_tx = { - .name = "msm-dai-q6", - .id = 0xE1, -}; - -struct platform_device apq_pcm_afe = { - .name = "msm-pcm-afe", - .id = -1, -}; - -struct platform_device apq_cpudai_stub = { - .name = "msm-dai-stub", - .id = -1, -}; - -struct platform_device apq_cpudai_slimbus_1_rx = { - .name = "msm-dai-q6", - .id = 0x4002, -}; - -struct platform_device apq_cpudai_slimbus_1_tx = { - .name = "msm-dai-q6", - .id = 0x4003, -}; - -struct platform_device apq_cpudai_slimbus_2_rx = { - .name = "msm-dai-q6", - .id = 0x4004, -}; - -struct platform_device apq_cpudai_slimbus_2_tx = { - .name = "msm-dai-q6", - .id = 0x4005, -}; - -struct platform_device apq_cpudai_slimbus_3_rx = { - .name = "msm-dai-q6", - .id = 0x4006, -}; - -struct platform_device apq_cpudai_slimbus_3_tx = { - .name = "msm-dai-q6", - .id = 0x4007, -}; - -static struct resource resources_ssbi_pmic1[] = { - { - .start = MSM_PMIC1_SSBI_CMD_PHYS, - .end = MSM_PMIC1_SSBI_CMD_PHYS + MSM_PMIC_SSBI_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -#define LPASS_SLIMBUS_PHYS 0x28080000 -#define LPASS_SLIMBUS_BAM_PHYS 0x28084000 -#define LPASS_SLIMBUS_SLEW (MSM8960_TLMM_PHYS + 0x207C) -/* Board info for the slimbus slave device */ -static struct resource slimbus_res[] = { - { - .start = LPASS_SLIMBUS_PHYS, - .end = LPASS_SLIMBUS_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_physical", - }, - { - .start = LPASS_SLIMBUS_BAM_PHYS, - .end = LPASS_SLIMBUS_BAM_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_bam_physical", - }, - { - .start = LPASS_SLIMBUS_SLEW, - .end = LPASS_SLIMBUS_SLEW + 4 - 1, - .flags = IORESOURCE_MEM, - .name = "slimbus_slew_reg", - }, - { - .start = SLIMBUS0_CORE_EE1_IRQ, - .end = SLIMBUS0_CORE_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_irq", - }, - { - .start = SLIMBUS0_BAM_EE1_IRQ, - .end = SLIMBUS0_BAM_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_bam_irq", - }, -}; - -struct platform_device apq8064_slim_ctrl = { - .name = "msm_slim_ctrl", - .id = 1, - .num_resources = ARRAY_SIZE(slimbus_res), - .resource = slimbus_res, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device apq8064_device_ssbi_pmic1 = { - .name = "msm_ssbi", - .id = 0, - .resource = resources_ssbi_pmic1, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic1), -}; - -static struct resource resources_ssbi_pmic2[] = { - { - .start = MSM_PMIC2_SSBI_CMD_PHYS, - .end = MSM_PMIC2_SSBI_CMD_PHYS + MSM_PMIC_SSBI_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device apq8064_device_ssbi_pmic2 = { - .name = "msm_ssbi", - .id = 1, - .resource = resources_ssbi_pmic2, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic2), -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB1_PHYS, - .end = MSM_HSUSB1_PHYS + MSM_HSUSB1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device apq8064_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsusb[] = { - { - .start = MSM_HSUSB1_PHYS, - .end = MSM_HSUSB1_PHYS + MSM_HSUSB1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device apq8064_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb), - .resource = resources_hsusb, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB1_PHYS, - .end = MSM_HSUSB1_PHYS + MSM_HSUSB1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_hsic_host[] = { - { - .start = 0x12510000, - .end = 0x12510000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB2_HSIC_IRQ, - .end = USB2_HSIC_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GPIO_TO_INT(49), - .end = MSM_GPIO_TO_INT(49), - .name = "peripheral_status_irq", - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GPIO_TO_INT(47), - .end = MSM_GPIO_TO_INT(47), - .name = "wakeup", - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = DMA_BIT_MASK(32); -struct platform_device apq8064_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device apq8064_device_hsic_host = { - .name = "msm_hsic_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsic_host), - .resource = resources_hsic_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_ehci_host3[] = { -{ - .start = MSM_HSUSB3_PHYS, - .end = MSM_HSUSB3_PHYS + MSM_HSUSB3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB3_HS_IRQ, - .end = USB3_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device apq8064_device_ehci_host3 = { - .name = "msm_ehci_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_ehci_host3), - .resource = resources_ehci_host3, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_ehci_host4[] = { -{ - .start = MSM_HSUSB4_PHYS, - .end = MSM_HSUSB4_PHYS + MSM_HSUSB4_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB4_HS_IRQ, - .end = USB4_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device apq8064_device_ehci_host4 = { - .name = "msm_ehci_host", - .id = 1, - .num_resources = ARRAY_SIZE(resources_ehci_host4), - .resource = resources_ehci_host4, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device apq8064_device_acpuclk = { - .name = "acpuclk-8064", - .id = -1, -}; - -#define SHARED_IMEM_TZ_BASE 0x2a03f720 -static struct resource tzlog_resources[] = { - { - .start = SHARED_IMEM_TZ_BASE, - .end = SHARED_IMEM_TZ_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device apq_device_tz_log = { - .name = "tz_log", - .id = 0, - .num_resources = ARRAY_SIZE(tzlog_resources), - .resource = tzlog_resources, -}; - -/* MSM Video core device */ -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors vidc_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors vidc_venc_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 54525952, - .ib = 436207616, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 72351744, - .ib = 289406976, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 40894464, - .ib = 327155712, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 48234496, - .ib = 192937984, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, -}; -static struct msm_bus_vectors vidc_venc_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 163577856, - .ib = 1308622848, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 219152384, - .ib = 876609536, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, -}; -static struct msm_bus_vectors vidc_vdec_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 121634816, - .ib = 973078528, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 155189248, - .ib = 620756992, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 372244480, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 501219328, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_vectors vidc_venc_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_paths vidc_bus_client_config[] = { - { - ARRAY_SIZE(vidc_init_vectors), - vidc_init_vectors, - }, - { - ARRAY_SIZE(vidc_venc_vga_vectors), - vidc_venc_vga_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_vga_vectors), - vidc_vdec_vga_vectors, - }, - { - ARRAY_SIZE(vidc_venc_720p_vectors), - vidc_venc_720p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_720p_vectors), - vidc_vdec_720p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_vectors), - vidc_venc_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_vectors), - vidc_vdec_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_turbo_vectors), - vidc_venc_1080p_turbo_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_turbo_vectors), - vidc_vdec_1080p_turbo_vectors, - }, -}; - -static struct msm_bus_scale_pdata vidc_bus_client_data = { - vidc_bus_client_config, - ARRAY_SIZE(vidc_bus_client_config), - .name = "vidc", -}; -#endif - - -#define APQ8064_VIDC_BASE_PHYS 0x04400000 -#define APQ8064_VIDC_BASE_SIZE 0x00100000 - -static struct resource apq8064_device_vidc_resources[] = { - { - .start = APQ8064_VIDC_BASE_PHYS, - .end = APQ8064_VIDC_BASE_PHYS + APQ8064_VIDC_BASE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = VCODEC_IRQ, - .end = VCODEC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_vidc_platform_data apq8064_vidc_platform_data = { -#ifdef CONFIG_MSM_BUS_SCALING - .vidc_bus_client_pdata = &vidc_bus_client_data, -#endif -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .memtype = ION_CP_MM_HEAP_ID, - .enable_ion = 1, - .cp_enabled = 1, -#else - .memtype = MEMTYPE_EBI1, - .enable_ion = 0, -#endif - .disable_dmx = 0, - .disable_fullhd = 0, - .cont_mode_dpb_count = 18, - .fw_addr = 0x9fe00000, -}; - -struct platform_device apq8064_msm_device_vidc = { - .name = "msm_vidc", - .id = 0, - .num_resources = ARRAY_SIZE(apq8064_device_vidc_resources), - .resource = apq8064_device_vidc_resources, - .dev = { - .platform_data = &apq8064_vidc_platform_data, - }, -}; -#define MSM_SDC1_BASE 0x12400000 -#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800) -#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000) -#define MSM_SDC2_BASE 0x12140000 -#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800) -#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000) -#define MSM_SDC3_BASE 0x12180000 -#define MSM_SDC3_DML_BASE (MSM_SDC3_BASE + 0x800) -#define MSM_SDC3_BAM_BASE (MSM_SDC3_BASE + 0x2000) -#define MSM_SDC4_BASE 0x121C0000 -#define MSM_SDC4_DML_BASE (MSM_SDC4_BASE + 0x800) -#define MSM_SDC4_BAM_BASE (MSM_SDC4_BASE + 0x2000) - -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC1_IRQ_0, - .end = SDC1_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC1_DML_BASE, - .end = MSM_SDC1_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC1_BAM_BASE, - .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC1_BAM_IRQ, - .end = SDC1_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC2_IRQ_0, - .end = SDC2_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC2_DML_BASE, - .end = MSM_SDC2_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC2_BAM_BASE, - .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC2_BAM_IRQ, - .end = SDC2_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC3_IRQ_0, - .end = SDC3_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC3_DML_BASE, - .end = MSM_SDC3_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC3_BAM_BASE, - .end = MSM_SDC3_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC3_BAM_IRQ, - .end = SDC3_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC4_IRQ_0, - .end = SDC4_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC4_DML_BASE, - .end = MSM_SDC4_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC4_BAM_BASE, - .end = MSM_SDC4_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC4_BAM_IRQ, - .end = SDC4_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -struct platform_device apq8064_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device apq8064_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device apq8064_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device apq8064_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *apq8064_sdcc_devices[] __initdata = { - &apq8064_device_sdc1, - &apq8064_device_sdc2, - &apq8064_device_sdc3, - &apq8064_device_sdc4, -}; - -int __init apq8064_add_sdcc(unsigned int controller, - struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (!plat) - return 0; - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = apq8064_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#define MSM_SATA_AHCI_BASE 0x29000000 -#define MSM_SATA_AHCI_REGS_SZ 0x180 -#define MSM_SATA_PHY_BASE 0x1B400000 -#define MSM_SATA_PHY_REGS_SZ 0x200 - -static struct resource resources_sata[] = { - { - .name = "ahci_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SATA_AHCI_BASE, - .end = MSM_SATA_AHCI_BASE + MSM_SATA_AHCI_REGS_SZ - 1, - }, - { - .name = "ahci_irq", - .flags = IORESOURCE_IRQ, - .start = SATA_CONTROLLER_IRQ, - .end = SATA_CONTROLLER_IRQ, - }, - { - .name = "phy_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SATA_PHY_BASE, - .end = MSM_SATA_PHY_BASE + MSM_SATA_PHY_REGS_SZ - 1, - }, -}; - -static u64 sata_dma_mask = DMA_BIT_MASK(32); -struct platform_device apq8064_device_sata = { - .name = "msm_sata", - .id = 0, - .num_resources = ARRAY_SIZE(resources_sata), - .resource = resources_sata, - .dev = { - .dma_mask = &sata_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_sps[] = { - { - .name = "pipe_mem", - .start = 0x12800000, - .end = 0x12800000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_dma", - .start = 0x12240000, - .end = 0x12240000 + 0x1000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_bam", - .start = 0x12244000, - .end = 0x12244000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_irq", - .start = SPS_BAM_DMA_IRQ, - .end = SPS_BAM_DMA_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_bus_8064_sys_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM, -}; -struct platform_device msm_bus_8064_apps_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_APPSS, -}; -struct platform_device msm_bus_8064_mm_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_MMSS, -}; -struct platform_device msm_bus_8064_sys_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM_FPB, -}; -struct platform_device msm_bus_8064_cpss_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_CPSS_FPB, -}; - -static struct msm_sps_platform_data msm_sps_pdata = { - .bamdma_restricted_pipes = 0x06, -}; - -struct platform_device msm_device_sps_apq8064 = { - .name = "msm_sps", - .id = -1, - .num_resources = ARRAY_SIZE(resources_sps), - .resource = resources_sps, - .dev.platform_data = &msm_sps_pdata, -}; - -static struct resource smd_resource[] = { - { - .name = "a9_m2a_0", - .start = INT_A9_M2A_0, - .flags = IORESOURCE_IRQ, - }, - { - .name = "a9_m2a_5", - .start = INT_A9_M2A_5, - .flags = IORESOURCE_IRQ, - }, - { - .name = "adsp_a11", - .start = INT_ADSP_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "adsp_a11_smsm", - .start = INT_ADSP_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dsps_a11", - .start = INT_DSPS_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dsps_a11_smsm", - .start = INT_DSPS_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, - { - .name = "wcnss_a11", - .start = INT_WCNSS_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "wcnss_a11_smsm", - .start = INT_WCNSS_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct smd_subsystem_config smd_config_list[] = { - { - .irq_config_id = SMD_MODEM, - .subsys_name = "gss", - .edge = SMD_APPS_MODEM, - - .smd_int.irq_name = "a9_m2a_0", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 3, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "a9_m2a_5", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 4, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, - { - .irq_config_id = SMD_Q6, - .subsys_name = "adsp", - .edge = SMD_APPS_QDSP, - - .smd_int.irq_name = "adsp_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 15, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "adsp_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 14, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, - { - .irq_config_id = SMD_DSPS, - .subsys_name = "dsps", - .edge = SMD_APPS_DSPS, - - .smd_int.irq_name = "dsps_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1, - .smd_int.out_base = (void __iomem *)MSM_SIC_NON_SECURE_BASE, - .smd_int.out_offset = 0x4080, - - .smsm_int.irq_name = "dsps_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1, - .smsm_int.out_base = (void __iomem *)MSM_SIC_NON_SECURE_BASE, - .smsm_int.out_offset = 0x4094, - }, - { - .irq_config_id = SMD_WCNSS, - .subsys_name = "wcnss", - .edge = SMD_APPS_WCNSS, - - .smd_int.irq_name = "wcnss_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 25, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "wcnss_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 23, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, -}; - -static struct smd_subsystem_restart_config smd_ssr_config = { - .disable_smsm_reset_handshake = 1, -}; - -static struct smd_platform smd_platform_data = { - .num_ss_configs = ARRAY_SIZE(smd_config_list), - .smd_ss_configs = smd_config_list, - .smd_ssr_config = &smd_ssr_config, -}; - -struct platform_device msm_device_smd_apq8064 = { - .name = "msm_smd", - .id = -1, - .resource = smd_resource, - .num_resources = ARRAY_SIZE(smd_resource), - .dev = { - .platform_data = &smd_platform_data, - }, -}; - -static struct resource resources_msm_pcie[] = { - { - .name = "pcie_parf", - .start = PCIE20_PARF_PHYS, - .end = PCIE20_PARF_PHYS + PCIE20_PARF_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "pcie_elbi", - .start = PCIE20_ELBI_PHYS, - .end = PCIE20_ELBI_PHYS + PCIE20_ELBI_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "pcie20", - .start = PCIE20_PHYS, - .end = PCIE20_PHYS + PCIE20_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_pcie = { - .name = "msm_pcie", - .id = -1, - .num_resources = ARRAY_SIZE(resources_msm_pcie), - .resource = resources_msm_pcie, -}; - -#ifdef CONFIG_HW_RANDOM_MSM -/* PRNG device */ -#define MSM_PRNG_PHYS 0x1A500000 -static struct resource rng_resources = { - .flags = IORESOURCE_MEM, - .start = MSM_PRNG_PHYS, - .end = MSM_PRNG_PHYS + SZ_512 - 1, -}; - -struct platform_device apq8064_device_rng = { - .name = "msm_rng", - .id = 0, - .num_resources = 1, - .resource = &rng_resources, -}; -#endif - -static struct resource msm_gss_resources[] = { - { - .start = 0x10000000, - .end = 0x10000000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x10008000, - .end = 0x10008000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = GSS_A5_WDOG_EXPIRED, - .end = GSS_A5_WDOG_EXPIRED, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_gss = { - .name = "pil_gss", - .id = -1, - .num_resources = ARRAY_SIZE(msm_gss_resources), - .resource = msm_gss_resources, -}; - -static struct fs_driver_data gfx3d_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk", .reset_rate = 1800000 }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .reset_delay_us = 10, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_3D, - .bus_port1 = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, -}; - -static struct fs_driver_data ijpeg_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_JPEG_ENC, -}; - -static struct fs_driver_data mdp_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "lut_clk" }, - { .name = "tv_src_clk" }, - { .name = "tv_clk" }, - { .name = "reset1_clk" }, - { .name = "reset2_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data rot_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_ROTATOR, -}; - -static struct fs_driver_data ved_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VIDEO_ENC, - .bus_port1 = MSM_BUS_MASTER_VIDEO_DEC, -}; - -static struct fs_driver_data vfe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VFE, -}; - -static struct fs_driver_data vpe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VPE, -}; - -static struct fs_driver_data vcap_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 }, - }, - .bus_port0 = MSM_BUS_MASTER_VIDEO_CAP, -}; - -struct platform_device *apq8064_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D_8064, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), - FS_8X60(FS_VCAP, "vdd", "msm_vcap.0", &vcap_fs_data), -}; -unsigned apq8064_num_footswitch __initdata = ARRAY_SIZE(apq8064_footswitch); - -struct msm_rpm_platform_data apq8064_rpm_data __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(8064, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8064, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8064, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(8064, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8064, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8064, RPM_CTL, RPM_CTL, 1), - MSM_RPM_MAP(8064, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(8064, PXO_CLK, PXO_CLK, 1), - MSM_RPM_MAP(8064, APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1), - MSM_RPM_MAP(8064, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(8064, MM_FABRIC_CLK, MM_FABRIC_CLK, 1), - MSM_RPM_MAP(8064, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(8064, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(8064, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(8064, MMFPB_CLK, MMFPB_CLK, 1), - MSM_RPM_MAP(8064, EBI1_CLK, EBI1_CLK, 1), - MSM_RPM_MAP(8064, APPS_FABRIC_CFG_HALT_0, - APPS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8064, APPS_FABRIC_CFG_CLKMOD_0, - APPS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8064, APPS_FABRIC_CFG_IOCTL, - APPS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8064, APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 12), - MSM_RPM_MAP(8064, SYS_FABRIC_CFG_HALT_0, - SYS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8064, SYS_FABRIC_CFG_CLKMOD_0, - SYS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8064, SYS_FABRIC_CFG_IOCTL, - SYS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8064, SYSTEM_FABRIC_ARB_0, SYSTEM_FABRIC_ARB, 30), - MSM_RPM_MAP(8064, MMSS_FABRIC_CFG_HALT_0, - MMSS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8064, MMSS_FABRIC_CFG_CLKMOD_0, - MMSS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8064, MMSS_FABRIC_CFG_IOCTL, - MMSS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8064, MM_FABRIC_ARB_0, MM_FABRIC_ARB, 21), - MSM_RPM_MAP(8064, PM8921_S1_0, PM8921_S1, 2), - MSM_RPM_MAP(8064, PM8921_S2_0, PM8921_S2, 2), - MSM_RPM_MAP(8064, PM8921_S3_0, PM8921_S3, 2), - MSM_RPM_MAP(8064, PM8921_S4_0, PM8921_S4, 2), - MSM_RPM_MAP(8064, PM8921_S5_0, PM8921_S5, 2), - MSM_RPM_MAP(8064, PM8921_S6_0, PM8921_S6, 2), - MSM_RPM_MAP(8064, PM8921_S7_0, PM8921_S7, 2), - MSM_RPM_MAP(8064, PM8921_S8_0, PM8921_S8, 2), - MSM_RPM_MAP(8064, PM8921_L1_0, PM8921_L1, 2), - MSM_RPM_MAP(8064, PM8921_L2_0, PM8921_L2, 2), - MSM_RPM_MAP(8064, PM8921_L3_0, PM8921_L3, 2), - MSM_RPM_MAP(8064, PM8921_L4_0, PM8921_L4, 2), - MSM_RPM_MAP(8064, PM8921_L5_0, PM8921_L5, 2), - MSM_RPM_MAP(8064, PM8921_L6_0, PM8921_L6, 2), - MSM_RPM_MAP(8064, PM8921_L7_0, PM8921_L7, 2), - MSM_RPM_MAP(8064, PM8921_L8_0, PM8921_L8, 2), - MSM_RPM_MAP(8064, PM8921_L9_0, PM8921_L9, 2), - MSM_RPM_MAP(8064, PM8921_L10_0, PM8921_L10, 2), - MSM_RPM_MAP(8064, PM8921_L11_0, PM8921_L11, 2), - MSM_RPM_MAP(8064, PM8921_L12_0, PM8921_L12, 2), - MSM_RPM_MAP(8064, PM8921_L13_0, PM8921_L13, 2), - MSM_RPM_MAP(8064, PM8921_L14_0, PM8921_L14, 2), - MSM_RPM_MAP(8064, PM8921_L15_0, PM8921_L15, 2), - MSM_RPM_MAP(8064, PM8921_L16_0, PM8921_L16, 2), - MSM_RPM_MAP(8064, PM8921_L17_0, PM8921_L17, 2), - MSM_RPM_MAP(8064, PM8921_L18_0, PM8921_L18, 2), - MSM_RPM_MAP(8064, PM8921_L19_0, PM8921_L19, 2), - MSM_RPM_MAP(8064, PM8921_L20_0, PM8921_L20, 2), - MSM_RPM_MAP(8064, PM8921_L21_0, PM8921_L21, 2), - MSM_RPM_MAP(8064, PM8921_L22_0, PM8921_L22, 2), - MSM_RPM_MAP(8064, PM8921_L23_0, PM8921_L23, 2), - MSM_RPM_MAP(8064, PM8921_L24_0, PM8921_L24, 2), - MSM_RPM_MAP(8064, PM8921_L25_0, PM8921_L25, 2), - MSM_RPM_MAP(8064, PM8921_L26_0, PM8921_L26, 2), - MSM_RPM_MAP(8064, PM8921_L27_0, PM8921_L27, 2), - MSM_RPM_MAP(8064, PM8921_L28_0, PM8921_L28, 2), - MSM_RPM_MAP(8064, PM8921_L29_0, PM8921_L29, 2), - MSM_RPM_MAP(8064, PM8921_CLK1_0, PM8921_CLK1, 2), - MSM_RPM_MAP(8064, PM8921_CLK2_0, PM8921_CLK2, 2), - MSM_RPM_MAP(8064, PM8921_LVS1, PM8921_LVS1, 1), - MSM_RPM_MAP(8064, PM8921_LVS2, PM8921_LVS2, 1), - MSM_RPM_MAP(8064, PM8921_LVS3, PM8921_LVS3, 1), - MSM_RPM_MAP(8064, PM8921_LVS4, PM8921_LVS4, 1), - MSM_RPM_MAP(8064, PM8921_LVS5, PM8921_LVS5, 1), - MSM_RPM_MAP(8064, PM8921_LVS6, PM8921_LVS6, 1), - MSM_RPM_MAP(8064, PM8921_LVS7, PM8921_LVS7, 1), - MSM_RPM_MAP(8064, PM8821_S1_0, PM8821_S1, 2), - MSM_RPM_MAP(8064, PM8821_S2_0, PM8821_S2, 2), - MSM_RPM_MAP(8064, PM8821_L1_0, PM8821_L1, 2), - MSM_RPM_MAP(8064, NCP_0, NCP, 2), - MSM_RPM_MAP(8064, CXO_BUFFERS, CXO_BUFFERS, 1), - MSM_RPM_MAP(8064, USB_OTG_SWITCH, USB_OTG_SWITCH, 1), - MSM_RPM_MAP(8064, HDMI_SWITCH, HDMI_SWITCH, 1), - MSM_RPM_MAP(8064, DDR_DMM_0, DDR_DMM, 2), - MSM_RPM_MAP(8064, QDSS_CLK, QDSS_CLK, 1), - MSM_RPM_MAP(8064, VDDMIN_GPIO, VDDMIN_GPIO, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(8064, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(8064, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(8064, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(8064, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8064, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(8064, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(8064, RESERVED_SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8064, SEQUENCE), - MSM_RPM_STATUS_ID_MAP(8064, RPM_CTL), - MSM_RPM_STATUS_ID_MAP(8064, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(8064, PXO_CLK), - MSM_RPM_STATUS_ID_MAP(8064, APPS_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8064, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8064, MM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8064, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8064, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8064, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8064, MMFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8064, EBI1_CLK), - MSM_RPM_STATUS_ID_MAP(8064, APPS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8064, APPS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8064, APPS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8064, APPS_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8064, SYS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8064, SYS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8064, SYS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8064, SYSTEM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8064, MMSS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8064, MMSS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8064, MMSS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8064, MM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S1_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S1_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S2_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S2_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S3_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S3_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S4_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S4_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S5_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S5_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S6_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S6_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S7_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S7_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S8_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_S8_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L1_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L1_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L2_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L2_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L3_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L3_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L4_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L4_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L5_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L5_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L6_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L6_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L7_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L7_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L8_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L8_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L9_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L9_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L10_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L10_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L11_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L11_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L12_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L12_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L13_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L13_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L14_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L14_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L15_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L15_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L16_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L16_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L17_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L17_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L18_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L18_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L19_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L19_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L20_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L20_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L21_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L21_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L22_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L22_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L23_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L23_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L24_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L24_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L25_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L25_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L26_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L26_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L27_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L27_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L28_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L28_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L29_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_L29_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_CLK1_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_CLK1_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_CLK2_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_CLK2_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS1), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS2), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS3), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS4), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS5), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS6), - MSM_RPM_STATUS_ID_MAP(8064, PM8921_LVS7), - MSM_RPM_STATUS_ID_MAP(8064, NCP_0), - MSM_RPM_STATUS_ID_MAP(8064, NCP_1), - MSM_RPM_STATUS_ID_MAP(8064, CXO_BUFFERS), - MSM_RPM_STATUS_ID_MAP(8064, USB_OTG_SWITCH), - MSM_RPM_STATUS_ID_MAP(8064, HDMI_SWITCH), - MSM_RPM_STATUS_ID_MAP(8064, DDR_DMM_0), - MSM_RPM_STATUS_ID_MAP(8064, DDR_DMM_1), - MSM_RPM_STATUS_ID_MAP(8064, EBI1_CH0_RANGE), - MSM_RPM_STATUS_ID_MAP(8064, EBI1_CH1_RANGE), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_S1_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_S1_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_S2_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_S2_1), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_L1_0), - MSM_RPM_STATUS_ID_MAP(8064, PM8821_L1_1), - MSM_RPM_STATUS_ID_MAP(8064, VDDMIN_GPIO), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(8064, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(8064, VERSION_MINOR), - MSM_RPM_CTRL_MAP(8064, VERSION_BUILD), - MSM_RPM_CTRL_MAP(8064, REQ_CTX_0), - MSM_RPM_CTRL_MAP(8064, REQ_SEL_0), - MSM_RPM_CTRL_MAP(8064, ACK_CTX_0), - MSM_RPM_CTRL_MAP(8064, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_8064_SEL_INVALIDATE, - .sel_notification = MSM_RPM_8064_SEL_NOTIFICATION, - .sel_last = MSM_RPM_8064_SEL_LAST, - .ver = {3, 0, 0}, -}; - -struct platform_device apq8064_rpm_device = { - .name = "msm_rpm", - .id = -1, -}; - -static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = { - .version = 1, -}; - - -static struct resource msm_rpm_stat_resource[] = { - { - .start = 0x0010D204, - .end = 0x0010D204 + SZ_8K, - .flags = IORESOURCE_MEM, - .name = "phys_addr_base" - }, -}; - - -struct platform_device apq8064_rpm_stat_device = { - .name = "msm_rpm_stat", - .id = -1, - .resource = msm_rpm_stat_resource, - .num_resources = ARRAY_SIZE(msm_rpm_stat_resource), - .dev = { - .platform_data = &msm_rpm_stat_pdata, - } -}; - -static struct resource resources_rpm_master_stats[] = { - { - .start = MSM8064_RPM_MASTER_STATS_BASE, - .end = MSM8064_RPM_MASTER_STATS_BASE + SZ_256, - .flags = IORESOURCE_MEM, - }, -}; - -static char *master_names[] = { - "KPSS", - "MPSS", - "LPASS", - "RIVA", - "DSPS", -}; - -static struct msm_rpm_master_stats_platform_data msm_rpm_master_stat_pdata = { - .masters = master_names, - .num_masters = ARRAY_SIZE(master_names), - .master_offset = 32, -}; - -struct platform_device apq8064_rpm_master_stat_device = { - .name = "msm_rpm_master_stats", - .id = -1, - .num_resources = ARRAY_SIZE(resources_rpm_master_stats), - .resource = resources_rpm_master_stats, - .dev = { - .platform_data = &msm_rpm_master_stat_pdata, - }, -}; - -static struct msm_rpm_log_platform_data msm_rpm_log_pdata = { - .phys_addr_base = 0x0010C000, - .reg_offsets = { - [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080, - [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0, - }, - .phys_size = SZ_8K, - .log_len = 6144, /* log's buffer length in bytes */ - .log_len_mask = (6144 >> 2) - 1, /* length mask in units of u32 */ -}; - -struct platform_device apq8064_rpm_log_device = { - .name = "msm_rpm_log", - .id = -1, - .dev = { - .platform_data = &msm_rpm_log_pdata, - }, -}; - -/* Sensors DSPS platform data */ - -static struct dsps_clk_info dsps_clks[] = {}; -static struct dsps_regulator_info dsps_regs[] = {}; - -/* - * Note: GPIOs field is intialized in run-time at the function - * apq8064_init_dsps(). - */ - -#define PPSS_REG_PHYS_BASE 0x12080000 - -struct msm_dsps_platform_data msm_dsps_pdata_8064 = { - .clks = dsps_clks, - .clks_num = ARRAY_SIZE(dsps_clks), - .gpios = NULL, - .gpios_num = 0, - .regs = dsps_regs, - .regs_num = ARRAY_SIZE(dsps_regs), - .dsps_pwr_ctl_en = 1, - .signature = DSPS_SIGNATURE, -}; - -static struct resource msm_dsps_resources[] = { - { - .start = PPSS_REG_PHYS_BASE, - .end = PPSS_REG_PHYS_BASE + SZ_8K - 1, - .name = "ppss_reg", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_dsps_device_8064 = { - .name = "msm_dsps", - .id = 0, - .num_resources = ARRAY_SIZE(msm_dsps_resources), - .resource = msm_dsps_resources, - .dev.platform_data = &msm_dsps_pdata_8064, -}; - -#ifdef CONFIG_MSM_MPM -static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = { - [1] = MSM_GPIO_TO_INT(26), - [2] = MSM_GPIO_TO_INT(88), - [4] = MSM_GPIO_TO_INT(73), - [5] = MSM_GPIO_TO_INT(74), - [6] = MSM_GPIO_TO_INT(75), - [7] = MSM_GPIO_TO_INT(76), - [8] = MSM_GPIO_TO_INT(77), - [9] = MSM_GPIO_TO_INT(36), - [10] = MSM_GPIO_TO_INT(84), - [11] = MSM_GPIO_TO_INT(7), - [12] = MSM_GPIO_TO_INT(11), - [13] = MSM_GPIO_TO_INT(52), - [14] = MSM_GPIO_TO_INT(15), - [15] = MSM_GPIO_TO_INT(83), - [16] = USB3_HS_IRQ, - [19] = MSM_GPIO_TO_INT(61), - [20] = MSM_GPIO_TO_INT(58), - [23] = MSM_GPIO_TO_INT(65), - [24] = MSM_GPIO_TO_INT(63), - [25] = USB1_HS_IRQ, - [27] = HDMI_IRQ, - [29] = MSM_GPIO_TO_INT(22), - [30] = MSM_GPIO_TO_INT(72), - [31] = USB4_HS_IRQ, - [33] = MSM_GPIO_TO_INT(44), - [34] = MSM_GPIO_TO_INT(39), - [35] = MSM_GPIO_TO_INT(19), - [36] = MSM_GPIO_TO_INT(23), - [37] = MSM_GPIO_TO_INT(41), - [38] = MSM_GPIO_TO_INT(30), - [41] = MSM_GPIO_TO_INT(42), - [42] = MSM_GPIO_TO_INT(56), - [43] = MSM_GPIO_TO_INT(55), - [44] = MSM_GPIO_TO_INT(50), - [45] = MSM_GPIO_TO_INT(49), - [46] = MSM_GPIO_TO_INT(47), - [47] = MSM_GPIO_TO_INT(45), - [48] = MSM_GPIO_TO_INT(38), - [49] = MSM_GPIO_TO_INT(34), - [50] = MSM_GPIO_TO_INT(32), - [51] = MSM_GPIO_TO_INT(29), - [52] = MSM_GPIO_TO_INT(18), - [53] = MSM_GPIO_TO_INT(10), - [54] = MSM_GPIO_TO_INT(81), - [55] = MSM_GPIO_TO_INT(6), -}; - -static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = { - TLMM_MSM_SUMMARY_IRQ, - RPM_APCC_CPU0_GP_HIGH_IRQ, - RPM_APCC_CPU0_GP_MEDIUM_IRQ, - RPM_APCC_CPU0_GP_LOW_IRQ, - RPM_APCC_CPU0_WAKE_UP_IRQ, - RPM_APCC_CPU1_GP_HIGH_IRQ, - RPM_APCC_CPU1_GP_MEDIUM_IRQ, - RPM_APCC_CPU1_GP_LOW_IRQ, - RPM_APCC_CPU1_WAKE_UP_IRQ, - MSS_TO_APPS_IRQ_0, - MSS_TO_APPS_IRQ_1, - MSS_TO_APPS_IRQ_2, - MSS_TO_APPS_IRQ_3, - MSS_TO_APPS_IRQ_4, - MSS_TO_APPS_IRQ_5, - MSS_TO_APPS_IRQ_6, - MSS_TO_APPS_IRQ_7, - MSS_TO_APPS_IRQ_8, - MSS_TO_APPS_IRQ_9, - LPASS_SCSS_GP_LOW_IRQ, - LPASS_SCSS_GP_MEDIUM_IRQ, - LPASS_SCSS_GP_HIGH_IRQ, - SPS_MTI_30, - SPS_MTI_31, - RIVA_APSS_SPARE_IRQ, - RIVA_APPS_WLAN_SMSM_IRQ, - RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, - PM8821_SEC_IRQ_N, -}; - -struct msm_mpm_device_data apq8064_mpm_dev_data __initdata = { - .irqs_m2a = msm_mpm_irqs_m2a, - .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a), - .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs, - .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs), - .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8, - .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8, - .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008, - .mpm_apps_ipc_val = BIT(1), - .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ, - -}; -#endif - -/* AP2MDM_SOFT_RESET is implemented by the PON_RESET_N gpio */ -#define MDM2AP_ERRFATAL 19 -#define AP2MDM_ERRFATAL 18 -#define MDM2AP_STATUS 49 -#define AP2MDM_STATUS 48 -#define AP2MDM_SOFT_RESET 27 -#define I2S_AP2MDM_SOFT_RESET 0 -#define AP2MDM_WAKEUP 35 -#define I2S_AP2MDM_WAKEUP 44 -#define MDM2AP_PBLRDY 46 -#define I2S_MDM2AP_PBLRDY 81 - -static struct resource mdm_resources[] = { - { - .start = MDM2AP_ERRFATAL, - .end = MDM2AP_ERRFATAL, - .name = "MDM2AP_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_ERRFATAL, - .end = AP2MDM_ERRFATAL, - .name = "AP2MDM_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = MDM2AP_STATUS, - .end = MDM2AP_STATUS, - .name = "MDM2AP_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_STATUS, - .end = AP2MDM_STATUS, - .name = "AP2MDM_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_SOFT_RESET, - .end = AP2MDM_SOFT_RESET, - .name = "AP2MDM_SOFT_RESET", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_WAKEUP, - .end = AP2MDM_WAKEUP, - .name = "AP2MDM_WAKEUP", - .flags = IORESOURCE_IO, - }, - { - .start = MDM2AP_PBLRDY, - .end = MDM2AP_PBLRDY, - .name = "MDM2AP_PBLRDY", - .flags = IORESOURCE_IO, - }, -}; - -static struct resource i2s_mdm_resources[] = { - { - .start = MDM2AP_ERRFATAL, - .end = MDM2AP_ERRFATAL, - .name = "MDM2AP_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_ERRFATAL, - .end = AP2MDM_ERRFATAL, - .name = "AP2MDM_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = MDM2AP_STATUS, - .end = MDM2AP_STATUS, - .name = "MDM2AP_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_STATUS, - .end = AP2MDM_STATUS, - .name = "AP2MDM_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = I2S_AP2MDM_SOFT_RESET, - .end = I2S_AP2MDM_SOFT_RESET, - .name = "AP2MDM_SOFT_RESET", - .flags = IORESOURCE_IO, - }, - { - .start = I2S_AP2MDM_WAKEUP, - .end = I2S_AP2MDM_WAKEUP, - .name = "AP2MDM_WAKEUP", - .flags = IORESOURCE_IO, - }, - { - .start = I2S_MDM2AP_PBLRDY, - .end = I2S_MDM2AP_PBLRDY, - .name = "MDM2AP_PBLRDY", - .flags = IORESOURCE_IO, - }, -}; - -struct platform_device mdm_8064_device = { - .name = "mdm2_modem", - .id = -1, - .num_resources = ARRAY_SIZE(mdm_resources), - .resource = mdm_resources, -}; - -struct platform_device i2s_mdm_8064_device = { - .name = "mdm2_modem", - .id = -1, - .num_resources = ARRAY_SIZE(i2s_mdm_resources), - .resource = i2s_mdm_resources, -}; - -static struct msm_dcvs_sync_rule apq8064_dcvs_sync_rules[] = { - {1026000, 400000}, - {384000, 200000}, - {0, 128000}, -}; - -static struct msm_dcvs_platform_data apq8064_dcvs_data = { - .sync_rules = apq8064_dcvs_sync_rules, - .num_sync_rules = ARRAY_SIZE(apq8064_dcvs_sync_rules), - .gpu_max_nom_khz = 320000, -}; - -struct platform_device apq8064_dcvs_device = { - .name = "dcvs", - .id = -1, - .dev = { - .platform_data = &apq8064_dcvs_data, - }, -}; - -static struct msm_dcvs_core_info apq8064_core_info = { - .num_cores = 4, - .sensors = (int[]){7, 8, 9, 10}, - .thermal_poll_ms = 60000, - .core_param = { - .core_type = MSM_DCVS_CORE_TYPE_CPU, - }, - .algo_param = { - .disable_pc_threshold = 1458000, - .em_win_size_min_us = 100000, - .em_win_size_max_us = 300000, - .em_max_util_pct = 97, - .group_id = 1, - .max_freq_chg_time_us = 100000, - .slack_mode_dynamic = 0, - .slack_weight_thresh_pct = 3, - .slack_time_min_us = 45000, - .slack_time_max_us = 45000, - .ss_no_corr_below_freq = 0, - .ss_win_size_min_us = 1000000, - .ss_win_size_max_us = 1000000, - .ss_util_pct = 95, - }, - .energy_coeffs = { - .active_coeff_a = 336, - .active_coeff_b = 0, - .active_coeff_c = 0, - - .leakage_coeff_a = -17720, - .leakage_coeff_b = 37, - .leakage_coeff_c = 3329, - .leakage_coeff_d = -277, - }, - .power_param = { - .current_temp = 25, - .num_freq = 0, /* set at runtime */ - } -}; - -#define APQ8064_LPM_LATENCY 1000 /* >100 usec for WFI */ - -static struct msm_gov_platform_data gov_platform_data = { - .info = &apq8064_core_info, - .latency = APQ8064_LPM_LATENCY, -}; - -struct platform_device apq8064_msm_gov_device = { - .name = "msm_dcvs_gov", - .id = -1, - .dev = { - .platform_data = &gov_platform_data, - }, -}; - -static struct msm_mpd_algo_param apq8064_mpd_algo_param = { - .em_win_size_min_us = 10000, - .em_win_size_max_us = 100000, - .em_max_util_pct = 90, - .online_util_pct_min = 60, - .slack_time_min_us = 50000, - .slack_time_max_us = 100000, -}; - -struct platform_device apq8064_msm_mpd_device = { - .name = "msm_mpdecision", - .id = -1, - .dev = { - .platform_data = &apq8064_mpd_algo_param, - }, -}; - -#ifdef CONFIG_MSM_VCAP -#define VCAP_HW_BASE 0x05900000 - -static struct msm_bus_vectors vcap_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_CAP, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors vcap_480_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_CAP, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 480 * 720 * 3 * 60, - .ib = 480 * 720 * 3 * 60 * 1.5, - }, -}; - -static struct msm_bus_vectors vcap_576_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_CAP, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 576 * 720 * 3 * 60, - .ib = 576 * 720 * 3 * 60 * 1.5, - }, -}; - -static struct msm_bus_vectors vcap_720_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_CAP, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1280 * 720 * 3 * 60, - .ib = 1280 * 720 * 3 * 60 * 1.5, - }, -}; - -static struct msm_bus_vectors vcap_1080_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_CAP, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1920 * 1080 * 10 * 60, - .ib = 1920 * 1080 * 10 * 60 * 1.5, - }, -}; - -static struct msm_bus_paths vcap_bus_usecases[] = { - { - ARRAY_SIZE(vcap_init_vectors), - vcap_init_vectors, - }, - { - ARRAY_SIZE(vcap_480_vectors), - vcap_480_vectors, - }, - { - ARRAY_SIZE(vcap_576_vectors), - vcap_576_vectors, - }, - { - ARRAY_SIZE(vcap_720_vectors), - vcap_720_vectors, - }, - { - ARRAY_SIZE(vcap_1080_vectors), - vcap_1080_vectors, - }, -}; - -static struct msm_bus_scale_pdata vcap_axi_client_pdata = { - vcap_bus_usecases, - ARRAY_SIZE(vcap_bus_usecases), -}; - -static struct resource msm_vcap_resources[] = { - { - .name = "vcap", - .start = VCAP_HW_BASE, - .end = VCAP_HW_BASE + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "vc_irq", - .start = VCAP_VC, - .end = VCAP_VC, - .flags = IORESOURCE_IRQ, - }, - { - .name = "vp_irq", - .start = VCAP_VP, - .end = VCAP_VP, - .flags = IORESOURCE_IRQ, - }, -}; - -static unsigned vcap_gpios[] = { - 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 80, 82, - 83, 84, 85, 86, 87, -}; - -static struct vcap_platform_data vcap_pdata = { - .gpios = vcap_gpios, - .num_gpios = ARRAY_SIZE(vcap_gpios), - .bus_client_pdata = &vcap_axi_client_pdata -}; - -struct platform_device msm8064_device_vcap = { - .name = "msm_vcap", - .id = 0, - .resource = msm_vcap_resources, - .num_resources = ARRAY_SIZE(msm_vcap_resources), - .dev = { - .platform_data = &vcap_pdata, - }, -}; -#endif - -static struct resource msm_cache_erp_resources[] = { - { - .name = "l1_irq", - .start = SC_SICCPUXEXTFAULTIRPTREQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "l2_irq", - .start = APCC_QGICL2IRPTREQ, - .flags = IORESOURCE_IRQ, - } -}; - -struct platform_device apq8064_device_cache_erp = { - .name = "msm_cache_erp", - .id = -1, - .num_resources = ARRAY_SIZE(msm_cache_erp_resources), - .resource = msm_cache_erp_resources, -}; - -#define CORESIGHT_PHYS_BASE 0x01A00000 -#define CORESIGHT_FUNNEL_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x4000) -#define CORESIGHT_ETM2_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x1E000) -#define CORESIGHT_ETM3_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x1F000) - -static struct resource coresight_funnel_resources[] = { - { - .name = "funnel-base", - .start = CORESIGHT_FUNNEL_PHYS_BASE, - .end = CORESIGHT_FUNNEL_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_funnel_outports[] = { 0, 1 }; -static const int coresight_funnel_child_ids[] = { 0, 1 }; -static const int coresight_funnel_child_ports[] = { 0, 0 }; - -static struct coresight_platform_data coresight_funnel_pdata = { - .id = 2, - .name = "coresight-funnel", - .nr_inports = 8, - .outports = coresight_funnel_outports, - .child_ids = coresight_funnel_child_ids, - .child_ports = coresight_funnel_child_ports, - .nr_outports = ARRAY_SIZE(coresight_funnel_outports), -}; - -struct platform_device apq8064_coresight_funnel_device = { - .name = "coresight-funnel", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_funnel_resources), - .resource = coresight_funnel_resources, - .dev = { - .platform_data = &coresight_funnel_pdata, - }, -}; - -static struct resource coresight_etm2_resources[] = { - { - .name = "etm-base", - .start = CORESIGHT_ETM2_PHYS_BASE, - .end = CORESIGHT_ETM2_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_etm2_outports[] = { 0 }; -static const int coresight_etm2_child_ids[] = { 2 }; -static const int coresight_etm2_child_ports[] = { 4 }; - -static struct coresight_platform_data coresight_etm2_pdata = { - .id = 6, - .name = "coresight-etm2", - .nr_inports = 0, - .outports = coresight_etm2_outports, - .child_ids = coresight_etm2_child_ids, - .child_ports = coresight_etm2_child_ports, - .nr_outports = ARRAY_SIZE(coresight_etm2_outports), -}; - -struct platform_device coresight_etm2_device = { - .name = "coresight-etm", - .id = 2, - .num_resources = ARRAY_SIZE(coresight_etm2_resources), - .resource = coresight_etm2_resources, - .dev = { - .platform_data = &coresight_etm2_pdata, - }, -}; - -static struct resource coresight_etm3_resources[] = { - { - .name = "etm-base", - .start = CORESIGHT_ETM3_PHYS_BASE, - .end = CORESIGHT_ETM3_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_etm3_outports[] = { 0 }; -static const int coresight_etm3_child_ids[] = { 2 }; -static const int coresight_etm3_child_ports[] = { 5 }; - -static struct coresight_platform_data coresight_etm3_pdata = { - .id = 7, - .name = "coresight-etm3", - .nr_inports = 0, - .outports = coresight_etm3_outports, - .child_ids = coresight_etm3_child_ids, - .child_ports = coresight_etm3_child_ports, - .nr_outports = ARRAY_SIZE(coresight_etm3_outports), -}; - -struct platform_device coresight_etm3_device = { - .name = "coresight-etm", - .id = 3, - .num_resources = ARRAY_SIZE(coresight_etm3_resources), - .resource = coresight_etm3_resources, - .dev = { - .platform_data = &coresight_etm3_pdata, - }, -}; - -struct msm_iommu_domain_name apq8064_iommu_ctx_names[] = { - /* Camera */ - { - .name = "ijpeg_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "ijpeg_dst", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_dst", - .domain = CAMERA_DOMAIN, - }, - /* Rotator src*/ - { - .name = "rot_src", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Rotator dst */ - { - .name = "rot_dst", - .domain = ROTATOR_DST_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_mm1", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_b_mm2", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_stream", - .domain = VIDEO_DOMAIN, - }, -}; - -static struct mem_pool apq8064_video_pools[] = { - /* - * Video hardware has the following requirements: - * 1. All video addresses used by the video hardware must be at a higher - * address than video firmware address. - * 2. Video hardware can only access a range of 256MB from the base of - * the video firmware. - */ - [VIDEO_FIRMWARE_POOL] = - /* Low addresses, intended for video firmware */ - { - .paddr = SZ_128K, - .size = SZ_16M - SZ_128K, - }, - [VIDEO_MAIN_POOL] = - /* Main video pool */ - { - .paddr = SZ_16M, - .size = SZ_256M - SZ_16M, - }, - [GEN_POOL] = - /* Remaining address space up to 2G */ - { - .paddr = SZ_256M, - .size = SZ_2G - SZ_256M, - }, -}; - -static struct mem_pool apq8064_camera_pools[] = { - [GEN_POOL] = - /* One address space for camera */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool apq8064_display_read_pools[] = { - [GEN_POOL] = - /* One address space for display reads */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool apq8064_display_write_pools[] = { - [GEN_POOL] = - /* One address space for display writes */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool apq8064_rotator_src_pools[] = { - [GEN_POOL] = - /* One address space for rotator src */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool apq8064_rotator_dst_pools[] = { - [GEN_POOL] = - /* One address space for rotator dst */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct msm_iommu_domain apq8064_iommu_domains[] = { - [VIDEO_DOMAIN] = { - .iova_pools = apq8064_video_pools, - .npools = ARRAY_SIZE(apq8064_video_pools), - }, - [CAMERA_DOMAIN] = { - .iova_pools = apq8064_camera_pools, - .npools = ARRAY_SIZE(apq8064_camera_pools), - }, - [DISPLAY_READ_DOMAIN] = { - .iova_pools = apq8064_display_read_pools, - .npools = ARRAY_SIZE(apq8064_display_read_pools), - }, - [DISPLAY_WRITE_DOMAIN] = { - .iova_pools = apq8064_display_write_pools, - .npools = ARRAY_SIZE(apq8064_display_write_pools), - }, - [ROTATOR_SRC_DOMAIN] = { - .iova_pools = apq8064_rotator_src_pools, - .npools = ARRAY_SIZE(apq8064_rotator_src_pools), - }, - [ROTATOR_DST_DOMAIN] = { - .iova_pools = apq8064_rotator_dst_pools, - .npools = ARRAY_SIZE(apq8064_rotator_dst_pools), - }, -}; - -struct iommu_domains_pdata apq8064_iommu_domain_pdata = { - .domains = apq8064_iommu_domains, - .ndomains = ARRAY_SIZE(apq8064_iommu_domains), - .domain_names = apq8064_iommu_ctx_names, - .nnames = ARRAY_SIZE(apq8064_iommu_ctx_names), - .domain_alloc_flags = 0, -}; - -struct platform_device apq8064_iommu_domain_device = { - .name = "iommu_domains", - .id = -1, - .dev = { - .platform_data = &apq8064_iommu_domain_pdata, - } -}; - -struct msm_rtb_platform_data apq8064_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - apq8064_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - -struct platform_device apq8064_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &apq8064_rtb_pdata, - }, -}; - -#define APQ8064_L1_SIZE SZ_1M -/* - * The actual L2 size is smaller but we need a larger buffer - * size to store other dump information - */ -#define APQ8064_L2_SIZE SZ_8M - -struct msm_cache_dump_platform_data apq8064_cache_dump_pdata = { - .l2_size = APQ8064_L2_SIZE, - .l1_size = APQ8064_L1_SIZE, -}; - -struct platform_device apq8064_cache_dump_device = { - .name = "msm_cache_dump", - .id = -1, - .dev = { - .platform_data = &apq8064_cache_dump_pdata, - }, -}; - -struct dev_avtimer_data dev_avtimer_pdata = { - .avtimer_msw_phy_addr = AVTIMER_MSW_PHYSICAL_ADDRESS, - .avtimer_lsw_phy_addr = AVTIMER_LSW_PHYSICAL_ADDRESS, -}; diff --git a/arch/arm/mach-msm/devices-8930.c b/arch/arm/mach-msm/devices-8930.c deleted file mode 100644 index 94040b69c9f7..000000000000 --- a/arch/arm/mach-msm/devices-8930.c +++ /dev/null @@ -1,1352 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "rpm_log.h" -#include "rpm_stats.h" -#include "rpm_rbcpr_stats.h" -#include "footswitch.h" -#include "pm.h" - -#ifdef CONFIG_MSM_MPM -#include -#endif -#define MSM8930_PC_CNTR_PHYS (MSM8930_IMEM_PHYS + 0x664) -#define MSM8930_PC_CNTR_SIZE 0x40 -#define MSM8930_RPM_MASTER_STATS_BASE 0x10B100 - -static struct resource msm8930_resources_pccntr[] = { - { - .start = MSM8930_PC_CNTR_PHYS, - .end = MSM8930_PC_CNTR_PHYS + MSM8930_PC_CNTR_SIZE, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_pm_init_data_type msm_pm_data = { - .retention_calls_tz = true, -}; - -static struct msm_pm_sleep_status_data msm_pm_slp_sts_data = { - .base_addr = MSM_ACC0_BASE + 0x08, - .cpu_offset = MSM_ACC1_BASE - MSM_ACC0_BASE, - .mask = 1UL << 13, -}; - -struct platform_device msm8930_cpu_slp_status = { - .name = "cpu_slp_status", - .id = -1, - .dev = { - .platform_data = &msm_pm_slp_sts_data, - }, -}; - -struct platform_device msm8930_pm_8x60 = { - .name = "pm-8x60", - .id = -1, - .num_resources = ARRAY_SIZE(msm8930_resources_pccntr), - .resource = msm8930_resources_pccntr, - .dev = { - .platform_data = &msm_pm_data, - }, -}; - -struct msm_rpm_platform_data msm8930_rpm_data __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(8930, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8930, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8930, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(8960, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8960, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8930, RPM_CTL, RPM_CTL, 1), - MSM_RPM_MAP(8930, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(8930, PXO_CLK, PXO_CLK, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, MM_FABRIC_CLK, MM_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(8930, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(8930, MMFPB_CLK, MMFPB_CLK, 1), - MSM_RPM_MAP(8930, EBI1_CLK, EBI1_CLK, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_HALT_0, - APPS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_CLKMOD_0, - APPS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_IOCTL, - APPS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 6), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_HALT_0, - SYS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_CLKMOD_0, - SYS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_IOCTL, - SYS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, SYSTEM_FABRIC_ARB_0, - SYSTEM_FABRIC_ARB, 20), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_HALT_0, - MMSS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_CLKMOD_0, - MMSS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_IOCTL, - MMSS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, MM_FABRIC_ARB_0, MM_FABRIC_ARB, 11), - MSM_RPM_MAP(8930, PM8038_S1_0, PM8038_S1, 2), - MSM_RPM_MAP(8930, PM8038_S2_0, PM8038_S2, 2), - MSM_RPM_MAP(8930, PM8038_S3_0, PM8038_S3, 2), - MSM_RPM_MAP(8930, PM8038_S4_0, PM8038_S4, 2), - MSM_RPM_MAP(8930, PM8038_S5_0, PM8038_S5, 2), - MSM_RPM_MAP(8930, PM8038_S6_0, PM8038_S6, 2), - MSM_RPM_MAP(8930, PM8038_L1_0, PM8038_L1, 2), - MSM_RPM_MAP(8930, PM8038_L2_0, PM8038_L2, 2), - MSM_RPM_MAP(8930, PM8038_L3_0, PM8038_L3, 2), - MSM_RPM_MAP(8930, PM8038_L4_0, PM8038_L4, 2), - MSM_RPM_MAP(8930, PM8038_L5_0, PM8038_L5, 2), - MSM_RPM_MAP(8930, PM8038_L6_0, PM8038_L6, 2), - MSM_RPM_MAP(8930, PM8038_L7_0, PM8038_L7, 2), - MSM_RPM_MAP(8930, PM8038_L8_0, PM8038_L8, 2), - MSM_RPM_MAP(8930, PM8038_L9_0, PM8038_L9, 2), - MSM_RPM_MAP(8930, PM8038_L10_0, PM8038_L10, 2), - MSM_RPM_MAP(8930, PM8038_L11_0, PM8038_L11, 2), - MSM_RPM_MAP(8930, PM8038_L12_0, PM8038_L12, 2), - MSM_RPM_MAP(8930, PM8038_L13_0, PM8038_L13, 2), - MSM_RPM_MAP(8930, PM8038_L14_0, PM8038_L14, 2), - MSM_RPM_MAP(8930, PM8038_L15_0, PM8038_L15, 2), - MSM_RPM_MAP(8930, PM8038_L16_0, PM8038_L16, 2), - MSM_RPM_MAP(8930, PM8038_L17_0, PM8038_L17, 2), - MSM_RPM_MAP(8930, PM8038_L18_0, PM8038_L18, 2), - MSM_RPM_MAP(8930, PM8038_L19_0, PM8038_L19, 2), - MSM_RPM_MAP(8930, PM8038_L20_0, PM8038_L20, 2), - MSM_RPM_MAP(8930, PM8038_L21_0, PM8038_L21, 2), - MSM_RPM_MAP(8930, PM8038_L22_0, PM8038_L22, 2), - MSM_RPM_MAP(8930, PM8038_L23_0, PM8038_L23, 2), - MSM_RPM_MAP(8930, PM8038_L24_0, PM8038_L24, 2), - MSM_RPM_MAP(8930, PM8038_L25_0, PM8038_L25, 2), - MSM_RPM_MAP(8930, PM8038_L26_0, PM8038_L26, 2), - MSM_RPM_MAP(8930, PM8038_L27_0, PM8038_L27, 2), - MSM_RPM_MAP(8930, PM8038_CLK1_0, PM8038_CLK1, 2), - MSM_RPM_MAP(8930, PM8038_CLK2_0, PM8038_CLK2, 2), - MSM_RPM_MAP(8930, PM8038_LVS1, PM8038_LVS1, 1), - MSM_RPM_MAP(8930, PM8038_LVS2, PM8038_LVS2, 1), - MSM_RPM_MAP_PMIC(8930, 8038, NCP_0, NCP, 2), - MSM_RPM_MAP_PMIC(8930, 8038, CXO_BUFFERS, CXO_BUFFERS, 1), - MSM_RPM_MAP_PMIC(8930, 8038, USB_OTG_SWITCH, USB_OTG_SWITCH, 1), - MSM_RPM_MAP_PMIC(8930, 8038, HDMI_SWITCH, HDMI_SWITCH, 1), - MSM_RPM_MAP_PMIC(8930, 8038, QDSS_CLK, QDSS_CLK, 1), - MSM_RPM_MAP_PMIC(8930, 8038, VOLTAGE_CORNER, VOLTAGE_CORNER, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(8930, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(8930, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(8930, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(8930, RESERVED_SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8930, SEQUENCE), - MSM_RPM_STATUS_ID_MAP(8930, RPM_CTL), - MSM_RPM_STATUS_ID_MAP(8930, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(8930, PXO_CLK), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, MM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, MMFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, EBI1_CLK), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, SYSTEM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, MM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S3_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S3_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S4_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_S4_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L3_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L3_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L4_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L4_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L5_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L5_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L6_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L6_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L7_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L7_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L8_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L8_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L9_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L9_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L10_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L10_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L11_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L11_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L12_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L12_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L13_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L13_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L14_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L14_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L15_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L15_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L16_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L16_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L17_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L17_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L18_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L18_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L19_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L19_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L20_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L20_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L21_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L21_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L22_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L22_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L23_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L23_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L24_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L24_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L25_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_L25_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_CLK1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_CLK1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_CLK2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_CLK2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_LVS1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_LVS2), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_NCP_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_NCP_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_CXO_BUFFERS), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_USB_OTG_SWITCH), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_HDMI_SWITCH), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_QDSS_CLK), - MSM_RPM_STATUS_ID_MAP(8930, PM8038_VOLTAGE_CORNER), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(8930, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(8930, VERSION_MINOR), - MSM_RPM_CTRL_MAP(8930, VERSION_BUILD), - MSM_RPM_CTRL_MAP(8930, REQ_CTX_0), - MSM_RPM_CTRL_MAP(8930, REQ_SEL_0), - MSM_RPM_CTRL_MAP(8930, ACK_CTX_0), - MSM_RPM_CTRL_MAP(8930, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_8930_SEL_INVALIDATE, - .sel_notification = MSM_RPM_8930_SEL_NOTIFICATION, - .sel_last = MSM_RPM_8930_SEL_LAST, - .ver = {3, 0, 0}, -}; - -struct msm_rpm_platform_data msm8930_rpm_data_pm8917 __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(8930, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8930, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8930, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(8960, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8960, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8930, RPM_CTL, RPM_CTL, 1), - MSM_RPM_MAP(8930, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(8930, PXO_CLK, PXO_CLK, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, MM_FABRIC_CLK, MM_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(8930, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(8930, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(8930, MMFPB_CLK, MMFPB_CLK, 1), - MSM_RPM_MAP(8930, EBI1_CLK, EBI1_CLK, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_HALT_0, - APPS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_CLKMOD_0, - APPS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, APPS_FABRIC_CFG_IOCTL, - APPS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 6), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_HALT_0, - SYS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_CLKMOD_0, - SYS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, SYS_FABRIC_CFG_IOCTL, - SYS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, SYSTEM_FABRIC_ARB_0, - SYSTEM_FABRIC_ARB, 20), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_HALT_0, - MMSS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_CLKMOD_0, - MMSS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8930, MMSS_FABRIC_CFG_IOCTL, - MMSS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8930, MM_FABRIC_ARB_0, MM_FABRIC_ARB, 11), - MSM_RPM_MAP(8930, PM8917_S1_0, PM8917_S1, 2), - MSM_RPM_MAP(8930, PM8917_S2_0, PM8917_S2, 2), - MSM_RPM_MAP(8930, PM8917_S3_0, PM8917_S3, 2), - MSM_RPM_MAP(8930, PM8917_S4_0, PM8917_S4, 2), - MSM_RPM_MAP(8930, PM8917_S5_0, PM8917_S5, 2), - MSM_RPM_MAP(8930, PM8917_S6_0, PM8917_S6, 2), - MSM_RPM_MAP(8930, PM8917_S7_0, PM8917_S7, 2), - MSM_RPM_MAP(8930, PM8917_S8_0, PM8917_S8, 2), - MSM_RPM_MAP(8930, PM8917_L1_0, PM8917_L1, 2), - MSM_RPM_MAP(8930, PM8917_L2_0, PM8917_L2, 2), - MSM_RPM_MAP(8930, PM8917_L3_0, PM8917_L3, 2), - MSM_RPM_MAP(8930, PM8917_L4_0, PM8917_L4, 2), - MSM_RPM_MAP(8930, PM8917_L5_0, PM8917_L5, 2), - MSM_RPM_MAP(8930, PM8917_L6_0, PM8917_L6, 2), - MSM_RPM_MAP(8930, PM8917_L7_0, PM8917_L7, 2), - MSM_RPM_MAP(8930, PM8917_L8_0, PM8917_L8, 2), - MSM_RPM_MAP(8930, PM8917_L9_0, PM8917_L9, 2), - MSM_RPM_MAP(8930, PM8917_L10_0, PM8917_L10, 2), - MSM_RPM_MAP(8930, PM8917_L11_0, PM8917_L11, 2), - MSM_RPM_MAP(8930, PM8917_L12_0, PM8917_L12, 2), - MSM_RPM_MAP(8930, PM8917_L14_0, PM8917_L14, 2), - MSM_RPM_MAP(8930, PM8917_L15_0, PM8917_L15, 2), - MSM_RPM_MAP(8930, PM8917_L16_0, PM8917_L16, 2), - MSM_RPM_MAP(8930, PM8917_L17_0, PM8917_L17, 2), - MSM_RPM_MAP(8930, PM8917_L18_0, PM8917_L18, 2), - MSM_RPM_MAP(8930, PM8917_L21_0, PM8917_L21, 2), - MSM_RPM_MAP(8930, PM8917_L22_0, PM8917_L22, 2), - MSM_RPM_MAP(8930, PM8917_L23_0, PM8917_L23, 2), - MSM_RPM_MAP(8930, PM8917_L24_0, PM8917_L24, 2), - MSM_RPM_MAP(8930, PM8917_L25_0, PM8917_L25, 2), - MSM_RPM_MAP(8930, PM8917_L26_0, PM8917_L26, 2), - MSM_RPM_MAP(8930, PM8917_L27_0, PM8917_L27, 2), - MSM_RPM_MAP(8930, PM8917_L28_0, PM8917_L28, 2), - MSM_RPM_MAP(8930, PM8917_L29_0, PM8917_L29, 2), - MSM_RPM_MAP(8930, PM8917_L30_0, PM8917_L30, 2), - MSM_RPM_MAP(8930, PM8917_L31_0, PM8917_L31, 2), - MSM_RPM_MAP(8930, PM8917_L32_0, PM8917_L32, 2), - MSM_RPM_MAP(8930, PM8917_L33_0, PM8917_L33, 2), - MSM_RPM_MAP(8930, PM8917_L34_0, PM8917_L34, 2), - MSM_RPM_MAP(8930, PM8917_L35_0, PM8917_L35, 2), - MSM_RPM_MAP(8930, PM8917_L36_0, PM8917_L36, 2), - MSM_RPM_MAP(8930, PM8917_CLK1_0, PM8917_CLK1, 2), - MSM_RPM_MAP(8930, PM8917_CLK2_0, PM8917_CLK2, 2), - MSM_RPM_MAP(8930, PM8917_LVS1, PM8917_LVS1, 1), - MSM_RPM_MAP(8930, PM8917_LVS3, PM8917_LVS3, 1), - MSM_RPM_MAP(8930, PM8917_LVS4, PM8917_LVS4, 1), - MSM_RPM_MAP(8930, PM8917_LVS5, PM8917_LVS5, 1), - MSM_RPM_MAP(8930, PM8917_LVS6, PM8917_LVS6, 1), - MSM_RPM_MAP(8930, PM8917_LVS7, PM8917_LVS7, 1), - MSM_RPM_MAP_PMIC(8930, 8917, NCP_0, NCP, 2), - MSM_RPM_MAP_PMIC(8930, 8917, CXO_BUFFERS, CXO_BUFFERS, 1), - MSM_RPM_MAP_PMIC(8930, 8917, USB_OTG_SWITCH, USB_OTG_SWITCH, 1), - MSM_RPM_MAP_PMIC(8930, 8917, HDMI_SWITCH, HDMI_SWITCH, 1), - MSM_RPM_MAP_PMIC(8930, 8917, QDSS_CLK, QDSS_CLK, 1), - MSM_RPM_MAP_PMIC(8930, 8917, VOLTAGE_CORNER, VOLTAGE_CORNER, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(8930, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(8930, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(8930, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(8930, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(8930, RESERVED_SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8930, SEQUENCE), - MSM_RPM_STATUS_ID_MAP(8930, RPM_CTL), - MSM_RPM_STATUS_ID_MAP(8930, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(8930, PXO_CLK), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, MM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8930, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, MMFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8930, EBI1_CLK), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, APPS_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, SYS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, SYSTEM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8930, MMSS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8930, MM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S3_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S3_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S4_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S4_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S5_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S5_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S6_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S6_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S7_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S7_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S8_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_S8_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L3_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L3_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L4_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L4_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L5_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L5_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L6_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L6_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L7_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L7_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L8_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L8_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L9_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L9_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L10_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L10_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L11_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L11_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L12_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L12_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L14_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L14_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L15_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L15_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L16_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L16_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L17_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L17_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L18_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L18_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L21_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L21_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L22_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L22_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L23_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L23_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L24_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L24_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L25_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L25_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L26_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L26_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L27_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L27_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L28_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L28_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L29_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L29_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L30_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L30_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L31_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L31_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L32_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L32_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L33_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L33_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L34_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L34_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L35_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L35_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L36_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_L36_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_CLK1_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_CLK1_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_CLK2_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_CLK2_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS3), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS4), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS5), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS6), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_LVS7), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_NCP_0), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_NCP_1), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_CXO_BUFFERS), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_USB_OTG_SWITCH), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_HDMI_SWITCH), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_QDSS_CLK), - MSM_RPM_STATUS_ID_MAP(8930, PM8917_VOLTAGE_CORNER), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(8930, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(8930, VERSION_MINOR), - MSM_RPM_CTRL_MAP(8930, VERSION_BUILD), - MSM_RPM_CTRL_MAP(8930, REQ_CTX_0), - MSM_RPM_CTRL_MAP(8930, REQ_SEL_0), - MSM_RPM_CTRL_MAP(8930, ACK_CTX_0), - MSM_RPM_CTRL_MAP(8930, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_8930_SEL_INVALIDATE, - .sel_notification = MSM_RPM_8930_SEL_NOTIFICATION, - .sel_last = MSM_RPM_8930_SEL_LAST, - .ver = {3, 0, 0}, -}; -struct platform_device msm8930_rpm_device = { - .name = "msm_rpm", - .id = -1, -}; - -static struct msm_rpm_log_platform_data msm_rpm_log_pdata = { - .phys_addr_base = 0x10B6A0, - .reg_offsets = { - [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080, - [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0, - }, - .phys_size = SZ_8K, - .log_len = 8192, /* log's buffer length in bytes */ - .log_len_mask = (8192 >> 2) - 1, /* length mask in units of u32 */ -}; - -struct platform_device msm8930_rpm_log_device = { - .name = "msm_rpm_log", - .id = -1, - .dev = { - .platform_data = &msm_rpm_log_pdata, - }, -}; - -static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = { - .version = 1, -}; - -static struct resource msm_rpm_stat_resource[] = { - { - .start = 0x0010D204, - .end = 0x0010D204 + SZ_8K, - .flags = IORESOURCE_MEM, - .name = "phys_addr_base" - - }, -}; - - -struct platform_device msm8930_rpm_stat_device = { - .name = "msm_rpm_stat", - .id = -1, - .resource = msm_rpm_stat_resource, - .num_resources = ARRAY_SIZE(msm_rpm_stat_resource), - .dev = { - .platform_data = &msm_rpm_stat_pdata, - } -}; - -static struct resource resources_rpm_master_stats[] = { - { - .start = MSM8930_RPM_MASTER_STATS_BASE, - .end = MSM8930_RPM_MASTER_STATS_BASE + SZ_256, - .flags = IORESOURCE_MEM, - }, -}; - -static char *master_names[] = { - "KPSS", - "MPSS", - "LPASS", - "RIVA", -}; - -static struct msm_rpm_master_stats_platform_data msm_rpm_master_stat_pdata = { - .masters = master_names, - .num_masters = ARRAY_SIZE(master_names), - .master_offset = 32, -}; - -struct platform_device msm8930_rpm_master_stat_device = { - .name = "msm_rpm_master_stats", - .id = -1, - .num_resources = ARRAY_SIZE(resources_rpm_master_stats), - .resource = resources_rpm_master_stats, - .dev = { - .platform_data = &msm_rpm_master_stat_pdata, - }, -}; - -static struct resource msm_rpm_rbcpr_resource = { - .start = 0x0010DB00, - .end = 0x0010DB00 + SZ_8K - 1, - .flags = IORESOURCE_MEM, -}; - -static struct msm_rpmrbcpr_platform_data msm_rpm_rbcpr_pdata = { - .rbcpr_data = { - .upside_steps = 1, - .downside_steps = 2, - .svs_voltage = 1050000, - .nominal_voltage = 1162500, - .turbo_voltage = 1287500, - }, -}; - -struct platform_device msm8930_rpm_rbcpr_device = { - .name = "msm_rpm_rbcpr", - .id = -1, - .dev = { - .platform_data = &msm_rpm_rbcpr_pdata, - }, - .resource = &msm_rpm_rbcpr_resource, -}; - -struct platform_device msm_bus_8930_sys_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM, -}; -struct platform_device msm_bus_8930_apps_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_APPSS, -}; -struct platform_device msm_bus_8930_mm_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_MMSS, -}; -struct platform_device msm_bus_8930_sys_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM_FPB, -}; -struct platform_device msm_bus_8930_cpss_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_CPSS_FPB, -}; - -struct platform_device msm8627_device_acpuclk = { - .name = "acpuclk-8627", - .id = -1, -}; - -struct platform_device msm8930_device_acpuclk = { - .name = "acpuclk-8930", - .id = -1, -}; - -struct platform_device msm8930aa_device_acpuclk = { - .name = "acpuclk-8930aa", - .id = -1, -}; - -struct platform_device msm8930ab_device_acpuclk = { - .name = "acpuclk-8930ab", - .id = -1, -}; - -static struct fs_driver_data gfx3d_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk", .reset_rate = 27000000 }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_3D, -}; - -static struct fs_driver_data ijpeg_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_JPEG_ENC, -}; - -static struct fs_driver_data mdp_fs_data_8930 = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "lut_clk" }, - { .name = "tv_src_clk" }, - { .name = "tv_clk" }, - { .name = "reset1_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data mdp_fs_data_8930_pm8917 = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "lut_clk" }, - { .name = "reset1_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data mdp_fs_data_8627 = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "lut_clk" }, - { .name = "reset1_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data rot_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_ROTATOR, -}; - -static struct fs_driver_data ved_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_HD_CODEC_PORT0, - .bus_port1 = MSM_BUS_MASTER_HD_CODEC_PORT1, -}; - -static struct fs_driver_data vfe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VFE, -}; - -static struct fs_driver_data vpe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VPE, -}; - -struct platform_device *msm8930_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data_8930), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), -}; -unsigned msm8930_num_footswitch __initdata = ARRAY_SIZE(msm8930_footswitch); - -struct platform_device *msm8930_pm8917_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data_8930_pm8917), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), -}; -unsigned msm8930_pm8917_num_footswitch __initdata = - ARRAY_SIZE(msm8930_pm8917_footswitch); - -struct platform_device *msm8627_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data_8627), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), -}; -unsigned msm8627_num_footswitch __initdata = ARRAY_SIZE(msm8627_footswitch); - -/* MSM Video core device */ -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors vidc_init_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors vidc_venc_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 54525952, - .ib = 436207616, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 72351744, - .ib = 289406976, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 40894464, - .ib = 327155712, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 48234496, - .ib = 192937984, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, -}; -static struct msm_bus_vectors vidc_venc_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 163577856, - .ib = 1308622848, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 219152384, - .ib = 876609536, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, -}; -static struct msm_bus_vectors vidc_vdec_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 121634816, - .ib = 973078528, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 155189248, - .ib = 620756992, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 372244480, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 501219328, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_paths vidc_bus_client_config[] = { - { - ARRAY_SIZE(vidc_init_vectors), - vidc_init_vectors, - }, - { - ARRAY_SIZE(vidc_venc_vga_vectors), - vidc_venc_vga_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_vga_vectors), - vidc_vdec_vga_vectors, - }, - { - ARRAY_SIZE(vidc_venc_720p_vectors), - vidc_venc_720p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_720p_vectors), - vidc_vdec_720p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_vectors), - vidc_venc_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_vectors), - vidc_vdec_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_turbo_vectors), - vidc_vdec_1080p_turbo_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_turbo_vectors), - vidc_vdec_1080p_turbo_vectors, - }, -}; - -static struct msm_bus_scale_pdata vidc_bus_client_data = { - vidc_bus_client_config, - ARRAY_SIZE(vidc_bus_client_config), - .name = "vidc", -}; -#endif - -#define MSM_VIDC_BASE_PHYS 0x04400000 -#define MSM_VIDC_BASE_SIZE 0x00100000 - -static struct resource apq8930_device_vidc_resources[] = { - { - .start = MSM_VIDC_BASE_PHYS, - .end = MSM_VIDC_BASE_PHYS + MSM_VIDC_BASE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = VCODEC_IRQ, - .end = VCODEC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_vidc_platform_data apq8930_vidc_platform_data = { -#ifdef CONFIG_MSM_BUS_SCALING - .vidc_bus_client_pdata = &vidc_bus_client_data, -#endif -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .memtype = ION_CP_MM_HEAP_ID, - .enable_ion = 1, - .cp_enabled = 1, -#else - .memtype = MEMTYPE_EBI1, - .enable_ion = 0, -#endif - .disable_dmx = 1, - .disable_fullhd = 0, - .cont_mode_dpb_count = 18, - .fw_addr = 0x9fe00000, -}; - -struct platform_device apq8930_msm_device_vidc = { - .name = "msm_vidc", - .id = 0, - .num_resources = ARRAY_SIZE(apq8930_device_vidc_resources), - .resource = apq8930_device_vidc_resources, - .dev = { - .platform_data = &apq8930_vidc_platform_data, - }, -}; - -struct platform_device *vidc_device[] __initdata = { - &apq8930_msm_device_vidc -}; - -void __init msm8930_add_vidc_device(void) -{ - if (cpu_is_msm8627()) { - struct msm_vidc_platform_data *pdata; - pdata = (struct msm_vidc_platform_data *) - apq8930_msm_device_vidc.dev.platform_data; - pdata->disable_fullhd = 1; - } - platform_add_devices(vidc_device, ARRAY_SIZE(vidc_device)); -} - -struct msm_iommu_domain_name msm8930_iommu_ctx_names[] = { - /* Camera */ - { - .name = "ijpeg_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "ijpeg_dst", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_dst", - .domain = CAMERA_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_src", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_dst", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_mm1", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_b_mm2", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_stream", - .domain = VIDEO_DOMAIN, - }, -}; - -static struct mem_pool msm8930_video_pools[] = { - /* - * Video hardware has the following requirements: - * 1. All video addresses used by the video hardware must be at a higher - * address than video firmware address. - * 2. Video hardware can only access a range of 256MB from the base of - * the video firmware. - */ - [VIDEO_FIRMWARE_POOL] = - /* Low addresses, intended for video firmware */ - { - .paddr = SZ_128K, - .size = SZ_16M - SZ_128K, - }, - [VIDEO_MAIN_POOL] = - /* Main video pool */ - { - .paddr = SZ_16M, - .size = SZ_256M - SZ_16M, - }, - [GEN_POOL] = - /* Remaining address space up to 2G */ - { - .paddr = SZ_256M, - .size = SZ_2G - SZ_256M, - }, -}; - -static struct mem_pool msm8930_camera_pools[] = { - [GEN_POOL] = - /* One address space for camera */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8930_display_read_pools[] = { - [GEN_POOL] = - /* One address space for display reads */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8930_rotator_src_pools[] = { - [GEN_POOL] = - /* One address space for rotator src */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct msm_iommu_domain msm8930_iommu_domains[] = { - [VIDEO_DOMAIN] = { - .iova_pools = msm8930_video_pools, - .npools = ARRAY_SIZE(msm8930_video_pools), - }, - [CAMERA_DOMAIN] = { - .iova_pools = msm8930_camera_pools, - .npools = ARRAY_SIZE(msm8930_camera_pools), - }, - [DISPLAY_READ_DOMAIN] = { - .iova_pools = msm8930_display_read_pools, - .npools = ARRAY_SIZE(msm8930_display_read_pools), - }, - [ROTATOR_SRC_DOMAIN] = { - .iova_pools = msm8930_rotator_src_pools, - .npools = ARRAY_SIZE(msm8930_rotator_src_pools), - }, -}; - -struct iommu_domains_pdata msm8930_iommu_domain_pdata = { - .domains = msm8930_iommu_domains, - .ndomains = ARRAY_SIZE(msm8930_iommu_domains), - .domain_names = msm8930_iommu_ctx_names, - .nnames = ARRAY_SIZE(msm8930_iommu_ctx_names), - .domain_alloc_flags = 0, -}; - -struct platform_device msm8930_iommu_domain_device = { - .name = "iommu_domains", - .id = -1, - .dev = { - .platform_data = &msm8930_iommu_domain_pdata, - } -}; - -struct msm_rtb_platform_data msm8930_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - msm8930_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - - -struct platform_device msm8930_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &msm8930_rtb_pdata, - }, -}; - -#define MSM8930_L1_SIZE SZ_1M -/* - * The actual L2 size is smaller but we need a larger buffer - * size to store other dump information - */ -#define MSM8930_L2_SIZE SZ_4M - -struct msm_cache_dump_platform_data msm8930_cache_dump_pdata = { - .l2_size = MSM8930_L2_SIZE, - .l1_size = MSM8930_L1_SIZE, -}; - -struct platform_device msm8930_cache_dump_device = { - .name = "msm_cache_dump", - .id = -1, - .dev = { - .platform_data = &msm8930_cache_dump_pdata, - }, -}; diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c deleted file mode 100644 index 6664e17dadbf..000000000000 --- a/arch/arm/mach-msm/devices-8960.c +++ /dev/null @@ -1,4642 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "clock.h" -#include "devices.h" -#include "devices-msm8x60.h" -#include "footswitch.h" -#include "msm_watchdog.h" -#include "rpm_log.h" -#include "rpm_stats.h" -#include "pil-q6v4.h" -#include "scm-pas.h" -#include -#include -#include -#include "pm.h" - -#ifdef CONFIG_MSM_MPM -#include -#endif -#ifdef CONFIG_MSM_DSPS -#include -#endif - - -/* Address of GSBI blocks */ -#define MSM_GSBI1_PHYS 0x16000000 -#define MSM_GSBI2_PHYS 0x16100000 -#define MSM_GSBI3_PHYS 0x16200000 -#define MSM_GSBI4_PHYS 0x16300000 -#define MSM_GSBI5_PHYS 0x16400000 -#define MSM_GSBI6_PHYS 0x16500000 -#define MSM_GSBI7_PHYS 0x16600000 -#define MSM_GSBI8_PHYS 0x1A000000 -#define MSM_GSBI9_PHYS 0x1A100000 -#define MSM_GSBI10_PHYS 0x1A200000 -#define MSM_GSBI11_PHYS 0x12440000 -#define MSM_GSBI12_PHYS 0x12480000 - -#define MSM_UART2DM_PHYS (MSM_GSBI2_PHYS + 0x40000) -#define MSM_UART5DM_PHYS (MSM_GSBI5_PHYS + 0x40000) -#define MSM_UART6DM_PHYS (MSM_GSBI6_PHYS + 0x40000) -#define MSM_UART8DM_PHYS (MSM_GSBI8_PHYS + 0x40000) -#define MSM_UART9DM_PHYS (MSM_GSBI9_PHYS + 0x40000) - -/* GSBI QUP devices */ -#define MSM_GSBI1_QUP_PHYS (MSM_GSBI1_PHYS + 0x80000) -#define MSM_GSBI2_QUP_PHYS (MSM_GSBI2_PHYS + 0x80000) -#define MSM_GSBI3_QUP_PHYS (MSM_GSBI3_PHYS + 0x80000) -#define MSM_GSBI4_QUP_PHYS (MSM_GSBI4_PHYS + 0x80000) -#define MSM_GSBI5_QUP_PHYS (MSM_GSBI5_PHYS + 0x80000) -#define MSM_GSBI6_QUP_PHYS (MSM_GSBI6_PHYS + 0x80000) -#define MSM_GSBI7_QUP_PHYS (MSM_GSBI7_PHYS + 0x80000) -#define MSM_GSBI8_QUP_PHYS (MSM_GSBI8_PHYS + 0x80000) -#define MSM_GSBI9_QUP_PHYS (MSM_GSBI9_PHYS + 0x80000) -#define MSM_GSBI10_QUP_PHYS (MSM_GSBI10_PHYS + 0x80000) -#define MSM_GSBI11_QUP_PHYS (MSM_GSBI11_PHYS + 0x20000) -#define MSM_GSBI12_QUP_PHYS (MSM_GSBI12_PHYS + 0x20000) -#define MSM_QUP_SIZE SZ_4K - -#define MSM_PMIC1_SSBI_CMD_PHYS 0x00500000 -#define MSM_PMIC2_SSBI_CMD_PHYS 0x00C00000 -#define MSM_PMIC_SSBI_SIZE SZ_4K - -#define MSM8960_HSUSB_PHYS 0x12500000 -#define MSM8960_HSUSB_SIZE SZ_4K - -#define MSM8960_PC_CNTR_PHYS (MSM8960_IMEM_PHYS + 0x664) -#define MSM8960_PC_CNTR_SIZE 0x40 -#define MSM8960_RPM_MASTER_STATS_BASE 0x10BB00 - -static struct resource msm8960_resources_pccntr[] = { - { - .start = MSM8960_PC_CNTR_PHYS, - .end = MSM8960_PC_CNTR_PHYS + MSM8960_PC_CNTR_SIZE, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_pm_init_data_type msm_pm_data = { - .retention_calls_tz = true, -}; - -struct platform_device msm8960_pm_8x60 = { - .name = "pm-8x60", - .id = -1, - .num_resources = ARRAY_SIZE(msm8960_resources_pccntr), - .resource = msm8960_resources_pccntr, - .dev = { - .platform_data = &msm_pm_data, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM8960_HSUSB_PHYS, - .end = MSM8960_HSUSB_PHYS + MSM8960_HSUSB_SIZE, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsusb[] = { - { - .start = MSM8960_HSUSB_PHYS, - .end = MSM8960_HSUSB_PHYS + MSM8960_HSUSB_SIZE, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb), - .resource = resources_hsusb, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM8960_HSUSB_PHYS, - .end = MSM8960_HSUSB_PHYS + MSM8960_HSUSB_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsic_host[] = { - { - .start = 0x12520000, - .end = 0x12520000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB_HSIC_IRQ, - .end = USB_HSIC_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GPIO_TO_INT(69), - .end = MSM_GPIO_TO_INT(69), - .name = "peripheral_status_irq", - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsic_host = { - .name = "msm_hsic_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsic_host), - .resource = resources_hsic_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -struct platform_device msm8960_device_acpuclk = { - .name = "acpuclk-8960", - .id = -1, -}; - -struct platform_device msm8960ab_device_acpuclk = { - .name = "acpuclk-8960ab", - .id = -1, -}; - -#define SHARED_IMEM_TZ_BASE 0x2a03f720 -static struct resource tzlog_resources[] = { - { - .start = SHARED_IMEM_TZ_BASE, - .end = SHARED_IMEM_TZ_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_tz_log = { - .name = "tz_log", - .id = 0, - .num_resources = ARRAY_SIZE(tzlog_resources), - .resource = tzlog_resources, -}; - -static struct resource resources_uart_gsbi2[] = { - { - .start = MSM8960_GSBI2_UARTDM_IRQ, - .end = MSM8960_GSBI2_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI2_PHYS, - .end = MSM_GSBI2_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_uart_gsbi2 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart_gsbi2), - .resource = resources_uart_gsbi2, -}; -/* GSBI 6 used into UARTDM Mode */ -static struct resource msm_uart_dm6_resources[] = { - { - .start = MSM_UART6DM_PHYS, - .end = MSM_UART6DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = GSBI6_UARTDM_IRQ, - .end = GSBI6_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GSBI6_PHYS, - .end = MSM_GSBI6_PHYS + 4 - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = DMOV_HSUART_GSBI6_TX_CHAN, - .end = DMOV_HSUART_GSBI6_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART_GSBI6_TX_CRCI, - .end = DMOV_HSUART_GSBI6_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; -static u64 msm_uart_dm6_dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_uart_dm6 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart_dm6_resources), - .resource = msm_uart_dm6_resources, - .dev = { - .dma_mask = &msm_uart_dm6_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -/* GSBI 8 used into UARTDM Mode */ -static struct resource msm_uart_dm8_resources[] = { - { - .start = MSM_UART8DM_PHYS, - .end = MSM_UART8DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = GSBI8_UARTDM_IRQ, - .end = GSBI8_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GSBI8_PHYS, - .end = MSM_GSBI8_PHYS + 4 - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = DMOV_HSUART_GSBI8_TX_CHAN, - .end = DMOV_HSUART_GSBI8_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART_GSBI8_TX_CRCI, - .end = DMOV_HSUART_GSBI8_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm8_dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_uart_dm8 = { - .name = "msm_serial_hs", - .id = 2, - .num_resources = ARRAY_SIZE(msm_uart_dm8_resources), - .resource = msm_uart_dm8_resources, - .dev = { - .dma_mask = &msm_uart_dm8_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -/* - * GSBI 9 used into UARTDM Mode - * For 8960 Fusion 2.2 Primary IPC - */ -static struct resource msm_uart_dm9_resources[] = { - { - .start = MSM_UART9DM_PHYS, - .end = MSM_UART9DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = GSBI9_UARTDM_IRQ, - .end = GSBI9_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GSBI9_PHYS, - .end = MSM_GSBI9_PHYS + 4 - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = DMOV_HSUART_GSBI9_TX_CHAN, - .end = DMOV_HSUART_GSBI9_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART_GSBI9_TX_CRCI, - .end = DMOV_HSUART_GSBI9_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; -static u64 msm_uart_dm9_dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_uart_dm9 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart_dm9_resources), - .resource = msm_uart_dm9_resources, - .dev = { - .dma_mask = &msm_uart_dm9_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_uart_gsbi5[] = { - { - .start = GSBI5_UARTDM_IRQ, - .end = GSBI5_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART5DM_PHYS, - .end = MSM_UART5DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI5_PHYS, - .end = MSM_GSBI5_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_uart_gsbi5 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart_gsbi5), - .resource = resources_uart_gsbi5, -}; - -static struct msm_serial_hslite_platform_data uart_gsbi8_pdata = { - .line = 0, -}; - -static struct resource resources_uart_gsbi8[] = { - { - .start = GSBI8_UARTDM_IRQ, - .end = GSBI8_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART8DM_PHYS, - .end = MSM_UART8DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI8_PHYS, - .end = MSM_GSBI8_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_uart_gsbi8 = { - .name = "msm_serial_hsl", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart_gsbi8), - .resource = resources_uart_gsbi8, - .dev.platform_data = &uart_gsbi8_pdata, -}; - -/* MSM Video core device */ -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors vidc_init_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors vidc_venc_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 54525952, - .ib = 436207616, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 72351744, - .ib = 289406976, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 40894464, - .ib = 327155712, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 48234496, - .ib = 192937984, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, -}; -static struct msm_bus_vectors vidc_venc_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 163577856, - .ib = 1308622848, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 219152384, - .ib = 876609536, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, -}; -static struct msm_bus_vectors vidc_vdec_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 121634816, - .ib = 973078528, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 155189248, - .ib = 620756992, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 372244480, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 501219328, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_paths vidc_bus_client_config[] = { - { - ARRAY_SIZE(vidc_init_vectors), - vidc_init_vectors, - }, - { - ARRAY_SIZE(vidc_venc_vga_vectors), - vidc_venc_vga_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_vga_vectors), - vidc_vdec_vga_vectors, - }, - { - ARRAY_SIZE(vidc_venc_720p_vectors), - vidc_venc_720p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_720p_vectors), - vidc_vdec_720p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_vectors), - vidc_venc_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_vectors), - vidc_vdec_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_turbo_vectors), - vidc_venc_1080p_turbo_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_turbo_vectors), - vidc_vdec_1080p_turbo_vectors, - }, -}; - -static struct msm_bus_scale_pdata vidc_bus_client_data = { - vidc_bus_client_config, - ARRAY_SIZE(vidc_bus_client_config), - .name = "vidc", -}; - -static struct msm_bus_vectors vidc_pro_init_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors vidc_pro_venc_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 54525952, - .ib = 436207616, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 72351744, - .ib = 289406976, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, -}; -static struct msm_bus_vectors vidc_pro_vdec_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 40894464, - .ib = 327155712, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 48234496, - .ib = 192937984, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, -}; -static struct msm_bus_vectors vidc_pro_venc_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 163577856, - .ib = 1308622848, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 219152384, - .ib = 876609536, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, -}; -static struct msm_bus_vectors vidc_pro_vdec_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 121634816, - .ib = 973078528, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 155189248, - .ib = 620756992, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, -}; -static struct msm_bus_vectors vidc_pro_venc_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 372244480, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 501219328, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, -}; -static struct msm_bus_vectors vidc_pro_vdec_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 2560000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_pro_venc_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; -static struct msm_bus_vectors vidc_pro_vdec_1080p_turbo_vectors[] = { - { - .src = MSM_BUS_MASTER_VIDEO_ENC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 222298112, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_VIDEO_DEC, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 330301440, - .ib = 3522000000U, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_paths vidc_pro_bus_client_config[] = { - { - ARRAY_SIZE(vidc_pro_init_vectors), - vidc_pro_init_vectors, - }, - { - ARRAY_SIZE(vidc_pro_venc_vga_vectors), - vidc_pro_venc_vga_vectors, - }, - { - ARRAY_SIZE(vidc_pro_vdec_vga_vectors), - vidc_pro_vdec_vga_vectors, - }, - { - ARRAY_SIZE(vidc_pro_venc_720p_vectors), - vidc_pro_venc_720p_vectors, - }, - { - ARRAY_SIZE(vidc_pro_vdec_720p_vectors), - vidc_pro_vdec_720p_vectors, - }, - { - ARRAY_SIZE(vidc_pro_venc_1080p_vectors), - vidc_pro_venc_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_pro_vdec_1080p_vectors), - vidc_pro_vdec_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_pro_venc_1080p_turbo_vectors), - vidc_pro_venc_1080p_turbo_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_turbo_vectors), - vidc_pro_vdec_1080p_turbo_vectors, - }, -}; - -static struct msm_bus_scale_pdata vidc_pro_bus_client_data = { - vidc_pro_bus_client_config, - ARRAY_SIZE(vidc_bus_client_config), - .name = "vidc", -}; -#endif - -#ifdef CONFIG_HW_RANDOM_MSM -/* PRNG device */ -#define MSM_PRNG_PHYS 0x1A500000 -static struct resource rng_resources = { - .flags = IORESOURCE_MEM, - .start = MSM_PRNG_PHYS, - .end = MSM_PRNG_PHYS + SZ_512 - 1, -}; - -struct platform_device msm_device_rng = { - .name = "msm_rng", - .id = 0, - .num_resources = 1, - .resource = &rng_resources, -}; -#endif - -#define MSM_VIDC_BASE_PHYS 0x04400000 -#define MSM_VIDC_BASE_SIZE 0x00100000 - -static struct resource msm_device_vidc_resources[] = { - { - .start = MSM_VIDC_BASE_PHYS, - .end = MSM_VIDC_BASE_PHYS + MSM_VIDC_BASE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = VCODEC_IRQ, - .end = VCODEC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -int64_t vidc_v4l2_ns_iommu_mapping[] = {-1, -1}; -int64_t vidc_v4l2_cp_iommu_mapping[] = {-1, -1}; -int64_t *vidc_v4l2_iommu_mappings[] = { - [MSM_VIDC_V4L2_IOMMU_MAP_NS] = vidc_v4l2_ns_iommu_mapping, - [MSM_VIDC_V4L2_IOMMU_MAP_CP] = vidc_v4l2_cp_iommu_mapping, -}; - -int64_t vidc_v4l2_load_1[] = {-1, -1}; -int64_t vidc_v4l2_load_2[] = {-1, -1}; -int64_t *vidc_v4l2_load_table[] = { - vidc_v4l2_load_1, - vidc_v4l2_load_2, -}; - -static struct msm_vidc_v4l2_platform_data vidc_v4l2_plaform_data = { - .iommu_table = vidc_v4l2_iommu_mappings, - .num_iommu_table = 2, - .load_table = vidc_v4l2_load_table, - .num_load_table = 2, - .max_load = 800*480*30/256, -}; - -struct platform_device msm_device_vidc_v4l2 = { - .name = "msm_vidc_v4l2", - .id = 0, - .num_resources = 0, - .dev = { - .platform_data = &vidc_v4l2_plaform_data, - }, -}; - -struct msm_vidc_platform_data vidc_platform_data = { -#ifdef CONFIG_MSM_BUS_SCALING - .vidc_bus_client_pdata = &vidc_bus_client_data, -#endif -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .memtype = ION_CP_MM_HEAP_ID, - .enable_ion = 1, - .cp_enabled = 1, -#else - .memtype = MEMTYPE_EBI1, - .enable_ion = 0, -#endif - .disable_dmx = 0, - .disable_fullhd = 0, - .cont_mode_dpb_count = 18, - .fw_addr = 0x9fe00000, -}; - -struct platform_device msm_device_vidc = { - .name = "msm_vidc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_device_vidc_resources), - .resource = msm_device_vidc_resources, - .dev = { - .platform_data = &vidc_platform_data, - }, -}; - -#define MSM_SDC1_BASE 0x12400000 -#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800) -#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000) -#define MSM_SDC2_BASE 0x12140000 -#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800) -#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000) -#define MSM_SDC3_BASE 0x12180000 -#define MSM_SDC3_DML_BASE (MSM_SDC3_BASE + 0x800) -#define MSM_SDC3_BAM_BASE (MSM_SDC3_BASE + 0x2000) -#define MSM_SDC4_BASE 0x121C0000 -#define MSM_SDC4_DML_BASE (MSM_SDC4_BASE + 0x800) -#define MSM_SDC4_BAM_BASE (MSM_SDC4_BASE + 0x2000) -#define MSM_SDC5_BASE 0x12200000 -#define MSM_SDC5_DML_BASE (MSM_SDC5_BASE + 0x800) -#define MSM_SDC5_BAM_BASE (MSM_SDC5_BASE + 0x2000) - -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC1_IRQ_0, - .end = SDC1_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC1_DML_BASE, - .end = MSM_SDC1_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC1_BAM_BASE, - .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC1_BAM_IRQ, - .end = SDC1_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC2_IRQ_0, - .end = SDC2_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC2_DML_BASE, - .end = MSM_SDC2_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC2_BAM_BASE, - .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC2_BAM_IRQ, - .end = SDC2_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC3_IRQ_0, - .end = SDC3_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC3_DML_BASE, - .end = MSM_SDC3_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC3_BAM_BASE, - .end = MSM_SDC3_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC3_BAM_IRQ, - .end = SDC3_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC4_IRQ_0, - .end = SDC4_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC4_DML_BASE, - .end = MSM_SDC4_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC4_BAM_BASE, - .end = MSM_SDC4_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC4_BAM_IRQ, - .end = SDC4_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc5[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC5_BASE, - .end = MSM_SDC5_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC5_IRQ_0, - .end = SDC5_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC5_DML_BASE, - .end = MSM_SDC5_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC5_BAM_BASE, - .end = MSM_SDC5_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC5_BAM_IRQ, - .end = SDC5_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc5 = { - .name = "msm_sdcc", - .id = 5, - .num_resources = ARRAY_SIZE(resources_sdc5), - .resource = resources_sdc5, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource msm_8960_q6_lpass_resources[] = { - { - .start = 0x28800000, - .end = 0x28800000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = LPASS_Q6SS_WDOG_EXPIRED, - .end = LPASS_Q6SS_WDOG_EXPIRED, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct pil_q6v4_pdata msm_8960_q6_lpass_data = { - .strap_tcm_base = 0x01460000, - .strap_ahb_upper = 0x00290000, - .strap_ahb_lower = 0x00000280, - .aclk_reg = MSM_CLK_CTL_BASE + 0x23A0, - .name = "q6", - .pas_id = PAS_Q6, - .bus_port = MSM_BUS_MASTER_LPASS_PROC, -}; - -struct platform_device msm_8960_q6_lpass = { - .name = "pil-q6v4-lpass", - .id = -1, - .num_resources = ARRAY_SIZE(msm_8960_q6_lpass_resources), - .resource = msm_8960_q6_lpass_resources, - .dev.platform_data = &msm_8960_q6_lpass_data, -}; - -static struct resource msm_8960_q6_mss_resources[] = { - { - .start = 0x08800000, - .end = 0x08800000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x08B00000, - .end = 0x08B00000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x08882000, - .end = 0x08882000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x08900000, - .end = 0x08900000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x08982000, - .end = 0x08982000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = Q6FW_WDOG_EXPIRED_IRQ, - .end = Q6FW_WDOG_EXPIRED_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = Q6SW_WDOG_EXPIRED_IRQ, - .end = Q6SW_WDOG_EXPIRED_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct pil_q6v4_pdata msm_8960_q6_mss_data[2] = { - { - .strap_tcm_base = 0x00400000, - .strap_ahb_upper = 0x00090000, - .strap_ahb_lower = 0x00000080, - .aclk_reg = MSM_CLK_CTL_BASE + 0x2C6C, - .jtag_clk_reg = MSM_CLK_CTL_BASE + 0x2044, - .name = "modem_fw", - .pas_id = PAS_MODEM_FW, - .bus_port = MSM_BUS_MASTER_MSS_FW_PROC, - }, - { - .strap_tcm_base = 0x00420000, - .strap_ahb_upper = 0x00090000, - .strap_ahb_lower = 0x00000080, - .aclk_reg = MSM_CLK_CTL_BASE + 0x2040, - .jtag_clk_reg = MSM_CLK_CTL_BASE + 0x2C68, - .name = "modem", - .pas_id = PAS_MODEM_SW, - .bus_port = MSM_BUS_MASTER_MSS_SW_PROC, - } -}; - -struct platform_device msm_8960_q6_mss = { - .name = "pil-q6v4-modem", - .id = -1, - .num_resources = ARRAY_SIZE(msm_8960_q6_mss_resources), - .resource = msm_8960_q6_mss_resources, - .dev.platform_data = msm_8960_q6_mss_data, -}; - -static struct resource msm_8960_riva_resources[] = { - { - .start = 0x03204000, - .end = 0x03204000 + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ, - .end = RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_8960_riva = { - .name = "pil_riva", - .id = -1, - .num_resources = ARRAY_SIZE(msm_8960_riva_resources), - .resource = msm_8960_riva_resources, -}; - -struct platform_device msm_pil_tzapps = { - .name = "pil_tzapps", - .id = -1, -}; - -static struct resource msm_pil_dsps_resources[] = { - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = PPSS_WDOG_TIMER_IRQ, - .end = PPSS_WDOG_TIMER_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x12080000, - .end = 0x12080000 + SZ_8K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_pil_dsps = { - .name = "pil_dsps", - .id = -1, - .resource = msm_pil_dsps_resources, - .num_resources = ARRAY_SIZE(msm_pil_dsps_resources), - .dev.platform_data = "dsps", -}; - -struct platform_device msm_pil_vidc = { - .name = "pil_vidc", - .id = -1, -}; - -static struct resource smd_resource[] = { - { - .name = "a9_m2a_0", - .start = INT_A9_M2A_0, - .flags = IORESOURCE_IRQ, - }, - { - .name = "a9_m2a_5", - .start = INT_A9_M2A_5, - .flags = IORESOURCE_IRQ, - }, - { - .name = "adsp_a11", - .start = INT_ADSP_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "adsp_a11_smsm", - .start = INT_ADSP_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dsps_a11", - .start = INT_DSPS_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dsps_a11_smsm", - .start = INT_DSPS_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, - { - .name = "wcnss_a11", - .start = INT_WCNSS_A11, - .flags = IORESOURCE_IRQ, - }, - { - .name = "wcnss_a11_smsm", - .start = INT_WCNSS_A11_SMSM, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct smd_subsystem_config smd_config_list[] = { - { - .irq_config_id = SMD_MODEM, - .subsys_name = "modem", - .edge = SMD_APPS_MODEM, - - .smd_int.irq_name = "a9_m2a_0", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 3, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "a9_m2a_5", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 4, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, - { - .irq_config_id = SMD_Q6, - .subsys_name = "adsp", - .edge = SMD_APPS_QDSP, - - .smd_int.irq_name = "adsp_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 15, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "adsp_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 14, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, - { - .irq_config_id = SMD_DSPS, - .subsys_name = "dsps", - .edge = SMD_APPS_DSPS, - - .smd_int.irq_name = "dsps_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1, - .smd_int.out_base = (void __iomem *)MSM_SIC_NON_SECURE_BASE, - .smd_int.out_offset = 0x4080, - - .smsm_int.irq_name = "dsps_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1, - .smsm_int.out_base = (void __iomem *)MSM_SIC_NON_SECURE_BASE, - .smsm_int.out_offset = 0x4094, - }, - { - .irq_config_id = SMD_WCNSS, - .subsys_name = "wcnss", - .edge = SMD_APPS_WCNSS, - - .smd_int.irq_name = "wcnss_a11", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - .smd_int.out_bit_pos = 1 << 25, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "wcnss_a11_smsm", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_smsm", - .smsm_int.dev_id = 0, - .smsm_int.out_bit_pos = 1 << 23, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - }, -}; - -static struct smd_subsystem_restart_config smd_ssr_config = { - .disable_smsm_reset_handshake = 1, -}; - -static struct smd_platform smd_platform_data = { - .num_ss_configs = ARRAY_SIZE(smd_config_list), - .smd_ss_configs = smd_config_list, - .smd_ssr_config = &smd_ssr_config, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, - .resource = smd_resource, - .num_resources = ARRAY_SIZE(smd_resource), - .dev = { - .platform_data = &smd_platform_data, - }, -}; - -struct platform_device msm_device_bam_dmux = { - .name = "BAM_RMNT", - .id = -1, -}; - -static struct msm_pm_sleep_status_data msm_pm_slp_sts_data = { - .base_addr = MSM_ACC0_BASE + 0x08, - .cpu_offset = MSM_ACC1_BASE - MSM_ACC0_BASE, - .mask = 1UL << 13, -}; -struct platform_device msm8960_cpu_slp_status = { - .name = "cpu_slp_status", - .id = -1, - .dev = { - .platform_data = &msm_pm_slp_sts_data, - }, -}; - -static struct msm_watchdog_pdata msm_watchdog_pdata = { - .pet_time = 10000, - .bark_time = 11000, - .has_secure = true, - .base = MSM_TMR0_BASE + WDT0_OFFSET, -}; - -static struct resource msm_watchdog_resources[] = { - { - .start = WDT0_ACCSCSSNBARK_INT, - .end = WDT0_ACCSCSSNBARK_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_watchdog = { - .name = "msm_watchdog", - .id = -1, - .dev = { - .platform_data = &msm_watchdog_pdata, - }, - .num_resources = ARRAY_SIZE(msm_watchdog_resources), - .resource = msm_watchdog_resources, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = ADM_0_SCSS_1_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x18320000, - .end = 0x18320000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 1, - .sd_size = 0x800, -}; - -struct platform_device msm8960_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, - &msm_device_sdc5, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 5) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -static struct resource resources_qup_i2c_gsbi4[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI4_PHYS, - .end = MSM_GSBI4_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI4_QUP_PHYS, - .end = MSM_GSBI4_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI4_QUP_IRQ, - .end = GSBI4_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_qup_i2c_gsbi4 = { - .name = "qup_i2c", - .id = 4, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi4), - .resource = resources_qup_i2c_gsbi4, -}; - -static struct resource resources_qup_i2c_gsbi3[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI3_QUP_PHYS, - .end = MSM_GSBI3_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI3_QUP_IRQ, - .end = GSBI3_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_qup_i2c_gsbi3 = { - .name = "qup_i2c", - .id = 3, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi3), - .resource = resources_qup_i2c_gsbi3, -}; - -static struct resource resources_qup_i2c_gsbi9[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI9_PHYS, - .end = MSM_GSBI9_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI9_QUP_PHYS, - .end = MSM_GSBI9_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI9_QUP_IRQ, - .end = GSBI9_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_qup_i2c_gsbi9 = { - .name = "qup_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi9), - .resource = resources_qup_i2c_gsbi9, -}; - -static struct resource resources_qup_i2c_gsbi10[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI10_PHYS, - .end = MSM_GSBI10_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI10_QUP_PHYS, - .end = MSM_GSBI10_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI10_QUP_IRQ, - .end = GSBI10_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_qup_i2c_gsbi10 = { - .name = "qup_i2c", - .id = 10, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi10), - .resource = resources_qup_i2c_gsbi10, -}; - -static struct resource resources_qup_i2c_gsbi12[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI12_PHYS, - .end = MSM_GSBI12_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI12_QUP_PHYS, - .end = MSM_GSBI12_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI12_QUP_IRQ, - .end = GSBI12_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_qup_i2c_gsbi12 = { - .name = "qup_i2c", - .id = 12, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi12), - .resource = resources_qup_i2c_gsbi12, -}; - -#ifdef CONFIG_MSM_CAMERA -static struct resource msm_cam_gsbi4_i2c_mux_resources[] = { - { - .name = "i2c_mux_rw", - .start = 0x008003E0, - .end = 0x008003E0 + SZ_8 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "i2c_mux_ctl", - .start = 0x008020B8, - .end = 0x008020B8 + SZ_4 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_i2c_mux_gsbi4 = { - .name = "msm_cam_i2c_mux", - .id = 0, - .resource = msm_cam_gsbi4_i2c_mux_resources, - .num_resources = ARRAY_SIZE(msm_cam_gsbi4_i2c_mux_resources), -}; - -static struct resource msm_csiphy0_resources[] = { - { - .name = "csiphy", - .start = 0x04800C00, - .end = 0x04800C00 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csiphy", - .start = CSIPHY_4LN_IRQ, - .end = CSIPHY_4LN_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csiphy1_resources[] = { - { - .name = "csiphy", - .start = 0x04801000, - .end = 0x04801000 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csiphy", - .start = MSM8960_CSIPHY_2LN_IRQ, - .end = MSM8960_CSIPHY_2LN_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csiphy2_resources[] = { - { - .name = "csiphy", - .start = 0x04801400, - .end = 0x04801400 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csiphy", - .start = MSM8960_CSIPHY_2_2LN_IRQ, - .end = MSM8960_CSIPHY_2_2LN_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_csiphy0 = { - .name = "msm_csiphy", - .id = 0, - .resource = msm_csiphy0_resources, - .num_resources = ARRAY_SIZE(msm_csiphy0_resources), -}; - -struct platform_device msm8960_device_csiphy1 = { - .name = "msm_csiphy", - .id = 1, - .resource = msm_csiphy1_resources, - .num_resources = ARRAY_SIZE(msm_csiphy1_resources), -}; - -struct platform_device msm8960_device_csiphy2 = { - .name = "msm_csiphy", - .id = 2, - .resource = msm_csiphy2_resources, - .num_resources = ARRAY_SIZE(msm_csiphy2_resources), -}; - -static struct resource msm_csid0_resources[] = { - { - .name = "csid", - .start = 0x04800000, - .end = 0x04800000 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csid", - .start = CSI_0_IRQ, - .end = CSI_0_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csid1_resources[] = { - { - .name = "csid", - .start = 0x04800400, - .end = 0x04800400 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csid", - .start = CSI_1_IRQ, - .end = CSI_1_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csid2_resources[] = { - { - .name = "csid", - .start = 0x04801800, - .end = 0x04801800 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csid", - .start = CSI_2_IRQ, - .end = CSI_2_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_csid0 = { - .name = "msm_csid", - .id = 0, - .resource = msm_csid0_resources, - .num_resources = ARRAY_SIZE(msm_csid0_resources), -}; - -struct platform_device msm8960_device_csid1 = { - .name = "msm_csid", - .id = 1, - .resource = msm_csid1_resources, - .num_resources = ARRAY_SIZE(msm_csid1_resources), -}; - -struct platform_device msm8960_device_csid2 = { - .name = "msm_csid", - .id = 2, - .resource = msm_csid2_resources, - .num_resources = ARRAY_SIZE(msm_csid2_resources), -}; - -struct resource msm_ispif_resources[] = { - { - .name = "ispif", - .start = 0x04800800, - .end = 0x04800800 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "ispif", - .start = ISPIF_IRQ, - .end = ISPIF_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_ispif = { - .name = "msm_ispif", - .id = 0, - .resource = msm_ispif_resources, - .num_resources = ARRAY_SIZE(msm_ispif_resources), -}; - -static struct resource msm_vfe_resources[] = { - { - .name = "vfe32", - .start = 0x04500000, - .end = 0x04500000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "vfe32", - .start = VFE_IRQ, - .end = VFE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_vfe = { - .name = "msm_vfe", - .id = 0, - .resource = msm_vfe_resources, - .num_resources = ARRAY_SIZE(msm_vfe_resources), -}; - -static struct resource msm_vpe_resources[] = { - { - .name = "vpe", - .start = 0x05300000, - .end = 0x05300000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "vpe", - .start = VPE_IRQ, - .end = VPE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_device_vpe = { - .name = "msm_vpe", - .id = 0, - .resource = msm_vpe_resources, - .num_resources = ARRAY_SIZE(msm_vpe_resources), -}; -#endif - -#define MSM_TSIF0_PHYS (0x18200000) -#define MSM_TSIF1_PHYS (0x18201000) -#define MSM_TSIF_SIZE (0x200) - -#define TSIF_0_CLK GPIO_CFG(75, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_EN GPIO_CFG(76, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_DATA GPIO_CFG(77, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_SYNC GPIO_CFG(82, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_CLK GPIO_CFG(79, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_EN GPIO_CFG(80, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_DATA GPIO_CFG(81, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_SYNC GPIO_CFG(78, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif0_gpios[] = { - { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", }, -}; - -static const struct msm_gpio tsif1_gpios[] = { - { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", }, -}; - -struct msm_tsif_platform_data tsif1_platform_data = { - .num_gpios = ARRAY_SIZE(tsif1_gpios), - .gpios = tsif1_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", -}; - -struct resource tsif1_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF2_IRQ, - .end = TSIF2_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF1_PHYS, - .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -struct msm_tsif_platform_data tsif0_platform_data = { - .num_gpios = ARRAY_SIZE(tsif0_gpios), - .gpios = tsif0_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", -}; -struct resource tsif0_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF1_IRQ, - .end = TSIF1_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF0_PHYS, - .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -struct platform_device msm_device_tsif[2] = { - { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif0_resources), - .resource = tsif0_resources, - .dev = { - .platform_data = &tsif0_platform_data - }, - }, - { - .name = "msm_tsif", - .id = 1, - .num_resources = ARRAY_SIZE(tsif1_resources), - .resource = tsif1_resources, - .dev = { - .platform_data = &tsif1_platform_data - }, - } -}; - -static struct resource resources_ssbi_pmic[] = { - { - .start = MSM_PMIC1_SSBI_CMD_PHYS, - .end = MSM_PMIC1_SSBI_CMD_PHYS + MSM_PMIC_SSBI_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_ssbi_pmic = { - .name = "msm_ssbi", - .id = 0, - .resource = resources_ssbi_pmic, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic), -}; - -static struct resource resources_qup_spi_gsbi1[] = { - { - .name = "spi_base", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = MSM8960_GSBI1_QUP_IRQ, - .end = MSM8960_GSBI1_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_clk", - .start = 9, - .end = 9, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_miso", - .start = 7, - .end = 7, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_mosi", - .start = 6, - .end = 6, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_cs", - .start = 8, - .end = 8, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_cs1", - .start = 14, - .end = 14, - .flags = IORESOURCE_IO, - }, -}; - -struct platform_device msm8960_device_qup_spi_gsbi1 = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_spi_gsbi1), - .resource = resources_qup_spi_gsbi1, -}; - -struct platform_device msm_pcm = { - .name = "msm-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_multi_ch_pcm = { - .name = "msm-multi-ch-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_lowlatency_pcm = { - .name = "msm-lowlatency-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_pcm_routing = { - .name = "msm-pcm-routing", - .id = -1, -}; - -struct platform_device msm_cpudai0 = { - .name = "msm-dai-q6", - .id = 0x4000, -}; - -struct platform_device msm_cpudai1 = { - .name = "msm-dai-q6", - .id = 0x4001, -}; - -struct platform_device msm8960_cpudai_slimbus_2_rx = { - .name = "msm-dai-q6", - .id = 0x4004, -}; - -struct platform_device msm8960_cpudai_slimbus_2_tx = { - .name = "msm-dai-q6", - .id = 0x4005, -}; - -struct platform_device msm_cpudai_hdmi_rx = { - .name = "msm-dai-q6-hdmi", - .id = 8, -}; - -struct platform_device msm_cpudai_bt_rx = { - .name = "msm-dai-q6", - .id = 0x3000, -}; - -struct platform_device msm_cpudai_bt_tx = { - .name = "msm-dai-q6", - .id = 0x3001, -}; - -struct platform_device msm_cpudai_fm_rx = { - .name = "msm-dai-q6", - .id = 0x3004, -}; - -struct platform_device msm_cpudai_fm_tx = { - .name = "msm-dai-q6", - .id = 0x3005, -}; - -struct platform_device msm_cpudai_incall_music_rx = { - .name = "msm-dai-q6", - .id = 0x8005, -}; - -struct platform_device msm_cpudai_incall_record_rx = { - .name = "msm-dai-q6", - .id = 0x8004, -}; - -struct platform_device msm_cpudai_incall_record_tx = { - .name = "msm-dai-q6", - .id = 0x8003, -}; - -/* - * Machine specific data for AUX PCM Interface - * which the driver will be unware of. - */ -struct msm_dai_auxpcm_pdata auxpcm_pdata = { - .clk = "pcm_clk", - .mode_8k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_32BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 256000, - }, - .mode_16k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_32BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 512000, - } -}; - -struct platform_device msm_cpudai_auxpcm_rx = { - .name = "msm-dai-q6", - .id = 2, - .dev = { - .platform_data = &auxpcm_pdata, - }, -}; - -struct platform_device msm_cpudai_auxpcm_tx = { - .name = "msm-dai-q6", - .id = 3, - .dev = { - .platform_data = &auxpcm_pdata, - }, -}; - -struct platform_device msm_cpu_fe = { - .name = "msm-dai-fe", - .id = -1, -}; - -struct platform_device msm_stub_codec = { - .name = "msm-stub-codec", - .id = 1, -}; - -struct platform_device msm_voice = { - .name = "msm-pcm-voice", - .id = -1, -}; - -struct platform_device msm_voip = { - .name = "msm-voip-dsp", - .id = -1, -}; - -struct platform_device msm_lpa_pcm = { - .name = "msm-pcm-lpa", - .id = -1, -}; - -struct platform_device msm_compr_dsp = { - .name = "msm-compr-dsp", - .id = -1, -}; - -struct platform_device msm_pcm_hostless = { - .name = "msm-pcm-hostless", - .id = -1, -}; - -struct platform_device msm_cpudai_afe_01_rx = { - .name = "msm-dai-q6", - .id = 0xE0, -}; - -struct platform_device msm_cpudai_afe_01_tx = { - .name = "msm-dai-q6", - .id = 0xF0, -}; - -struct platform_device msm_cpudai_afe_02_rx = { - .name = "msm-dai-q6", - .id = 0xF1, -}; - -struct platform_device msm_cpudai_afe_02_tx = { - .name = "msm-dai-q6", - .id = 0xE1, -}; - -struct platform_device msm_pcm_afe = { - .name = "msm-pcm-afe", - .id = -1, -}; - -struct platform_device msm_fm_loopback = { - .name = "msm-pcm-loopback", - .id = -1, -}; - -static struct fs_driver_data gfx2d0_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, -}; - -static struct fs_driver_data gfx2d1_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, -}; - -static struct fs_driver_data gfx3d_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk", .reset_rate = 27000000 }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_3D, -}; - -static struct fs_driver_data gfx3d_fs_data_8960ab = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk", .reset_rate = 27000000 }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_3D, - .bus_port1 = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, -}; - -static struct fs_driver_data ijpeg_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_JPEG_ENC, -}; - -static struct fs_driver_data mdp_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "lut_clk" }, - { .name = "tv_src_clk" }, - { .name = "tv_clk" }, - { .name = "reset1_clk" }, - { .name = "reset2_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data rot_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_ROTATOR, -}; - -static struct fs_driver_data ved_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_HD_CODEC_PORT0, - .bus_port1 = MSM_BUS_MASTER_HD_CODEC_PORT1, -}; - -static struct fs_driver_data ved_fs_data_8960ab = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VIDEO_DEC, - .bus_port1 = MSM_BUS_MASTER_VIDEO_ENC, -}; - -static struct fs_driver_data vfe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VFE, -}; - -static struct fs_driver_data vpe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VPE, -}; - -struct platform_device *msm8960_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_GFX2D0, "vdd", "kgsl-2d0.0", &gfx2d0_fs_data), - FS_8X60(FS_GFX2D1, "vdd", "kgsl-2d1.1", &gfx2d1_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), -}; -unsigned msm8960_num_footswitch __initdata = ARRAY_SIZE(msm8960_footswitch); - -struct platform_device *msm8960ab_footswitch[] __initdata = { - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data_8960ab), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data_8960ab), -}; -unsigned msm8960ab_num_footswitch __initdata = ARRAY_SIZE(msm8960ab_footswitch); - -#ifdef CONFIG_MSM_ROTATOR -static struct msm_bus_vectors rotator_init_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors rotator_ui_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1024 * 600 * 4 * 2 * 60), - .ib = (1024 * 600 * 4 * 2 * 60 * 1.5), - }, -}; - -static struct msm_bus_vectors rotator_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (640 * 480 * 2 * 2 * 30), - .ib = (640 * 480 * 2 * 2 * 30 * 1.5), - }, -}; -static struct msm_bus_vectors rotator_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1280 * 736 * 2 * 2 * 30), - .ib = (1280 * 736 * 2 * 2 * 30 * 1.5), - }, -}; - -static struct msm_bus_vectors rotator_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_ROTATOR, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = (1920 * 1088 * 2 * 2 * 30), - .ib = (1920 * 1088 * 2 * 2 * 30 * 1.5), - }, -}; - -static struct msm_bus_paths rotator_bus_scale_usecases[] = { - { - ARRAY_SIZE(rotator_init_vectors), - rotator_init_vectors, - }, - { - ARRAY_SIZE(rotator_ui_vectors), - rotator_ui_vectors, - }, - { - ARRAY_SIZE(rotator_vga_vectors), - rotator_vga_vectors, - }, - { - ARRAY_SIZE(rotator_720p_vectors), - rotator_720p_vectors, - }, - { - ARRAY_SIZE(rotator_1080p_vectors), - rotator_1080p_vectors, - }, -}; - -struct msm_bus_scale_pdata rotator_bus_scale_pdata = { - rotator_bus_scale_usecases, - ARRAY_SIZE(rotator_bus_scale_usecases), - .name = "rotator", -}; - -void __init msm_rotator_update_bus_vectors(unsigned int xres, - unsigned int yres) -{ - rotator_ui_vectors[0].ab = xres * yres * 4 * 2 * 60; - rotator_ui_vectors[0].ib = xres * yres * 4 * 2 * 60 * 3 / 2; -} - -#define ROTATOR_HW_BASE 0x04E00000 -static struct resource resources_msm_rotator[] = { - { - .start = ROTATOR_HW_BASE, - .end = ROTATOR_HW_BASE + 0x100000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = ROT_IRQ, - .end = ROT_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_rot_clocks rotator_clocks[] = { - { - .clk_name = "core_clk", - .clk_type = ROTATOR_CORE_CLK, - .clk_rate = 200 * 1000 * 1000, - }, - { - .clk_name = "iface_clk", - .clk_type = ROTATOR_PCLK, - .clk_rate = 0, - }, -}; - -static struct msm_rotator_platform_data rotator_pdata = { - .number_of_clocks = ARRAY_SIZE(rotator_clocks), - .hardware_version_number = 0x01020309, - .rotator_clks = rotator_clocks, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &rotator_bus_scale_pdata, -#endif -}; - -struct platform_device msm_rotator_device = { - .name = "msm_rotator", - .id = 0, - .num_resources = ARRAY_SIZE(resources_msm_rotator), - .resource = resources_msm_rotator, - .dev = { - .platform_data = &rotator_pdata, - }, -}; - -void __init msm_rotator_set_split_iommu_domain(void) -{ - rotator_pdata.rot_iommu_split_domain = 1; -} -#endif - -#define MIPI_DSI_HW_BASE 0x04700000 -#define MDP_HW_BASE 0x05100000 - -static struct resource msm_mipi_dsi1_resources[] = { - { - .name = "mipi_dsi", - .start = MIPI_DSI_HW_BASE, - .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = DSI1_IRQ, - .end = DSI1_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_mipi_dsi1_device = { - .name = "mipi_dsi", - .id = 1, - .num_resources = ARRAY_SIZE(msm_mipi_dsi1_resources), - .resource = msm_mipi_dsi1_resources, -}; - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_HW_BASE, - .end = MDP_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MDP_IRQ, - .end = MDP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -#ifdef CONFIG_MSM_BUS_SCALING -static struct platform_device msm_dtv_device = { - .name = "dtv", - .id = 0, -}; -#endif - -struct platform_device msm_lvds_device = { - .name = "lvds", - .id = 0, -}; - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "mipi_dsi", 8)) - msm_register_device(&msm_mipi_dsi1_device, data); - else if (!strncmp(name, "lvds", 4)) - msm_register_device(&msm_lvds_device, data); -#ifdef CONFIG_MSM_BUS_SCALING - else if (!strncmp(name, "dtv", 3)) - msm_register_device(&msm_dtv_device, data); -#endif - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct resource resources_sps[] = { - { - .name = "pipe_mem", - .start = 0x12800000, - .end = 0x12800000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_dma", - .start = 0x12240000, - .end = 0x12240000 + 0x1000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_bam", - .start = 0x12244000, - .end = 0x12244000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_irq", - .start = SPS_BAM_DMA_IRQ, - .end = SPS_BAM_DMA_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_sps_platform_data msm_sps_pdata = { - .bamdma_restricted_pipes = 0x06, -}; - -struct platform_device msm_device_sps = { - .name = "msm_sps", - .id = -1, - .num_resources = ARRAY_SIZE(resources_sps), - .resource = resources_sps, - .dev.platform_data = &msm_sps_pdata, -}; - -#ifdef CONFIG_MSM_MPM -static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = { - [1] = MSM_GPIO_TO_INT(46), - [2] = MSM_GPIO_TO_INT(150), - [4] = MSM_GPIO_TO_INT(103), - [5] = MSM_GPIO_TO_INT(104), - [6] = MSM_GPIO_TO_INT(105), - [7] = MSM_GPIO_TO_INT(106), - [8] = MSM_GPIO_TO_INT(107), - [9] = MSM_GPIO_TO_INT(7), - [10] = MSM_GPIO_TO_INT(11), - [11] = MSM_GPIO_TO_INT(15), - [12] = MSM_GPIO_TO_INT(19), - [13] = MSM_GPIO_TO_INT(23), - [14] = MSM_GPIO_TO_INT(27), - [15] = MSM_GPIO_TO_INT(31), - [16] = MSM_GPIO_TO_INT(35), - [19] = MSM_GPIO_TO_INT(90), - [20] = MSM_GPIO_TO_INT(92), - [23] = MSM_GPIO_TO_INT(85), - [24] = MSM_GPIO_TO_INT(83), - [25] = USB1_HS_IRQ, - [27] = HDMI_IRQ, - [29] = MSM_GPIO_TO_INT(10), - [30] = MSM_GPIO_TO_INT(102), - [31] = MSM_GPIO_TO_INT(81), - [32] = MSM_GPIO_TO_INT(78), - [33] = MSM_GPIO_TO_INT(94), - [34] = MSM_GPIO_TO_INT(72), - [35] = MSM_GPIO_TO_INT(39), - [36] = MSM_GPIO_TO_INT(43), - [37] = MSM_GPIO_TO_INT(61), - [38] = MSM_GPIO_TO_INT(50), - [39] = MSM_GPIO_TO_INT(42), - [41] = MSM_GPIO_TO_INT(62), - [42] = MSM_GPIO_TO_INT(76), - [43] = MSM_GPIO_TO_INT(75), - [44] = MSM_GPIO_TO_INT(70), - [45] = MSM_GPIO_TO_INT(69), - [46] = MSM_GPIO_TO_INT(67), - [47] = MSM_GPIO_TO_INT(65), - [48] = MSM_GPIO_TO_INT(58), - [49] = MSM_GPIO_TO_INT(54), - [50] = MSM_GPIO_TO_INT(52), - [51] = MSM_GPIO_TO_INT(49), - [52] = MSM_GPIO_TO_INT(40), - [53] = MSM_GPIO_TO_INT(37), - [54] = MSM_GPIO_TO_INT(24), - [55] = MSM_GPIO_TO_INT(14), -}; - -static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = { - TLMM_MSM_SUMMARY_IRQ, - RPM_APCC_CPU0_GP_HIGH_IRQ, - RPM_APCC_CPU0_GP_MEDIUM_IRQ, - RPM_APCC_CPU0_GP_LOW_IRQ, - RPM_APCC_CPU0_WAKE_UP_IRQ, - RPM_APCC_CPU1_GP_HIGH_IRQ, - RPM_APCC_CPU1_GP_MEDIUM_IRQ, - RPM_APCC_CPU1_GP_LOW_IRQ, - RPM_APCC_CPU1_WAKE_UP_IRQ, - MSS_TO_APPS_IRQ_0, - MSS_TO_APPS_IRQ_1, - MSS_TO_APPS_IRQ_2, - MSS_TO_APPS_IRQ_3, - MSS_TO_APPS_IRQ_4, - MSS_TO_APPS_IRQ_5, - MSS_TO_APPS_IRQ_6, - MSS_TO_APPS_IRQ_7, - MSS_TO_APPS_IRQ_8, - MSS_TO_APPS_IRQ_9, - LPASS_SCSS_GP_LOW_IRQ, - LPASS_SCSS_GP_MEDIUM_IRQ, - LPASS_SCSS_GP_HIGH_IRQ, - SPS_MTI_30, - SPS_MTI_31, - RIVA_APSS_SPARE_IRQ, - RIVA_APPS_WLAN_SMSM_IRQ, - RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ, - RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ, -}; - -struct msm_mpm_device_data msm8960_mpm_dev_data __initdata = { - .irqs_m2a = msm_mpm_irqs_m2a, - .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a), - .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs, - .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs), - .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8, - .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8, - .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008, - .mpm_apps_ipc_val = BIT(1), - .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ, - -}; -#endif - -#define LPASS_SLIMBUS_PHYS 0x28080000 -#define LPASS_SLIMBUS_BAM_PHYS 0x28084000 -#define LPASS_SLIMBUS_SLEW (MSM8960_TLMM_PHYS + 0x207C) -/* Board info for the slimbus slave device */ -static struct resource slimbus_res[] = { - { - .start = LPASS_SLIMBUS_PHYS, - .end = LPASS_SLIMBUS_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_physical", - }, - { - .start = LPASS_SLIMBUS_BAM_PHYS, - .end = LPASS_SLIMBUS_BAM_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_bam_physical", - }, - { - .start = LPASS_SLIMBUS_SLEW, - .end = LPASS_SLIMBUS_SLEW + 4 - 1, - .flags = IORESOURCE_MEM, - .name = "slimbus_slew_reg", - }, - { - .start = SLIMBUS0_CORE_EE1_IRQ, - .end = SLIMBUS0_CORE_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_irq", - }, - { - .start = SLIMBUS0_BAM_EE1_IRQ, - .end = SLIMBUS0_BAM_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_bam_irq", - }, -}; - -struct platform_device msm_slim_ctrl = { - .name = "msm_slim_ctrl", - .id = 1, - .num_resources = ARRAY_SIZE(slimbus_res), - .resource = slimbus_res, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct msm_dcvs_freq_entry grp3d_freq[] = { - {0, 900, 0, 0, 0}, - {0, 950, 0, 0, 0}, - {0, 950, 0, 0, 0}, - {0, 1200, 1, 100, 100}, -}; - -static struct msm_dcvs_freq_entry grp2d_freq[] = { - {0, 900, 0, 0, 0}, - {0, 950, 1, 100, 100}, -}; - -static struct msm_dcvs_core_info grp3d_core_info = { - .freq_tbl = &grp3d_freq[0], - .core_param = { - .core_type = MSM_DCVS_CORE_TYPE_GPU, - }, - .algo_param = { - .disable_pc_threshold = 0, - .em_win_size_min_us = 100000, - .em_win_size_max_us = 300000, - .em_max_util_pct = 97, - .group_id = 0, - .max_freq_chg_time_us = 100000, - .slack_mode_dynamic = 0, - .slack_weight_thresh_pct = 0, - .slack_time_min_us = 39000, - .slack_time_max_us = 39000, - .ss_win_size_min_us = 1000000, - .ss_win_size_max_us = 1000000, - .ss_util_pct = 95, - .ss_no_corr_below_freq = 0, - }, - .energy_coeffs = { - .active_coeff_a = 2492, - .active_coeff_b = 0, - .active_coeff_c = 0, - - .leakage_coeff_a = -17720, - .leakage_coeff_b = 37, - .leakage_coeff_c = 2729, - .leakage_coeff_d = -277, - }, - .power_param = { - .current_temp = 25, - .num_freq = ARRAY_SIZE(grp3d_freq), - } -}; - -static struct msm_dcvs_core_info grp2d_core_info = { - .freq_tbl = &grp2d_freq[0], - .core_param = { - .core_type = MSM_DCVS_CORE_TYPE_GPU, - }, - .algo_param = { - .disable_pc_threshold = 0, - .em_win_size_min_us = 100000, - .em_win_size_max_us = 300000, - .em_max_util_pct = 97, - .group_id = 0, - .max_freq_chg_time_us = 100000, - .slack_mode_dynamic = 0, - .slack_weight_thresh_pct = 0, - .slack_time_min_us = 39000, - .slack_time_max_us = 39000, - .ss_win_size_min_us = 1000000, - .ss_win_size_max_us = 1000000, - .ss_util_pct = 95, - .ss_no_corr_below_freq = 0, - }, - .energy_coeffs = { - .active_coeff_a = 2492, - .active_coeff_b = 0, - .active_coeff_c = 0, - - .leakage_coeff_a = -17720, - .leakage_coeff_b = 37, - .leakage_coeff_c = 2729, - .leakage_coeff_d = -277, - }, - .power_param = { - .current_temp = 25, - .num_freq = ARRAY_SIZE(grp2d_freq), - } -}; - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors grp3d_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp3d_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2048), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_high_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, -}; - -static struct msm_bus_vectors grp3d_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(3968), - }, -}; - -struct msm_bus_vectors grp3d_init_vectors_1[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -struct msm_bus_vectors grp3d_low_vectors_1[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -struct msm_bus_vectors grp3d_nominal_low_vectors_1[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2048), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2048), - }, -}; - -struct msm_bus_vectors grp3d_nominal_high_vectors_1[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2656), - }, -}; - -struct msm_bus_vectors grp3d_max_vectors_1[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(3968), - }, - { - .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(3968), - }, -}; - -static struct msm_bus_paths grp3d_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp3d_init_vectors), - grp3d_init_vectors, - }, - { - ARRAY_SIZE(grp3d_low_vectors), - grp3d_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_low_vectors), - grp3d_nominal_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_high_vectors), - grp3d_nominal_high_vectors, - }, - { - ARRAY_SIZE(grp3d_max_vectors), - grp3d_max_vectors, - }, -}; - -struct msm_bus_paths grp3d_bus_scale_usecases_1[] = { - { - ARRAY_SIZE(grp3d_init_vectors_1), - grp3d_init_vectors_1, - }, - { - ARRAY_SIZE(grp3d_low_vectors_1), - grp3d_low_vectors_1, - }, - { - ARRAY_SIZE(grp3d_nominal_low_vectors_1), - grp3d_nominal_low_vectors_1, - }, - { - ARRAY_SIZE(grp3d_nominal_high_vectors_1), - grp3d_nominal_high_vectors_1, - }, - { - ARRAY_SIZE(grp3d_max_vectors_1), - grp3d_max_vectors_1, - }, -}; - -static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = { - grp3d_bus_scale_usecases, - ARRAY_SIZE(grp3d_bus_scale_usecases), - .name = "grp3d", -}; - -struct msm_bus_scale_pdata grp3d_bus_scale_pdata_ab = { - grp3d_bus_scale_usecases_1, - ARRAY_SIZE(grp3d_bus_scale_usecases_1), - .name = "grp3d", -}; - -static struct msm_bus_vectors grp2d0_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp2d0_nominal_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -static struct msm_bus_vectors grp2d0_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2048), - }, -}; - -static struct msm_bus_paths grp2d0_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp2d0_init_vectors), - grp2d0_init_vectors, - }, - { - ARRAY_SIZE(grp2d0_nominal_vectors), - grp2d0_nominal_vectors, - }, - { - ARRAY_SIZE(grp2d0_max_vectors), - grp2d0_max_vectors, - }, -}; - -struct msm_bus_scale_pdata grp2d0_bus_scale_pdata = { - grp2d0_bus_scale_usecases, - ARRAY_SIZE(grp2d0_bus_scale_usecases), - .name = "grp2d0", -}; - -static struct msm_bus_vectors grp2d1_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp2d1_nominal_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1000), - }, -}; - -static struct msm_bus_vectors grp2d1_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2048), - }, -}; - -static struct msm_bus_paths grp2d1_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp2d1_init_vectors), - grp2d1_init_vectors, - }, - { - ARRAY_SIZE(grp2d1_nominal_vectors), - grp2d1_nominal_vectors, - }, - { - ARRAY_SIZE(grp2d1_max_vectors), - grp2d1_max_vectors, - }, -}; - -struct msm_bus_scale_pdata grp2d1_bus_scale_pdata = { - grp2d1_bus_scale_usecases, - ARRAY_SIZE(grp2d1_bus_scale_usecases), - .name = "grp2d1", -}; -#endif - -struct resource kgsl_3d0_resources_8960ab[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0x04300000, /* GFX3D address */ - .end = 0x0430ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_SHADER_MEMORY, - .start = 0x04310000, /* Shader Mem Address (8960AB) */ - .end = 0x0431ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = GFX3D_IRQ, - .end = GFX3D_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -int kgsl_num_resources_8960ab = ARRAY_SIZE(kgsl_3d0_resources_8960ab); - -static struct resource kgsl_3d0_resources_8960[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0x04300000, /* GFX3D address */ - .end = 0x0431ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = GFX3D_IRQ, - .end = GFX3D_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static const struct kgsl_iommu_ctx kgsl_3d0_iommu0_ctxs[] = { - { "gfx3d_user", 0 }, - { "gfx3d_priv", 1 }, -}; - -static const struct kgsl_iommu_ctx kgsl_3d0_iommu1_ctxs[] = { - { "gfx3d1_user", 0 }, - { "gfx3d1_priv", 1 }, -}; - -static struct kgsl_device_iommu_data kgsl_3d0_iommu_data[] = { - { - .iommu_ctxs = kgsl_3d0_iommu0_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu0_ctxs), - .physstart = 0x07C00000, - .physend = 0x07C00000 + SZ_1M - 1, - }, - { - .iommu_ctxs = kgsl_3d0_iommu1_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu1_ctxs), - .physstart = 0x07D00000, - .physend = 0x07D00000 + SZ_1M - 1, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 400000000, - .bus_freq = 4, - .io_fraction = 0, - }, - { - .gpu_freq = 300000000, - .bus_freq = 3, - .io_fraction = 33, - }, - { - .gpu_freq = 200000000, - .bus_freq = 2, - .io_fraction = 100, - }, - { - .gpu_freq = 128000000, - .bus_freq = 1, - .io_fraction = 100, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 1, - .num_levels = ARRAY_SIZE(grp3d_freq) + 1, - .set_grp_async = NULL, - .idle_timeout = HZ/12, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp3d_bus_scale_pdata, -#endif - .iommu_data = kgsl_3d0_iommu_data, - .iommu_count = ARRAY_SIZE(kgsl_3d0_iommu_data), - .core_info = &grp3d_core_info, -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources_8960), - .resource = kgsl_3d0_resources_8960, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -static struct resource kgsl_2d0_resources[] = { - { - .name = KGSL_2D0_REG_MEMORY, - .start = 0x04100000, /* Z180 base address */ - .end = 0x04100FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_2D0_IRQ, - .start = GFX2D0_IRQ, - .end = GFX2D0_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static const struct kgsl_iommu_ctx kgsl_2d0_iommu_ctxs[] = { - { "gfx2d0_2d0", 0 }, -}; - -static struct kgsl_device_iommu_data kgsl_2d0_iommu_data[] = { - { - .iommu_ctxs = kgsl_2d0_iommu_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_2d0_iommu_ctxs), - .physstart = 0x07D00000, - .physend = 0x07D00000 + SZ_1M - 1, - }, -}; - -static struct kgsl_device_platform_data kgsl_2d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 200000000, - .bus_freq = 2, - }, - { - .gpu_freq = 96000000, - .bus_freq = 1, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = ARRAY_SIZE(grp2d_freq) + 1, - .set_grp_async = NULL, - .idle_timeout = HZ/5, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp2d0_bus_scale_pdata, -#endif - .iommu_data = kgsl_2d0_iommu_data, - .iommu_count = ARRAY_SIZE(kgsl_2d0_iommu_data), - .core_info = &grp2d_core_info, -}; - -struct platform_device msm_kgsl_2d0 = { - .name = "kgsl-2d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_2d0_resources), - .resource = kgsl_2d0_resources, - .dev = { - .platform_data = &kgsl_2d0_pdata, - }, -}; - -static const struct kgsl_iommu_ctx kgsl_2d1_iommu_ctxs[] = { - { "gfx2d1_2d1", 0 }, -}; - -static struct kgsl_device_iommu_data kgsl_2d1_iommu_data[] = { - { - .iommu_ctxs = kgsl_2d1_iommu_ctxs, - .iommu_ctx_count = ARRAY_SIZE(kgsl_2d1_iommu_ctxs), - .physstart = 0x07E00000, - .physend = 0x07E00000 + SZ_1M - 1, - }, -}; - -static struct resource kgsl_2d1_resources[] = { - { - .name = KGSL_2D1_REG_MEMORY, - .start = 0x04200000, /* Z180 device 1 base address */ - .end = 0x04200FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_2D1_IRQ, - .start = GFX2D1_IRQ, - .end = GFX2D1_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_2d1_pdata = { - .pwrlevel = { - { - .gpu_freq = 200000000, - .bus_freq = 2, - }, - { - .gpu_freq = 96000000, - .bus_freq = 1, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = ARRAY_SIZE(grp2d_freq) + 1, - .set_grp_async = NULL, - .idle_timeout = HZ/5, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp2d1_bus_scale_pdata, -#endif - .iommu_data = kgsl_2d1_iommu_data, - .iommu_count = ARRAY_SIZE(kgsl_2d1_iommu_data), - .core_info = &grp2d_core_info, -}; - -struct platform_device msm_kgsl_2d1 = { - .name = "kgsl-2d1", - .id = 1, - .num_resources = ARRAY_SIZE(kgsl_2d1_resources), - .resource = kgsl_2d1_resources, - .dev = { - .platform_data = &kgsl_2d1_pdata, - }, -}; - -#ifdef CONFIG_MSM_GEMINI -static struct resource msm_gemini_resources[] = { - { - .start = 0x04600000, - .end = 0x04600000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = JPEG_IRQ, - .end = JPEG_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8960_gemini_device = { - .name = "msm_gemini", - .resource = msm_gemini_resources, - .num_resources = ARRAY_SIZE(msm_gemini_resources), -}; -#endif - -#ifdef CONFIG_MSM_MERCURY -static struct resource msm_mercury_resources[] = { - { - .start = 0x05000000, - .end = 0x05000000 + SZ_1M - 1, - .name = "mercury_resource_base", - .flags = IORESOURCE_MEM, - }, - { - .start = JPEGD_IRQ, - .end = JPEGD_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; -struct platform_device msm8960_mercury_device = { - .name = "msm_mercury", - .resource = msm_mercury_resources, - .num_resources = ARRAY_SIZE(msm_mercury_resources), -}; -#endif - -struct msm_rpm_platform_data msm8960_rpm_data __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(8960, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8960, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4), - MSM_RPM_MAP(8960, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(8960, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8960, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8960, RPM_CTL, RPM_CTL, 1), - MSM_RPM_MAP(8960, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(8960, PXO_CLK, PXO_CLK, 1), - MSM_RPM_MAP(8960, APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1), - MSM_RPM_MAP(8960, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(8960, MM_FABRIC_CLK, MM_FABRIC_CLK, 1), - MSM_RPM_MAP(8960, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(8960, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(8960, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(8960, MMFPB_CLK, MMFPB_CLK, 1), - MSM_RPM_MAP(8960, EBI1_CLK, EBI1_CLK, 1), - MSM_RPM_MAP(8960, APPS_FABRIC_CFG_HALT_0, - APPS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8960, APPS_FABRIC_CFG_CLKMOD_0, - APPS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8960, APPS_FABRIC_CFG_IOCTL, - APPS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8960, APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 12), - MSM_RPM_MAP(8960, SYS_FABRIC_CFG_HALT_0, - SYS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8960, SYS_FABRIC_CFG_CLKMOD_0, - SYS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8960, SYS_FABRIC_CFG_IOCTL, - SYS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8960, SYSTEM_FABRIC_ARB_0, - SYSTEM_FABRIC_ARB, 29), - MSM_RPM_MAP(8960, MMSS_FABRIC_CFG_HALT_0, - MMSS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(8960, MMSS_FABRIC_CFG_CLKMOD_0, - MMSS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(8960, MMSS_FABRIC_CFG_IOCTL, - MMSS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(8960, MM_FABRIC_ARB_0, MM_FABRIC_ARB, 23), - MSM_RPM_MAP(8960, PM8921_S1_0, PM8921_S1, 2), - MSM_RPM_MAP(8960, PM8921_S2_0, PM8921_S2, 2), - MSM_RPM_MAP(8960, PM8921_S3_0, PM8921_S3, 2), - MSM_RPM_MAP(8960, PM8921_S4_0, PM8921_S4, 2), - MSM_RPM_MAP(8960, PM8921_S5_0, PM8921_S5, 2), - MSM_RPM_MAP(8960, PM8921_S6_0, PM8921_S6, 2), - MSM_RPM_MAP(8960, PM8921_S7_0, PM8921_S7, 2), - MSM_RPM_MAP(8960, PM8921_S8_0, PM8921_S8, 2), - MSM_RPM_MAP(8960, PM8921_L1_0, PM8921_L1, 2), - MSM_RPM_MAP(8960, PM8921_L2_0, PM8921_L2, 2), - MSM_RPM_MAP(8960, PM8921_L3_0, PM8921_L3, 2), - MSM_RPM_MAP(8960, PM8921_L4_0, PM8921_L4, 2), - MSM_RPM_MAP(8960, PM8921_L5_0, PM8921_L5, 2), - MSM_RPM_MAP(8960, PM8921_L6_0, PM8921_L6, 2), - MSM_RPM_MAP(8960, PM8921_L7_0, PM8921_L7, 2), - MSM_RPM_MAP(8960, PM8921_L8_0, PM8921_L8, 2), - MSM_RPM_MAP(8960, PM8921_L9_0, PM8921_L9, 2), - MSM_RPM_MAP(8960, PM8921_L10_0, PM8921_L10, 2), - MSM_RPM_MAP(8960, PM8921_L11_0, PM8921_L11, 2), - MSM_RPM_MAP(8960, PM8921_L12_0, PM8921_L12, 2), - MSM_RPM_MAP(8960, PM8921_L13_0, PM8921_L13, 2), - MSM_RPM_MAP(8960, PM8921_L14_0, PM8921_L14, 2), - MSM_RPM_MAP(8960, PM8921_L15_0, PM8921_L15, 2), - MSM_RPM_MAP(8960, PM8921_L16_0, PM8921_L16, 2), - MSM_RPM_MAP(8960, PM8921_L17_0, PM8921_L17, 2), - MSM_RPM_MAP(8960, PM8921_L18_0, PM8921_L18, 2), - MSM_RPM_MAP(8960, PM8921_L19_0, PM8921_L19, 2), - MSM_RPM_MAP(8960, PM8921_L20_0, PM8921_L20, 2), - MSM_RPM_MAP(8960, PM8921_L21_0, PM8921_L21, 2), - MSM_RPM_MAP(8960, PM8921_L22_0, PM8921_L22, 2), - MSM_RPM_MAP(8960, PM8921_L23_0, PM8921_L23, 2), - MSM_RPM_MAP(8960, PM8921_L24_0, PM8921_L24, 2), - MSM_RPM_MAP(8960, PM8921_L25_0, PM8921_L25, 2), - MSM_RPM_MAP(8960, PM8921_L26_0, PM8921_L26, 2), - MSM_RPM_MAP(8960, PM8921_L27_0, PM8921_L27, 2), - MSM_RPM_MAP(8960, PM8921_L28_0, PM8921_L28, 2), - MSM_RPM_MAP(8960, PM8921_L29_0, PM8921_L29, 2), - MSM_RPM_MAP(8960, PM8921_CLK1_0, PM8921_CLK1, 2), - MSM_RPM_MAP(8960, PM8921_CLK2_0, PM8921_CLK2, 2), - MSM_RPM_MAP(8960, PM8921_LVS1, PM8921_LVS1, 1), - MSM_RPM_MAP(8960, PM8921_LVS2, PM8921_LVS2, 1), - MSM_RPM_MAP(8960, PM8921_LVS3, PM8921_LVS3, 1), - MSM_RPM_MAP(8960, PM8921_LVS4, PM8921_LVS4, 1), - MSM_RPM_MAP(8960, PM8921_LVS5, PM8921_LVS5, 1), - MSM_RPM_MAP(8960, PM8921_LVS6, PM8921_LVS6, 1), - MSM_RPM_MAP(8960, PM8921_LVS7, PM8921_LVS7, 1), - MSM_RPM_MAP(8960, NCP_0, NCP, 2), - MSM_RPM_MAP(8960, CXO_BUFFERS, CXO_BUFFERS, 1), - MSM_RPM_MAP(8960, USB_OTG_SWITCH, USB_OTG_SWITCH, 1), - MSM_RPM_MAP(8960, HDMI_SWITCH, HDMI_SWITCH, 1), - MSM_RPM_MAP(8960, DDR_DMM_0, DDR_DMM, 2), - MSM_RPM_MAP(8960, QDSS_CLK, QDSS_CLK, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(8960, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(8960, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(8960, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(8960, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8960, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(8960, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(8960, RESERVED_SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8960, SEQUENCE), - MSM_RPM_STATUS_ID_MAP(8960, RPM_CTL), - MSM_RPM_STATUS_ID_MAP(8960, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(8960, PXO_CLK), - MSM_RPM_STATUS_ID_MAP(8960, APPS_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8960, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8960, MM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8960, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8960, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8960, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8960, MMFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8960, EBI1_CLK), - MSM_RPM_STATUS_ID_MAP(8960, APPS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8960, APPS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8960, APPS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8960, APPS_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8960, SYS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8960, SYS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8960, SYS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8960, SYSTEM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8960, MMSS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(8960, MMSS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(8960, MMSS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(8960, MM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S1_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S1_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S2_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S2_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S3_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S3_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S4_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S4_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S5_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S5_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S6_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S6_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S7_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S7_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S8_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_S8_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L1_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L1_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L2_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L2_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L3_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L3_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L4_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L4_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L5_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L5_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L6_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L6_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L7_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L7_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L8_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L8_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L9_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L9_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L10_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L10_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L11_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L11_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L12_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L12_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L13_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L13_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L14_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L14_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L15_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L15_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L16_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L16_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L17_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L17_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L18_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L18_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L19_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L19_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L20_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L20_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L21_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L21_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L22_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L22_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L23_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L23_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L24_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L24_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L25_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L25_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L26_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L26_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L27_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L27_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L28_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L28_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L29_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_L29_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_CLK1_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_CLK1_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_CLK2_0), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_CLK2_1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS1), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS2), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS3), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS4), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS5), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS6), - MSM_RPM_STATUS_ID_MAP(8960, PM8921_LVS7), - MSM_RPM_STATUS_ID_MAP(8960, NCP_0), - MSM_RPM_STATUS_ID_MAP(8960, NCP_1), - MSM_RPM_STATUS_ID_MAP(8960, CXO_BUFFERS), - MSM_RPM_STATUS_ID_MAP(8960, USB_OTG_SWITCH), - MSM_RPM_STATUS_ID_MAP(8960, HDMI_SWITCH), - MSM_RPM_STATUS_ID_MAP(8960, DDR_DMM_0), - MSM_RPM_STATUS_ID_MAP(8960, DDR_DMM_1), - MSM_RPM_STATUS_ID_MAP(8960, EBI1_CH0_RANGE), - MSM_RPM_STATUS_ID_MAP(8960, EBI1_CH1_RANGE), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(8960, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(8960, VERSION_MINOR), - MSM_RPM_CTRL_MAP(8960, VERSION_BUILD), - MSM_RPM_CTRL_MAP(8960, REQ_CTX_0), - MSM_RPM_CTRL_MAP(8960, REQ_SEL_0), - MSM_RPM_CTRL_MAP(8960, ACK_CTX_0), - MSM_RPM_CTRL_MAP(8960, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_8960_SEL_INVALIDATE, - .sel_notification = MSM_RPM_8960_SEL_NOTIFICATION, - .sel_last = MSM_RPM_8960_SEL_LAST, - .ver = {3, 0, 0}, -}; - -struct platform_device msm8960_rpm_device = { - .name = "msm_rpm", - .id = -1, -}; - -static struct msm_rpm_log_platform_data msm_rpm_log_pdata = { - .phys_addr_base = 0x0010C000, - .reg_offsets = { - [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080, - [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0, - }, - .phys_size = SZ_8K, - .log_len = 6144, /* log's buffer length in bytes */ - .log_len_mask = (6144 >> 2) - 1, /* length mask in units of u32 */ -}; - -struct platform_device msm8960_rpm_log_device = { - .name = "msm_rpm_log", - .id = -1, - .dev = { - .platform_data = &msm_rpm_log_pdata, - }, -}; - -static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = { - .version = 1, -}; - -static struct resource msm_rpm_stat_resource[] = { - { - .start = 0x0010D204, - .end = 0x0010D204 + SZ_8K, - .flags = IORESOURCE_MEM, - .name = "phys_addr_base" - }, -}; - - - -struct platform_device msm8960_rpm_stat_device = { - .name = "msm_rpm_stat", - .id = -1, - .resource = msm_rpm_stat_resource, - .num_resources = ARRAY_SIZE(msm_rpm_stat_resource), - .dev = { - .platform_data = &msm_rpm_stat_pdata, - } -}; - -static struct resource resources_rpm_master_stats[] = { - { - .start = MSM8960_RPM_MASTER_STATS_BASE, - .end = MSM8960_RPM_MASTER_STATS_BASE + SZ_256, - .flags = IORESOURCE_MEM, - }, -}; - -static char *master_names[] = { - "KPSS", - "GPSS", - "LPASS", - "RIVA", - "DSPS", -}; - -static struct msm_rpm_master_stats_platform_data msm_rpm_master_stat_pdata = { - .masters = master_names, - .num_masters = ARRAY_SIZE(master_names), - .master_offset = 32, -}; - -struct platform_device msm8960_rpm_master_stat_device = { - .name = "msm_rpm_master_stats", - .id = -1, - .num_resources = ARRAY_SIZE(resources_rpm_master_stats), - .resource = resources_rpm_master_stats, - .dev = { - .platform_data = &msm_rpm_master_stat_pdata, - }, -}; - -struct platform_device msm_bus_sys_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM, -}; -struct platform_device msm_bus_apps_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_APPSS, -}; -struct platform_device msm_bus_mm_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_MMSS, -}; -struct platform_device msm_bus_sys_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM_FPB, -}; -struct platform_device msm_bus_cpss_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_CPSS_FPB, -}; - -/* Sensors DSPS platform data */ -#ifdef CONFIG_MSM_DSPS - -#define PPSS_REG_PHYS_BASE 0x12080000 - -static struct dsps_clk_info dsps_clks[] = {}; -static struct dsps_regulator_info dsps_regs[] = {}; - -/* - * Note: GPIOs field is intialized in run-time at the function - * msm8960_init_dsps(). - */ - -struct msm_dsps_platform_data msm_dsps_pdata = { - .clks = dsps_clks, - .clks_num = ARRAY_SIZE(dsps_clks), - .gpios = NULL, - .gpios_num = 0, - .regs = dsps_regs, - .regs_num = ARRAY_SIZE(dsps_regs), - .dsps_pwr_ctl_en = 1, - .signature = DSPS_SIGNATURE, -}; - -static struct resource msm_dsps_resources[] = { - { - .start = PPSS_REG_PHYS_BASE, - .end = PPSS_REG_PHYS_BASE + SZ_8K - 1, - .name = "ppss_reg", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_dsps_device = { - .name = "msm_dsps", - .id = 0, - .num_resources = ARRAY_SIZE(msm_dsps_resources), - .resource = msm_dsps_resources, - .dev.platform_data = &msm_dsps_pdata, -}; - -#endif /* CONFIG_MSM_DSPS */ - -#define CORESIGHT_PHYS_BASE 0x01A00000 -#define CORESIGHT_TPIU_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x3000) -#define CORESIGHT_ETB_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x1000) -#define CORESIGHT_FUNNEL_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x4000) -#define CORESIGHT_STM_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x6000) -#define CORESIGHT_ETM0_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x1C000) -#define CORESIGHT_ETM1_PHYS_BASE (CORESIGHT_PHYS_BASE + 0x1D000) - -#define CORESIGHT_STM_CHANNEL_PHYS_BASE (0x14000000 + 0x280000) - -static struct resource coresight_tpiu_resources[] = { - { - .name = "tpiu-base", - .start = CORESIGHT_TPIU_PHYS_BASE, - .end = CORESIGHT_TPIU_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct coresight_platform_data coresight_tpiu_pdata = { - .id = 0, - .name = "coresight-tpiu", - .nr_inports = 1, - .nr_outports = 0, -}; - -struct platform_device coresight_tpiu_device = { - .name = "coresight-tpiu", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_tpiu_resources), - .resource = coresight_tpiu_resources, - .dev = { - .platform_data = &coresight_tpiu_pdata, - }, -}; - -static struct resource coresight_etb_resources[] = { - { - .name = "etb-base", - .start = CORESIGHT_ETB_PHYS_BASE, - .end = CORESIGHT_ETB_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct coresight_platform_data coresight_etb_pdata = { - .id = 1, - .name = "coresight-etb", - .nr_inports = 1, - .nr_outports = 0, - .default_sink = true, -}; - -struct platform_device coresight_etb_device = { - .name = "coresight-etb", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_etb_resources), - .resource = coresight_etb_resources, - .dev = { - .platform_data = &coresight_etb_pdata, - }, -}; - -static struct resource coresight_funnel_resources[] = { - { - .name = "funnel-base", - .start = CORESIGHT_FUNNEL_PHYS_BASE, - .end = CORESIGHT_FUNNEL_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_funnel_outports[] = { 0, 1 }; -static const int coresight_funnel_child_ids[] = { 0, 1 }; -static const int coresight_funnel_child_ports[] = { 0, 0 }; - -static struct coresight_platform_data coresight_funnel_pdata = { - .id = 2, - .name = "coresight-funnel", - .nr_inports = 4, - .outports = coresight_funnel_outports, - .child_ids = coresight_funnel_child_ids, - .child_ports = coresight_funnel_child_ports, - .nr_outports = ARRAY_SIZE(coresight_funnel_outports), -}; - -struct platform_device coresight_funnel_device = { - .name = "coresight-funnel", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_funnel_resources), - .resource = coresight_funnel_resources, - .dev = { - .platform_data = &coresight_funnel_pdata, - }, -}; - -static struct resource coresight_stm_resources[] = { - { - .name = "stm-base", - .start = CORESIGHT_STM_PHYS_BASE, - .end = CORESIGHT_STM_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "stm-data-base", - .start = CORESIGHT_STM_CHANNEL_PHYS_BASE, - .end = CORESIGHT_STM_CHANNEL_PHYS_BASE + SZ_1M + SZ_512K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_stm_outports[] = { 0 }; -static const int coresight_stm_child_ids[] = { 2 }; -static const int coresight_stm_child_ports[] = { 2 }; - -static struct coresight_platform_data coresight_stm_pdata = { - .id = 3, - .name = "coresight-stm", - .nr_inports = 0, - .outports = coresight_stm_outports, - .child_ids = coresight_stm_child_ids, - .child_ports = coresight_stm_child_ports, - .nr_outports = ARRAY_SIZE(coresight_stm_outports), -}; - -struct platform_device coresight_stm_device = { - .name = "coresight-stm", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_stm_resources), - .resource = coresight_stm_resources, - .dev = { - .platform_data = &coresight_stm_pdata, - }, -}; - -static struct resource coresight_etm0_resources[] = { - { - .name = "etm-base", - .start = CORESIGHT_ETM0_PHYS_BASE, - .end = CORESIGHT_ETM0_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_etm0_outports[] = { 0 }; -static const int coresight_etm0_child_ids[] = { 2 }; -static const int coresight_etm0_child_ports[] = { 0 }; - -static struct coresight_platform_data coresight_etm0_pdata = { - .id = 4, - .name = "coresight-etm0", - .nr_inports = 0, - .outports = coresight_etm0_outports, - .child_ids = coresight_etm0_child_ids, - .child_ports = coresight_etm0_child_ports, - .nr_outports = ARRAY_SIZE(coresight_etm0_outports), -}; - -struct platform_device coresight_etm0_device = { - .name = "coresight-etm", - .id = 0, - .num_resources = ARRAY_SIZE(coresight_etm0_resources), - .resource = coresight_etm0_resources, - .dev = { - .platform_data = &coresight_etm0_pdata, - }, -}; - -static struct resource coresight_etm1_resources[] = { - { - .name = "etm-base", - .start = CORESIGHT_ETM1_PHYS_BASE, - .end = CORESIGHT_ETM1_PHYS_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static const int coresight_etm1_outports[] = { 0 }; -static const int coresight_etm1_child_ids[] = { 2 }; -static const int coresight_etm1_child_ports[] = { 1 }; - -static struct coresight_platform_data coresight_etm1_pdata = { - .id = 5, - .name = "coresight-etm1", - .nr_inports = 0, - .outports = coresight_etm1_outports, - .child_ids = coresight_etm1_child_ids, - .child_ports = coresight_etm1_child_ports, - .nr_outports = ARRAY_SIZE(coresight_etm1_outports), -}; - -struct platform_device coresight_etm1_device = { - .name = "coresight-etm", - .id = 1, - .num_resources = ARRAY_SIZE(coresight_etm1_resources), - .resource = coresight_etm1_resources, - .dev = { - .platform_data = &coresight_etm1_pdata, - }, -}; - -static struct resource msm_ebi1_ch0_erp_resources[] = { - { - .start = HSDDRX_EBI1CH0_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x00A40000, - .end = 0x00A40000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_ebi1_ch0_erp = { - .name = "msm_ebi_erp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi1_ch0_erp_resources), - .resource = msm_ebi1_ch0_erp_resources, -}; - -static struct resource msm_ebi1_ch1_erp_resources[] = { - { - .start = HSDDRX_EBI1CH1_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x00D40000, - .end = 0x00D40000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8960_device_ebi1_ch1_erp = { - .name = "msm_ebi_erp", - .id = 1, - .num_resources = ARRAY_SIZE(msm_ebi1_ch1_erp_resources), - .resource = msm_ebi1_ch1_erp_resources, -}; - -static struct resource msm_cache_erp_resources[] = { - { - .name = "l1_irq", - .start = SC_SICCPUXEXTFAULTIRPTREQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "l2_irq", - .start = APCC_QGICL2IRPTREQ, - .flags = IORESOURCE_IRQ, - } -}; - -struct platform_device msm8960_device_cache_erp = { - .name = "msm_cache_erp", - .id = -1, - .num_resources = ARRAY_SIZE(msm_cache_erp_resources), - .resource = msm_cache_erp_resources, -}; - -struct msm_iommu_domain_name msm8960_iommu_ctx_names[] = { - /* Camera */ - { - .name = "ijpeg_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "ijpeg_dst", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_dst", - .domain = CAMERA_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_src", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_dst", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_mm1", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_b_mm2", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_stream", - .domain = VIDEO_DOMAIN, - }, -}; - -static struct mem_pool msm8960_video_pools[] = { - /* - * Video hardware has the following requirements: - * 1. All video addresses used by the video hardware must be at a higher - * address than video firmware address. - * 2. Video hardware can only access a range of 256MB from the base of - * the video firmware. - */ - [VIDEO_FIRMWARE_POOL] = - /* Low addresses, intended for video firmware */ - { - .paddr = SZ_128K, - .size = SZ_16M - SZ_128K, - }, - [VIDEO_MAIN_POOL] = - /* Main video pool */ - { - .paddr = SZ_16M, - .size = SZ_256M - SZ_16M, - }, - [GEN_POOL] = - /* Remaining address space up to 2G */ - { - .paddr = SZ_256M, - .size = SZ_2G - SZ_256M, - }, -}; - -static struct mem_pool msm8960_camera_pools[] = { - [GEN_POOL] = - /* One address space for camera */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8960_display_read_pools[] = { - [GEN_POOL] = - /* One address space for display reads */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8960_rotator_src_pools[] = { - [GEN_POOL] = - /* One address space for rotator src */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct msm_iommu_domain msm8960_iommu_domains[] = { - [VIDEO_DOMAIN] = { - .iova_pools = msm8960_video_pools, - .npools = ARRAY_SIZE(msm8960_video_pools), - }, - [CAMERA_DOMAIN] = { - .iova_pools = msm8960_camera_pools, - .npools = ARRAY_SIZE(msm8960_camera_pools), - }, - [DISPLAY_READ_DOMAIN] = { - .iova_pools = msm8960_display_read_pools, - .npools = ARRAY_SIZE(msm8960_display_read_pools), - }, - [ROTATOR_SRC_DOMAIN] = { - .iova_pools = msm8960_rotator_src_pools, - .npools = ARRAY_SIZE(msm8960_rotator_src_pools), - }, -}; - -struct iommu_domains_pdata msm8960_iommu_domain_pdata = { - .domains = msm8960_iommu_domains, - .ndomains = ARRAY_SIZE(msm8960_iommu_domains), - .domain_names = msm8960_iommu_ctx_names, - .nnames = ARRAY_SIZE(msm8960_iommu_ctx_names), - .domain_alloc_flags = 0, -}; - -struct platform_device msm8960_iommu_domain_device = { - .name = "iommu_domains", - .id = -1, - .dev = { - .platform_data = &msm8960_iommu_domain_pdata, - } -}; - -struct msm_rtb_platform_data msm8960_rtb_pdata = { - .size = SZ_1M, -}; - -static int __init msm_rtb_set_buffer_size(char *p) -{ - int s; - - s = memparse(p, NULL); - msm8960_rtb_pdata.size = ALIGN(s, SZ_4K); - return 0; -} -early_param("msm_rtb_size", msm_rtb_set_buffer_size); - - -struct platform_device msm8960_rtb_device = { - .name = "msm_rtb", - .id = -1, - .dev = { - .platform_data = &msm8960_rtb_pdata, - }, -}; - -#define MSM_8960_L1_SIZE SZ_1M -/* - * The actual L2 size is smaller but we need a larger buffer - * size to store other dump information - */ -#define MSM_8960_L2_SIZE SZ_4M - -struct msm_cache_dump_platform_data msm8960_cache_dump_pdata = { - .l2_size = MSM_8960_L2_SIZE, - .l1_size = MSM_8960_L1_SIZE, -}; - -struct platform_device msm8960_cache_dump_device = { - .name = "msm_cache_dump", - .id = -1, - .dev = { - .platform_data = &msm8960_cache_dump_pdata, - }, -}; - -#define MDM2AP_ERRFATAL 40 -#define AP2MDM_ERRFATAL 80 -#define MDM2AP_STATUS 24 -#define AP2MDM_STATUS 77 -#define AP2MDM_PMIC_PWR_EN 22 -#define AP2MDM_KPDPWR_N 79 -#define AP2MDM_SOFT_RESET 78 -#define USB_SW 25 - -static struct resource sglte_resources[] = { - { - .start = MDM2AP_ERRFATAL, - .end = MDM2AP_ERRFATAL, - .name = "MDM2AP_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_ERRFATAL, - .end = AP2MDM_ERRFATAL, - .name = "AP2MDM_ERRFATAL", - .flags = IORESOURCE_IO, - }, - { - .start = MDM2AP_STATUS, - .end = MDM2AP_STATUS, - .name = "MDM2AP_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_STATUS, - .end = AP2MDM_STATUS, - .name = "AP2MDM_STATUS", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_PMIC_PWR_EN, - .end = AP2MDM_PMIC_PWR_EN, - .name = "AP2MDM_PMIC_PWR_EN", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_KPDPWR_N, - .end = AP2MDM_KPDPWR_N, - .name = "AP2MDM_KPDPWR_N", - .flags = IORESOURCE_IO, - }, - { - .start = AP2MDM_SOFT_RESET, - .end = AP2MDM_SOFT_RESET, - .name = "AP2MDM_SOFT_RESET", - .flags = IORESOURCE_IO, - }, - { - .start = USB_SW, - .end = USB_SW, - .name = "USB_SW", - .flags = IORESOURCE_IO, - }, -}; - -static struct resource msm_gpio_resources[] = { - { - .start = TLMM_MSM_SUMMARY_IRQ, - .end = TLMM_MSM_SUMMARY_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_gpio_pdata msm8960_gpio_pdata = { - .ngpio = 152, - .direct_connect_irqs = 8, -}; - -struct platform_device msm_gpio_device = { - .name = "msmgpio", - .id = -1, - .num_resources = ARRAY_SIZE(msm_gpio_resources), - .resource = msm_gpio_resources, - .dev.platform_data = &msm8960_gpio_pdata, -}; - -struct platform_device mdm_sglte_device = { - .name = "mdm2_modem", - .id = -1, - .num_resources = ARRAY_SIZE(sglte_resources), - .resource = sglte_resources, -}; - -struct platform_device *msm8960_vidc_device[] __initdata = { - &msm_device_vidc, - &msm_device_vidc_v4l2, -}; - -void __init msm8960_add_vidc_device(void) -{ - if (cpu_is_msm8960ab()) { - struct msm_vidc_platform_data *pdata; - pdata = (struct msm_vidc_platform_data *) - msm_device_vidc.dev.platform_data; - pdata->vidc_bus_client_pdata = &vidc_pro_bus_client_data; - } - platform_add_devices(msm8960_vidc_device, - ARRAY_SIZE(msm8960_vidc_device)); -} diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c deleted file mode 100644 index 4bd70f38603c..000000000000 --- a/arch/arm/mach-msm/devices-9615.c +++ /dev/null @@ -1,1602 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pm.h" -#include "devices.h" -#include -#include -#include "spm.h" -#include "rpm_resources.h" -#include "msm_watchdog.h" -#include "rpm_stats.h" -#include "rpm_log.h" - -/* Address of GSBI blocks */ -#define MSM_GSBI1_PHYS 0x16000000 -#define MSM_GSBI2_PHYS 0x16100000 -#define MSM_GSBI3_PHYS 0x16200000 -#define MSM_GSBI4_PHYS 0x16300000 -#define MSM_GSBI5_PHYS 0x16400000 - -#define MSM_UART4DM_PHYS (MSM_GSBI4_PHYS + 0x40000) - -/* GSBI QUP devices */ -#define MSM_GSBI1_QUP_PHYS (MSM_GSBI1_PHYS + 0x80000) -#define MSM_GSBI2_QUP_PHYS (MSM_GSBI2_PHYS + 0x80000) -#define MSM_GSBI3_QUP_PHYS (MSM_GSBI3_PHYS + 0x80000) -#define MSM_GSBI4_QUP_PHYS (MSM_GSBI4_PHYS + 0x80000) -#define MSM_GSBI5_QUP_PHYS (MSM_GSBI5_PHYS + 0x80000) -#define MSM_QUP_SIZE SZ_4K - -/* Address of SSBI CMD */ -#define MSM_PMIC1_SSBI_CMD_PHYS 0x00500000 -#define MSM_PMIC_SSBI_SIZE SZ_4K - -#define MSM_GPIO_I2C_CLK 16 -#define MSM_GPIO_I2C_SDA 17 -#define MSM9615_RPM_MASTER_STATS_BASE 0x10A700 - -static struct msm_watchdog_pdata msm_watchdog_pdata = { - .pet_time = 10000, - .bark_time = 11000, - .has_secure = false, - .use_kernel_fiq = true, - .base = MSM_TMR_BASE + WDT0_OFFSET, -}; - -static struct resource msm_watchdog_resources[] = { - { - .start = WDT0_ACCSCSSNBARK_INT, - .end = WDT0_ACCSCSSNBARK_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm9615_device_watchdog = { - .name = "msm_watchdog", - .id = -1, - .dev = { - .platform_data = &msm_watchdog_pdata, - }, - .num_resources = ARRAY_SIZE(msm_watchdog_resources), - .resource = msm_watchdog_resources, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = ADM_0_SCSS_1_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x18320000, - .end = 0x18320000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 1, - .sd_size = 0x800, -}; - -struct platform_device msm9615_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -struct platform_device msm9615_device_acpuclk = { - .name = "acpuclk-9615", - .id = -1, -}; - -#define MSM_USB_BAM_BASE 0x12502000 -#define MSM_USB_BAM_SIZE SZ_16K -#define MSM_HSIC_BAM_BASE 0x12542000 -#define MSM_HSIC_BAM_SIZE SZ_16K - -static struct resource resources_otg[] = { - { - .start = MSM9615_HSUSB_PHYS, - .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_HSUSB_RESUME_GPIO 79 - -static struct resource resources_hsusb[] = { - { - .start = MSM9615_HSUSB_PHYS, - .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_HSUSB_RESUME_GPIO, - .end = MSM_HSUSB_RESUME_GPIO, - .name = "USB_RESUME", - .flags = IORESOURCE_IO, - }, -}; - -static struct resource resources_usb_bam[] = { - { - .name = "hsusb", - .start = MSM_USB_BAM_BASE, - .end = MSM_USB_BAM_BASE + MSM_USB_BAM_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "hsusb", - .start = USB1_HS_BAM_IRQ, - .end = USB1_HS_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "hsic", - .start = MSM_HSIC_BAM_BASE, - .end = MSM_HSIC_BAM_BASE + MSM_HSIC_BAM_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "hsic", - .start = USB_HSIC_BAM_IRQ, - .end = USB_HSIC_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_usb_bam = { - .name = "usb_bam", - .id = -1, - .num_resources = ARRAY_SIZE(resources_usb_bam), - .resource = resources_usb_bam, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb), - .resource = resources_hsusb, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_hsic_peripheral[] = { - { - .start = MSM9615_HSIC_PHYS, - .end = MSM9615_HSIC_PHYS + MSM9615_HSIC_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB_HSIC_IRQ, - .end = USB_HSIC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsic_peripheral = { - .name = "msm_hsic_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsic_peripheral), - .resource = resources_hsic_peripheral, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM9615_HSUSB_PHYS, - .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_PHYS - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_hsic_host[] = { - { - .start = MSM9615_HSIC_PHYS, - .end = MSM9615_HSIC_PHYS + MSM9615_HSIC_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB_HSIC_IRQ, - .end = USB_HSIC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsic_host = { - .name = "msm_hsic_host", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsic_host), - .resource = resources_hsic_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_uart_gsbi4[] = { - { - .start = GSBI4_UARTDM_IRQ, - .end = GSBI4_UARTDM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART4DM_PHYS, - .end = MSM_UART4DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_GSBI4_PHYS, - .end = MSM_GSBI4_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm9615_device_uart_gsbi4 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart_gsbi4), - .resource = resources_uart_gsbi4, -}; - -static struct resource resources_qup_i2c_gsbi5[] = { - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI5_PHYS, - .end = MSM_GSBI5_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_phys_addr", - .start = MSM_GSBI5_QUP_PHYS, - .end = MSM_GSBI5_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI5_QUP_IRQ, - .end = GSBI5_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = MSM_GPIO_I2C_CLK, - .end = MSM_GPIO_I2C_CLK, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = MSM_GPIO_I2C_SDA, - .end = MSM_GPIO_I2C_SDA, - .flags = IORESOURCE_IO, - - }, -}; - -struct platform_device msm9615_device_qup_i2c_gsbi5 = { - .name = "qup_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi5), - .resource = resources_qup_i2c_gsbi5, -}; - -static struct resource resources_qup_spi_gsbi3[] = { - { - .name = "spi_base", - .start = MSM_GSBI3_QUP_PHYS, - .end = MSM_GSBI3_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = GSBI3_QUP_IRQ, - .end = GSBI3_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm9615_device_qup_spi_gsbi3 = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(resources_qup_spi_gsbi3), - .resource = resources_qup_spi_gsbi3, -}; - -#define LPASS_SLIMBUS_PHYS 0x28080000 -#define LPASS_SLIMBUS_BAM_PHYS 0x28084000 -#define LPASS_SLIMBUS_SLEW (MSM9615_TLMM_PHYS + 0x207C) -/* Board info for the slimbus slave device */ -static struct resource slimbus_res[] = { - { - .start = LPASS_SLIMBUS_PHYS, - .end = LPASS_SLIMBUS_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_physical", - }, - { - .start = LPASS_SLIMBUS_BAM_PHYS, - .end = LPASS_SLIMBUS_BAM_PHYS + 8191, - .flags = IORESOURCE_MEM, - .name = "slimbus_bam_physical", - }, - { - .start = LPASS_SLIMBUS_SLEW, - .end = LPASS_SLIMBUS_SLEW + 4 - 1, - .flags = IORESOURCE_MEM, - .name = "slimbus_slew_reg", - }, - { - .start = SLIMBUS0_CORE_EE1_IRQ, - .end = SLIMBUS0_CORE_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_irq", - }, - { - .start = SLIMBUS0_BAM_EE1_IRQ, - .end = SLIMBUS0_BAM_EE1_IRQ, - .flags = IORESOURCE_IRQ, - .name = "slimbus_bam_irq", - }, -}; - -struct platform_device msm9615_slim_ctrl = { - .name = "msm_slim_ctrl", - .id = 1, - .num_resources = ARRAY_SIZE(slimbus_res), - .resource = slimbus_res, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_pcm = { - .name = "msm-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_multi_ch_pcm = { - .name = "msm-multi-ch-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_pcm_routing = { - .name = "msm-pcm-routing", - .id = -1, -}; - -struct platform_device msm_cpudai0 = { - .name = "msm-dai-q6", - .id = 0x4000, -}; - -struct platform_device msm_cpudai1 = { - .name = "msm-dai-q6", - .id = 0x4001, -}; - -struct platform_device msm_cpudai_bt_rx = { - .name = "msm-dai-q6", - .id = 0x3000, -}; - -struct platform_device msm_cpudai_bt_tx = { - .name = "msm-dai-q6", - .id = 0x3001, -}; - -/* - * Machine specific data for AUX PCM Interface - * which the driver will be unware of. - */ -struct msm_dai_auxpcm_pdata auxpcm_pdata = { - .clk = "pcm_clk", - .mode_8k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 2048000, - }, - .mode_16k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 4096000, - } -}; - -struct platform_device msm_cpudai_auxpcm_rx = { - .name = "msm-dai-q6", - .id = 2, - .dev = { - .platform_data = &auxpcm_pdata, - }, -}; - -struct platform_device msm_cpudai_auxpcm_tx = { - .name = "msm-dai-q6", - .id = 3, - .dev = { - .platform_data = &auxpcm_pdata, - }, -}; - -struct msm_dai_auxpcm_pdata sec_auxpcm_pdata = { - .clk = "sec_pcm_clk", - .mode_8k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 2048000, - }, - .mode_16k = { - .mode = AFE_PCM_CFG_MODE_PCM, - .sync = AFE_PCM_CFG_SYNC_INT, - .frame = AFE_PCM_CFG_FRM_256BPF, - .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD, - .slot = 0, - .data = AFE_PCM_CFG_CDATAOE_MASTER, - .pcm_clk_rate = 4096000, - } -}; - -struct platform_device msm_cpudai_sec_auxpcm_rx = { - .name = "msm-dai-q6", - .id = 12, - .dev = { - .platform_data = &sec_auxpcm_pdata, - }, -}; - -struct platform_device msm_cpudai_sec_auxpcm_tx = { - .name = "msm-dai-q6", - .id = 13, - .dev = { - .platform_data = &sec_auxpcm_pdata, - }, -}; - -struct platform_device msm_cpu_fe = { - .name = "msm-dai-fe", - .id = -1, -}; - -struct platform_device msm_stub_codec = { - .name = "msm-stub-codec", - .id = 1, -}; - -struct platform_device msm_voice = { - .name = "msm-pcm-voice", - .id = -1, -}; - -struct platform_device msm_cpudai_incall_music_rx = { - .name = "msm-dai-q6", - .id = 0x8005, -}; - -struct platform_device msm_cpudai_incall_record_rx = { - .name = "msm-dai-q6", - .id = 0x8004, -}; - -struct platform_device msm_cpudai_incall_record_tx = { - .name = "msm-dai-q6", - .id = 0x8003, -}; - -struct platform_device msm_i2s_cpudai0 = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_RX, -}; - -struct platform_device msm_i2s_cpudai1 = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_TX, -}; -struct platform_device msm_i2s_cpudai4 = { - .name = "msm-dai-q6", - .id = SECONDARY_I2S_RX, -}; - -struct platform_device msm_i2s_cpudai5 = { - .name = "msm-dai-q6", - .id = SECONDARY_I2S_TX, -}; -struct platform_device msm_voip = { - .name = "msm-voip-dsp", - .id = -1, -}; -struct platform_device msm_cpudai_stub = { - .name = "msm-dai-stub", - .id = -1, -}; -struct platform_device msm_dtmf = { - .name = "msm-pcm-dtmf", - .id = -1, -}; -struct platform_device msm_host_pcm_voice = { - .name = "msm-host-pcm-voice", - .id = -1, -}; -struct platform_device msm_compr_dsp = { - .name = "msm-compr-dsp", - .id = -1, -}; - -struct platform_device msm_pcm_hostless = { - .name = "msm-pcm-hostless", - .id = -1, -}; - -struct platform_device msm_cpudai_afe_01_rx = { - .name = "msm-dai-q6", - .id = 0xE0, -}; - -struct platform_device msm_cpudai_afe_01_tx = { - .name = "msm-dai-q6", - .id = 0xF0, -}; - -struct platform_device msm_cpudai_afe_02_rx = { - .name = "msm-dai-q6", - .id = 0xF1, -}; - -struct platform_device msm_cpudai_afe_02_tx = { - .name = "msm-dai-q6", - .id = 0xE1, -}; - -struct platform_device msm_pcm_afe = { - .name = "msm-pcm-afe", - .id = -1, -}; - -static struct resource resources_ssbi_pmic1[] = { - { - .start = MSM_PMIC1_SSBI_CMD_PHYS, - .end = MSM_PMIC1_SSBI_CMD_PHYS + MSM_PMIC_SSBI_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm9615_device_ssbi_pmic1 = { - .name = "msm_ssbi", - .id = 0, - .resource = resources_ssbi_pmic1, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic1), -}; - -static struct resource resources_sps[] = { - { - .name = "pipe_mem", - .start = 0x12800000, - .end = 0x12800000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_dma", - .start = 0x12240000, - .end = 0x12240000 + 0x1000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_bam", - .start = 0x12244000, - .end = 0x12244000 + 0x4000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bamdma_irq", - .start = SPS_BAM_DMA_IRQ, - .end = SPS_BAM_DMA_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_sps_platform_data msm_sps_pdata = { - .bamdma_restricted_pipes = 0x06, -}; - -struct platform_device msm_device_sps = { - .name = "msm_sps", - .id = -1, - .num_resources = ARRAY_SIZE(resources_sps), - .resource = resources_sps, - .dev.platform_data = &msm_sps_pdata, -}; - -#define MSM_NAND_PHYS 0x1B400000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, -}; - -struct flash_platform_data msm_nand_data = { - .version = VERSION_2, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -struct platform_device msm_device_bam_dmux = { - .name = "BAM_RMNT", - .id = -1, -}; - -static struct resource msm_9615_q6_lpass_resources[] = { - { - .start = LPASS_Q6SS_WDOG_EXPIRED, - .end = LPASS_Q6SS_WDOG_EXPIRED, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_9615_q6_lpass = { - .name = "pil-q6v4-lpass", - .id = -1, - .num_resources = ARRAY_SIZE(msm_9615_q6_lpass_resources), - .resource = msm_9615_q6_lpass_resources, -}; - -static struct resource msm_9615_q6_mss_resources[] = { - { - .start = Q6FW_WDOG_EXPIRED_IRQ, - .end = Q6FW_WDOG_EXPIRED_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = Q6SW_WDOG_EXPIRED_IRQ, - .end = Q6SW_WDOG_EXPIRED_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_9615_q6_mss = { - .name = "pil-q6v4-modem", - .id = -1, - .num_resources = ARRAY_SIZE(msm_9615_q6_mss_resources), - .resource = msm_9615_q6_mss_resources, -}; - -#ifdef CONFIG_HW_RANDOM_MSM -/* PRNG device */ -#define MSM_PRNG_PHYS 0x1A500000 -static struct resource rng_resources = { - .flags = IORESOURCE_MEM, - .start = MSM_PRNG_PHYS, - .end = MSM_PRNG_PHYS + SZ_512 - 1, -}; - -struct platform_device msm_device_rng = { - .name = "msm_rng", - .id = 0, - .num_resources = 1, - .resource = &rng_resources, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -#define QCE_SIZE 0x10000 -#define QCE_0_BASE 0x18500000 - -#define QCE_HW_KEY_SUPPORT 0 -#define QCE_SHA_HMAC_SUPPORT 1 -#define QCE_SHARE_CE_RESOURCE 1 -#define QCE_CE_SHARED 0 - -static struct resource qcrypto_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource qcedev_resources[] = { - [0] = { - .start = QCE_0_BASE, - .end = QCE_0_BASE + QCE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .name = "crypto_channels", - .start = DMOV_CE_IN_CHAN, - .end = DMOV_CE_OUT_CHAN, - .flags = IORESOURCE_DMA, - }, - [2] = { - .name = "crypto_crci_in", - .start = DMOV_CE_IN_CRCI, - .end = DMOV_CE_IN_CRCI, - .flags = IORESOURCE_DMA, - }, - [3] = { - .name = "crypto_crci_out", - .start = DMOV_CE_OUT_CRCI, - .end = DMOV_CE_OUT_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \ - defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) - -static struct msm_ce_hw_support qcrypto_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -struct platform_device msm9615_qcrypto_device = { - .name = "qcrypto", - .id = 0, - .num_resources = ARRAY_SIZE(qcrypto_resources), - .resource = qcrypto_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcrypto_ce_hw_suppport, - }, -}; -#endif - -#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \ - defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE) - -static struct msm_ce_hw_support qcedev_ce_hw_suppport = { - .ce_shared = QCE_CE_SHARED, - .shared_ce_resource = QCE_SHARE_CE_RESOURCE, - .hw_key_support = QCE_HW_KEY_SUPPORT, - .sha_hmac = QCE_SHA_HMAC_SUPPORT, - .bus_scale_table = NULL, -}; - -struct platform_device msm9615_qcedev_device = { - .name = "qce", - .id = 0, - .num_resources = ARRAY_SIZE(qcedev_resources), - .resource = qcedev_resources, - .dev = { - .coherent_dma_mask = DMA_BIT_MASK(32), - .platform_data = &qcedev_ce_hw_suppport, - }, -}; -#endif - -#define MSM_SDC1_BASE 0x12180000 -#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800) -#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000) -#define MSM_SDC2_BASE 0x12140000 -#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800) -#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000) - -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC1_IRQ_0, - .end = SDC1_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC1_DML_BASE, - .end = MSM_SDC1_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC1_BAM_BASE, - .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC1_BAM_IRQ, - .end = SDC1_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .flags = IORESOURCE_MEM, - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_DML_BASE - 1, - }, - { - .name = "core_irq", - .flags = IORESOURCE_IRQ, - .start = SDC2_IRQ_0, - .end = SDC2_IRQ_0 - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC2_DML_BASE, - .end = MSM_SDC2_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC2_BAM_BASE, - .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC2_BAM_IRQ, - .end = SDC2_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#endif -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 2) - return -EINVAL; - - pdev = msm_sdcc_devices[controller - 1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#ifdef CONFIG_FB_MSM_EBI2 -static struct resource msm_ebi2_lcdc_resources[] = { - { - .name = "base", - .start = 0x1B300000, - .end = 0x1B300000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x1FC00000, - .end = 0x1FC00000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_ebi2_lcdc_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcdc_resources), - .resource = msm_ebi2_lcdc_resources, -}; -#endif - -#ifdef CONFIG_CACHE_L2X0 -static int __init l2x0_cache_init(void) -{ - int aux_ctrl = 0; - - /* Way Size 010(0x2) 32KB */ - aux_ctrl = (0x1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) | \ - (0x2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) | \ - (0x1 << L2X0_AUX_CTRL_EVNT_MON_BUS_EN_SHIFT); - - /* L2 Latency setting required by hardware. Default is 0x20 - which is no good. - */ - writel_relaxed(0x220, MSM_L2CC_BASE + L2X0_DATA_LATENCY_CTRL); - l2x0_init(MSM_L2CC_BASE, aux_ctrl, L2X0_AUX_CTRL_MASK); - - return 0; -} -#else -static int __init l2x0_cache_init(void){ return 0; } -#endif - -struct msm_rpm_platform_data msm9615_rpm_data __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(9615, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4), - MSM_RPM_MAP(9615, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4), - MSM_RPM_MAP(9615, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(9615, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(9615, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(9615, RPM_CTL, RPM_CTL, 1), - MSM_RPM_MAP(9615, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(9615, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(9615, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(9615, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(9615, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(9615, EBI1_CLK, EBI1_CLK, 1), - MSM_RPM_MAP(9615, SYS_FABRIC_CFG_HALT_0, - SYS_FABRIC_CFG_HALT, 2), - MSM_RPM_MAP(9615, SYS_FABRIC_CFG_CLKMOD_0, - SYS_FABRIC_CFG_CLKMOD, 3), - MSM_RPM_MAP(9615, SYS_FABRIC_CFG_IOCTL, - SYS_FABRIC_CFG_IOCTL, 1), - MSM_RPM_MAP(9615, SYSTEM_FABRIC_ARB_0, - SYSTEM_FABRIC_ARB, 27), - MSM_RPM_MAP(9615, PM8018_S1_0, PM8018_S1, 2), - MSM_RPM_MAP(9615, PM8018_S2_0, PM8018_S2, 2), - MSM_RPM_MAP(9615, PM8018_S3_0, PM8018_S3, 2), - MSM_RPM_MAP(9615, PM8018_S4_0, PM8018_S4, 2), - MSM_RPM_MAP(9615, PM8018_S5_0, PM8018_S5, 2), - MSM_RPM_MAP(9615, PM8018_L1_0, PM8018_L1, 2), - MSM_RPM_MAP(9615, PM8018_L2_0, PM8018_L2, 2), - MSM_RPM_MAP(9615, PM8018_L3_0, PM8018_L3, 2), - MSM_RPM_MAP(9615, PM8018_L4_0, PM8018_L4, 2), - MSM_RPM_MAP(9615, PM8018_L5_0, PM8018_L5, 2), - MSM_RPM_MAP(9615, PM8018_L6_0, PM8018_L6, 2), - MSM_RPM_MAP(9615, PM8018_L7_0, PM8018_L7, 2), - MSM_RPM_MAP(9615, PM8018_L8_0, PM8018_L8, 2), - MSM_RPM_MAP(9615, PM8018_L9_0, PM8018_L9, 2), - MSM_RPM_MAP(9615, PM8018_L10_0, PM8018_L10, 2), - MSM_RPM_MAP(9615, PM8018_L11_0, PM8018_L11, 2), - MSM_RPM_MAP(9615, PM8018_L12_0, PM8018_L12, 2), - MSM_RPM_MAP(9615, PM8018_L13_0, PM8018_L13, 2), - MSM_RPM_MAP(9615, PM8018_L14_0, PM8018_L14, 2), - MSM_RPM_MAP(9615, PM8018_LVS1, PM8018_LVS1, 1), - MSM_RPM_MAP(9615, NCP_0, NCP, 2), - MSM_RPM_MAP(9615, CXO_BUFFERS, CXO_BUFFERS, 1), - MSM_RPM_MAP(9615, USB_OTG_SWITCH, USB_OTG_SWITCH, 1), - MSM_RPM_MAP(9615, HDMI_SWITCH, HDMI_SWITCH, 1), - MSM_RPM_MAP(9615, VOLTAGE_CORNER, VOLTAGE_CORNER, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(9615, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(9615, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(9615, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(9615, RESERVED_SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(9615, SEQUENCE), - MSM_RPM_STATUS_ID_MAP(9615, RPM_CTL), - MSM_RPM_STATUS_ID_MAP(9615, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(9615, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(9615, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(9615, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(9615, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(9615, EBI1_CLK), - MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_HALT), - MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_CLKMOD), - MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_IOCTL), - MSM_RPM_STATUS_ID_MAP(9615, SYSTEM_FABRIC_ARB), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S1_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S1_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S2_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S2_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S3_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S3_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S4_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S4_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S5_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_S5_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L1_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L1_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L2_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L2_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L3_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L3_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L4_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L4_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L5_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L5_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L6_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L6_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L7_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L7_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L8_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L8_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L9_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L9_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L10_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L10_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L11_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L11_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L12_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L12_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L13_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L13_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L14_0), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_L14_1), - MSM_RPM_STATUS_ID_MAP(9615, PM8018_LVS1), - MSM_RPM_STATUS_ID_MAP(9615, NCP_0), - MSM_RPM_STATUS_ID_MAP(9615, NCP_1), - MSM_RPM_STATUS_ID_MAP(9615, CXO_BUFFERS), - MSM_RPM_STATUS_ID_MAP(9615, USB_OTG_SWITCH), - MSM_RPM_STATUS_ID_MAP(9615, HDMI_SWITCH), - MSM_RPM_STATUS_ID_MAP(9615, VOLTAGE_CORNER), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(9615, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(9615, VERSION_MINOR), - MSM_RPM_CTRL_MAP(9615, VERSION_BUILD), - MSM_RPM_CTRL_MAP(9615, REQ_CTX_0), - MSM_RPM_CTRL_MAP(9615, REQ_SEL_0), - MSM_RPM_CTRL_MAP(9615, ACK_CTX_0), - MSM_RPM_CTRL_MAP(9615, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_9615_SEL_INVALIDATE, - .sel_notification = MSM_RPM_9615_SEL_NOTIFICATION, - .sel_last = MSM_RPM_9615_SEL_LAST, - .ver = {3, 0, 0}, -}; - -struct platform_device msm9615_rpm_device = { - .name = "msm_rpm", - .id = -1, -}; - -static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = { - [4] = MSM_GPIO_TO_INT(30), - [5] = MSM_GPIO_TO_INT(59), - [6] = MSM_GPIO_TO_INT(81), - [7] = MSM_GPIO_TO_INT(87), - [8] = MSM_GPIO_TO_INT(86), - [9] = MSM_GPIO_TO_INT(2), - [10] = MSM_GPIO_TO_INT(6), - [11] = MSM_GPIO_TO_INT(10), - [12] = MSM_GPIO_TO_INT(14), - [13] = MSM_GPIO_TO_INT(18), - [14] = MSM_GPIO_TO_INT(7), - [15] = MSM_GPIO_TO_INT(11), - [16] = MSM_GPIO_TO_INT(15), - [19] = MSM_GPIO_TO_INT(26), - [20] = MSM_GPIO_TO_INT(28), - [22] = USB_HSIC_IRQ, - [23] = MSM_GPIO_TO_INT(19), - [24] = MSM_GPIO_TO_INT(23), - [26] = MSM_GPIO_TO_INT(3), - [27] = MSM_GPIO_TO_INT(68), - [29] = MSM_GPIO_TO_INT(78), - [31] = MSM_GPIO_TO_INT(0), - [32] = MSM_GPIO_TO_INT(4), - [33] = MSM_GPIO_TO_INT(22), - [34] = MSM_GPIO_TO_INT(17), - [37] = MSM_GPIO_TO_INT(20), - [39] = MSM_GPIO_TO_INT(84), - [40] = USB1_HS_IRQ, - [42] = MSM_GPIO_TO_INT(24), - [43] = MSM_GPIO_TO_INT(79), - [44] = MSM_GPIO_TO_INT(80), - [45] = MSM_GPIO_TO_INT(82), - [46] = MSM_GPIO_TO_INT(85), - [47] = MSM_GPIO_TO_INT(45), - [48] = MSM_GPIO_TO_INT(50), - [49] = MSM_GPIO_TO_INT(51), - [50] = MSM_GPIO_TO_INT(69), - [51] = MSM_GPIO_TO_INT(77), - [52] = MSM_GPIO_TO_INT(1), - [53] = MSM_GPIO_TO_INT(5), - [54] = MSM_GPIO_TO_INT(40), - [55] = MSM_GPIO_TO_INT(27), -}; - -static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = { - TLMM_MSM_SUMMARY_IRQ, - RPM_APCC_CPU0_GP_HIGH_IRQ, - RPM_APCC_CPU0_GP_MEDIUM_IRQ, - RPM_APCC_CPU0_GP_LOW_IRQ, - RPM_APCC_CPU0_WAKE_UP_IRQ, - MSS_TO_APPS_IRQ_0, - MSS_TO_APPS_IRQ_1, - LPASS_SCSS_GP_LOW_IRQ, - LPASS_SCSS_GP_MEDIUM_IRQ, - LPASS_SCSS_GP_HIGH_IRQ, - SPS_MTI_31, - A2_BAM_IRQ, - USB1_HS_BAM_IRQ, -}; - -struct msm_mpm_device_data msm9615_mpm_dev_data __initdata = { - .irqs_m2a = msm_mpm_irqs_m2a, - .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a), - .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs, - .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs), - .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8, - .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8, - .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008, - .mpm_apps_ipc_val = BIT(1), - .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ, -}; - -static uint8_t spm_wfi_cmd_sequence[] __initdata = { - 0x00, 0x03, 0x00, 0x0f, -}; - -static uint8_t spm_power_collapse_without_rpm[] __initdata = { - 0x34, 0x24, 0x14, 0x04, - 0x54, 0x03, 0x54, 0x04, - 0x14, 0x24, 0x3e, 0x0f, -}; - -static uint8_t spm_power_collapse_with_rpm[] __initdata = { - 0x34, 0x24, 0x14, 0x04, - 0x54, 0x07, 0x54, 0x04, - 0x14, 0x24, 0x3e, 0x0f, -}; - -static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_power_collapse_without_rpm, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = true, - .cmd = spm_power_collapse_with_rpm, - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1001, - .num_modes = ARRAY_SIZE(msm_spm_seq_list), - .modes = msm_spm_seq_list, - }, -}; - -static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = { - { - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 100, 8000, 100000, 1, - }, - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - true, - 2000, 5000, 60100000, 3000, - }, - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE), - false, - 6300, 5000, 60350000, 3500, - }, - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE), - false, - 13300, 2000, 71850000, 6800, - }, - { - MSM_PM_SLEEP_MODE_POWER_COLLAPSE, - MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW), - false, - 28300, 0, 76350000, 9800, - }, -}; - -static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = { - .levels = &msm_rpmrs_levels[0], - .num_levels = ARRAY_SIZE(msm_rpmrs_levels), - .vdd_mem_levels = { - [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000, - [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000, - [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000, - [MSM_RPMRS_VDD_MEM_MAX] = 1150000, - }, - .vdd_dig_levels = { - [MSM_RPMRS_VDD_DIG_RET_LOW] = 0, - [MSM_RPMRS_VDD_DIG_RET_HIGH] = 0, - [MSM_RPMRS_VDD_DIG_ACTIVE] = 1, - [MSM_RPMRS_VDD_DIG_MAX] = 3, - }, - .vdd_mask = 0x7FFFFF, - .rpmrs_target_id = { - [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_CXO_CLK, - [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_VOLTAGE_CORNER, - [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_LAST, - [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8018_L9_0, - [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8018_L9_1, - [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL, - }, -}; - -static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = { - .version = 1, -}; - - -static struct resource msm_rpm_stat_resource[] = { - { - .start = 0x0010DD04, - .end = 0x0010DD04 + SZ_256, - .flags = IORESOURCE_MEM, - .name = "phys_addr_base" - }, -}; - - - -struct platform_device msm9615_rpm_stat_device = { - .name = "msm_rpm_stat", - .id = -1, - .resource = msm_rpm_stat_resource, - .num_resources = ARRAY_SIZE(msm_rpm_stat_resource), - .dev = { - .platform_data = &msm_rpm_stat_pdata, - } -}; - -static struct resource resources_rpm_master_stats[] = { - { - .start = MSM9615_RPM_MASTER_STATS_BASE, - .end = MSM9615_RPM_MASTER_STATS_BASE + SZ_256, - .flags = IORESOURCE_MEM, - }, -}; - -static char *master_names[] = { - "KPSS", - "MPSS", - "LPASS", -}; - -static struct msm_rpm_master_stats_platform_data msm_rpm_master_stat_pdata = { - .masters = master_names, - .num_masters = ARRAY_SIZE(master_names), - .master_offset = 32, -}; - -struct platform_device msm9615_rpm_master_stat_device = { - .name = "msm_rpm_master_stats", - .id = -1, - .num_resources = ARRAY_SIZE(resources_rpm_master_stats), - .resource = resources_rpm_master_stats, - .dev = { - .platform_data = &msm_rpm_master_stat_pdata, - }, -}; - -static struct msm_rpm_log_platform_data msm_rpm_log_pdata = { - .phys_addr_base = 0x0010AC00, - .reg_offsets = { - [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080, - [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0, - }, - .phys_size = SZ_8K, - .log_len = 4096, /* log's buffer length in bytes */ - .log_len_mask = (4096 >> 2) - 1, /* length mask in units of u32 */ -}; - -struct platform_device msm9615_rpm_log_device = { - .name = "msm_rpm_log", - .id = -1, - .dev = { - .platform_data = &msm_rpm_log_pdata, - }, -}; - -static struct msm_pm_init_data_type msm_pm_data = { - .use_sync_timer = false, - .pc_mode = MSM_PM_PC_NOTZ_L2_EXT, -}; - -struct platform_device msm9615_pm_8x60 = { - .name = "pm-8x60", - .id = -1, - .dev = { - .platform_data = &msm_pm_data, - }, -}; - -uint32_t __init msm9615_rpm_get_swfi_latency(void) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(msm_rpmrs_levels); i++) { - if (msm_rpmrs_levels[i].sleep_mode == - MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT) - return msm_rpmrs_levels[i].latency_us; - } - return 0; -} - -struct android_usb_platform_data msm_android_usb_pdata = { - .usb_core_id = 0, -}; - -struct platform_device msm_android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &msm_android_usb_pdata, - }, -}; - -struct android_usb_platform_data msm_android_usb_hsic_pdata = { - .usb_core_id = 1, -}; - -struct platform_device msm_android_usb_hsic_device = { - .name = "android_usb_hsic", - .id = -1, - .dev = { - .platform_data = &msm_android_usb_hsic_pdata, - }, -}; - -static struct resource msm_gpio_resources[] = { - { - .start = TLMM_MSM_SUMMARY_IRQ, - .end = TLMM_MSM_SUMMARY_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_gpio_pdata msm9615_gpio_pdata = { - .ngpio = 88, - .direct_connect_irqs = 8, -}; - -struct platform_device msm_gpio_device = { - .name = "msmgpio", - .id = -1, - .num_resources = ARRAY_SIZE(msm_gpio_resources), - .resource = msm_gpio_resources, - .dev.platform_data = &msm9615_gpio_pdata, -}; - -void __init msm9615_device_init(void) -{ - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); - BUG_ON(msm_rpm_init(&msm9615_rpm_data)); - BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data)); - msm_android_usb_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; - msm_android_usb_hsic_pdata.swfi_latency = - msm_rpmrs_levels[0].latency_us; -} - -#define MSM_SHARED_RAM_PHYS 0x40000000 -void __init msm9615_map_io(void) -{ - msm_shared_ram_phys = MSM_SHARED_RAM_PHYS; - msm_map_msm9615_io(); - l2x0_cache_init(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); -} - -void __init msm9615_init_irq(void) -{ - struct msm_mpm_device_data *data = NULL; - -#ifdef CONFIG_MSM_MPM - data = &msm9615_mpm_dev_data; -#endif - - msm_mpm_irq_extn_init(data); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, - (void *)MSM_QGIC_CPU_BASE); -} - -struct platform_device msm_bus_9615_sys_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM, -}; - -struct platform_device msm_bus_def_fab = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_DEFAULT, -}; - -#ifdef CONFIG_FB_MSM_EBI2 -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcdc_device, data); - else - pr_err("%s: unknown device! %s\n", __func__, name); -} -#endif diff --git a/arch/arm/mach-msm/devices-fsm9xxx.c b/arch/arm/mach-msm/devices-fsm9xxx.c deleted file mode 100644 index c55b7e376bcb..000000000000 --- a/arch/arm/mach-msm/devices-fsm9xxx.c +++ /dev/null @@ -1,443 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include - -#include -#include -#include -#include -#include - -#include "devices.h" -#include "smd_private.h" -#include "clock-local.h" -#include "msm_watchdog.h" - -#include -#include - -/* - * UARTs - */ - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1_PHYS, - .end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2_PHYS, - .end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3_PHYS, - .end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_uim", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -/* - * SSBIs - */ - -#ifdef CONFIG_MSM_SSBI -#define MSM_SSBI1_PHYS 0x94080000 -#define MSM_SSBI_PMIC1_PHYS MSM_SSBI1_PHYS -static struct resource msm_ssbi_pmic1_resources[] = { - { - .start = MSM_SSBI_PMIC1_PHYS, - .end = MSM_SSBI_PMIC1_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi_pmic1 = { - .name = "msm_ssbi", - .id = 0, - .resource = msm_ssbi_pmic1_resources, - .num_resources = ARRAY_SIZE(msm_ssbi_pmic1_resources), -}; -#endif - -#ifdef CONFIG_I2C_SSBI -#define MSM_SSBI2_PHYS 0x94090000 -#define MSM_SSBI2_SIZE SZ_4K - -static struct resource msm_ssbi2_resources[] = { - { - .name = "ssbi_base", - .start = MSM_SSBI2_PHYS, - .end = MSM_SSBI2_PHYS + MSM_SSBI2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi2 = { - .name = "i2c_ssbi", - .id = 1, - .num_resources = ARRAY_SIZE(msm_ssbi2_resources), - .resource = msm_ssbi2_resources, -}; - -#define MSM_SSBI3_PHYS 0x940c0000 -#define MSM_SSBI3_SIZE SZ_4K - -static struct resource msm_ssbi3_resources[] = { - { - .name = "ssbi_base", - .start = MSM_SSBI3_PHYS, - .end = MSM_SSBI3_PHYS + MSM_SSBI3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi3 = { - .name = "i2c_ssbi", - .id = 2, - .num_resources = ARRAY_SIZE(msm_ssbi3_resources), - .resource = msm_ssbi3_resources, -}; - -#endif /* CONFIG_I2C_SSBI */ - -/* - * GSBI - */ - -#ifdef CONFIG_I2C_QUP - -#define MSM_GSBI1_PHYS 0x81200000 -#define MSM_GSBI1_QUP_PHYS 0x81a00000 - -static struct resource gsbi1_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = INT_GSBI_QUP_ERROR, - .end = INT_GSBI_QUP_ERROR, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_gsbi1_qup_i2c_device = { - .name = "qup_i2c", - .id = 3, - .num_resources = ARRAY_SIZE(gsbi1_qup_i2c_resources), - .resource = gsbi1_qup_i2c_resources, -}; - -#endif /* CONFIG_I2C_QUP */ - -/* - * NAND - */ - -#define MSM_NAND_PHYS 0x81600000 -#define MSM_NAND_SIZE SZ_4K -#define MSM_EBI2_CTRL_PHYS 0x81400000 -#define MSM_EBI2_CTRL_SIZE SZ_4K - -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + MSM_NAND_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [3] = { - .name = "ebi2_reg_base", - .start = MSM_EBI2_CTRL_PHYS, - .end = MSM_EBI2_CTRL_PHYS + MSM_EBI2_CTRL_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, - .interleave = 0, - .version = VERSION_2, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -/* - * SMD - */ - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -/* - * ADM - */ - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x94610000, - .end = 0x94610000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -/* - * SDC - */ - -#define MSM_SDC1_PHYS 0x80A00000 -#define MSM_SDC1_SIZE SZ_4K - -static struct resource resources_sdc1[] = { - { - .start = MSM_SDC1_PHYS, - .end = MSM_SDC1_PHYS + MSM_SDC1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller != 1) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -/* - * QFEC - */ - -# define QFEC_MAC_IRQ INT_SBD_IRQ -# define QFEC_MAC_BASE 0x40000000 -# define QFEC_CLK_BASE 0x94020000 - -# define QFEC_MAC_SIZE 0x2000 -# define QFEC_CLK_SIZE 0x18100 - -# define QFEC_MAC_FUSE_BASE 0x80004210 -# define QFEC_MAC_FUSE_SIZE 16 - -static struct resource qfec_resources[] = { - [0] = { - .start = QFEC_MAC_BASE, - .end = QFEC_MAC_BASE + QFEC_MAC_SIZE, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = QFEC_MAC_IRQ, - .end = QFEC_MAC_IRQ, - .flags = IORESOURCE_IRQ, - }, - [2] = { - .start = QFEC_CLK_BASE, - .end = QFEC_CLK_BASE + QFEC_CLK_SIZE, - .flags = IORESOURCE_IO, - }, - [3] = { - .start = QFEC_MAC_FUSE_BASE, - .end = QFEC_MAC_FUSE_BASE + QFEC_MAC_FUSE_SIZE, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device qfec_device = { - .name = "qfec", - .id = 0, - .num_resources = ARRAY_SIZE(qfec_resources), - .resource = qfec_resources, -}; - -/* - * FUSE - */ - -#if defined(CONFIG_QFP_FUSE) - -char fuse_regulator_name[] = "8058_lvs0"; - -struct resource qfp_fuse_resources[] = { - { - .start = MSM_QFP_FUSE_PHYS, - .end = MSM_QFP_FUSE_PHYS + MSM_QFP_FUSE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device fsm_qfp_fuse_device = { - .name = "qfp_fuse_driver", - .id = 0, - .dev = {.platform_data = fuse_regulator_name}, - .num_resources = ARRAY_SIZE(qfp_fuse_resources), - .resource = qfp_fuse_resources, -}; - -#endif - -/* - * XO - */ - -struct platform_device fsm_xo_device = { - .name = "fsm_xo_driver", - .id = -1, -}; - -/* - * Watchdog - */ - -static struct msm_watchdog_pdata fsm_watchdog_pdata = { - .pet_time = 10000, - .bark_time = 11000, - .has_secure = false, - .has_vic = true, - .base = MSM_TMR_BASE + WDT1_OFFSET, -}; - -static struct resource msm_watchdog_resources[] = { - { - .start = INT_WDT1_ACCSCSSBARK, - .end = INT_WDT1_ACCSCSSBARK, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device fsm9xxx_device_watchdog = { - .name = "msm_watchdog", - .id = -1, - .dev = { - .platform_data = &fsm_watchdog_pdata, - }, - .num_resources = ARRAY_SIZE(msm_watchdog_resources), - .resource = msm_watchdog_resources, -}; - diff --git a/arch/arm/mach-msm/devices-iommu.c b/arch/arm/mach-msm/devices-iommu.c deleted file mode 100644 index b91e7feb33bd..000000000000 --- a/arch/arm/mach-msm/devices-iommu.c +++ /dev/null @@ -1,1093 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -static struct resource msm_iommu_jpegd_resources[] = { - { - .start = 0x07300000, - .end = 0x07300000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 98, - .end = 98, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 97, - .end = 97, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_vpe_resources[] = { - { - .start = 0x07400000, - .end = 0x07400000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 84, - .end = 84, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 83, - .end = 83, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_mdp0_resources[] = { - { - .start = 0x07500000, - .end = 0x07500000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 96, - .end = 96, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 95, - .end = 95, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_mdp1_resources[] = { - { - .start = 0x07600000, - .end = 0x07600000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 94, - .end = 94, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 93, - .end = 93, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_rot_resources[] = { - { - .start = 0x07700000, - .end = 0x07700000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 92, - .end = 92, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 91, - .end = 91, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_ijpeg_resources[] = { - { - .start = 0x07800000, - .end = 0x07800000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 100, - .end = 100, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 99, - .end = 99, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_vfe_resources[] = { - { - .start = 0x07900000, - .end = 0x07900000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 86, - .end = 86, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 85, - .end = 85, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_vcodec_a_resources[] = { - { - .start = 0x07A00000, - .end = 0x07A00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 90, - .end = 90, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 89, - .end = 89, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_vcodec_b_resources[] = { - { - .start = 0x07B00000, - .end = 0x07B00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 88, - .end = 88, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 87, - .end = 87, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_gfx3d_resources[] = { - { - .start = 0x07C00000, - .end = 0x07C00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 102, - .end = 102, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 101, - .end = 101, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_gfx3d1_resources[] = { - { - .start = 0x07D00000, - .end = 0x07D00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 243, - .end = 243, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 242, - .end = 242, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_gfx2d0_resources[] = { - { - .start = 0x07D00000, - .end = 0x07D00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 104, - .end = 104, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 103, - .end = 103, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_gfx2d1_resources[] = { - { - .start = 0x07E00000, - .end = 0x07E00000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 243, - .end = 243, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 242, - .end = 242, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_iommu_vcap_resources[] = { - { - .start = 0x07200000, - .end = 0x07200000 + SZ_1M - 1, - .name = "physbase", - .flags = IORESOURCE_MEM, - }, - { - .name = "nonsecure_irq", - .start = 269, - .end = 269, - .flags = IORESOURCE_IRQ, - }, - { - .name = "secure_irq", - .start = 268, - .end = 268, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_iommu_dev jpegd_iommu = { - .name = "jpegd", - .ncb = 2, -}; - -static struct msm_iommu_dev vpe_iommu = { - .name = "vpe", - .ncb = 2, -}; - -static struct msm_iommu_dev mdp0_iommu = { - .name = "mdp0", - .ncb = 2, -}; - -static struct msm_iommu_dev mdp1_iommu = { - .name = "mdp1", - .ncb = 2, -}; - -static struct msm_iommu_dev rot_iommu = { - .name = "rot", - .ncb = 2, -}; - -static struct msm_iommu_dev ijpeg_iommu = { - .name = "ijpeg", - .ncb = 2, -}; - -static struct msm_iommu_dev vfe_iommu = { - .name = "vfe", - .ncb = 2, -}; - -static struct msm_iommu_dev vcodec_a_iommu = { - .name = "vcodec_a", - .ncb = 2, -}; - -static struct msm_iommu_dev vcodec_b_iommu = { - .name = "vcodec_b", - .ncb = 2, -}; - -static struct msm_iommu_dev gfx3d_iommu = { - .name = "gfx3d", - .ncb = 3, - .ttbr_split = 0, -}; - -static struct msm_iommu_dev gfx3d1_iommu = { - .name = "gfx3d1", - .ncb = 3, - .ttbr_split = 0, -}; - -static struct msm_iommu_dev gfx2d0_iommu = { - .name = "gfx2d0", - .ncb = 2, - .ttbr_split = 0, -}; - -static struct msm_iommu_dev gfx2d1_iommu = { - .name = "gfx2d1", - .ncb = 2, - .ttbr_split = 0, -}; - -static struct msm_iommu_dev vcap_iommu = { - .name = "vcap", - .ncb = 2, -}; - -static struct platform_device msm_device_iommu_jpegd = { - .name = "msm_iommu-v0", - .id = 0, - .dev = { - .platform_data = &jpegd_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_jpegd_resources), - .resource = msm_iommu_jpegd_resources, -}; - -static struct platform_device msm_device_iommu_vpe = { - .name = "msm_iommu-v0", - .id = 1, - .dev = { - .platform_data = &vpe_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_vpe_resources), - .resource = msm_iommu_vpe_resources, -}; - -static struct platform_device msm_device_iommu_mdp0 = { - .name = "msm_iommu-v0", - .id = 2, - .dev = { - .platform_data = &mdp0_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_mdp0_resources), - .resource = msm_iommu_mdp0_resources, -}; - -static struct platform_device msm_device_iommu_mdp1 = { - .name = "msm_iommu-v0", - .id = 3, - .dev = { - .platform_data = &mdp1_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_mdp1_resources), - .resource = msm_iommu_mdp1_resources, -}; - -static struct platform_device msm_device_iommu_rot = { - .name = "msm_iommu-v0", - .id = 4, - .dev = { - .platform_data = &rot_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_rot_resources), - .resource = msm_iommu_rot_resources, -}; - -static struct platform_device msm_device_iommu_ijpeg = { - .name = "msm_iommu-v0", - .id = 5, - .dev = { - .platform_data = &ijpeg_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_ijpeg_resources), - .resource = msm_iommu_ijpeg_resources, -}; - -static struct platform_device msm_device_iommu_vfe = { - .name = "msm_iommu-v0", - .id = 6, - .dev = { - .platform_data = &vfe_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_vfe_resources), - .resource = msm_iommu_vfe_resources, -}; - -static struct platform_device msm_device_iommu_vcodec_a = { - .name = "msm_iommu-v0", - .id = 7, - .dev = { - .platform_data = &vcodec_a_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_vcodec_a_resources), - .resource = msm_iommu_vcodec_a_resources, -}; - -static struct platform_device msm_device_iommu_vcodec_b = { - .name = "msm_iommu-v0", - .id = 8, - .dev = { - .platform_data = &vcodec_b_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_vcodec_b_resources), - .resource = msm_iommu_vcodec_b_resources, -}; - -static struct platform_device msm_device_iommu_gfx3d = { - .name = "msm_iommu-v0", - .id = 9, - .dev = { - .platform_data = &gfx3d_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_gfx3d_resources), - .resource = msm_iommu_gfx3d_resources, -}; - -static struct platform_device msm_device_iommu_gfx3d1 = { - .name = "msm_iommu-v0", - .id = 10, - .dev = { - .platform_data = &gfx3d1_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_gfx3d1_resources), - .resource = msm_iommu_gfx3d1_resources, -}; - -static struct platform_device msm_device_iommu_gfx2d0 = { - .name = "msm_iommu-v0", - .id = 10, - .dev = { - .platform_data = &gfx2d0_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_gfx2d0_resources), - .resource = msm_iommu_gfx2d0_resources, -}; - -static struct platform_device msm_device_iommu_gfx2d1 = { - .name = "msm_iommu-v0", - .id = 11, - .dev = { - .platform_data = &gfx2d1_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_gfx2d1_resources), - .resource = msm_iommu_gfx2d1_resources, -}; - -static struct platform_device msm_device_iommu_vcap = { - .name = "msm_iommu-v0", - .id = 11, - .dev = { - .platform_data = &vcap_iommu, - }, - .num_resources = ARRAY_SIZE(msm_iommu_vcap_resources), - .resource = msm_iommu_vcap_resources, -}; - -static struct msm_iommu_ctx_dev jpegd_src_ctx = { - .name = "jpegd_src", - .num = 0, - .mids = {0, -1} -}; - -static struct msm_iommu_ctx_dev jpegd_dst_ctx = { - .name = "jpegd_dst", - .num = 1, - .mids = {1, -1} -}; - -static struct msm_iommu_ctx_dev vpe_src_ctx = { - .name = "vpe_src", - .num = 0, - .mids = {0, -1} -}; - -static struct msm_iommu_ctx_dev vpe_dst_ctx = { - .name = "vpe_dst", - .num = 1, - .mids = {1, -1} -}; - -static struct msm_iommu_ctx_dev mdp_port0_cb0_ctx = { - .name = "mdp_port0_cb0", - .num = 0, - .mids = {0, 2, -1} -}; - -static struct msm_iommu_ctx_dev mdp_port0_cb1_ctx = { - .name = "mdp_port0_cb1", - .num = 1, - .mids = {1, 3, 4, 5, 6, 7, 8, 9, 10, -1} -}; - -static struct msm_iommu_ctx_dev mdp_port1_cb0_ctx = { - .name = "mdp_port1_cb0", - .num = 0, - .mids = {0, 2, -1} -}; - -static struct msm_iommu_ctx_dev mdp_port1_cb1_ctx = { - .name = "mdp_port1_cb1", - .num = 1, - .mids = {1, 3, 4, 5, 6, 7, 8, 9, 10, -1} -}; - -static struct msm_iommu_ctx_dev rot_src_ctx = { - .name = "rot_src", - .num = 0, - .mids = {0, -1} -}; - -static struct msm_iommu_ctx_dev rot_dst_ctx = { - .name = "rot_dst", - .num = 1, - .mids = {1, -1} -}; - -static struct msm_iommu_ctx_dev ijpeg_src_ctx = { - .name = "ijpeg_src", - .num = 0, - .mids = {0, -1} -}; - -static struct msm_iommu_ctx_dev ijpeg_dst_ctx = { - .name = "ijpeg_dst", - .num = 1, - .mids = {1, -1} -}; - -static struct msm_iommu_ctx_dev vfe_imgwr_ctx = { - .name = "vfe_imgwr", - .num = 0, - .mids = {2, 3, 4, 5, 6, 7, 8, -1} -}; - -static struct msm_iommu_ctx_dev vfe_misc_ctx = { - .name = "vfe_misc", - .num = 1, - .mids = {0, 1, 9, -1} -}; - -static struct msm_iommu_ctx_dev vcodec_a_stream_ctx = { - .name = "vcodec_a_stream", - .num = 0, - .mids = {2, 5, -1} -}; - -static struct msm_iommu_ctx_dev vcodec_a_mm1_ctx = { - .name = "vcodec_a_mm1", - .num = 1, - .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} -}; - -static struct msm_iommu_ctx_dev vcodec_b_mm2_ctx = { - .name = "vcodec_b_mm2", - .num = 0, - .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} -}; - -static struct msm_iommu_ctx_dev gfx3d_user_ctx = { - .name = "gfx3d_user", - .num = 0, - .mids = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} -}; - -static struct msm_iommu_ctx_dev gfx3d_priv_ctx = { - .name = "gfx3d_priv", - .num = 1, - .mids = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, -1} -}; - -static struct msm_iommu_ctx_dev gfx3d1_user_ctx = { - .name = "gfx3d1_user", - .num = 0, - .mids = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} -}; - -static struct msm_iommu_ctx_dev gfx3d1_priv_ctx = { - .name = "gfx3d1_priv", - .num = 1, - .mids = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, -1} -}; - -static struct msm_iommu_ctx_dev gfx2d0_2d0_ctx = { - .name = "gfx2d0_2d0", - .num = 0, - .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1} -}; - -static struct msm_iommu_ctx_dev gfx2d1_2d1_ctx = { - .name = "gfx2d1_2d1", - .num = 0, - .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1} -}; - -static struct msm_iommu_ctx_dev vcap_vc_ctx = { - .name = "vcap_vc", - .num = 0, - .mids = {0, -1} -}; - -static struct msm_iommu_ctx_dev vcap_vp_ctx = { - .name = "vcap_vp", - .num = 1, - .mids = {1, -1} -}; - -static struct platform_device msm_device_jpegd_src_ctx = { - .name = "msm_iommu_ctx", - .id = 0, - .dev = { - .parent = &msm_device_iommu_jpegd.dev, - .platform_data = &jpegd_src_ctx, - }, -}; - -static struct platform_device msm_device_jpegd_dst_ctx = { - .name = "msm_iommu_ctx", - .id = 1, - .dev = { - .parent = &msm_device_iommu_jpegd.dev, - .platform_data = &jpegd_dst_ctx, - }, -}; - -static struct platform_device msm_device_vpe_src_ctx = { - .name = "msm_iommu_ctx", - .id = 2, - .dev = { - .parent = &msm_device_iommu_vpe.dev, - .platform_data = &vpe_src_ctx, - }, -}; - -static struct platform_device msm_device_vpe_dst_ctx = { - .name = "msm_iommu_ctx", - .id = 3, - .dev = { - .parent = &msm_device_iommu_vpe.dev, - .platform_data = &vpe_dst_ctx, - }, -}; - -static struct platform_device msm_device_mdp_port0_cb0_ctx = { - .name = "msm_iommu_ctx", - .id = 4, - .dev = { - .parent = &msm_device_iommu_mdp0.dev, - .platform_data = &mdp_port0_cb0_ctx, - }, -}; - -static struct platform_device msm_device_mdp_port0_cb1_ctx = { - .name = "msm_iommu_ctx", - .id = 5, - .dev = { - .parent = &msm_device_iommu_mdp0.dev, - .platform_data = &mdp_port0_cb1_ctx, - }, -}; - -static struct platform_device msm_device_mdp_port1_cb0_ctx = { - .name = "msm_iommu_ctx", - .id = 6, - .dev = { - .parent = &msm_device_iommu_mdp1.dev, - .platform_data = &mdp_port1_cb0_ctx, - }, -}; - -static struct platform_device msm_device_mdp_port1_cb1_ctx = { - .name = "msm_iommu_ctx", - .id = 7, - .dev = { - .parent = &msm_device_iommu_mdp1.dev, - .platform_data = &mdp_port1_cb1_ctx, - }, -}; - -static struct platform_device msm_device_rot_src_ctx = { - .name = "msm_iommu_ctx", - .id = 8, - .dev = { - .parent = &msm_device_iommu_rot.dev, - .platform_data = &rot_src_ctx, - }, -}; - -static struct platform_device msm_device_rot_dst_ctx = { - .name = "msm_iommu_ctx", - .id = 9, - .dev = { - .parent = &msm_device_iommu_rot.dev, - .platform_data = &rot_dst_ctx, - }, -}; - -static struct platform_device msm_device_ijpeg_src_ctx = { - .name = "msm_iommu_ctx", - .id = 10, - .dev = { - .parent = &msm_device_iommu_ijpeg.dev, - .platform_data = &ijpeg_src_ctx, - }, -}; - -static struct platform_device msm_device_ijpeg_dst_ctx = { - .name = "msm_iommu_ctx", - .id = 11, - .dev = { - .parent = &msm_device_iommu_ijpeg.dev, - .platform_data = &ijpeg_dst_ctx, - }, -}; - -static struct platform_device msm_device_vfe_imgwr_ctx = { - .name = "msm_iommu_ctx", - .id = 12, - .dev = { - .parent = &msm_device_iommu_vfe.dev, - .platform_data = &vfe_imgwr_ctx, - }, -}; - -static struct platform_device msm_device_vfe_misc_ctx = { - .name = "msm_iommu_ctx", - .id = 13, - .dev = { - .parent = &msm_device_iommu_vfe.dev, - .platform_data = &vfe_misc_ctx, - }, -}; - -static struct platform_device msm_device_vcodec_a_stream_ctx = { - .name = "msm_iommu_ctx", - .id = 14, - .dev = { - .parent = &msm_device_iommu_vcodec_a.dev, - .platform_data = &vcodec_a_stream_ctx, - }, -}; - -static struct platform_device msm_device_vcodec_a_mm1_ctx = { - .name = "msm_iommu_ctx", - .id = 15, - .dev = { - .parent = &msm_device_iommu_vcodec_a.dev, - .platform_data = &vcodec_a_mm1_ctx, - }, -}; - -static struct platform_device msm_device_vcodec_b_mm2_ctx = { - .name = "msm_iommu_ctx", - .id = 16, - .dev = { - .parent = &msm_device_iommu_vcodec_b.dev, - .platform_data = &vcodec_b_mm2_ctx, - }, -}; - -static struct platform_device msm_device_gfx3d_user_ctx = { - .name = "msm_iommu_ctx", - .id = 17, - .dev = { - .parent = &msm_device_iommu_gfx3d.dev, - .platform_data = &gfx3d_user_ctx, - }, -}; - -static struct platform_device msm_device_gfx3d_priv_ctx = { - .name = "msm_iommu_ctx", - .id = 18, - .dev = { - .parent = &msm_device_iommu_gfx3d.dev, - .platform_data = &gfx3d_priv_ctx, - }, -}; - -static struct platform_device msm_device_gfx3d1_user_ctx = { - .name = "msm_iommu_ctx", - .id = 19, - .dev = { - .parent = &msm_device_iommu_gfx3d1.dev, - .platform_data = &gfx3d1_user_ctx, - }, -}; - -static struct platform_device msm_device_gfx3d1_priv_ctx = { - .name = "msm_iommu_ctx", - .id = 20, - .dev = { - .parent = &msm_device_iommu_gfx3d1.dev, - .platform_data = &gfx3d1_priv_ctx, - }, -}; - -static struct platform_device msm_device_gfx2d0_2d0_ctx = { - .name = "msm_iommu_ctx", - .id = 19, - .dev = { - .parent = &msm_device_iommu_gfx2d0.dev, - .platform_data = &gfx2d0_2d0_ctx, - }, -}; - -static struct platform_device msm_device_gfx2d1_2d1_ctx = { - .name = "msm_iommu_ctx", - .id = 20, - .dev = { - .parent = &msm_device_iommu_gfx2d1.dev, - .platform_data = &gfx2d1_2d1_ctx, - }, -}; - -static struct platform_device msm_device_vcap_vc_ctx = { - .name = "msm_iommu_ctx", - .id = 21, - .dev = { - .parent = &msm_device_iommu_vcap.dev, - .platform_data = &vcap_vc_ctx, - }, -}; - -static struct platform_device msm_device_vcap_vp_ctx = { - .name = "msm_iommu_ctx", - .id = 22, - .dev = { - .parent = &msm_device_iommu_vcap.dev, - .platform_data = &vcap_vp_ctx, - }, -}; - -static struct platform_device *msm_iommu_common_devs[] = { - &msm_device_iommu_vpe, - &msm_device_iommu_mdp0, - &msm_device_iommu_mdp1, - &msm_device_iommu_rot, - &msm_device_iommu_ijpeg, - &msm_device_iommu_vfe, - &msm_device_iommu_vcodec_a, - &msm_device_iommu_vcodec_b, - &msm_device_iommu_gfx3d, -}; - -static struct platform_device *msm_iommu_gfx2d_devs[] = { - &msm_device_iommu_gfx2d0, - &msm_device_iommu_gfx2d1, -}; - -static struct platform_device *msm_iommu_adreno3xx_gfx_devs[] = { - &msm_device_iommu_gfx3d1, -}; - -static struct platform_device *msm_iommu_vcap_devs[] = { - &msm_device_iommu_vcap, -}; - -static struct platform_device *msm_iommu_jpegd_devs[] = { - &msm_device_iommu_jpegd, -}; - -static struct platform_device *msm_iommu_common_ctx_devs[] = { - &msm_device_vpe_src_ctx, - &msm_device_vpe_dst_ctx, - &msm_device_mdp_port0_cb0_ctx, - &msm_device_mdp_port0_cb1_ctx, - &msm_device_mdp_port1_cb0_ctx, - &msm_device_mdp_port1_cb1_ctx, - &msm_device_rot_src_ctx, - &msm_device_rot_dst_ctx, - &msm_device_ijpeg_src_ctx, - &msm_device_ijpeg_dst_ctx, - &msm_device_vfe_imgwr_ctx, - &msm_device_vfe_misc_ctx, - &msm_device_vcodec_a_stream_ctx, - &msm_device_vcodec_a_mm1_ctx, - &msm_device_vcodec_b_mm2_ctx, - &msm_device_gfx3d_user_ctx, - &msm_device_gfx3d_priv_ctx, -}; - -static struct platform_device *msm_iommu_gfx2d_ctx_devs[] = { - &msm_device_gfx2d0_2d0_ctx, - &msm_device_gfx2d1_2d1_ctx, -}; - -static struct platform_device *msm_iommu_adreno3xx_ctx_devs[] = { - &msm_device_gfx3d1_user_ctx, - &msm_device_gfx3d1_priv_ctx, -}; - -static struct platform_device *msm_iommu_vcap_ctx_devs[] = { - &msm_device_vcap_vc_ctx, - &msm_device_vcap_vp_ctx, -}; - -static struct platform_device *msm_iommu_jpegd_ctx_devs[] = { - &msm_device_jpegd_src_ctx, - &msm_device_jpegd_dst_ctx, -}; - -static int __init iommu_init(void) -{ - int ret; - if (!msm_soc_version_supports_iommu_v0()) { - pr_err("IOMMU v0 is not supported on this SoC version.\n"); - return -ENODEV; - } - - /* Initialize common devs */ - platform_add_devices(msm_iommu_common_devs, - ARRAY_SIZE(msm_iommu_common_devs)); - - /* Initialize soc-specific devs */ - if (cpu_is_msm8x60() || cpu_is_msm8960()) { - platform_add_devices(msm_iommu_jpegd_devs, - ARRAY_SIZE(msm_iommu_jpegd_devs)); - platform_add_devices(msm_iommu_gfx2d_devs, - ARRAY_SIZE(msm_iommu_gfx2d_devs)); - } - - if (soc_class_is_apq8064() || cpu_is_msm8960ab()) { - platform_add_devices(msm_iommu_jpegd_devs, - ARRAY_SIZE(msm_iommu_jpegd_devs)); - platform_add_devices(msm_iommu_adreno3xx_gfx_devs, - ARRAY_SIZE(msm_iommu_adreno3xx_gfx_devs)); - } - if (soc_class_is_apq8064()) - platform_add_devices(msm_iommu_vcap_devs, - ARRAY_SIZE(msm_iommu_vcap_devs)); - - /* Initialize common ctx_devs */ - ret = platform_add_devices(msm_iommu_common_ctx_devs, - ARRAY_SIZE(msm_iommu_common_ctx_devs)); - - /* Initialize soc-specific ctx_devs */ - if (cpu_is_msm8x60() || cpu_is_msm8960()) { - platform_add_devices(msm_iommu_jpegd_ctx_devs, - ARRAY_SIZE(msm_iommu_jpegd_ctx_devs)); - platform_add_devices(msm_iommu_gfx2d_ctx_devs, - ARRAY_SIZE(msm_iommu_gfx2d_ctx_devs)); - } - - if (soc_class_is_apq8064() || cpu_is_msm8960ab()) { - platform_add_devices(msm_iommu_jpegd_ctx_devs, - ARRAY_SIZE(msm_iommu_jpegd_ctx_devs)); - - platform_add_devices(msm_iommu_adreno3xx_ctx_devs, - ARRAY_SIZE(msm_iommu_adreno3xx_ctx_devs)); - } - if (soc_class_is_apq8064()) - platform_add_devices(msm_iommu_vcap_ctx_devs, - ARRAY_SIZE(msm_iommu_vcap_ctx_devs)); - - return 0; -} - -static void __exit iommu_exit(void) -{ - int i; - - /* Common ctx_devs */ - for (i = 0; i < ARRAY_SIZE(msm_iommu_common_ctx_devs); i++) - platform_device_unregister(msm_iommu_common_ctx_devs[i]); - - /* Common devs. */ - for (i = 0; i < ARRAY_SIZE(msm_iommu_common_devs); ++i) - platform_device_unregister(msm_iommu_common_devs[i]); - - if (cpu_is_msm8x60() || cpu_is_msm8960()) { - for (i = 0; i < ARRAY_SIZE(msm_iommu_gfx2d_ctx_devs); i++) - platform_device_unregister(msm_iommu_gfx2d_ctx_devs[i]); - - for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_ctx_devs); i++) - platform_device_unregister(msm_iommu_jpegd_ctx_devs[i]); - - for (i = 0; i < ARRAY_SIZE(msm_iommu_gfx2d_devs); i++) - platform_device_unregister(msm_iommu_gfx2d_devs[i]); - - for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_devs); i++) - platform_device_unregister(msm_iommu_jpegd_devs[i]); - } - if (soc_class_is_apq8064()) { - for (i = 0; i < ARRAY_SIZE(msm_iommu_vcap_ctx_devs); i++) - platform_device_unregister(msm_iommu_vcap_ctx_devs[i]); - } - - if (soc_class_is_apq8064() || cpu_is_msm8960ab()) { - for (i = 0; i < ARRAY_SIZE(msm_iommu_adreno3xx_ctx_devs); - i++) - platform_device_unregister( - msm_iommu_adreno3xx_ctx_devs[i]); - - for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_ctx_devs); - i++) - platform_device_unregister( - msm_iommu_jpegd_ctx_devs[i]); - - if (soc_class_is_apq8064()) { - for (i = 0; i < ARRAY_SIZE(msm_iommu_vcap_devs); - i++) - platform_device_unregister( - msm_iommu_vcap_devs[i]); - } - - for (i = 0; i < ARRAY_SIZE(msm_iommu_adreno3xx_gfx_devs); - i++) - platform_device_unregister( - msm_iommu_adreno3xx_gfx_devs[i]); - - for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_devs); i++) - platform_device_unregister(msm_iommu_jpegd_devs[i]); - } -} - -subsys_initcall(iommu_init); -module_exit(iommu_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Stepan Moskovchenko "); diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c deleted file mode 100644 index 8f02db6cf97f..000000000000 --- a/arch/arm/mach-msm/devices-msm7x00.c +++ /dev/null @@ -1,534 +0,0 @@ -/* linux/arch/arm/mach-msm/devices.c - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include "devices.h" - -#include -#include -#include - -#include - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1_PHYS, - .end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - .name = "uart_resource" - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2_PHYS, - .end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - .name = "uart_resource" - }, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3_PHYS, - .end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - .name = "uart_resource" - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_serial", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#define GPIO_I2C_CLK 60 -#define GPIO_I2C_DAT 61 -void msm_set_i2c_mux(bool gpio, int *gpio_clk, int *gpio_dat) -{ - unsigned id; - if (gpio) { - id = PCOM_GPIO_CFG(GPIO_I2C_CLK, 0, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_2MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - id = PCOM_GPIO_CFG(GPIO_I2C_DAT, 0, GPIO_OUTPUT, - GPIO_NO_PULL, GPIO_2MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - *gpio_clk = GPIO_I2C_CLK; - *gpio_dat = GPIO_I2C_DAT; - } else { - id = PCOM_GPIO_CFG(GPIO_I2C_CLK, 1, GPIO_INPUT, - GPIO_NO_PULL, GPIO_8MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - id = PCOM_GPIO_CFG(GPIO_I2C_DAT , 1, GPIO_INPUT, - GPIO_NO_PULL, GPIO_8MA); - msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0); - } -} - -static struct resource resources_hsusb[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb), - .resource = resources_hsusb, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, -}; - -static struct resource resources_nand[] = { - [0] = { - .start = 7, - .end = 7, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource resources_sdc1[] = { - { - .start = MSM_SDC1_PHYS, - .end = MSM_SDC1_PHYS + MSM_SDC1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC1_0, - .end = INT_SDC1_0, - .flags = IORESOURCE_IRQ, - .name = "cmd_irq", - }, - { - .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED, - .name = "status_irq" - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc2[] = { - { - .start = MSM_SDC2_PHYS, - .end = MSM_SDC2_PHYS + MSM_SDC2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC2_0, - .end = INT_SDC2_0, - .flags = IORESOURCE_IRQ, - .name = "cmd_irq", - }, - { - .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED, - .name = "status_irq" - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc3[] = { - { - .start = MSM_SDC3_PHYS, - .end = MSM_SDC3_PHYS + MSM_SDC3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC3_0, - .end = INT_SDC3_0, - .flags = IORESOURCE_IRQ, - .name = "cmd_irq", - }, - { - .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED, - .name = "status_irq" - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .start = MSM_SDC4_PHYS, - .end = MSM_SDC4_PHYS + MSM_SDC4_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC4_0, - .end = INT_SDC4_0, - .flags = IORESOURCE_IRQ, - .name = "cmd_irq", - }, - { - .flags = IORESOURCE_IRQ | IORESOURCE_DISABLED, - .name = "status_irq" - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat, - unsigned int stat_irq, unsigned long stat_irq_flags) -{ - struct platform_device *pdev; - struct resource *res; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "status_irq"); - if (!res) - return -EINVAL; - else if (stat_irq) { - res->start = res->end = stat_irq; - res->flags &= ~IORESOURCE_DISABLED; - res->flags |= stat_irq_flags; - } - - return platform_device_register(pdev); -} - -static struct resource resources_mddi0[] = { - { - .start = MSM_PMDH_PHYS, - .end = MSM_PMDH_PHYS + MSM_PMDH_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDDI_PRI, - .end = INT_MDDI_PRI, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_mddi1[] = { - { - .start = MSM_EMDH_PHYS, - .end = MSM_EMDH_PHYS + MSM_EMDH_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDDI_EXT, - .end = INT_MDDI_EXT, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_mddi0 = { - .name = "msm_mddi", - .id = 0, - .num_resources = ARRAY_SIZE(resources_mddi0), - .resource = resources_mddi0, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_mddi1 = { - .name = "msm_mddi", - .id = 1, - .num_resources = ARRAY_SIZE(resources_mddi1), - .resource = resources_mddi1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct resource resources_mdp[] = { - { - .start = MSM_MDP_PHYS, - .end = MSM_MDP_PHYS + MSM_MDP_SIZE - 1, - .name = "mdp", - .flags = IORESOURCE_MEM - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_mdp = { - .name = "msm_mdp", - .id = 0, - .num_resources = ARRAY_SIZE(resources_mdp), - .resource = resources_mdp, -}; - -static struct resource resources_tssc[] = { - { - .start = MSM_TSSC_PHYS, - .end = MSM_TSSC_PHYS + MSM_TSSC_SIZE - 1, - .name = "tssc", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_TCHSCRN1, - .end = INT_TCHSCRN1, - .name = "tssc1", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, - { - .start = INT_TCHSCRN2, - .end = INT_TCHSCRN2, - .name = "tssc2", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, -}; - -struct platform_device msm_device_touchscreen = { - .name = "msm_touchscreen", - .id = 0, - .num_resources = ARRAY_SIZE(resources_tssc), - .resource = resources_tssc, -}; diff --git a/arch/arm/mach-msm/devices-msm7x01a.c b/arch/arm/mach-msm/devices-msm7x01a.c deleted file mode 100644 index 574fcdcea5e9..000000000000 --- a/arch/arm/mach-msm/devices-msm7x01a.c +++ /dev/null @@ -1,776 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "devices.h" - -#include - -#include -#include - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1_PHYS, - .end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2_PHYS, - .end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3_PHYS, - .end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_serial", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -#define MSM_UART1DM_PHYS 0xA0200000 -#define MSM_UART2DM_PHYS 0xA0300000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_I2C_SIZE SZ_4K -#define MSM_I2C_PHYS 0xA9900000 -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#define MSM_HSUSB_PHYS 0xA0800000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_hsusb_otg = { - .name = "msm_hsusb_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, - { - .name = "vbus_interrupt", - .start = MSM_GPIO_TO_INT(112), - .end = MSM_GPIO_TO_INT(112), - .flags = IORESOURCE_IRQ, - }, - { - .name = "id_interrupt", - .start = MSM_GPIO_TO_INT(114), - .end = MSM_GPIO_TO_INT(114), - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_peripheral = { - .name = "msm_hsusb_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_peripheral), - .resource = resources_hsusb_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#define MSM_NAND_PHYS 0xA0A00000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -#define MSM_SDC1_BASE 0xA0400000 -#define MSM_SDC2_BASE 0xA0500000 -#define MSM_SDC3_BASE 0xA0600000 -#define MSM_SDC4_BASE 0xA0700000 -static struct resource resources_sdc1[] = { - { - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc2[] = { - { - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc3[] = { - { - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .start = 8, - .end = 8, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#if defined(CONFIG_FB_MSM_MDP40) -#define MDP_BASE 0xA3F00000 -#define PMDH_BASE 0xAD600000 -#define EMDH_BASE 0xAD700000 -#define TVENC_BASE 0xAD400000 -#else -#define MDP_BASE 0xAA200000 -#define PMDH_BASE 0xAA600000 -#define EMDH_BASE 0xAA700000 -#define TVENC_BASE 0xAA400000 -#endif - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_mddi_resources[] = { - { - .name = "pmdh", - .start = PMDH_BASE, - .end = PMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mddi_ext_resources[] = { - { - .name = "emdh", - .start = EMDH_BASE, - .end = EMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_ebi2_lcd_resources[] = { - { - .name = "base", - .start = 0xa0d00000, - .end = 0xa0d00000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x98000000, - .end = 0x98000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd02", - .start = 0x9c000000, - .end = 0x9c000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_BASE, - .end = TVENC_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static struct platform_device msm_mddi_device = { - .name = "mddi", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_resources), - .resource = msm_mddi_resources, -}; - -static struct platform_device msm_mddi_ext_device = { - .name = "mddi_ext", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_ext_resources), - .resource = msm_mddi_ext_resources, -}; - -static struct platform_device msm_ebi2_lcd_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcd_resources), - .resource = msm_ebi2_lcd_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define MSM_TSIF_PHYS (0xa0100000) -#define MSM_TSIF_SIZE (0x200) - -static struct resource tsif_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = INT_TSIF_IRQ, - .end = INT_TSIF_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF_PHYS, - .end = MSM_TSIF_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_release(struct device *dev) -{ - dev_info(dev, "release\n"); -} - -struct platform_device msm_device_tsif = { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif_resources), - .resource = tsif_resources, - .dev = { - .release = tsif_release, - }, -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -#define MSM_TSSC_PHYS 0xAA300000 -static struct resource resources_tssc[] = { - { - .start = MSM_TSSC_PHYS, - .end = MSM_TSSC_PHYS + SZ_4K - 1, - .name = "tssc", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_TCHSCRN1, - .end = INT_TCHSCRN1, - .name = "tssc1", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, - { - .start = INT_TCHSCRN2, - .end = INT_TCHSCRN2, - .name = "tssc2", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, -}; - -struct platform_device msm_device_tssc = { - .name = "msm_touchscreen", - .id = 0, - .num_resources = ARRAY_SIZE(resources_tssc), - .resource = resources_tssc, -}; - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "pmdh", 4)) - msm_register_device(&msm_mddi_device, data); - else if (!strncmp(name, "emdh", 4)) - msm_register_device(&msm_mddi_ext_device, data); - else if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcd_device, data); - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct platform_device msm_camera_device = { - .name = "msm_camera", - .id = 0, -}; - -void __init msm_camera_register_device(void *res, uint32_t num, - void *data) -{ - msm_camera_device.num_resources = num; - msm_camera_device.resource = res; - - msm_register_device(&msm_camera_device, data); -} diff --git a/arch/arm/mach-msm/devices-msm7x25.c b/arch/arm/mach-msm/devices-msm7x25.c deleted file mode 100644 index 057930ea8c7b..000000000000 --- a/arch/arm/mach-msm/devices-msm7x25.c +++ /dev/null @@ -1,990 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "smd_private.h" - -#include - -#include -#include -#include -#include - -#include "clock-pcom.h" - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1_PHYS, - .end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2_PHYS, - .end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3_PHYS, - .end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_serial", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -#define MSM_UART1DM_PHYS 0xA0200000 -#define MSM_UART2DM_PHYS 0xA0300000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_I2C_SIZE SZ_4K -#define MSM_I2C_PHYS 0xA9900000 -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#define MSM_HSUSB_PHYS 0xA0800000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_hsusb_otg = { - .name = "msm_hsusb_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_peripheral = { - .name = "msm_hsusb_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_peripheral), - .resource = resources_hsusb_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#ifdef CONFIG_USB_ANDROID_DIAG -struct usb_diag_platform_data usb_diag_pdata = { - .ch_name = DIAG_LEGACY, - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -struct platform_device usb_diag_device = { - .name = "usb_diag", - .id = -1, - .dev = { - .platform_data = &usb_diag_pdata, - }, -}; -#endif - -#ifdef CONFIG_USB_F_SERIAL -static struct usb_gadget_fserial_platform_data fserial_pdata = { - .no_ports = 2, -}; - -struct platform_device usb_gadget_fserial_device = { - .name = "usb_fserial", - .id = -1, - .dev = { - .platform_data = &fserial_pdata, - }, -}; -#endif - -#define MSM_NAND_PHYS 0xA0A00000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -#define MSM_SDC1_BASE 0xA0400000 -#define MSM_SDC2_BASE 0xA0500000 -#define MSM_SDC3_BASE 0xA0600000 -#define MSM_SDC4_BASE 0xA0700000 -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC3_CHAN, - .end = DMOV_SDC3_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#define RAMFS_INFO_MAGICNUMBER 0x654D4D43 -#define RAMFS_INFO_VERSION 0x00000001 -#define RAMFS_MODEMSTORAGE_ID 0x4D454653 - -static struct resource rmt_storage_resources[] = { - { - .flags = IORESOURCE_MEM, - }, -}; - -static struct platform_device rmt_storage_device = { - .name = "rmt_storage", - .id = -1, - .num_resources = ARRAY_SIZE(rmt_storage_resources), - .resource = rmt_storage_resources, -}; - -struct shared_ramfs_entry { - uint32_t client_id; /* Client id to uniquely identify a client */ - uint32_t base_addr; /* Base address of shared RAMFS memory */ - uint32_t size; /* Size of the shared RAMFS memory */ - uint32_t reserved; /* Reserved attribute for future use */ -}; -struct shared_ramfs_table { - uint32_t magic_id; /* Identify RAMFS details in SMEM */ - uint32_t version; /* Version of shared_ramfs_table */ - uint32_t entries; /* Total number of valid entries */ - struct shared_ramfs_entry ramfs_entry[3]; /* List all entries */ -}; - -int __init rmt_storage_add_ramfs(void) -{ - struct shared_ramfs_table *ramfs_table; - struct shared_ramfs_entry *ramfs_entry; - int index; - - ramfs_table = smem_alloc(SMEM_SEFS_INFO, - sizeof(struct shared_ramfs_table)); - - if (!ramfs_table) { - printk(KERN_WARNING "%s: No RAMFS table in SMEM\n", __func__); - return -ENOENT; - } - - if ((ramfs_table->magic_id != (u32) RAMFS_INFO_MAGICNUMBER) || - (ramfs_table->version != (u32) RAMFS_INFO_VERSION)) { - printk(KERN_WARNING "%s: Magic / Version mismatch:, " - "magic_id=%#x, format_version=%#x\n", __func__, - ramfs_table->magic_id, ramfs_table->version); - return -ENOENT; - } - - for (index = 0; index < ramfs_table->entries; index++) { - ramfs_entry = &ramfs_table->ramfs_entry[index]; - - /* Find a match for the Modem Storage RAMFS area */ - if (ramfs_entry->client_id == (u32) RAMFS_MODEMSTORAGE_ID) { - printk(KERN_INFO "%s: RAMFS Info (from SMEM): " - "Baseaddr = 0x%08x, Size = 0x%08x\n", __func__, - ramfs_entry->base_addr, ramfs_entry->size); - - rmt_storage_resources[0].start = ramfs_entry->base_addr; - rmt_storage_resources[0].end = ramfs_entry->base_addr + - ramfs_entry->size - 1; - platform_device_register(&rmt_storage_device); - return 0; - } - } - return -ENOENT; -} - -#if defined(CONFIG_FB_MSM_MDP40) -#define MDP_BASE 0xA3F00000 -#define PMDH_BASE 0xAD600000 -#define EMDH_BASE 0xAD700000 -#define TVENC_BASE 0xAD400000 -#else -#define MDP_BASE 0xAA200000 -#define PMDH_BASE 0xAA600000 -#define EMDH_BASE 0xAA700000 -#define TVENC_BASE 0xAA400000 -#endif - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_mddi_resources[] = { - { - .name = "pmdh", - .start = PMDH_BASE, - .end = PMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mddi_ext_resources[] = { - { - .name = "emdh", - .start = EMDH_BASE, - .end = EMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_ebi2_lcd_resources[] = { - { - .name = "base", - .start = 0xa0d00000, - .end = 0xa0d00000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x98000000, - .end = 0x98000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd02", - .start = 0x9c000000, - .end = 0x9c000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_BASE, - .end = TVENC_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static struct platform_device msm_mddi_device = { - .name = "mddi", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_resources), - .resource = msm_mddi_resources, -}; - -static struct platform_device msm_mddi_ext_device = { - .name = "mddi_ext", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_ext_resources), - .resource = msm_mddi_ext_resources, -}; - -static struct platform_device msm_ebi2_lcd_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcd_resources), - .resource = msm_ebi2_lcd_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define MSM_TSIF_PHYS (0xa0100000) -#define MSM_TSIF_SIZE (0x200) - -static struct resource tsif_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = INT_TSIF_IRQ, - .end = INT_TSIF_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF_PHYS, - .end = MSM_TSIF_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_release(struct device *dev) -{ - dev_info(dev, "release\n"); -} - -struct platform_device msm_device_tsif = { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif_resources), - .resource = tsif_resources, - .dev = { - .release = tsif_release, - }, -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -#define MSM_TSSC_PHYS 0xAA300000 -static struct resource resources_tssc[] = { - { - .start = MSM_TSSC_PHYS, - .end = MSM_TSSC_PHYS + SZ_4K - 1, - .name = "tssc", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_TCHSCRN1, - .end = INT_TCHSCRN1, - .name = "tssc1", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, - { - .start = INT_TCHSCRN2, - .end = INT_TCHSCRN2, - .name = "tssc2", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, -}; - -struct platform_device msm_device_tssc = { - .name = "msm_touchscreen", - .id = 0, - .num_resources = ARRAY_SIZE(resources_tssc), - .resource = resources_tssc, -}; - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "pmdh", 4)) - msm_register_device(&msm_mddi_device, data); - else if (!strncmp(name, "emdh", 4)) - msm_register_device(&msm_mddi_ext_device, data); - else if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcd_device, data); - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct platform_device msm_camera_device = { - .name = "msm_camera", - .id = 0, -}; - -void __init msm_camera_register_device(void *res, uint32_t num, - void *data) -{ - msm_camera_device.num_resources = num; - msm_camera_device.resource = res; - - msm_register_device(&msm_camera_device, data); -} - -static DEFINE_CLK_PCOM(adm_clk, ADM_CLK, 0); -static DEFINE_CLK_PCOM(adsp_clk, ADSP_CLK, 0); -static DEFINE_CLK_PCOM(ebi1_clk, EBI1_CLK, CLK_MIN); -static DEFINE_CLK_PCOM(ebi2_clk, EBI2_CLK, 0); -static DEFINE_CLK_PCOM(ecodec_clk, ECODEC_CLK, 0); -static DEFINE_CLK_PCOM(gp_clk, GP_CLK, 0); -static DEFINE_CLK_PCOM(i2c_clk, I2C_CLK, 0); -static DEFINE_CLK_PCOM(icodec_rx_clk, ICODEC_RX_CLK, 0); -static DEFINE_CLK_PCOM(icodec_tx_clk, ICODEC_TX_CLK, 0); -static DEFINE_CLK_PCOM(imem_clk, IMEM_CLK, OFF); -static DEFINE_CLK_PCOM(mdc_clk, MDC_CLK, 0); -static DEFINE_CLK_PCOM(pmdh_clk, PMDH_CLK, OFF | CLK_MINMAX); -static DEFINE_CLK_PCOM(mdp_clk, MDP_CLK, OFF); -static DEFINE_CLK_PCOM(mdp_lcdc_pclk_clk, MDP_LCDC_PCLK_CLK, 0); -static DEFINE_CLK_PCOM(mdp_lcdc_pad_pclk_clk, MDP_LCDC_PAD_PCLK_CLK, 0); -static DEFINE_CLK_PCOM(mdp_vsync_clk, MDP_VSYNC_CLK, OFF); -static DEFINE_CLK_PCOM(pbus_clk, PBUS_CLK, CLK_MIN); -static DEFINE_CLK_PCOM(pcm_clk, PCM_CLK, 0); -static DEFINE_CLK_PCOM(sdac_clk, SDAC_CLK, OFF); -static DEFINE_CLK_PCOM(sdc1_clk, SDC1_CLK, OFF); -static DEFINE_CLK_PCOM(sdc1_p_clk, SDC1_P_CLK, OFF); -static DEFINE_CLK_PCOM(sdc2_clk, SDC2_CLK, OFF); -static DEFINE_CLK_PCOM(sdc2_p_clk, SDC2_P_CLK, OFF); -static DEFINE_CLK_PCOM(sdc3_clk, SDC3_CLK, OFF); -static DEFINE_CLK_PCOM(sdc3_p_clk, SDC3_P_CLK, OFF); -static DEFINE_CLK_PCOM(sdc4_clk, SDC4_CLK, OFF); -static DEFINE_CLK_PCOM(sdc4_p_clk, SDC4_P_CLK, OFF); -static DEFINE_CLK_PCOM(uart1_clk, UART1_CLK, OFF); -static DEFINE_CLK_PCOM(uart2_clk, UART2_CLK, 0); -static DEFINE_CLK_PCOM(uart3_clk, UART3_CLK, OFF); -static DEFINE_CLK_PCOM(uart1dm_clk, UART1DM_CLK, OFF); -static DEFINE_CLK_PCOM(uart2dm_clk, UART2DM_CLK, 0); -static DEFINE_CLK_PCOM(usb_hs_clk, USB_HS_CLK, OFF); -static DEFINE_CLK_PCOM(usb_hs_p_clk, USB_HS_P_CLK, OFF); -static DEFINE_CLK_PCOM(usb_otg_clk, USB_OTG_CLK, 0); -static DEFINE_CLK_PCOM(vdc_clk, VDC_CLK, OFF | CLK_MIN); -static DEFINE_CLK_PCOM(vfe_clk, VFE_CLK, OFF); -static DEFINE_CLK_PCOM(vfe_mdc_clk, VFE_MDC_CLK, OFF); - -struct clk_lookup msm_clocks_7x25[] = { - CLK_LOOKUP("core_clk", adm_clk.c, "msm_dmov"), - CLK_LOOKUP("adsp_clk", adsp_clk.c, NULL), - CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL), - CLK_LOOKUP("ebi2_clk", ebi2_clk.c, NULL), - CLK_LOOKUP("ecodec_clk", ecodec_clk.c, NULL), - CLK_LOOKUP("core_clk", gp_clk.c, NULL), - CLK_LOOKUP("core_clk", i2c_clk.c, "msm_i2c.0"), - CLK_LOOKUP("icodec_rx_clk", icodec_rx_clk.c, NULL), - CLK_LOOKUP("icodec_tx_clk", icodec_tx_clk.c, NULL), - CLK_LOOKUP("mem_clk", imem_clk.c, NULL), - CLK_LOOKUP("mdc_clk", mdc_clk.c, NULL), - CLK_LOOKUP("mddi_clk", pmdh_clk.c, NULL), - CLK_LOOKUP("mdp_clk", mdp_clk.c, NULL), - CLK_LOOKUP("mdp_lcdc_pclk_clk", mdp_lcdc_pclk_clk.c, NULL), - CLK_LOOKUP("mdp_lcdc_pad_pclk_clk", mdp_lcdc_pad_pclk_clk.c, NULL), - CLK_LOOKUP("mdp_vsync_clk", mdp_vsync_clk.c, NULL), - CLK_LOOKUP("pbus_clk", pbus_clk.c, NULL), - CLK_LOOKUP("pcm_clk", pcm_clk.c, NULL), - CLK_LOOKUP("sdac_clk", sdac_clk.c, NULL), - CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"), - CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"), - CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"), - CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"), - CLK_LOOKUP("core_clk", uart1_clk.c, "msm_serial.0"), - CLK_LOOKUP("core_clk", uart2_clk.c, "msm_serial.1"), - CLK_LOOKUP("core_clk", uart3_clk.c, "msm_serial.2"), - CLK_LOOKUP("core_clk", uart1dm_clk.c, "msm_serial_hs.0"), - CLK_LOOKUP("core_clk", uart2dm_clk.c, "msm_serial_hs.1"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_otg"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_otg"), - CLK_LOOKUP("alt_core_clk", usb_hs_clk.c, "msm_hsusb_peripheral"), - CLK_LOOKUP("iface_clk", usb_hs_p_clk.c, "msm_hsusb_peripheral"), - CLK_LOOKUP("alt_core_clk", usb_otg_clk.c, NULL), - CLK_LOOKUP("vdc_clk", vdc_clk.c, NULL), - CLK_LOOKUP("vfe_clk", vfe_clk.c, NULL), - CLK_LOOKUP("vfe_mdc_clk", vfe_mdc_clk.c, NULL), -}; - -unsigned msm_num_clocks_7x25 = ARRAY_SIZE(msm_clocks_7x25); - diff --git a/arch/arm/mach-msm/devices-msm7x27.c b/arch/arm/mach-msm/devices-msm7x27.c deleted file mode 100644 index ad0104283490..000000000000 --- a/arch/arm/mach-msm/devices-msm7x27.c +++ /dev/null @@ -1,919 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "footswitch.h" -#include "acpuclock.h" - -#include - -#include -#include -#include -#include -#include "irq.h" -#include "pm.h" - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7XXX_UART1_PHYS, - .end = MSM7XXX_UART1_PHYS + MSM7XXX_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7XXX_UART2_PHYS, - .end = MSM7XXX_UART2_PHYS + MSM7XXX_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -static struct resource resources_adsp[] = { - { - .start = INT_ADSP_A9_A11, - .end = INT_ADSP_A9_A11, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_adsp_device = { - .name = "msm_adsp", - .id = -1, - .num_resources = ARRAY_SIZE(resources_adsp), - .resource = resources_adsp, -}; - -#define MSM_UART1DM_PHYS 0xA0200000 -#define MSM_UART2DM_PHYS 0xA0300000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_I2C_SIZE SZ_4K -#define MSM_I2C_PHYS 0xA9900000 -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#define MSM_HSUSB_PHYS 0xA0800000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_hsusb_otg = { - .name = "msm_hsusb_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_peripheral = { - .name = "msm_hsusb_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_peripheral), - .resource = resources_hsusb_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -struct platform_device asoc_msm_pcm = { - .name = "msm-dsp-audio", - .id = 0, -}; - -struct platform_device asoc_msm_dai0 = { - .name = "msm-codec-dai", - .id = 0, -}; - -struct platform_device asoc_msm_dai1 = { - .name = "msm-cpu-dai", - .id = 0, -}; - -#define MSM_NAND_PHYS 0xA0A00000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -static struct msm_pm_irq_calls msm7x27_pm_irq_calls = { - .irq_pending = msm_irq_pending, - .idle_sleep_allowed = msm_irq_idle_sleep_allowed, - .enter_sleep1 = msm_irq_enter_sleep1, - .enter_sleep2 = msm_irq_enter_sleep2, - .exit_sleep1 = msm_irq_exit_sleep1, - .exit_sleep2 = msm_irq_exit_sleep2, - .exit_sleep3 = msm_irq_exit_sleep3, -}; - -void __init msm_pm_register_irqs(void) -{ - msm_pm_set_irq_extns(&msm7x27_pm_irq_calls); -} - -static struct acpuclk_pdata msm7x27_acpuclk_pdata = { - .max_speed_delta_khz = 400000, -}; - -struct platform_device msm7x27_device_acpuclk = { - .name = "acpuclk-7627", - .id = -1, - .dev.platform_data = &msm7x27_acpuclk_pdata, -}; - -#define MSM_SDC1_BASE 0xA0400000 -#define MSM_SDC2_BASE 0xA0500000 -#define MSM_SDC3_BASE 0xA0600000 -#define MSM_SDC4_BASE 0xA0700000 -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC3_CHAN, - .end = DMOV_SDC3_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#if defined(CONFIG_FB_MSM_MDP40) -#define MDP_BASE 0xA3F00000 -#define PMDH_BASE 0xAD600000 -#define EMDH_BASE 0xAD700000 -#define TVENC_BASE 0xAD400000 -#else -#define MDP_BASE 0xAA200000 -#define PMDH_BASE 0xAA600000 -#define EMDH_BASE 0xAA700000 -#define TVENC_BASE 0xAA400000 -#endif - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_mddi_resources[] = { - { - .name = "pmdh", - .start = PMDH_BASE, - .end = PMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mddi_ext_resources[] = { - { - .name = "emdh", - .start = EMDH_BASE, - .end = EMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_ebi2_lcd_resources[] = { - { - .name = "base", - .start = 0xa0d00000, - .end = 0xa0d00000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x98000000, - .end = 0x98000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd02", - .start = 0x9c000000, - .end = 0x9c000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_BASE, - .end = TVENC_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static struct platform_device msm_mddi_device = { - .name = "mddi", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_resources), - .resource = msm_mddi_resources, -}; - -static struct platform_device msm_mddi_ext_device = { - .name = "mddi_ext", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_ext_resources), - .resource = msm_mddi_ext_resources, -}; - -static struct platform_device msm_ebi2_lcd_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcd_resources), - .resource = msm_ebi2_lcd_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define MSM_TSIF_PHYS (0xa0100000) -#define MSM_TSIF_SIZE (0x200) - -static struct resource tsif_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = INT_TSIF_IRQ, - .end = INT_TSIF_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF_PHYS, - .end = MSM_TSIF_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_release(struct device *dev) -{ - dev_info(dev, "release\n"); -} - -struct platform_device msm_device_tsif = { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif_resources), - .resource = tsif_resources, - .dev = { - .release = tsif_release, - }, -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -#define MSM_TSSC_PHYS 0xAA300000 -static struct resource resources_tssc[] = { - { - .start = MSM_TSSC_PHYS, - .end = MSM_TSSC_PHYS + SZ_4K - 1, - .name = "tssc", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_TCHSCRN1, - .end = INT_TCHSCRN1, - .name = "tssc1", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, - { - .start = INT_TCHSCRN2, - .end = INT_TCHSCRN2, - .name = "tssc2", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, -}; - -struct platform_device msm_device_tssc = { - .name = "msm_touchscreen", - .id = 0, - .num_resources = ARRAY_SIZE(resources_tssc), - .resource = resources_tssc, -}; - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "pmdh", 4)) - msm_register_device(&msm_mddi_device, data); - else if (!strncmp(name, "emdh", 4)) - msm_register_device(&msm_mddi_ext_device, data); - else if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcd_device, data); - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct platform_device msm_camera_device = { - .name = "msm_camera", - .id = 0, -}; - -void __init msm_camera_register_device(void *res, uint32_t num, - void *data) -{ - msm_camera_device.num_resources = num; - msm_camera_device.resource = res; - - msm_register_device(&msm_camera_device, data); -} - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0xA0000000, - .end = 0xA001ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = INT_GRAPHICS, - .end = INT_GRAPHICS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - /* bus_freq has been set to 160000 for power savings. - * OEMs may modify the value at their discretion for performance - * The appropriate maximum replacement for 160000 is: - * msm7x2x_clock_data.max_axi_khz - */ - .pwrlevel = { - { - .gpu_freq = 0, - .bus_freq = 160000000, - }, - }, - .init_level = 0, - .num_levels = 1, - .set_grp_async = NULL, - .idle_timeout = HZ, - .strtstp_sleepwake = true, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM, -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -struct platform_device *msm_footswitch_devices[] = { - FS_PCOM(FS_GFX3D, "vdd", "kgsl-3d0.0"), -}; -unsigned msm_num_footswitch_devices = ARRAY_SIZE(msm_footswitch_devices); - -static struct resource gpio_resources[] = { - { - .start = INT_GPIO_GROUP1, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_GPIO_GROUP2, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_device_gpio = { - .name = "msmgpio", - .id = -1, - .resource = gpio_resources, - .num_resources = ARRAY_SIZE(gpio_resources), -}; - -static int __init msm7627_init_gpio(void) -{ - platform_device_register(&msm_device_gpio); - return 0; -} - -postcore_initcall(msm7627_init_gpio); diff --git a/arch/arm/mach-msm/devices-msm7x27a.c b/arch/arm/mach-msm/devices-msm7x27a.c deleted file mode 100644 index b2e197aabad3..000000000000 --- a/arch/arm/mach-msm/devices-msm7x27a.c +++ /dev/null @@ -1,2200 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices.h" -#include "devices-msm7x2xa.h" -#include "footswitch.h" -#include "acpuclock.h" -#include "acpuclock-8625q.h" -#include "spm.h" -#include "mpm-8625.h" -#include "irq.h" -#include "pm.h" -#include "msm_cpr.h" -#include "msm_smem_iface.h" - -/* Address of GSBI blocks */ -#define MSM_GSBI0_PHYS 0xA1200000 -#define MSM_GSBI1_PHYS 0xA1300000 - -/* GSBI QUPe devices */ -#define MSM_GSBI0_QUP_PHYS (MSM_GSBI0_PHYS + 0x80000) -#define MSM_GSBI1_QUP_PHYS (MSM_GSBI1_PHYS + 0x80000) - -#define A11S_TEST_BUS_SEL_ADDR (MSM_CSR_BASE + 0x518) -#define RBCPR_CLK_MUX_SEL (1 << 13) - -/* Reset Address of RBCPR (Active Low)*/ -#define RBCPR_SW_RESET_N (MSM_CSR_BASE + 0x64) - -static struct resource gsbi0_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI0_QUP_PHYS, - .end = MSM_GSBI0_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI0_PHYS, - .end = MSM_GSBI0_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -/* Use GSBI0 QUP for /dev/i2c-0 */ -struct platform_device msm_gsbi0_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI0_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi0_qup_i2c_resources), - .resource = gsbi0_qup_i2c_resources, -}; - -static struct resource gsbi1_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = INT_ARM11_DMA, - .end = INT_ARM11_DMA, - .flags = IORESOURCE_IRQ, - }, -}; - -/* Use GSBI1 QUP for /dev/i2c-1 */ -struct platform_device msm_gsbi1_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI1_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi1_qup_i2c_resources), - .resource = gsbi1_qup_i2c_resources, -}; - -#define MSM_HSUSB_PHYS 0xA0800000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -static struct acpuclk_pdata msm7x27a_acpuclk_pdata = { - .max_speed_delta_khz = 400000, -}; - -struct platform_device msm7x27a_device_acpuclk = { - .name = "acpuclk-7627", - .id = -1, - .dev.platform_data = &msm7x27a_acpuclk_pdata, -}; - -static struct acpuclk_pdata msm7x27aa_acpuclk_pdata = { - .max_speed_delta_khz = 504000, -}; - -struct platform_device msm7x27aa_device_acpuclk = { - .name = "acpuclk-7627", - .id = -1, - .dev.platform_data = &msm7x27aa_acpuclk_pdata, -}; - -static struct acpuclk_pdata msm8625q_pdata = { - .max_speed_delta_khz = 801600, -}; - -static struct acpuclk_pdata_8625q msm8625q_acpuclk_pdata = { - .acpu_clk_data = &msm8625q_pdata, - .pvs_voltage_uv = 1350000, -}; - -struct platform_device msm8625q_device_acpuclk = { - .name = "acpuclock-8625q", - .id = -1, - .dev.platform_data = &msm8625q_acpuclk_pdata, -}; - -static struct acpuclk_pdata msm8625_acpuclk_pdata = { - /* TODO: Need to update speed delta from H/w Team */ - .max_speed_delta_khz = 604800, -}; - -static struct acpuclk_pdata msm8625ab_acpuclk_pdata = { - .max_speed_delta_khz = 801600, -}; - -struct platform_device msm8625_device_acpuclk = { - .name = "acpuclk-7627", - .id = -1, - .dev.platform_data = &msm8625_acpuclk_pdata, -}; - -struct platform_device msm8625ab_device_acpuclk = { - .name = "acpuclk-7627", - .id = -1, - .dev.platform_data = &msm8625ab_acpuclk_pdata, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource smd_8625_resource[] = { - { - .name = "a9_m2a_0", - .start = MSM8625_INT_A9_M2A_0, - .flags = IORESOURCE_IRQ, - }, - { - .name = "a9_m2a_5", - .start = MSM8625_INT_A9_M2A_5, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct smd_subsystem_config smd_8625_config_list[] = { - { - .irq_config_id = SMD_MODEM, - .subsys_name = "modem", - .edge = SMD_APPS_MODEM, - - .smd_int.irq_name = "a9_m2a_0", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - - .smd_int.out_bit_pos = 1, - .smd_int.out_base = (void __iomem *)MSM_CSR_BASE, - .smd_int.out_offset = 0x400 + (0) * 4, - - .smsm_int.irq_name = "a9_m2a_5", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smsm_dev", - .smsm_int.dev_id = 0, - - .smsm_int.out_bit_pos = 1, - .smsm_int.out_base = (void __iomem *)MSM_CSR_BASE, - .smsm_int.out_offset = 0x400 + (5) * 4, - - } -}; - -static struct smd_platform smd_8625_platform_data = { - .num_ss_configs = ARRAY_SIZE(smd_8625_config_list), - .smd_ss_configs = smd_8625_config_list, -}; - -struct platform_device msm8625_device_smd = { - .name = "msm_smd", - .id = -1, - .resource = smd_8625_resource, - .num_resources = ARRAY_SIZE(smd_8625_resource), - .dev = { - .platform_data = &smd_8625_platform_data, - } -}; - -static struct resource resources_adsp[] = { - { - .start = INT_ADSP_A9_A11, - .end = INT_ADSP_A9_A11, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_adsp_device = { - .name = "msm_adsp", - .id = -1, - .num_resources = ARRAY_SIZE(resources_adsp), - .resource = resources_adsp, -}; - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7XXX_UART1_PHYS, - .end = MSM7XXX_UART1_PHYS + MSM7XXX_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -#define MSM_UART1DM_PHYS 0xA0200000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_UART2DM_PHYS 0xA0300000 -static struct resource msm_uart2dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart2dm_resources), - .resource = msm_uart2dm_resources, -}; - -#define MSM_NAND_PHYS 0xA0A00000 -#define MSM_NANDC01_PHYS 0xA0A40000 -#define MSM_NANDC10_PHYS 0xA0A80000 -#define MSM_NANDC11_PHYS 0xA0AC0000 -#define EBI2_REG_BASE 0xA0D00000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [2] = { - .name = "msm_nandc01_phys", - .start = MSM_NANDC01_PHYS, - .end = MSM_NANDC01_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [3] = { - .name = "msm_nandc10_phys", - .start = MSM_NANDC10_PHYS, - .end = MSM_NANDC10_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [4] = { - .name = "msm_nandc11_phys", - .start = MSM_NANDC11_PHYS, - .end = MSM_NANDC11_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [5] = { - .name = "ebi2_reg_base", - .start = EBI2_REG_BASE, - .end = EBI2_REG_BASE + 0x60, - .flags = IORESOURCE_MEM, - }, -}; - -struct flash_platform_data msm_nand_data = { - .version = VERSION_2, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -static struct msm_pm_irq_calls msm7x27a_pm_irq_calls = { - .irq_pending = msm_irq_pending, - .idle_sleep_allowed = msm_irq_idle_sleep_allowed, - .enter_sleep1 = msm_irq_enter_sleep1, - .enter_sleep2 = msm_irq_enter_sleep2, - .exit_sleep1 = msm_irq_exit_sleep1, - .exit_sleep2 = msm_irq_exit_sleep2, - .exit_sleep3 = msm_irq_exit_sleep3, -}; - -static struct msm_pm_irq_calls msm8625_pm_irq_calls = { - .irq_pending = msm_gic_spi_ppi_pending, - .idle_sleep_allowed = msm_gic_irq_idle_sleep_allowed, - .enter_sleep1 = msm_gic_irq_enter_sleep1, - .enter_sleep2 = msm_gic_irq_enter_sleep2, - .exit_sleep1 = msm_gic_irq_exit_sleep1, - .exit_sleep2 = msm_gic_irq_exit_sleep2, - .exit_sleep3 = msm_gic_irq_exit_sleep3, -}; - -void msm_clk_dump_debug_info(void) -{ - pr_info("%s: GLBL_CLK_ENA: 0x%08X\n", __func__, - readl_relaxed(MSM_CLK_CTL_BASE + 0x0)); - pr_info("%s: GLBL_CLK_STATE: 0x%08X\n", __func__, - readl_relaxed(MSM_CLK_CTL_BASE + 0x4)); - pr_info("%s: GRP_NS_REG: 0x%08X\n", __func__, - readl_relaxed(MSM_CLK_CTL_BASE + 0x84)); - pr_info("%s: CLK_HALT_STATEB: 0x%08X\n", __func__, - readl_relaxed(MSM_CLK_CTL_BASE + 0x10C)); -} - -void __init msm_pm_register_irqs(void) -{ - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm_pm_set_irq_extns(&msm8625_pm_irq_calls); - else - msm_pm_set_irq_extns(&msm7x27a_pm_irq_calls); - -} - -static struct msm_pm_cpr_ops msm8625_pm_cpr_ops = { - .cpr_suspend = msm_cpr_pm_suspend, - .cpr_resume = msm_cpr_pm_resume, -}; - -void __init msm_pm_register_cpr_ops(void) -{ - /* CPR presents on revision >= v2.0 chipsets */ - if ((cpu_is_msm8625() && - SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 2) - || cpu_is_msm8625q()) - msm_pm_set_cpr_ops(&msm8625_pm_cpr_ops); -} - -#define MSM_SDC1_BASE 0xA0400000 -#define MSM_SDC2_BASE 0xA0500000 -#define MSM_SDC3_BASE 0xA0600000 -#define MSM_SDC4_BASE 0xA0700000 -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static int apps_reset; -static struct resource msm_csic0_resources[] = { - { - .name = "csic", - .start = 0xA0F00000, - .end = 0xA0F00000 + 0x00100000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = INT_CSI_IRQ_0, - .end = INT_CSI_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csic1_resources[] = { - { - .name = "csic", - .start = 0xA1000000, - .end = 0xA1000000 + 0x00100000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = INT_CSI_IRQ_1, - .end = INT_CSI_IRQ_1, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm7x27a_device_csic0 = { - .name = "msm_csic", - .id = 0, - .resource = msm_csic0_resources, - .num_resources = ARRAY_SIZE(msm_csic0_resources), -}; - -struct platform_device msm7x27a_device_csic1 = { - .name = "msm_csic", - .id = 1, - .resource = msm_csic1_resources, - .num_resources = ARRAY_SIZE(msm_csic1_resources), -}; - -static struct resource msm_clkctl_resources[] = { - { - .name = "clk_ctl", - .start = MSM7XXX_CLK_CTL_PHYS, - .end = MSM7XXX_CLK_CTL_PHYS + MSM7XXX_CLK_CTL_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; -struct platform_device msm7x27a_device_clkctl = { - .name = "msm_clk_ctl", - .id = 0, - .resource = msm_clkctl_resources, - .num_resources = ARRAY_SIZE(msm_clkctl_resources), - .dev = { - .platform_data = &apps_reset, - }, -}; - -struct platform_device msm7x27a_device_vfe = { - .name = "msm_vfe", - .id = 0, -}; - -#endif - -/* Command sequence for simple WFI */ -static uint8_t spm_wfi_cmd_sequence[] __initdata = { - 0x04, 0x03, 0x04, 0x0f, -}; - -/* Command sequence for GDFS, this won't send any interrupt to the modem */ -static uint8_t spm_pc_without_modem[] __initdata = { - 0x20, 0x00, 0x30, 0x10, - 0x03, 0x1e, 0x0e, 0x3e, - 0x4e, 0x4e, 0x4e, 0x4e, - 0x4e, 0x4e, 0x4e, 0x4e, - 0x4e, 0x4e, 0x4e, 0x4e, - 0x4e, 0x4e, 0x4e, 0x4e, - 0x2E, 0x0f, -}; - -static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = { - [0] = { - .mode = MSM_SPM_MODE_CLOCK_GATING, - .notify_rpm = false, - .cmd = spm_wfi_cmd_sequence, - }, - [1] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_pc_without_modem, - }, - [2] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_pc_without_modem, - }, - [3] = { - .mode = MSM_SPM_MODE_POWER_COLLAPSE, - .notify_rpm = false, - .cmd = spm_pc_without_modem, - }, -}; - -static struct msm_spm_platform_data msm_spm_data[] __initdata = { - [0] = { - .reg_base_addr = MSM_SAW0_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x0, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .num_modes = ARRAY_SIZE(msm_spm_seq_list), - .modes = msm_spm_seq_list, - }, - [1] = { - .reg_base_addr = MSM_SAW1_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x0, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .num_modes = ARRAY_SIZE(msm_spm_seq_list), - .modes = msm_spm_seq_list, - }, - [2] = { - .reg_base_addr = MSM_SAW2_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x0, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .num_modes = ARRAY_SIZE(msm_spm_seq_list), - .modes = msm_spm_seq_list, - }, - [3] = { - .reg_base_addr = MSM_SAW3_BASE, - .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x0, - .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01, - .num_modes = ARRAY_SIZE(msm_spm_seq_list), - .modes = msm_spm_seq_list, - }, -}; - -void __init msm8x25_spm_device_init(void) -{ - msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data)); -} - -#define MDP_BASE 0xAA200000 -#define MIPI_DSI_HW_BASE 0xA1100000 - -static struct resource msm_mipi_dsi_resources[] = { - { - .name = "mipi_dsi", - .start = MIPI_DSI_HW_BASE, - .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_DSI_IRQ, - .end = INT_DSI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_mipi_dsi_device = { - .name = "mipi_dsi", - .id = 1, - .num_resources = ARRAY_SIZE(msm_mipi_dsi_resources), - .resource = msm_mipi_dsi_resources, -}; - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F1008 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0xA0000000, - .end = 0xA001ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = INT_GRAPHICS, - .end = INT_GRAPHICS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 245760000, - .bus_freq = 200000000, - }, - { - .gpu_freq = 192000000, - .bus_freq = 160000000, - }, - { - .gpu_freq = 133330000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = 3, - .set_grp_async = set_grp_xbar_async, - .idle_timeout = HZ, - .strtstp_sleepwake = true, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM, -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -void __init msm7x25a_kgsl_3d0_init(void) -{ - if (cpu_is_msm7x25a() || cpu_is_msm7x25aa() || cpu_is_msm7x25ab()) { - kgsl_3d0_pdata.num_levels = 2; - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 133330000; - kgsl_3d0_pdata.pwrlevel[0].bus_freq = 160000000; - kgsl_3d0_pdata.pwrlevel[1].gpu_freq = 96000000; - kgsl_3d0_pdata.pwrlevel[1].bus_freq = 0; - } -} - -void __init msm8x25_kgsl_3d0_init(void) -{ - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - kgsl_3d0_pdata.idle_timeout = HZ/5; - kgsl_3d0_pdata.strtstp_sleepwake = false; - - if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 2) - /* 8x25 v2.0 & above supports a higher GPU frequency */ - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 320000000; - else - kgsl_3d0_pdata.pwrlevel[0].gpu_freq = 300000000; - - kgsl_3d0_pdata.pwrlevel[0].bus_freq = 200000000; - } -} - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - - -#define PERPH_WEB_BLOCK_ADDR (0xA9D00040) -#define PDM0_CTL_OFFSET (0x04) -#define SIZE_8B (0x08) - -static struct resource resources_led[] = { - { - .start = PERPH_WEB_BLOCK_ADDR, - .end = PERPH_WEB_BLOCK_ADDR + (SIZE_8B) - 1, - .name = "led-gpio-pdm", - .flags = IORESOURCE_MEM, - }, -}; - -static struct led_info msm_kpbl_pdm_led_pdata = { - .name = "keyboard-backlight", -}; - -struct platform_device led_pdev = { - .name = "leds-msm-pdm", - /* use pdev id to represent pdm id */ - .id = 0, - .num_resources = ARRAY_SIZE(resources_led), - .resource = resources_led, - .dev = { - .platform_data = &msm_kpbl_pdm_led_pdata, - }, -}; - -struct platform_device asoc_msm_pcm = { - .name = "msm-dsp-audio", - .id = 0, -}; - -struct platform_device asoc_msm_dai0 = { - .name = "msm-codec-dai", - .id = 0, -}; - -struct platform_device asoc_msm_dai1 = { - .name = "msm-cpu-dai", - .id = 0, -}; - -static struct resource gpio_resources[] = { - { - .start = INT_GPIO_GROUP1, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_GPIO_GROUP2, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_device_gpio = { - .name = "msmgpio", - .id = -1, - .resource = gpio_resources, - .num_resources = ARRAY_SIZE(gpio_resources), -}; - -struct platform_device *msm_footswitch_devices[] = { - FS_PCOM(FS_GFX3D, "vdd", "kgsl-3d0.0"), -}; -unsigned msm_num_footswitch_devices = ARRAY_SIZE(msm_footswitch_devices); - -/* MSM8625 Devices */ - -static struct resource msm8625_resources_uart1[] = { - { - .start = MSM8625_INT_UART1, - .end = MSM8625_INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7XXX_UART1_PHYS, - .end = MSM7XXX_UART1_PHYS + MSM7XXX_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8625_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_resources_uart1), - .resource = msm8625_resources_uart1, -}; - -static struct resource msm8625_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_UART1DM_IRQ, - .end = MSM8625_INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM8625_INT_UART1DM_RX, - .end = MSM8625_INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm8625_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_uart1_dm_resources), - .resource = msm8625_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm8625_uart2dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_UART2DM_IRQ, - .end = MSM8625_INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_uart_dm2 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_uart2dm_resources), - .resource = msm8625_uart2dm_resources, -}; - -static struct resource msm8625_resources_adsp[] = { - { - .start = MSM8625_INT_ADSP_A9_A11, - .end = MSM8625_INT_ADSP_A9_A11, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_adsp = { - .name = "msm_adsp", - .id = -1, - .num_resources = ARRAY_SIZE(msm8625_resources_adsp), - .resource = msm8625_resources_adsp, -}; - -static struct resource msm8625_dmov_resource[] = { - { - .start = MSM8625_INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm8625_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm8625_dmov_resource, - .num_resources = ARRAY_SIZE(msm8625_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -static struct resource gsbi0_msm8625_qup_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI0_QUP_PHYS, - .end = MSM_GSBI0_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI0_PHYS, - .end = MSM_GSBI0_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = MSM8625_INT_PWB_I2C, - .end = MSM8625_INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -/* Use GSBI0 QUP for /dev/i2c-0 */ -struct platform_device msm8625_gsbi0_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI0_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi0_msm8625_qup_resources), - .resource = gsbi0_msm8625_qup_resources, -}; - -static struct resource gsbi1_msm8625_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = MSM8625_INT_ARM11_DMA, - .end = MSM8625_INT_ARM11_DMA, - .flags = IORESOURCE_IRQ, - }, -}; - -/* Use GSBI1 QUP for /dev/i2c-1 */ -struct platform_device msm8625_gsbi1_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI1_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi1_qup_i2c_resources), - .resource = gsbi1_msm8625_qup_i2c_resources, -}; - -static struct resource msm8625_gpio_resources[] = { - { - .start = MSM8625_INT_GPIO_GROUP1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM8625_INT_GPIO_GROUP2, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm8625_device_gpio = { - .name = "msmgpio", - .id = -1, - .resource = msm8625_gpio_resources, - .num_resources = ARRAY_SIZE(msm8625_gpio_resources), -}; - -static struct resource msm8625_resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = MSM8625_INT_SDC1_0, - .end = MSM8625_INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource msm8625_resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = MSM8625_INT_SDC2_0, - .end = MSM8625_INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource msm8625_resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = MSM8625_INT_SDC3_0, - .end = MSM8625_INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource msm8625_resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = MSM8625_INT_SDC4_0, - .end = MSM8625_INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm8625_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(msm8625_resources_sdc1), - .resource = msm8625_resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm8625_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(msm8625_resources_sdc2), - .resource = msm8625_resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm8625_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(msm8625_resources_sdc3), - .resource = msm8625_resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm8625_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(msm8625_resources_sdc4), - .resource = msm8625_resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm8625_sdcc_devices[] __initdata = { - &msm8625_device_sdc1, - &msm8625_device_sdc2, - &msm8625_device_sdc3, - &msm8625_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - if (cpu_is_msm8625() || cpu_is_msm8625q()) - pdev = msm8625_sdcc_devices[controller-1]; - else - pdev = msm_sdcc_devices[controller-1]; - - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -static struct resource msm8625_resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_USB_HS, - .end = MSM8625_INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(msm8625_resources_hsusb_otg), - .resource = msm8625_resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource msm8625_resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_USB_HS, - .end = MSM8625_INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(msm8625_resources_gadget_peripheral), - .resource = msm8625_resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource msm8625_resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_USB_HS, - .end = MSM8625_INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_resources_hsusb_host), - .resource = msm8625_resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm8625_host_devices[] = { - &msm8625_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - if (cpu_is_msm8625() || cpu_is_msm8625q()) - pdev = msm8625_host_devices[host]; - else - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static struct resource msm8625_csic0_resources[] = { - { - .name = "csic", - .start = 0xA0F00000, - .end = 0xA0F00000 + 0x00100000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = MSM8625_INT_CSI_IRQ_0, - .end = MSM8625_INT_CSI_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm8625_csic1_resources[] = { - { - .name = "csic", - .start = 0xA1000000, - .end = 0xA1000000 + 0x00100000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = MSM8625_INT_CSI_IRQ_1, - .end = MSM8625_INT_CSI_IRQ_1, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_device_csic0 = { - .name = "msm_csic", - .id = 0, - .resource = msm8625_csic0_resources, - .num_resources = ARRAY_SIZE(msm8625_csic0_resources), -}; - -struct platform_device msm8625_device_csic1 = { - .name = "msm_csic", - .id = 1, - .resource = msm8625_csic1_resources, - .num_resources = ARRAY_SIZE(msm8625_csic1_resources), -}; -#endif - -static struct resource msm8625_mipi_dsi_resources[] = { - { - .name = "mipi_dsi", - .start = MIPI_DSI_HW_BASE, - .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_DSI_IRQ, - .end = MSM8625_INT_DSI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm8625_mipi_dsi_device = { - .name = "mipi_dsi", - .id = 1, - .num_resources = ARRAY_SIZE(msm8625_mipi_dsi_resources), - .resource = msm8625_mipi_dsi_resources, -}; - -static struct resource msm8625_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F1008 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM8625_INT_MDP, - .end = MSM8625_INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm8625_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_mdp_resources), - .resource = msm8625_mdp_resources, -}; - -struct platform_device mipi_dsi_device; - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) { - if (cpu_is_msm8625() || cpu_is_msm8625q()) - msm_register_device(&msm8625_mdp_device, data); - else - msm_register_device(&msm_mdp_device, data); - } else if (!strncmp(name, "mipi_dsi", 8)) { - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - msm_register_device(&msm8625_mipi_dsi_device, data); - mipi_dsi_device = msm8625_mipi_dsi_device; - } else { - msm_register_device(&msm_mipi_dsi_device, data); - mipi_dsi_device = msm_mipi_dsi_device; - } - } else if (!strncmp(name, "lcdc", 4)) { - msm_register_device(&msm_lcdc_device, data); - } else { - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); - } -} - -static struct resource msm8625_kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0xA0000000, - .end = 0xA001ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = MSM8625_INT_GRAPHICS, - .end = MSM8625_INT_GRAPHICS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8625_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(msm8625_kgsl_3d0_resources), - .resource = msm8625_kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -static struct resource pl310_resources[] = { - { - .start = 0xC0400000, - .end = 0xC0400000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "l2_irq", - .start = MSM8625_INT_L2CC_INTR, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device pl310_erp_device = { - .name = "pl310_erp", - .id = -1, - .resource = pl310_resources, - .num_resources = ARRAY_SIZE(pl310_resources), -}; - -enum { - MSM8625, - MSM8625A, - MSM8625AB, -}; - -static int __init msm8625_cpu_id(void) -{ - int raw_id, cpu; - - raw_id = socinfo_get_raw_id(); - switch (raw_id) { - /* Part number for 1GHz part */ - case 0x770: - case 0x771: - case 0x77C: - case 0x780: - case 0x785: /* Edge-only MSM8125-0 */ - case 0x8D0: - cpu = MSM8625; - break; - /* Part number for 1.2GHz part */ - case 0x773: - case 0x774: - case 0x781: - case 0x8D1: - cpu = MSM8625A; - break; - case 0x775: - case 0x776: - case 0x779: - case 0x77D: - case 0x782: - case 0x8D2: - cpu = MSM8625AB; - break; - default: - pr_err("Invalid Raw ID\n"); - return -ENODEV; - } - return cpu; -} - -static struct resource cpr_resources[] = { - { - .start = MSM8625_INT_CPR_IRQ0, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM8625_CPR_PHYS, - .end = MSM8625_CPR_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -/** - * These are various Vdd levels supported by PMIC - */ -static uint32_t msm_c2_pmic_mv[] __initdata = { - 1350000, 1337500, 1325000, 1312500, 1300000, - 1287500, 1275000, 1262500, 1250000, 1237500, - 1225000, 1212500, 1200000, 1187500, 1175000, - 1162500, 1150000, 1137500, 1125000, 1112500, - 1100000, 1087500, 1075000, 1062500, 0, - 0, 0, 0, 0, 0, - 0, 1050000, -}; - -/** - * This data will be based on CPR mode of operation - */ -static struct msm_cpr_mode msm_cpr_mode_data[] = { - [NORMAL_MODE] = { - .ring_osc_data = { - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - }, - .ring_osc = 0, - .step_quot = ~0, - .tgt_volt_offset = 0, - .nom_Vmax = 1350000, - .nom_Vmin = 1250000, - .calibrated_uV = 1100000, - }, - [TURBO_MODE] = { - .ring_osc_data = { - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - {0, }, - }, - .ring_osc = 0, - .step_quot = ~0, - .tgt_volt_offset = 0, - .turbo_Vmax = 1350000, - .turbo_Vmin = 1150000, - .nom_Vmax = 1350000, - .nom_Vmin = 1150000, - .calibrated_uV = 1300000, - }, -}; - -static uint32_t -msm_cpr_get_quot(uint32_t max_quot, uint32_t max_freq, uint32_t new_freq) -{ - uint32_t quot; - - /* This formula is as per chip characterization data */ - quot = max_quot - (((max_freq - new_freq) * 7) / 10); - - return quot; -} - -static void msm_cpr_clk_enable(void) -{ - uint32_t reg_val; - - /* Select TCXO (19.2MHz) as clock source */ - reg_val = readl_relaxed(A11S_TEST_BUS_SEL_ADDR); - reg_val |= RBCPR_CLK_MUX_SEL; - writel_relaxed(reg_val, A11S_TEST_BUS_SEL_ADDR); - - /* Get CPR out of reset */ - writel_relaxed(0x1, RBCPR_SW_RESET_N); -} - -static struct msm_cpr_config msm_cpr_pdata = { - .ref_clk_khz = 19200, - .delay_us = 25000, - .irq_line = 0, - .cpr_mode_data = msm_cpr_mode_data, - .tgt_count_div_N = 1, - .floor = 0, - .ceiling = 40, - .sw_vlevel = 20, - .up_threshold = 1, - .dn_threshold = 3, - .up_margin = 0, - .dn_margin = 0, - .max_nom_freq = 700800, - .max_freq = 1401600, - .max_quot = 0, - .disable_cpr = false, - .step_size = 12500, - .get_quot = msm_cpr_get_quot, - .clk_enable = msm_cpr_clk_enable, -}; - -static struct platform_device msm8625_device_cpr = { - .name = "msm-cpr", - .id = -1, - .num_resources = ARRAY_SIZE(cpr_resources), - .resource = cpr_resources, - .dev = { - .platform_data = &msm_cpr_pdata, - }, -}; - -static struct platform_device msm8625_vp_device = { - .name = "vp-regulator", - .id = -1, -}; - -static void __init msm_cpr_init(void) -{ - struct cpr_info_type *cpr_info = NULL; - uint8_t ring_osc = 0; - - cpr_info = kzalloc(sizeof(struct cpr_info_type), GFP_KERNEL); - if (!cpr_info) { - pr_err("%s: Out of memory %d\n", __func__, -ENOMEM); - return; - } - - msm_smem_get_cpr_info(cpr_info); - msm_cpr_pdata.disable_cpr = cpr_info->disable_cpr; - - /** - * Set the ring_osc based on efuse BIT(0) - * CPR_fuse[0] = 0 selects 2nd RO (010) - * CPR_fuse[0] = 1 select 3rd RO (011) - */ - if (cpr_info->ring_osc == 0x0) - ring_osc = 0x2; - else if (cpr_info->ring_osc == 0x1) - ring_osc = 0x3; - - msm_cpr_mode_data[TURBO_MODE].ring_osc = ring_osc; - msm_cpr_mode_data[NORMAL_MODE].ring_osc = ring_osc; - - /* GCNT = 1000 nsec/52nsec (@TCX0=19.2Mhz) = 19.2 */ - msm_cpr_mode_data[TURBO_MODE].ring_osc_data[ring_osc].gcnt = 19; - msm_cpr_mode_data[NORMAL_MODE].ring_osc_data[ring_osc].gcnt = 19; - - /** - * The scaling factor and offset are as per chip characterization data - * This formula is used since available fuse bits in the chip are not - * enough to represent the value of maximum quot - */ - msm_cpr_pdata.max_quot = cpr_info->turbo_quot * 10 + 600; - /** - * Fused Quot value for 1.2GHz on a 1.2GHz part is lower than - * the quot value calculated using the scaling factor formula for - * 1.2GHz when running on a 1.4GHz part. So, prop up the Quot for - * a 1.2GHz part by a chip characterization recommended value. - * Ditto for a 1.0GHz part. - */ - if (msm8625_cpu_id() == MSM8625A) { - msm_cpr_pdata.max_quot += 30; - if (msm_cpr_pdata.max_quot > 1400) - msm_cpr_pdata.max_quot = 1400; - } else if (msm8625_cpu_id() == MSM8625) { - msm_cpr_pdata.max_quot += 50; - if (msm_cpr_pdata.max_quot > 1350) - msm_cpr_pdata.max_quot = 1350; - } - - /** - * Bits 4:0 of pvs_fuse provide mapping to the safe boot up voltage. - * Boot up mode is by default Turbo. - */ - msm_cpr_mode_data[TURBO_MODE].calibrated_uV = - msm_c2_pmic_mv[cpr_info->pvs_fuse & 0x1F]; - - if ((cpr_info->floor_fuse & 0x3) == 0x0) { - msm_cpr_mode_data[TURBO_MODE].nom_Vmin = 1000000; - msm_cpr_mode_data[TURBO_MODE].turbo_Vmin = 1100000; - } else if ((cpr_info->floor_fuse & 0x3) == 0x1) { - msm_cpr_mode_data[TURBO_MODE].nom_Vmin = 1050000; - msm_cpr_mode_data[TURBO_MODE].turbo_Vmin = 1100000; - } else if ((cpr_info->floor_fuse & 0x3) == 0x2) { - msm_cpr_mode_data[TURBO_MODE].nom_Vmin = 1100000; - msm_cpr_mode_data[TURBO_MODE].turbo_Vmin = 1100000; - } - - pr_debug("%s: cpr: ring_osc: 0x%x\n", __func__, - msm_cpr_mode_data[TURBO_MODE].ring_osc); - pr_debug("%s: cpr: turbo_quot: 0x%x\n", __func__, cpr_info->turbo_quot); - pr_debug("%s: cpr: pvs_fuse: 0x%x\n", __func__, cpr_info->pvs_fuse); - pr_debug("%s: cpr: floor_fuse: 0x%x\n", __func__, cpr_info->floor_fuse); - pr_debug("%s: cpr: nom_Vmin: %d, turbo_Vmin: %d\n", __func__, - msm_cpr_mode_data[TURBO_MODE].nom_Vmin, - msm_cpr_mode_data[TURBO_MODE].turbo_Vmin); - kfree(cpr_info); - - if (msm8625_cpu_id() == MSM8625A) - msm_cpr_pdata.max_freq = 1209600; - else if (msm8625_cpu_id() == MSM8625) - msm_cpr_pdata.max_freq = 1008000; - - if (machine_is_qrd_skud_prime() || cpu_is_msm8625q()) - msm_cpr_pdata.step_size = 6250; - platform_device_register(&msm8625_vp_device); - platform_device_register(&msm8625_device_cpr); -} - -static struct clk_lookup msm_clock_8625_dummy[] = { - CLK_DUMMY("core_clk", adm_clk.c, "msm_dmov", 0), - CLK_DUMMY("adsp_clk", adsp_clk.c, NULL, 0), - CLK_DUMMY("ahb_m_clk", ahb_m_clk.c, NULL, 0), - CLK_DUMMY("ahb_s_clk", ahb_s_clk.c, NULL, 0), - CLK_DUMMY("cam_m_clk", cam_m_clk.c, NULL, 0), - CLK_DUMMY("csi_clk", csi1_clk.c, NULL, 0), - CLK_DUMMY("csi_pclk", csi1_p_clk.c, NULL, 0), - CLK_DUMMY("csi_vfe_clk", csi1_vfe_clk.c, NULL, 0), - CLK_DUMMY("dsi_byte_clk", dsi_byte_clk.c, NULL, 0), - CLK_DUMMY("dsi_clk", dsi_clk.c, NULL, 0), - CLK_DUMMY("dsi_esc_clk", dsi_esc_clk.c, NULL, 0), - CLK_DUMMY("dsi_pixel_clk", dsi_pixel_clk.c, NULL, 0), - CLK_DUMMY("dsi_ref_clk", dsi_ref_clk.c, NULL, 0), - CLK_DUMMY("ebi1_clk", ebi1_clk.c, NULL, 0), - CLK_DUMMY("ebi2_clk", ebi2_clk.c, NULL, 0), - CLK_DUMMY("ecodec_clk", ecodec_clk.c, NULL, 0), - CLK_DUMMY("gp_clk", gp_clk.c, NULL, 0), - CLK_DUMMY("core_clk", gsbi1_qup_clk.c, "qup_i2c.0", 0), - CLK_DUMMY("core_clk", gsbi2_qup_clk.c, "qup_i2c.1", 0), - CLK_DUMMY("iface_clk", gsbi1_qup_p_clk.c, "qup_i2c.0", 0), - CLK_DUMMY("iface_clk", gsbi2_qup_p_clk.c, "qup_i2c.1", 0), - CLK_DUMMY("icodec_rx_clk", icodec_rx_clk.c, NULL, 0), - CLK_DUMMY("icodec_tx_clk", icodec_tx_clk.c, NULL, 0), - CLK_DUMMY("mem_clk", imem_clk.c, NULL, 0), - CLK_DUMMY("mddi_clk", pmdh_clk.c, NULL, 0), - CLK_DUMMY("mdp_clk", mdp_clk.c, NULL, 0), - CLK_DUMMY("mdp_lcdc_pclk_clk", mdp_lcdc_pclk_clk.c, NULL, 0), - CLK_DUMMY("mdp_lcdc_pad_pclk_clk", mdp_lcdc_pad_pclk_clk.c, NULL, 0), - CLK_DUMMY("mdp_vsync_clk", mdp_vsync_clk.c, NULL, 0), - CLK_DUMMY("mdp_dsi_pclk", mdp_dsi_p_clk.c, NULL, 0), - CLK_DUMMY("pbus_clk", pbus_clk.c, NULL, 0), - CLK_DUMMY("pcm_clk", pcm_clk.c, NULL, 0), - CLK_DUMMY("sdac_clk", sdac_clk.c, NULL, 0), - CLK_DUMMY("core_clk", sdc1_clk.c, "msm_sdcc.1", 0), - CLK_DUMMY("iface_clk", sdc1_p_clk.c, "msm_sdcc.1", 0), - CLK_DUMMY("core_clk", sdc2_clk.c, "msm_sdcc.2", 0), - CLK_DUMMY("iface_clk", sdc2_p_clk.c, "msm_sdcc.2", 0), - CLK_DUMMY("core_clk", sdc3_clk.c, "msm_sdcc.3", 0), - CLK_DUMMY("iface_clk", sdc3_p_clk.c, "msm_sdcc.3", 0), - CLK_DUMMY("core_clk", sdc4_clk.c, "msm_sdcc.4", 0), - CLK_DUMMY("iface_clk", sdc4_p_clk.c, "msm_sdcc.4", 0), - CLK_DUMMY("ref_clk", tsif_ref_clk.c, "msm_tsif.0", 0), - CLK_DUMMY("iface_clk", tsif_p_clk.c, "msm_tsif.0", 0), - CLK_DUMMY("core_clk", uart1_clk.c, "msm_serial.0", 0), - CLK_DUMMY("core_clk", uart2_clk.c, "msm_serial.1", 0), - CLK_DUMMY("core_clk", uart1dm_clk.c, "msm_serial_hs.0", 0), - CLK_DUMMY("core_clk", uart2dm_clk.c, "msm_serial_hsl.0", 0), - CLK_DUMMY("usb_hs_core_clk", usb_hs_core_clk.c, NULL, 0), - CLK_DUMMY("usb_hs2_clk", usb_hs2_clk.c, NULL, 0), - CLK_DUMMY("usb_hs_clk", usb_hs_clk.c, NULL, 0), - CLK_DUMMY("usb_hs_pclk", usb_hs_p_clk.c, NULL, 0), - CLK_DUMMY("usb_phy_clk", usb_phy_clk.c, NULL, 0), - CLK_DUMMY("vdc_clk", vdc_clk.c, NULL, 0), - CLK_DUMMY("ebi1_acpu_clk", ebi_acpu_clk.c, NULL, 0), - CLK_DUMMY("ebi1_lcdc_clk", ebi_lcdc_clk.c, NULL, 0), - CLK_DUMMY("ebi1_mddi_clk", ebi_mddi_clk.c, NULL, 0), - CLK_DUMMY("ebi1_usb_clk", ebi_usb_clk.c, NULL, 0), - CLK_DUMMY("ebi1_vfe_clk", ebi_vfe_clk.c, NULL, 0), - CLK_DUMMY("mem_clk", ebi_adm_clk.c, "msm_dmov", 0), -}; - -struct clock_init_data msm8625_dummy_clock_init_data __initdata = { - .table = msm_clock_8625_dummy, - .size = ARRAY_SIZE(msm_clock_8625_dummy), -}; - - -static int __init msm_gpio_config_gps(void) -{ - unsigned int gps_gpio = 7; - int ret = 0; - - if (!machine_is_msm8625_evb()) - return ret; - - ret = gpio_tlmm_config(GPIO_CFG(gps_gpio, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE); - if (ret < 0) { - pr_err("gpio tlmm failed for gpio-%d\n", gps_gpio); - return ret; - } - - ret = gpio_request(gps_gpio, "gnss-gpio"); - if (ret < 0) { - pr_err("failed to request gpio-%d\n", gps_gpio); - return ret; - } - - ret = gpio_direction_input(gps_gpio); - if (ret < 0) { - pr_err("failed to change direction for gpio-%d\n", gps_gpio); - return ret; - } - - ret = gpio_export(gps_gpio, true); - if (ret < 0) - pr_err("failed to export gpio for user\n"); - - return ret; -} - -static int __init msm_acpuclock_init(bool flag) -{ - struct cpr_info_type *acpu_info = NULL; - acpu_info = kzalloc(sizeof(struct cpr_info_type), GFP_KERNEL); - if (!acpu_info) { - pr_err("%s: Out of memory %d\n", __func__, -ENOMEM); - return -ENOMEM; - } - msm_smem_get_cpr_info(acpu_info); - msm8625q_acpuclk_pdata.pvs_voltage_uv = - msm_c2_pmic_mv[acpu_info->pvs_fuse & 0x1F]; - kfree(acpu_info); - msm8625q_acpuclk_pdata.flag = flag; - return 0; -} - -int __init msm7x2x_misc_init(void) -{ - if (machine_is_msm8625_rumi3()) { - msm_clock_init(&msm8625_dummy_clock_init_data); - msm_cpr_init(); - return 0; - } - - msm_clock_init(&msm7x27a_clock_init_data); - if (cpu_is_msm7x27aa() || cpu_is_msm7x25ab()) - platform_device_register(&msm7x27aa_device_acpuclk); - else if (cpu_is_msm8625q()) { - msm_acpuclock_init(1); - platform_device_register(&msm8625q_device_acpuclk); - } else if (cpu_is_msm8625()) { - if (machine_is_qrd_skud_prime()) { - msm_acpuclock_init(0); - platform_device_register(&msm8625q_device_acpuclk); - } else if (msm8625_cpu_id() == MSM8625) - platform_device_register(&msm7x27aa_device_acpuclk); - else if (msm8625_cpu_id() == MSM8625A) - platform_device_register(&msm8625_device_acpuclk); - else if (msm8625_cpu_id() == MSM8625AB) - platform_device_register(&msm8625ab_device_acpuclk); - } else { - platform_device_register(&msm7x27a_device_acpuclk); - } - - if (cpu_is_msm8625() || (cpu_is_msm8625q() && - SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 2)) - msm_cpr_init(); - - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - pl310_resources[1].start = INT_L2CC_INTR; - - platform_device_register(&pl310_erp_device); - - if (msm_gpio_config_gps() < 0) - pr_err("Error for gpio config for GPS gpio\n"); - - return 0; -} - -#ifdef CONFIG_CACHE_L2X0 -static int __init msm7x27x_cache_init(void) -{ - int aux_ctrl = 0; - int pctrl = 0; - - /* Way Size 010(0x2) 32KB */ - aux_ctrl = (0x1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) | \ - (0x2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) | \ - (0x1 << L2X0_AUX_CTRL_EVNT_MON_BUS_EN_SHIFT); - - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - /* Way Size 011(0x3) 64KB */ - aux_ctrl |= (0x3 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) | \ - (0x1 << L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT) | \ - (0X1 << L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT) | \ - (0x1 << L2X0_AUX_CTRL_L2_FORCE_NWA_SHIFT); - - /* Write Prefetch Control settings */ - pctrl = readl_relaxed(MSM_L2CC_BASE + L2X0_PREFETCH_CTRL); - pctrl |= (0x3 << L2X0_PREFETCH_CTRL_OFFSET_SHIFT) | \ - (0x1 << L2X0_PREFETCH_CTRL_WRAP8_INC_SHIFT) | \ - (0x1 << L2X0_PREFETCH_CTRL_WRAP8_SHIFT); - writel_relaxed(pctrl , MSM_L2CC_BASE + L2X0_PREFETCH_CTRL); - } - - l2x0_init(MSM_L2CC_BASE, aux_ctrl, L2X0_AUX_CTRL_MASK); - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - pctrl = readl_relaxed(MSM_L2CC_BASE + L2X0_PREFETCH_CTRL); - pr_info("Prfetch Ctrl: 0x%08x\n", pctrl); - } - - return 0; -} -#else -static int __init msm7x27x_cache_init(void){ return 0; } -#endif - -void __init msm_common_io_init(void) -{ - msm_map_common_io(); - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - msm7x27x_cache_init(); -} - -void __init msm8625_init_irq(void) -{ - msm_gic_irq_extn_init(); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, - (void *)MSM_QGIC_CPU_BASE); -} - -void __init msm8625_map_io(void) -{ - msm_map_msm8625_io(); - - if (socinfo_init() < 0) - pr_err("socinfo_init() failed!\n"); - msm7x27x_cache_init(); -} - -static int msm7627a_init_gpio(void) -{ - if (cpu_is_msm8625() || cpu_is_msm8625q()) - platform_device_register(&msm8625_device_gpio); - else - platform_device_register(&msm_device_gpio); - return 0; -} -postcore_initcall(msm7627a_init_gpio); - -static int msm7627a_panic_handler(struct notifier_block *this, - unsigned long event, void *ptr) -{ - msm_clk_dump_debug_info(); - flush_cache_all(); - outer_flush_all(); - return NOTIFY_DONE; -} - -static struct notifier_block panic_handler = { - .notifier_call = msm7627a_panic_handler, - .priority = INT_MAX, -}; - -static int __init panic_register(void) -{ - atomic_notifier_chain_register(&panic_notifier_list, - &panic_handler); - return 0; -} -module_init(panic_register); diff --git a/arch/arm/mach-msm/devices-msm7x2xa.h b/arch/arm/mach-msm/devices-msm7x2xa.h deleted file mode 100644 index 60a46493cc90..000000000000 --- a/arch/arm/mach-msm/devices-msm7x2xa.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __ARCH_ARM_MACH_MSM_DEVICES_MSM7X2XA_H -#define __ARCH_ARM_MACH_MSM_DEVICES_MSM7X2XA_H - -#define MSM_GSBI0_QUP_I2C_BUS_ID 0 -#define MSM_GSBI1_QUP_I2C_BUS_ID 1 - -void __init msm_common_io_init(void); -void __init msm_init_pmic_vibrator(void); -void __init msm7x25a_kgsl_3d0_init(void); -int __init msm7x2x_misc_init(void); -extern struct platform_device msm7x27a_device_vfe; -extern struct platform_device msm7x27a_device_csic0; -extern struct platform_device msm7x27a_device_csic1; -extern struct platform_device msm7x27a_device_clkctl; - -extern struct platform_device msm8625_device_csic0; -extern struct platform_device msm8625_device_csic1; - -void __init msm8625_init_irq(void); -void __init msm8625_map_io(void); -int ar600x_wlan_power(bool on); -void __init msm8x25_spm_device_init(void); -void __init msm_pm_register_cpr_ops(void); -void __init msm8x25_kgsl_3d0_init(void); -void __iomem *core_reset_base(unsigned int); -extern void setup_mm_for_reboot(void); -#endif diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c deleted file mode 100644 index cdbf2eae8720..000000000000 --- a/arch/arm/mach-msm/devices-msm7x30.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "devices.h" -#include "footswitch.h" - -#include - -#include -#include -#ifdef CONFIG_PMIC8058 -#include -#endif -#include -#include -#include "pm.h" -#include "irq.h" - -struct platform_device msm7x30_device_acpuclk = { - .name = "acpuclk-7x30", - .id = -1, -}; - -/* EBI THERMAL DRIVER */ -static struct resource msm_ebi0_thermal_resources[] = { - { - .start = 0xA8600000, - .end = 0xA86005FF, - .name = "physbase", - .flags = IORESOURCE_MEM - } -}; - -struct platform_device msm_ebi0_thermal = { - .name = "msm_popmem-tm", - .id = 0, - .num_resources = 1, - .resource = msm_ebi0_thermal_resources -}; - -static struct resource msm_ebi1_thermal_resources[] = { - { - .start = 0xA8700000, - .end = 0xA87005FF, - .name = "physbase", - .flags = IORESOURCE_MEM - } -}; - -struct platform_device msm_ebi1_thermal = { - .name = "msm_popmem-tm", - .id = 1, - .num_resources = 1, - .resource = msm_ebi1_thermal_resources -}; - -static struct resource resources_adsp[] = { -{ - .start = INT_ADSP_A9_A11, - .end = INT_ADSP_A9_A11, - .flags = IORESOURCE_IRQ, -}, -}; - -struct platform_device msm_adsp_device = { - .name = "msm_adsp", - .id = -1, - .num_resources = ARRAY_SIZE(resources_adsp), - .resource = resources_adsp, -}; - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7X30_UART1_PHYS, - .end = MSM7X30_UART1_PHYS + MSM7X30_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7X30_UART2_PHYS, - .end = MSM7X30_UART2_PHYS + MSM7X30_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - .name = "uart_resource" - }, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM7X30_UART3_PHYS, - .end = MSM7X30_UART3_PHYS + MSM7X30_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_serial", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -#define MSM_UART1DM_PHYS 0xA3300000 -#define MSM_UART2DM_PHYS 0xA3200000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_I2C_SIZE SZ_4K -#define MSM_I2C_PHYS 0xACD00000 -#define MSM_I2C_2_PHYS 0xACF00000 -static struct resource resources_i2c_2[] = { - { - .start = MSM_I2C_2_PHYS, - .end = MSM_I2C_2_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C_2, - .end = INT_PWB_I2C_2, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c_2 = { - .name = "msm_i2c", - .id = 2, - .num_resources = ARRAY_SIZE(resources_i2c_2), - .resource = resources_i2c_2, -}; - -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static struct resource msm_csic_resources[] = { - { - .name = "csic", - .start = 0xA6100000, - .end = 0xA6100000 + 0x00000400 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = INT_CSI, - .end = INT_CSI, - .flags = IORESOURCE_IRQ, - }, -}; - -struct resource msm_vfe_resources[] = { - { - .name = "msm_vfe", - .start = 0xA6000000, - .end = 0xA6000000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "msm_vfe", - .start = INT_VFE, - .end = INT_VFE, - .flags = IORESOURCE_IRQ, - }, - { - .name = "msm_camif", - .start = 0xAB000000, - .end = 0xAB000000 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_vpe_resources[] = { - { - .name = "vpe", - .start = 0xAD200000, - .end = 0xAD200000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "vpe", - .start = INT_VPE, - .end = INT_VPE, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_csic0 = { - .name = "msm_csic", - .id = 0, - .resource = msm_csic_resources, - .num_resources = ARRAY_SIZE(msm_csic_resources), -}; - -struct platform_device msm_device_vfe = { - .name = "msm_vfe", - .id = 0, - .resource = msm_vfe_resources, - .num_resources = ARRAY_SIZE(msm_vfe_resources), -}; - -struct platform_device msm_device_vpe = { - .name = "msm_vpe", - .id = 0, - .resource = msm_vpe_resources, - .num_resources = ARRAY_SIZE(msm_vpe_resources), -}; -#endif - -#define MSM_QUP_PHYS 0xA8301000 -#define MSM_GSBI_QUP_I2C_PHYS 0xA8300000 -#define MSM_QUP_SIZE SZ_4K -static struct resource resources_qup[] = { - { - .name = "qup_phys_addr", - .start = MSM_QUP_PHYS, - .end = MSM_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI_QUP_I2C_PHYS, - .end = MSM_GSBI_QUP_I2C_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_in_intr", - .start = INT_PWB_QUP_IN, - .end = INT_PWB_QUP_IN, - .flags = IORESOURCE_IRQ, - }, - { - .name = "qup_out_intr", - .start = INT_PWB_QUP_OUT, - .end = INT_PWB_QUP_OUT, - .flags = IORESOURCE_IRQ, - }, - { - .name = "qup_err_intr", - .start = INT_PWB_QUP_ERR, - .end = INT_PWB_QUP_ERR, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device qup_device_i2c = { - .name = "qup_i2c", - .id = 4, - .num_resources = ARRAY_SIZE(resources_qup), - .resource = resources_qup, -}; - -#ifdef CONFIG_MSM_SSBI -#define MSM_SSBI_PMIC1_PHYS 0xAD900000 -static struct resource msm_ssbi_pmic1_resources[] = { - { - .start = MSM_SSBI_PMIC1_PHYS, - .end = MSM_SSBI_PMIC1_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi_pmic1 = { - .name = "msm_ssbi", - .id = 0, - .resource = msm_ssbi_pmic1_resources, - .num_resources = ARRAY_SIZE(msm_ssbi_pmic1_resources), -}; -#endif - -#ifdef CONFIG_I2C_SSBI -#define MSM_SSBI7_PHYS 0xAC800000 -static struct resource msm_ssbi7_resources[] = { - { - .name = "ssbi_base", - .start = MSM_SSBI7_PHYS, - .end = MSM_SSBI7_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi7 = { - .name = "i2c_ssbi", - .id = 7, - .num_resources = ARRAY_SIZE(msm_ssbi7_resources), - .resource = msm_ssbi7_resources, -}; -#endif /* CONFIG_I2C_SSBI */ - -#define MSM_HSUSB_PHYS 0xA3600000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_hsusb_otg = { - .name = "msm_hsusb_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_peripheral = { - .name = "msm_hsusb_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_peripheral), - .resource = resources_hsusb_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -struct platform_device asoc_msm_pcm = { - .name = "msm-dsp-audio", - .id = 0, -}; - -struct platform_device asoc_msm_dai0 = { - .name = "msm-codec-dai", - .id = 0, -}; - -struct platform_device asoc_msm_dai1 = { - .name = "msm-cpu-dai", - .id = 0, -}; - -#if defined (CONFIG_SND_MSM_MVS_DAI_SOC) -struct platform_device asoc_msm_mvs = { - .name = "msm-mvs-audio", - .id = 0, -}; - -struct platform_device asoc_mvs_dai0 = { - .name = "mvs-codec-dai", - .id = 0, -}; - -struct platform_device asoc_mvs_dai1 = { - .name = "mvs-cpu-dai", - .id = 0, -}; -#endif - -#define MSM_NAND_PHYS 0xA0200000 -#define MSM_NANDC01_PHYS 0xA0240000 -#define MSM_NANDC10_PHYS 0xA0280000 -#define MSM_NANDC11_PHYS 0xA02C0000 -#define EBI2_REG_BASE 0xA0000000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [2] = { - .name = "msm_nandc01_phys", - .start = MSM_NANDC01_PHYS, - .end = MSM_NANDC01_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [3] = { - .name = "msm_nandc10_phys", - .start = MSM_NANDC10_PHYS, - .end = MSM_NANDC10_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [4] = { - .name = "msm_nandc11_phys", - .start = MSM_NANDC11_PHYS, - .end = MSM_NANDC11_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, - [5] = { - .name = "ebi2_reg_base", - .start = EBI2_REG_BASE, - .end = EBI2_REG_BASE + 0x60, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, - { - .name = "vbus_on", - .start = PMIC8058_IRQ_BASE + PM8058_CHGVAL_IRQ, - .end = PMIC8058_IRQ_BASE + PM8058_CHGVAL_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct flash_platform_data msm_nand_data = { - .version = VERSION_2, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -static struct msm_pm_irq_calls msm7x30_pm_irq_calls = { - .irq_pending = msm_irq_pending, - .idle_sleep_allowed = msm_irq_idle_sleep_allowed, - .enter_sleep1 = msm_irq_enter_sleep1, - .enter_sleep2 = msm_irq_enter_sleep2, - .exit_sleep1 = msm_irq_exit_sleep1, - .exit_sleep2 = msm_irq_exit_sleep2, - .exit_sleep3 = msm_irq_exit_sleep3, -}; - -void __init msm_pm_register_irqs(void) -{ - msm_pm_set_irq_extns(&msm7x30_pm_irq_calls); -} - -static struct resource smd_resource[] = { - { - .name = "a9_m2a_0", - .start = INT_A9_M2A_0, - .flags = IORESOURCE_IRQ, - }, - { - .name = "a9_m2a_5", - .start = INT_A9_M2A_5, - .flags = IORESOURCE_IRQ, - }, - { - .name = "adsp_a11_smsm", - .start = INT_ADSP_A11, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct smd_subsystem_config smd_config_list[] = { - { - .irq_config_id = SMD_MODEM, - .subsys_name = "modem", - .edge = SMD_APPS_MODEM, - - .smd_int.irq_name = "a9_m2a_0", - .smd_int.flags = IRQF_TRIGGER_RISING, - .smd_int.irq_id = -1, - .smd_int.device_name = "smd_dev", - .smd_int.dev_id = 0, - - .smd_int.out_bit_pos = 1 << 0, - .smd_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smd_int.out_offset = 0x8, - - .smsm_int.irq_name = "a9_m2a_5", - .smsm_int.flags = IRQF_TRIGGER_RISING, - .smsm_int.irq_id = -1, - .smsm_int.device_name = "smd_dev", - .smsm_int.dev_id = 0, - - .smsm_int.out_bit_pos = 1 << 5, - .smsm_int.out_base = (void __iomem *)MSM_APCS_GCC_BASE, - .smsm_int.out_offset = 0x8, - - } -}; - -static struct smd_platform smd_platform_data = { - .num_ss_configs = ARRAY_SIZE(smd_config_list), - .smd_ss_configs = smd_config_list, -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, - .resource = smd_resource, - .num_resources = ARRAY_SIZE(smd_resource), - .dev = { - .platform_data = &smd_platform_data, - } - -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xAC400000, - .end = 0xAC400000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 2, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -#define MSM_SDC1_BASE 0xA0400000 -#define MSM_SDC2_BASE 0xA0500000 -#define MSM_SDC3_BASE 0xA3000000 -#define MSM_SDC4_BASE 0xA3100000 -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC3_CHAN, - .end = DMOV_SDC3_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -static struct resource msm_vidc_720p_resources[] = { - { - .start = 0xA3B00000, - .end = 0xA3B00000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MFC720, - .end = INT_MFC720, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_vidc_platform_data vidc_platform_data = { - .memtype = ION_CAMERA_HEAP_ID, - .enable_ion = 1, - .disable_dmx = 0, - .cont_mode_dpb_count = 8 -}; - -struct platform_device msm_device_vidc_720p = { - .name = "msm_vidc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_vidc_720p_resources), - .resource = msm_vidc_720p_resources, - .dev = { - .platform_data = &vidc_platform_data, - }, -}; - -#if defined(CONFIG_FB_MSM_MDP40) -#define MDP_BASE 0xA3F00000 -#define PMDH_BASE 0xAD600000 -#define EMDH_BASE 0xAD700000 -#define TVENC_BASE 0xAD400000 -#else -#define MDP_BASE 0xAA200000 -#define PMDH_BASE 0xAA600000 -#define EMDH_BASE 0xAA700000 -#define TVENC_BASE 0xAA400000 -#endif - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_mddi_resources[] = { - { - .name = "pmdh", - .start = PMDH_BASE, - .end = PMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mddi_ext_resources[] = { - { - .name = "emdh", - .start = EMDH_BASE, - .end = EMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_ebi2_lcd_resources[] = { - { - .name = "base", - .start = 0xa0d00000, - .end = 0xa0d00000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x98000000, - .end = 0x98000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd02", - .start = 0x9c000000, - .end = 0x9c000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_BASE, - .end = TVENC_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -#ifdef CONFIG_FB_MSM_TVOUT -static struct resource tvout_device_resources[] = { - { - .name = "tvout_device_irq", - .start = INT_TV_ENC, - .end = INT_TV_ENC, - .flags = IORESOURCE_IRQ, - }, -}; -#endif - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static struct platform_device msm_mddi_device = { - .name = "mddi", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_resources), - .resource = msm_mddi_resources, -}; - -static struct platform_device msm_mddi_ext_device = { - .name = "mddi_ext", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_ext_resources), - .resource = msm_mddi_ext_resources, -}; - -static struct platform_device msm_ebi2_lcd_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcd_resources), - .resource = msm_ebi2_lcd_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct platform_device msm_dtv_device = { - .name = "dtv", - .id = 0, -}; - -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -#ifdef CONFIG_FB_MSM_TVOUT -static struct platform_device tvout_msm_device = { - .name = "tvout_device", - .id = 0, - .num_resources = ARRAY_SIZE(tvout_device_resources), - .resource = tvout_device_resources, -}; -#endif - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define MSM_TSIF_PHYS (0xa3400000) -#define MSM_TSIF_SIZE (0x200) - -static struct resource tsif_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = INT_TSIF, - .end = INT_TSIF, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF_PHYS, - .end = MSM_TSIF_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_release(struct device *dev) -{ - dev_info(dev, "release\n"); -} - -struct platform_device msm_device_tsif = { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif_resources), - .resource = tsif_resources, - .dev = { - .release = tsif_release, - }, -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - - - -#ifdef CONFIG_MSM_ROTATOR -static struct resource resources_msm_rotator[] = { - { - .start = 0xA3E00000, - .end = 0xA3F00000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_ROTATOR, - .end = INT_ROTATOR, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_rot_clocks rotator_clocks[] = { - { - .clk_name = "core_clk", - .clk_type = ROTATOR_CORE_CLK, - .clk_rate = 0, - }, - { - .clk_name = "iface_clk", - .clk_type = ROTATOR_PCLK, - .clk_rate = 0, - }, - { - .clk_name = "mem_clk", - .clk_type = ROTATOR_IMEM_CLK, - .clk_rate = 0, - }, -}; - -static struct msm_rotator_platform_data rotator_pdata = { - .number_of_clocks = ARRAY_SIZE(rotator_clocks), - .hardware_version_number = 0x1000303, - .rotator_clks = rotator_clocks, -}; - -struct platform_device msm_rotator_device = { - .name = "msm_rotator", - .id = 0, - .num_resources = ARRAY_SIZE(resources_msm_rotator), - .resource = resources_msm_rotator, - .dev = { - .platform_data = &rotator_pdata, - }, -}; -#endif - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "pmdh", 4)) - msm_register_device(&msm_mddi_device, data); - else if (!strncmp(name, "emdh", 4)) - msm_register_device(&msm_mddi_ext_device, data); - else if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcd_device, data); - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else if (!strncmp(name, "dtv", 3)) - msm_register_device(&msm_dtv_device, data); -#ifdef CONFIG_FB_MSM_TVOUT - else if (!strncmp(name, "tvout_device", 12)) - msm_register_device(&tvout_msm_device, data); -#endif - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct platform_device msm_camera_device = { - .name = "msm_camera", - .id = 0, -}; - -void __init msm_camera_register_device(void *res, uint32_t num, - void *data) -{ - msm_camera_device.num_resources = num; - msm_camera_device.resource = res; - - msm_register_device(&msm_camera_device, data); -} - -struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0xA3500000, /* 3D GRP address */ - .end = 0xA351ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = INT_GRP_3D, - .end = INT_GRP_3D, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 245760000, - .bus_freq = 192000000, - }, - { - .gpu_freq = 192000000, - .bus_freq = 152000000, - }, - { - .gpu_freq = 192000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = 3, - .set_grp_async = set_grp3d_async, - .idle_timeout = HZ/20, - .idle_needed = true, - .clk_map = KGSL_CLK_SRC | KGSL_CLK_CORE | - KGSL_CLK_IFACE | KGSL_CLK_MEM, -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -static struct resource kgsl_2d0_resources[] = { - { - .name = KGSL_2D0_REG_MEMORY, - .start = 0xA3900000, /* Z180 base address */ - .end = 0xA3900FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_2D0_IRQ, - .start = INT_GRP_2D, - .end = INT_GRP_2D, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_2d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 0, - .bus_freq = 192000000, - }, - }, - .init_level = 0, - .num_levels = 1, - /* HW workaround, run Z180 SYNC @ 192 MHZ */ - .set_grp_async = NULL, - .idle_timeout = HZ/10, - .idle_needed = true, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE, -}; - -struct platform_device msm_kgsl_2d0 = { - .name = "kgsl-2d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_2d0_resources), - .resource = kgsl_2d0_resources, - .dev = { - .platform_data = &kgsl_2d0_pdata, - }, -}; - -struct platform_device *msm_footswitch_devices[] = { - FS_PCOM(FS_GFX2D0, "vdd", "kgsl-2d0.0"), - FS_PCOM(FS_GFX3D, "vdd", "kgsl-3d0.0"), - FS_PCOM(FS_MDP, "vdd", "mdp.0"), - FS_PCOM(FS_MFC, "fs_mfc", NULL), - FS_PCOM(FS_ROT, "vdd", "msm_rotator.0"), - FS_PCOM(FS_VFE, "fs_vfe", NULL), - FS_PCOM(FS_VPE, "fs_vpe", NULL), -}; -unsigned msm_num_footswitch_devices = ARRAY_SIZE(msm_footswitch_devices); - -static struct resource gpio_resources[] = { - { - .start = INT_GPIO_GROUP1, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_GPIO_GROUP2, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_device_gpio = { - .name = "msmgpio", - .id = -1, - .resource = gpio_resources, - .num_resources = ARRAY_SIZE(gpio_resources), -}; - -static int __init msm7630_init_gpio(void) -{ - platform_device_register(&msm_device_gpio); - return 0; -} - -postcore_initcall(msm7630_init_gpio); diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c deleted file mode 100644 index 05858a54d03d..000000000000 --- a/arch/arm/mach-msm/devices-msm8x60.c +++ /dev/null @@ -1,3186 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "footswitch.h" -#include "clock.h" -#include "clock-rpm.h" -#include "clock-voter.h" -#include "devices.h" -#include "devices-msm8x60.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_MSM_DSPS -#include -#endif -#include -#include -#include -#include -#include -#include -#include "rpm_log.h" -#include "rpm_stats.h" -#include -#include "msm_watchdog.h" -#include - -/* Address of GSBI blocks */ -#define MSM_GSBI1_PHYS 0x16000000 -#define MSM_GSBI2_PHYS 0x16100000 -#define MSM_GSBI3_PHYS 0x16200000 -#define MSM_GSBI4_PHYS 0x16300000 -#define MSM_GSBI5_PHYS 0x16400000 -#define MSM_GSBI6_PHYS 0x16500000 -#define MSM_GSBI7_PHYS 0x16600000 -#define MSM_GSBI8_PHYS 0x19800000 -#define MSM_GSBI9_PHYS 0x19900000 -#define MSM_GSBI10_PHYS 0x19A00000 -#define MSM_GSBI11_PHYS 0x19B00000 -#define MSM_GSBI12_PHYS 0x19C00000 - -/* GSBI QUPe devices */ -#define MSM_GSBI1_QUP_PHYS 0x16080000 -#define MSM_GSBI2_QUP_PHYS 0x16180000 -#define MSM_GSBI3_QUP_PHYS 0x16280000 -#define MSM_GSBI4_QUP_PHYS 0x16380000 -#define MSM_GSBI5_QUP_PHYS 0x16480000 -#define MSM_GSBI6_QUP_PHYS 0x16580000 -#define MSM_GSBI7_QUP_PHYS 0x16680000 -#define MSM_GSBI8_QUP_PHYS 0x19880000 -#define MSM_GSBI9_QUP_PHYS 0x19980000 -#define MSM_GSBI10_QUP_PHYS 0x19A80000 -#define MSM_GSBI11_QUP_PHYS 0x19B80000 -#define MSM_GSBI12_QUP_PHYS 0x19C80000 - -/* GSBI UART devices */ -#define MSM_UART1DM_PHYS (MSM_GSBI6_PHYS + 0x40000) -#define INT_UART1DM_IRQ GSBI6_UARTDM_IRQ -#define INT_UART2DM_IRQ GSBI12_UARTDM_IRQ -#define MSM_UART2DM_PHYS 0x19C40000 -#define MSM_UART3DM_PHYS (MSM_GSBI3_PHYS + 0x40000) -#define INT_UART3DM_IRQ GSBI3_UARTDM_IRQ -#define TCSR_BASE_PHYS 0x16b00000 - -/* PRNG device */ -#define MSM_PRNG_PHYS 0x16C00000 -#define MSM_UART9DM_PHYS (MSM_GSBI9_PHYS + 0x40000) -#define INT_UART9DM_IRQ GSBI9_UARTDM_IRQ - -static struct resource msm_gpio_resources[] = { - { - .start = TLMM_MSM_SUMMARY_IRQ, - .end = TLMM_MSM_SUMMARY_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_gpio_pdata msm8660_gpio_pdata = { - .ngpio = 173, - .direct_connect_irqs = 10, -}; - -struct platform_device msm_gpio_device = { - .name = "msmgpio", - .id = -1, - .num_resources = ARRAY_SIZE(msm_gpio_resources), - .resource = msm_gpio_resources, - .dev.platform_data = &msm8660_gpio_pdata, -}; - -static void charm_ap2mdm_kpdpwr_on(void) -{ - gpio_direction_output(AP2MDM_PMIC_RESET_N, 0); - gpio_direction_output(AP2MDM_KPDPWR_N, 1); -} - -static void charm_ap2mdm_kpdpwr_off(void) -{ - int i; - - gpio_direction_output(AP2MDM_ERRFATAL, 1); - - for (i = 20; i > 0; i--) { - if (gpio_get_value(MDM2AP_STATUS) == 0) - break; - msleep(100); - } - gpio_direction_output(AP2MDM_ERRFATAL, 0); - - if (i == 0) { - pr_err("%s: MDM2AP_STATUS never went low. Doing a hard reset \ - of the charm modem.\n", __func__); - gpio_direction_output(AP2MDM_PMIC_RESET_N, 1); - /* - * Currently, there is a debounce timer on the charm PMIC. It is - * necessary to hold the AP2MDM_PMIC_RESET low for ~3.5 seconds - * for the reset to fully take place. Sleep here to ensure the - * reset has occured before the function exits. - */ - msleep(4000); - gpio_direction_output(AP2MDM_PMIC_RESET_N, 0); - } -} - -static struct resource charm_resources[] = { - /* MDM2AP_ERRFATAL */ - { - .start = MSM_GPIO_TO_INT(MDM2AP_ERRFATAL), - .end = MSM_GPIO_TO_INT(MDM2AP_ERRFATAL), - .flags = IORESOURCE_IRQ, - }, - /* MDM2AP_STATUS */ - { - .start = MSM_GPIO_TO_INT(MDM2AP_STATUS), - .end = MSM_GPIO_TO_INT(MDM2AP_STATUS), - .flags = IORESOURCE_IRQ, - } -}; - -static struct charm_platform_data mdm_platform_data = { - .charm_modem_on = charm_ap2mdm_kpdpwr_on, - .charm_modem_off = charm_ap2mdm_kpdpwr_off, -}; - -struct platform_device msm_charm_modem = { - .name = "charm_modem", - .id = -1, - .num_resources = ARRAY_SIZE(charm_resources), - .resource = charm_resources, - .dev = { - .platform_data = &mdm_platform_data, - }, -}; - -struct platform_device msm8x60_device_acpuclk = { - .name = "acpuclk-8x60", - .id = -1, -}; - -#ifdef CONFIG_MSM_DSPS -#define GSBI12_DEV (&msm_dsps_device.dev) -#else -#define GSBI12_DEV (&msm_gsbi12_qup_i2c_device.dev) -#endif - -void __init msm8x60_init_irq(void) -{ - struct msm_mpm_device_data *data = NULL; - -#ifdef CONFIG_MSM_MPM - data = &msm8660_mpm_dev_data; -#endif - - msm_mpm_irq_extn_init(data); - gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, (void *)MSM_QGIC_CPU_BASE); -} - -#define MSM_LPASS_QDSP6SS_PHYS 0x28800000 -#define MSM_LPASS_QDSP6SS_WDOG_PHYS 0x28882000 -#define MSM_LPASS_QDSP6SS_IM_PHYS 0x288A0000 - -static struct resource msm_8660_q6_resources[] = { - { - .start = MSM_LPASS_QDSP6SS_PHYS, - .end = MSM_LPASS_QDSP6SS_PHYS + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_LPASS_QDSP6SS_IM_PHYS, - .end = MSM_LPASS_QDSP6SS_IM_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_LPASS_QDSP6SS_WDOG_PHYS, - .end = MSM_LPASS_QDSP6SS_WDOG_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = LPASS_Q6SS_WDOG_EXPIRED, - .end = LPASS_Q6SS_WDOG_EXPIRED, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_pil_q6v3 = { - .name = "pil_qdsp6v3", - .id = -1, - .num_resources = ARRAY_SIZE(msm_8660_q6_resources), - .resource = msm_8660_q6_resources, -}; - -#define MSM_MSS_REGS_PHYS 0x10200000 -#define MSM_MSS_WDOG_PHYS 0x10020000 - -static struct resource msm_8660_modem_resources[] = { - { - .start = MSM_MSS_REGS_PHYS, - .end = MSM_MSS_REGS_PHYS + SZ_256 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MSM_MSS_WDOG_PHYS, - .end = MSM_MSS_WDOG_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = MARM_WDOG_EXPIRED, - .end = MARM_WDOG_EXPIRED, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_pil_modem = { - .name = "pil_modem", - .id = -1, - .num_resources = ARRAY_SIZE(msm_8660_modem_resources), - .resource = msm_8660_modem_resources, -}; - -struct platform_device msm_pil_tzapps = { - .name = "pil_tzapps", - .id = -1, -}; - -static struct resource msm_pil_dsps_resources[] = { - { - .start = 0x00900000, - .end = 0x00900000 + SZ_16K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_pil_dsps = { - .name = "pil_dsps", - .id = -1, - .resource = msm_pil_dsps_resources, - .num_resources = ARRAY_SIZE(msm_pil_dsps_resources), - .dev.platform_data = "dsps", -}; - -struct platform_device msm_pil_vidc = { - .name = "pil_vidc", - .id = -1, -}; - -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - /* GSBI6 is UARTDM1 */ - .start = MSM_GSBI6_PHYS, - .end = MSM_GSBI6_PHYS + 4 - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart3_dm_resources[] = { - { - .start = MSM_UART3DM_PHYS, - .end = MSM_UART3DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART3DM_IRQ, - .end = INT_UART3DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart_dm3 = { - .name = "msm_serial_hsl", - .id = 2, - .num_resources = ARRAY_SIZE(msm_uart3_dm_resources), - .resource = msm_uart3_dm_resources, -}; - -static struct resource msm_uart12_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - /* GSBI 12 is UARTDM2 */ - .start = MSM_GSBI12_PHYS, - .end = MSM_GSBI12_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_uart_dm12 = { - .name = "msm_serial_hsl", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart12_dm_resources), - .resource = msm_uart12_dm_resources, -}; - -#ifdef CONFIG_MSM_GSBI9_UART -static struct msm_serial_hslite_platform_data uart_gsbi9_pdata = { - .config_gpio = 1, - .uart_tx_gpio = 67, - .uart_rx_gpio = 66, - .line = 1, - .set_uart_clk_zero = true, -}; - -static struct resource msm_uart_gsbi9_resources[] = { - { - .start = MSM_UART9DM_PHYS, - .end = MSM_UART9DM_PHYS + PAGE_SIZE - 1, - .name = "uartdm_resource", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART9DM_IRQ, - .end = INT_UART9DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - /* GSBI 9 is UART_GSBI9 */ - .start = MSM_GSBI9_PHYS, - .end = MSM_GSBI9_PHYS + PAGE_SIZE - 1, - .name = "gsbi_resource", - .flags = IORESOURCE_MEM, - }, -}; -struct platform_device *msm_device_uart_gsbi9; -struct platform_device *msm_add_gsbi9_uart(void) -{ - return platform_device_register_resndata(NULL, "msm_serial_hsl", - 1, msm_uart_gsbi9_resources, - ARRAY_SIZE(msm_uart_gsbi9_resources), - &uart_gsbi9_pdata, - sizeof(uart_gsbi9_pdata)); -} -#endif - -static struct resource gsbi3_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI3_QUP_PHYS, - .end = MSM_GSBI3_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI3_PHYS, - .end = MSM_GSBI3_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI3_QUP_IRQ, - .end = GSBI3_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 44, - .end = 44, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 43, - .end = 43, - .flags = IORESOURCE_IO, - }, -}; - -static struct resource gsbi4_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI4_QUP_PHYS, - .end = MSM_GSBI4_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI4_PHYS, - .end = MSM_GSBI4_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI4_QUP_IRQ, - .end = GSBI4_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource gsbi7_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI7_QUP_PHYS, - .end = MSM_GSBI7_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI7_PHYS, - .end = MSM_GSBI7_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI7_QUP_IRQ, - .end = GSBI7_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "i2c_clk", - .start = 60, - .end = 60, - .flags = IORESOURCE_IO, - }, - { - .name = "i2c_sda", - .start = 59, - .end = 59, - .flags = IORESOURCE_IO, - }, -}; - -static struct resource gsbi8_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI8_QUP_PHYS, - .end = MSM_GSBI8_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI8_PHYS, - .end = MSM_GSBI8_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI8_QUP_IRQ, - .end = GSBI8_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource gsbi9_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI9_QUP_PHYS, - .end = MSM_GSBI9_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI9_PHYS, - .end = MSM_GSBI9_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI9_QUP_IRQ, - .end = GSBI9_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource gsbi12_qup_i2c_resources[] = { - { - .name = "qup_phys_addr", - .start = MSM_GSBI12_QUP_PHYS, - .end = MSM_GSBI12_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI12_PHYS, - .end = MSM_GSBI12_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = GSBI12_QUP_IRQ, - .end = GSBI12_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors grp3d_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp3d_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(990), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_low_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(1300), - }, -}; - -static struct msm_bus_vectors grp3d_nominal_high_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2008), - }, -}; - -static struct msm_bus_vectors grp3d_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_3D, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(2484), - }, -}; - -static struct msm_bus_paths grp3d_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp3d_init_vectors), - grp3d_init_vectors, - }, - { - ARRAY_SIZE(grp3d_low_vectors), - grp3d_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_low_vectors), - grp3d_nominal_low_vectors, - }, - { - ARRAY_SIZE(grp3d_nominal_high_vectors), - grp3d_nominal_high_vectors, - }, - { - ARRAY_SIZE(grp3d_max_vectors), - grp3d_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = { - grp3d_bus_scale_usecases, - ARRAY_SIZE(grp3d_bus_scale_usecases), - .name = "grp3d", -}; - -static struct msm_bus_vectors grp2d0_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp2d0_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(990), - }, -}; - -static struct msm_bus_paths grp2d0_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp2d0_init_vectors), - grp2d0_init_vectors, - }, - { - ARRAY_SIZE(grp2d0_max_vectors), - grp2d0_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata grp2d0_bus_scale_pdata = { - grp2d0_bus_scale_usecases, - ARRAY_SIZE(grp2d0_bus_scale_usecases), - .name = "grp2d0", -}; - -static struct msm_bus_vectors grp2d1_init_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, -}; - -static struct msm_bus_vectors grp2d1_max_vectors[] = { - { - .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = KGSL_CONVERT_TO_MBPS(990), - }, -}; - -static struct msm_bus_paths grp2d1_bus_scale_usecases[] = { - { - ARRAY_SIZE(grp2d1_init_vectors), - grp2d1_init_vectors, - }, - { - ARRAY_SIZE(grp2d1_max_vectors), - grp2d1_max_vectors, - }, -}; - -static struct msm_bus_scale_pdata grp2d1_bus_scale_pdata = { - grp2d1_bus_scale_usecases, - ARRAY_SIZE(grp2d1_bus_scale_usecases), - .name = "grp2d1", -}; -#endif - -#ifdef CONFIG_HW_RANDOM_MSM -static struct resource rng_resources = { - .flags = IORESOURCE_MEM, - .start = MSM_PRNG_PHYS, - .end = MSM_PRNG_PHYS + SZ_512 - 1, -}; - -struct platform_device msm_device_rng = { - .name = "msm_rng", - .id = 0, - .num_resources = 1, - .resource = &rng_resources, -}; -#endif - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0x04300000, /* GFX3D address */ - .end = 0x0431ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = GFX3D_IRQ, - .end = GFX3D_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 266667000, - .bus_freq = 4, - .io_fraction = 0, - }, - { - .gpu_freq = 228571000, - .bus_freq = 3, - .io_fraction = 33, - }, - { - .gpu_freq = 200000000, - .bus_freq = 2, - .io_fraction = 100, - }, - { - .gpu_freq = 177778000, - .bus_freq = 1, - .io_fraction = 100, - }, - { - .gpu_freq = 27000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = 5, - .set_grp_async = NULL, - .idle_timeout = HZ/5, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp3d_bus_scale_pdata, -#endif -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - -static struct resource kgsl_2d0_resources[] = { - { - .name = KGSL_2D0_REG_MEMORY, - .start = 0x04100000, /* Z180 base address */ - .end = 0x04100FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_2D0_IRQ, - .start = GFX2D0_IRQ, - .end = GFX2D0_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_2d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 200000000, - .bus_freq = 1, - }, - { - .gpu_freq = 200000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = 2, - .set_grp_async = NULL, - .idle_timeout = HZ/10, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp2d0_bus_scale_pdata, -#endif -}; - -struct platform_device msm_kgsl_2d0 = { - .name = "kgsl-2d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_2d0_resources), - .resource = kgsl_2d0_resources, - .dev = { - .platform_data = &kgsl_2d0_pdata, - }, -}; - -static struct resource kgsl_2d1_resources[] = { - { - .name = KGSL_2D1_REG_MEMORY, - .start = 0x04200000, /* Z180 device 1 base address */ - .end = 0x04200FFF, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_2D1_IRQ, - .start = GFX2D1_IRQ, - .end = GFX2D1_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_2d1_pdata = { - .pwrlevel = { - { - .gpu_freq = 200000000, - .bus_freq = 1, - }, - { - .gpu_freq = 200000000, - .bus_freq = 0, - }, - }, - .init_level = 0, - .num_levels = 2, - .set_grp_async = NULL, - .idle_timeout = HZ/10, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &grp2d1_bus_scale_pdata, -#endif -}; - -struct platform_device msm_kgsl_2d1 = { - .name = "kgsl-2d1", - .id = 1, - .num_resources = ARRAY_SIZE(kgsl_2d1_resources), - .resource = kgsl_2d1_resources, - .dev = { - .platform_data = &kgsl_2d1_pdata, - }, -}; - -/* - * this a software workaround for not having two distinct board - * files for 8660v1 and 8660v2. 8660v1 has a faulty 2d clock, and - * this workaround detects the cpu version to tell if the kernel is on a - * 8660v1, and should disable the 2d core. it is called from the board file - */ -void __init msm8x60_check_2d_hardware(void) -{ - if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1) && - (SOCINFO_VERSION_MINOR(socinfo_get_version()) == 0)) { - printk(KERN_WARNING "kgsl: 2D cores disabled on 8660v1\n"); - kgsl_2d0_pdata.clk_map = 0; - } -} - -/* Use GSBI3 QUP for /dev/i2c-0 */ -struct platform_device msm_gsbi3_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI3_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi3_qup_i2c_resources), - .resource = gsbi3_qup_i2c_resources, -}; - -/* Use GSBI4 QUP for /dev/i2c-1 */ -struct platform_device msm_gsbi4_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI4_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi4_qup_i2c_resources), - .resource = gsbi4_qup_i2c_resources, -}; - -/* Use GSBI8 QUP for /dev/i2c-3 */ -struct platform_device msm_gsbi8_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI8_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi8_qup_i2c_resources), - .resource = gsbi8_qup_i2c_resources, -}; - -/* Use GSBI9 QUP for /dev/i2c-2 */ -struct platform_device msm_gsbi9_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI9_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi9_qup_i2c_resources), - .resource = gsbi9_qup_i2c_resources, -}; - -/* Use GSBI7 QUP for /dev/i2c-4 (Marimba) */ -struct platform_device msm_gsbi7_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI7_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi7_qup_i2c_resources), - .resource = gsbi7_qup_i2c_resources, -}; - -/* Use GSBI12 QUP for /dev/i2c-5 (Sensors) */ -struct platform_device msm_gsbi12_qup_i2c_device = { - .name = "qup_i2c", - .id = MSM_GSBI12_QUP_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(gsbi12_qup_i2c_resources), - .resource = gsbi12_qup_i2c_resources, -}; - -#ifdef CONFIG_MSM_SSBI -#define MSM_SSBI_PMIC1_PHYS 0x00500000 -static struct resource resources_ssbi_pmic1_resource[] = { - { - .start = MSM_SSBI_PMIC1_PHYS, - .end = MSM_SSBI_PMIC1_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi_pmic1 = { - .name = "msm_ssbi", - .id = 0, - .resource = resources_ssbi_pmic1_resource, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic1_resource), -}; - -#define MSM_SSBI2_PMIC2B_PHYS 0x00C00000 -static struct resource resources_ssbi_pmic2_resource[] = { - { - .start = MSM_SSBI2_PMIC2B_PHYS, - .end = MSM_SSBI2_PMIC2B_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi_pmic2 = { - .name = "msm_ssbi", - .id = 1, - .resource = resources_ssbi_pmic2_resource, - .num_resources = ARRAY_SIZE(resources_ssbi_pmic2_resource), -}; -#endif - -#ifdef CONFIG_I2C_SSBI -/* CODEC SSBI on /dev/i2c-8 */ -#define MSM_SSBI3_PHYS 0x18700000 -static struct resource msm_ssbi3_resources[] = { - { - .name = "ssbi_base", - .start = MSM_SSBI3_PHYS, - .end = MSM_SSBI3_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_ssbi3 = { - .name = "i2c_ssbi", - .id = MSM_SSBI3_I2C_BUS_ID, - .num_resources = ARRAY_SIZE(msm_ssbi3_resources), - .resource = msm_ssbi3_resources, -}; -#endif /* CONFIG_I2C_SSBI */ - -static struct resource gsbi1_qup_spi_resources[] = { - { - .name = "spi_base", - .start = MSM_GSBI1_QUP_PHYS, - .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI1_PHYS, - .end = MSM_GSBI1_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = GSBI1_QUP_IRQ, - .end = GSBI1_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spidm_channels", - .start = 5, - .end = 6, - .flags = IORESOURCE_DMA, - }, - { - .name = "spidm_crci", - .start = 8, - .end = 7, - .flags = IORESOURCE_DMA, - }, - { - .name = "spi_clk", - .start = 36, - .end = 36, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_miso", - .start = 34, - .end = 34, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_mosi", - .start = 33, - .end = 33, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_cs", - .start = 35, - .end = 35, - .flags = IORESOURCE_IO, - }, -}; - -/* Use GSBI1 QUP for SPI-0 */ -struct platform_device msm_gsbi1_qup_spi_device = { - .name = "spi_qsd", - .id = 0, - .num_resources = ARRAY_SIZE(gsbi1_qup_spi_resources), - .resource = gsbi1_qup_spi_resources, -}; - - -static struct resource gsbi10_qup_spi_resources[] = { - { - .name = "spi_base", - .start = MSM_GSBI10_QUP_PHYS, - .end = MSM_GSBI10_QUP_PHYS + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_base", - .start = MSM_GSBI10_PHYS, - .end = MSM_GSBI10_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "spi_irq_in", - .start = GSBI10_QUP_IRQ, - .end = GSBI10_QUP_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .name = "spi_clk", - .start = 73, - .end = 73, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_cs", - .start = 72, - .end = 72, - .flags = IORESOURCE_IO, - }, - { - .name = "spi_mosi", - .start = 70, - .end = 70, - .flags = IORESOURCE_IO, - }, -}; - -/* Use GSBI10 QUP for SPI-1 */ -struct platform_device msm_gsbi10_qup_spi_device = { - .name = "spi_qsd", - .id = 1, - .num_resources = ARRAY_SIZE(gsbi10_qup_spi_resources), - .resource = gsbi10_qup_spi_resources, -}; -#define MSM_SDC1_BASE 0x12400000 -#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800) -#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000) -#define MSM_SDC2_BASE 0x12140000 -#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800) -#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000) -#define MSM_SDC3_BASE 0x12180000 -#define MSM_SDC3_DML_BASE (MSM_SDC3_BASE + 0x800) -#define MSM_SDC3_BAM_BASE (MSM_SDC3_BASE + 0x2000) -#define MSM_SDC4_BASE 0x121C0000 -#define MSM_SDC4_DML_BASE (MSM_SDC4_BASE + 0x800) -#define MSM_SDC4_BAM_BASE (MSM_SDC4_BASE + 0x2000) -#define MSM_SDC5_BASE 0x12200000 -#define MSM_SDC5_DML_BASE (MSM_SDC5_BASE + 0x800) -#define MSM_SDC5_BAM_BASE (MSM_SDC5_BASE + 0x2000) - -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_DML_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = SDC1_IRQ_0, - .end = SDC1_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC1_DML_BASE, - .end = MSM_SDC1_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC1_BAM_BASE, - .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC1_BAM_IRQ, - .end = SDC1_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#else - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */ -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_DML_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = SDC2_IRQ_0, - .end = SDC2_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC2_DML_BASE, - .end = MSM_SDC2_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC2_BAM_BASE, - .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC2_BAM_IRQ, - .end = SDC2_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#else - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */ -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_DML_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = SDC3_IRQ_0, - .end = SDC3_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC3_DML_BASE, - .end = MSM_SDC3_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC3_BAM_BASE, - .end = MSM_SDC3_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC3_BAM_IRQ, - .end = SDC3_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#else - { - .name = "dma_chnl", - .start = DMOV_SDC3_CHAN, - .end = DMOV_SDC3_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */ -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_DML_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = SDC4_IRQ_0, - .end = SDC4_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC4_DML_BASE, - .end = MSM_SDC4_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC4_BAM_BASE, - .end = MSM_SDC4_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC4_BAM_IRQ, - .end = SDC4_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#else - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */ -}; - -static struct resource resources_sdc5[] = { - { - .name = "core_mem", - .start = MSM_SDC5_BASE, - .end = MSM_SDC5_DML_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = SDC5_IRQ_0, - .end = SDC5_IRQ_0, - .flags = IORESOURCE_IRQ, - }, -#ifdef CONFIG_MMC_MSM_SPS_SUPPORT - { - .name = "dml_mem", - .start = MSM_SDC5_DML_BASE, - .end = MSM_SDC5_BAM_BASE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_mem", - .start = MSM_SDC5_BAM_BASE, - .end = MSM_SDC5_BAM_BASE + (2 * SZ_4K) - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "bam_irq", - .start = SDC5_BAM_IRQ, - .end = SDC5_BAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -#else - { - .name = "dma_chnl", - .start = DMOV_SDC5_CHAN, - .end = DMOV_SDC5_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC5_CRCI, - .end = DMOV_SDC5_CRCI, - .flags = IORESOURCE_DMA, - }, -#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */ -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc5 = { - .name = "msm_sdcc", - .id = 5, - .num_resources = ARRAY_SIZE(resources_sdc5), - .resource = resources_sdc5, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, - &msm_device_sdc5, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 5) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#ifdef CONFIG_MSM_CAMERA_V4L2 -static struct resource msm_csic0_resources[] = { - { - .name = "csic", - .start = 0x04800000, - .end = 0x04800000 + 0x00000400 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = CSI_0_IRQ, - .end = CSI_0_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_csic1_resources[] = { - { - .name = "csic", - .start = 0x04900000, - .end = 0x04900000 + 0x00000400 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "csic", - .start = CSI_1_IRQ, - .end = CSI_1_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct resource msm_vfe_resources[] = { - { - .name = "msm_vfe", - .start = 0x04500000, - .end = 0x04500000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "msm_vfe", - .start = VFE_IRQ, - .end = VFE_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_vpe_resources[] = { - { - .name = "vpe", - .start = 0x05300000, - .end = 0x05300000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "vpe", - .start = INT_VPE, - .end = INT_VPE, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_csic0 = { - .name = "msm_csic", - .id = 0, - .resource = msm_csic0_resources, - .num_resources = ARRAY_SIZE(msm_csic0_resources), -}; - -struct platform_device msm_device_csic1 = { - .name = "msm_csic", - .id = 1, - .resource = msm_csic1_resources, - .num_resources = ARRAY_SIZE(msm_csic1_resources), -}; - -struct platform_device msm_device_vfe = { - .name = "msm_vfe", - .id = 0, - .resource = msm_vfe_resources, - .num_resources = ARRAY_SIZE(msm_vfe_resources), -}; - -struct platform_device msm_device_vpe = { - .name = "msm_vpe", - .id = 0, - .resource = msm_vpe_resources, - .num_resources = ARRAY_SIZE(msm_vpe_resources), -}; - -#endif - - -#define MIPI_DSI_HW_BASE 0x04700000 -#define ROTATOR_HW_BASE 0x04E00000 -#define TVENC_HW_BASE 0x04F00000 -#define MDP_HW_BASE 0x05100000 - -static struct resource msm_mipi_dsi_resources[] = { - { - .name = "mipi_dsi", - .start = MIPI_DSI_HW_BASE, - .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = DSI_IRQ, - .end = DSI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_mipi_dsi_device = { - .name = "mipi_dsi", - .id = 1, - .num_resources = ARRAY_SIZE(msm_mipi_dsi_resources), - .resource = msm_mipi_dsi_resources, -}; - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_HW_BASE, - .end = MDP_HW_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; -#ifdef CONFIG_MSM_ROTATOR -static struct resource resources_msm_rotator[] = { - { - .start = 0x04E00000, - .end = 0x04F00000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = ROT_IRQ, - .end = ROT_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct msm_rot_clocks rotator_clocks[] = { - { - .clk_name = "core_clk", - .clk_type = ROTATOR_CORE_CLK, - .clk_rate = 160 * 1000 * 1000, - }, - { - .clk_name = "iface_clk", - .clk_type = ROTATOR_PCLK, - .clk_rate = 0, - }, -}; - -static struct msm_rotator_platform_data rotator_pdata = { - .number_of_clocks = ARRAY_SIZE(rotator_clocks), - .hardware_version_number = 0x01010307, - .rotator_clks = rotator_clocks, -#ifdef CONFIG_MSM_BUS_SCALING - .bus_scale_table = &rotator_bus_scale_pdata, -#endif - .rot_iommu_split_domain = 0, -}; - -struct platform_device msm_rotator_device = { - .name = "msm_rotator", - .id = 0, - .num_resources = ARRAY_SIZE(resources_msm_rotator), - .resource = resources_msm_rotator, - .dev = { - .platform_data = &rotator_pdata, - }, -}; -#endif - - -/* Sensors DSPS platform data */ -#ifdef CONFIG_MSM_DSPS - -#define PPSS_REG_PHYS_BASE 0x12080000 -#define PPSS_PAUSE_REG 0x1804 - -#define MHZ (1000*1000) - -#define TCSR_GSBI_IRQ_MUX_SEL 0x0044 - -#define GSBI_IRQ_MUX_SEL_MASK 0xF -#define GSBI_IRQ_MUX_SEL_DSPS 0xB - -static void dsps_init1(struct msm_dsps_platform_data *data) -{ - int val; - - /* route GSBI12 interrutps to DSPS */ - val = secure_readl(MSM_TCSR_BASE + TCSR_GSBI_IRQ_MUX_SEL); - val &= ~GSBI_IRQ_MUX_SEL_MASK; - val |= GSBI_IRQ_MUX_SEL_DSPS; - secure_writel(val, MSM_TCSR_BASE + TCSR_GSBI_IRQ_MUX_SEL); -} - -static struct dsps_clk_info dsps_clks[] = { - { - .name = "iface_clk", - .rate = 0, /* no rate just on/off */ - }, - { - .name = "mem_clk", - .rate = 0, /* no rate just on/off */ - }, - { - .name = "gsbi_qup_clk", - .rate = 24 * MHZ, /* See clk_tbl_gsbi_qup[] */ - }, - { - .name = "dfab_dsps_clk", - .rate = 64 * MHZ, /* Same rate as USB. */ - } -}; - -static struct dsps_regulator_info dsps_regs[] = { - { - .name = "8058_l5", - .volt = 2850000, /* in uV */ - }, - { - .name = "8058_s3", - .volt = 1800000, /* in uV */ - } -}; - -/* - * Note: GPIOs field is intialized in run-time at the function - * msm8x60_init_dsps(). - */ - -struct msm_dsps_platform_data msm_dsps_pdata = { - .clks = dsps_clks, - .clks_num = ARRAY_SIZE(dsps_clks), - .gpios = NULL, - .gpios_num = 0, - .regs = dsps_regs, - .regs_num = ARRAY_SIZE(dsps_regs), - .init = dsps_init1, - .ppss_pause_reg = PPSS_PAUSE_REG, - .signature = DSPS_SIGNATURE, -}; - -static struct resource msm_dsps_resources[] = { - { - .start = PPSS_REG_PHYS_BASE, - .end = PPSS_REG_PHYS_BASE + SZ_8K - 1, - .name = "ppss_reg", - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_dsps_device = { - .name = "msm_dsps", - .id = 0, - .num_resources = ARRAY_SIZE(msm_dsps_resources), - .resource = msm_dsps_resources, - .dev.platform_data = &msm_dsps_pdata, -}; - -#endif /* CONFIG_MSM_DSPS */ - -#ifdef CONFIG_FB_MSM_TVOUT -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_HW_BASE, - .end = TVENC_HW_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource tvout_device_resources[] = { - { - .name = "tvout_device_irq", - .start = TV_ENC_IRQ, - .end = TV_ENC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; -#endif -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -#ifdef CONFIG_FB_MSM_TVOUT -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -static struct platform_device msm_tvout_device = { - .name = "tvout_device", - .id = 0, - .num_resources = ARRAY_SIZE(tvout_device_resources), - .resource = tvout_device_resources, -}; -#endif - -#ifdef CONFIG_MSM_BUS_SCALING -static struct platform_device msm_dtv_device = { - .name = "dtv", - .id = 0, -}; -#endif - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else if (!strncmp(name, "mipi_dsi", 8)) - msm_register_device(&msm_mipi_dsi_device, data); -#ifdef CONFIG_FB_MSM_TVOUT - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "tvout_device", 12)) - msm_register_device(&msm_tvout_device, data); -#endif -#ifdef CONFIG_MSM_BUS_SCALING - else if (!strncmp(name, "dtv", 3)) - msm_register_device(&msm_dtv_device, data); -#endif - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct resource resources_otg[] = { - { - .start = 0x12500000, - .end = 0x12500000 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; -#ifdef CONFIG_USB_EHCI_MSM_72K -static struct resource resources_hsusb_host[] = { - { - .start = 0x12500000, - .end = 0x12500000 + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = USB1_HS_IRQ, - .end = USB1_HS_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} -#endif - -#define MSM_TSIF0_PHYS (0x18200000) -#define MSM_TSIF1_PHYS (0x18201000) -#define MSM_TSIF_SIZE (0x200) -#define TCSR_ADM_0_A_CRCI_MUX_SEL 0x0070 - -#define TSIF_0_CLK GPIO_CFG(93, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_EN GPIO_CFG(94, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_DATA GPIO_CFG(95, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_0_SYNC GPIO_CFG(96, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_CLK GPIO_CFG(97, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_EN GPIO_CFG(98, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_DATA GPIO_CFG(99, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) -#define TSIF_1_SYNC GPIO_CFG(100, 1, GPIO_CFG_INPUT, \ - GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA) - -static const struct msm_gpio tsif0_gpios[] = { - { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", }, -}; - -static const struct msm_gpio tsif1_gpios[] = { - { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", }, - { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", }, - { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", }, - { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", }, -}; - -static void tsif_release(struct device *dev) -{ -} - -static void tsif_init1(struct msm_tsif_platform_data *data) -{ - int val; - - /* configure mux to use correct tsif instance */ - val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL); - val |= 0x80000000; - secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL); -} - -struct msm_tsif_platform_data tsif1_platform_data = { - .num_gpios = ARRAY_SIZE(tsif1_gpios), - .gpios = tsif1_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", - .init = tsif_init1 -}; - -struct resource tsif1_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF2_IRQ, - .end = TSIF2_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF1_PHYS, - .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_init0(struct msm_tsif_platform_data *data) -{ - int val; - - /* configure mux to use correct tsif instance */ - val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL); - val &= 0x7FFFFFFF; - secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL); -} - -struct msm_tsif_platform_data tsif0_platform_data = { - .num_gpios = ARRAY_SIZE(tsif0_gpios), - .gpios = tsif0_gpios, - .tsif_pclk = "iface_clk", - .tsif_ref_clk = "ref_clk", - .init = tsif_init0 -}; -struct resource tsif0_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = TSIF1_IRQ, - .end = TSIF1_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF0_PHYS, - .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -struct platform_device msm_device_tsif[2] = { - { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif0_resources), - .resource = tsif0_resources, - .dev = { - .release = tsif_release, - .platform_data = &tsif0_platform_data - }, - }, - { - .name = "msm_tsif", - .id = 1, - .num_resources = ARRAY_SIZE(tsif1_resources), - .resource = tsif1_resources, - .dev = { - .release = tsif_release, - .platform_data = &tsif1_platform_data - }, - } -}; - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct msm_watchdog_pdata msm_watchdog_pdata = { - .pet_time = 10000, - .bark_time = 11000, - .has_secure = true, - .base = MSM_TMR0_BASE + WDT0_OFFSET, -}; - -static struct resource msm_watchdog_resources[] = { - { - .start = WDT0_ACCSCSSNBARK_INT, - .end = WDT0_ACCSCSSNBARK_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm8660_device_watchdog = { - .name = "msm_watchdog", - .id = -1, - .dev = { - .platform_data = &msm_watchdog_pdata, - }, - .num_resources = ARRAY_SIZE(msm_watchdog_resources), - .resource = msm_watchdog_resources, -}; - -static struct resource msm_dmov_resource_adm0[] = { - { - .start = INT_ADM0_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x18320000, - .end = 0x18320000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_dmov_resource_adm1[] = { - { - .start = INT_ADM1_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0x18420000, - .end = 0x18420000 + SZ_1M - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata_adm0 = { - .sd = 1, - .sd_size = 0x800, -}; - -static struct msm_dmov_pdata msm_dmov_pdata_adm1 = { - .sd = 1, - .sd_size = 0x800, -}; - -struct platform_device msm_device_dmov_adm0 = { - .name = "msm_dmov", - .id = 0, - .resource = msm_dmov_resource_adm0, - .num_resources = ARRAY_SIZE(msm_dmov_resource_adm0), - .dev = { - .platform_data = &msm_dmov_pdata_adm0, - }, -}; - -struct platform_device msm_device_dmov_adm1 = { - .name = "msm_dmov", - .id = 1, - .resource = msm_dmov_resource_adm1, - .num_resources = ARRAY_SIZE(msm_dmov_resource_adm1), - .dev = { - .platform_data = &msm_dmov_pdata_adm1, - }, -}; - -/* MSM Video core device */ -#ifdef CONFIG_MSM_BUS_SCALING -static struct msm_bus_vectors vidc_init_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 0, - .ib = 0, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 0, - .ib = 0, - }, -}; -static struct msm_bus_vectors vidc_venc_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 54525952, - .ib = 436207616, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 72351744, - .ib = 289406976, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 1000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 500000, - .ib = 1000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_vga_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 40894464, - .ib = 327155712, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 48234496, - .ib = 192937984, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 500000, - .ib = 2000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 500000, - .ib = 2000000, - }, -}; -static struct msm_bus_vectors vidc_venc_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 163577856, - .ib = 1308622848, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 219152384, - .ib = 876609536, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 3500000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 1750000, - .ib = 3500000, - }, -}; -static struct msm_bus_vectors vidc_vdec_720p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 121634816, - .ib = 973078528, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 155189248, - .ib = 620756992, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 1750000, - .ib = 7000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 1750000, - .ib = 7000000, - }, -}; -static struct msm_bus_vectors vidc_venc_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 372244480, - .ib = 1861222400, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 501219328, - .ib = 2004877312, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 5000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 2500000, - .ib = 5000000, - }, -}; -static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = { - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 222298112, - .ib = 1778384896, - }, - { - .src = MSM_BUS_MASTER_HD_CODEC_PORT1, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 330301440, - .ib = 1321205760, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_EBI_CH0, - .ab = 2500000, - .ib = 700000000, - }, - { - .src = MSM_BUS_MASTER_AMPSS_M0, - .dst = MSM_BUS_SLAVE_SMI, - .ab = 2500000, - .ib = 10000000, - }, -}; - -static struct msm_bus_paths vidc_bus_client_config[] = { - { - ARRAY_SIZE(vidc_init_vectors), - vidc_init_vectors, - }, - { - ARRAY_SIZE(vidc_venc_vga_vectors), - vidc_venc_vga_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_vga_vectors), - vidc_vdec_vga_vectors, - }, - { - ARRAY_SIZE(vidc_venc_720p_vectors), - vidc_venc_720p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_720p_vectors), - vidc_vdec_720p_vectors, - }, - { - ARRAY_SIZE(vidc_venc_1080p_vectors), - vidc_venc_1080p_vectors, - }, - { - ARRAY_SIZE(vidc_vdec_1080p_vectors), - vidc_vdec_1080p_vectors, - }, -}; - -static struct msm_bus_scale_pdata vidc_bus_client_data = { - vidc_bus_client_config, - ARRAY_SIZE(vidc_bus_client_config), - .name = "vidc", -}; - -#endif - -#define MSM_VIDC_BASE_PHYS 0x04400000 -#define MSM_VIDC_BASE_SIZE 0x00100000 - -static struct resource msm_device_vidc_resources[] = { - { - .start = MSM_VIDC_BASE_PHYS, - .end = MSM_VIDC_BASE_PHYS + MSM_VIDC_BASE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = VCODEC_IRQ, - .end = VCODEC_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; - -struct msm_vidc_platform_data vidc_platform_data = { -#ifdef CONFIG_MSM_BUS_SCALING - .vidc_bus_client_pdata = &vidc_bus_client_data, -#endif -#ifdef CONFIG_MSM_VIDC_CONTENT_PROTECTION - .cp_enabled = 1, -#else - .cp_enabled = 0, -#endif -#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION - .memtype = ION_CP_MM_HEAP_ID, - .enable_ion = 1, - .secure_wb_heap = 1, -#else - .memtype = MEMTYPE_SMI_KERNEL, - .enable_ion = 0, - .secure_wb_heap = 0, -#endif - .disable_dmx = 0, - .disable_fullhd = 0, - .cont_mode_dpb_count = 8, - .disable_turbo = 1, - .fw_addr = 0x38000000, -}; - -struct platform_device msm_device_vidc = { - .name = "msm_vidc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_device_vidc_resources), - .resource = msm_device_vidc_resources, - .dev = { - .platform_data = &vidc_platform_data, - }, -}; - -#if defined(CONFIG_MSM_RPM_LOG) || defined(CONFIG_MSM_RPM_LOG_MODULE) -static struct msm_rpm_log_platform_data msm_rpm_log_pdata = { - .phys_addr_base = 0x00106000, - .reg_offsets = { - [MSM_RPM_LOG_PAGE_INDICES] = 0x00000C80, - [MSM_RPM_LOG_PAGE_BUFFER] = 0x00000CA0, - }, - .phys_size = SZ_8K, - .log_len = 4096, /* log's buffer length in bytes */ - .log_len_mask = (4096 >> 2) - 1, /* length mask in units of u32 */ -}; - -struct platform_device msm8660_rpm_log_device = { - .name = "msm_rpm_log", - .id = -1, - .dev = { - .platform_data = &msm_rpm_log_pdata, - }, -}; -#endif - -#if defined(CONFIG_MSM_RPM_STATS_LOG) -static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = { - .phys_addr_base = 0x00107E04, - .phys_size = SZ_8K, -}; - -struct platform_device msm8660_rpm_stat_device = { - .name = "msm_rpm_stat", - .id = -1, - .dev = { - .platform_data = &msm_rpm_stat_pdata, - }, -}; -#endif - -#define SHARED_IMEM_TZ_BASE 0x2a05f720 -static struct resource tzlog_resources[] = { - { - .start = SHARED_IMEM_TZ_BASE, - .end = SHARED_IMEM_TZ_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -struct platform_device msm_device_tz_log = { - .name = "tz_log", - .id = 0, - .num_resources = ARRAY_SIZE(tzlog_resources), - .resource = tzlog_resources, -}; - -#ifdef CONFIG_MSM_MPM -static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = { - [1] = MSM_GPIO_TO_INT(61), - [4] = MSM_GPIO_TO_INT(87), - [5] = MSM_GPIO_TO_INT(88), - [6] = MSM_GPIO_TO_INT(89), - [7] = MSM_GPIO_TO_INT(90), - [8] = MSM_GPIO_TO_INT(91), - [9] = MSM_GPIO_TO_INT(34), - [10] = MSM_GPIO_TO_INT(38), - [11] = MSM_GPIO_TO_INT(42), - [12] = MSM_GPIO_TO_INT(46), - [13] = MSM_GPIO_TO_INT(50), - [14] = MSM_GPIO_TO_INT(54), - [15] = MSM_GPIO_TO_INT(58), - [16] = MSM_GPIO_TO_INT(63), - [17] = MSM_GPIO_TO_INT(160), - [18] = MSM_GPIO_TO_INT(162), - [19] = MSM_GPIO_TO_INT(144), - [20] = MSM_GPIO_TO_INT(146), - [25] = USB1_HS_IRQ, - [26] = TV_ENC_IRQ, - [27] = HDMI_IRQ, - [29] = MSM_GPIO_TO_INT(123), - [30] = MSM_GPIO_TO_INT(172), - [31] = MSM_GPIO_TO_INT(99), - [32] = MSM_GPIO_TO_INT(96), - [33] = MSM_GPIO_TO_INT(67), - [34] = MSM_GPIO_TO_INT(71), - [35] = MSM_GPIO_TO_INT(105), - [36] = MSM_GPIO_TO_INT(117), - [37] = MSM_GPIO_TO_INT(29), - [38] = MSM_GPIO_TO_INT(30), - [39] = MSM_GPIO_TO_INT(31), - [40] = MSM_GPIO_TO_INT(37), - [41] = MSM_GPIO_TO_INT(40), - [42] = MSM_GPIO_TO_INT(41), - [43] = MSM_GPIO_TO_INT(45), - [44] = MSM_GPIO_TO_INT(51), - [45] = MSM_GPIO_TO_INT(52), - [46] = MSM_GPIO_TO_INT(57), - [47] = MSM_GPIO_TO_INT(73), - [48] = MSM_GPIO_TO_INT(93), - [49] = MSM_GPIO_TO_INT(94), - [50] = MSM_GPIO_TO_INT(103), - [51] = MSM_GPIO_TO_INT(104), - [52] = MSM_GPIO_TO_INT(106), - [53] = MSM_GPIO_TO_INT(115), - [54] = MSM_GPIO_TO_INT(124), - [55] = MSM_GPIO_TO_INT(125), - [56] = MSM_GPIO_TO_INT(126), - [57] = MSM_GPIO_TO_INT(127), - [58] = MSM_GPIO_TO_INT(128), - [59] = MSM_GPIO_TO_INT(129), -}; - -static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = { - TLMM_MSM_SUMMARY_IRQ, - RPM_SCSS_CPU0_GP_HIGH_IRQ, - RPM_SCSS_CPU0_GP_MEDIUM_IRQ, - RPM_SCSS_CPU0_GP_LOW_IRQ, - RPM_SCSS_CPU0_WAKE_UP_IRQ, - RPM_SCSS_CPU1_GP_HIGH_IRQ, - RPM_SCSS_CPU1_GP_MEDIUM_IRQ, - RPM_SCSS_CPU1_GP_LOW_IRQ, - RPM_SCSS_CPU1_WAKE_UP_IRQ, - MARM_SCSS_GP_IRQ_0, - MARM_SCSS_GP_IRQ_1, - MARM_SCSS_GP_IRQ_2, - MARM_SCSS_GP_IRQ_3, - MARM_SCSS_GP_IRQ_4, - MARM_SCSS_GP_IRQ_5, - MARM_SCSS_GP_IRQ_6, - MARM_SCSS_GP_IRQ_7, - MARM_SCSS_GP_IRQ_8, - MARM_SCSS_GP_IRQ_9, - LPASS_SCSS_GP_LOW_IRQ, - LPASS_SCSS_GP_MEDIUM_IRQ, - LPASS_SCSS_GP_HIGH_IRQ, - SDC4_IRQ_0, - SPS_MTI_31, -}; - -struct msm_mpm_device_data msm8660_mpm_dev_data __initdata = { - .irqs_m2a = msm_mpm_irqs_m2a, - .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a), - .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs, - .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs), - .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8, - .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8, - .mpm_apps_ipc_reg = MSM_GCC_BASE + 0x008, - .mpm_apps_ipc_val = BIT(1), - .mpm_ipc_irq = RPM_SCSS_CPU0_GP_MEDIUM_IRQ, - -}; -#endif - - -#ifdef CONFIG_MSM_BUS_SCALING -struct platform_device msm_bus_sys_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM, -}; -struct platform_device msm_bus_apps_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_APPSS, -}; -struct platform_device msm_bus_mm_fabric = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_MMSS, -}; -struct platform_device msm_bus_sys_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_SYSTEM_FPB, -}; -struct platform_device msm_bus_cpss_fpb = { - .name = "msm_bus_fabric", - .id = MSM_BUS_FAB_CPSS_FPB, -}; -#endif - -#ifdef CONFIG_SND_SOC_MSM8660_APQ -struct platform_device msm_pcm = { - .name = "msm-pcm-dsp", - .id = -1, -}; - -struct platform_device msm_pcm_routing = { - .name = "msm-pcm-routing", - .id = -1, -}; - -struct platform_device msm_cpudai0 = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_RX, -}; - -struct platform_device msm_cpudai1 = { - .name = "msm-dai-q6", - .id = PRIMARY_I2S_TX, -}; - -struct platform_device msm_cpudai_hdmi_rx = { - .name = "msm-dai-q6", - .id = HDMI_RX, -}; - -struct platform_device msm_cpudai_bt_rx = { - .name = "msm-dai-q6", - .id = INT_BT_SCO_RX, -}; - -struct platform_device msm_cpudai_bt_tx = { - .name = "msm-dai-q6", - .id = INT_BT_SCO_TX, -}; - -struct platform_device msm_cpudai_fm_rx = { - .name = "msm-dai-q6", - .id = INT_FM_RX, -}; - -struct platform_device msm_cpudai_fm_tx = { - .name = "msm-dai-q6", - .id = INT_FM_TX, -}; - -struct platform_device msm_cpu_fe = { - .name = "msm-dai-fe", - .id = -1, -}; - -struct platform_device msm_stub_codec = { - .name = "msm-stub-codec", - .id = 1, -}; - -struct platform_device msm_voice = { - .name = "msm-pcm-voice", - .id = -1, -}; - -struct platform_device msm_voip = { - .name = "msm-voip-dsp", - .id = -1, -}; - -struct platform_device msm_lpa_pcm = { - .name = "msm-pcm-lpa", - .id = -1, -}; - -struct platform_device msm_pcm_hostless = { - .name = "msm-pcm-hostless", - .id = -1, -}; -#endif - -struct platform_device asoc_msm_pcm = { - .name = "msm-dsp-audio", - .id = 0, -}; - -struct platform_device asoc_msm_dai0 = { - .name = "msm-codec-dai", - .id = 0, -}; - -struct platform_device asoc_msm_dai1 = { - .name = "msm-cpu-dai", - .id = 0, -}; - -#if defined (CONFIG_MSM_8x60_VOIP) -struct platform_device asoc_msm_mvs = { - .name = "msm-mvs-audio", - .id = 0, -}; - -struct platform_device asoc_mvs_dai0 = { - .name = "mvs-codec-dai", - .id = 0, -}; - -struct platform_device asoc_mvs_dai1 = { - .name = "mvs-cpu-dai", - .id = 0, -}; -#endif - -static struct fs_driver_data gfx2d0_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, -}; - -static struct fs_driver_data gfx2d1_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, -}; - -static struct fs_driver_data gfx3d_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk", .reset_rate = 27000000 }, - { .name = "iface_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_GRAPHICS_3D, -}; - -static struct fs_driver_data ijpeg_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_JPEG_ENC, -}; - -static struct fs_driver_data mdp_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { .name = "vsync_clk" }, - { .name = "tv_src_clk" }, - { .name = "tv_clk" }, - { .name = "pixel_mdp_clk" }, - { .name = "pixel_lcdc_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_MDP_PORT0, - .bus_port1 = MSM_BUS_MASTER_MDP_PORT1, -}; - -static struct fs_driver_data rot_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_ROTATOR, -}; - -static struct fs_driver_data ved_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_HD_CODEC_PORT0, - .bus_port1 = MSM_BUS_MASTER_HD_CODEC_PORT1, -}; - -static struct fs_driver_data vfe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VFE, -}; - -static struct fs_driver_data vpe_fs_data = { - .clks = (struct fs_clk_data[]){ - { .name = "core_clk" }, - { .name = "iface_clk" }, - { .name = "bus_clk" }, - { 0 } - }, - .bus_port0 = MSM_BUS_MASTER_VPE, -}; - -struct platform_device *msm8660_footswitch[] __initdata = { - FS_8X60(FS_IJPEG, "vdd", "msm_gemini.0", &ijpeg_fs_data), - FS_8X60(FS_MDP, "vdd", "mdp.0", &mdp_fs_data), - FS_8X60(FS_ROT, "vdd", "msm_rotator.0", &rot_fs_data), - FS_8X60(FS_VED, "vdd", "msm_vidc.0", &ved_fs_data), - FS_8X60(FS_VFE, "vdd", "msm_vfe.0", &vfe_fs_data), - FS_8X60(FS_VPE, "vdd", "msm_vpe.0", &vpe_fs_data), - FS_8X60(FS_GFX3D, "vdd", "kgsl-3d0.0", &gfx3d_fs_data), - FS_8X60(FS_GFX2D0, "vdd", "kgsl-2d0.0", &gfx2d0_fs_data), - FS_8X60(FS_GFX2D1, "vdd", "kgsl-2d1.1", &gfx2d1_fs_data), -}; -unsigned msm8660_num_footswitch __initdata = ARRAY_SIZE(msm8660_footswitch); - -struct msm_rpm_platform_data msm8660_rpm_data __initdata = { - .reg_base_addrs = { - [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE, - [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400, - [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600, - [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00, - }, - .irq_ack = RPM_SCSS_CPU0_GP_HIGH_IRQ, - .irq_err = RPM_SCSS_CPU0_GP_LOW_IRQ, - .irq_wakeup = RPM_SCSS_CPU0_WAKE_UP_IRQ, - .ipc_rpm_reg = MSM_GCC_BASE + 0x008, - .ipc_rpm_val = 4, - .target_id = { - MSM_RPM_MAP(8660, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 8), - MSM_RPM_MAP(8660, NOTIFICATION_REGISTERED_0, NOTIFICATION, 8), - MSM_RPM_MAP(8660, INVALIDATE_0, INVALIDATE, 8), - MSM_RPM_MAP(8660, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8660, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1), - MSM_RPM_MAP(8660, TRIGGER_SET_FROM, TRIGGER_SET, 1), - MSM_RPM_MAP(8660, TRIGGER_SET_TO, TRIGGER_SET, 1), - MSM_RPM_MAP(8660, TRIGGER_SET_TRIGGER, TRIGGER_SET, 1), - MSM_RPM_MAP(8660, TRIGGER_CLEAR_FROM, TRIGGER_CLEAR, 1), - MSM_RPM_MAP(8660, TRIGGER_CLEAR_TO, TRIGGER_CLEAR, 1), - MSM_RPM_MAP(8660, TRIGGER_CLEAR_TRIGGER, TRIGGER_CLEAR, 1), - - MSM_RPM_MAP(8660, CXO_CLK, CXO_CLK, 1), - MSM_RPM_MAP(8660, PXO_CLK, PXO_CLK, 1), - MSM_RPM_MAP(8660, PLL_4, PLL_4, 1), - MSM_RPM_MAP(8660, APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1), - MSM_RPM_MAP(8660, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1), - MSM_RPM_MAP(8660, MM_FABRIC_CLK, MM_FABRIC_CLK, 1), - MSM_RPM_MAP(8660, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1), - MSM_RPM_MAP(8660, SFPB_CLK, SFPB_CLK, 1), - MSM_RPM_MAP(8660, CFPB_CLK, CFPB_CLK, 1), - MSM_RPM_MAP(8660, MMFPB_CLK, MMFPB_CLK, 1), - MSM_RPM_MAP(8660, SMI_CLK, SMI_CLK, 1), - MSM_RPM_MAP(8660, EBI1_CLK, EBI1_CLK, 1), - - MSM_RPM_MAP(8660, APPS_L2_CACHE_CTL, APPS_L2_CACHE_CTL, 1), - - MSM_RPM_MAP(8660, APPS_FABRIC_HALT_0, APPS_FABRIC_HALT, 2), - MSM_RPM_MAP(8660, APPS_FABRIC_CLOCK_MODE_0, - APPS_FABRIC_CLOCK_MODE, 3), - MSM_RPM_MAP(8660, APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 6), - - MSM_RPM_MAP(8660, SYSTEM_FABRIC_HALT_0, SYSTEM_FABRIC_HALT, 2), - MSM_RPM_MAP(8660, SYSTEM_FABRIC_CLOCK_MODE_0, - SYSTEM_FABRIC_CLOCK_MODE, 3), - MSM_RPM_MAP(8660, SYSTEM_FABRIC_ARB_0, SYSTEM_FABRIC_ARB, 22), - - MSM_RPM_MAP(8660, MM_FABRIC_HALT_0, MM_FABRIC_HALT, 2), - MSM_RPM_MAP(8660, MM_FABRIC_CLOCK_MODE_0, - MM_FABRIC_CLOCK_MODE, 3), - MSM_RPM_MAP(8660, MM_FABRIC_ARB_0, MM_FABRIC_ARB, 23), - - MSM_RPM_MAP(8660, SMPS0B_0, SMPS0B, 2), - MSM_RPM_MAP(8660, SMPS1B_0, SMPS1B, 2), - MSM_RPM_MAP(8660, SMPS2B_0, SMPS2B, 2), - MSM_RPM_MAP(8660, SMPS3B_0, SMPS3B, 2), - MSM_RPM_MAP(8660, SMPS4B_0, SMPS4B, 2), - MSM_RPM_MAP(8660, LDO0B_0, LDO0B, 2), - MSM_RPM_MAP(8660, LDO1B_0, LDO1B, 2), - MSM_RPM_MAP(8660, LDO2B_0, LDO2B, 2), - MSM_RPM_MAP(8660, LDO3B_0, LDO3B, 2), - MSM_RPM_MAP(8660, LDO4B_0, LDO4B, 2), - MSM_RPM_MAP(8660, LDO5B_0, LDO5B, 2), - MSM_RPM_MAP(8660, LDO6B_0, LDO6B, 2), - MSM_RPM_MAP(8660, LVS0B, LVS0B, 1), - MSM_RPM_MAP(8660, LVS1B, LVS1B, 1), - MSM_RPM_MAP(8660, LVS2B, LVS2B, 1), - MSM_RPM_MAP(8660, LVS3B, LVS3B, 1), - MSM_RPM_MAP(8660, MVS, MVS, 1), - - MSM_RPM_MAP(8660, SMPS0_0, SMPS0, 2), - MSM_RPM_MAP(8660, SMPS1_0, SMPS1, 2), - MSM_RPM_MAP(8660, SMPS2_0, SMPS2, 2), - MSM_RPM_MAP(8660, SMPS3_0, SMPS3, 2), - MSM_RPM_MAP(8660, SMPS4_0, SMPS4, 2), - MSM_RPM_MAP(8660, LDO0_0, LDO0, 2), - MSM_RPM_MAP(8660, LDO1_0, LDO1, 2), - MSM_RPM_MAP(8660, LDO2_0, LDO2, 2), - MSM_RPM_MAP(8660, LDO3_0, LDO3, 2), - MSM_RPM_MAP(8660, LDO4_0, LDO4, 2), - MSM_RPM_MAP(8660, LDO5_0, LDO5, 2), - MSM_RPM_MAP(8660, LDO6_0, LDO6, 2), - MSM_RPM_MAP(8660, LDO7_0, LDO7, 2), - MSM_RPM_MAP(8660, LDO8_0, LDO8, 2), - MSM_RPM_MAP(8660, LDO9_0, LDO9, 2), - MSM_RPM_MAP(8660, LDO10_0, LDO10, 2), - MSM_RPM_MAP(8660, LDO11_0, LDO11, 2), - MSM_RPM_MAP(8660, LDO12_0, LDO12, 2), - MSM_RPM_MAP(8660, LDO13_0, LDO13, 2), - MSM_RPM_MAP(8660, LDO14_0, LDO14, 2), - MSM_RPM_MAP(8660, LDO15_0, LDO15, 2), - MSM_RPM_MAP(8660, LDO16_0, LDO16, 2), - MSM_RPM_MAP(8660, LDO17_0, LDO17, 2), - MSM_RPM_MAP(8660, LDO18_0, LDO18, 2), - MSM_RPM_MAP(8660, LDO19_0, LDO19, 2), - MSM_RPM_MAP(8660, LDO20_0, LDO20, 2), - MSM_RPM_MAP(8660, LDO21_0, LDO21, 2), - MSM_RPM_MAP(8660, LDO22_0, LDO22, 2), - MSM_RPM_MAP(8660, LDO23_0, LDO23, 2), - MSM_RPM_MAP(8660, LDO24_0, LDO24, 2), - MSM_RPM_MAP(8660, LDO25_0, LDO25, 2), - MSM_RPM_MAP(8660, LVS0, LVS0, 1), - MSM_RPM_MAP(8660, LVS1, LVS1, 1), - MSM_RPM_MAP(8660, NCP_0, NCP, 2), - MSM_RPM_MAP(8660, CXO_BUFFERS, CXO_BUFFERS, 1), - }, - .target_status = { - MSM_RPM_STATUS_ID_MAP(8660, VERSION_MAJOR), - MSM_RPM_STATUS_ID_MAP(8660, VERSION_MINOR), - MSM_RPM_STATUS_ID_MAP(8660, VERSION_BUILD), - MSM_RPM_STATUS_ID_MAP(8660, SUPPORTED_RESOURCES_0), - MSM_RPM_STATUS_ID_MAP(8660, SUPPORTED_RESOURCES_1), - MSM_RPM_STATUS_ID_MAP(8660, SUPPORTED_RESOURCES_2), - MSM_RPM_STATUS_ID_MAP(8660, SEQUENCE), - - MSM_RPM_STATUS_ID_MAP(8660, CXO_CLK), - MSM_RPM_STATUS_ID_MAP(8660, PXO_CLK), - MSM_RPM_STATUS_ID_MAP(8660, PLL_4), - MSM_RPM_STATUS_ID_MAP(8660, APPS_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8660, SYSTEM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8660, MM_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8660, DAYTONA_FABRIC_CLK), - MSM_RPM_STATUS_ID_MAP(8660, SFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8660, CFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8660, MMFPB_CLK), - MSM_RPM_STATUS_ID_MAP(8660, SMI_CLK), - MSM_RPM_STATUS_ID_MAP(8660, EBI1_CLK), - - MSM_RPM_STATUS_ID_MAP(8660, APPS_L2_CACHE_CTL), - - MSM_RPM_STATUS_ID_MAP(8660, APPS_FABRIC_HALT), - MSM_RPM_STATUS_ID_MAP(8660, APPS_FABRIC_CLOCK_MODE), - MSM_RPM_STATUS_ID_MAP(8660, APPS_FABRIC_ARB), - - MSM_RPM_STATUS_ID_MAP(8660, SYSTEM_FABRIC_HALT), - MSM_RPM_STATUS_ID_MAP(8660, SYSTEM_FABRIC_CLOCK_MODE), - MSM_RPM_STATUS_ID_MAP(8660, SYSTEM_FABRIC_ARB), - - MSM_RPM_STATUS_ID_MAP(8660, MM_FABRIC_HALT), - MSM_RPM_STATUS_ID_MAP(8660, MM_FABRIC_CLOCK_MODE), - MSM_RPM_STATUS_ID_MAP(8660, MM_FABRIC_ARB), - - - MSM_RPM_STATUS_ID_MAP(8660, SMPS0B_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS0B_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS1B_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS1B_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS2B_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS2B_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS3B_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS3B_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS4B_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS4B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO0B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO0B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO1B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO1B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO2B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO2B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO3B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO3B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO4B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO4B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO5B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO5B_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO6B_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO6B_1), - MSM_RPM_STATUS_ID_MAP(8660, LVS0B), - MSM_RPM_STATUS_ID_MAP(8660, LVS1B), - MSM_RPM_STATUS_ID_MAP(8660, LVS2B), - MSM_RPM_STATUS_ID_MAP(8660, LVS3B), - MSM_RPM_STATUS_ID_MAP(8660, MVS), - - - MSM_RPM_STATUS_ID_MAP(8660, SMPS0_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS0_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS1_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS1_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS2_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS2_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS3_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS3_1), - MSM_RPM_STATUS_ID_MAP(8660, SMPS4_0), - MSM_RPM_STATUS_ID_MAP(8660, SMPS4_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO0_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO0_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO1_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO1_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO2_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO2_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO3_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO3_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO4_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO4_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO5_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO5_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO6_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO6_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO7_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO7_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO8_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO8_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO9_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO9_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO10_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO10_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO11_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO11_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO12_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO12_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO13_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO13_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO14_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO14_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO15_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO15_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO16_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO16_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO17_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO17_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO18_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO18_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO19_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO19_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO20_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO20_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO21_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO21_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO22_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO22_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO23_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO23_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO24_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO24_1), - MSM_RPM_STATUS_ID_MAP(8660, LDO25_0), - MSM_RPM_STATUS_ID_MAP(8660, LDO25_1), - MSM_RPM_STATUS_ID_MAP(8660, LVS0), - MSM_RPM_STATUS_ID_MAP(8660, LVS1), - MSM_RPM_STATUS_ID_MAP(8660, NCP_0), - MSM_RPM_STATUS_ID_MAP(8660, NCP_1), - MSM_RPM_STATUS_ID_MAP(8660, CXO_BUFFERS), - }, - .target_ctrl_id = { - MSM_RPM_CTRL_MAP(8660, VERSION_MAJOR), - MSM_RPM_CTRL_MAP(8660, VERSION_MINOR), - MSM_RPM_CTRL_MAP(8660, VERSION_BUILD), - MSM_RPM_CTRL_MAP(8660, REQ_CTX_0), - MSM_RPM_CTRL_MAP(8660, REQ_SEL_0), - MSM_RPM_CTRL_MAP(8660, ACK_CTX_0), - MSM_RPM_CTRL_MAP(8660, ACK_SEL_0), - }, - .sel_invalidate = MSM_RPM_8660_SEL_INVALIDATE, - .sel_notification = MSM_RPM_8660_SEL_NOTIFICATION, - .sel_last = MSM_RPM_8660_SEL_LAST, - .ver = {2, 0, 0}, -}; - -struct platform_device msm8660_rpm_device = { - .name = "msm_rpm", - .id = -1, -}; - -struct msm_iommu_domain_name msm8660_iommu_ctx_names[] = { - /* Camera */ - { - .name = "ijpeg_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "ijpeg_dst", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_src", - .domain = CAMERA_DOMAIN, - }, - /* Camera */ - { - .name = "jpegd_dst", - .domain = CAMERA_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_src", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Rotator */ - { - .name = "rot_dst", - .domain = ROTATOR_SRC_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_mm1", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_b_mm2", - .domain = VIDEO_DOMAIN, - }, - /* Video */ - { - .name = "vcodec_a_stream", - .domain = VIDEO_DOMAIN, - }, -}; - -static struct mem_pool msm8660_video_pools[] = { - /* - * Video hardware has the following requirements: - * 1. All video addresses used by the video hardware must be at a higher - * address than video firmware address. - * 2. Video hardware can only access a range of 256MB from the base of - * the video firmware. - */ - [VIDEO_FIRMWARE_POOL] = - /* Low addresses, intended for video firmware */ - { - .paddr = SZ_128K, - .size = SZ_16M - SZ_128K, - }, - [VIDEO_MAIN_POOL] = - /* Main video pool */ - { - .paddr = SZ_16M, - .size = SZ_256M - SZ_16M, - }, - [GEN_POOL] = - /* Remaining address space up to 2G */ - { - .paddr = SZ_256M, - .size = SZ_2G - SZ_256M, - }, -}; - -static struct mem_pool msm8660_camera_pools[] = { - [GEN_POOL] = - /* One address space for camera */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8660_display_pools[] = { - [GEN_POOL] = - /* One address space for display */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct mem_pool msm8660_rotator_pools[] = { - [GEN_POOL] = - /* One address space for rotator */ - { - .paddr = SZ_128K, - .size = SZ_2G - SZ_128K, - }, -}; - -static struct msm_iommu_domain msm8660_iommu_domains[] = { - [VIDEO_DOMAIN] = { - .iova_pools = msm8660_video_pools, - .npools = ARRAY_SIZE(msm8660_video_pools), - }, - [CAMERA_DOMAIN] = { - .iova_pools = msm8660_camera_pools, - .npools = ARRAY_SIZE(msm8660_camera_pools), - }, - [DISPLAY_READ_DOMAIN] = { - .iova_pools = msm8660_display_pools, - .npools = ARRAY_SIZE(msm8660_display_pools), - }, - [ROTATOR_SRC_DOMAIN] = { - .iova_pools = msm8660_rotator_pools, - .npools = ARRAY_SIZE(msm8660_rotator_pools), - }, -}; - -struct iommu_domains_pdata msm8660_iommu_domain_pdata = { - .domains = msm8660_iommu_domains, - .ndomains = ARRAY_SIZE(msm8660_iommu_domains), - .domain_names = msm8660_iommu_ctx_names, - .nnames = ARRAY_SIZE(msm8660_iommu_ctx_names), - .domain_alloc_flags = 0, -}; - -struct platform_device msm8660_iommu_domain_device = { - .name = "iommu_domains", - .id = -1, - .dev = { - .platform_data = &msm8660_iommu_domain_pdata, - } -}; - -struct platform_device msm8660_pm_8x60 = { - .name = "pm-8x60", - .id = -1, -}; - diff --git a/arch/arm/mach-msm/devices-msm8x60.h b/arch/arm/mach-msm/devices-msm8x60.h deleted file mode 100644 index fafe4e40deba..000000000000 --- a/arch/arm/mach-msm/devices-msm8x60.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __ARCH_ARM_MACH_MSM_DEVICES_MSM8X60_H -#define __ARCH_ARM_MACH_MSM_DEVICES_MSM8X60_H - -#define MSM_GSBI3_QUP_I2C_BUS_ID 0 -#define MSM_GSBI4_QUP_I2C_BUS_ID 1 -#define MSM_GSBI9_QUP_I2C_BUS_ID 2 -#define MSM_GSBI8_QUP_I2C_BUS_ID 3 -#define MSM_GSBI7_QUP_I2C_BUS_ID 4 -#define MSM_GSBI12_QUP_I2C_BUS_ID 5 -#define MSM_SSBI1_I2C_BUS_ID 6 -#define MSM_SSBI2_I2C_BUS_ID 7 -#define MSM_SSBI3_I2C_BUS_ID 8 - -#ifdef CONFIG_SND_SOC_MSM8660_APQ -extern struct platform_device msm_pcm; -extern struct platform_device msm_pcm_routing; -extern struct platform_device msm_cpudai0; -extern struct platform_device msm_cpudai1; -extern struct platform_device msm_cpudai_hdmi_rx; -extern struct platform_device msm_cpudai_bt_rx; -extern struct platform_device msm_cpudai_bt_tx; -extern struct platform_device msm_cpudai_fm_rx; -extern struct platform_device msm_cpudai_fm_tx; -extern struct platform_device msm_cpu_fe; -extern struct platform_device msm_stub_codec; -extern struct platform_device msm_voice; -extern struct platform_device msm_voip; -extern struct platform_device msm_lpa_pcm; -extern struct platform_device msm_pcm_hostless; -#endif - -#ifdef CONFIG_SPI_QUP -extern struct platform_device msm_gsbi1_qup_spi_device; -extern struct platform_device msm_gsbi10_qup_spi_device; -#endif - -extern struct platform_device msm_bus_apps_fabric; -extern struct platform_device msm_bus_sys_fabric; -extern struct platform_device msm_bus_mm_fabric; -extern struct platform_device msm_bus_sys_fpb; -extern struct platform_device msm_bus_cpss_fpb; -extern struct platform_device msm_bus_def_fab; - -extern struct platform_device msm_device_smd; -extern struct platform_device msm_device_gpio; -extern struct platform_device msm_device_vidc; -extern struct platform_device apq8064_msm_device_vidc; - -extern struct platform_device msm_charm_modem; -extern struct platform_device msm_device_tz_log; -#ifdef CONFIG_HW_RANDOM_MSM -extern struct platform_device msm_device_rng; -#endif - -void __init msm8x60_init_irq(void); -void __init msm8x60_check_2d_hardware(void); - -#ifdef CONFIG_MSM_DSPS -extern struct platform_device msm_dsps_device; -#endif - -#if defined(CONFIG_MSM_RPM_STATS_LOG) -extern struct platform_device msm_rpm_stat_device; -#endif -#endif diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c deleted file mode 100644 index acb10765a2f4..000000000000 --- a/arch/arm/mach-msm/devices-qsd8x50.c +++ /dev/null @@ -1,963 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "devices.h" - -#include - -#include -#include -#include -#include -#include "pm.h" - -struct platform_device msm8x50_device_acpuclk = { - .name = "acpuclk-8x50", - .id = -1, -}; - -static struct resource resources_uart1[] = { - { - .start = INT_UART1, - .end = INT_UART1, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART1_PHYS, - .end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart2[] = { - { - .start = INT_UART2, - .end = INT_UART2, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART2_PHYS, - .end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_uart3[] = { - { - .start = INT_UART3, - .end = INT_UART3, - .flags = IORESOURCE_IRQ, - }, - { - .start = MSM_UART3_PHYS, - .end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1, - .flags = IORESOURCE_MEM, - .name = "uart_resource" - }, -}; - -struct platform_device msm_device_uart1 = { - .name = "msm_serial", - .id = 0, - .num_resources = ARRAY_SIZE(resources_uart1), - .resource = resources_uart1, -}; - -struct platform_device msm_device_uart2 = { - .name = "msm_serial", - .id = 1, - .num_resources = ARRAY_SIZE(resources_uart2), - .resource = resources_uart2, -}; - -struct platform_device msm_device_uart3 = { - .name = "msm_serial", - .id = 2, - .num_resources = ARRAY_SIZE(resources_uart3), - .resource = resources_uart3, -}; - -#define MSM_UART1DM_PHYS 0xA0200000 -#define MSM_UART2DM_PHYS 0xA0900000 -static struct resource msm_uart1_dm_resources[] = { - { - .start = MSM_UART1DM_PHYS, - .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART1DM_IRQ, - .end = INT_UART1DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART1DM_RX, - .end = INT_UART1DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART1_TX_CHAN, - .end = DMOV_HSUART1_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART1_TX_CRCI, - .end = DMOV_HSUART1_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm1 = { - .name = "msm_serial_hs", - .id = 0, - .num_resources = ARRAY_SIZE(msm_uart1_dm_resources), - .resource = msm_uart1_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm1_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -static struct resource msm_uart2_dm_resources[] = { - { - .start = MSM_UART2DM_PHYS, - .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_UART2DM_IRQ, - .end = INT_UART2DM_IRQ, - .flags = IORESOURCE_IRQ, - }, - { - .start = INT_UART2DM_RX, - .end = INT_UART2DM_RX, - .flags = IORESOURCE_IRQ, - }, - { - .start = DMOV_HSUART2_TX_CHAN, - .end = DMOV_HSUART2_RX_CHAN, - .name = "uartdm_channels", - .flags = IORESOURCE_DMA, - }, - { - .start = DMOV_HSUART2_TX_CRCI, - .end = DMOV_HSUART2_RX_CRCI, - .name = "uartdm_crci", - .flags = IORESOURCE_DMA, - }, -}; - -static u64 msm_uart_dm2_dma_mask = DMA_BIT_MASK(32); - -struct platform_device msm_device_uart_dm2 = { - .name = "msm_serial_hs", - .id = 1, - .num_resources = ARRAY_SIZE(msm_uart2_dm_resources), - .resource = msm_uart2_dm_resources, - .dev = { - .dma_mask = &msm_uart_dm2_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(32), - }, -}; - -#define MSM_I2C_SIZE SZ_4K -#define MSM_I2C_PHYS 0xA9900000 - -static struct resource resources_i2c[] = { - { - .start = MSM_I2C_PHYS, - .end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_PWB_I2C, - .end = INT_PWB_I2C, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_i2c = { - .name = "msm_i2c", - .id = 0, - .num_resources = ARRAY_SIZE(resources_i2c), - .resource = resources_i2c, -}; - -#define MSM_HSUSB_PHYS 0xA0800000 -static struct resource resources_hsusb_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static u64 dma_mask = 0xffffffffULL; -struct platform_device msm_device_hsusb_otg = { - .name = "msm_hsusb_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_otg), - .resource = resources_hsusb_otg, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct resource resources_hsusb_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource resources_gadget_peripheral[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_peripheral = { - .name = "msm_hsusb_peripheral", - .id = -1, - .num_resources = ARRAY_SIZE(resources_hsusb_peripheral), - .resource = resources_hsusb_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct platform_device msm_device_gadget_peripheral = { - .name = "msm_hsusb", - .id = -1, - .num_resources = ARRAY_SIZE(resources_gadget_peripheral), - .resource = resources_gadget_peripheral, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -#ifdef CONFIG_USB_FS_HOST -#define MSM_HS2USB_PHYS 0xA0800400 -static struct resource resources_hsusb_host2[] = { - { - .start = MSM_HS2USB_PHYS, - .end = MSM_HS2USB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_OTG, - .end = INT_USB_OTG, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host2 = { - .name = "msm_hsusb_host", - .id = 1, - .num_resources = ARRAY_SIZE(resources_hsusb_host2), - .resource = resources_hsusb_host2, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; -#endif - -static struct resource resources_hsusb_host[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_hsusb_host = { - .name = "msm_hsusb_host", - .id = 0, - .num_resources = ARRAY_SIZE(resources_hsusb_host), - .resource = resources_hsusb_host, - .dev = { - .dma_mask = &dma_mask, - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -static struct platform_device *msm_host_devices[] = { - &msm_device_hsusb_host, -#ifdef CONFIG_USB_FS_HOST - &msm_device_hsusb_host2, -#endif -}; - -int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat) -{ - struct platform_device *pdev; - - pdev = msm_host_devices[host]; - if (!pdev) - return -ENODEV; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#ifdef CONFIG_USB_ANDROID -struct usb_diag_platform_data usb_diag_pdata = { - .ch_name = DIAG_LEGACY, - .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num, -}; - -struct platform_device usb_diag_device = { - .name = "usb_diag", - .id = -1, - .dev = { - .platform_data = &usb_diag_pdata, - }, -}; -#endif - -#ifdef CONFIG_USB_F_SERIAL -static struct usb_gadget_fserial_platform_data fserial_pdata = { - .no_ports = 2, -}; - -struct platform_device usb_gadget_fserial_device = { - .name = "usb_fserial", - .id = -1, - .dev = { - .platform_data = &fserial_pdata, - }, -}; -#endif - -#define MSM_NAND_PHYS 0xA0A00000 -static struct resource resources_nand[] = { - [0] = { - .name = "msm_nand_dmac", - .start = DMOV_NAND_CHAN, - .end = DMOV_NAND_CHAN, - .flags = IORESOURCE_DMA, - }, - [1] = { - .name = "msm_nand_phys", - .start = MSM_NAND_PHYS, - .end = MSM_NAND_PHYS + 0x7FF, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource resources_otg[] = { - { - .start = MSM_HSUSB_PHYS, - .end = MSM_HSUSB_PHYS + SZ_1K - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_USB_HS, - .end = INT_USB_HS, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device msm_device_otg = { - .name = "msm_otg", - .id = -1, - .num_resources = ARRAY_SIZE(resources_otg), - .resource = resources_otg, - .dev = { - .coherent_dma_mask = 0xffffffffULL, - }, -}; - -struct flash_platform_data msm_nand_data = { - .parts = NULL, - .nr_parts = 0, -}; - -struct platform_device msm_device_nand = { - .name = "msm_nand", - .id = -1, - .num_resources = ARRAY_SIZE(resources_nand), - .resource = resources_nand, - .dev = { - .platform_data = &msm_nand_data, - }, -}; - -static struct msm_pm_irq_calls qsd8x50_pm_irq_calls = { - .irq_pending = msm_irq_pending, - .idle_sleep_allowed = msm_irq_idle_sleep_allowed, - .enter_sleep1 = msm_irq_enter_sleep1, - .enter_sleep2 = msm_irq_enter_sleep2, - .exit_sleep1 = msm_irq_exit_sleep1, - .exit_sleep2 = msm_irq_exit_sleep2, - .exit_sleep3 = msm_irq_exit_sleep3, -}; - -void __init msm_pm_register_irqs(void) -{ - msm_pm_set_irq_extns(&qsd8x50_pm_irq_calls); -} - -struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, -}; - -static struct resource msm_dmov_resource[] = { - { - .start = INT_ADM_AARM, - .flags = IORESOURCE_IRQ, - }, - { - .start = 0xA9700000, - .end = 0xA9700000 + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct msm_dmov_pdata msm_dmov_pdata = { - .sd = 3, - .sd_size = 0x400, -}; - -struct platform_device msm_device_dmov = { - .name = "msm_dmov", - .id = -1, - .resource = msm_dmov_resource, - .num_resources = ARRAY_SIZE(msm_dmov_resource), - .dev = { - .platform_data = &msm_dmov_pdata, - }, -}; - -#define MSM_SDC1_BASE 0xA0300000 -#define MSM_SDC2_BASE 0xA0400000 -#define MSM_SDC3_BASE 0xA0500000 -#define MSM_SDC4_BASE 0xA0600000 -static struct resource resources_sdc1[] = { - { - .name = "core_mem", - .start = MSM_SDC1_BASE, - .end = MSM_SDC1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC1_0, - .end = INT_SDC1_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC1_CHAN, - .end = DMOV_SDC1_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC1_CRCI, - .end = DMOV_SDC1_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc2[] = { - { - .name = "core_mem", - .start = MSM_SDC2_BASE, - .end = MSM_SDC2_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC2_0, - .end = INT_SDC2_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC2_CHAN, - .end = DMOV_SDC2_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC2_CRCI, - .end = DMOV_SDC2_CRCI, - .flags = IORESOURCE_DMA, - } -}; - -static struct resource resources_sdc3[] = { - { - .name = "core_mem", - .start = MSM_SDC3_BASE, - .end = MSM_SDC3_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC3_0, - .end = INT_SDC3_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC3_CHAN, - .end = DMOV_SDC3_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC3_CRCI, - .end = DMOV_SDC3_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -static struct resource resources_sdc4[] = { - { - .name = "core_mem", - .start = MSM_SDC4_BASE, - .end = MSM_SDC4_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "core_irq", - .start = INT_SDC4_0, - .end = INT_SDC4_1, - .flags = IORESOURCE_IRQ, - }, - { - .name = "dma_chnl", - .start = DMOV_SDC4_CHAN, - .end = DMOV_SDC4_CHAN, - .flags = IORESOURCE_DMA, - }, - { - .name = "dma_crci", - .start = DMOV_SDC4_CRCI, - .end = DMOV_SDC4_CRCI, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_sdc1 = { - .name = "msm_sdcc", - .id = 1, - .num_resources = ARRAY_SIZE(resources_sdc1), - .resource = resources_sdc1, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc2 = { - .name = "msm_sdcc", - .id = 2, - .num_resources = ARRAY_SIZE(resources_sdc2), - .resource = resources_sdc2, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc3 = { - .name = "msm_sdcc", - .id = 3, - .num_resources = ARRAY_SIZE(resources_sdc3), - .resource = resources_sdc3, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -struct platform_device msm_device_sdc4 = { - .name = "msm_sdcc", - .id = 4, - .num_resources = ARRAY_SIZE(resources_sdc4), - .resource = resources_sdc4, - .dev = { - .coherent_dma_mask = 0xffffffff, - }, -}; - -static struct platform_device *msm_sdcc_devices[] __initdata = { - &msm_device_sdc1, - &msm_device_sdc2, - &msm_device_sdc3, - &msm_device_sdc4, -}; - -int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat) -{ - struct platform_device *pdev; - - if (controller < 1 || controller > 4) - return -EINVAL; - - pdev = msm_sdcc_devices[controller-1]; - pdev->dev.platform_data = plat; - return platform_device_register(pdev); -} - -#if defined(CONFIG_FB_MSM_MDP40) -#define MDP_BASE 0xA3F00000 -#define PMDH_BASE 0xAD600000 -#define EMDH_BASE 0xAD700000 -#define TVENC_BASE 0xAD400000 -#else -#define MDP_BASE 0xAA200000 -#define PMDH_BASE 0xAA600000 -#define EMDH_BASE 0xAA700000 -#define TVENC_BASE 0xAA400000 -#endif - -static struct resource msm_mdp_resources[] = { - { - .name = "mdp", - .start = MDP_BASE, - .end = MDP_BASE + 0x000F0000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .start = INT_MDP, - .end = INT_MDP, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct resource msm_mddi_resources[] = { - { - .name = "pmdh", - .start = PMDH_BASE, - .end = PMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_mddi_ext_resources[] = { - { - .name = "emdh", - .start = EMDH_BASE, - .end = EMDH_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct resource msm_ebi2_lcd_resources[] = { - { - .name = "base", - .start = 0xa0d00000, - .end = 0xa0d00000 + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd01", - .start = 0x98000000, - .end = 0x98000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "lcd02", - .start = 0x9c000000, - .end = 0x9c000000 + 0x80000 - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct resource msm_tvenc_resources[] = { - { - .name = "tvenc", - .start = TVENC_BASE, - .end = TVENC_BASE + PAGE_SIZE - 1, - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device msm_mdp_device = { - .name = "mdp", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mdp_resources), - .resource = msm_mdp_resources, -}; - -static struct platform_device msm_mddi_device = { - .name = "mddi", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_resources), - .resource = msm_mddi_resources, -}; - -static struct platform_device msm_mddi_ext_device = { - .name = "mddi_ext", - .id = 0, - .num_resources = ARRAY_SIZE(msm_mddi_ext_resources), - .resource = msm_mddi_ext_resources, -}; - -static struct platform_device msm_ebi2_lcd_device = { - .name = "ebi2_lcd", - .id = 0, - .num_resources = ARRAY_SIZE(msm_ebi2_lcd_resources), - .resource = msm_ebi2_lcd_resources, -}; - -struct platform_device msm_lcdc_device = { - .name = "lcdc", - .id = 0, -}; - -static struct platform_device msm_tvenc_device = { - .name = "tvenc", - .id = 0, - .num_resources = ARRAY_SIZE(msm_tvenc_resources), - .resource = msm_tvenc_resources, -}; - -#if defined(CONFIG_MSM_SOC_REV_A) -#define MSM_QUP_PHYS 0xA1680000 -#define MSM_GSBI_QUP_I2C_PHYS 0xA1600000 -#define INT_PWB_QUP_ERR INT_GSBI_QUP -#else -#define MSM_QUP_PHYS 0xA9900000 -#define MSM_GSBI_QUP_I2C_PHYS 0xA9900000 -#define INT_PWB_QUP_ERR INT_PWB_I2C -#endif -#define MSM_QUP_SIZE SZ_4K -static struct resource resources_qup[] = { - { - .name = "qup_phys_addr", - .start = MSM_QUP_PHYS, - .end = MSM_QUP_PHYS + MSM_QUP_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "gsbi_qup_i2c_addr", - .start = MSM_GSBI_QUP_I2C_PHYS, - .end = MSM_GSBI_QUP_I2C_PHYS + 4 - 1, - .flags = IORESOURCE_MEM, - }, - { - .name = "qup_err_intr", - .start = INT_PWB_QUP_ERR, - .end = INT_PWB_QUP_ERR, - .flags = IORESOURCE_IRQ, - }, -}; - -struct platform_device qup_device_i2c = { - .name = "qup_i2c", - .id = 4, - .num_resources = ARRAY_SIZE(resources_qup), - .resource = resources_qup, -}; - -/* TSIF begin */ -#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) - -#define MSM_TSIF_PHYS (0xa0100000) -#define MSM_TSIF_SIZE (0x200) - -static struct resource tsif_resources[] = { - [0] = { - .flags = IORESOURCE_IRQ, - .start = INT_TSIF_IRQ, - .end = INT_TSIF_IRQ, - }, - [1] = { - .flags = IORESOURCE_MEM, - .start = MSM_TSIF_PHYS, - .end = MSM_TSIF_PHYS + MSM_TSIF_SIZE - 1, - }, - [2] = { - .flags = IORESOURCE_DMA, - .start = DMOV_TSIF_CHAN, - .end = DMOV_TSIF_CRCI, - }, -}; - -static void tsif_release(struct device *dev) -{ - dev_info(dev, "release\n"); -} - -struct platform_device msm_device_tsif = { - .name = "msm_tsif", - .id = 0, - .num_resources = ARRAY_SIZE(tsif_resources), - .resource = tsif_resources, - .dev = { - .release = tsif_release, - }, -}; -#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) */ -/* TSIF end */ - -#define MSM_TSSC_PHYS 0xAA300000 -static struct resource resources_tssc[] = { - { - .start = MSM_TSSC_PHYS, - .end = MSM_TSSC_PHYS + SZ_4K - 1, - .name = "tssc", - .flags = IORESOURCE_MEM, - }, - { - .start = INT_TCHSCRN1, - .end = INT_TCHSCRN1, - .name = "tssc1", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, - { - .start = INT_TCHSCRN2, - .end = INT_TCHSCRN2, - .name = "tssc2", - .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING, - }, -}; - -struct platform_device msm_device_tssc = { - .name = "msm_touchscreen", - .id = 0, - .num_resources = ARRAY_SIZE(resources_tssc), - .resource = resources_tssc, -}; - -static void __init msm_register_device(struct platform_device *pdev, void *data) -{ - int ret; - - pdev->dev.platform_data = data; - - ret = platform_device_register(pdev); - if (ret) - dev_err(&pdev->dev, - "%s: platform_device_register() failed = %d\n", - __func__, ret); -} - -void __init msm_fb_register_device(char *name, void *data) -{ - if (!strncmp(name, "mdp", 3)) - msm_register_device(&msm_mdp_device, data); - else if (!strncmp(name, "pmdh", 4)) - msm_register_device(&msm_mddi_device, data); - else if (!strncmp(name, "emdh", 4)) - msm_register_device(&msm_mddi_ext_device, data); - else if (!strncmp(name, "ebi2", 4)) - msm_register_device(&msm_ebi2_lcd_device, data); - else if (!strncmp(name, "tvenc", 5)) - msm_register_device(&msm_tvenc_device, data); - else if (!strncmp(name, "lcdc", 4)) - msm_register_device(&msm_lcdc_device, data); - else - printk(KERN_ERR "%s: unknown device! %s\n", __func__, name); -} - -static struct platform_device msm_camera_device = { - .name = "msm_camera", - .id = 0, -}; - -void __init msm_camera_register_device(void *res, uint32_t num, - void *data) -{ - msm_camera_device.num_resources = num; - msm_camera_device.resource = res; - - msm_register_device(&msm_camera_device, data); -} - -static struct resource kgsl_3d0_resources[] = { - { - .name = KGSL_3D0_REG_MEMORY, - .start = 0xA0000000, - .end = 0xA001ffff, - .flags = IORESOURCE_MEM, - }, - { - .name = KGSL_3D0_IRQ, - .start = INT_GRAPHICS, - .end = INT_GRAPHICS, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct kgsl_device_platform_data kgsl_3d0_pdata = { - .pwrlevel = { - { - .gpu_freq = 0, - .bus_freq = 128000000, - }, - }, - .init_level = 0, - .num_levels = 1, - .set_grp_async = NULL, - .idle_timeout = HZ/5, - .clk_map = KGSL_CLK_CORE | KGSL_CLK_MEM, -}; - -struct platform_device msm_kgsl_3d0 = { - .name = "kgsl-3d0", - .id = 0, - .num_resources = ARRAY_SIZE(kgsl_3d0_resources), - .resource = kgsl_3d0_resources, - .dev = { - .platform_data = &kgsl_3d0_pdata, - }, -}; - diff --git a/arch/arm/mach-msm/devices_htc.c b/arch/arm/mach-msm/devices_htc.c deleted file mode 100644 index b2b45723e2cd..000000000000 --- a/arch/arm/mach-msm/devices_htc.c +++ /dev/null @@ -1,450 +0,0 @@ -/* linux/arch/arm/mach-msm/devices.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -#include -#include -#include -#include "gpio_chip.h" -#include "devices.h" -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static char *df_serialno = "000000000000"; - -#if 0 -struct platform_device *devices[] __initdata = { - &msm_device_nand, - &msm_device_smd, - &msm_device_i2c, -}; - -void __init msm_add_devices(void) -{ - platform_add_devices(devices, ARRAY_SIZE(devices)); -} -#endif - -#define HSUSB_API_INIT_PHY_PROC 2 -#define HSUSB_API_PROG 0x30000064 -#define HSUSB_API_VERS 0x10001 -static void internal_phy_reset(void) -{ - struct msm_rpc_endpoint *usb_ep; - int rc; - struct hsusb_phy_start_req { - struct rpc_request_hdr hdr; - } req; - - printk(KERN_INFO "msm_hsusb_phy_reset\n"); - - usb_ep = msm_rpc_connect(HSUSB_API_PROG, HSUSB_API_VERS, 0); - if (IS_ERR(usb_ep)) { - printk(KERN_ERR "%s: init rpc failed! error: %ld\n", - __func__, PTR_ERR(usb_ep)); - goto close; - } - rc = msm_rpc_call(usb_ep, HSUSB_API_INIT_PHY_PROC, - &req, sizeof(req), 5 * HZ); - if (rc < 0) - printk(KERN_ERR "%s: rpc call failed! (%d)\n", __func__, rc); - -close: - msm_rpc_close(usb_ep); -} - -/* adjust eye diagram, disable vbusvalid interrupts */ -static int hsusb_phy_init_seq[] = { 0x40, 0x31, 0x1D, 0x0D, 0x1D, 0x10, -1 }; - -#ifdef CONFIG_USB_FUNCTION -static char *usb_functions[] = { -#if defined(CONFIG_USB_FUNCTION_MASS_STORAGE) || defined(CONFIG_USB_FUNCTION_UMS) - "usb_mass_storage", -#endif -#ifdef CONFIG_USB_FUNCTION_ADB - "adb", -#endif -}; - -static struct msm_hsusb_product usb_products[] = { - { - .product_id = 0x0c01, - .functions = 0x00000041, /* usb_mass_storage */ - }, - { - .product_id = 0x0c02, - .functions = 0x00000043, /* usb_mass_storage + adb */ - }, -}; -#endif - -struct msm_hsusb_platform_data msm_hsusb_pdata = { - .phy_reset = internal_phy_reset, - .phy_init_seq = hsusb_phy_init_seq, -#ifdef CONFIG_USB_FUNCTION - .vendor_id = 0x0bb4, - .product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "HTC", - - .functions = usb_functions, - .num_functions = ARRAY_SIZE(usb_functions), - .products = usb_products, - .num_products = ARRAY_SIZE(usb_products), -#endif -}; - -#ifdef CONFIG_USB_FUNCTION -static struct usb_mass_storage_platform_data mass_storage_pdata = { - .nluns = 1, - .buf_size = 16384, - .vendor = "HTC ", - .product = "Android Phone ", - .release = 0x0100, -}; - -static struct platform_device usb_mass_storage_device = { - .name = "usb_mass_storage", - .id = -1, - .dev = { - .platform_data = &mass_storage_pdata, - }, -}; -#endif - -#ifdef CONFIG_USB_ANDROID -static struct android_usb_platform_data android_usb_pdata = { - .vendor_id = 0x0bb4, - .product_id = 0x0c01, - .adb_product_id = 0x0c02, - .version = 0x0100, - .product_name = "Android Phone", - .manufacturer_name = "HTC", - .nluns = 1, -}; - -static struct platform_device android_usb_device = { - .name = "android_usb", - .id = -1, - .dev = { - .platform_data = &android_usb_pdata, - }, -}; -#endif - -void __init msm_add_usb_devices(void (*phy_reset) (void)) -{ - /* setup */ - if (phy_reset) - msm_hsusb_pdata.phy_reset = phy_reset; - msm_device_hsusb.dev.platform_data = &msm_hsusb_pdata; - platform_device_register(&msm_device_hsusb); -#ifdef CONFIG_USB_FUNCTION_MASS_STORAGE - platform_device_register(&usb_mass_storage_device); -#endif -#ifdef CONFIG_USB_ANDROID - platform_device_register(&android_usb_device); -#endif -} - -static struct android_pmem_platform_data pmem_pdata = { - .name = "pmem", - .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING, - .cached = 1, -}; - -static struct android_pmem_platform_data pmem_adsp_pdata = { - .name = "pmem_adsp", - .allocator_type = PMEM_ALLOCATORTYPE_BUDDYBESTFIT, - .cached = 0, -}; - -static struct android_pmem_platform_data pmem_camera_pdata = { - .name = "pmem_camera", - .allocator_type = PMEM_ALLOCATORTYPE_BUDDYBESTFIT, - .cached = 0, -}; - -static struct android_pmem_platform_data pmem_gpu0_pdata = { - .name = "pmem_gpu0", - .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING, - .cached = 0, - .buffered = 1, -}; - -static struct android_pmem_platform_data pmem_gpu1_pdata = { - .name = "pmem_gpu1", - .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING, - .cached = 0, - .buffered = 1, -}; - -static struct platform_device pmem_device = { - .name = "android_pmem", - .id = 0, - .dev = { .platform_data = &pmem_pdata }, -}; - -static struct platform_device pmem_adsp_device = { - .name = "android_pmem", - .id = 1, - .dev = { .platform_data = &pmem_adsp_pdata }, -}; - -static struct platform_device pmem_gpu0_device = { - .name = "android_pmem", - .id = 2, - .dev = { .platform_data = &pmem_gpu0_pdata }, -}; - -static struct platform_device pmem_gpu1_device = { - .name = "android_pmem", - .id = 3, - .dev = { .platform_data = &pmem_gpu1_pdata }, -}; - -static struct platform_device pmem_camera_device = { - .name = "android_pmem", - .id = 4, - .dev = { .platform_data = &pmem_camera_pdata }, -}; - -static struct resource ram_console_resource[] = { - { - .flags = IORESOURCE_MEM, - } -}; - -static struct platform_device ram_console_device = { - .name = "ram_console", - .id = -1, - .num_resources = ARRAY_SIZE(ram_console_resource), - .resource = ram_console_resource, -}; - -void __init msm_add_mem_devices(struct msm_pmem_setting *setting) -{ - if (setting->pmem_size) { - pmem_pdata.start = setting->pmem_start; - pmem_pdata.size = setting->pmem_size; - platform_device_register(&pmem_device); - } - - if (setting->pmem_adsp_size) { - pmem_adsp_pdata.start = setting->pmem_adsp_start; - pmem_adsp_pdata.size = setting->pmem_adsp_size; - platform_device_register(&pmem_adsp_device); - } - - if (setting->pmem_gpu0_size) { - pmem_gpu0_pdata.start = setting->pmem_gpu0_start; - pmem_gpu0_pdata.size = setting->pmem_gpu0_size; - platform_device_register(&pmem_gpu0_device); - } - - if (setting->pmem_gpu1_size) { - pmem_gpu1_pdata.start = setting->pmem_gpu1_start; - pmem_gpu1_pdata.size = setting->pmem_gpu1_size; - platform_device_register(&pmem_gpu1_device); - } - - if (setting->pmem_camera_size) { - pmem_camera_pdata.start = setting->pmem_camera_start; - pmem_camera_pdata.size = setting->pmem_camera_size; - platform_device_register(&pmem_camera_device); - } - - if (setting->ram_console_size) { - ram_console_resource[0].start = setting->ram_console_start; - ram_console_resource[0].end = setting->ram_console_start - + setting->ram_console_size - 1; - platform_device_register(&ram_console_device); - } -} - -#define PM_LIBPROG 0x30000061 -#if (CONFIG_MSM_AMSS_VERSION == 6220) || (CONFIG_MSM_AMSS_VERSION == 6225) -#define PM_LIBVERS 0xfb837d0b -#else -#define PM_LIBVERS 0x10001 -#endif - -#if 0 -static struct platform_device *msm_serial_devices[] __initdata = { - &msm_device_uart1, - &msm_device_uart2, - &msm_device_uart3, - #ifdef CONFIG_SERIAL_MSM_HS - &msm_device_uart_dm1, - &msm_device_uart_dm2, - #endif -}; - -int __init msm_add_serial_devices(unsigned num) -{ - if (num > MSM_SERIAL_NUM) - return -EINVAL; - - return platform_device_register(msm_serial_devices[num]); -} -#endif - -#define ATAG_SMI 0x4d534D71 -/* setup calls mach->fixup, then parse_tags, parse_cmdline - * We need to setup meminfo in mach->fixup, so this function - * will need to traverse each tag to find smi tag. - */ -int __init parse_tag_smi(const struct tag *tags) -{ - int smi_sz = 0, find = 0; - struct tag *t = (struct tag *)tags; - - for (; t->hdr.size; t = tag_next(t)) { - if (t->hdr.tag == ATAG_SMI) { - printk(KERN_DEBUG "find the smi tag\n"); - find = 1; - break; - } - } - if (!find) - return -1; - - printk(KERN_DEBUG "parse_tag_smi: smi size = %d\n", t->u.mem.size); - smi_sz = t->u.mem.size; - return smi_sz; -} -__tagtable(ATAG_SMI, parse_tag_smi); - - -#define ATAG_HWID 0x4d534D72 -int __init parse_tag_hwid(const struct tag *tags) -{ - int hwid = 0, find = 0; - struct tag *t = (struct tag *)tags; - - for (; t->hdr.size; t = tag_next(t)) { - if (t->hdr.tag == ATAG_HWID) { - printk(KERN_DEBUG "find the hwid tag\n"); - find = 1; - break; - } - } - - if (find) - hwid = t->u.revision.rev; - printk(KERN_DEBUG "parse_tag_hwid: hwid = 0x%x\n", hwid); - return hwid; -} -__tagtable(ATAG_HWID, parse_tag_hwid); - -#define ATAG_SKUID 0x4d534D73 -int __init parse_tag_skuid(const struct tag *tags) -{ - int skuid = 0, find = 0; - struct tag *t = (struct tag *)tags; - - for (; t->hdr.size; t = tag_next(t)) { - if (t->hdr.tag == ATAG_SKUID) { - printk(KERN_DEBUG "find the skuid tag\n"); - find = 1; - break; - } - } - - if (find) - skuid = t->u.revision.rev; - printk(KERN_DEBUG "parse_tag_skuid: hwid = 0x%x\n", skuid); - return skuid; -} -__tagtable(ATAG_SKUID, parse_tag_skuid); - -#define ATAG_ENGINEERID 0x4d534D75 -int __init parse_tag_engineerid(const struct tag *tags) -{ - int engineerid = 0, find = 0; - struct tag *t = (struct tag *)tags; - - for (; t->hdr.size; t = tag_next(t)) { - if (t->hdr.tag == ATAG_ENGINEERID) { - printk(KERN_DEBUG "find the engineer tag\n"); - find = 1; - break; - } - } - - if (find) - engineerid = t->u.revision.rev; - printk(KERN_DEBUG "parse_tag_engineerid: hwid = 0x%x\n", engineerid); - return engineerid; -} -__tagtable(ATAG_ENGINEERID, parse_tag_engineerid); - -static int mfg_mode; -int __init board_mfg_mode_init(char *s) -{ - if (!strcmp(s, "normal")) - mfg_mode = 0; - else if (!strcmp(s, "factory2")) - mfg_mode = 1; - else if (!strcmp(s, "recovery")) - mfg_mode = 2; - else if (!strcmp(s, "charge")) - mfg_mode = 3; - - return 1; -} -__setup("androidboot.mode=", board_mfg_mode_init); - - -int board_mfg_mode(void) -{ - return mfg_mode; -} - -static int __init board_serialno_setup(char *serialno) -{ - char *str; - - if (board_mfg_mode() || !strlen(serialno)) - str = df_serialno; - else - str = serialno; -#ifdef CONFIG_USB_FUNCTION - msm_hsusb_pdata.serial_number = str; -#endif -#ifdef CONFIG_USB_ANDROID - android_usb_pdata.serial_number = str; -#endif - return 1; -} - -__setup("androidboot.serialno=", board_serialno_setup); diff --git a/arch/arm/mach-msm/dfe-fsm9xxx.c b/arch/arm/mach-msm/dfe-fsm9xxx.c deleted file mode 100644 index 66272d22b7c4..000000000000 --- a/arch/arm/mach-msm/dfe-fsm9xxx.c +++ /dev/null @@ -1,433 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* - * DFE of FSM9XXX - */ - -#define HH_ADDR_MASK 0x000ffffc -#define HH_OFFSET_VALID(offset) (((offset) & ~HH_ADDR_MASK) == 0) -#define HH_REG_IOADDR(offset) ((uint8_t *) MSM_HH_BASE + (offset)) -#define HH_MAKE_OFFSET(blk, adr) (((blk)&0x1F)<<15|((adr)&0x1FFF)<<2) - -#define HH_REG_SCPN_IREQ_MASK HH_REG_IOADDR(HH_MAKE_OFFSET(5, 0x12)) -#define HH_REG_SCPN_IREQ_FLAG HH_REG_IOADDR(HH_MAKE_OFFSET(5, 0x13)) - -/* - * Device private information per device node - */ - -#define HH_IRQ_FIFO_SIZE 64 -#define HH_IRQ_FIFO_EMPTY(pdev) ((pdev)->irq_fifo_head == \ - (pdev)->irq_fifo_tail) -#define HH_IRQ_FIFO_FULL(pdev) ((((pdev)->irq_fifo_tail + 1) % \ - HH_IRQ_FIFO_SIZE) == \ - (pdev)->irq_fifo_head) - -static struct hh_dev_node_info { - spinlock_t hh_lock; - char irq_fifo[HH_IRQ_FIFO_SIZE]; - unsigned int irq_fifo_head, irq_fifo_tail; - wait_queue_head_t wq; -} hh_dev_info; - -/* - * Device private information per file - */ - -struct hh_dev_file_info { - /* Buffer */ - unsigned int *parray; - unsigned int array_num; - - struct dfe_command_entry *pcmd; - unsigned int cmd_num; -}; - -/* - * File interface - */ - -static int hh_open(struct inode *inode, struct file *file) -{ - struct hh_dev_file_info *pdfi; - - /* private data allocation */ - pdfi = kmalloc(sizeof(*pdfi), GFP_KERNEL); - if (pdfi == NULL) - return -ENOMEM; - file->private_data = pdfi; - - /* buffer initialization */ - pdfi->parray = NULL; - pdfi->array_num = 0; - pdfi->pcmd = NULL; - pdfi->cmd_num = 0; - - return 0; -} - -static int hh_release(struct inode *inode, struct file *file) -{ - struct hh_dev_file_info *pdfi; - - pdfi = (struct hh_dev_file_info *) file->private_data; - - kfree(pdfi->parray); - pdfi->parray = NULL; - pdfi->array_num = 0; - - kfree(pdfi->pcmd); - pdfi->pcmd = NULL; - pdfi->cmd_num = 0; - - kfree(file->private_data); - file->private_data = NULL; - - return 0; -} - -static ssize_t hh_read(struct file *filp, char __user *buf, size_t count, - loff_t *f_pos) -{ - signed char irq = -1; - unsigned long irq_flags; - - do { - spin_lock_irqsave(&hh_dev_info.hh_lock, irq_flags); - if (!HH_IRQ_FIFO_EMPTY(&hh_dev_info)) { - irq = hh_dev_info.irq_fifo[hh_dev_info.irq_fifo_head]; - if (++hh_dev_info.irq_fifo_head == HH_IRQ_FIFO_SIZE) - hh_dev_info.irq_fifo_head = 0; - } - spin_unlock_irqrestore(&hh_dev_info.hh_lock, irq_flags); - - if (irq < 0) - if (wait_event_interruptible(hh_dev_info.wq, - !HH_IRQ_FIFO_EMPTY(&hh_dev_info)) < 0) - break; - } while (irq < 0); - - if (irq < 0) { - /* No pending interrupt */ - return 0; - } else { - put_user(irq, buf); - return 1; - } - - return 0; -} - -static ssize_t hh_write(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - return 0; -} - -static long hh_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - unsigned int __user *argp = (unsigned int __user *) arg; - struct hh_dev_file_info *pdfi = - (struct hh_dev_file_info *) file->private_data; - - switch (cmd) { - case DFE_IOCTL_READ_REGISTER: - { - unsigned int offset, value; - - if (get_user(offset, argp)) - return -EFAULT; - if (!HH_OFFSET_VALID(offset)) - return -EINVAL; - value = __raw_readl(HH_REG_IOADDR(offset)); - if (put_user(value, argp)) - return -EFAULT; - } - break; - - case DFE_IOCTL_WRITE_REGISTER: - { - struct dfe_write_register_param param; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - if (!HH_OFFSET_VALID(param.offset)) - return -EINVAL; - __raw_writel(param.value, - HH_REG_IOADDR(param.offset)); - } - break; - - case DFE_IOCTL_WRITE_REGISTER_WITH_MASK: - { - struct dfe_write_register_mask_param param; - unsigned int value; - unsigned long irq_flags; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - if (!HH_OFFSET_VALID(param.offset)) - return -EINVAL; - spin_lock_irqsave(&hh_dev_info.hh_lock, - irq_flags); - value = __raw_readl(HH_REG_IOADDR(param.offset)); - value &= ~param.mask; - value |= param.value & param.mask; - __raw_writel(value, HH_REG_IOADDR(param.offset)); - spin_unlock_irqrestore(&hh_dev_info.hh_lock, - irq_flags); - } - break; - - case DFE_IOCTL_READ_REGISTER_ARRAY: - case DFE_IOCTL_WRITE_REGISTER_ARRAY: - { - struct dfe_read_write_array_param param; - unsigned int req_sz; - unsigned long irq_flags; - unsigned int i; - void *addr; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - if (!HH_OFFSET_VALID(param.offset)) - return -EINVAL; - if (param.num == 0) - break; - req_sz = sizeof(unsigned int) * param.num; - - if (pdfi->array_num < param.num) { - void *pmem; - - pmem = kmalloc(req_sz, GFP_KERNEL); - if (pmem == NULL) - return -ENOMEM; - pdfi->parray = (unsigned int *) pmem; - pdfi->array_num = param.num; - } - - if (cmd == DFE_IOCTL_WRITE_REGISTER_ARRAY) - if (copy_from_user(pdfi->parray, - param.pArray, req_sz)) - return -EFAULT; - - addr = HH_REG_IOADDR(param.offset); - - spin_lock_irqsave(&hh_dev_info.hh_lock, - irq_flags); - for (i = 0; i < param.num; ++i, addr += 4) { - if (cmd == DFE_IOCTL_READ_REGISTER_ARRAY) - pdfi->parray[i] = __raw_readl(addr); - else - __raw_writel(pdfi->parray[i], addr); - } - spin_unlock_irqrestore(&hh_dev_info.hh_lock, - irq_flags); - - if (cmd == DFE_IOCTL_READ_REGISTER_ARRAY) - if (copy_to_user(pdfi->parray, - param.pArray, req_sz)) - return -EFAULT; - } - break; - - case DFE_IOCTL_COMMAND: - { - struct dfe_command_param param; - unsigned int req_sz; - unsigned long irq_flags; - unsigned int i, value; - struct dfe_command_entry *pcmd; - void *addr; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - if (param.num == 0) - break; - req_sz = sizeof(struct dfe_command_entry) * param.num; - - if (pdfi->cmd_num < param.num) { - void *pmem; - - pmem = kmalloc(req_sz, GFP_KERNEL); - if (pmem == NULL) - return -ENOMEM; - pdfi->pcmd = (struct dfe_command_entry *) pmem; - pdfi->cmd_num = param.num; - } - - if (copy_from_user(pdfi->pcmd, param.pEntry, req_sz)) - return -EFAULT; - - pcmd = pdfi->pcmd; - - spin_lock_irqsave(&hh_dev_info.hh_lock, - irq_flags); - for (i = 0; i < param.num; ++i, ++pcmd) { - if (!HH_OFFSET_VALID(pcmd->offset)) - return -EINVAL; - addr = HH_REG_IOADDR(pcmd->offset); - - switch (pcmd->code) { - case DFE_IOCTL_COMMAND_CODE_WRITE: - __raw_writel(pcmd->value, addr); - break; - case DFE_IOCTL_COMMAND_CODE_WRITE_WITH_MASK: - value = __raw_readl(addr); - value &= ~pcmd->mask; - value |= pcmd->value & pcmd->mask; - __raw_writel(value, addr); - break; - } - } - spin_unlock_irqrestore(&hh_dev_info.hh_lock, - irq_flags); - } - break; - - default: - return -EINVAL; - } - - return 0; -} - -static unsigned int hh_poll(struct file *filp, - struct poll_table_struct *wait) -{ - unsigned mask = 0; - - if (!HH_IRQ_FIFO_EMPTY(&hh_dev_info)) - mask |= POLLIN; - - if (mask == 0) { - poll_wait(filp, &hh_dev_info.wq, wait); - if (!HH_IRQ_FIFO_EMPTY(&hh_dev_info)) - mask |= POLLIN; - } - - return mask; -} - -static const struct file_operations hh_fops = { - .owner = THIS_MODULE, - .open = hh_open, - .release = hh_release, - .read = hh_read, - .write = hh_write, - .unlocked_ioctl = hh_ioctl, - .poll = hh_poll, -}; - -/* - * Interrupt handling - */ - -static irqreturn_t hh_irq_handler(int irq, void *data) -{ - unsigned int irq_enable, irq_flag, irq_mask; - int i; - - irq_enable = __raw_readl(HH_REG_SCPN_IREQ_MASK); - irq_flag = __raw_readl(HH_REG_SCPN_IREQ_FLAG); - irq_flag &= irq_enable; - - /* Disables interrupts */ - irq_enable &= ~irq_flag; - __raw_writel(irq_enable, HH_REG_SCPN_IREQ_MASK); - - /* Adds the pending interrupts to irq_fifo */ - spin_lock(&hh_dev_info.hh_lock); - for (i = 0, irq_mask = 1; i < 32; ++i, irq_mask <<= 1) { - if (HH_IRQ_FIFO_FULL(&hh_dev_info)) - break; - if (irq_flag & irq_mask) { - hh_dev_info.irq_fifo[hh_dev_info.irq_fifo_tail] = \ - (char) i; - if (++hh_dev_info.irq_fifo_tail == HH_IRQ_FIFO_SIZE) - hh_dev_info.irq_fifo_tail = 0; - } - } - spin_unlock(&hh_dev_info.hh_lock); - - /* Wakes up pending processes */ - wake_up_interruptible(&hh_dev_info.wq); - - return IRQ_HANDLED; -} - -/* - * Driver initialization & cleanup - */ - -static struct miscdevice hh_misc_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = DFE_HH_DEVICE_NAME, - .fops = &hh_fops, -}; - -static int __init hh_init(void) -{ - int ret; - - /* lock initialization */ - spin_lock_init(&hh_dev_info.hh_lock); - - /* interrupt handler */ - hh_dev_info.irq_fifo_head = 0; - hh_dev_info.irq_fifo_tail = 0; - ret = request_irq(INT_HH_SUPSS_IRQ, hh_irq_handler, - IRQF_TRIGGER_RISING, "hh_dev", 0); - if (ret < 0) { - pr_err("Cannot register HH interrupt handler.\n"); - return ret; - } - - /* wait queue */ - init_waitqueue_head(&hh_dev_info.wq); - - return misc_register(&hh_misc_dev); -} - -static void __exit hh_exit(void) -{ - misc_deregister(&hh_misc_dev); - free_irq(INT_HH_SUPSS_IRQ, 0); -} - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Rohit Vaswani "); -MODULE_DESCRIPTION("Qualcomm Hammerhead Digital Front End driver"); -MODULE_VERSION("1.0"); - -module_init(hh_init); -module_exit(hh_exit); - diff --git a/arch/arm/mach-msm/etm.c b/arch/arm/mach-msm/etm.c deleted file mode 100644 index ae427335139d..000000000000 --- a/arch/arm/mach-msm/etm.c +++ /dev/null @@ -1,1036 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define LOG_BUF_LEN 32768 -/* each slot is 4 bytes, 8kb total */ -#define ETB_RAM_SLOTS 2048 - -#define DATALOG_SYNC 0xB5C7 -#define ETM_DUMP_MSG_ID 0x000A6960 -#define ETB_DUMP_MSG_ID 0x000A6961 - -/* ETB Registers */ -#define ETB_REG_CONTROL ETMIMPSPEC1 -#define ETB_REG_STATUS ETMIMPSPEC2 -#define ETB_REG_COUNT ETMIMPSPEC3 -#define ETB_REG_ADDRESS ETMIMPSPEC4 -#define ETB_REG_DATA ETMIMPSPEC5 - -/* Having etb macro accessors allows macro expansion for ETB reg defines */ -#define etb_read(reg) etm_read(reg) -#define etb_write(val, reg) etm_write(val, reg) - -/* Bitmasks for the ETM control register */ -#define ETM_CONTROL_POWERDOWN 0x00000001 -#define ETM_CONTROL_PROGRAM 0x00000400 - -/* Bitmasks for the ETM status register */ -#define ETM_STATUS_PROGRAMMING 0x00000002 - -/* ETB Status Register bit definitions */ -#define OV 0x00200000 - -/* ETB Control Register bit definitions */ -#define AIR 0x00000008 -#define AIW 0x00000004 -#define CPTM 0x00000002 -#define CPTEN 0x00000001 - -/* Bitmasks for the swconfig field of ETM_CONFIG - * ETM trigger propagated to ETM instances on all cores - */ -#define TRIGGER_ALL 0x00000002 - -#define PROG_TIMEOUT_MS 500 - -static int trace_enabled; -static int cpu_to_dump; -static int next_cpu_to_dump; -static struct wake_lock etm_wake_lock; -static struct pm_qos_request etm_qos_req; -static int trace_on_boot; -module_param_named( - trace_on_boot, trace_on_boot, int, S_IRUGO -); - -struct b { - uint8_t etm_log_buf[LOG_BUF_LEN]; - uint32_t log_end; -}; - -static struct b buf[NR_CPUS]; -static struct b __percpu * *alloc_b; -static atomic_t etm_dev_in_use; - -/* These default settings will be used to configure the ETM/ETB - * when the driver loads. */ -struct etm_config_struct { - uint32_t etm_00_control; - uint32_t etm_02_trigger_event; - uint32_t etm_06_te_start_stop; - uint32_t etm_07_te_single_addr_comp; - uint32_t etm_08_te_event; - uint32_t etm_09_te_control; - uint32_t etm_0a_fifofull_region; - uint32_t etm_0b_fifofull_level; - uint32_t etm_0c_vd_event; - uint32_t etm_0d_vd_single_addr_comp; - uint32_t etm_0e_vd_mmd; - uint32_t etm_0f_vd_control; - uint32_t etm_addr_comp_value[8]; /* 10 to 17 */ - uint32_t etm_addr_access_type[8]; /* 20 to 27 */ - uint32_t etm_data_comp_value[2]; /* 30 and 32 */ - uint32_t etm_data_comp_mask[2]; /* 40 and 42 */ - uint32_t etm_counter_reload_value[2]; /* 50 to 51 */ - uint32_t etm_counter_enable[2]; /* 54 to 55 */ - uint32_t etm_counter_reload_event[2]; /* 58 to 59 */ - uint32_t etm_60_seq_event_1_to_2; - uint32_t etm_61_seq_event_2_to_1; - uint32_t etm_62_seq_event_2_to_3; - uint32_t etm_63_seq_event_3_to_1; - uint32_t etm_64_seq_event_3_to_2; - uint32_t etm_65_seq_event_1_to_3; - uint32_t etm_6c_cid_comp_value_1; - uint32_t etm_6f_cid_comp_mask; - uint32_t etm_78_sync_freq; - uint32_t swconfig; - uint32_t etb_trig_cnt; - uint32_t etb_init_ptr; -}; - -static struct etm_config_struct etm_config = { - /* etm_00_control 0x0000D84E: 32-bit CID, cycle-accurate, - * monitorCPRT */ - .etm_00_control = 0x0000D84E, - /* etm_02_trigger_event 0x00000000: address comparator 0 matches */ - .etm_02_trigger_event = 0x00000000, - .etm_06_te_start_stop = 0x00000000, - .etm_07_te_single_addr_comp = 0x00000000, - /* etm_08_te_event 0x0000006F: always true */ - .etm_08_te_event = 0x0000006F, - /* etm_09_te_control 0x01000000: exclude none */ - .etm_09_te_control = 0x01000000, - .etm_0a_fifofull_region = 0x00000000, - .etm_0b_fifofull_level = 0x00000000, - /* etm_0c_vd_event 0x0000006F: always true */ - .etm_0c_vd_event = 0x0000006F, - .etm_0d_vd_single_addr_comp = 0x00000000, - .etm_0e_vd_mmd = 0x00000000, - /* etm_0f_vd_control 0x00010000: exclude none */ - .etm_0f_vd_control = 0x00010000, - .etm_addr_comp_value[0] = 0x00000000, - .etm_addr_comp_value[1] = 0x00000000, - .etm_addr_comp_value[2] = 0x00000000, - .etm_addr_comp_value[3] = 0x00000000, - .etm_addr_comp_value[4] = 0x00000000, - .etm_addr_comp_value[5] = 0x00000000, - .etm_addr_comp_value[6] = 0x00000000, - .etm_addr_comp_value[7] = 0x00000000, - .etm_addr_access_type[0] = 0x00000000, - .etm_addr_access_type[1] = 0x00000000, - .etm_addr_access_type[2] = 0x00000000, - .etm_addr_access_type[3] = 0x00000000, - .etm_addr_access_type[4] = 0x00000000, - .etm_addr_access_type[5] = 0x00000000, - .etm_addr_access_type[6] = 0x00000000, - .etm_addr_access_type[7] = 0x00000000, - .etm_data_comp_value[0] = 0x00000000, - .etm_data_comp_value[1] = 0x00000000, - .etm_data_comp_mask[0] = 0x00000000, - .etm_data_comp_mask[1] = 0x00000000, - .etm_counter_reload_value[0] = 0x00000000, - .etm_counter_reload_value[1] = 0x00000000, - .etm_counter_enable[0] = 0x0002406F, - .etm_counter_enable[1] = 0x0002406F, - .etm_counter_reload_event[0] = 0x0000406F, - .etm_counter_reload_event[1] = 0x0000406F, - .etm_60_seq_event_1_to_2 = 0x0000406F, - .etm_61_seq_event_2_to_1 = 0x0000406F, - .etm_62_seq_event_2_to_3 = 0x0000406F, - .etm_63_seq_event_3_to_1 = 0x0000406F, - .etm_64_seq_event_3_to_2 = 0x0000406F, - .etm_65_seq_event_1_to_3 = 0x0000406F, - .etm_6c_cid_comp_value_1 = 0x00000000, - .etm_6f_cid_comp_mask = 0x00000000, - .etm_78_sync_freq = 0x00000400, - .swconfig = 0x00000002, - /* etb_trig_cnt 0x00000000: ignore trigger */ - .etb_trig_cnt = 0x00000000, - /* etb_init_ptr 0x00000010: 16 marker bytes */ - .etb_init_ptr = 0x00000010, -}; - -/* ETM clock is derived from the processor clock and gets enabled on a - * logical OR of below items on Scorpion: - * 1.CPMR[ETMCLKEN] is set - * 2.ETM is not idle. Also means ETMCR[PD] is 0 - * 3.Reset is asserted (core or debug) - * 4.MRC/MCR to ETM reg (CP14 access) - * 5.Debugger access to a ETM register in the core power domain - * - * 1. and 2. above are permanent enables whereas 3., 4. and 5. are - * temporary enables - * - * We rely on 4. to be able to access ETMCR and then use 2. above for ETM - * clock vote in the driver and the save-restore code uses 1. above - * for its vote. - */ -static inline void __cpu_set_etm_pwrdwn(void) -{ - uint32_t etm_control; - - isb(); - etm_control = etm_read(ETMCR); - etm_control |= ETM_CONTROL_POWERDOWN; - etm_write(etm_control, ETMCR); -} - -static inline void __cpu_clear_etm_pwrdwn(void) -{ - uint32_t etm_control; - - etm_control = etm_read(ETMCR); - etm_control &= ~ETM_CONTROL_POWERDOWN; - etm_write(etm_control, ETMCR); - isb(); -} - -static void emit_log_char(uint8_t c) -{ - int this_cpu = get_cpu(); - struct b *mybuf = *per_cpu_ptr(alloc_b, this_cpu); - char *log_buf = mybuf->etm_log_buf; - int index = (mybuf->log_end)++ & (LOG_BUF_LEN - 1); - log_buf[index] = c; - put_cpu(); -} - -static void emit_log_word(uint32_t word) -{ - emit_log_char(word >> 24); - emit_log_char(word >> 16); - emit_log_char(word >> 8); - emit_log_char(word >> 0); -} - -static void __cpu_enable_etb(void) -{ - uint32_t etb_control; - uint32_t i; - - /* enable auto-increment on reads and writes */ - etb_control = AIR | AIW; - etb_write(etb_control, ETB_REG_CONTROL); - - /* write tags to the slots before the write pointer so we can - * detect overflow */ - etb_write(0x00000000, ETB_REG_ADDRESS); - for (i = 0; i < (etm_config.etb_init_ptr >> 2); i++) - etb_write(0xDEADBEEF, ETB_REG_DATA); - - etb_write(0x00000000, ETB_REG_STATUS); - - /* initialize write pointer */ - etb_write(etm_config.etb_init_ptr, ETB_REG_ADDRESS); - - /* multiple of 16 */ - etb_write(etm_config.etb_trig_cnt & 0xFFFFFFF0, ETB_REG_COUNT); - - /* Enable ETB and enable the trigger counter as appropriate. A - * trigger count of 0 will be used to signify that the user wants to - * ignore the trigger (just keep writing to the ETB and overwriting - * the oldest data). For "trace before trigger" captures the user - * should set the trigger count to a small number. */ - - etb_control |= CPTEN; - if (etm_config.etb_trig_cnt) - etb_control |= CPTM; - etb_write(etb_control, ETB_REG_CONTROL); -} - -static void __cpu_disable_etb(void) -{ - uint32_t etb_control; - etb_control = etb_read(ETB_REG_CONTROL); - etb_control &= ~CPTEN; - etb_write(etb_control, ETB_REG_CONTROL); -} - -static void __cpu_enable_etm(void) -{ - uint32_t etm_control; - unsigned long timeout = jiffies + msecs_to_jiffies(PROG_TIMEOUT_MS); - - etm_control = etm_read(ETMCR); - etm_control &= ~ETM_CONTROL_PROGRAM; - etm_write(etm_control, ETMCR); - - while ((etm_read(ETMSR) & ETM_STATUS_PROGRAMMING) == 1) { - cpu_relax(); - if (time_after(jiffies, timeout)) { - pr_err("etm: timeout while clearing prog bit\n"); - break; - } - } -} - -static void __cpu_disable_etm(void) -{ - uint32_t etm_control; - unsigned long timeout = jiffies + msecs_to_jiffies(PROG_TIMEOUT_MS); - - etm_control = etm_read(ETMCR); - etm_control |= ETM_CONTROL_PROGRAM; - etm_write(etm_control, ETMCR); - - while ((etm_read(ETMSR) & ETM_STATUS_PROGRAMMING) == 0) { - cpu_relax(); - if (time_after(jiffies, timeout)) { - pr_err("etm: timeout while setting prog bit\n"); - break; - } - } -} - -static void __cpu_enable_trace(void *unused) -{ - uint32_t etm_control; - uint32_t etm_trigger; - uint32_t etm_external_output; - - get_cpu(); - - __cpu_disable_etb(); - /* vote for ETM power/clock enable */ - __cpu_clear_etm_pwrdwn(); - __cpu_disable_etm(); - - etm_control = (etm_config.etm_00_control & ~ETM_CONTROL_POWERDOWN) - | ETM_CONTROL_PROGRAM; - etm_write(etm_control, ETMCR); - - etm_trigger = etm_config.etm_02_trigger_event; - etm_external_output = 0x406F; /* always FALSE */ - - if (etm_config.swconfig & TRIGGER_ALL) { - uint32_t function = 0x5; /* A OR B */ - uint32_t resource_b = 0x60; /* external input 1 */ - - etm_trigger &= 0x7F; /* keep resource A, clear function and - * resource B */ - etm_trigger |= (function << 14); - etm_trigger |= (resource_b << 7); - etm_external_output = etm_trigger; - } - - etm_write(etm_trigger, ETMTRIGGER); - etm_write(etm_config.etm_06_te_start_stop, ETMTSSCR); - etm_write(etm_config.etm_07_te_single_addr_comp, ETMTECR2); - etm_write(etm_config.etm_08_te_event, ETMTEEVR); - etm_write(etm_config.etm_09_te_control, ETMTECR1); - etm_write(etm_config.etm_0a_fifofull_region, ETMFFRR); - etm_write(etm_config.etm_0b_fifofull_level, ETMFFLR); - etm_write(etm_config.etm_0c_vd_event, ETMVDEVR); - etm_write(etm_config.etm_0d_vd_single_addr_comp, ETMVDCR1); - etm_write(etm_config.etm_0e_vd_mmd, ETMVDCR2); - etm_write(etm_config.etm_0f_vd_control, ETMVDCR3); - etm_write(etm_config.etm_addr_comp_value[0], ETMACVR0); - etm_write(etm_config.etm_addr_comp_value[1], ETMACVR1); - etm_write(etm_config.etm_addr_comp_value[2], ETMACVR2); - etm_write(etm_config.etm_addr_comp_value[3], ETMACVR3); - etm_write(etm_config.etm_addr_comp_value[4], ETMACVR4); - etm_write(etm_config.etm_addr_comp_value[5], ETMACVR5); - etm_write(etm_config.etm_addr_comp_value[6], ETMACVR6); - etm_write(etm_config.etm_addr_comp_value[7], ETMACVR7); - etm_write(etm_config.etm_addr_access_type[0], ETMACTR0); - etm_write(etm_config.etm_addr_access_type[1], ETMACTR1); - etm_write(etm_config.etm_addr_access_type[2], ETMACTR2); - etm_write(etm_config.etm_addr_access_type[3], ETMACTR3); - etm_write(etm_config.etm_addr_access_type[4], ETMACTR4); - etm_write(etm_config.etm_addr_access_type[5], ETMACTR5); - etm_write(etm_config.etm_addr_access_type[6], ETMACTR6); - etm_write(etm_config.etm_addr_access_type[7], ETMACTR7); - etm_write(etm_config.etm_data_comp_value[0], ETMDCVR0); - etm_write(etm_config.etm_data_comp_value[1], ETMDCVR2); - etm_write(etm_config.etm_data_comp_mask[0], ETMDCMR0); - etm_write(etm_config.etm_data_comp_mask[1], ETMDCMR2); - etm_write(etm_config.etm_counter_reload_value[0], ETMCNTRLDVR0); - etm_write(etm_config.etm_counter_reload_value[1], ETMCNTRLDVR1); - etm_write(etm_config.etm_counter_enable[0], ETMCNTENR0); - etm_write(etm_config.etm_counter_enable[1], ETMCNTENR1); - etm_write(etm_config.etm_counter_reload_event[0], ETMCNTRLDEVR0); - etm_write(etm_config.etm_counter_reload_event[1], ETMCNTRLDEVR1); - etm_write(etm_config.etm_60_seq_event_1_to_2, ETMSQ12EVR); - etm_write(etm_config.etm_61_seq_event_2_to_1, ETMSQ21EVR); - etm_write(etm_config.etm_62_seq_event_2_to_3, ETMSQ23EVR); - etm_write(etm_config.etm_63_seq_event_3_to_1, ETMSQ31EVR); - etm_write(etm_config.etm_64_seq_event_3_to_2, ETMSQ32EVR); - etm_write(etm_config.etm_65_seq_event_1_to_3, ETMSQ13EVR); - etm_write(etm_external_output, ETMEXTOUTEVR0); - etm_write(etm_config.etm_6c_cid_comp_value_1, ETMCIDCVR0); - etm_write(etm_config.etm_6f_cid_comp_mask, ETMCIDCMR); - etm_write(etm_config.etm_78_sync_freq, ETMSYNCFR); - - /* Note that we must enable the ETB before we enable the ETM if we - * want to capture the "always true" trigger event. */ - - __cpu_enable_etb(); - __cpu_enable_etm(); - - put_cpu(); -} - -static void __cpu_disable_trace(void *unused) -{ - get_cpu(); - - __cpu_disable_etm(); - - /* program trace enable to be low by using always false event */ - etm_write(0x6F | BIT(14), ETMTEEVR); - /* vote for ETM power/clock disable */ - __cpu_set_etm_pwrdwn(); - - __cpu_disable_etb(); - - put_cpu(); -} - -static void enable_trace(void) -{ - wake_lock(&etm_wake_lock); - pm_qos_update_request(&etm_qos_req, 0); - - if (etm_config.swconfig & TRIGGER_ALL) { - /* This register is accessible from either core. - * CPU1_extout[0] -> CPU0_extin[0] - * CPU_extout[0] -> CPU1_extin[0] */ - asm volatile("mcr p15, 3, %0, c15, c5, 2" : : "r" (0x1)); - asm volatile("isb"); - } - - get_cpu(); - __cpu_enable_trace(NULL); - smp_call_function(__cpu_enable_trace, NULL, 1); - put_cpu(); - - /* 1. causes all online cpus to come out of idle PC - * 2. prevents idle PC until save restore flag is enabled atomically - * - * we rely on the user to prevent hotplug on/off racing with this - * operation and to ensure cores where trace is expected to be turned - * on are already hotplugged on - */ - trace_enabled = 1; - - pm_qos_update_request(&etm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&etm_wake_lock); -} - -static void disable_trace(void) -{ - wake_lock(&etm_wake_lock); - pm_qos_update_request(&etm_qos_req, 0); - - get_cpu(); - __cpu_disable_trace(NULL); - smp_call_function(__cpu_disable_trace, NULL, 1); - put_cpu(); - - /* 1. causes all online cpus to come out of idle PC - * 2. prevents idle PC until save restore flag is disabled atomically - * - * we rely on the user to prevent hotplug on/off racing with this - * operation and to ensure cores where trace is expected to be turned - * off are already hotplugged on - */ - trace_enabled = 0; - - cpu_to_dump = next_cpu_to_dump = 0; - - pm_qos_update_request(&etm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&etm_wake_lock); -} - -static void generate_etb_dump(void) -{ - uint32_t i; - uint32_t full_slots; - uint32_t etb_control; - uint32_t prim_len; - uint32_t uptime = 0; - - etb_control = etb_read(ETB_REG_CONTROL); - etb_control |= AIR; - etb_write(etb_control, ETB_REG_CONTROL); - - if (etb_read(ETB_REG_STATUS) & OV) - full_slots = ETB_RAM_SLOTS; - else - full_slots = etb_read(ETB_REG_ADDRESS) >> 2; - - prim_len = 28 + (full_slots * 4); - - emit_log_char((DATALOG_SYNC >> 8) & 0xFF); - emit_log_char((DATALOG_SYNC >> 0) & 0xFF); - emit_log_char((prim_len >> 8) & 0xFF); - emit_log_char((prim_len >> 0) & 0xFF); - emit_log_word(uptime); - emit_log_word(ETB_DUMP_MSG_ID); - emit_log_word(etm_read(ETMCR)); - emit_log_word(etm_config.etb_init_ptr >> 2); - emit_log_word(etb_read(ETB_REG_ADDRESS) >> 2); - emit_log_word((etb_read(ETB_REG_STATUS) & OV) >> 21); - - etb_write(0x00000000, ETB_REG_ADDRESS); - for (i = 0; i < full_slots; i++) - emit_log_word(etb_read(ETB_REG_DATA)); -} - -/* This should match the number of ETM registers being dumped below */ -#define ETM_NUM_REGS_TO_DUMP 54 -static void generate_etm_dump(void) -{ - uint32_t prim_len; - uint32_t uptime = 0; - - prim_len = 12 + (4 * ETM_NUM_REGS_TO_DUMP); - - emit_log_char((DATALOG_SYNC >> 8) & 0xFF); - emit_log_char((DATALOG_SYNC >> 0) & 0xFF); - emit_log_char((prim_len >> 8) & 0xFF); - emit_log_char((prim_len >> 0) & 0xFF); - emit_log_word(uptime); - emit_log_word(ETM_DUMP_MSG_ID); - - emit_log_word(etm_read(ETMCR)); - emit_log_word(etm_read(ETMSR)); - emit_log_word(etb_read(ETB_REG_CONTROL)); - emit_log_word(etb_read(ETB_REG_STATUS)); - emit_log_word(etb_read(ETB_REG_COUNT)); - emit_log_word(etb_read(ETB_REG_ADDRESS)); - emit_log_word(0); /* don't read ETB_REG_DATA, changes ETB_REG_ADDRESS */ - emit_log_word(etm_read(ETMTRIGGER)); - emit_log_word(etm_read(ETMTSSCR)); - emit_log_word(etm_read(ETMTECR2)); - emit_log_word(etm_read(ETMTEEVR)); - emit_log_word(etm_read(ETMTECR1)); - emit_log_word(etm_read(ETMFFRR)); - emit_log_word(etm_read(ETMFFLR)); - emit_log_word(etm_read(ETMVDEVR)); - emit_log_word(etm_read(ETMVDCR1)); - emit_log_word(etm_read(ETMVDCR2)); - emit_log_word(etm_read(ETMVDCR3)); - emit_log_word(etm_read(ETMACVR0)); - emit_log_word(etm_read(ETMACVR1)); - emit_log_word(etm_read(ETMACVR2)); - emit_log_word(etm_read(ETMACVR3)); - emit_log_word(etm_read(ETMACVR4)); - emit_log_word(etm_read(ETMACVR5)); - emit_log_word(etm_read(ETMACVR6)); - emit_log_word(etm_read(ETMACVR7)); - emit_log_word(etm_read(ETMACTR0)); - emit_log_word(etm_read(ETMACTR1)); - emit_log_word(etm_read(ETMACTR2)); - emit_log_word(etm_read(ETMACTR3)); - emit_log_word(etm_read(ETMACTR4)); - emit_log_word(etm_read(ETMACTR5)); - emit_log_word(etm_read(ETMACTR6)); - emit_log_word(etm_read(ETMACTR7)); - emit_log_word(etm_read(ETMDCVR0)); - emit_log_word(etm_read(ETMDCVR2)); - emit_log_word(etm_read(ETMDCMR0)); - emit_log_word(etm_read(ETMDCMR2)); - emit_log_word(etm_read(ETMCNTRLDVR0)); - emit_log_word(etm_read(ETMCNTRLDVR1)); - emit_log_word(etm_read(ETMCNTENR0)); - emit_log_word(etm_read(ETMCNTENR1)); - emit_log_word(etm_read(ETMCNTRLDEVR0)); - emit_log_word(etm_read(ETMCNTRLDEVR1)); - emit_log_word(etm_read(ETMSQ12EVR)); - emit_log_word(etm_read(ETMSQ21EVR)); - emit_log_word(etm_read(ETMSQ23EVR)); - emit_log_word(etm_read(ETMSQ31EVR)); - emit_log_word(etm_read(ETMSQ32EVR)); - emit_log_word(etm_read(ETMSQ13EVR)); - emit_log_word(etm_read(ETMEXTOUTEVR0)); - emit_log_word(etm_read(ETMCIDCVR0)); - emit_log_word(etm_read(ETMCIDCMR)); - emit_log_word(etm_read(ETMSYNCFR)); -} - -static void dump_all(void *unused) -{ - get_cpu(); - __cpu_disable_etb(); - generate_etm_dump(); - generate_etb_dump(); - if (trace_enabled) - __cpu_enable_etb(); - put_cpu(); -} - -static void dump_trace(void) -{ - get_cpu(); - dump_all(NULL); - smp_call_function(dump_all, NULL, 1); - put_cpu(); -} - -static int bytes_to_dump; -static uint8_t *etm_buf_ptr; - -static int etm_dev_open(struct inode *inode, struct file *file) -{ - if (atomic_cmpxchg(&etm_dev_in_use, 0, 1)) - return -EBUSY; - - pr_debug("%s: successfully opened\n", __func__); - return 0; -} - -static ssize_t etm_dev_read(struct file *file, char __user *data, - size_t len, loff_t *ppos) -{ - if (cpu_to_dump == next_cpu_to_dump) { - if (cpu_to_dump == 0) - dump_trace(); - bytes_to_dump = buf[cpu_to_dump].log_end; - buf[cpu_to_dump].log_end = 0; - etm_buf_ptr = buf[cpu_to_dump].etm_log_buf; - next_cpu_to_dump++; - if (next_cpu_to_dump >= num_possible_cpus()) - next_cpu_to_dump = 0; - } - - if (len > bytes_to_dump) - len = bytes_to_dump; - - if (copy_to_user(data, etm_buf_ptr, len)) { - pr_debug("%s: copy_to_user failed\n", __func__); - return -EFAULT; - } - - bytes_to_dump -= len; - etm_buf_ptr += len; - - pr_debug("%s: %d bytes copied, %d bytes left (cpu %d)\n", - __func__, len, bytes_to_dump, next_cpu_to_dump); - return len; -} - -static void setup_range_filter(char addr_type, char range, uint32_t reg1, - uint32_t addr1, uint32_t reg2, uint32_t addr2) -{ - etm_config.etm_addr_comp_value[reg1] = addr1; - etm_config.etm_addr_comp_value[reg2] = addr2; - - etm_config.etm_07_te_single_addr_comp |= (1 << reg1); - etm_config.etm_07_te_single_addr_comp |= (1 << reg2); - - etm_config.etm_09_te_control |= (1 << (reg1/2)); - if (range == 'i') - etm_config.etm_09_te_control &= ~(1 << 24); - else if (range == 'e') - etm_config.etm_09_te_control |= (1 << 24); - - if (addr_type == 'i') { - etm_config.etm_addr_access_type[reg1] = 0x99; - etm_config.etm_addr_access_type[reg2] = 0x99; - } else if (addr_type == 'd') { - etm_config.etm_addr_access_type[reg1] = 0x9C; - etm_config.etm_addr_access_type[reg2] = 0x9C; - } -} - -static void setup_start_stop_filter(char addr_type, char start_stop, - uint32_t reg, uint32_t addr) -{ - etm_config.etm_addr_comp_value[reg] = addr; - - if (start_stop == 's') - etm_config.etm_06_te_start_stop |= (1 << reg); - else if (start_stop == 't') - etm_config.etm_06_te_start_stop |= (1 << (reg + 16)); - - etm_config.etm_09_te_control |= (1 << 25); - - if (addr_type == 'i') - etm_config.etm_addr_access_type[reg] = 0x99; - else if (addr_type == 'd') - etm_config.etm_addr_access_type[reg] = 0x9C; -} - -static void setup_viewdata_range_filter(char range, uint32_t reg1, - uint32_t addr1, uint32_t reg2, uint32_t addr2) -{ - etm_config.etm_addr_comp_value[reg1] = addr1; - etm_config.etm_addr_comp_value[reg2] = addr2; - - if (range == 'i') { - etm_config.etm_0d_vd_single_addr_comp |= (1 << reg1); - etm_config.etm_0d_vd_single_addr_comp |= (1 << reg2); - etm_config.etm_0f_vd_control |= (1 << (reg1/2)); - } else if (range == 'e') { - etm_config.etm_0d_vd_single_addr_comp |= (1 << (reg1 + 16)); - etm_config.etm_0d_vd_single_addr_comp |= (1 << (reg2 + 16)); - etm_config.etm_0f_vd_control |= (1 << ((reg1/2) + 8)); - } - etm_config.etm_0f_vd_control &= ~(1 << 16); - - etm_config.etm_addr_access_type[reg1] = 0x9C; - etm_config.etm_addr_access_type[reg2] = 0x9C; -} - -static void setup_viewdata_start_stop_filter(char start_stop, uint32_t reg, - uint32_t addr) -{ - etm_config.etm_addr_comp_value[reg] = addr; - - if (start_stop == 's') - etm_config.etm_06_te_start_stop |= (1 << reg); - else if (start_stop == 't') - etm_config.etm_06_te_start_stop |= (1 << (reg + 16)); - - etm_config.etm_addr_access_type[reg] = 0x9C; -} - -static void setup_access_type(uint32_t reg, uint32_t value) -{ - etm_config.etm_addr_access_type[reg] &= 0xFFFFFFF8; - value &= 0x7; - etm_config.etm_addr_access_type[reg] |= value; -} - -static void reset_filter(void) -{ - etm_config.etm_00_control = 0x0000D84E; - /* etm_02_trigger_event 0x00000000: address comparator 0 matches */ - etm_config.etm_02_trigger_event = 0x00000000; - etm_config.etm_06_te_start_stop = 0x00000000; - etm_config.etm_07_te_single_addr_comp = 0x00000000; - /* etm_08_te_event 0x0000006F: always true */ - etm_config.etm_08_te_event = 0x0000006F; - /* etm_09_te_control 0x01000000: exclude none */ - etm_config.etm_09_te_control = 0x01000000; - etm_config.etm_0a_fifofull_region = 0x00000000; - etm_config.etm_0b_fifofull_level = 0x00000000; - /* etm_0c_vd_event 0x0000006F: always true */ - etm_config.etm_0c_vd_event = 0x0000006F; - etm_config.etm_0d_vd_single_addr_comp = 0x00000000; - etm_config.etm_0e_vd_mmd = 0x00000000; - /* etm_0f_vd_control 0x00010000: exclude none */ - etm_config.etm_0f_vd_control = 0x00010000; - etm_config.etm_addr_comp_value[0] = 0x00000000; - etm_config.etm_addr_comp_value[1] = 0x00000000; - etm_config.etm_addr_comp_value[2] = 0x00000000; - etm_config.etm_addr_comp_value[3] = 0x00000000; - etm_config.etm_addr_comp_value[4] = 0x00000000; - etm_config.etm_addr_comp_value[5] = 0x00000000; - etm_config.etm_addr_comp_value[6] = 0x00000000; - etm_config.etm_addr_comp_value[7] = 0x00000000; - etm_config.etm_addr_access_type[0] = 0x00000000; - etm_config.etm_addr_access_type[1] = 0x00000000; - etm_config.etm_addr_access_type[2] = 0x00000000; - etm_config.etm_addr_access_type[3] = 0x00000000; - etm_config.etm_addr_access_type[4] = 0x00000000; - etm_config.etm_addr_access_type[5] = 0x00000000; - etm_config.etm_addr_access_type[6] = 0x00000000; - etm_config.etm_addr_access_type[7] = 0x00000000; - etm_config.etm_data_comp_value[0] = 0x00000000; - etm_config.etm_data_comp_value[1] = 0x00000000; - etm_config.etm_data_comp_mask[0] = 0x00000000; - etm_config.etm_data_comp_mask[1] = 0x00000000; - etm_config.etm_counter_reload_value[0] = 0x00000000; - etm_config.etm_counter_reload_value[1] = 0x00000000; - etm_config.etm_counter_enable[0] = 0x0002406F; - etm_config.etm_counter_enable[1] = 0x0002406F; - etm_config.etm_counter_reload_event[0] = 0x0000406F; - etm_config.etm_counter_reload_event[1] = 0x0000406F; - etm_config.etm_60_seq_event_1_to_2 = 0x0000406F; - etm_config.etm_61_seq_event_2_to_1 = 0x0000406F; - etm_config.etm_62_seq_event_2_to_3 = 0x0000406F; - etm_config.etm_63_seq_event_3_to_1 = 0x0000406F; - etm_config.etm_64_seq_event_3_to_2 = 0x0000406F; - etm_config.etm_65_seq_event_1_to_3 = 0x0000406F; - etm_config.etm_6c_cid_comp_value_1 = 0x00000000; - etm_config.etm_6f_cid_comp_mask = 0x00000000; - etm_config.etm_78_sync_freq = 0x00000400; - etm_config.swconfig = 0x00000002; - /* etb_trig_cnt 0x00000020: ignore trigger */ - etm_config.etb_trig_cnt = 0x00000000; - /* etb_init_ptr 0x00000010: 16 marker bytes */ - etm_config.etb_init_ptr = 0x00000010; -} - -#define MAX_COMMAND_STRLEN 40 -static ssize_t etm_dev_write(struct file *file, const char __user *data, - size_t len, loff_t *ppos) -{ - char command[MAX_COMMAND_STRLEN]; - int strlen; - unsigned long value; - unsigned long reg1, reg2; - unsigned long addr1, addr2; - - strlen = strnlen_user(data, MAX_COMMAND_STRLEN); - pr_debug("etm: string length: %d", strlen); - if (strlen == 0 || strlen == (MAX_COMMAND_STRLEN+1)) { - pr_err("etm: error in strlen: %d", strlen); - return -EFAULT; - } - /* includes the null character */ - if (copy_from_user(command, data, strlen)) { - pr_err("etm: error in copy_from_user: %d", strlen); - return -EFAULT; - } - - pr_debug("etm: input = %s", command); - - switch (command[0]) { - case '0': - if (trace_enabled) { - disable_trace(); - pr_info("etm: tracing disabled\n"); - } - break; - case '1': - if (!trace_enabled) { - enable_trace(); - pr_info("etm: tracing enabled\n"); - } - break; - case 'f': - switch (command[2]) { - case 'i': - case 'd': - switch (command[4]) { - case 'i': - if (sscanf(&command[6], "%lx:%lx:%lx:%lx\\0", - ®1, &addr1, ®2, &addr2) != 4) - goto err_out; - if (reg1 > 7 || reg2 > 7 || (reg1 % 2)) - goto err_out; - setup_range_filter(command[2], 'i', - reg1, addr1, reg2, addr2); - break; - case 'e': - if (sscanf(&command[6], "%lx:%lx:%lx:%lx\\0", - ®1, &addr1, ®2, &addr2) != 4) - goto err_out; - if (reg1 > 7 || reg2 > 7 || (reg1 % 2) - || command[2] == 'd') - goto err_out; - setup_range_filter(command[2], 'e', - reg1, addr1, reg2, addr2); - break; - case 's': - if (sscanf(&command[6], "%lx:%lx\\0", - ®1, &addr1) != 2) - goto err_out; - if (reg1 > 7) - goto err_out; - setup_start_stop_filter(command[2], 's', - reg1, addr1); - break; - case 't': - if (sscanf(&command[6], "%lx:%lx\\0", - ®1, &addr1) != 2) - goto err_out; - if (reg1 > 7) - goto err_out; - setup_start_stop_filter(command[2], 't', - reg1, addr1); - break; - default: - goto err_out; - } - break; - case 'r': - reset_filter(); - break; - default: - goto err_out; - } - break; - case 'v': - switch (command[2]) { - case 'd': - switch (command[4]) { - case 'i': - if (sscanf(&command[6], "%lx:%lx:%lx:%lx\\0", - ®1, &addr1, ®2, &addr2) != 4) - goto err_out; - if (reg1 > 7 || reg2 > 7 || (reg1 % 2)) - goto err_out; - setup_viewdata_range_filter('i', - reg1, addr1, reg2, addr2); - break; - case 'e': - if (sscanf(&command[6], "%lx:%lx:%lx:%lx\\0", - ®1, &addr1, ®2, &addr2) != 4) - goto err_out; - if (reg1 > 7 || reg2 > 7 || (reg1 % 2)) - goto err_out; - setup_viewdata_range_filter('e', - reg1, addr1, reg2, addr2); - break; - case 's': - if (sscanf(&command[6], "%lx:%lx\\0", - ®1, &addr1) != 2) - goto err_out; - if (reg1 > 7) - goto err_out; - setup_viewdata_start_stop_filter('s', - reg1, addr1); - break; - case 't': - if (sscanf(&command[6], "%lx:%lx\\0", - ®1, &addr1) != 2) - goto err_out; - if (reg1 > 7) - goto err_out; - setup_viewdata_start_stop_filter('t', - reg1, addr1); - break; - default: - goto err_out; - } - break; - default: - goto err_out; - } - break; - case 'a': - switch (command[2]) { - case 't': - if (sscanf(&command[4], "%lx:%lx\\0", - ®1, &value) != 2) - goto err_out; - if (reg1 > 7 || value > 6) - goto err_out; - setup_access_type(reg1, value); - break; - default: - goto err_out; - } - break; - default: - goto err_out; - } - - return len; - -err_out: - return -EFAULT; -} - -static int etm_dev_release(struct inode *inode, struct file *file) -{ - if (cpu_to_dump == next_cpu_to_dump) - next_cpu_to_dump = 0; - cpu_to_dump = next_cpu_to_dump; - - atomic_set(&etm_dev_in_use, 0); - pr_debug("%s: released\n", __func__); - return 0; -} - -static const struct file_operations etm_dev_fops = { - .owner = THIS_MODULE, - .open = etm_dev_open, - .read = etm_dev_read, - .write = etm_dev_write, - .release = etm_dev_release, -}; - -static struct miscdevice etm_dev = { - .name = "msm_etm", - .minor = MISC_DYNAMIC_MINOR, - .fops = &etm_dev_fops, -}; - -static void __cpu_clear_sticky(void *unused) -{ - etm_read(ETMPDSR); /* clear sticky bit in PDSR */ - isb(); -} - -static int __init etm_init(void) -{ - int ret, cpu; - - ret = misc_register(&etm_dev); - if (ret) - return -ENODEV; - - alloc_b = alloc_percpu(typeof(*alloc_b)); - if (!alloc_b) - goto err1; - - for_each_possible_cpu(cpu) - *per_cpu_ptr(alloc_b, cpu) = &buf[cpu]; - - wake_lock_init(&etm_wake_lock, WAKE_LOCK_SUSPEND, "msm_etm"); - pm_qos_add_request(&etm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - /* No need to explicity turn on ETM clock since CP14 access go - * through via the autoclock turn on/off - */ - __cpu_clear_sticky(NULL); - smp_call_function(__cpu_clear_sticky, NULL, 1); - - cpu_to_dump = next_cpu_to_dump = 0; - - pr_info("ETM/ETB intialized.\n"); - - if (trace_on_boot) - enable_trace(); - - return 0; - -err1: - misc_deregister(&etm_dev); - return -ENOMEM; -} -module_init(etm_init); - -static void __exit etm_exit(void) -{ - disable_trace(); - pm_qos_remove_request(&etm_qos_req); - wake_lock_destroy(&etm_wake_lock); - free_percpu(alloc_b); - misc_deregister(&etm_dev); -} -module_exit(etm_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("embedded trace driver"); diff --git a/arch/arm/mach-msm/footswitch-8x60.c b/arch/arm/mach-msm/footswitch-8x60.c deleted file mode 100644 index 195ece300e55..000000000000 --- a/arch/arm/mach-msm/footswitch-8x60.c +++ /dev/null @@ -1,724 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "footswitch.h" -#include "rpm_resources.h" - -#ifdef CONFIG_MSM_SECURE_IO -#undef readl_relaxed -#undef writel_relaxed -#define readl_relaxed secure_readl -#define writel_relaxed secure_writel -#endif - -#define REG(off) (MSM_MMSS_CLK_CTL_BASE + (off)) -#define GEMINI_GFS_CTL_REG REG(0x01A0) -#define GFX2D0_GFS_CTL_REG REG(0x0180) -#define GFX2D1_GFS_CTL_REG REG(0x0184) -#define GFX3D_GFS_CTL_REG REG(0x0188) -#define MDP_GFS_CTL_REG REG(0x0190) -#define ROT_GFS_CTL_REG REG(0x018C) -#define VED_GFS_CTL_REG REG(0x0194) -#define VFE_GFS_CTL_REG REG(0x0198) -#define VPE_GFS_CTL_REG REG(0x019C) -#define VCAP_GFS_CTL_REG REG(0x0254) - -#define CLAMP_BIT BIT(5) -#define ENABLE_BIT BIT(8) -#define RETENTION_BIT BIT(9) - -#define GFS_DELAY_CNT 31 - -#define DEFAULT_RESET_DELAY_US 1 -/* Clock rate to use if one has not previously been set. */ -#define DEFAULT_RATE 27000000 -#define MAX_CLKS 10 - -/* - * Lock is only needed to protect against the first footswitch_enable() - * call occuring concurrently with late_footswitch_init(). - */ -static DEFINE_MUTEX(claim_lock); - -struct footswitch { - struct regulator_dev *rdev; - struct regulator_desc desc; - void *gfs_ctl_reg; - int bus_port0, bus_port1; - bool is_enabled; - bool is_claimed; - struct fs_clk_data *clk_data; - struct clk *core_clk; - unsigned long reset_delay_us; -}; - -static int setup_clocks(struct footswitch *fs) -{ - int rc = 0; - struct fs_clk_data *clock; - long rate; - - /* - * Enable all clocks in the power domain. If a specific clock rate is - * required for reset timing, set that rate before enabling the clocks. - */ - for (clock = fs->clk_data; clock->clk; clock++) { - clock->rate = clk_get_rate(clock->clk); - if (!clock->rate || clock->reset_rate) { - rate = clock->reset_rate ? - clock->reset_rate : DEFAULT_RATE; - rc = clk_set_rate(clock->clk, rate); - if (rc && rc != -ENOSYS) { - pr_err("Failed to set %s %s rate to %lu Hz.\n", - fs->desc.name, clock->name, clock->rate); - for (clock--; clock >= fs->clk_data; clock--) { - if (clock->enabled) - clk_disable_unprepare( - clock->clk); - clk_set_rate(clock->clk, clock->rate); - } - return rc; - } - } - /* - * Some clocks are for reset purposes only. These clocks will - * fail to enable. Ignore the failures but keep track of them so - * we don't try to disable them later and crash due to - * unbalanced calls. - */ - clock->enabled = !clk_prepare_enable(clock->clk); - } - - return 0; -} - -static void restore_clocks(struct footswitch *fs) -{ - struct fs_clk_data *clock; - - /* Restore clocks to their orignal states before setup_clocks(). */ - for (clock = fs->clk_data; clock->clk; clock++) { - if (clock->enabled) - clk_disable_unprepare(clock->clk); - if (clock->rate && clk_set_rate(clock->clk, clock->rate)) - pr_err("Failed to restore %s %s rate to %lu Hz.\n", - fs->desc.name, clock->name, clock->rate); - } -} - -static int footswitch_is_enabled(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - - return fs->is_enabled; -} - -static int footswitch_enable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - mutex_lock(&claim_lock); - fs->is_claimed = true; - mutex_unlock(&claim_lock); - - /* Return early if already enabled. */ - regval = readl_relaxed(fs->gfs_ctl_reg); - if ((regval & (ENABLE_BIT | CLAMP_BIT)) == ENABLE_BIT) - return 0; - - /* Make sure required clocks are on at the correct rates. */ - rc = setup_clocks(fs); - if (rc) - return rc; - - /* Un-halt all bus ports in the power domain. */ - if (fs->bus_port0) { - rc = msm_bus_axi_portunhalt(fs->bus_port0); - if (rc) { - pr_err("%s port 0 unhalt failed.\n", fs->desc.name); - goto err; - } - } - if (fs->bus_port1) { - rc = msm_bus_axi_portunhalt(fs->bus_port1); - if (rc) { - pr_err("%s port 1 unhalt failed.\n", fs->desc.name); - goto err_port2_halt; - } - } - - /* - * (Re-)Assert resets for all clocks in the clock domain, since - * footswitch_enable() is first called before footswitch_disable() - * and resets should be asserted before power is restored. - */ - for (clock = fs->clk_data; clock->clk; clock++) - ; /* Do nothing */ - for (clock--; clock >= fs->clk_data; clock--) - clk_reset(clock->clk, CLK_RESET_ASSERT); - /* Wait for synchronous resets to propagate. */ - udelay(fs->reset_delay_us); - - /* Enable the power rail at the footswitch. */ - regval |= ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - /* Wait for the rail to fully charge. */ - mb(); - udelay(1); - - /* Un-clamp the I/O ports. */ - regval &= ~CLAMP_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Deassert resets for all clocks in the power domain. */ - for (clock = fs->clk_data; clock->clk; clock++) - clk_reset(clock->clk, CLK_RESET_DEASSERT); - /* Toggle core reset again after first power-on (required for GFX3D). */ - if (fs->desc.id == FS_GFX3D) { - clk_reset(fs->core_clk, CLK_RESET_ASSERT); - udelay(fs->reset_delay_us); - clk_reset(fs->core_clk, CLK_RESET_DEASSERT); - udelay(fs->reset_delay_us); - } - - /* Prevent core memory from collapsing when its clock is gated. */ - clk_set_flags(fs->core_clk, CLKFLAG_RETAIN_MEM); - - /* Return clocks to their state before this function. */ - restore_clocks(fs); - - fs->is_enabled = true; - return 0; - -err_port2_halt: - msm_bus_axi_porthalt(fs->bus_port0); -err: - restore_clocks(fs); - return rc; -} - -static int footswitch_disable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - /* Return early if already disabled. */ - regval = readl_relaxed(fs->gfs_ctl_reg); - if ((regval & ENABLE_BIT) == 0) - return 0; - - /* Make sure required clocks are on at the correct rates. */ - rc = setup_clocks(fs); - if (rc) - return rc; - - /* Allow core memory to collapse when its clock is gated. */ - if (fs->desc.id != FS_GFX3D_8064) - clk_set_flags(fs->core_clk, CLKFLAG_NORETAIN_MEM); - - /* Halt all bus ports in the power domain. */ - if (fs->bus_port0) { - rc = msm_bus_axi_porthalt(fs->bus_port0); - if (rc) { - pr_err("%s port 0 halt failed.\n", fs->desc.name); - goto err; - } - } - if (fs->bus_port1) { - rc = msm_bus_axi_porthalt(fs->bus_port1); - if (rc) { - pr_err("%s port 1 halt failed.\n", fs->desc.name); - goto err_port2_halt; - } - } - - /* - * Assert resets for all clocks in the clock domain so that - * outputs settle prior to clamping. - */ - for (clock = fs->clk_data; clock->clk; clock++) - ; /* Do nothing */ - for (clock--; clock >= fs->clk_data; clock--) - clk_reset(clock->clk, CLK_RESET_ASSERT); - /* Wait for synchronous resets to propagate. */ - udelay(fs->reset_delay_us); - - /* - * Return clocks to their state before this function. For robustness - * if memory-retention across collapses is required, clocks should - * be disabled before asserting the clamps. Assuming clocks were off - * before entering footswitch_disable(), this will be true. - */ - restore_clocks(fs); - - /* - * Clamp the I/O ports of the core to ensure the values - * remain fixed while the core is collapsed. - */ - regval |= CLAMP_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Collapse the power rail at the footswitch. */ - regval &= ~ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - fs->is_enabled = false; - return 0; - -err_port2_halt: - msm_bus_axi_portunhalt(fs->bus_port0); -err: - clk_set_flags(fs->core_clk, CLKFLAG_RETAIN_MEM); - restore_clocks(fs); - return rc; -} - -static int gfx2d_footswitch_enable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - mutex_lock(&claim_lock); - fs->is_claimed = true; - mutex_unlock(&claim_lock); - - /* Return early if already enabled. */ - regval = readl_relaxed(fs->gfs_ctl_reg); - if ((regval & (ENABLE_BIT | CLAMP_BIT)) == ENABLE_BIT) - return 0; - - /* Make sure required clocks are on at the correct rates. */ - rc = setup_clocks(fs); - if (rc) - return rc; - - /* Un-halt all bus ports in the power domain. */ - if (fs->bus_port0) { - rc = msm_bus_axi_portunhalt(fs->bus_port0); - if (rc) { - pr_err("%s port 0 unhalt failed.\n", fs->desc.name); - goto err; - } - } - - /* Disable core clock. */ - clk_disable_unprepare(fs->core_clk); - - /* - * (Re-)Assert resets for all clocks in the clock domain, since - * footswitch_enable() is first called before footswitch_disable() - * and resets should be asserted before power is restored. - */ - for (clock = fs->clk_data; clock->clk; clock++) - ; /* Do nothing */ - for (clock--; clock >= fs->clk_data; clock--) - clk_reset(clock->clk, CLK_RESET_ASSERT); - /* Wait for synchronous resets to propagate. */ - udelay(fs->reset_delay_us); - - /* Enable the power rail at the footswitch. */ - regval |= ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - mb(); - udelay(1); - - /* Un-clamp the I/O ports. */ - regval &= ~CLAMP_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Deassert resets for all clocks in the power domain. */ - for (clock = fs->clk_data; clock->clk; clock++) - clk_reset(clock->clk, CLK_RESET_DEASSERT); - udelay(fs->reset_delay_us); - - /* Re-enable core clock. */ - clk_prepare_enable(fs->core_clk); - - /* Prevent core memory from collapsing when its clock is gated. */ - clk_set_flags(fs->core_clk, CLKFLAG_RETAIN_MEM); - - /* Return clocks to their state before this function. */ - restore_clocks(fs); - - fs->is_enabled = true; - return 0; - -err: - restore_clocks(fs); - return rc; -} - -static int gfx2d_footswitch_disable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - /* Return early if already disabled. */ - regval = readl_relaxed(fs->gfs_ctl_reg); - if ((regval & ENABLE_BIT) == 0) - return 0; - - /* Make sure required clocks are on at the correct rates. */ - rc = setup_clocks(fs); - if (rc) - return rc; - - /* Allow core memory to collapse when its clock is gated. */ - clk_set_flags(fs->core_clk, CLKFLAG_NORETAIN_MEM); - - /* Halt all bus ports in the power domain. */ - if (fs->bus_port0) { - rc = msm_bus_axi_porthalt(fs->bus_port0); - if (rc) { - pr_err("%s port 0 halt failed.\n", fs->desc.name); - goto err; - } - } - - /* Disable core clock. */ - clk_disable_unprepare(fs->core_clk); - - /* - * Assert resets for all clocks in the clock domain so that - * outputs settle prior to clamping. - */ - for (clock = fs->clk_data; clock->clk; clock++) - ; /* Do nothing */ - for (clock--; clock >= fs->clk_data; clock--) - clk_reset(clock->clk, CLK_RESET_ASSERT); - /* Wait for synchronous resets to propagate. */ - udelay(5); - - /* - * Clamp the I/O ports of the core to ensure the values - * remain fixed while the core is collapsed. - */ - regval |= CLAMP_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Collapse the power rail at the footswitch. */ - regval &= ~ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Re-enable core clock. */ - clk_prepare_enable(fs->core_clk); - - /* Return clocks to their state before this function. */ - restore_clocks(fs); - - fs->is_enabled = false; - return 0; - -err: - clk_set_flags(fs->core_clk, CLKFLAG_RETAIN_MEM); - restore_clocks(fs); - return rc; -} - -static void force_bus_clocks(bool enforce) -{ - static struct msm_rpm_iv_pair iv; - int ret; - - if (enforce) { - iv.id = MSM_RPM_STATUS_ID_RPM_CTL; - ret = msm_rpm_get_status(&iv, 1); - if (ret) - pr_err("Failed to read RPM_CTL resource status\n"); - - iv.id = MSM_RPM_ID_RPM_CTL; - iv.value |= BIT(6); - } else { - iv.id = MSM_RPM_ID_RPM_CTL; - iv.value &= ~BIT(6); - } - - ret = msm_rpmrs_set(MSM_RPM_CTX_SET_0, &iv, 1); - if (ret) - pr_err("Force bus clocks request=%d failed\n", enforce); -} - -static int gfx3d_8064_footswitch_enable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - mutex_lock(&claim_lock); - fs->is_claimed = true; - mutex_unlock(&claim_lock); - - /* Return early if already enabled. */ - regval = readl_relaxed(fs->gfs_ctl_reg); - if ((regval & (ENABLE_BIT | CLAMP_BIT)) == ENABLE_BIT) - return 0; - - /* Un-halt all bus ports in the power domain. */ - if (fs->bus_port0) { - rc = msm_bus_axi_portunhalt(fs->bus_port0); - if (rc) { - pr_err("%s port 0 unhalt failed.\n", fs->desc.name); - goto err; - } - } - if (fs->bus_port1) { - rc = msm_bus_axi_portunhalt(fs->bus_port1); - if (rc) { - pr_err("%s port 1 unhalt failed.\n", fs->desc.name); - goto err_port2_halt; - } - } - - /* Apply AFAB/EBI clock limits. */ - force_bus_clocks(true); - - /* Enable the power rail at the footswitch. */ - regval |= ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - /* Wait for the rail to fully charge. */ - mb(); - udelay(1); - - /* Make sure required clocks are on at the correct rates. */ - rc = setup_clocks(fs); - if (rc) - goto err_setup_clocks; - - /* - * (Re-)Assert resets for all clocks in the clock domain, since - * footswitch_enable() is first called before footswitch_disable() - * and resets should be asserted before power is restored. - */ - for (clock = fs->clk_data; clock->clk; clock++) - ; /* Do nothing */ - for (clock--; clock >= fs->clk_data; clock--) - clk_reset(clock->clk, CLK_RESET_ASSERT); - /* Wait for synchronous resets to propagate. */ - udelay(fs->reset_delay_us); - - /* Un-clamp the I/O ports. */ - regval &= ~CLAMP_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - /* Deassert resets for all clocks in the power domain. */ - for (clock = fs->clk_data; clock->clk; clock++) - clk_reset(clock->clk, CLK_RESET_DEASSERT); - - /* Prevent core memory from collapsing when its clock is gated. */ - clk_set_flags(fs->core_clk, CLKFLAG_RETAIN_MEM); - - /* Return clocks to their state before this function. */ - restore_clocks(fs); - - /* Remove AFAB/EBI clock limits after any transients have settled. */ - udelay(30); - force_bus_clocks(false); - - fs->is_enabled = true; - return 0; - -err_setup_clocks: - regval &= ~ENABLE_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - force_bus_clocks(false); - msm_bus_axi_porthalt(fs->bus_port1); -err_port2_halt: - msm_bus_axi_porthalt(fs->bus_port0); -err: - return rc; -} - - -static struct regulator_ops standard_fs_ops = { - .is_enabled = footswitch_is_enabled, - .enable = footswitch_enable, - .disable = footswitch_disable, -}; - -static struct regulator_ops gfx2d_fs_ops = { - .is_enabled = footswitch_is_enabled, - .enable = gfx2d_footswitch_enable, - .disable = gfx2d_footswitch_disable, -}; - -static struct regulator_ops gfx3d_8064_fs_ops = { - .is_enabled = footswitch_is_enabled, - .enable = gfx3d_8064_footswitch_enable, - .disable = footswitch_disable, -}; - -#define FOOTSWITCH(_id, _name, _ops, _gfs_ctl_reg) \ - [(_id)] = { \ - .desc = { \ - .id = (_id), \ - .name = (_name), \ - .ops = (_ops), \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - }, \ - .gfs_ctl_reg = (_gfs_ctl_reg), \ - } -static struct footswitch footswitches[] = { - FOOTSWITCH(FS_GFX2D0, "fs_gfx2d0", &gfx2d_fs_ops, GFX2D0_GFS_CTL_REG), - FOOTSWITCH(FS_GFX2D1, "fs_gfx2d1", &gfx2d_fs_ops, GFX2D1_GFS_CTL_REG), - FOOTSWITCH(FS_GFX3D_8064, "fs_gfx3d", &gfx3d_8064_fs_ops, - GFX3D_GFS_CTL_REG), - FOOTSWITCH(FS_GFX3D, "fs_gfx3d", &standard_fs_ops, GFX3D_GFS_CTL_REG), - FOOTSWITCH(FS_IJPEG, "fs_ijpeg", &standard_fs_ops, GEMINI_GFS_CTL_REG), - FOOTSWITCH(FS_MDP, "fs_mdp", &standard_fs_ops, MDP_GFS_CTL_REG), - FOOTSWITCH(FS_ROT, "fs_rot", &standard_fs_ops, ROT_GFS_CTL_REG), - FOOTSWITCH(FS_VED, "fs_ved", &standard_fs_ops, VED_GFS_CTL_REG), - FOOTSWITCH(FS_VFE, "fs_vfe", &standard_fs_ops, VFE_GFS_CTL_REG), - FOOTSWITCH(FS_VPE, "fs_vpe", &standard_fs_ops, VPE_GFS_CTL_REG), - FOOTSWITCH(FS_VCAP, "fs_vcap", &standard_fs_ops, VCAP_GFS_CTL_REG), -}; - -static int footswitch_probe(struct platform_device *pdev) -{ - struct footswitch *fs; - struct regulator_config reg_config = {}; - struct regulator_init_data *init_data; - struct fs_driver_data *driver_data; - struct fs_clk_data *clock; - uint32_t regval, rc = 0; - - if (pdev == NULL) - return -EINVAL; - - if (pdev->id >= MAX_FS) - return -ENODEV; - - init_data = pdev->dev.platform_data; - driver_data = init_data->driver_data; - fs = &footswitches[pdev->id]; - fs->clk_data = driver_data->clks; - fs->bus_port0 = driver_data->bus_port0; - fs->bus_port1 = driver_data->bus_port1; - fs->reset_delay_us = - driver_data->reset_delay_us ? : DEFAULT_RESET_DELAY_US; - - for (clock = fs->clk_data; clock->name; clock++) { - clock->clk = clk_get(&pdev->dev, clock->name); - if (IS_ERR(clock->clk)) { - rc = PTR_ERR(clock->clk); - pr_err("%s clk_get(%s) failed\n", fs->desc.name, - clock->name); - goto err; - } - if (!strncmp(clock->name, "core_clk", 8)) - fs->core_clk = clock->clk; - } - - /* - * Set number of AHB_CLK cycles to delay the assertion of gfs_en_all - * after enabling the footswitch. Also ensure the retention bit is - * clear so disabling the footswitch will power-collapse the core. - */ - regval = readl_relaxed(fs->gfs_ctl_reg); - regval |= GFS_DELAY_CNT; - regval &= ~RETENTION_BIT; - writel_relaxed(regval, fs->gfs_ctl_reg); - - reg_config.dev = &pdev->dev; - reg_config.init_data = init_data; - reg_config.driver_data = fs; - fs->rdev = regulator_register(&fs->desc, ®_config); - if (IS_ERR(footswitches[pdev->id].rdev)) { - pr_err("regulator_register(\"%s\") failed\n", - fs->desc.name); - rc = PTR_ERR(footswitches[pdev->id].rdev); - goto err; - } - - return 0; - -err: - for (clock = fs->clk_data; clock->clk; clock++) - clk_put(clock->clk); - - return rc; -} - -static int footswitch_remove(struct platform_device *pdev) -{ - struct footswitch *fs = &footswitches[pdev->id]; - struct fs_clk_data *clock; - - for (clock = fs->clk_data; clock->clk; clock++) - clk_put(clock->clk); - regulator_unregister(fs->rdev); - - return 0; -} - -static struct platform_driver footswitch_driver = { - .probe = footswitch_probe, - .remove = footswitch_remove, - .driver = { - .name = "footswitch-8x60", - .owner = THIS_MODULE, - }, -}; - -static int __init late_footswitch_init(void) -{ - int i; - - mutex_lock(&claim_lock); - /* Turn off all registered but unused footswitches. */ - for (i = 0; i < ARRAY_SIZE(footswitches); i++) - if (footswitches[i].rdev && !footswitches[i].is_claimed) - footswitches[i].rdev->desc->ops-> - disable(footswitches[i].rdev); - mutex_unlock(&claim_lock); - - return 0; -} -late_initcall(late_footswitch_init); - -static int __init footswitch_init(void) -{ - return platform_driver_register(&footswitch_driver); -} -subsys_initcall(footswitch_init); - -static void __exit footswitch_exit(void) -{ - platform_driver_unregister(&footswitch_driver); -} -module_exit(footswitch_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MSM8x60 rail footswitch"); -MODULE_ALIAS("platform:footswitch-msm8x60"); diff --git a/arch/arm/mach-msm/footswitch-pcom.c b/arch/arm/mach-msm/footswitch-pcom.c deleted file mode 100644 index 20cca62017b8..000000000000 --- a/arch/arm/mach-msm/footswitch-pcom.c +++ /dev/null @@ -1,325 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "footswitch.h" - -/* PCOM power rail IDs */ -#define PCOM_FS_GRP 8 -#define PCOM_FS_GRP_2D 58 -#define PCOM_FS_MDP 14 -#define PCOM_FS_MFC 68 -#define PCOM_FS_ROTATOR 90 -#define PCOM_FS_VFE 41 -#define PCOM_FS_VPE 76 - -#define PCOM_RAIL_MODE_AUTO 0 -#define PCOM_RAIL_MODE_MANUAL 1 - -/** - * struct footswitch - Per-footswitch data and state - * @rdev: Regulator framework device - * @desc: Regulator descriptor - * @init_data: Regulator platform data - * @pcom_id: Proc-comm ID of the footswitch - * @is_enabled: Flag set when footswitch is enabled - * @has_ahb_clk: Flag set if footswitched core has an ahb_clk - * @has_src_clk: Flag set if footswitched core has a src_clk - * @src_clk: Controls the core clock's rate - * @core_clk: Clocks the core - * @ahb_clk: Clocks the core's register interface - * @src_clk_init_rate: Rate to use for src_clk if it has not been set yet - * @is_rate_set: Flag set if core_clk's rate has been set - */ -struct footswitch { - struct regulator_dev *rdev; - struct regulator_desc desc; - struct regulator_init_data init_data; - unsigned pcom_id; - bool is_enabled; - struct clk *src_clk; - struct clk *core_clk; - struct clk *ahb_clk; - const bool has_ahb_clk; - const bool has_src_clk; - const int src_clk_init_rate; - bool is_rate_set; -}; - -static inline int set_rail_mode(int pcom_id, int mode) -{ - int rc; - - rc = msm_proc_comm(PCOM_CLKCTL_RPC_RAIL_CONTROL, &pcom_id, &mode); - if (!rc && pcom_id) - rc = -EINVAL; - - return rc; -} - -static inline int set_rail_state(int pcom_id, int state) -{ - int rc; - - rc = msm_proc_comm(state, &pcom_id, NULL); - if (!rc && pcom_id) - rc = -EINVAL; - - return rc; -} - -static int enable_clocks(struct footswitch *fs) -{ - fs->is_rate_set = !!(clk_get_rate(fs->src_clk)); - if (!fs->is_rate_set) - clk_set_rate(fs->src_clk, fs->src_clk_init_rate); - clk_prepare_enable(fs->core_clk); - - if (fs->ahb_clk) - clk_prepare_enable(fs->ahb_clk); - - return 0; -} - -static void disable_clocks(struct footswitch *fs) -{ - if (fs->ahb_clk) - clk_disable_unprepare(fs->ahb_clk); - clk_disable_unprepare(fs->core_clk); -} - -static int footswitch_is_enabled(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - - return fs->is_enabled; -} - -static int footswitch_enable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - int rc; - - rc = enable_clocks(fs); - if (rc) - return rc; - - rc = set_rail_state(fs->pcom_id, PCOM_CLKCTL_RPC_RAIL_ENABLE); - if (!rc) - fs->is_enabled = true; - - disable_clocks(fs); - - return rc; -} - -static int footswitch_disable(struct regulator_dev *rdev) -{ - struct footswitch *fs = rdev_get_drvdata(rdev); - int rc; - - rc = enable_clocks(fs); - if (rc) - return rc; - - rc = set_rail_state(fs->pcom_id, PCOM_CLKCTL_RPC_RAIL_DISABLE); - if (!rc) - fs->is_enabled = false; - - disable_clocks(fs); - - return rc; -} - -static struct regulator_ops footswitch_ops = { - .is_enabled = footswitch_is_enabled, - .enable = footswitch_enable, - .disable = footswitch_disable, -}; - -#define FOOTSWITCH(_id, _pcom_id, _name, _src_clk, _rate, _ahb_clk) \ - [_id] = { \ - .desc = { \ - .id = _id, \ - .name = _name, \ - .ops = &footswitch_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - }, \ - .pcom_id = _pcom_id, \ - .has_src_clk = _src_clk, \ - .src_clk_init_rate = _rate, \ - .has_ahb_clk = _ahb_clk, \ - } -static struct footswitch footswitches[] = { - FOOTSWITCH(FS_GFX3D, PCOM_FS_GRP, - "fs_gfx3d", true, 24576000, true), - FOOTSWITCH(FS_GFX2D0, PCOM_FS_GRP_2D, - "fs_gfx2d0", false, 24576000, true), - FOOTSWITCH(FS_MDP, PCOM_FS_MDP, - "fs_mdp", false, 24576000, true), - FOOTSWITCH(FS_MFC, PCOM_FS_MFC, - "fs_mfc", false, 24576000, true), - FOOTSWITCH(FS_ROT, PCOM_FS_ROTATOR, - "fs_rot", false, 0, true), - FOOTSWITCH(FS_VFE, PCOM_FS_VFE, - "fs_vfe", false, 24576000, true), - FOOTSWITCH(FS_VPE, PCOM_FS_VPE, - "fs_vpe", false, 24576000, false), -}; - -static int get_clocks(struct device *dev, struct footswitch *fs) -{ - int rc; - - /* - * Some SoCs may not have a separate rate-settable clock. - * If one can't be found, try to use the core clock for - * rate-setting instead. - */ - if (fs->has_src_clk) { - fs->src_clk = clk_get(dev, "src_clk"); - if (IS_ERR(fs->src_clk)) - fs->src_clk = clk_get(dev, "core_clk"); - } else { - fs->src_clk = clk_get(dev, "core_clk"); - } - if (IS_ERR(fs->src_clk)) { - pr_err("%s clk_get(src_clk) failed\n", fs->desc.name); - rc = PTR_ERR(fs->src_clk); - goto err_src_clk; - } - - fs->core_clk = clk_get(dev, "core_clk"); - if (IS_ERR(fs->core_clk)) { - pr_err("%s clk_get(core_clk) failed\n", fs->desc.name); - rc = PTR_ERR(fs->core_clk); - goto err_core_clk; - } - - if (fs->has_ahb_clk) { - fs->ahb_clk = clk_get(dev, "iface_clk"); - if (IS_ERR(fs->ahb_clk)) { - pr_err("%s clk_get(iface_clk) failed\n", fs->desc.name); - rc = PTR_ERR(fs->ahb_clk); - goto err_ahb_clk; - } - } - - return 0; - -err_ahb_clk: - clk_put(fs->core_clk); -err_core_clk: - clk_put(fs->src_clk); -err_src_clk: - return rc; -} - -static void put_clocks(struct footswitch *fs) -{ - clk_put(fs->src_clk); - clk_put(fs->core_clk); - clk_put(fs->ahb_clk); -} - -static int footswitch_probe(struct platform_device *pdev) -{ - struct footswitch *fs; - struct regulator_init_data *init_data; - int rc; - - if (pdev == NULL) - return -EINVAL; - - if (pdev->id >= MAX_FS) - return -ENODEV; - - init_data = pdev->dev.platform_data; - fs = &footswitches[pdev->id]; - - /* - * Enable footswitch in manual mode (ie. not controlled along - * with pcom clocks). - */ - rc = set_rail_state(fs->pcom_id, PCOM_CLKCTL_RPC_RAIL_ENABLE); - if (rc) - return rc; - rc = set_rail_mode(fs->pcom_id, PCOM_RAIL_MODE_MANUAL); - if (rc) - return rc; - - rc = get_clocks(&pdev->dev, fs); - if (rc) - return rc; - - fs->rdev = regulator_register(&fs->desc, &pdev->dev, - init_data, fs, NULL); - if (IS_ERR(fs->rdev)) { - pr_err("regulator_register(%s) failed\n", fs->desc.name); - rc = PTR_ERR(fs->rdev); - goto err_register; - } - - return 0; - -err_register: - put_clocks(fs); - - return rc; -} - -static int footswitch_remove(struct platform_device *pdev) -{ - struct footswitch *fs = &footswitches[pdev->id]; - - regulator_unregister(fs->rdev); - set_rail_mode(fs->pcom_id, PCOM_RAIL_MODE_AUTO); - put_clocks(fs); - - return 0; -} - -static struct platform_driver footswitch_driver = { - .probe = footswitch_probe, - .remove = footswitch_remove, - .driver = { - .name = "footswitch-pcom", - .owner = THIS_MODULE, - }, -}; - -static int __init footswitch_init(void) -{ - return platform_driver_register(&footswitch_driver); -} -subsys_initcall(footswitch_init); - -static void __exit footswitch_exit(void) -{ - platform_driver_unregister(&footswitch_driver); -} -module_exit(footswitch_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("proc_comm rail footswitch"); -MODULE_ALIAS("platform:footswitch-pcom"); diff --git a/arch/arm/mach-msm/footswitch.h b/arch/arm/mach-msm/footswitch.h deleted file mode 100644 index b961f42cf7d7..000000000000 --- a/arch/arm/mach-msm/footswitch.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2010-2013 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __MSM_FOOTSWITCH__ -#define __MSM_FOOTSWITCH__ - -#include - -/* Device IDs */ -#define FS_GFX2D0 0 -#define FS_GFX2D1 1 -#define FS_GFX3D 2 -#define FS_IJPEG 3 -#define FS_MDP 4 -#define FS_MFC 5 -#define FS_ROT 6 -#define FS_VED 7 -#define FS_VFE 8 -#define FS_VPE 9 -#define FS_VCAP 10 -#define FS_GFX3D_8064 11 -#define MAX_FS 12 - -struct fs_clk_data { - const char *name; - struct clk *clk; - unsigned long rate; - unsigned long reset_rate; - bool enabled; -}; - -struct fs_driver_data { - int bus_port0, bus_port1; - struct fs_clk_data *clks; - unsigned long reset_delay_us; -}; - -#define FS_GENERIC(_drv_name, _id, _name, _dev_id, _data) \ -(&(struct platform_device){ \ - .name = (_drv_name), \ - .id = (_id), \ - .dev = { \ - .platform_data = &(struct regulator_init_data){ \ - .constraints = { \ - .valid_modes_mask = REGULATOR_MODE_NORMAL, \ - .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ - }, \ - .num_consumer_supplies = 1, \ - .consumer_supplies = \ - &(struct regulator_consumer_supply) \ - REGULATOR_SUPPLY((_name), (_dev_id)), \ - .driver_data = (_data), \ - } \ - }, \ -}) -#define FS_PCOM(_id, _name, _dev_id) \ - FS_GENERIC("footswitch-pcom", _id, _name, _dev_id, NULL) -#define FS_8X60(_id, _name, _dev_id, _data) \ - FS_GENERIC("footswitch-8x60", _id, _name, _dev_id, _data) - -#endif diff --git a/arch/arm/mach-msm/gpiomux-7x27.c b/arch/arm/mach-msm/gpiomux-7x27.c deleted file mode 100644 index 010c94d21598..000000000000 --- a/arch/arm/mach-msm/gpiomux-7x27.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include - -static int __init gpiomux_init(void) -{ - return msm_gpiomux_init(NR_GPIO_IRQS); -} -postcore_initcall(gpiomux_init); diff --git a/arch/arm/mach-msm/gpiomux-7x30.c b/arch/arm/mach-msm/gpiomux-7x30.c deleted file mode 100644 index 010c94d21598..000000000000 --- a/arch/arm/mach-msm/gpiomux-7x30.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include - -static int __init gpiomux_init(void) -{ - return msm_gpiomux_init(NR_GPIO_IRQS); -} -postcore_initcall(gpiomux_init); diff --git a/arch/arm/mach-msm/gpiomux-8x50.c b/arch/arm/mach-msm/gpiomux-8x50.c deleted file mode 100644 index 010c94d21598..000000000000 --- a/arch/arm/mach-msm/gpiomux-8x50.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include - -static int __init gpiomux_init(void) -{ - return msm_gpiomux_init(NR_GPIO_IRQS); -} -postcore_initcall(gpiomux_init); diff --git a/arch/arm/mach-msm/gpiomux-8x60.c b/arch/arm/mach-msm/gpiomux-8x60.c deleted file mode 100644 index 4b0b8f14e5a0..000000000000 --- a/arch/arm/mach-msm/gpiomux-8x60.c +++ /dev/null @@ -1,1731 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include "gpiomux-8x60.h" - -static struct gpiomux_setting console_uart = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -/* The SPI configurations apply to GSBI1 and GSBI10 */ -static struct gpiomux_setting spi_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting spi_suspended_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting spi_suspended_cs_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -/* This I2C active configuration applies to GSBI3 and GSBI4 */ -static struct gpiomux_setting i2c_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting i2c_active_gsbi7 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -/* This I2C suspended configuration applies to GSBI3, GSBI4 and GSBI7 */ -static struct gpiomux_setting i2c_suspended_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting gsbi8 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting ps_hold = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_12MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting msm_snddev_active_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting msm_snddev_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ebi2_a_d = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ebi2_oe = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ebi2_we = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ebi2_cs2 = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ebi2_cs3 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) -static struct gpiomux_setting ebi2_cs4 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; -#endif - -static struct gpiomux_setting ebi2_adv = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) -static struct gpiomux_setting usb_isp1763_actv_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting usb_isp1763_susp_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; -#endif - -static struct gpiomux_setting sdcc1_dat_0_3_cmd_actv_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc1_dat_4_7_cmd_actv_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc1_clk_actv_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc1_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_dat_0_3_cmd_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_dat_4_7_cmd_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc2_clk_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc2_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc5_dat_0_3_cmd_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_10MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting sdcc5_clk_actv_cfg = { - .func = GPIOMUX_FUNC_2, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting sdcc5_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting aux_pcm_active_config = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting aux_pcm_suspend_config = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting uart1dm_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting uart1dm_suspended = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mi2s_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mi2s_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting lcdc_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting lcdc_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdp_vsync_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting hdmi_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_status_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_status_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cam_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_sync_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_sync_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting tm_active = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting tm_suspended = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting tma_active = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_6MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting ts_suspended = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdp_vsync_active_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting hdmi_active_1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting hdmi_active_2_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting hdmi_active_3_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting pmic_suspended_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cam_active_1_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cam_active_2_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting cam_active_3_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting cam_active_4_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting cam_active_5_cfg = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_4MA, - .pull = GPIOMUX_PULL_NONE, -}; - -#ifdef CONFIG_MSM_GSBI9_UART -static struct gpiomux_setting uart9dm_active = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA , - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting gsbi9 = { - .func = GPIOMUX_FUNC_1, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; -#endif - -static struct gpiomux_setting ap2mdm_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_status_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_vfr_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_UP, -}; - -static struct gpiomux_setting mdm2ap_vfr_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting mdm2ap_errfatal_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_16MA, - .pull = GPIOMUX_PULL_DOWN, -}; - -static struct gpiomux_setting ap2mdm_kpdpwr_n_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_8MA, - .pull = GPIOMUX_PULL_NONE, -}; - - -static struct gpiomux_setting mdm2ap_vddmin_active_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct gpiomux_setting mdm2ap_vddmin_suspend_cfg = { - .func = GPIOMUX_FUNC_GPIO, - .drv = GPIOMUX_DRV_2MA, - .pull = GPIOMUX_PULL_NONE, -}; - -static struct msm_gpiomux_config msm8x60_gsbi_configs[] __initdata = { - { - .gpio = 33, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 34, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 35, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_cs_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 36, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 43, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active, - }, - }, - { - .gpio = 44, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active, - }, - }, - { - .gpio = 47, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active, - }, - }, - { - .gpio = 48, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active, - }, - }, - { - .gpio = 59, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active_gsbi7, - }, - }, - { - .gpio = 60, - .settings = { - [GPIOMUX_SUSPENDED] = &i2c_suspended_config, - [GPIOMUX_ACTIVE] = &i2c_active_gsbi7, - }, - }, - { - .gpio = 64, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8, - }, - }, - { - .gpio = 65, - .settings = { - [GPIOMUX_SUSPENDED] = &gsbi8, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_fluid_gsbi_configs[] __initdata = { - { - .gpio = 70, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 72, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_cs_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, - { - .gpio = 73, - .settings = { - [GPIOMUX_SUSPENDED] = &spi_suspended_config, - [GPIOMUX_ACTIVE] = &spi_active, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_ebi2_configs[] __initdata = { - { - .gpio = 40, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_cs2, - }, - }, - { - .gpio = 123, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 124, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 125, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 126, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 127, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 128, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 129, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 130, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - /* ISP VDD_3V3_EN */ - { - .gpio = 132, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_cs4, - }, - }, -#endif - { - .gpio = 133, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_cs3, - }, - }, - { - .gpio = 135, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 136, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 137, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 138, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 139, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 140, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 141, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 142, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 143, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 144, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 145, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 146, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 147, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 148, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 149, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 150, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_a_d, - }, - }, - { - .gpio = 151, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_oe, - }, - }, - { - .gpio = 153, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_adv, - }, - }, - { - .gpio = 157, - .settings = { - [GPIOMUX_SUSPENDED] = &ebi2_we, - }, - }, -}; - -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) -static struct msm_gpiomux_config msm8x60_isp_usb_configs[] __initdata = { - { - .gpio = 117, - .settings = { - [GPIOMUX_ACTIVE] = &usb_isp1763_actv_cfg, - [GPIOMUX_SUSPENDED] = &usb_isp1763_susp_cfg, - }, - }, - { - .gpio = 152, - .settings = { - [GPIOMUX_ACTIVE] = &usb_isp1763_actv_cfg, - [GPIOMUX_SUSPENDED] = &usb_isp1763_susp_cfg, - }, - }, - -}; -#endif - -static struct msm_gpiomux_config msm8x60_uart_configs[] __initdata = { - { /* UARTDM_TX */ - .gpio = 53, - .settings = { - [GPIOMUX_ACTIVE] = &uart1dm_active, - [GPIOMUX_SUSPENDED] = &uart1dm_suspended, - }, - }, - { /* UARTDM_RX */ - .gpio = 54, - .settings = { - [GPIOMUX_ACTIVE] = &uart1dm_active, - [GPIOMUX_SUSPENDED] = &uart1dm_suspended, - }, - }, - { /* UARTDM_CTS */ - .gpio = 55, - .settings = { - [GPIOMUX_ACTIVE] = &uart1dm_active, - [GPIOMUX_SUSPENDED] = &uart1dm_suspended, - }, - }, - { /* UARTDM_RFR */ - .gpio = 56, - .settings = { - [GPIOMUX_ACTIVE] = &uart1dm_active, - [GPIOMUX_SUSPENDED] = &uart1dm_suspended, - }, - }, - { - .gpio = 115, - .settings = { - [GPIOMUX_SUSPENDED] = &console_uart, - }, - }, - { - .gpio = 116, - .settings = { - [GPIOMUX_SUSPENDED] = &console_uart, - }, - }, -#if !defined(CONFIG_USB_PEHCI_HCD) && !defined(CONFIG_USB_PEHCI_HCD_MODULE) - /* USB ISP1763 may also use 117 GPIO */ - { - .gpio = 117, - .settings = { - [GPIOMUX_SUSPENDED] = &console_uart, - }, - }, -#endif - { - .gpio = 118, - .settings = { - [GPIOMUX_SUSPENDED] = &console_uart, - }, - }, -}; - -#ifdef CONFIG_MSM_GSBI9_UART -static struct msm_gpiomux_config msm8x60_charm_uart_configs[] __initdata = { - { /* UART9DM RX */ - .gpio = 66, - .settings = { - [GPIOMUX_ACTIVE] = &uart9dm_active, - [GPIOMUX_SUSPENDED] = &gsbi9, - }, - }, - { /* UART9DM TX */ - .gpio = 67, - .settings = { - [GPIOMUX_ACTIVE] = &uart9dm_active, - [GPIOMUX_SUSPENDED] = &gsbi9, - }, - }, -}; -#endif - -static struct msm_gpiomux_config msm8x60_ts_configs[] __initdata = { - { - /* TS_ATTN */ - .gpio = 58, - .settings = { - [GPIOMUX_SUSPENDED] = &ts_suspended, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_tmg200_configs[] __initdata = { - { - .gpio = 61, - .settings = { - [GPIOMUX_ACTIVE] = &tm_active, - [GPIOMUX_SUSPENDED] = &tm_suspended, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_tma300_configs[] __initdata = { - { - .gpio = 61, - .settings = { - [GPIOMUX_ACTIVE] = &tma_active, - [GPIOMUX_SUSPENDED] = &tm_suspended, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_aux_pcm_configs[] __initdata = { - { - .gpio = 111, - .settings = { - [GPIOMUX_ACTIVE] = &aux_pcm_active_config, - [GPIOMUX_SUSPENDED] = &aux_pcm_suspend_config, - }, - }, - { - .gpio = 112, - .settings = { - [GPIOMUX_ACTIVE] = &aux_pcm_active_config, - [GPIOMUX_SUSPENDED] = &aux_pcm_suspend_config, - }, - }, - { - .gpio = 113, - .settings = { - [GPIOMUX_ACTIVE] = &aux_pcm_active_config, - [GPIOMUX_SUSPENDED] = &aux_pcm_suspend_config, - }, - }, - { - .gpio = 114, - .settings = { - [GPIOMUX_ACTIVE] = &aux_pcm_active_config, - [GPIOMUX_SUSPENDED] = &aux_pcm_suspend_config, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_sdc_configs[] __initdata = { - /* SDCC1 data[0] */ - { - .gpio = 159, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[1] */ - { - .gpio = 160, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[2] */ - { - .gpio = 161, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[3] */ - { - .gpio = 162, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[4] */ - { - .gpio = 163, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[5] */ - { - .gpio = 164, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[6] */ - { - .gpio = 165, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 data[7] */ - { - .gpio = 166, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 CLK */ - { - .gpio = 167, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, - /* SDCC1 CMD */ - { - .gpio = 168, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc1_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc1_suspend_config, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_charm_sdc_configs[] __initdata = { - /* SDCC5 cmd */ - { - .gpio = 95, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* SDCC5 data[3]*/ - { - .gpio = 96, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* SDCC5 clk */ - { - .gpio = 97, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* SDCC5 data[2]*/ - { - .gpio = 98, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* SDCC5 data[1]*/ - { - .gpio = 99, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* SDCC5 data[0]*/ - { - .gpio = 100, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc5_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc5_suspend_config, - }, - }, - /* MDM2AP_SYNC */ - { - .gpio = 129, - .settings = { - [GPIOMUX_ACTIVE] = &mdm2ap_sync_active_cfg, - [GPIOMUX_SUSPENDED] = &mdm2ap_sync_suspend_cfg, - }, - }, - - /* MDM2AP_VDDMIN */ - { - .gpio = 140, - .settings = { - [GPIOMUX_ACTIVE] = &mdm2ap_vddmin_active_cfg, - [GPIOMUX_SUSPENDED] = &mdm2ap_vddmin_suspend_cfg, - }, - }, - /* SDCC2 data[0] */ - { - .gpio = 143, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[1] */ - { - .gpio = 144, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[2] */ - { - .gpio = 145, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[3] */ - { - .gpio = 146, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[4] */ - { - .gpio = 147, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[5] */ - { - .gpio = 148, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[6] */ - { - .gpio = 149, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 data[7] */ - { - .gpio = 150, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_4_7_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - /* SDCC2 CMD */ - { - .gpio = 151, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_dat_0_3_cmd_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, - - /* SDCC2 CLK */ - { - .gpio = 152, - .settings = { - [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg, - [GPIOMUX_SUSPENDED] = &sdcc2_suspend_config, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_snd_configs[] __initdata = { - { - .gpio = 108, - .settings = { - [GPIOMUX_ACTIVE] = &msm_snddev_active_config, - [GPIOMUX_SUSPENDED] = &msm_snddev_suspend_config, - }, - }, - { - .gpio = 109, - .settings = { - [GPIOMUX_ACTIVE] = &msm_snddev_active_config, - [GPIOMUX_SUSPENDED] = &msm_snddev_suspend_config, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_mi2s_configs[] __initdata = { - /* MI2S WS */ - { - .gpio = 101, - .settings = { - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - }, - }, - /* MI2S SCLK */ - { - .gpio = 102, - .settings = { - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - }, - }, - /* MI2S MCLK */ - { - .gpio = 103, - .settings = { - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - }, - }, - /* MI2S SD3 */ - { - .gpio = 107, - .settings = { - [GPIOMUX_ACTIVE] = &mi2s_active_cfg, - [GPIOMUX_SUSPENDED] = &mi2s_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_lcdc_configs[] __initdata = { - /* lcdc_pclk */ - { - .gpio = 0, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_hsync */ - { - .gpio = 1, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_vsync */ - { - .gpio = 2, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_den */ - { - .gpio = 3, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red7 */ - { - .gpio = 4, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red6 */ - { - .gpio = 5, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red5 */ - { - .gpio = 6, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red4 */ - { - .gpio = 7, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red3 */ - { - .gpio = 8, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red2 */ - { - .gpio = 9, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red1 */ - { - .gpio = 10, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_red0 */ - { - .gpio = 11, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn7 */ - { - .gpio = 12, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn6 */ - { - .gpio = 13, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn5 */ - { - .gpio = 14, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn4 */ - { - .gpio = 15, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn3 */ - { - .gpio = 16, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn2 */ - { - .gpio = 17, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn1 */ - { - .gpio = 18, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_grn0 */ - { - .gpio = 19, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu7 */ - { - .gpio = 20, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu6 */ - { - .gpio = 21, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu5 */ - { - .gpio = 22, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu4 */ - { - .gpio = 23, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu3 */ - { - .gpio = 24, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu2 */ - { - .gpio = 25, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu1 */ - { - .gpio = 26, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, - /* lcdc_blu0 */ - { - .gpio = 27, - .settings = { - [GPIOMUX_ACTIVE] = &lcdc_active_cfg, - [GPIOMUX_SUSPENDED] = &lcdc_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_mdp_vsync_configs[] __initdata = { - { - .gpio = 28, - .settings = { - [GPIOMUX_ACTIVE] = &mdp_vsync_active_cfg, - [GPIOMUX_SUSPENDED] = &mdp_vsync_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_hdmi_configs[] __initdata = { - { - .gpio = 169, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_1_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 170, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_2_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 171, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_2_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, - { - .gpio = 172, - .settings = { - [GPIOMUX_ACTIVE] = &hdmi_active_3_cfg, - [GPIOMUX_SUSPENDED] = &hdmi_suspend_cfg, - }, - }, -}; - -/* Because PMIC drivers do not use gpio-management routines and PMIC - * gpios must never sleep, a "good enough" config is obtained by placing - * the active config in the 'suspended' slot and leaving the active - * config invalid: the suspended config will be installed at boot - * and never replaced. - */ - -static struct msm_gpiomux_config msm8x60_pmic_configs[] __initdata = { - { - .gpio = 88, - .settings = { - [GPIOMUX_SUSPENDED] = &pmic_suspended_cfg, - }, - }, - { - .gpio = 91, - .settings = { - [GPIOMUX_SUSPENDED] = &pmic_suspended_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_common_configs[] __initdata = { - /* MDM2AP_STATUS */ - { - .gpio = 77, - .settings = { - [GPIOMUX_ACTIVE] = &mdm2ap_status_active_cfg, - [GPIOMUX_SUSPENDED] = &mdm2ap_status_suspend_cfg, - }, - }, - /* PS_HOLD */ - { - .gpio = 92, - .settings = { - [GPIOMUX_SUSPENDED] = &ps_hold, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_cam_configs[] __initdata = { - { - .gpio = 29, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_2_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 30, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_1_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 31, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_2_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 32, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_5_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 42, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_2_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 47, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_3_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 48, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_3_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 105, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_4_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, - { - .gpio = 106, - .settings = { - [GPIOMUX_ACTIVE] = &cam_active_4_cfg, - [GPIOMUX_SUSPENDED] = &cam_suspend_cfg, - }, - }, -}; - -static struct msm_gpiomux_config msm8x60_charm_configs[] __initdata = { - /* AP2MDM_WAKEUP */ - { - .gpio = 135, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_VFR */ - { - .gpio = 94, - .settings = { - [GPIOMUX_ACTIVE] = &mdm2ap_vfr_active_cfg, - [GPIOMUX_SUSPENDED] = &mdm2ap_vfr_suspend_cfg, - } - }, - /* AP2MDM_STATUS */ - { - .gpio = 136, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_STATUS */ - { - .gpio = 134, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg, - } - }, - /* MDM2AP_WAKEUP */ - { - .gpio = 40, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* MDM2AP_ERRFATAL */ - { - .gpio = 133, - .settings = { - [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg, - } - }, - /* AP2MDM_ERRFATAL */ - { - .gpio = 93, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_cfg, - } - }, - /* AP2MDM_KPDPWR_N */ - { - .gpio = 132, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - }, - /* AP2MDM_PMIC_RESET_N */ - { - .gpio = 131, - .settings = { - [GPIOMUX_SUSPENDED] = &ap2mdm_kpdpwr_n_cfg, - } - } -}; - -struct msm_gpiomux_configs -msm8x60_surf_ffa_gpiomux_cfgs[] __initdata = { - {msm8x60_gsbi_configs, ARRAY_SIZE(msm8x60_gsbi_configs)}, - {msm8x60_ebi2_configs, ARRAY_SIZE(msm8x60_ebi2_configs)}, - {msm8x60_uart_configs, ARRAY_SIZE(msm8x60_uart_configs)}, -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - {msm8x60_isp_usb_configs, ARRAY_SIZE(msm8x60_isp_usb_configs)}, -#endif - {msm8x60_ts_configs, ARRAY_SIZE(msm8x60_ts_configs)}, - {msm8x60_aux_pcm_configs, ARRAY_SIZE(msm8x60_aux_pcm_configs)}, - {msm8x60_sdc_configs, ARRAY_SIZE(msm8x60_sdc_configs)}, - {msm8x60_snd_configs, ARRAY_SIZE(msm8x60_snd_configs)}, - {msm8x60_mi2s_configs, ARRAY_SIZE(msm8x60_mi2s_configs)}, - {msm8x60_lcdc_configs, ARRAY_SIZE(msm8x60_lcdc_configs)}, - {msm8x60_mdp_vsync_configs, ARRAY_SIZE(msm8x60_mdp_vsync_configs)}, - {msm8x60_hdmi_configs, ARRAY_SIZE(msm8x60_hdmi_configs)}, - {msm8x60_pmic_configs, ARRAY_SIZE(msm8x60_pmic_configs)}, - {msm8x60_common_configs, ARRAY_SIZE(msm8x60_common_configs)}, - {msm8x60_cam_configs, ARRAY_SIZE(msm8x60_cam_configs)}, - {msm8x60_tmg200_configs, ARRAY_SIZE(msm8x60_tmg200_configs)}, - {NULL, 0}, -}; - -struct msm_gpiomux_configs -msm8x60_fluid_gpiomux_cfgs[] __initdata = { - {msm8x60_gsbi_configs, ARRAY_SIZE(msm8x60_gsbi_configs)}, - {msm8x60_fluid_gsbi_configs, ARRAY_SIZE(msm8x60_fluid_gsbi_configs)}, - {msm8x60_ebi2_configs, ARRAY_SIZE(msm8x60_ebi2_configs)}, - {msm8x60_uart_configs, ARRAY_SIZE(msm8x60_uart_configs)}, - {msm8x60_ts_configs, ARRAY_SIZE(msm8x60_ts_configs)}, - {msm8x60_aux_pcm_configs, ARRAY_SIZE(msm8x60_aux_pcm_configs)}, - {msm8x60_sdc_configs, ARRAY_SIZE(msm8x60_sdc_configs)}, - {msm8x60_snd_configs, ARRAY_SIZE(msm8x60_snd_configs)}, - {msm8x60_mi2s_configs, ARRAY_SIZE(msm8x60_mi2s_configs)}, - {msm8x60_lcdc_configs, ARRAY_SIZE(msm8x60_lcdc_configs)}, - {msm8x60_mdp_vsync_configs, ARRAY_SIZE(msm8x60_mdp_vsync_configs)}, - {msm8x60_hdmi_configs, ARRAY_SIZE(msm8x60_hdmi_configs)}, - {msm8x60_pmic_configs, ARRAY_SIZE(msm8x60_pmic_configs)}, - {msm8x60_common_configs, ARRAY_SIZE(msm8x60_common_configs)}, - {msm8x60_cam_configs, ARRAY_SIZE(msm8x60_cam_configs)}, - {msm8x60_tma300_configs, ARRAY_SIZE(msm8x60_tma300_configs)}, - {NULL, 0}, -}; - -struct msm_gpiomux_configs -msm8x60_charm_gpiomux_cfgs[] __initdata = { - {msm8x60_gsbi_configs, ARRAY_SIZE(msm8x60_gsbi_configs)}, - {msm8x60_uart_configs, ARRAY_SIZE(msm8x60_uart_configs)}, -#ifdef CONFIG_MSM_GSBI9_UART - {msm8x60_charm_uart_configs, ARRAY_SIZE(msm8x60_charm_uart_configs)}, -#endif - {msm8x60_ts_configs, ARRAY_SIZE(msm8x60_ts_configs)}, - {msm8x60_aux_pcm_configs, ARRAY_SIZE(msm8x60_aux_pcm_configs)}, - {msm8x60_sdc_configs, ARRAY_SIZE(msm8x60_sdc_configs)}, - {msm8x60_snd_configs, ARRAY_SIZE(msm8x60_snd_configs)}, - {msm8x60_mi2s_configs, ARRAY_SIZE(msm8x60_mi2s_configs)}, - {msm8x60_lcdc_configs, ARRAY_SIZE(msm8x60_lcdc_configs)}, - {msm8x60_mdp_vsync_configs, ARRAY_SIZE(msm8x60_mdp_vsync_configs)}, - {msm8x60_hdmi_configs, ARRAY_SIZE(msm8x60_hdmi_configs)}, - {msm8x60_pmic_configs, ARRAY_SIZE(msm8x60_pmic_configs)}, - {msm8x60_common_configs, ARRAY_SIZE(msm8x60_common_configs)}, - {msm8x60_cam_configs, ARRAY_SIZE(msm8x60_cam_configs)}, - {msm8x60_tmg200_configs, ARRAY_SIZE(msm8x60_tmg200_configs)}, - {msm8x60_charm_sdc_configs, ARRAY_SIZE(msm8x60_charm_sdc_configs)}, - {msm8x60_charm_configs, ARRAY_SIZE(msm8x60_charm_configs)}, - {NULL, 0}, -}; - -struct msm_gpiomux_configs -msm8x60_dragon_gpiomux_cfgs[] __initdata = { - {msm8x60_gsbi_configs, ARRAY_SIZE(msm8x60_gsbi_configs)}, - {msm8x60_ebi2_configs, ARRAY_SIZE(msm8x60_ebi2_configs)}, - {msm8x60_uart_configs, ARRAY_SIZE(msm8x60_uart_configs)}, -#if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE) - {msm8x60_isp_usb_configs, ARRAY_SIZE(msm8x60_isp_usb_configs)}, -#endif - {msm8x60_ts_configs, ARRAY_SIZE(msm8x60_ts_configs)}, - {msm8x60_aux_pcm_configs, ARRAY_SIZE(msm8x60_aux_pcm_configs)}, - {msm8x60_sdc_configs, ARRAY_SIZE(msm8x60_sdc_configs)}, - {msm8x60_snd_configs, ARRAY_SIZE(msm8x60_snd_configs)}, - {msm8x60_mi2s_configs, ARRAY_SIZE(msm8x60_mi2s_configs)}, - {msm8x60_lcdc_configs, ARRAY_SIZE(msm8x60_lcdc_configs)}, - {msm8x60_mdp_vsync_configs, ARRAY_SIZE(msm8x60_mdp_vsync_configs)}, - {msm8x60_hdmi_configs, ARRAY_SIZE(msm8x60_hdmi_configs)}, - {msm8x60_pmic_configs, ARRAY_SIZE(msm8x60_pmic_configs)}, - {msm8x60_common_configs, ARRAY_SIZE(msm8x60_common_configs)}, - {msm8x60_cam_configs, ARRAY_SIZE(msm8x60_cam_configs)}, - {msm8x60_tmg200_configs, ARRAY_SIZE(msm8x60_tmg200_configs)}, - {NULL, 0}, -}; - -void __init msm8x60_init_gpiomux(struct msm_gpiomux_configs *cfgs) -{ - int rc; - - rc = msm_gpiomux_init(NR_GPIO_IRQS); - if (rc) { - pr_err("%s failure: %d\n", __func__, rc); - return; - } - - while (cfgs->cfg) { - msm_gpiomux_install(cfgs->cfg, cfgs->ncfg); - ++cfgs; - } -} diff --git a/arch/arm/mach-msm/gpiomux-8x60.h b/arch/arm/mach-msm/gpiomux-8x60.h deleted file mode 100644 index 619b5c0fa6b4..000000000000 --- a/arch/arm/mach-msm/gpiomux-8x60.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_8X60_H -#define __ARCH_ARM_MACH_MSM_GPIOMUX_8X60_H - -void __init msm8x60_init_gpiomux(struct msm_gpiomux_configs *cfgs); - -extern struct msm_gpiomux_configs msm8x60_surf_ffa_gpiomux_cfgs[] __initdata; -extern struct msm_gpiomux_configs msm8x60_fluid_gpiomux_cfgs[] __initdata; -extern struct msm_gpiomux_configs msm8x60_charm_gpiomux_cfgs[] __initdata; -extern struct msm_gpiomux_configs msm8x60_dragon_gpiomux_cfgs[] __initdata; - -#endif diff --git a/arch/arm/mach-msm/gpiomux-v1.c b/arch/arm/mach-msm/gpiomux-v1.c deleted file mode 100644 index 8338cd8a0632..000000000000 --- a/arch/arm/mach-msm/gpiomux-v1.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2010-2011 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include "gpio.h" - -void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val) -{ - unsigned tlmm_config; - unsigned tlmm_disable = 0; - void __iomem *out_reg; - unsigned offset; - uint32_t bits; - int rc; - - tlmm_config = (val.drv << 17) | - (val.pull << 15) | - ((gpio & 0x3ff) << 4) | - val.func; - if (val.func == GPIOMUX_FUNC_GPIO) { - tlmm_config |= (val.dir > GPIOMUX_IN ? BIT(14) : 0); - msm_gpio_find_out(gpio, &out_reg, &offset); - bits = __raw_readl(out_reg); - if (val.dir == GPIOMUX_OUT_HIGH) - __raw_writel(bits | BIT(offset), out_reg); - else - __raw_writel(bits & ~BIT(offset), out_reg); - } - mb(); - rc = msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, - &tlmm_config, &tlmm_disable); - if (rc) - pr_err("%s: unexpected proc_comm failure %d: %08x %08x\n", - __func__, rc, tlmm_config, tlmm_disable); -} diff --git a/arch/arm/mach-msm/gpiomux-v1.h b/arch/arm/mach-msm/gpiomux-v1.h deleted file mode 100644 index 6468d3dec919..000000000000 --- a/arch/arm/mach-msm/gpiomux-v1.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_V1_H -#define __ARCH_ARM_MACH_MSM_GPIOMUX_V1_H - -#if defined(CONFIG_ARCH_MSM7X30) -#define GPIOMUX_NGPIOS 182 -#elif defined(CONFIG_ARCH_QSD8X50) -#define GPIOMUX_NGPIOS 165 -#else -#define GPIOMUX_NGPIOS 133 -#endif - -typedef u32 gpiomux_config_t; - -enum { - GPIOMUX_DRV_2MA = 0UL << 17, - GPIOMUX_DRV_4MA = 1UL << 17, - GPIOMUX_DRV_6MA = 2UL << 17, - GPIOMUX_DRV_8MA = 3UL << 17, - GPIOMUX_DRV_10MA = 4UL << 17, - GPIOMUX_DRV_12MA = 5UL << 17, - GPIOMUX_DRV_14MA = 6UL << 17, - GPIOMUX_DRV_16MA = 7UL << 17, -}; - -enum { - GPIOMUX_FUNC_GPIO = 0UL, - GPIOMUX_FUNC_1 = 1UL, - GPIOMUX_FUNC_2 = 2UL, - GPIOMUX_FUNC_3 = 3UL, - GPIOMUX_FUNC_4 = 4UL, - GPIOMUX_FUNC_5 = 5UL, - GPIOMUX_FUNC_6 = 6UL, - GPIOMUX_FUNC_7 = 7UL, - GPIOMUX_FUNC_8 = 8UL, - GPIOMUX_FUNC_9 = 9UL, - GPIOMUX_FUNC_A = 10UL, - GPIOMUX_FUNC_B = 11UL, - GPIOMUX_FUNC_C = 12UL, - GPIOMUX_FUNC_D = 13UL, - GPIOMUX_FUNC_E = 14UL, - GPIOMUX_FUNC_F = 15UL, -}; - -enum { - GPIOMUX_PULL_NONE = 0UL << 15, - GPIOMUX_PULL_DOWN = 1UL << 15, - GPIOMUX_PULL_KEEPER = 2UL << 15, - GPIOMUX_PULL_UP = 3UL << 15, -}; - -#endif diff --git a/arch/arm/mach-msm/gpiomux-v2.h b/arch/arm/mach-msm/gpiomux-v2.h deleted file mode 100644 index 526ea2139f69..000000000000 --- a/arch/arm/mach-msm/gpiomux-v2.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_V2_H -#define __ARCH_ARM_MACH_MSM_GPIOMUX_V2_H - -#define GPIOMUX_NGPIOS 173 - -typedef u16 gpiomux_config_t; - -enum { - GPIOMUX_DRV_2MA = 0UL << 6, - GPIOMUX_DRV_4MA = 1UL << 6, - GPIOMUX_DRV_6MA = 2UL << 6, - GPIOMUX_DRV_8MA = 3UL << 6, - GPIOMUX_DRV_10MA = 4UL << 6, - GPIOMUX_DRV_12MA = 5UL << 6, - GPIOMUX_DRV_14MA = 6UL << 6, - GPIOMUX_DRV_16MA = 7UL << 6, -}; - -enum { - GPIOMUX_FUNC_GPIO = 0UL << 2, - GPIOMUX_FUNC_1 = 1UL << 2, - GPIOMUX_FUNC_2 = 2UL << 2, - GPIOMUX_FUNC_3 = 3UL << 2, - GPIOMUX_FUNC_4 = 4UL << 2, - GPIOMUX_FUNC_5 = 5UL << 2, - GPIOMUX_FUNC_6 = 6UL << 2, - GPIOMUX_FUNC_7 = 7UL << 2, - GPIOMUX_FUNC_8 = 8UL << 2, - GPIOMUX_FUNC_9 = 9UL << 2, - GPIOMUX_FUNC_A = 10UL << 2, - GPIOMUX_FUNC_B = 11UL << 2, - GPIOMUX_FUNC_C = 12UL << 2, - GPIOMUX_FUNC_D = 13UL << 2, - GPIOMUX_FUNC_E = 14UL << 2, - GPIOMUX_FUNC_F = 15UL << 2, -}; - -enum { - GPIOMUX_PULL_NONE = 0UL, - GPIOMUX_PULL_DOWN = 1UL, - GPIOMUX_PULL_KEEPER = 2UL, - GPIOMUX_PULL_UP = 3UL, -}; - -#endif diff --git a/arch/arm/mach-msm/htc_35mm_jack.c b/arch/arm/mach-msm/htc_35mm_jack.c deleted file mode 100644 index 3f95ff2bb6d6..000000000000 --- a/arch/arm/mach-msm/htc_35mm_jack.c +++ /dev/null @@ -1,397 +0,0 @@ -/* arch/arm/mach-msm/htc_35mm_jack.c - * - * Copyright (C) 2009 HTC, Inc. - * Author: Arec Kao - * Copyright (C) 2009 Google, Inc. - * Author: Eric Olsen - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_HTC_AUDIOJACK -#include -#endif - -/* #define CONFIG_DEBUG_H2W */ - -#define H2WI(fmt, arg...) \ - printk(KERN_INFO "[H2W] %s " fmt "\r\n", __func__, ## arg) -#define H2WE(fmt, arg...) \ - printk(KERN_ERR "[H2W] %s " fmt "\r\n", __func__, ## arg) - -#ifdef CONFIG_DEBUG_H2W -#define H2W_DBG(fmt, arg...) \ - printk(KERN_INFO "[H2W] %s " fmt "\r\n", __func__, ## arg) -#else -#define H2W_DBG(fmt, arg...) do {} while (0) -#endif - -void detect_h2w_do_work(struct work_struct *w); - -static struct workqueue_struct *detect_wq; -static struct workqueue_struct *button_wq; - -static DECLARE_DELAYED_WORK(detect_h2w_work, detect_h2w_do_work); - -static void insert_35mm_do_work(struct work_struct *work); -static DECLARE_WORK(insert_35mm_work, insert_35mm_do_work); -static void remove_35mm_do_work(struct work_struct *work); -static DECLARE_WORK(remove_35mm_work, remove_35mm_do_work); -static void button_35mm_do_work(struct work_struct *work); -static DECLARE_WORK(button_35mm_work, button_35mm_do_work); - -struct h35_info { - struct mutex mutex_lock; - struct switch_dev hs_change; - unsigned long insert_jiffies; - int ext_35mm_status; - int is_ext_insert; - int key_code; - int mic_bias_state; - int *is_hpin_stable; - struct input_dev *input; - - struct wake_lock headset_wake_lock; -}; - -static struct h35mm_platform_data *pd; -static struct h35_info *hi; - -static ssize_t h35mm_print_name(struct switch_dev *sdev, char *buf) -{ - return sprintf(buf, "Headset\n"); -} - -static void button_35mm_do_work(struct work_struct *work) -{ - int key = 0; - int pressed = 0; - - if (!hi->is_ext_insert) { - /* no headset ignor key event */ - H2WI("3.5mm headset is plugged out, skip report key event"); - return; - } - - switch (hi->key_code) { - case 0x1: /* Play/Pause */ - H2WI("3.5mm RC: Play Pressed"); - key = KEY_MEDIA; - pressed = 1; - break; - case 0x2: - H2WI("3.5mm RC: BACKWARD Pressed"); - key = KEY_PREVIOUSSONG; - pressed = 1; - break; - case 0x3: - H2WI("3.5mm RC: FORWARD Pressed"); - key = KEY_NEXTSONG; - pressed = 1; - break; - case 0x81: /* Play/Pause */ - H2WI("3.5mm RC: Play Released"); - key = KEY_MEDIA; - pressed = 0; - break; - case 0x82: - H2WI("3.5mm RC: BACKWARD Released"); - key = KEY_PREVIOUSSONG; - pressed = 0; - break; - case 0x83: - H2WI("3.5mm RC: FORWARD Released"); - key = KEY_NEXTSONG; - pressed = 0; - break; - default: - H2WI("3.5mm RC: Unknown Button (0x%x) Pressed", hi->key_code); - return; - } - input_report_key(hi->input, key, pressed); - input_sync(hi->input); - - wake_lock_timeout(&hi->headset_wake_lock, 1.5*HZ); -} - -static void remove_35mm_do_work(struct work_struct *work) -{ - wake_lock_timeout(&hi->headset_wake_lock, 2.5*HZ); - - H2W_DBG(""); - /*To solve the insert, remove, insert headset problem*/ - if (time_before_eq(jiffies, hi->insert_jiffies)) - msleep(800); - - if (hi->is_ext_insert) { - H2WI("Skip 3.5mm headset plug out!!!"); - if (hi->is_hpin_stable) - *(hi->is_hpin_stable) = 1; - return; - } - - pr_info("3.5mm_headset plug out\n"); - - if (pd->key_event_disable != NULL) - pd->key_event_disable(); - - if (hi->mic_bias_state) { - turn_mic_bias_on(0); - hi->mic_bias_state = 0; - } - hi->ext_35mm_status = 0; - if (hi->is_hpin_stable) - *(hi->is_hpin_stable) = 0; - - /* Notify framework via switch class */ - mutex_lock(&hi->mutex_lock); - switch_set_state(&hi->hs_change, hi->ext_35mm_status); - mutex_unlock(&hi->mutex_lock); -} - -static void insert_35mm_do_work(struct work_struct *work) -{ - H2W_DBG(""); - hi->insert_jiffies = jiffies + 1*HZ; - - wake_lock_timeout(&hi->headset_wake_lock, 1.5*HZ); - - if (hi->is_ext_insert) { - pr_info("3.5mm_headset plug in\n"); - - if (pd->key_event_enable != NULL) - pd->key_event_enable(); - - /* Turn On Mic Bias */ - if (!hi->mic_bias_state) { - turn_mic_bias_on(1); - hi->mic_bias_state = 1; - /* Wait for pin stable */ - msleep(300); - } - - /* Detect headset with or without microphone */ - if(pd->headset_has_mic) { - if (pd->headset_has_mic() == 0) { - /* without microphone */ - pr_info("3.5mm without microphone\n"); - hi->ext_35mm_status = BIT_HEADSET_NO_MIC; - } else { /* with microphone */ - pr_info("3.5mm with microphone\n"); - hi->ext_35mm_status = BIT_HEADSET; - } - } else { - /* Assume no mic */ - pr_info("3.5mm without microphone\n"); - hi->ext_35mm_status = BIT_HEADSET_NO_MIC; - } - hi->ext_35mm_status |= BIT_35MM_HEADSET; - - /* Notify framework via switch class */ - mutex_lock(&hi->mutex_lock); - switch_set_state(&hi->hs_change, hi->ext_35mm_status); - mutex_unlock(&hi->mutex_lock); - - if (hi->is_hpin_stable) - *(hi->is_hpin_stable) = 1; - } -} - -int htc_35mm_key_event(int keycode, int *hpin_stable) -{ - hi->key_code = keycode; - hi->is_hpin_stable = hpin_stable; - - if ((hi->ext_35mm_status & BIT_HEADSET) == 0) { - *(hi->is_hpin_stable) = 0; - - pr_info("Key press with no mic. Retrying detection\n"); - queue_work(detect_wq, &insert_35mm_work); - } else - queue_work(button_wq, &button_35mm_work); - - return 0; -} - -int htc_35mm_jack_plug_event(int insert, int *hpin_stable) -{ - if (!hi) { - pr_err("Plug event before driver init\n"); - return -1; - } - - mutex_lock(&hi->mutex_lock); - hi->is_ext_insert = insert; - hi->is_hpin_stable = hpin_stable; - mutex_unlock(&hi->mutex_lock); - - H2WI(" %d", hi->is_ext_insert); - if (!hi->is_ext_insert) - queue_work(detect_wq, &remove_35mm_work); - else - queue_work(detect_wq, &insert_35mm_work); - return 1; -} - -static int htc_35mm_probe(struct platform_device *pdev) -{ - int ret; - - pd = pdev->dev.platform_data; - - pr_info("H2W: htc_35mm_jack driver register\n"); - - hi = kzalloc(sizeof(struct h35_info), GFP_KERNEL); - if (!hi) - return -ENOMEM; - - hi->ext_35mm_status = 0; - hi->is_ext_insert = 0; - hi->mic_bias_state = 0; - - mutex_init(&hi->mutex_lock); - - wake_lock_init(&hi->headset_wake_lock, WAKE_LOCK_SUSPEND, "headset"); - - hi->hs_change.name = "h2w"; - hi->hs_change.print_name = h35mm_print_name; - ret = switch_dev_register(&hi->hs_change); - if (ret < 0) - goto err_switch_dev_register; - - detect_wq = create_workqueue("detection"); - if (detect_wq == NULL) { - ret = -ENOMEM; - goto err_create_detect_work_queue; - } - - button_wq = create_workqueue("button"); - if (button_wq == NULL) { - ret = -ENOMEM; - goto err_create_button_work_queue; - } - - hi->input = input_allocate_device(); - if (!hi->input) { - ret = -ENOMEM; - goto err_request_input_dev; - } - - hi->input->name = "h2w headset"; - set_bit(EV_SYN, hi->input->evbit); - set_bit(EV_KEY, hi->input->evbit); - set_bit(KEY_MEDIA, hi->input->keybit); - set_bit(KEY_NEXTSONG, hi->input->keybit); - set_bit(KEY_PLAYPAUSE, hi->input->keybit); - set_bit(KEY_PREVIOUSSONG, hi->input->keybit); - set_bit(KEY_MUTE, hi->input->keybit); - set_bit(KEY_VOLUMEUP, hi->input->keybit); - set_bit(KEY_VOLUMEDOWN, hi->input->keybit); - set_bit(KEY_END, hi->input->keybit); - set_bit(KEY_SEND, hi->input->keybit); - - ret = input_register_device(hi->input); - if (ret < 0) - goto err_register_input_dev; - - /* Enable plug events*/ - if (pd->plug_event_enable == NULL) { - ret = -ENOMEM; - goto err_enable_plug_event; - } - if (pd->plug_event_enable() != 1) { - ret = -ENOMEM; - goto err_enable_plug_event; - } - - return 0; - -err_enable_plug_event: -err_register_input_dev: - input_free_device(hi->input); -err_request_input_dev: - destroy_workqueue(button_wq); -err_create_button_work_queue: - destroy_workqueue(detect_wq); -err_create_detect_work_queue: - switch_dev_unregister(&hi->hs_change); -err_switch_dev_register: - kzfree(hi); - pr_err("H2W: Failed to register driver\n"); - - return ret; -} - -static int htc_35mm_remove(struct platform_device *pdev) -{ - H2W_DBG(""); - switch_dev_unregister(&hi->hs_change); - kzfree(hi); - -#if 0 /* Add keys later */ - input_unregister_device(hi->input); -#endif - return 0; -} - -static struct platform_driver htc_35mm_driver = { - .probe = htc_35mm_probe, - .remove = htc_35mm_remove, - .driver = { - .name = "htc_headset", - .owner = THIS_MODULE, - }, -}; - -static int __init htc_35mm_init(void) -{ - H2W_DBG(""); - return platform_driver_register(&htc_35mm_driver); -} - -static void __exit htc_35mm_exit(void) -{ - platform_driver_unregister(&htc_35mm_driver); -} - -module_init(htc_35mm_init); -module_exit(htc_35mm_exit); - -MODULE_AUTHOR("Eric Olsen "); -MODULE_DESCRIPTION("HTC 3.5MM Driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/htc_acoustic.c b/arch/arm/mach-msm/htc_acoustic.c deleted file mode 100644 index 3de71dddb589..000000000000 --- a/arch/arm/mach-msm/htc_acoustic.c +++ /dev/null @@ -1,239 +0,0 @@ -/* arch/arm/mach-msm/htc_acoustic.c - * - * Copyright (C) 2007-2008 HTC Corporation - * Author: Laurence Chen - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "smd_private.h" - -#define ACOUSTIC_IOCTL_MAGIC 'p' -#define ACOUSTIC_ARM11_DONE _IOW(ACOUSTIC_IOCTL_MAGIC, 22, unsigned int) - -#define HTCRPOG 0x30100002 -#define HTCVERS 0 -#define ONCRPC_SET_MIC_BIAS_PROC (1) -#define ONCRPC_ACOUSTIC_INIT_PROC (5) -#define ONCRPC_ALLOC_ACOUSTIC_MEM_PROC (6) - -#define HTC_ACOUSTIC_TABLE_SIZE (0x10000) - -#define D(fmt, args...) printk(KERN_INFO "htc-acoustic: "fmt, ##args) -#define E(fmt, args...) printk(KERN_ERR "htc-acoustic: "fmt, ##args) - -struct set_smem_req { - struct rpc_request_hdr hdr; - uint32_t size; -}; - -struct set_smem_rep { - struct rpc_reply_hdr hdr; - int n; -}; - -struct set_acoustic_req { - struct rpc_request_hdr hdr; -}; - -struct set_acoustic_rep { - struct rpc_reply_hdr hdr; - int n; -}; - -static uint32_t htc_acoustic_vir_addr; -static struct msm_rpc_endpoint *endpoint; -static struct mutex api_lock; - -static int acoustic_mmap(struct file *file, struct vm_area_struct *vma) -{ - unsigned long pgoff, delta; - int rc = -EINVAL; - size_t size; - - D("mmap\n"); - - mutex_lock(&api_lock); - - size = vma->vm_end - vma->vm_start; - - if (vma->vm_pgoff != 0) { - E("mmap failed: page offset %lx\n", vma->vm_pgoff); - goto done; - } - - if (!htc_acoustic_vir_addr) { - E("mmap failed: smem region not allocated\n"); - rc = -EIO; - goto done; - } - - pgoff = MSM_SHARED_RAM_PHYS + - (htc_acoustic_vir_addr - (uint32_t)MSM_SHARED_RAM_BASE); - delta = PAGE_ALIGN(pgoff) - pgoff; - - if (size + delta > HTC_ACOUSTIC_TABLE_SIZE) { - E("mmap failed: size %d\n", size); - goto done; - } - - pgoff += delta; - vma->vm_flags |= VM_IO | VM_RESERVED; - - rc = io_remap_pfn_range(vma, vma->vm_start, pgoff >> PAGE_SHIFT, - size, vma->vm_page_prot); - - if (rc < 0) - E("mmap failed: remap error %d\n", rc); - -done: mutex_unlock(&api_lock); - return rc; -} - -static int acoustic_open(struct inode *inode, struct file *file) -{ - int rc = -EIO; - struct set_smem_req req_smem; - struct set_smem_rep rep_smem; - - D("open\n"); - - mutex_lock(&api_lock); - - if (!htc_acoustic_vir_addr) { - if (endpoint == NULL) { - endpoint = msm_rpc_connect(HTCRPOG, HTCVERS, 0); - if (IS_ERR(endpoint)) { - E("init rpc failed! rc = %ld\n", - PTR_ERR(endpoint)); - endpoint = NULL; - goto done; - } - } - - req_smem.size = cpu_to_be32(HTC_ACOUSTIC_TABLE_SIZE); - rc = msm_rpc_call_reply(endpoint, - ONCRPC_ALLOC_ACOUSTIC_MEM_PROC, - &req_smem, sizeof(req_smem), - &rep_smem, sizeof(rep_smem), - 5 * HZ); - - if (rep_smem.n != 0 || rc < 0) { - E("open failed: ALLOC_ACOUSTIC_MEM_PROC error %d.\n", - rc); - goto done; - } - htc_acoustic_vir_addr = - (uint32_t)smem_alloc(SMEM_ID_VENDOR1, - HTC_ACOUSTIC_TABLE_SIZE); - if (!htc_acoustic_vir_addr) { - E("open failed: smem_alloc error\n"); - goto done; - } - } - - rc = 0; -done: - mutex_unlock(&api_lock); - return rc; -} - -static int acoustic_release(struct inode *inode, struct file *file) -{ - D("release\n"); - return 0; -} - -static long acoustic_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rc, reply_value; - struct set_acoustic_req req; - struct set_acoustic_rep rep; - - D("ioctl\n"); - - mutex_lock(&api_lock); - - switch (cmd) { - case ACOUSTIC_ARM11_DONE: - D("ioctl: ACOUSTIC_ARM11_DONE called %d.\n", current->pid); - rc = msm_rpc_call_reply(endpoint, - ONCRPC_ACOUSTIC_INIT_PROC, &req, - sizeof(req), &rep, sizeof(rep), - 5 * HZ); - - reply_value = be32_to_cpu(rep.n); - if (reply_value != 0 || rc < 0) { - E("ioctl failed: ONCRPC_ACOUSTIC_INIT_PROC "\ - "error %d.\n", rc); - if (rc >= 0) - rc = -EIO; - break; - } - D("ioctl: ONCRPC_ACOUSTIC_INIT_PROC success.\n"); - break; - default: - E("ioctl: invalid command\n"); - rc = -EINVAL; - } - - mutex_unlock(&api_lock); - return 0; -} - - -static struct file_operations acoustic_fops = { - .owner = THIS_MODULE, - .open = acoustic_open, - .release = acoustic_release, - .mmap = acoustic_mmap, - .unlocked_ioctl = acoustic_ioctl, -}; - -static struct miscdevice acoustic_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "htc-acoustic", - .fops = &acoustic_fops, -}; - -static int __init acoustic_init(void) -{ - mutex_init(&api_lock); - return misc_register(&acoustic_misc); -} - -static void __exit acoustic_exit(void) -{ - misc_deregister(&acoustic_misc); -} - -module_init(acoustic_init); -module_exit(acoustic_exit); - -MODULE_AUTHOR("Laurence Chen "); -MODULE_DESCRIPTION("HTC acoustic driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/htc_acoustic_qsd.c b/arch/arm/mach-msm/htc_acoustic_qsd.c deleted file mode 100644 index ce3c3a0bbfe2..000000000000 --- a/arch/arm/mach-msm/htc_acoustic_qsd.c +++ /dev/null @@ -1,315 +0,0 @@ -/* arch/arm/mach-msm/htc_acoustic_qsd.c - * - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "smd_private.h" - -#define ACOUSTIC_IOCTL_MAGIC 'p' -#define ACOUSTIC_UPDATE_ADIE \ - _IOW(ACOUSTIC_IOCTL_MAGIC, 24, unsigned int) - -#define HTCACOUSTICPROG 0x30100003 -#define HTCACOUSTICVERS 0 -#define ONCRPC_ALLOC_ACOUSTIC_MEM_PROC (1) -#define ONCRPC_UPDATE_ADIE_PROC (2) -#define ONCRPC_ENABLE_AUX_PGA_LOOPBACK_PROC (3) -#define ONCRPC_FORCE_HEADSET_SPEAKER_PROC (4) - -#define HTC_ACOUSTIC_TABLE_SIZE (0x20000) - -#define D(fmt, args...) printk(KERN_INFO "htc-acoustic: "fmt, ##args) -#define E(fmt, args...) printk(KERN_ERR "htc-acoustic: "fmt, ##args) - -static uint32_t htc_acoustic_vir_addr; -static struct msm_rpc_endpoint *endpoint; -static struct mutex api_lock; -static struct mutex rpc_connect_lock; -static struct qsd_acoustic_ops *the_ops; - -void acoustic_register_ops(struct qsd_acoustic_ops *ops) -{ - the_ops = ops; -} - -static int is_rpc_connect(void) -{ - mutex_lock(&rpc_connect_lock); - if (endpoint == NULL) { - endpoint = msm_rpc_connect(HTCACOUSTICPROG, - HTCACOUSTICVERS, 0); - if (IS_ERR(endpoint)) { - pr_err("%s: init rpc failed! rc = %ld\n", - __func__, PTR_ERR(endpoint)); - mutex_unlock(&rpc_connect_lock); - return -1; - } - } - mutex_unlock(&rpc_connect_lock); - return 0; -} - -int turn_mic_bias_on(int on) -{ - D("%s called %d\n", __func__, on); - if (the_ops->enable_mic_bias) - the_ops->enable_mic_bias(on); - - return 0; -} -EXPORT_SYMBOL(turn_mic_bias_on); - -int force_headset_speaker_on(int enable) -{ - struct speaker_headset_req { - struct rpc_request_hdr hdr; - uint32_t enable; - } spkr_req; - - D("%s called %d\n", __func__, enable); - - if (is_rpc_connect() == -1) - return -1; - - spkr_req.enable = cpu_to_be32(enable); - return msm_rpc_call(endpoint, - ONCRPC_FORCE_HEADSET_SPEAKER_PROC, - &spkr_req, sizeof(spkr_req), 5 * HZ); -} -EXPORT_SYMBOL(force_headset_speaker_on); - -int enable_aux_loopback(uint32_t enable) -{ - struct aux_loopback_req { - struct rpc_request_hdr hdr; - uint32_t enable; - } aux_req; - - D("%s called %d\n", __func__, enable); - - if (is_rpc_connect() == -1) - return -1; - - aux_req.enable = cpu_to_be32(enable); - return msm_rpc_call(endpoint, - ONCRPC_ENABLE_AUX_PGA_LOOPBACK_PROC, - &aux_req, sizeof(aux_req), 5 * HZ); -} -EXPORT_SYMBOL(enable_aux_loopback); - -static int acoustic_mmap(struct file *file, struct vm_area_struct *vma) -{ - unsigned long pgoff; - int rc = -EINVAL; - size_t size; - - D("mmap\n"); - - mutex_lock(&api_lock); - - size = vma->vm_end - vma->vm_start; - - if (vma->vm_pgoff != 0) { - E("mmap failed: page offset %lx\n", vma->vm_pgoff); - goto done; - } - - if (!htc_acoustic_vir_addr) { - E("mmap failed: smem region not allocated\n"); - rc = -EIO; - goto done; - } - - pgoff = MSM_SHARED_RAM_PHYS + - (htc_acoustic_vir_addr - (uint32_t)MSM_SHARED_RAM_BASE); - pgoff = ((pgoff + 4095) & ~4095); - htc_acoustic_vir_addr = ((htc_acoustic_vir_addr + 4095) & ~4095); - - if (pgoff <= 0) { - E("pgoff wrong. %ld\n", pgoff); - goto done; - } - - if (size <= HTC_ACOUSTIC_TABLE_SIZE) { - pgoff = pgoff >> PAGE_SHIFT; - } else { - E("size > HTC_ACOUSTIC_TABLE_SIZE %d\n", size); - goto done; - } - - vma->vm_flags |= VM_IO | VM_RESERVED; - rc = io_remap_pfn_range(vma, vma->vm_start, pgoff, - size, vma->vm_page_prot); - - if (rc < 0) - E("mmap failed: remap error %d\n", rc); - -done: mutex_unlock(&api_lock); - return rc; -} - -static int acoustic_open(struct inode *inode, struct file *file) -{ - int reply_value; - int rc = -EIO; - struct set_smem_req { - struct rpc_request_hdr hdr; - uint32_t size; - } req_smem; - - struct set_smem_rep { - struct rpc_reply_hdr hdr; - int n; - } rep_smem; - - D("open\n"); - - mutex_lock(&api_lock); - - if (!htc_acoustic_vir_addr) { - if (is_rpc_connect() == -1) - goto done; - - req_smem.size = cpu_to_be32(HTC_ACOUSTIC_TABLE_SIZE); - rc = msm_rpc_call_reply(endpoint, - ONCRPC_ALLOC_ACOUSTIC_MEM_PROC, - &req_smem, sizeof(req_smem), - &rep_smem, sizeof(rep_smem), - 5 * HZ); - - reply_value = be32_to_cpu(rep_smem.n); - if (reply_value != 0 || rc < 0) { - E("open failed: ALLOC_ACOUSTIC_MEM_PROC error %d.\n", - rc); - goto done; - } - htc_acoustic_vir_addr = - (uint32_t)smem_alloc(SMEM_ID_VENDOR1, - HTC_ACOUSTIC_TABLE_SIZE); - if (!htc_acoustic_vir_addr) { - E("open failed: smem_alloc error\n"); - goto done; - } - } - - rc = 0; -done: - mutex_unlock(&api_lock); - return rc; -} - -static int acoustic_release(struct inode *inode, struct file *file) -{ - D("release\n"); - return 0; -} - -static long acoustic_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rc, reply_value; - - D("ioctl\n"); - - mutex_lock(&api_lock); - - switch (cmd) { - case ACOUSTIC_UPDATE_ADIE: { - struct update_adie_req { - struct rpc_request_hdr hdr; - int id; - } adie_req; - - struct update_adie_rep { - struct rpc_reply_hdr hdr; - int ret; - } adie_rep; - - D("ioctl: ACOUSTIC_UPDATE_ADIE called %d.\n", current->pid); - - adie_req.id = cpu_to_be32(-1); /* update all codecs */ - rc = msm_rpc_call_reply(endpoint, - ONCRPC_UPDATE_ADIE_PROC, &adie_req, - sizeof(adie_req), &adie_rep, - sizeof(adie_rep), 5 * HZ); - - reply_value = be32_to_cpu(adie_rep.ret); - if (reply_value != 0 || rc < 0) { - E("ioctl failed: ONCRPC_UPDATE_ADIE_PROC "\ - "error %d.\n", rc); - if (rc >= 0) - rc = -EIO; - break; - } - D("ioctl: ONCRPC_UPDATE_ADIE_PROC success.\n"); - break; - } - default: - E("ioctl: invalid command\n"); - rc = -EINVAL; - } - - mutex_unlock(&api_lock); - return rc; -} - -struct rpc_set_uplink_mute_args { - int mute; -}; - -static struct file_operations acoustic_fops = { - .owner = THIS_MODULE, - .open = acoustic_open, - .release = acoustic_release, - .mmap = acoustic_mmap, - .unlocked_ioctl = acoustic_ioctl, -}; - -static struct miscdevice acoustic_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "htc-acoustic", - .fops = &acoustic_fops, -}; - -static int __init acoustic_init(void) -{ - mutex_init(&api_lock); - mutex_init(&rpc_connect_lock); - return misc_register(&acoustic_misc); -} - -static void __exit acoustic_exit(void) -{ - misc_deregister(&acoustic_misc); -} - -module_init(acoustic_init); -module_exit(acoustic_exit); - diff --git a/arch/arm/mach-msm/htc_akm_cal.c b/arch/arm/mach-msm/htc_akm_cal.c deleted file mode 100644 index 943083fe0fbe..000000000000 --- a/arch/arm/mach-msm/htc_akm_cal.c +++ /dev/null @@ -1,64 +0,0 @@ -/* arch/arm/mach-msm/htc_akm_cal.c - * - * Code to extract compass calibration information from ATAG set up - * by the bootloader. - * - * Copyright (C) 2007-2008 HTC Corporation - * Author: Farmer Tseng - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#include - -/* configuration tags specific to AKM8976 */ -#define ATAG_AKM8976 0x89768976 /* AKM8976 */ - -#define MAX_CALI_SIZE 0x1000U - -static char akm_cal_ram[MAX_CALI_SIZE]; - -char *get_akm_cal_ram(void) -{ - return(akm_cal_ram); -} -EXPORT_SYMBOL(get_akm_cal_ram); - -static int __init parse_tag_akm(const struct tag *tag) -{ - unsigned char *dptr = (unsigned char *)(&tag->u); - unsigned size; - - size = min((tag->hdr.size - 2) * sizeof(__u32), MAX_CALI_SIZE); - - printk(KERN_INFO "AKM Data size = %d , 0x%x, size = %d\n", - tag->hdr.size, tag->hdr.tag, size); - -#ifdef ATAG_COMPASS_DEBUG - unsigned i; - unsigned char *ptr; - - ptr = dptr; - printk(KERN_INFO - "AKM Data size = %d , 0x%x\n", - tag->hdr.size, tag->hdr.tag); - for (i = 0; i < size; i++) - printk(KERN_INFO "%02x ", *ptr++); -#endif - memcpy((void *)akm_cal_ram, (void *)dptr, size); - return 0; -} - -__tagtable(ATAG_AKM8976, parse_tag_akm); diff --git a/arch/arm/mach-msm/htc_battery.c b/arch/arm/mach-msm/htc_battery.c deleted file mode 100644 index d49c23e864c3..000000000000 --- a/arch/arm/mach-msm/htc_battery.c +++ /dev/null @@ -1,771 +0,0 @@ -/* arch/arm/mach-msm/htc_battery.c - * - * Copyright (C) 2008 HTC Corporation. - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static struct wake_lock vbus_wake_lock; - -#define TRACE_BATT 0 - -#if TRACE_BATT -#define BATT(x...) printk(KERN_INFO "[BATT] " x) -#else -#define BATT(x...) do {} while (0) -#endif - -/* rpc related */ -#define APP_BATT_PDEV_NAME "rs30100001" -#define APP_BATT_PROG 0x30100001 -#define APP_BATT_VER 0 -#define HTC_PROCEDURE_BATTERY_NULL 0 -#define HTC_PROCEDURE_GET_BATT_LEVEL 1 -#define HTC_PROCEDURE_GET_BATT_INFO 2 -#define HTC_PROCEDURE_GET_CABLE_STATUS 3 -#define HTC_PROCEDURE_SET_BATT_DELTA 4 - -/* module debugger */ -#define HTC_BATTERY_DEBUG 1 -#define BATTERY_PREVENTION 1 - -/* Enable this will shut down if no battery */ -#define ENABLE_BATTERY_DETECTION 0 - -#define GPIO_BATTERY_DETECTION 21 -#define GPIO_BATTERY_CHARGER_EN 128 - -/* Charge current selection */ -#define GPIO_BATTERY_CHARGER_CURRENT 129 - -typedef enum { - DISABLE = 0, - ENABLE_SLOW_CHG, - ENABLE_FAST_CHG -} batt_ctl_t; - -/* This order is the same as htc_power_supplies[] - * And it's also the same as htc_cable_status_update() - */ -typedef enum { - CHARGER_BATTERY = 0, - CHARGER_USB, - CHARGER_AC -} charger_type_t; - -struct battery_info_reply { - u32 batt_id; /* Battery ID from ADC */ - u32 batt_vol; /* Battery voltage from ADC */ - u32 batt_temp; /* Battery Temperature (C) from formula and ADC */ - u32 batt_current; /* Battery current from ADC */ - u32 level; /* formula */ - u32 charging_source; /* 0: no cable, 1:usb, 2:AC */ - u32 charging_enabled; /* 0: Disable, 1: Enable */ - u32 full_bat; /* Full capacity of battery (mAh) */ -}; - -struct htc_battery_info { - int present; - unsigned long update_time; - - /* lock to protect the battery info */ - struct mutex lock; - - /* lock held while calling the arm9 to query the battery info */ - struct mutex rpc_lock; - struct battery_info_reply rep; -}; - -static struct msm_rpc_endpoint *endpoint; - -static struct htc_battery_info htc_batt_info; - -static unsigned int cache_time = 1000; - -static int htc_battery_initial = 0; - -static enum power_supply_property htc_battery_properties[] = { - POWER_SUPPLY_PROP_STATUS, - POWER_SUPPLY_PROP_HEALTH, - POWER_SUPPLY_PROP_PRESENT, - POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_CAPACITY, -}; - -static enum power_supply_property htc_power_properties[] = { - POWER_SUPPLY_PROP_ONLINE, -}; - -static char *supply_list[] = { - "battery", -}; - -/* HTC dedicated attributes */ -static ssize_t htc_battery_show_property(struct device *dev, - struct device_attribute *attr, - char *buf); - -static int htc_power_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val); - -static int htc_battery_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val); - -static struct power_supply htc_power_supplies[] = { - { - .name = "battery", - .type = POWER_SUPPLY_TYPE_BATTERY, - .properties = htc_battery_properties, - .num_properties = ARRAY_SIZE(htc_battery_properties), - .get_property = htc_battery_get_property, - }, - { - .name = "usb", - .type = POWER_SUPPLY_TYPE_USB, - .supplied_to = supply_list, - .num_supplicants = ARRAY_SIZE(supply_list), - .properties = htc_power_properties, - .num_properties = ARRAY_SIZE(htc_power_properties), - .get_property = htc_power_get_property, - }, - { - .name = "ac", - .type = POWER_SUPPLY_TYPE_MAINS, - .supplied_to = supply_list, - .num_supplicants = ARRAY_SIZE(supply_list), - .properties = htc_power_properties, - .num_properties = ARRAY_SIZE(htc_power_properties), - .get_property = htc_power_get_property, - }, -}; - - -/* -------------------------------------------------------------------------- */ - -#if defined(CONFIG_DEBUG_FS) -int htc_battery_set_charging(batt_ctl_t ctl); -static int batt_debug_set(void *data, u64 val) -{ - return htc_battery_set_charging((batt_ctl_t) val); -} - -static int batt_debug_get(void *data, u64 *val) -{ - return -ENOSYS; -} - -DEFINE_SIMPLE_ATTRIBUTE(batt_debug_fops, batt_debug_get, batt_debug_set, "%llu\n"); -static int __init batt_debug_init(void) -{ - struct dentry *dent; - - dent = debugfs_create_dir("htc_battery", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("charger_state", 0644, dent, NULL, &batt_debug_fops); - - return 0; -} - -device_initcall(batt_debug_init); -#endif - -static int init_batt_gpio(void) -{ - if (gpio_request(GPIO_BATTERY_DETECTION, "batt_detect") < 0) - goto gpio_failed; - if (gpio_request(GPIO_BATTERY_CHARGER_EN, "charger_en") < 0) - goto gpio_failed; - if (gpio_request(GPIO_BATTERY_CHARGER_CURRENT, "charge_current") < 0) - goto gpio_failed; - - return 0; - -gpio_failed: - return -EINVAL; - -} - -/* - * battery_charging_ctrl - battery charing control. - * @ctl: battery control command - * - */ -static int battery_charging_ctrl(batt_ctl_t ctl) -{ - int result = 0; - - switch (ctl) { - case DISABLE: - BATT("charger OFF\n"); - /* 0 for enable; 1 disable */ - result = gpio_direction_output(GPIO_BATTERY_CHARGER_EN, 1); - break; - case ENABLE_SLOW_CHG: - BATT("charger ON (SLOW)\n"); - result = gpio_direction_output(GPIO_BATTERY_CHARGER_CURRENT, 0); - result = gpio_direction_output(GPIO_BATTERY_CHARGER_EN, 0); - break; - case ENABLE_FAST_CHG: - BATT("charger ON (FAST)\n"); - result = gpio_direction_output(GPIO_BATTERY_CHARGER_CURRENT, 1); - result = gpio_direction_output(GPIO_BATTERY_CHARGER_EN, 0); - break; - default: - printk(KERN_ERR "Not supported battery ctr called.!\n"); - result = -EINVAL; - break; - } - - return result; -} - -int htc_battery_set_charging(batt_ctl_t ctl) -{ - int rc; - - if ((rc = battery_charging_ctrl(ctl)) < 0) - goto result; - - if (!htc_battery_initial) { - htc_batt_info.rep.charging_enabled = ctl & 0x3; - } else { - mutex_lock(&htc_batt_info.lock); - htc_batt_info.rep.charging_enabled = ctl & 0x3; - mutex_unlock(&htc_batt_info.lock); - } -result: - return rc; -} - -int htc_battery_status_update(u32 curr_level) -{ - int notify; - if (!htc_battery_initial) - return 0; - - mutex_lock(&htc_batt_info.lock); - notify = (htc_batt_info.rep.level != curr_level); - htc_batt_info.rep.level = curr_level; - mutex_unlock(&htc_batt_info.lock); - - if (notify) - power_supply_changed(&htc_power_supplies[CHARGER_BATTERY]); - return 0; -} - -int htc_cable_status_update(int status) -{ - int rc = 0; - unsigned source; - - if (!htc_battery_initial) - return 0; - - mutex_lock(&htc_batt_info.lock); - switch(status) { - case CHARGER_BATTERY: - BATT("cable NOT PRESENT\n"); - htc_batt_info.rep.charging_source = CHARGER_BATTERY; - break; - case CHARGER_USB: - BATT("cable USB\n"); - htc_batt_info.rep.charging_source = CHARGER_USB; - break; - case CHARGER_AC: - BATT("cable AC\n"); - htc_batt_info.rep.charging_source = CHARGER_AC; - break; - default: - printk(KERN_ERR "%s: Not supported cable status received!\n", - __FUNCTION__); - rc = -EINVAL; - } - source = htc_batt_info.rep.charging_source; - mutex_unlock(&htc_batt_info.lock); - - msm_hsusb_set_vbus_state(source == CHARGER_USB); - if (source == CHARGER_USB) { - wake_lock(&vbus_wake_lock); - } else { - /* give userspace some time to see the uevent and update - * LED state or whatnot... - */ - wake_lock_timeout(&vbus_wake_lock, HZ / 2); - } - - /* if the power source changes, all power supplies may change state */ - power_supply_changed(&htc_power_supplies[CHARGER_BATTERY]); - power_supply_changed(&htc_power_supplies[CHARGER_USB]); - power_supply_changed(&htc_power_supplies[CHARGER_AC]); - - return rc; -} - -static int htc_get_batt_info(struct battery_info_reply *buffer) -{ - struct rpc_request_hdr req; - - struct htc_get_batt_info_rep { - struct rpc_reply_hdr hdr; - struct battery_info_reply info; - } rep; - - int rc; - - if (buffer == NULL) - return -EINVAL; - - rc = msm_rpc_call_reply(endpoint, HTC_PROCEDURE_GET_BATT_INFO, - &req, sizeof(req), - &rep, sizeof(rep), - 5 * HZ); - if ( rc < 0 ) - return rc; - - mutex_lock(&htc_batt_info.lock); - buffer->batt_id = be32_to_cpu(rep.info.batt_id); - buffer->batt_vol = be32_to_cpu(rep.info.batt_vol); - buffer->batt_temp = be32_to_cpu(rep.info.batt_temp); - buffer->batt_current = be32_to_cpu(rep.info.batt_current); - buffer->level = be32_to_cpu(rep.info.level); - buffer->charging_source = be32_to_cpu(rep.info.charging_source); - buffer->charging_enabled = be32_to_cpu(rep.info.charging_enabled); - buffer->full_bat = be32_to_cpu(rep.info.full_bat); - mutex_unlock(&htc_batt_info.lock); - - return 0; -} - -#if 0 -static int htc_get_cable_status(void) -{ - - struct rpc_request_hdr req; - - struct htc_get_cable_status_rep { - struct rpc_reply_hdr hdr; - int status; - } rep; - - int rc; - - rc = msm_rpc_call_reply(endpoint, HTC_PROCEDURE_GET_CABLE_STATUS, - &req, sizeof(req), - &rep, sizeof(rep), - 5 * HZ); - if (rc < 0) - return rc; - - return be32_to_cpu(rep.status); -} -#endif - -/* -------------------------------------------------------------------------- */ -static int htc_power_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val) -{ - charger_type_t charger; - - mutex_lock(&htc_batt_info.lock); - charger = htc_batt_info.rep.charging_source; - mutex_unlock(&htc_batt_info.lock); - - switch (psp) { - case POWER_SUPPLY_PROP_ONLINE: - if (psy->type == POWER_SUPPLY_TYPE_MAINS) - val->intval = (charger == CHARGER_AC ? 1 : 0); - else if (psy->type == POWER_SUPPLY_TYPE_USB) - val->intval = (charger == CHARGER_USB ? 1 : 0); - else - val->intval = 0; - break; - default: - return -EINVAL; - } - - return 0; -} - -static int htc_battery_get_charging_status(void) -{ - u32 level; - charger_type_t charger; - int ret; - - mutex_lock(&htc_batt_info.lock); - charger = htc_batt_info.rep.charging_source; - - switch (charger) { - case CHARGER_BATTERY: - ret = POWER_SUPPLY_STATUS_NOT_CHARGING; - break; - case CHARGER_USB: - case CHARGER_AC: - level = htc_batt_info.rep.level; - if (level == 100) - ret = POWER_SUPPLY_STATUS_FULL; - else - ret = POWER_SUPPLY_STATUS_CHARGING; - break; - default: - ret = POWER_SUPPLY_STATUS_UNKNOWN; - } - mutex_unlock(&htc_batt_info.lock); - return ret; -} - -static int htc_battery_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val) -{ - switch (psp) { - case POWER_SUPPLY_PROP_STATUS: - val->intval = htc_battery_get_charging_status(); - break; - case POWER_SUPPLY_PROP_HEALTH: - val->intval = POWER_SUPPLY_HEALTH_GOOD; - break; - case POWER_SUPPLY_PROP_PRESENT: - val->intval = htc_batt_info.present; - break; - case POWER_SUPPLY_PROP_TECHNOLOGY: - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; - break; - case POWER_SUPPLY_PROP_CAPACITY: - mutex_lock(&htc_batt_info.lock); - val->intval = htc_batt_info.rep.level; - mutex_unlock(&htc_batt_info.lock); - break; - default: - return -EINVAL; - } - - return 0; -} - -#define HTC_BATTERY_ATTR(_name) \ -{ \ - .attr = { .name = #_name, .mode = S_IRUGO, .owner = THIS_MODULE }, \ - .show = htc_battery_show_property, \ - .store = NULL, \ -} - -static struct device_attribute htc_battery_attrs[] = { - HTC_BATTERY_ATTR(batt_id), - HTC_BATTERY_ATTR(batt_vol), - HTC_BATTERY_ATTR(batt_temp), - HTC_BATTERY_ATTR(batt_current), - HTC_BATTERY_ATTR(charging_source), - HTC_BATTERY_ATTR(charging_enabled), - HTC_BATTERY_ATTR(full_bat), -}; - -enum { - BATT_ID = 0, - BATT_VOL, - BATT_TEMP, - BATT_CURRENT, - CHARGING_SOURCE, - CHARGING_ENABLED, - FULL_BAT, -}; - -static int htc_rpc_set_delta(unsigned delta) -{ - struct set_batt_delta_req { - struct rpc_request_hdr hdr; - uint32_t data; - } req; - - req.data = cpu_to_be32(delta); - return msm_rpc_call(endpoint, HTC_PROCEDURE_SET_BATT_DELTA, - &req, sizeof(req), 5 * HZ); -} - - -static ssize_t htc_battery_set_delta(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int rc; - unsigned long delta = 0; - - delta = simple_strtoul(buf, NULL, 10); - - if (delta > 100) - return -EINVAL; - - mutex_lock(&htc_batt_info.rpc_lock); - rc = htc_rpc_set_delta(delta); - mutex_unlock(&htc_batt_info.rpc_lock); - if (rc < 0) - return rc; - return count; -} - -static struct device_attribute htc_set_delta_attrs[] = { - __ATTR(delta, S_IWUSR | S_IWGRP, NULL, htc_battery_set_delta), -}; - -static int htc_battery_create_attrs(struct device * dev) -{ - int i, j, rc; - - for (i = 0; i < ARRAY_SIZE(htc_battery_attrs); i++) { - rc = device_create_file(dev, &htc_battery_attrs[i]); - if (rc) - goto htc_attrs_failed; - } - - for (j = 0; j < ARRAY_SIZE(htc_set_delta_attrs); j++) { - rc = device_create_file(dev, &htc_set_delta_attrs[j]); - if (rc) - goto htc_delta_attrs_failed; - } - - goto succeed; - -htc_attrs_failed: - while (i--) - device_remove_file(dev, &htc_battery_attrs[i]); -htc_delta_attrs_failed: - while (j--) - device_remove_file(dev, &htc_set_delta_attrs[i]); -succeed: - return rc; -} - -static ssize_t htc_battery_show_property(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - int i = 0; - const ptrdiff_t off = attr - htc_battery_attrs; - - /* rpc lock is used to prevent two threads from calling - * into the get info rpc at the same time - */ - - mutex_lock(&htc_batt_info.rpc_lock); - /* check cache time to decide if we need to update */ - if (htc_batt_info.update_time && - time_before(jiffies, htc_batt_info.update_time + - msecs_to_jiffies(cache_time))) - goto dont_need_update; - - if (htc_get_batt_info(&htc_batt_info.rep) < 0) - printk(KERN_ERR "%s: rpc failed!!!\n", __FUNCTION__); - else - htc_batt_info.update_time = jiffies; -dont_need_update: - mutex_unlock(&htc_batt_info.rpc_lock); - - mutex_lock(&htc_batt_info.lock); - switch (off) { - case BATT_ID: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.batt_id); - break; - case BATT_VOL: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.batt_vol); - break; - case BATT_TEMP: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.batt_temp); - break; - case BATT_CURRENT: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.batt_current); - break; - case CHARGING_SOURCE: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.charging_source); - break; - case CHARGING_ENABLED: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.charging_enabled); - break; - case FULL_BAT: - i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", - htc_batt_info.rep.full_bat); - break; - default: - i = -EINVAL; - } - mutex_unlock(&htc_batt_info.lock); - - return i; -} - -static int htc_battery_probe(struct platform_device *pdev) -{ - int i, rc; - - if (pdev->id != (APP_BATT_VER & RPC_VERSION_MAJOR_MASK)) - return -EINVAL; - - /* init battery gpio */ - if ((rc = init_batt_gpio()) < 0) { - printk(KERN_ERR "%s: init battery gpio failed!\n", __FUNCTION__); - return rc; - } - - /* init structure data member */ - htc_batt_info.update_time = jiffies; - htc_batt_info.present = gpio_get_value(GPIO_BATTERY_DETECTION); - - /* init rpc */ - endpoint = msm_rpc_connect(APP_BATT_PROG, APP_BATT_VER, 0); - if (IS_ERR(endpoint)) { - printk(KERN_ERR "%s: init rpc failed! rc = %ld\n", - __FUNCTION__, PTR_ERR(endpoint)); - return rc; - } - - /* init power supplier framework */ - for (i = 0; i < ARRAY_SIZE(htc_power_supplies); i++) { - rc = power_supply_register(&pdev->dev, &htc_power_supplies[i]); - if (rc) - printk(KERN_ERR "Failed to register power supply (%d)\n", rc); - } - - /* create htc detail attributes */ - htc_battery_create_attrs(htc_power_supplies[CHARGER_BATTERY].dev); - - /* After battery driver gets initialized, send rpc request to inquiry - * the battery status in case of we lost some info - */ - htc_battery_initial = 1; - - mutex_lock(&htc_batt_info.rpc_lock); - if (htc_get_batt_info(&htc_batt_info.rep) < 0) - printk(KERN_ERR "%s: get info failed\n", __FUNCTION__); - - htc_cable_status_update(htc_batt_info.rep.charging_source); - battery_charging_ctrl(htc_batt_info.rep.charging_enabled ? - ENABLE_SLOW_CHG : DISABLE); - - if (htc_rpc_set_delta(1) < 0) - printk(KERN_ERR "%s: set delta failed\n", __FUNCTION__); - htc_batt_info.update_time = jiffies; - mutex_unlock(&htc_batt_info.rpc_lock); - - if (htc_batt_info.rep.charging_enabled == 0) - battery_charging_ctrl(DISABLE); - - return 0; -} - -static struct platform_driver htc_battery_driver = { - .probe = htc_battery_probe, - .driver = { - .name = APP_BATT_PDEV_NAME, - .owner = THIS_MODULE, - }, -}; - -/* batt_mtoa server definitions */ -#define BATT_MTOA_PROG 0x30100000 -#define BATT_MTOA_VERS 0 -#define RPC_BATT_MTOA_NULL 0 -#define RPC_BATT_MTOA_SET_CHARGING_PROC 1 -#define RPC_BATT_MTOA_CABLE_STATUS_UPDATE_PROC 2 -#define RPC_BATT_MTOA_LEVEL_UPDATE_PROC 3 - -struct rpc_batt_mtoa_set_charging_args { - int enable; -}; - -struct rpc_batt_mtoa_cable_status_update_args { - int status; -}; - -struct rpc_dem_battery_update_args { - uint32_t level; -}; - -static int handle_battery_call(struct msm_rpc_server *server, - struct rpc_request_hdr *req, unsigned len) -{ - switch (req->procedure) { - case RPC_BATT_MTOA_NULL: - return 0; - - case RPC_BATT_MTOA_SET_CHARGING_PROC: { - struct rpc_batt_mtoa_set_charging_args *args; - args = (struct rpc_batt_mtoa_set_charging_args *)(req + 1); - args->enable = be32_to_cpu(args->enable); - BATT("set_charging: enable=%d\n",args->enable); - htc_battery_set_charging(args->enable); - return 0; - } - case RPC_BATT_MTOA_CABLE_STATUS_UPDATE_PROC: { - struct rpc_batt_mtoa_cable_status_update_args *args; - args = (struct rpc_batt_mtoa_cable_status_update_args *)(req + 1); - args->status = be32_to_cpu(args->status); - BATT("cable_status_update: status=%d\n",args->status); - htc_cable_status_update(args->status); - return 0; - } - case RPC_BATT_MTOA_LEVEL_UPDATE_PROC: { - struct rpc_dem_battery_update_args *args; - args = (struct rpc_dem_battery_update_args *)(req + 1); - args->level = be32_to_cpu(args->level); - BATT("dem_battery_update: level=%d\n",args->level); - htc_battery_status_update(args->level); - return 0; - } - default: - printk(KERN_ERR "%s: program 0x%08x:%d: unknown procedure %d\n", - __FUNCTION__, req->prog, req->vers, req->procedure); - return -ENODEV; - } -} - -static struct msm_rpc_server battery_server = { - .prog = BATT_MTOA_PROG, - .vers = BATT_MTOA_VERS, - .rpc_call = handle_battery_call, -}; - -static int __init htc_battery_init(void) -{ - wake_lock_init(&vbus_wake_lock, WAKE_LOCK_SUSPEND, "vbus_present"); - mutex_init(&htc_batt_info.lock); - mutex_init(&htc_batt_info.rpc_lock); - msm_rpc_create_server(&battery_server); - platform_driver_register(&htc_battery_driver); - return 0; -} - -module_init(htc_battery_init); -MODULE_DESCRIPTION("HTC Battery Driver"); -MODULE_LICENSE("GPL"); - diff --git a/arch/arm/mach-msm/htc_headset.c b/arch/arm/mach-msm/htc_headset.c deleted file mode 100644 index a69a2e1ca5f8..000000000000 --- a/arch/arm/mach-msm/htc_headset.c +++ /dev/null @@ -1,1246 +0,0 @@ -/* - * H2W device detection driver. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC, Inc. - * - * Authors: - * Laurence Chen - * Nick Pelly - * Thomas Tsai - * Farmer Tseng - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - */ - -/* For detecting HTC 2 Wire devices, such as wired headset. - - Logically, the H2W driver is always present, and H2W state (hi->state) - indicates what is currently plugged into the H2W interface. - - When the headset is plugged in, CABLE_IN1 is pulled low. When the headset - button is pressed, CABLE_IN2 is pulled low. These two lines are shared with - the TX and RX (respectively) of UART3 - used for serial debugging. - - This headset driver keeps the CPLD configured as UART3 for as long as - possible, so that we can do serial FIQ debugging even when the kernel is - locked and this driver no longer runs. So it only configures the CPLD to - GPIO while the headset is plugged in, and for 10ms during detection work. - - Unfortunately we can't leave the CPLD as UART3 while a headset is plugged - in, UART3 is pullup on TX but the headset is pull-down, causing a 55 mA - drain on trout. - - The headset detection work involves setting CPLD to GPIO, and then pulling - CABLE_IN1 high with a stronger pullup than usual. A H2W headset will still - pull this line low, whereas other attachments such as a serial console - would get pulled up by this stronger pullup. - - Headset insertion/removal causes UEvent's to be sent, and - /sys/class/switch/h2w/state to be updated. - - Button presses are interpreted as input event (KEY_MEDIA). Button presses - are ignored if the headset is plugged in, so the buttons on 11 pin -> 3.5mm - jack adapters do not work until a headset is plugged into the adapter. This - is to avoid serial RX traffic causing spurious button press events. - - We tend to check the status of CABLE_IN1 a few more times than strictly - necessary during headset detection, to avoid spurious headset insertion - events caused by serial debugger TX traffic. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define H2WI(fmt, arg...) \ - printk(KERN_INFO "[H2W] %s " fmt "\r\n", __func__, ## arg) -#define H2WE(fmt, arg...) \ - printk(KERN_ERR "[H2W] %s " fmt "\r\n", __func__, ## arg) - -#ifdef CONFIG_DEBUG_H2W -#define H2W_DBG(fmt, arg...) printk(KERN_INFO "[H2W] %s " fmt "\r\n", __func__, ## arg) -#else -#define H2W_DBG(fmt, arg...) do {} while (0) -#endif - -static struct workqueue_struct *g_detection_work_queue; -static void detection_work(struct work_struct *work); -static DECLARE_WORK(g_detection_work, detection_work); - -struct h2w_info { - struct switch_dev sdev; - struct input_dev *input; - struct mutex mutex_lock; - - atomic_t btn_state; - int ignore_btn; - - unsigned int irq; - unsigned int irq_btn; - - int cable_in1; - int cable_in2; - int h2w_clk; - int h2w_data; - int debug_uart; - - void (*config_cpld) (int); - void (*init_cpld) (void); - /* for h2w */ - void (*set_dat)(int); - void (*set_clk)(int); - void (*set_dat_dir)(int); - void (*set_clk_dir)(int); - int (*get_dat)(void); - int (*get_clk)(void); - - int htc_headset_flag; - - struct hrtimer timer; - ktime_t debounce_time; - - struct hrtimer btn_timer; - ktime_t btn_debounce_time; - - H2W_INFO h2w_info; - H2W_SPEED speed; - struct vreg *vreg_h2w; -}; -static struct h2w_info *hi; - -static ssize_t h2w_print_name(struct switch_dev *sdev, char *buf) -{ - switch (switch_get_state(&hi->sdev)) { - case H2W_NO_DEVICE: - return sprintf(buf, "No Device\n"); - case H2W_HTC_HEADSET: - return sprintf(buf, "Headset\n"); - } - return -EINVAL; -} - -static void button_pressed(void) -{ - H2W_DBG("button_pressed \n"); - atomic_set(&hi->btn_state, 1); - input_report_key(hi->input, KEY_MEDIA, 1); - input_sync(hi->input); -} - -static void button_released(void) -{ - H2W_DBG("button_released \n"); - atomic_set(&hi->btn_state, 0); - input_report_key(hi->input, KEY_MEDIA, 0); - input_sync(hi->input); -} - -/***************** - * H2W proctocol * - *****************/ -static inline void h2w_begin_command(void) -{ - /* Disable H2W interrupt */ - set_irq_type(hi->irq_btn, IRQF_TRIGGER_HIGH); - disable_irq(hi->irq); - disable_irq(hi->irq_btn); - - /* Set H2W_CLK as output low */ - hi->set_clk(0); - hi->set_clk_dir(1); -} - -static inline void h2w_end_command(void) -{ - /* Set H2W_CLK as input */ - hi->set_clk_dir(0); - - /* Enable H2W interrupt */ - enable_irq(hi->irq); - enable_irq(hi->irq_btn); - set_irq_type(hi->irq_btn, IRQF_TRIGGER_RISING); -} - -/* - * One bit write data - * ________ - * SCLK O ______| |______O(L) - * - * - * SDAT I - */ -static inline void one_clock_write(unsigned short flag) -{ - if (flag) - hi->set_dat(1); - else - hi->set_dat(0); - - udelay(hi->speed); - hi->set_clk(1); - udelay(hi->speed); - hi->set_clk(0); -} - -/* - * One bit write data R/W bit - * ________ - * SCLK ______| |______O(L) - * 1----> 1-----> - * 2-------> ______ - * SDAT I - * O(H/L) - */ -static inline void one_clock_write_RWbit(unsigned short flag) -{ - if (flag) - hi->set_dat(1); - else - hi->set_dat(0); - - udelay(hi->speed); - hi->set_clk(1); - udelay(hi->speed); - hi->set_clk(0); - hi->set_dat_dir(0); - udelay(hi->speed); -} - -/* - * H2W Reset - * ___________ - * SCLK O(L)______| |___O(L) - * 1----> - * 4-->1-->1-->1us--> - * ____ - * SDAT O(L)________ | |_______O(L) - * - * H2w reset command needs to be issued before every access - */ -static inline void h2w_reset(void) -{ - /* Set H2W_DAT as output low */ - hi->set_dat(0); - hi->set_dat_dir(1); - - udelay(hi->speed); - hi->set_clk(1); - udelay(4 * hi->speed); - hi->set_dat(1); - udelay(hi->speed); - hi->set_dat(0); - udelay(hi->speed); - hi->set_clk(0); - udelay(hi->speed); -} - -/* - * H2W Start - * ___________ - * SCLK O(L)______| |___O(L) - * 1----> - * 2----------->1--> - * - * SDAT O(L)______________________O(L) - */ -static inline void h2w_start(void) -{ - udelay(hi->speed); - hi->set_clk(1); - udelay(2 * hi->speed); - hi->set_clk(0); - udelay(hi->speed); -} - -/* - * H2W Ack - * __________ - * SCLK _____| |_______O(L) - * 1----> 1------> - * 2---------> - * ________________________ - * SDAT become Input mode here I - */ -static inline int h2w_ack(void) -{ - int retry_times = 0; - -ack_resend: - if (retry_times == MAX_ACK_RESEND_TIMES) - return -1; - - udelay(hi->speed); - hi->set_clk(1); - udelay(2 * hi->speed); - - if (!hi->get_dat()) { - retry_times++; - hi->set_clk(0); - udelay(hi->speed); - goto ack_resend; - } - - hi->set_clk(0); - udelay(hi->speed); - return 0; -} - -/* - * One bit read data - * ________ - * SCLK ______| |______O(L) - * 2----> 2-----> - * 2-------> - * SDAT I - */ -static unsigned char h2w_readc(void) -{ - unsigned char h2w_read_data = 0x0; - int index; - - for (index = 0; index < 8; index++) { - hi->set_clk(0); - udelay(hi->speed); - hi->set_clk(1); - udelay(hi->speed); - if (hi->get_dat()) - h2w_read_data |= (1 << (7 - index)); - } - hi->set_clk(0); - udelay(hi->speed); - - return h2w_read_data; -} - -static int h2w_readc_cmd(H2W_ADDR address) -{ - int ret = -1, retry_times = 0; - unsigned char read_data; - -read_resend: - if (retry_times == MAX_HOST_RESEND_TIMES) - goto err_read; - - h2w_reset(); - h2w_start(); - /* Write address */ - one_clock_write(address & 0x1000); - one_clock_write(address & 0x0800); - one_clock_write(address & 0x0400); - one_clock_write(address & 0x0200); - one_clock_write(address & 0x0100); - one_clock_write(address & 0x0080); - one_clock_write(address & 0x0040); - one_clock_write(address & 0x0020); - one_clock_write(address & 0x0010); - one_clock_write(address & 0x0008); - one_clock_write(address & 0x0004); - one_clock_write(address & 0x0002); - one_clock_write(address & 0x0001); - one_clock_write_RWbit(1); - if (h2w_ack() < 0) { - H2W_DBG("Addr NO ACK(%d).\n", retry_times); - retry_times++; - hi->set_clk(0); - mdelay(RESEND_DELAY); - goto read_resend; - } - - read_data = h2w_readc(); - - if (h2w_ack() < 0) { - H2W_DBG("Data NO ACK(%d).\n", retry_times); - retry_times++; - hi->set_clk(0); - mdelay(RESEND_DELAY); - goto read_resend; - } - ret = (int)read_data; - -err_read: - if (ret < 0) - H2WE("NO ACK.\n"); - - return ret; -} - -static int h2w_writec_cmd(H2W_ADDR address, unsigned char data) -{ - int ret = -1; - int retry_times = 0; - -write_resend: - if (retry_times == MAX_HOST_RESEND_TIMES) - goto err_write; - - h2w_reset(); - h2w_start(); - - /* Write address */ - one_clock_write(address & 0x1000); - one_clock_write(address & 0x0800); - one_clock_write(address & 0x0400); - one_clock_write(address & 0x0200); - one_clock_write(address & 0x0100); - one_clock_write(address & 0x0080); - one_clock_write(address & 0x0040); - one_clock_write(address & 0x0020); - one_clock_write(address & 0x0010); - one_clock_write(address & 0x0008); - one_clock_write(address & 0x0004); - one_clock_write(address & 0x0002); - one_clock_write(address & 0x0001); - one_clock_write_RWbit(0); - if (h2w_ack() < 0) { - H2W_DBG("Addr NO ACK(%d).\n", retry_times); - retry_times++; - hi->set_clk(0); - mdelay(RESEND_DELAY); - goto write_resend; - } - - /* Write data */ - hi->set_dat_dir(1); - one_clock_write(data & 0x0080); - one_clock_write(data & 0x0040); - one_clock_write(data & 0x0020); - one_clock_write(data & 0x0010); - one_clock_write(data & 0x0008); - one_clock_write(data & 0x0004); - one_clock_write(data & 0x0002); - one_clock_write_RWbit(data & 0x0001); - if (h2w_ack() < 0) { - H2W_DBG("Data NO ACK(%d).\n", retry_times); - retry_times++; - hi->set_clk(0); - mdelay(RESEND_DELAY); - goto write_resend; - } - ret = 0; - -err_write: - if (ret < 0) - H2WE("NO ACK.\n"); - - return ret; -} - -static int h2w_get_fnkey(void) -{ - int ret; - h2w_begin_command(); - ret = h2w_readc_cmd(H2W_FNKEY_UPDOWN); - h2w_end_command(); - return ret; -} - -static int h2w_dev_init(H2W_INFO *ph2w_info) -{ - int ret = -1; - unsigned char ascr0 = 0; - int h2w_sys = 0, maxgpadd = 0, maxadd = 0, key = 0; - - hi->speed = H2W_50KHz; - h2w_begin_command(); - - /* read H2W_SYSTEM */ - h2w_sys = h2w_readc_cmd(H2W_SYSTEM); - if (h2w_sys == -1) { - H2WE("read H2W_SYSTEM(0x0000) failed.\n"); - goto err_plugin; - } - ph2w_info->ACC_CLASS = (h2w_sys & 0x03); - ph2w_info->AUDIO_DEVICE = (h2w_sys & 0x04) > 0 ? 1 : 0; - ph2w_info->HW_REV = (h2w_sys & 0x18) >> 3; - ph2w_info->SLEEP_PR = (h2w_sys & 0x20) >> 5; - ph2w_info->CLK_SP = (h2w_sys & 0xC0) >> 6; - - /* enter init mode */ - if (h2w_writec_cmd(H2W_ASCR0, H2W_ASCR_DEVICE_INI) < 0) { - H2WE("write H2W_ASCR0(0x0002) failed.\n"); - goto err_plugin; - } - udelay(10); - - /* read H2W_MAX_GP_ADD */ - maxgpadd = h2w_readc_cmd(H2W_MAX_GP_ADD); - if (maxgpadd == -1) { - H2WE("write H2W_MAX_GP_ADD(0x0001) failed.\n"); - goto err_plugin; - } - ph2w_info->CLK_SP += (maxgpadd & 0x60) >> 3; - ph2w_info->MAX_GP_ADD = (maxgpadd & 0x1F); - - /* read key group */ - if (ph2w_info->MAX_GP_ADD >= 1) { - ph2w_info->KEY_MAXADD = h2w_readc_cmd(H2W_KEY_MAXADD); - if (ph2w_info->KEY_MAXADD == -1) - goto err_plugin; - if (ph2w_info->KEY_MAXADD >= 1) { - key = h2w_readc_cmd(H2W_ASCII_DOWN); - if (key < 0) - goto err_plugin; - ph2w_info->ASCII_DOWN = (key == 0xFF) ? 1 : 0; - } - if (ph2w_info->KEY_MAXADD >= 2) { - key = h2w_readc_cmd(H2W_ASCII_UP); - if (key == -1) - goto err_plugin; - ph2w_info->ASCII_UP = (key == 0xFF) ? 1 : 0; - } - if (ph2w_info->KEY_MAXADD >= 3) { - key = h2w_readc_cmd(H2W_FNKEY_UPDOWN); - if (key == -1) - goto err_plugin; - ph2w_info->FNKEY_UPDOWN = (key == 0xFF) ? 1 : 0; - } - if (ph2w_info->KEY_MAXADD >= 4) { - key = h2w_readc_cmd(H2W_KD_STATUS); - if (key == -1) - goto err_plugin; - ph2w_info->KD_STATUS = (key == 0x01) ? 1 : 0; - } - } - - /* read led group */ - if (ph2w_info->MAX_GP_ADD >= 2) { - ph2w_info->LED_MAXADD = h2w_readc_cmd(H2W_LED_MAXADD); - if (ph2w_info->LED_MAXADD == -1) - goto err_plugin; - if (ph2w_info->LED_MAXADD >= 1) { - key = h2w_readc_cmd(H2W_LEDCT0); - if (key == -1) - goto err_plugin; - ph2w_info->LEDCT0 = (key == 0x02) ? 1 : 0; - } - } - - /* read group 3, 4, 5 */ - if (ph2w_info->MAX_GP_ADD >= 3) { - maxadd = h2w_readc_cmd(H2W_CRDL_MAXADD); - if (maxadd == -1) - goto err_plugin; - } - if (ph2w_info->MAX_GP_ADD >= 4) { - maxadd = h2w_readc_cmd(H2W_CARKIT_MAXADD); - if (maxadd == -1) - goto err_plugin; - } - if (ph2w_info->MAX_GP_ADD >= 5) { - maxadd = h2w_readc_cmd(H2W_USBHOST_MAXADD); - if (maxadd == -1) - goto err_plugin; - } - - /* read medical group */ - if (ph2w_info->MAX_GP_ADD >= 6) { - ph2w_info->MED_MAXADD = h2w_readc_cmd(H2W_MED_MAXADD); - if (ph2w_info->MED_MAXADD == -1) - goto err_plugin; - if (ph2w_info->MED_MAXADD >= 1) { - key = h2w_readc_cmd(H2W_MED_CONTROL); - if (key == -1) - goto err_plugin; - ph2w_info->DATA_EN = (key & 0x01); - ph2w_info->AP_EN = (key & 0x02) >> 1; - ph2w_info->AP_ID = (key & 0x1c) >> 2; - } - if (ph2w_info->MED_MAXADD >= 2) { - key = h2w_readc_cmd(H2W_MED_IN_DATA); - if (key == -1) - goto err_plugin; - } - } - - if (ph2w_info->AUDIO_DEVICE) - ascr0 = H2W_ASCR_AUDIO_IN | H2W_ASCR_ACT_EN; - else - ascr0 = H2W_ASCR_ACT_EN; - - if (h2w_writec_cmd(H2W_ASCR0, ascr0) < 0) - goto err_plugin; - udelay(10); - - ret = 0; - - /* adjust speed */ - if (ph2w_info->MAX_GP_ADD == 2) { - /* Remote control */ - hi->speed = H2W_250KHz; - } else if (ph2w_info->MAX_GP_ADD == 6) { - if (ph2w_info->MED_MAXADD >= 1) { - key = h2w_readc_cmd(H2W_MED_CONTROL); - if (key == -1) - goto err_plugin; - ph2w_info->DATA_EN = (key & 0x01); - ph2w_info->AP_EN = (key & 0x02) >> 1; - ph2w_info->AP_ID = (key & 0x1c) >> 2; - } - } - -err_plugin: - h2w_end_command(); - - return ret; -} - -static inline void h2w_dev_power_on(int on) -{ - if (!hi->vreg_h2w) - return; - - if (on) - vreg_enable(hi->vreg_h2w); - else - vreg_disable(hi->vreg_h2w); -} - -static int h2w_dev_detect(void) -{ - int ret = -1; - int retry_times; - - for (retry_times = 5; retry_times; retry_times--) { - /* Enable H2W Power */ - h2w_dev_power_on(1); - msleep(100); - memset(&hi->h2w_info, 0, sizeof(H2W_INFO)); - if (h2w_dev_init(&hi->h2w_info) < 0) { - h2w_dev_power_on(0); - msleep(100); - } else if (hi->h2w_info.MAX_GP_ADD == 2) { - ret = 0; - break; - } else { - printk(KERN_INFO "h2w_detect: detect error(%d)\n" - , hi->h2w_info.MAX_GP_ADD); - h2w_dev_power_on(0); - msleep(100); - } - printk(KERN_INFO "h2w_detect(%d)\n" - , hi->h2w_info.MAX_GP_ADD); - } - H2W_DBG("h2w_detect:(%d)\n", retry_times); - return ret; -} - -static void remove_headset(void) -{ - unsigned long irq_flags; - - H2W_DBG(""); - - mutex_lock(&hi->mutex_lock); - switch_set_state(&hi->sdev, switch_get_state(&hi->sdev) & - ~(BIT_HEADSET | BIT_HEADSET_NO_MIC)); - mutex_unlock(&hi->mutex_lock); - hi->init_cpld(); - - /* Disable button */ - switch (hi->htc_headset_flag) { - case H2W_HTC_HEADSET: - local_irq_save(irq_flags); - disable_irq(hi->irq_btn); - local_irq_restore(irq_flags); - - if (atomic_read(&hi->btn_state)) - button_released(); - break; - case H2W_DEVICE: - h2w_dev_power_on(0); - set_irq_type(hi->irq_btn, IRQF_TRIGGER_LOW); - disable_irq(hi->irq_btn); - /* 10ms (5-15 with 10ms tick) */ - hi->btn_debounce_time = ktime_set(0, 10000000); - hi->set_clk_dir(0); - hi->set_dat_dir(0); - break; - } - - hi->htc_headset_flag = 0; - hi->debounce_time = ktime_set(0, 100000000); /* 100 ms */ - -} - -#ifdef CONFIG_MSM_SERIAL_DEBUGGER -extern void msm_serial_debug_enable(int); -#endif - -static void insert_headset(int type) -{ - unsigned long irq_flags; - int state; - - H2W_DBG(""); - - hi->htc_headset_flag = type; - state = BIT_HEADSET | BIT_HEADSET_NO_MIC; - - state = switch_get_state(&hi->sdev); - state &= ~(BIT_HEADSET_NO_MIC | BIT_HEADSET); - switch (type) { - case H2W_HTC_HEADSET: - printk(KERN_INFO "insert_headset H2W_HTC_HEADSET\n"); - state |= BIT_HEADSET; - hi->ignore_btn = !gpio_get_value(hi->cable_in2); - /* Enable button irq */ - local_irq_save(irq_flags); - enable_irq(hi->irq_btn); - local_irq_restore(irq_flags); - hi->debounce_time = ktime_set(0, 200000000); /* 20 ms */ - break; - case H2W_DEVICE: - if (h2w_dev_detect() < 0) { - printk(KERN_INFO "H2W_DEVICE -- Non detect\n"); - remove_headset(); - } else { - printk(KERN_INFO "H2W_DEVICE -- detect\n"); - hi->btn_debounce_time = ktime_set(0, 0); - local_irq_save(irq_flags); - enable_irq(hi->irq_btn); - set_irq_type(hi->irq_btn, IRQF_TRIGGER_RISING); - local_irq_restore(irq_flags); - state |= BIT_HEADSET; - } - break; - case H2W_USB_CRADLE: - state |= BIT_HEADSET_NO_MIC; - break; - case H2W_UART_DEBUG: - hi->config_cpld(hi->debug_uart); - printk(KERN_INFO "switch to H2W_UART_DEBUG\n"); - default: - return; - } - mutex_lock(&hi->mutex_lock); - switch_set_state(&hi->sdev, state); - mutex_unlock(&hi->mutex_lock); - -#ifdef CONFIG_MSM_SERIAL_DEBUGGER - msm_serial_debug_enable(false); -#endif - -} -#if 0 -static void remove_headset(void) -{ - unsigned long irq_flags; - - H2W_DBG(""); - - switch_set_state(&hi->sdev, H2W_NO_DEVICE); - - hi->init_cpld(); - - /* Disable button */ - local_irq_save(irq_flags); - disable_irq(hi->irq_btn); - local_irq_restore(irq_flags); - - if (atomic_read(&hi->btn_state)) - button_released(); - - hi->debounce_time = ktime_set(0, 100000000); /* 100 ms */ -} -#endif -static int is_accessary_pluged_in(void) -{ - int type = 0; - int clk1 = 0, dat1 = 0, clk2 = 0, dat2 = 0, clk3 = 0, dat3 = 0; - - /* Step1: save H2W_CLK and H2W_DAT */ - /* Delay 10ms for pin stable. */ - msleep(10); - clk1 = gpio_get_value(hi->h2w_clk); - dat1 = gpio_get_value(hi->h2w_data); - - /* - * Step2: set GPIO_CABLE_IN1 as output high and GPIO_CABLE_IN2 as - * input - */ - gpio_direction_output(hi->cable_in1, 1); - gpio_direction_input(hi->cable_in2); - /* Delay 10ms for pin stable. */ - msleep(10); - /* Step 3: save H2W_CLK and H2W_DAT */ - clk2 = gpio_get_value(hi->h2w_clk); - dat2 = gpio_get_value(hi->h2w_data); - - /* - * Step 4: set GPIO_CABLE_IN1 as input and GPIO_CABLE_IN2 as output - * high - */ - gpio_direction_input(hi->cable_in1); - gpio_direction_output(hi->cable_in2, 1); - /* Delay 10ms for pin stable. */ - msleep(10); - /* Step 5: save H2W_CLK and H2W_DAT */ - clk3 = gpio_get_value(hi->h2w_clk); - dat3 = gpio_get_value(hi->h2w_data); - - /* Step 6: set both GPIO_CABLE_IN1 and GPIO_CABLE_IN2 as input */ - gpio_direction_input(hi->cable_in1); - gpio_direction_input(hi->cable_in2); - - H2W_DBG("(%d,%d) (%d,%d) (%d,%d)\n", - clk1, dat1, clk2, dat2, clk3, dat3); - - if ((clk1 == 0) && (dat1 == 1) && - (clk2 == 0) && (dat2 == 1) && - (clk3 == 0) && (dat3 == 1)) - type = H2W_HTC_HEADSET; - else if ((clk1 == 0) && (dat1 == 0) && - (clk2 == 0) && (dat2 == 0) && - (clk3 == 0) && (dat3 == 0)) - type = NORMAL_HEARPHONE; - else if ((clk1 == 0) && (dat1 == 0) && - (clk2 == 1) && (dat2 == 0) && - (clk3 == 0) && (dat3 == 1)) - type = H2W_DEVICE; - else if ((clk1 == 0) && (dat1 == 0) && - (clk2 == 1) && (dat2 == 1) && - (clk3 == 1) && (dat3 == 1)) - type = H2W_USB_CRADLE; - else if ((clk1 == 0) && (dat1 == 1) && - (clk2 == 1) && (dat2 == 1) && - (clk3 == 0) && (dat3 == 1)) - type = H2W_UART_DEBUG; - else - type = H2W_NO_DEVICE; - - return type; -} - - -static void detection_work(struct work_struct *work) -{ - unsigned long irq_flags; - int type; - - H2W_DBG(""); - - if (gpio_get_value(hi->cable_in1) != 0) { - /* Headset not plugged in */ - if (switch_get_state(&hi->sdev) != H2W_NO_DEVICE) - remove_headset(); - return; - } - - /* Something plugged in, lets make sure its a headset */ - - /* Switch CPLD to GPIO to do detection */ - hi->config_cpld(H2W_GPIO); - - /* Disable headset interrupt while detecting.*/ - local_irq_save(irq_flags); - disable_irq(hi->irq); - local_irq_restore(irq_flags); - - /* Something plugged in, lets make sure its a headset */ - type = is_accessary_pluged_in(); - - /* Restore IRQs */ - local_irq_save(irq_flags); - enable_irq(hi->irq); - local_irq_restore(irq_flags); - - insert_headset(type); -} - -static enum hrtimer_restart button_event_timer_func(struct hrtimer *data) -{ - int key, press, keyname, h2w_key = 1; - - H2W_DBG(""); - - if (switch_get_state(&hi->sdev) == H2W_HTC_HEADSET) { - switch (hi->htc_headset_flag) { - case H2W_HTC_HEADSET: - if (gpio_get_value(hi->cable_in2)) { - if (hi->ignore_btn) - hi->ignore_btn = 0; - else if (atomic_read(&hi->btn_state)) - button_released(); - } else { - if (!hi->ignore_btn && - !atomic_read(&hi->btn_state)) - button_pressed(); - } - break; - case H2W_DEVICE: - if ((hi->get_dat() == 1) && (hi->get_clk() == 1)) { - /* Don't do anything because H2W pull out. */ - H2WE("Remote Control pull out.\n"); - } else { - key = h2w_get_fnkey(); - press = (key > 0x7F) ? 0 : 1; - keyname = key & 0x7F; - /* H2WI("key = %d, press = %d, - keyname = %d \n", - key, press, keyname); */ - switch (keyname) { - case H2W_KEY_PLAY: - H2WI("H2W_KEY_PLAY"); - key = KEY_PLAYPAUSE; - break; - case H2W_KEY_FORWARD: - H2WI("H2W_KEY_FORWARD"); - key = KEY_NEXTSONG; - break; - case H2W_KEY_BACKWARD: - H2WI("H2W_KEY_BACKWARD"); - key = KEY_PREVIOUSSONG; - break; - case H2W_KEY_VOLUP: - H2WI("H2W_KEY_VOLUP"); - key = KEY_VOLUMEUP; - break; - case H2W_KEY_VOLDOWN: - H2WI("H2W_KEY_VOLDOWN"); - key = KEY_VOLUMEDOWN; - break; - case H2W_KEY_PICKUP: - H2WI("H2W_KEY_PICKUP"); - key = KEY_SEND; - break; - case H2W_KEY_HANGUP: - H2WI("H2W_KEY_HANGUP"); - key = KEY_END; - break; - case H2W_KEY_MUTE: - H2WI("H2W_KEY_MUTE"); - key = KEY_MUTE; - break; - case H2W_KEY_HOLD: - H2WI("H2W_KEY_HOLD"); - break; - default: - H2WI("default"); - h2w_key = 0; - } - if (h2w_key) { - if (press) - H2WI("Press\n"); - else - H2WI("Release\n"); - input_report_key(hi->input, key, press); - } - } - break; - } /* end switch */ - } - - return HRTIMER_NORESTART; -} - -static enum hrtimer_restart detect_event_timer_func(struct hrtimer *data) -{ - H2W_DBG(""); - - queue_work(g_detection_work_queue, &g_detection_work); - return HRTIMER_NORESTART; -} - -static irqreturn_t detect_irq_handler(int irq, void *dev_id) -{ - int value1, value2; - int retry_limit = 10; - - H2W_DBG(""); - set_irq_type(hi->irq_btn, IRQF_TRIGGER_LOW); - do { - value1 = gpio_get_value(hi->cable_in1); - set_irq_type(hi->irq, value1 ? - IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - value2 = gpio_get_value(hi->cable_in1); - } while (value1 != value2 && retry_limit-- > 0); - - H2W_DBG("value2 = %d (%d retries), device=%d", - value2, (10-retry_limit), switch_get_state(&hi->sdev)); - - if ((switch_get_state(&hi->sdev) == H2W_NO_DEVICE) ^ value2) { - if (switch_get_state(&hi->sdev) == H2W_HTC_HEADSET) - hi->ignore_btn = 1; - /* Do the rest of the work in timer context */ - hrtimer_start(&hi->timer, hi->debounce_time, HRTIMER_MODE_REL); - } - - return IRQ_HANDLED; -} - -static irqreturn_t button_irq_handler(int irq, void *dev_id) -{ - int value1, value2; - int retry_limit = 10; - - H2W_DBG(""); - do { - value1 = gpio_get_value(hi->cable_in2); - if (hi->htc_headset_flag != H2W_DEVICE) - set_irq_type(hi->irq_btn, value1 ? - IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); - value2 = gpio_get_value(hi->cable_in2); - } while (value1 != value2 && retry_limit-- > 0); - - H2W_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); - - hrtimer_start(&hi->btn_timer, hi->btn_debounce_time, HRTIMER_MODE_REL); - - return IRQ_HANDLED; -} - -#if defined(CONFIG_DEBUG_FS) -static int h2w_debug_set(void *data, u64 val) -{ - mutex_lock(&hi->mutex_lock); - switch_set_state(&hi->sdev, (int)val); - mutex_unlock(&hi->mutex_lock); - return 0; -} - -static int h2w_debug_get(void *data, u64 *val) -{ - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(h2w_debug_fops, h2w_debug_get, h2w_debug_set, "%llu\n"); -static int __init h2w_debug_init(void) -{ - struct dentry *dent; - - dent = debugfs_create_dir("h2w", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("state", 0644, dent, NULL, &h2w_debug_fops); - - return 0; -} - -device_initcall(h2w_debug_init); -#endif - -static int h2w_probe(struct platform_device *pdev) -{ - int ret; - struct h2w_platform_data *pdata = pdev->dev.platform_data; - - printk(KERN_INFO "H2W: Registering H2W (headset) driver\n"); - hi = kzalloc(sizeof(struct h2w_info), GFP_KERNEL); - if (!hi) - return -ENOMEM; - - atomic_set(&hi->btn_state, 0); - hi->ignore_btn = 0; - - hi->debounce_time = ktime_set(0, 100000000); /* 100 ms */ - hi->btn_debounce_time = ktime_set(0, 10000000); /* 10 ms */ - - hi->htc_headset_flag = 0; - hi->cable_in1 = pdata->cable_in1; - hi->cable_in2 = pdata->cable_in2; - hi->h2w_clk = pdata->h2w_clk; - hi->h2w_data = pdata->h2w_data; - hi->debug_uart = pdata->debug_uart; - hi->config_cpld = pdata->config_cpld; - hi->init_cpld = pdata->init_cpld; - hi->set_dat = pdata->set_dat; - hi->set_clk = pdata->set_clk; - hi->set_dat_dir = pdata->set_dat_dir; - hi->set_clk_dir = pdata->set_clk_dir; - hi->get_dat = pdata->get_dat; - hi->get_clk = pdata->get_clk; - hi->speed = H2W_50KHz; - /* obtain needed VREGs */ - if (pdata->power_name) - hi->vreg_h2w = vreg_get(0, pdata->power_name); - - mutex_init(&hi->mutex_lock); - - hi->sdev.name = "h2w"; - hi->sdev.print_name = h2w_print_name; - - ret = switch_dev_register(&hi->sdev); - if (ret < 0) - goto err_switch_dev_register; - - g_detection_work_queue = create_workqueue("detection"); - if (g_detection_work_queue == NULL) { - ret = -ENOMEM; - goto err_create_work_queue; - } - - ret = gpio_request(hi->cable_in1, "h2w_detect"); - if (ret < 0) - goto err_request_detect_gpio; - - ret = gpio_request(hi->cable_in2, "h2w_button"); - if (ret < 0) - goto err_request_button_gpio; - - ret = gpio_direction_input(hi->cable_in1); - if (ret < 0) - goto err_set_detect_gpio; - - ret = gpio_direction_input(hi->cable_in2); - if (ret < 0) - goto err_set_button_gpio; - - hi->irq = gpio_to_irq(hi->cable_in1); - if (hi->irq < 0) { - ret = hi->irq; - goto err_get_h2w_detect_irq_num_failed; - } - - hi->irq_btn = gpio_to_irq(hi->cable_in2); - if (hi->irq_btn < 0) { - ret = hi->irq_btn; - goto err_get_button_irq_num_failed; - } - - /* Set CPLD MUX to H2W <-> CPLD GPIO */ - hi->init_cpld(); - - hrtimer_init(&hi->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - hi->timer.function = detect_event_timer_func; - hrtimer_init(&hi->btn_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - hi->btn_timer.function = button_event_timer_func; - - ret = request_irq(hi->irq, detect_irq_handler, - IRQF_TRIGGER_LOW, "h2w_detect", NULL); - if (ret < 0) - goto err_request_detect_irq; - - /* Disable button until plugged in */ - set_irq_flags(hi->irq_btn, IRQF_VALID | IRQF_NOAUTOEN); - ret = request_irq(hi->irq_btn, button_irq_handler, - IRQF_TRIGGER_LOW, "h2w_button", NULL); - if (ret < 0) - goto err_request_h2w_headset_button_irq; - - ret = set_irq_wake(hi->irq, 1); - if (ret < 0) - goto err_request_input_dev; - - ret = set_irq_wake(hi->irq_btn, 1); - if (ret < 0) - goto err_request_input_dev; - - - - hi->input = input_allocate_device(); - if (!hi->input) { - ret = -ENOMEM; - goto err_request_input_dev; - } - - hi->input->name = "h2w headset"; - set_bit(EV_SYN, hi->input->evbit); - set_bit(EV_KEY, hi->input->evbit); - set_bit(KEY_MEDIA, hi->input->keybit); - set_bit(KEY_NEXTSONG, hi->input->keybit); - set_bit(KEY_PLAYPAUSE, hi->input->keybit); - set_bit(KEY_PREVIOUSSONG, hi->input->keybit); - set_bit(KEY_MUTE, hi->input->keybit); - set_bit(KEY_VOLUMEUP, hi->input->keybit); - set_bit(KEY_VOLUMEDOWN, hi->input->keybit); - set_bit(KEY_END, hi->input->keybit); - set_bit(KEY_SEND, hi->input->keybit); - - ret = input_register_device(hi->input); - if (ret < 0) - goto err_register_input_dev; - - return 0; - -err_register_input_dev: - input_free_device(hi->input); -err_request_input_dev: - free_irq(hi->irq_btn, 0); -err_request_h2w_headset_button_irq: - free_irq(hi->irq, 0); -err_request_detect_irq: -err_get_button_irq_num_failed: -err_get_h2w_detect_irq_num_failed: -err_set_button_gpio: -err_set_detect_gpio: - gpio_free(hi->cable_in2); -err_request_button_gpio: - gpio_free(hi->cable_in1); -err_request_detect_gpio: - destroy_workqueue(g_detection_work_queue); -err_create_work_queue: - switch_dev_unregister(&hi->sdev); -err_switch_dev_register: - printk(KERN_ERR "H2W: Failed to register driver\n"); - - return ret; -} - -static int h2w_remove(struct platform_device *pdev) -{ - H2W_DBG(""); - if (switch_get_state(&hi->sdev)) - remove_headset(); - input_unregister_device(hi->input); - gpio_free(hi->cable_in2); - gpio_free(hi->cable_in1); - free_irq(hi->irq_btn, 0); - free_irq(hi->irq, 0); - destroy_workqueue(g_detection_work_queue); - switch_dev_unregister(&hi->sdev); - - return 0; -} - - -static struct platform_driver h2w_driver = { - .probe = h2w_probe, - .remove = h2w_remove, - .driver = { - .name = "h2w", - .owner = THIS_MODULE, - }, -}; - -static int __init h2w_init(void) -{ - H2W_DBG(""); - return platform_driver_register(&h2w_driver); -} - -static void __exit h2w_exit(void) -{ - platform_driver_unregister(&h2w_driver); -} - -module_init(h2w_init); -module_exit(h2w_exit); - -MODULE_AUTHOR("Laurence Chen "); -MODULE_DESCRIPTION("HTC 2 Wire detection driver"); -MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/htc_power_supply.c b/arch/arm/mach-msm/htc_power_supply.c deleted file mode 100644 index bd286c9f3a8b..000000000000 --- a/arch/arm/mach-msm/htc_power_supply.c +++ /dev/null @@ -1,616 +0,0 @@ -/* arch/arm/mach-msm/htc_battery.c - * - * Copyright (C) 2008 HTC Corporation. - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "board-mahimahi.h" - -extern void notify_usb_connected(int); - -static char *supply_list[] = { - "battery", -}; - -static struct switch_dev dock_switch = { - .name = "dock", -}; - -static int vbus_present; -static int usb_status; -static bool dock_mains; - -struct dock_state { - struct mutex lock; - u32 t; - u32 last_edge_t[2]; - u32 last_edge_i[2]; - bool level; - bool dock_connected_unknown; -}; - -static struct workqueue_struct *dock_wq; -static struct work_struct dock_work; -static struct wake_lock dock_work_wake_lock; -static struct dock_state ds = { - .lock = __MUTEX_INITIALIZER(ds.lock), -}; - -#define _GPIO_DOCK MAHIMAHI_GPIO_DOCK - -#define dock_out(n) gpio_direction_output(_GPIO_DOCK, n) -#define dock_out2(n) gpio_set_value(_GPIO_DOCK, n) -#define dock_in() gpio_direction_input(_GPIO_DOCK) -#define dock_read() gpio_get_value(_GPIO_DOCK) - -#define MFM_DELAY_NS 10000 - -static int dock_get_edge(struct dock_state *s, u32 timeout, u32 tmin, u32 tmax) -{ - bool lin; - bool in = s->level; - u32 t; - do { - lin = in; - in = dock_read(); - t = msm_read_fast_timer(); - if (in != lin) { - s->last_edge_t[in] = t; - s->last_edge_i[in] = 0; - s->level = in; - if ((s32)(t - tmin) < 0 || (s32)(t - tmax) > 0) - return -1; - return 1; - } - } while((s32)(t - timeout) < 0); - return 0; -} - -static bool dock_sync(struct dock_state *s, u32 timeout) -{ - u32 t; - - s->level = dock_read(); - t = msm_read_fast_timer(); - - if (!dock_get_edge(s, t + timeout, 0, 0)) - return false; - s->last_edge_i[s->level] = 2; - return !!dock_get_edge(s, - s->last_edge_t[s->level] + MFM_DELAY_NS * 4, 0, 0); -} - -static int dock_get_next_bit(struct dock_state *s) -{ - u32 i = s->last_edge_i[!s->level] + ++s->last_edge_i[s->level]; - u32 target = s->last_edge_t[!s->level] + MFM_DELAY_NS * i; - u32 timeout = target + MFM_DELAY_NS / 2; - u32 tmin = target - MFM_DELAY_NS / 4; - u32 tmax = target + MFM_DELAY_NS / 4; - return dock_get_edge(s, timeout, tmin, tmax); -} - -static u32 dock_get_bits(struct dock_state *s, int count, int *errp) -{ - u32 data = 0; - u32 m = 1; - int ret; - int err = 0; - while (count--) { - ret = dock_get_next_bit(s); - if (ret) - data |= m; - if (ret < 0) - err++; - m <<= 1; - } - if (errp) - *errp = err; - return data; -} - -static void dock_delay(u32 timeout) -{ - timeout += msm_read_fast_timer(); - while (((s32)(msm_read_fast_timer() - timeout)) < 0) - ; -} - -static int dock_send_bits(struct dock_state *s, u32 data, int count, int period) -{ - u32 t, t0, to; - - dock_out2(s->level); - t = to = 0; - t0 = msm_read_fast_timer(); - - while (count--) { - if (data & 1) - dock_out2((s->level = !s->level)); - - t = msm_read_fast_timer() - t0; - if (t - to > period / 2) { - pr_info("dock: to = %d, t = %d\n", to, t); - return -EIO; - } - - to += MFM_DELAY_NS; - do { - t = msm_read_fast_timer() - t0; - } while (t < to); - if (t - to > period / 4) { - pr_info("dock: to = %d, t = %d\n", to, t); - return -EIO; - } - data >>= 1; - } - return 0; -} - -static u32 mfm_encode(u16 data, int count, bool p) -{ - u32 mask; - u32 mfm = 0; - u32 clock = ~data & ~(data << 1 | !!p); - for (mask = 1UL << (count - 1); mask; mask >>= 1) { - mfm |= (data & mask); - mfm <<= 1; - mfm |= (clock & mask); - } - return mfm; -} - -static u32 mfm_decode(u32 mfm) -{ - u32 data = 0; - u32 clock = 0; - u32 mask = 1; - while (mfm) { - if (mfm & 1) - clock |= mask; - mfm >>= 1; - if (mfm & 1) - data |= mask; - mfm >>= 1; - mask <<= 1; - } - return data; -} - -static int dock_command(struct dock_state *s, u16 cmd, int len, int retlen) -{ - u32 mfm; - int count; - u32 data = cmd; - int ret; - int err = -1; - unsigned long flags; - - data = data << 2 | 3; /* add 0101 mfm data*/ - mfm = mfm_encode(data, len, false); - count = len * 2 + 2; - - msm_enable_fast_timer(); - local_irq_save(flags); - ret = dock_send_bits(s, mfm, count, MFM_DELAY_NS); - if (!ret) { - dock_in(); - if (dock_sync(s, MFM_DELAY_NS * 5)) - ret = dock_get_bits(s, retlen * 2, &err); - else - ret = -1; - dock_out(s->level); - } - local_irq_restore(flags); - - dock_delay((ret < 0) ? MFM_DELAY_NS * 6 : MFM_DELAY_NS * 2); - msm_disable_fast_timer(); - if (ret < 0) { - pr_warning("dock_command: %x: no response\n", cmd); - return ret; - } - data = mfm_decode(ret); - mfm = mfm_encode(data, retlen, true); - if (mfm != ret || err) { - pr_warning("dock_command: %x: bad response, " - "data %x, mfm %x %x, err %d\n", - cmd, data, mfm, ret, err); - return -EIO; - } - return data; -} - -static int dock_command_retry(struct dock_state *s, u16 cmd, size_t len, size_t retlen) -{ - int retry = 20; - int ret; - while (retry--) { - ret = dock_command(s, cmd, len, retlen); - if (ret >= 0) - return ret; - if (retry != 19) - msleep(10); - } - s->dock_connected_unknown = true; - return -EIO; -} - -static int dock_read_single(struct dock_state *s, int addr) -{ - int ret = -1, last; - int retry = 20; - while (retry--) { - last = ret; - ret = dock_command_retry(s, addr << 1, 6, 8); - if (ret < 0 || ret == last) - return ret; - } - return -EIO; -} - -static int dock_read_multi(struct dock_state *s, int addr, u8 *data, size_t len) -{ - int ret; - int i; - u8 suml, sumr = -1; - int retry = 20; - while (retry--) { - suml = 0; - for (i = 0; i <= len; i++) { - ret = dock_command_retry(s, (addr + i) << 1, 6, 8); - if (ret < 0) - return ret; - if (i < len) { - data[i] = ret; - suml += ret; - } else - sumr = ret; - } - if (sumr == suml) - return 0; - - pr_warning("dock_read_multi(%x): bad checksum, %x != %x\n", - addr, sumr, suml); - } - return -EIO; -} - -static int dock_write_byte(struct dock_state *s, int addr, u8 data) -{ - return dock_command_retry(s, 1 | addr << 1 | data << 4, 6 + 8, 1); -} - -static int dock_write_multi(struct dock_state *s, int addr, u8 *data, size_t len) -{ - int ret; - int i; - u8 sum; - int retry = 2; - while (retry--) { - sum = 0; - for (i = 0; i < len; i++) { - sum += data[i]; - ret = dock_write_byte(s, addr + i, data[i]); - if (ret < 0) - return ret; - } - ret = dock_write_byte(s, addr + len, sum); - if (ret <= 0) - return ret; - } - return -EIO; -} - -static int dock_acquire(struct dock_state *s) -{ - mutex_lock(&s->lock); - dock_in(); - if (dock_read()) { - /* Allow some time for the dock pull-down resistor to discharge - * the capasitor. - */ - msleep(20); - if (dock_read()) { - mutex_unlock(&s->lock); - return -ENOENT; - } - } - dock_out(0); - s->level = false; - return 0; -} - -static void dock_release(struct dock_state *s) -{ - dock_in(); - mutex_unlock(&s->lock); -} - -enum { - DOCK_TYPE = 0x0, - DOCK_BT_ADDR = 0x1, /* - 0x7 */ - - DOCK_PIN_CODE = 0x0, -}; - -static ssize_t bt_addr_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - int ret; - u8 bt_addr[6]; - - ret = dock_acquire(&ds); - if (ret < 0) - return ret; - ret = dock_read_multi(&ds, DOCK_BT_ADDR, bt_addr, 6); - dock_release(&ds); - if (ret < 0) - return ret; - - return sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n", - bt_addr[0], bt_addr[1], bt_addr[2], - bt_addr[3], bt_addr[4], bt_addr[5]); -} -static DEVICE_ATTR(bt_addr, S_IRUGO | S_IWUSR, bt_addr_show, NULL); - -static ssize_t bt_pin_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t size) -{ - int ret, i; - u8 pin[4]; - - if (size < 4) - return -EINVAL; - - for (i = 0; i < sizeof(pin); i++) { - if ((pin[i] = buf[i] - '0') > 10) - return -EINVAL; - } - - ret = dock_acquire(&ds); - if (ret < 0) - return ret; - ret = dock_write_multi(&ds, DOCK_PIN_CODE, pin, 4); - dock_release(&ds); - if (ret < 0) - return ret; - - return size; -} -static DEVICE_ATTR(bt_pin, S_IRUGO | S_IWUSR, NULL, bt_pin_store); - - -static int power_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val) -{ - if (psp != POWER_SUPPLY_PROP_ONLINE) - return -EINVAL; - - if (psy->type == POWER_SUPPLY_TYPE_MAINS) - val->intval = (vbus_present && (usb_status == 2 || dock_mains)); - else - val->intval = vbus_present; - return 0; -} - -static enum power_supply_property power_properties[] = { - POWER_SUPPLY_PROP_ONLINE, -}; - -static struct power_supply ac_supply = { - .name = "ac", - .type = POWER_SUPPLY_TYPE_MAINS, - .supplied_to = supply_list, - .num_supplicants = ARRAY_SIZE(supply_list), - .properties = power_properties, - .num_properties = ARRAY_SIZE(power_properties), - .get_property = power_get_property, -}; - -static struct power_supply usb_supply = { - .name = "usb", - .type = POWER_SUPPLY_TYPE_USB, - .supplied_to = supply_list, - .num_supplicants = ARRAY_SIZE(supply_list), - .properties = power_properties, - .num_properties = ARRAY_SIZE(power_properties), - .get_property = power_get_property, -}; - -/* rpc related */ -#define APP_BATT_PDEV_NAME "rs30100001:00000000" -#define APP_BATT_PROG 0x30100001 -#define APP_BATT_VER MSM_RPC_VERS(0,0) -#define HTC_PROCEDURE_BATTERY_NULL 0 -#define HTC_PROCEDURE_GET_BATT_LEVEL 1 -#define HTC_PROCEDURE_GET_BATT_INFO 2 -#define HTC_PROCEDURE_GET_CABLE_STATUS 3 -#define HTC_PROCEDURE_SET_BATT_DELTA 4 - -static struct msm_rpc_endpoint *endpoint; - -struct battery_info_reply { - u32 batt_id; /* Battery ID from ADC */ - u32 batt_vol; /* Battery voltage from ADC */ - u32 batt_temp; /* Battery Temperature (C) from formula and ADC */ - u32 batt_current; /* Battery current from ADC */ - u32 level; /* formula */ - u32 charging_source; /* 0: no cable, 1:usb, 2:AC */ - u32 charging_enabled; /* 0: Disable, 1: Enable */ - u32 full_bat; /* Full capacity of battery (mAh) */ -}; - -static void dock_work_proc(struct work_struct *work) -{ - int dockid; - - if (!vbus_present || dock_acquire(&ds)) - goto no_dock; - - if (ds.dock_connected_unknown) { - /* force a new dock notification if a command failed */ - switch_set_state(&dock_switch, 0); - ds.dock_connected_unknown = false; - } - - dockid = dock_read_single(&ds, DOCK_TYPE); - dock_release(&ds); - - pr_info("Detected dock with ID %02x\n", dockid); - if (dockid >= 0) { - msm_hsusb_set_vbus_state(0); - dock_mains = !!(dockid & 0x80); - switch_set_state(&dock_switch, (dockid & 1) ? 2 : 1); - goto done; - } -no_dock: - dock_mains = false; - switch_set_state(&dock_switch, 0); - msm_hsusb_set_vbus_state(vbus_present); -done: - power_supply_changed(&ac_supply); - power_supply_changed(&usb_supply); - wake_unlock(&dock_work_wake_lock); -} - -static int htc_battery_probe(struct platform_device *pdev) -{ - struct rpc_request_hdr req; - struct htc_get_batt_info_rep { - struct rpc_reply_hdr hdr; - struct battery_info_reply info; - } rep; - - int rc; - - endpoint = msm_rpc_connect(APP_BATT_PROG, APP_BATT_VER, 0); - if (IS_ERR(endpoint)) { - printk(KERN_ERR "%s: init rpc failed! rc = %ld\n", - __FUNCTION__, PTR_ERR(endpoint)); - return PTR_ERR(endpoint); - } - - /* must do this or we won't get cable status updates */ - rc = msm_rpc_call_reply(endpoint, HTC_PROCEDURE_GET_BATT_INFO, - &req, sizeof(req), - &rep, sizeof(rep), - 5 * HZ); - if (rc < 0) - printk(KERN_ERR "%s: get info failed\n", __FUNCTION__); - - power_supply_register(&pdev->dev, &ac_supply); - power_supply_register(&pdev->dev, &usb_supply); - - INIT_WORK(&dock_work, dock_work_proc); - dock_wq = create_singlethread_workqueue("dock"); - - return 0; -} - -static struct platform_driver htc_battery_driver = { - .probe = htc_battery_probe, - .driver = { - .name = APP_BATT_PDEV_NAME, - .owner = THIS_MODULE, - }, -}; - -/* batt_mtoa server definitions */ -#define BATT_MTOA_PROG 0x30100000 -#define BATT_MTOA_VERS 0 -#define RPC_BATT_MTOA_NULL 0 -#define RPC_BATT_MTOA_SET_CHARGING_PROC 1 -#define RPC_BATT_MTOA_CABLE_STATUS_UPDATE_PROC 2 -#define RPC_BATT_MTOA_LEVEL_UPDATE_PROC 3 - -struct rpc_batt_mtoa_cable_status_update_args { - int status; -}; - -static int handle_battery_call(struct msm_rpc_server *server, - struct rpc_request_hdr *req, unsigned len) -{ - struct rpc_batt_mtoa_cable_status_update_args *args; - - if (req->procedure != RPC_BATT_MTOA_CABLE_STATUS_UPDATE_PROC) - return 0; - - args = (struct rpc_batt_mtoa_cable_status_update_args *)(req + 1); - args->status = be32_to_cpu(args->status); - pr_info("cable_status_update: status=%d\n",args->status); - - args->status = !!args->status; - - vbus_present = args->status; - wake_lock(&dock_work_wake_lock); - queue_work(dock_wq, &dock_work); - return 0; -} - -void notify_usb_connected(int status) -{ - printk("### notify_usb_connected(%d) ###\n", status); - usb_status = status; - power_supply_changed(&ac_supply); - power_supply_changed(&usb_supply); -} - -int is_ac_power_supplied(void) -{ - return vbus_present && (usb_status == 2 || dock_mains); -} - -static struct msm_rpc_server battery_server = { - .prog = BATT_MTOA_PROG, - .vers = BATT_MTOA_VERS, - .rpc_call = handle_battery_call, -}; - -static int __init htc_battery_init(void) -{ - int ret; - gpio_request(_GPIO_DOCK, "dock"); - dock_in(); - wake_lock_init(&dock_work_wake_lock, WAKE_LOCK_SUSPEND, "dock"); - platform_driver_register(&htc_battery_driver); - msm_rpc_create_server(&battery_server); - if (switch_dev_register(&dock_switch) == 0) { - ret = device_create_file(dock_switch.dev, &dev_attr_bt_addr); - WARN_ON(ret); - ret = device_create_file(dock_switch.dev, &dev_attr_bt_pin); - WARN_ON(ret); - } - - return 0; -} - -module_init(htc_battery_init); -MODULE_DESCRIPTION("HTC Battery Driver"); -MODULE_LICENSE("GPL"); - diff --git a/arch/arm/mach-msm/htc_pwrsink.c b/arch/arm/mach-msm/htc_pwrsink.c deleted file mode 100644 index 2ec2c7f4bb1b..000000000000 --- a/arch/arm/mach-msm/htc_pwrsink.c +++ /dev/null @@ -1,281 +0,0 @@ -/* arch/arm/mach-msm/htc_pwrsink.c - * - * Copyright (C) 2008 HTC Corporation - * Copyright (C) 2008 Google, Inc. - * Author: San Mehat - * Kant Kang - * Eiven Peng - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "smd_private.h" - -enum { - PWRSINK_DEBUG_CURR_CHANGE = 1U << 0, - PWRSINK_DEBUG_CURR_CHANGE_AUDIO = 1U << 1, -}; -static int pwrsink_debug_mask; -module_param_named(debug_mask, pwrsink_debug_mask, int, - S_IRUGO | S_IWUSR | S_IWGRP); - -static int initialized; -static unsigned audio_path = 1; /* HTC_SND_DEVICE_SPEAKER = 1 */ -static struct pwr_sink_audio audio_sink_array[PWRSINK_AUDIO_LAST + 1]; -static struct pwr_sink *sink_array[PWRSINK_LAST + 1]; -static DEFINE_SPINLOCK(sink_lock); -static DEFINE_SPINLOCK(audio_sink_lock); -static unsigned long total_sink; -static uint32_t *smem_total_sink; - -int htc_pwrsink_set(pwrsink_id_type id, unsigned percent_utilized) -{ - unsigned long flags; - - if (!smem_total_sink) - smem_total_sink = smem_alloc(SMEM_ID_VENDOR0, sizeof(uint32_t)); - - if (!initialized) - return -EAGAIN; - - if (id < 0 || id > PWRSINK_LAST) - return -EINVAL; - - spin_lock_irqsave(&sink_lock, flags); - - if (!sink_array[id]) { - spin_unlock_irqrestore(&sink_lock, flags); - return -ENOENT; - } - - if (sink_array[id]->percent_util == percent_utilized) { - spin_unlock_irqrestore(&sink_lock, flags); - return 0; - } - - total_sink -= (sink_array[id]->ua_max * - sink_array[id]->percent_util / 100); - sink_array[id]->percent_util = percent_utilized; - total_sink += (sink_array[id]->ua_max * - sink_array[id]->percent_util / 100); - - if (smem_total_sink) - *smem_total_sink = total_sink / 1000; - - pr_debug("htc_pwrsink: ID %d, Util %d%%, Total %lu uA %s\n", - id, percent_utilized, total_sink, - smem_total_sink ? "SET" : ""); - - spin_unlock_irqrestore(&sink_lock, flags); - - return 0; -} -EXPORT_SYMBOL(htc_pwrsink_set); - -static void compute_audio_current(void) -{ - /* unsigned long flags; */ - unsigned max_percent = 0; - int i, active_audio_sinks = 0; - pwrsink_audio_id_type last_active_audio_sink = 0; - - /* Make sure this segment will be spinlocked - before computing by calling function. */ - /* spin_lock_irqsave(&audio_sink_lock, flags); */ - for (i = 0; i <= PWRSINK_AUDIO_LAST; ++i) { - max_percent = (audio_sink_array[i].percent > max_percent) ? - audio_sink_array[i].percent : max_percent; - if (audio_sink_array[i].percent > 0) { - active_audio_sinks++; - last_active_audio_sink = i; - } - } - if (active_audio_sinks == 0) - htc_pwrsink_set(PWRSINK_AUDIO, 0); - else if (active_audio_sinks == 1) { - pwrsink_audio_id_type laas = last_active_audio_sink; - /* TODO: add volume and routing path current. */ - if (audio_path == 1) /* Speaker */ - htc_pwrsink_set(PWRSINK_AUDIO, - audio_sink_array[laas].percent); - else - htc_pwrsink_set(PWRSINK_AUDIO, - audio_sink_array[laas].percent * 9 / 10); - } else if (active_audio_sinks > 1) { - /* TODO: add volume and routing path current. */ - if (audio_path == 1) /* Speaker */ - htc_pwrsink_set(PWRSINK_AUDIO, max_percent); - else - htc_pwrsink_set(PWRSINK_AUDIO, max_percent * 9 / 10); - } - /* spin_unlock_irqrestore(&audio_sink_lock, flags); */ - - if (pwrsink_debug_mask & PWRSINK_DEBUG_CURR_CHANGE_AUDIO) - pr_info("%s: active_audio_sinks=%d, audio_path=%d\n", __func__, - active_audio_sinks, audio_path); -} - -int htc_pwrsink_audio_set(pwrsink_audio_id_type id, unsigned percent_utilized) -{ - unsigned long flags; - - if (id < 0 || id > PWRSINK_AUDIO_LAST) - return -EINVAL; - - if (pwrsink_debug_mask & PWRSINK_DEBUG_CURR_CHANGE_AUDIO) - pr_info("%s: id=%d, percent=%d, percent_old=%d\n", __func__, - id, percent_utilized, audio_sink_array[id].percent); - - spin_lock_irqsave(&audio_sink_lock, flags); - if (audio_sink_array[id].percent == percent_utilized) { - spin_unlock_irqrestore(&audio_sink_lock, flags); - return 0; - } - audio_sink_array[id].percent = percent_utilized; - spin_unlock_irqrestore(&audio_sink_lock, flags); - compute_audio_current(); - return 0; -} -EXPORT_SYMBOL(htc_pwrsink_audio_set); - -int htc_pwrsink_audio_volume_set(pwrsink_audio_id_type id, unsigned volume) -{ - unsigned long flags; - - if (id < 0 || id > PWRSINK_AUDIO_LAST) - return -EINVAL; - - if (pwrsink_debug_mask & PWRSINK_DEBUG_CURR_CHANGE_AUDIO) - pr_info("%s: id=%d, volume=%d, volume_old=%d\n", __func__, - id, volume, audio_sink_array[id].volume); - - spin_lock_irqsave(&audio_sink_lock, flags); - if (audio_sink_array[id].volume == volume) { - spin_unlock_irqrestore(&audio_sink_lock, flags); - return 0; - } - audio_sink_array[id].volume = volume; - spin_unlock_irqrestore(&audio_sink_lock, flags); - compute_audio_current(); - return 0; -} -EXPORT_SYMBOL(htc_pwrsink_audio_volume_set); - -int htc_pwrsink_audio_path_set(unsigned path) -{ - unsigned long flags; - - if (pwrsink_debug_mask & PWRSINK_DEBUG_CURR_CHANGE_AUDIO) - pr_info("%s: path=%d, path_old=%d\n", - __func__, path, audio_path); - - spin_lock_irqsave(&audio_sink_lock, flags); - if (audio_path == path) { - spin_unlock_irqrestore(&audio_sink_lock, flags); - return 0; - } - audio_path = path; - spin_unlock_irqrestore(&audio_sink_lock, flags); - compute_audio_current(); - return 0; -} -EXPORT_SYMBOL(htc_pwrsink_audio_path_set); - -void htc_pwrsink_suspend_early(struct early_suspend *h) -{ - htc_pwrsink_set(PWRSINK_SYSTEM_LOAD, 70); -} - -int htc_pwrsink_suspend_late(struct platform_device *pdev, pm_message_t state) -{ - struct pwr_sink_platform_data *pdata = pdev->dev.platform_data; - - if (pdata && pdata->suspend_late) - pdata->suspend_late(pdev, state); - else - htc_pwrsink_set(PWRSINK_SYSTEM_LOAD, 13); - return 0; -} - -int htc_pwrsink_resume_early(struct platform_device *pdev) -{ - struct pwr_sink_platform_data *pdata = pdev->dev.platform_data; - - if (pdata && pdata->resume_early) - pdata->resume_early(pdev); - else - htc_pwrsink_set(PWRSINK_SYSTEM_LOAD, 70); - return 0; -} - -void htc_pwrsink_resume_late(struct early_suspend *h) -{ - htc_pwrsink_set(PWRSINK_SYSTEM_LOAD, 100); -} - -struct early_suspend htc_pwrsink_early_suspend = { - .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1, - .suspend = htc_pwrsink_suspend_early, - .resume = htc_pwrsink_resume_late, -}; - -static int __init htc_pwrsink_probe(struct platform_device *pdev) -{ - struct pwr_sink_platform_data *pdata = pdev->dev.platform_data; - int i; - - if (!pdata) - return -EINVAL; - - total_sink = 0; - for (i = 0; i < pdata->num_sinks; i++) { - sink_array[pdata->sinks[i].id] = &pdata->sinks[i]; - total_sink += (pdata->sinks[i].ua_max * - pdata->sinks[i].percent_util / 100); - } - - initialized = 1; - - if (pdata->suspend_early) - htc_pwrsink_early_suspend.suspend = pdata->suspend_early; - if (pdata->resume_late) - htc_pwrsink_early_suspend.resume = pdata->resume_late; - register_early_suspend(&htc_pwrsink_early_suspend); - - return 0; -} - -static struct platform_driver htc_pwrsink_driver = { - .probe = htc_pwrsink_probe, - .suspend_late = htc_pwrsink_suspend_late, - .resume_early = htc_pwrsink_resume_early, - .driver = { - .name = "htc_pwrsink", - .owner = THIS_MODULE, - }, -}; - -static int __init htc_pwrsink_init(void) -{ - initialized = 0; - memset(sink_array, 0, sizeof(sink_array)); - return platform_driver_register(&htc_pwrsink_driver); -} - -module_init(htc_pwrsink_init); diff --git a/arch/arm/mach-msm/htc_wifi_nvs.c b/arch/arm/mach-msm/htc_wifi_nvs.c deleted file mode 100644 index 2d381a97c070..000000000000 --- a/arch/arm/mach-msm/htc_wifi_nvs.c +++ /dev/null @@ -1,55 +0,0 @@ -/* arch/arm/mach-msm/htc_wifi_nvs.c - * - * Code to extract WiFi calibration information from ATAG set up - * by the bootloader. - * - * Copyright (C) 2008 Google, Inc. - * Author: Dmitry Shmidt - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#include - -/* configuration tags specific to msm */ -#define ATAG_MSM_WIFI 0x57494649 /* MSM WiFi */ - -#define MAX_NVS_SIZE 0x800U -static unsigned char wifi_nvs_ram[MAX_NVS_SIZE]; - -unsigned char *get_wifi_nvs_ram( void ) -{ - return( wifi_nvs_ram ); -} -EXPORT_SYMBOL(get_wifi_nvs_ram); - -static int __init parse_tag_msm_wifi(const struct tag *tag) -{ - unsigned char *dptr = (unsigned char *)(&tag->u); - unsigned size; - - size = min((tag->hdr.size - 2) * sizeof(__u32), MAX_NVS_SIZE); -#ifdef ATAG_MSM_WIFI_DEBUG - unsigned i; - - printk("WiFi Data size = %d , 0x%x\n", tag->hdr.size, tag->hdr.tag); - for (i = 0; i < size; i++) - printk("%02x ", *dptr++); -#endif - memcpy( (void *)wifi_nvs_ram, (void *)dptr, size ); - return 0; -} - -__tagtable(ATAG_MSM_WIFI, parse_tag_msm_wifi); diff --git a/arch/arm/mach-msm/include/mach/bcm_bt_lpm.h b/arch/arm/mach-msm/include/mach/bcm_bt_lpm.h deleted file mode 100644 index c22429718809..000000000000 --- a/arch/arm/mach-msm/include/mach/bcm_bt_lpm.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ASM_ARCH_BCM_BT_LPM_H -#define __ASM_ARCH_BCM_BT_LPM_H - -#include - -/* Uart driver must call this every time it beings TX, to ensure - * this driver keeps WAKE asserted during TX. Called with uart - * spinlock held. */ -extern void bcm_bt_lpm_exit_lpm_locked(struct uart_port *uport); - -struct bcm_bt_lpm_platform_data { - unsigned int gpio_wake; /* CPU -> BCM wakeup gpio */ - unsigned int gpio_host_wake; /* BCM -> CPU wakeup gpio */ - - /* Callback to request the uart driver to clock off. - * Called with uart spinlock held. */ - void (*request_clock_off_locked)(struct uart_port *uport); - /* Callback to request the uart driver to clock on. - * Called with uart spinlock held. */ - void (*request_clock_on_locked)(struct uart_port *uport); -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/board_htc.h b/arch/arm/mach-msm/include/mach/board_htc.h deleted file mode 100644 index b537c91b957a..000000000000 --- a/arch/arm/mach-msm/include/mach/board_htc.h +++ /dev/null @@ -1,78 +0,0 @@ -/* arch/arm/mach-msm/include/mach/BOARD_HTC.h - * Copyright (C) 2007-2009 HTC Corporation. - * Author: Thomas Tsai - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef __ASM_ARCH_MSM_BOARD_HTC_H -#define __ASM_ARCH_MSM_BOARD_HTC_H - -#include -#include -#include - -struct msm_pmem_setting{ - resource_size_t pmem_start; - resource_size_t pmem_size; - resource_size_t pmem_adsp_start; - resource_size_t pmem_adsp_size; - resource_size_t pmem_gpu0_start; - resource_size_t pmem_gpu0_size; - resource_size_t pmem_gpu1_start; - resource_size_t pmem_gpu1_size; - resource_size_t pmem_camera_start; - resource_size_t pmem_camera_size; - resource_size_t ram_console_start; - resource_size_t ram_console_size; -}; - -enum { - MSM_SERIAL_UART1 = 0, - MSM_SERIAL_UART2, - MSM_SERIAL_UART3, -#ifdef CONFIG_SERIAL_MSM_HS - MSM_SERIAL_UART1DM, - MSM_SERIAL_UART2DM, -#endif - MSM_SERIAL_NUM, -}; - - -/* common init routines for use by arch/arm/mach-msm/board-*.c */ - -void __init msm_add_usb_devices(void (*phy_reset) (void)); -void __init msm_add_mem_devices(struct msm_pmem_setting *setting); -void __init msm_init_pmic_vibrator(void); - -struct mmc_platform_data; -int __init msm_add_sdcc_devices(unsigned int controller, struct mmc_platform_data *plat); -int __init msm_add_serial_devices(unsigned uart); - -#if defined(CONFIG_USB_FUNCTION_MSM_HSUSB) -/* START: add USB connected notify function */ -struct t_usb_status_notifier{ - struct list_head notifier_link; - const char *name; - void (*func)(int online); -}; - int usb_register_notifier(struct t_usb_status_notifier *); - static LIST_HEAD(g_lh_usb_notifier_list); -/* END: add USB connected notify function */ -#endif - -int __init board_mfg_mode(void); -int __init parse_tag_smi(const struct tag *tags); -int __init parse_tag_hwid(const struct tag * tags); -int __init parse_tag_skuid(const struct tag * tags); -int parse_tag_engineerid(const struct tag * tags); - -char *board_serialno(void); - -#endif diff --git a/arch/arm/mach-msm/include/mach/gpio-tlmm-v1.h b/arch/arm/mach-msm/include/mach/gpio-tlmm-v1.h deleted file mode 100644 index 04e5e754f24a..000000000000 --- a/arch/arm/mach-msm/include/mach/gpio-tlmm-v1.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2009-2010, The Linux Foundation. All rights reserved. - * Author: Mike Lockwood - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __ASM_ARCH_MSM_GPIO_TLMM_V1_H -#define __ASM_ARCH_MSM_GPIO_TLMM_V1_H - -/* GPIO TLMM (Top Level Multiplexing) Definitions */ - -/* GPIO TLMM: Function -- GPIO specific */ - -/* GPIO TLMM: Direction */ -enum { - GPIO_CFG_INPUT, - GPIO_CFG_OUTPUT, -}; - -/* GPIO TLMM: Pullup/Pulldown */ -enum { - GPIO_CFG_NO_PULL, - GPIO_CFG_PULL_DOWN, - GPIO_CFG_KEEPER, - GPIO_CFG_PULL_UP, -}; - -/* GPIO TLMM: Drive Strength */ -enum { - GPIO_CFG_2MA, - GPIO_CFG_4MA, - GPIO_CFG_6MA, - GPIO_CFG_8MA, - GPIO_CFG_10MA, - GPIO_CFG_12MA, - GPIO_CFG_14MA, - GPIO_CFG_16MA, -}; - -enum { - GPIO_CFG_ENABLE, - GPIO_CFG_DISABLE, -}; - -#define GPIO_CFG(gpio, func, dir, pull, drvstr) \ - ((((gpio) & 0x3FF) << 4) | \ - ((func) & 0xf) | \ - (((dir) & 0x1) << 14) | \ - (((pull) & 0x3) << 15) | \ - (((drvstr) & 0xF) << 17)) - -/** - * extract GPIO pin from bit-field used for gpio_tlmm_config - */ -#define GPIO_PIN(gpio_cfg) (((gpio_cfg) >> 4) & 0x3ff) -#define GPIO_FUNC(gpio_cfg) (((gpio_cfg) >> 0) & 0xf) -#define GPIO_DIR(gpio_cfg) (((gpio_cfg) >> 14) & 0x1) -#define GPIO_PULL(gpio_cfg) (((gpio_cfg) >> 15) & 0x3) -#define GPIO_DRVSTR(gpio_cfg) (((gpio_cfg) >> 17) & 0xf) - -int gpio_tlmm_config(unsigned config, unsigned disable); - -#endif diff --git a/arch/arm/mach-msm/include/mach/gpio-v1.h b/arch/arm/mach-msm/include/mach/gpio-v1.h deleted file mode 100644 index ec62f1531842..000000000000 --- a/arch/arm/mach-msm/include/mach/gpio-v1.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2009-2010, The Linux Foundation. All rights reserved. - * Author: Mike Lockwood - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __ASM_ARCH_MSM_GPIO_V1_H -#define __ASM_ARCH_MSM_GPIO_V1_H - -#include -#include -#include - -#define FIRST_BOARD_GPIO NR_GPIO_IRQS - -static inline int gpio_get_value(unsigned gpio) -{ - return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned gpio, int value) -{ - __gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned gpio) -{ - return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned gpio) -{ - return __gpio_to_irq(gpio); -} - -void msm_gpio_enter_sleep(int from_idle); -void msm_gpio_exit_sleep(void); - -/** - * struct msm_gpio - GPIO pin description - * @gpio_cfg - configuration bitmap, as per gpio_tlmm_config() - * @label - textual label - * - * Usually, GPIO's are operated by sets. - * This struct accumulate all GPIO information in single source - * and facilitete group operations provided by msm_gpios_xxx() - */ -struct msm_gpio { - u32 gpio_cfg; - const char *label; -}; - -/** - * msm_gpios_request_enable() - request and enable set of GPIOs - * - * Request and configure set of GPIO's - * In case of error, all operations rolled back. - * Return error code. - * - * @table: GPIO table - * @size: number of entries in @table - */ -int msm_gpios_request_enable(const struct msm_gpio *table, int size); - -/** - * msm_gpios_disable_free() - disable and free set of GPIOs - * - * @table: GPIO table - * @size: number of entries in @table - */ -void msm_gpios_disable_free(const struct msm_gpio *table, int size); - -/** - * msm_gpios_request() - request set of GPIOs - * In case of error, all operations rolled back. - * Return error code. - * - * @table: GPIO table - * @size: number of entries in @table - */ -int msm_gpios_request(const struct msm_gpio *table, int size); - -/** - * msm_gpios_free() - free set of GPIOs - * - * @table: GPIO table - * @size: number of entries in @table - */ -void msm_gpios_free(const struct msm_gpio *table, int size); - -/** - * msm_gpios_enable() - enable set of GPIOs - * In case of error, all operations rolled back. - * Return error code. - * - * @table: GPIO table - * @size: number of entries in @table - */ -int msm_gpios_enable(const struct msm_gpio *table, int size); - -/** - * msm_gpios_disable() - disable set of GPIOs - * - * @table: GPIO table - * @size: number of entries in @table - */ -int msm_gpios_disable(const struct msm_gpio *table, int size); - -/* GPIO TLMM (Top Level Multiplexing) Definitions */ - -/* GPIO TLMM: Function -- GPIO specific */ - -/* GPIO TLMM: Direction */ -enum { - GPIO_CFG_INPUT, - GPIO_CFG_OUTPUT, -}; - -/* GPIO TLMM: Pullup/Pulldown */ -enum { - GPIO_CFG_NO_PULL, - GPIO_CFG_PULL_DOWN, - GPIO_CFG_KEEPER, - GPIO_CFG_PULL_UP, -}; - -/* GPIO TLMM: Drive Strength */ -enum { - GPIO_CFG_2MA, - GPIO_CFG_4MA, - GPIO_CFG_6MA, - GPIO_CFG_8MA, - GPIO_CFG_10MA, - GPIO_CFG_12MA, - GPIO_CFG_14MA, - GPIO_CFG_16MA, -}; - -enum { - GPIO_CFG_ENABLE, - GPIO_CFG_DISABLE, -}; - -#define GPIO_CFG(gpio, func, dir, pull, drvstr) \ - ((((gpio) & 0x3FF) << 4) | \ - ((func) & 0xf) | \ - (((dir) & 0x1) << 14) | \ - (((pull) & 0x3) << 15) | \ - (((drvstr) & 0xF) << 17)) - -/** - * extract GPIO pin from bit-field used for gpio_tlmm_config - */ -#define GPIO_PIN(gpio_cfg) (((gpio_cfg) >> 4) & 0x3ff) -#define GPIO_FUNC(gpio_cfg) (((gpio_cfg) >> 0) & 0xf) -#define GPIO_DIR(gpio_cfg) (((gpio_cfg) >> 14) & 0x1) -#define GPIO_PULL(gpio_cfg) (((gpio_cfg) >> 15) & 0x3) -#define GPIO_DRVSTR(gpio_cfg) (((gpio_cfg) >> 17) & 0xf) - -int gpio_tlmm_config(unsigned config, unsigned disable); - -#endif /* __ASM_ARCH_MSM_GPIO_V1_H */ diff --git a/arch/arm/mach-msm/include/mach/htc_headset.h b/arch/arm/mach-msm/include/mach/htc_headset.h deleted file mode 100644 index 2f4c18db2625..000000000000 --- a/arch/arm/mach-msm/include/mach/htc_headset.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2008 HTC, Inc. - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ASM_ARCH_HTC_HEADSET_H -#define __ASM_ARCH_HTC_HEADSET_H - -struct h2w_platform_data { - char *power_name; - int cable_in1; - int cable_in2; - int h2w_clk; - int h2w_data; - int debug_uart; - void (*config_cpld)(int); - void (*init_cpld)(void); - void (*set_dat)(int); - void (*set_clk)(int); - void (*set_dat_dir)(int); - void (*set_clk_dir)(int); - int (*get_dat)(void); - int (*get_clk)(void); -}; - -#define BIT_HEADSET (1 << 0) -#define BIT_HEADSET_NO_MIC (1 << 1) -#define BIT_TTY (1 << 2) -#define BIT_FM_HEADSET (1 << 3) -#define BIT_FM_SPEAKER (1 << 4) - -enum { - H2W_NO_DEVICE = 0, - H2W_HTC_HEADSET = 1, -/* H2W_TTY_DEVICE = 2,*/ - NORMAL_HEARPHONE= 2, - H2W_DEVICE = 3, - H2W_USB_CRADLE = 4, - H2W_UART_DEBUG = 5, -}; - -enum { - H2W_GPIO = 0, - H2W_UART1 = 1, - H2W_UART3 = 2, - H2W_BT = 3 -}; - -#define RESEND_DELAY (3) /* ms */ -#define MAX_ACK_RESEND_TIMES (6) /* follow spec */ -#define MAX_HOST_RESEND_TIMES (3) /* follow spec */ -#define MAX_HYGEIA_RESEND_TIMES (5) - -#define H2W_ASCR_DEVICE_INI (0x01) -#define H2W_ASCR_ACT_EN (0x02) -#define H2W_ASCR_PHONE_IN (0x04) -#define H2W_ASCR_RESET (0x08) -#define H2W_ASCR_AUDIO_IN (0x10) - -#define H2W_LED_OFF (0x0) -#define H2W_LED_BKL (0x1) -#define H2W_LED_MTL (0x2) - -typedef enum { - /* === system group 0x0000~0x00FF === */ - /* (R) Accessory type register */ - H2W_SYSTEM = 0x0000, - /* (R) Maximum group address */ - H2W_MAX_GP_ADD = 0x0001, - /* (R/W) Accessory system control register0 */ - H2W_ASCR0 = 0x0002, - - /* === key group 0x0100~0x01FF === */ - /* (R) Key group maximum sub address */ - H2W_KEY_MAXADD = 0x0100, - /* (R) ASCII key press down flag */ - H2W_ASCII_DOWN = 0x0101, - /* (R) ASCII key release up flag */ - H2W_ASCII_UP = 0x0102, - /* (R) Function key status flag */ - H2W_FNKEY_UPDOWN = 0x0103, - /* (R/W) Key device status */ - H2W_KD_STATUS = 0x0104, - - /* === led group 0x0200~0x02FF === */ - /* (R) LED group maximum sub address */ - H2W_LED_MAXADD = 0x0200, - /* (R/W) LED control register0 */ - H2W_LEDCT0 = 0x0201, - - /* === crdl group 0x0300~0x03FF === */ - /* (R) Cardle group maximum sub address */ - H2W_CRDL_MAXADD = 0x0300, - /* (R/W) Cardle group function control register0 */ - H2W_CRDLCT0 = 0x0301, - - /* === car kit group 0x0400~0x04FF === */ - H2W_CARKIT_MAXADD = 0x0400, - - /* === usb host group 0x0500~0x05FF === */ - H2W_USBHOST_MAXADD = 0x0500, - - /* === medical group 0x0600~0x06FF === */ - H2W_MED_MAXADD = 0x0600, - H2W_MED_CONTROL = 0x0601, - H2W_MED_IN_DATA = 0x0602, -} H2W_ADDR; - - -typedef struct H2W_INFO { - /* system group */ - unsigned char CLK_SP; - int SLEEP_PR; - unsigned char HW_REV; - int AUDIO_DEVICE; - unsigned char ACC_CLASS; - unsigned char MAX_GP_ADD; - - /* key group */ - int KEY_MAXADD; - int ASCII_DOWN; - int ASCII_UP; - int FNKEY_UPDOWN; - int KD_STATUS; - - /* led group */ - int LED_MAXADD; - int LEDCT0; - - /* medical group */ - int MED_MAXADD; - unsigned char AP_ID; - unsigned char AP_EN; - unsigned char DATA_EN; -} H2W_INFO; - -typedef enum { - H2W_500KHz = 1, - H2W_250KHz = 2, - H2W_166KHz = 3, - H2W_125KHz = 4, - H2W_100KHz = 5, - H2W_83KHz = 6, - H2W_71KHz = 7, - H2W_62KHz = 8, - H2W_55KHz = 9, - H2W_50KHz = 10, -} H2W_SPEED; - -typedef enum { - H2W_KEY_INVALID = -1, - H2W_KEY_PLAY = 0, - H2W_KEY_FORWARD = 1, - H2W_KEY_BACKWARD = 2, - H2W_KEY_VOLUP = 3, - H2W_KEY_VOLDOWN = 4, - H2W_KEY_PICKUP = 5, - H2W_KEY_HANGUP = 6, - H2W_KEY_MUTE = 7, - H2W_KEY_HOLD = 8, - H2W_NUM_KEYFUNC = 9, -} KEYFUNC; -#endif diff --git a/arch/arm/mach-msm/include/mach/irqs-7x00.h b/arch/arm/mach-msm/include/mach/irqs-7x00.h deleted file mode 100644 index 5b39c4c9080d..000000000000 --- a/arch/arm/mach-msm/include/mach/irqs-7x00.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2009-2010, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - */ - -#ifndef __ASM_ARCH_MSM_IRQS_7X00_H -#define __ASM_ARCH_MSM_IRQS_7X00_H - -/* MSM ARM11 Interrupt Numbers */ -/* See 80-VE113-1 A, pp219-221 */ - -#define INT_A9_M2A_0 0 -#define INT_A9_M2A_1 1 -#define INT_A9_M2A_2 2 -#define INT_A9_M2A_3 3 -#define INT_A9_M2A_4 4 -#define INT_A9_M2A_5 5 -#define INT_A9_M2A_6 6 -#define INT_GP_TIMER_EXP 7 -#define INT_DEBUG_TIMER_EXP 8 -#define INT_UART1 9 -#define INT_UART2 10 -#define INT_UART3 11 -#define INT_UART1_RX 12 -#define INT_UART2_RX 13 -#define INT_UART3_RX 14 -#define INT_USB_OTG 15 -#define INT_MDDI_PRI 16 -#define INT_MDDI_EXT 17 -#define INT_MDDI_CLIENT 18 -#define INT_MDP 19 -#define INT_GRAPHICS 20 -#define INT_ADM_AARM 21 -#define INT_ADSP_A11 22 -#define INT_ADSP_A9_A11 23 -#define INT_SDC1_0 24 -#define INT_SDC1_1 25 -#define INT_SDC2_0 26 -#define INT_SDC2_1 27 -#define INT_KEYSENSE 28 -#define INT_TCHSCRN_SSBI 29 -#define INT_TCHSCRN1 30 -#define INT_TCHSCRN2 31 - -#define INT_GPIO_GROUP1 (32 + 0) -#define INT_GPIO_GROUP2 (32 + 1) -#define INT_PWB_I2C (32 + 2) -#define INT_SOFTRESET (32 + 3) -#define INT_NAND_WR_ER_DONE (32 + 4) -#define INT_NAND_OP_DONE (32 + 5) -#define INT_PBUS_ARM11 (32 + 6) -#define INT_AXI_MPU_SMI (32 + 7) -#define INT_AXI_MPU_EBI1 (32 + 8) -#define INT_AD_HSSD (32 + 9) -#define INT_ARM11_PMU (32 + 10) -#define INT_ARM11_DMA (32 + 11) -#define INT_TSIF_IRQ (32 + 12) -#define INT_UART1DM_IRQ (32 + 13) -#define INT_UART1DM_RX (32 + 14) -#define INT_USB_HS (32 + 15) -#define INT_SDC3_0 (32 + 16) -#define INT_SDC3_1 (32 + 17) -#define INT_SDC4_0 (32 + 18) -#define INT_SDC4_1 (32 + 19) -#define INT_UART2DM_RX (32 + 20) -#define INT_UART2DM_IRQ (32 + 21) - -/* 22-31 are reserved */ - -#define NR_MSM_IRQS 64 -#define NR_GPIO_IRQS 122 -#define NR_BOARD_IRQS 64 -#define NR_SIRC_IRQS 0 - -#define INT_ADSP_A11_SMSM INT_ADSP_A11 -#endif diff --git a/arch/arm/mach-msm/include/mach/mdm-peripheral.h b/arch/arm/mach-msm/include/mach/mdm-peripheral.h deleted file mode 100644 index ef44659b9919..000000000000 --- a/arch/arm/mach-msm/include/mach/mdm-peripheral.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _ARCH_ARM_MACH_MSM_MDM_PERIPHERAL_H -#define _ARCH_ARM_MACH_MSM_MDM_PERIPHERAL_H_ - -extern void peripheral_connect(void); -extern void peripheral_disconnect(void); - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm72k_otg.h b/arch/arm/mach-msm/include/mach/msm72k_otg.h deleted file mode 100644 index ac99d4749b35..000000000000 --- a/arch/arm/mach-msm/include/mach/msm72k_otg.h +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __LINUX_USB_GADGET_MSM72K_OTG_H__ -#define __LINUX_USB_GADGET_MSM72K_OTG_H__ - -#include -#include -#include -#include -#include - -#include -#include - -#define OTGSC_BSVIE (1 << 27) -#define OTGSC_IDIE (1 << 24) -#define OTGSC_IDPU (1 << 5) -#define OTGSC_BSVIS (1 << 19) -#define OTGSC_ID (1 << 8) -#define OTGSC_IDIS (1 << 16) -#define OTGSC_BSV (1 << 11) -#define OTGSC_DPIE (1 << 30) -#define OTGSC_DPIS (1 << 22) -#define OTGSC_HADP (1 << 6) -#define OTGSC_IDPU (1 << 5) - -#define ULPI_STP_CTRL (1 << 30) -#define ASYNC_INTR_CTRL (1 << 29) -#define ULPI_SYNC_STATE (1 << 27) - -#define PORTSC_PHCD (1 << 23) -#define PORTSC_CSC (1 << 1) -#define disable_phy_clk() (writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC)) -#define enable_phy_clk() (writel(readl(USB_PORTSC) & ~PORTSC_PHCD, USB_PORTSC)) -#define is_phy_clk_disabled() (readl(USB_PORTSC) & PORTSC_PHCD) -#define is_phy_active() (readl_relaxed(USB_ULPI_VIEWPORT) &\ - ULPI_SYNC_STATE) -#define is_usb_active() (!(readl(USB_PORTSC) & PORTSC_SUSP)) - -/* Timeout (in msec) values (min - max) associated with OTG timers */ - -#define TA_WAIT_VRISE 100 /* ( - 100) */ -#define TA_WAIT_VFALL 500 /* ( - 1000) */ - -/* - * This option is set for embedded hosts or OTG devices in which leakage - * currents are very minimal. - */ -#ifdef CONFIG_MSM_OTG_ENABLE_A_WAIT_BCON_TIMEOUT -#define TA_WAIT_BCON 30000 /* (1100 - 30000) */ -#else -#define TA_WAIT_BCON -1 -#endif - -/* AIDL_BDIS should be 500 */ -#define TA_AIDL_BDIS 200 /* (200 - ) */ -#define TA_BIDL_ADIS 155 /* (155 - 200) */ -#define TB_SRP_FAIL 6000 /* (5000 - 6000) */ -#define TB_ASE0_BRST 155 /* (155 - ) */ - -/* TB_SSEND_SRP and TB_SE0_SRP are combined */ -#define TB_SRP_INIT 2000 /* (1500 - ) */ - -/* Timeout variables */ - -#define A_WAIT_VRISE 0 -#define A_WAIT_VFALL 1 -#define A_WAIT_BCON 2 -#define A_AIDL_BDIS 3 -#define A_BIDL_ADIS 4 -#define B_SRP_FAIL 5 -#define B_ASE0_BRST 6 - -/* Internal flags like a_set_b_hnp_en, b_hnp_en are maintained - * in usb_bus and usb_gadget - */ - -#define A_BUS_DROP 0 -#define A_BUS_REQ 1 -#define A_SRP_DET 2 -#define A_VBUS_VLD 3 -#define B_CONN 4 -#define ID 5 -#define ADP_CHANGE 6 -#define POWER_UP 7 -#define A_CLR_ERR 8 -#define A_BUS_RESUME 9 -#define A_BUS_SUSPEND 10 -#define A_CONN 11 -#define B_BUS_REQ 12 -#define B_SESS_VLD 13 -#define ID_A 14 -#define ID_B 15 -#define ID_C 16 - -#define USB_IDCHG_MIN 500 -#define USB_IDCHG_MAX 1500 -#define USB_IB_UNCFG 2 -#define OTG_ID_POLL_MS 1000 - -struct msm_otg { - struct usb_phy phy; - - /* usb clocks */ - struct clk *alt_core_clk; - struct clk *iface_clk; - struct clk *core_clk; - - /* clk regime has created dummy clock id for phy so - * that generic clk_reset api can be used to reset phy - */ - struct clk *phy_reset_clk; - - int irq; - int vbus_on_irq; - int id_irq; - void __iomem *regs; - atomic_t in_lpm; - /* charger-type is modified by gadget for legacy chargers - * and OTG modifies it for ACA - */ - atomic_t chg_type; - - void (*start_host) (struct usb_bus *bus, int suspend); - /* Enable/disable the clocks */ - int (*set_clk) (struct usb_phy *phy, int on); - /* Reset phy and link */ - void (*reset) (struct usb_phy *phy, int phy_reset); - /* pmic notfications apis */ - u8 pmic_vbus_notif_supp; - u8 pmic_id_notif_supp; - struct msm_otg_platform_data *pdata; - - spinlock_t lock; /* protects OTG state */ - struct wake_lock wlock; - unsigned long b_last_se0_sess; /* SRP initial condition check */ - unsigned long inputs; - unsigned long tmouts; - u8 active_tmout; - struct hrtimer timer; - struct workqueue_struct *wq; - struct work_struct sm_work; /* state machine work */ - struct work_struct otg_resume_work; - struct notifier_block usbdev_nb; - struct msm_xo_voter *xo_handle; /*handle to vote for TCXO D1 buffer*/ - unsigned curr_power; -#ifdef CONFIG_USB_MSM_ACA - struct timer_list id_timer; /* drives id_status polling */ - unsigned b_max_power; /* ACA: max power of accessory*/ -#endif -}; - -static inline int can_phy_power_collapse(struct msm_otg *dev) -{ - if (!dev || !dev->pdata) - return -ENODEV; - - return dev->pdata->phy_can_powercollapse; -} - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_gpiomux.h b/arch/arm/mach-msm/include/mach/msm_gpiomux.h deleted file mode 100644 index b70a44927447..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_gpiomux.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _LINUX_MSM_GPIOMUX_H -#define _LINUX_MSM_GPIOMUX_H - -#ifdef CONFIG_MSM_GPIOMUX - -/* Increment a gpio's reference count, possibly activating the line. */ -int __must_check msm_gpiomux_get(unsigned gpio); - -/* Decrement a gpio's reference count, possibly suspending the line. */ -int msm_gpiomux_put(unsigned gpio); - -#else - -static inline int __must_check msm_gpiomux_get(unsigned gpio) -{ - return -ENOSYS; -} - -static inline int msm_gpiomux_put(unsigned gpio) -{ - return -ENOSYS; -} - -#endif - -#endif /* _LINUX_MSM_GPIOMUX_H */ diff --git a/arch/arm/mach-msm/include/mach/msm_i2ckbd.h b/arch/arm/mach-msm/include/mach/msm_i2ckbd.h deleted file mode 100644 index ba42b151805d..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_i2ckbd.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MSM_I2CKBD_H_ -#define _MSM_I2CKBD_H_ - -struct msm_i2ckbd_platform_data { - uint8_t hwrepeat; - uint8_t scanset1; - int gpioreset; - int gpioirq; - int (*gpio_setup) (void); - void (*gpio_shutdown)(void); - void (*hw_reset) (int); -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-7x00.h b/arch/arm/mach-msm/include/mach/msm_iomap-7x00.h deleted file mode 100644 index 44f0a8b57d82..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_iomap-7x00.h +++ /dev/null @@ -1,136 +0,0 @@ -/* arch/arm/mach-msm/include/mach/msm_iomap.h - * - * Copyright (C) 2007 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * The MSM peripherals are spread all over across 768MB of physical - * space, which makes just having a simple IO_ADDRESS macro to slide - * them into the right virtual location rough. Instead, we will - * provide a master phys->virt mapping for peripherals here. - * - */ - -#ifndef __ASM_ARCH_MSM_IOMAP_7X00_H -#define __ASM_ARCH_MSM_IOMAP_7X00_H - -#include - -/* Physical base address and size of peripherals. - * Ordered by the virtual base addresses they will be mapped at. - * - * MSM_VIC_BASE must be an value that can be loaded via a "mov" - * instruction, otherwise entry-macro.S will not compile. - * - * If you add or remove entries here, you'll want to edit the - * msm_io_desc array in arch/arm/mach-msm/io.c to reflect your - * changes. - * - */ - -#define MSM_VIC_BASE IOMEM(0xF8000000) -#define MSM_VIC_PHYS 0xC0000000 -#define MSM_VIC_SIZE SZ_4K - -#define MSM_CSR_BASE IOMEM(0xF8001000) -#define MSM_CSR_PHYS 0xC0100000 -#define MSM_CSR_SIZE SZ_4K - -#define MSM_TMR_PHYS MSM_CSR_PHYS -#define MSM_TMR_BASE MSM_CSR_BASE -#define MSM_TMR_SIZE SZ_4K - -#define MSM_GPT_BASE MSM_TMR_BASE -#define MSM_DGT_BASE (MSM_TMR_BASE + 0x10) - -#define MSM_GPIO1_BASE IOMEM(0xF8003000) -#define MSM_GPIO1_PHYS 0xA9200000 -#define MSM_GPIO1_SIZE SZ_4K - -#define MSM_GPIO2_BASE IOMEM(0xF8004000) -#define MSM_GPIO2_PHYS 0xA9300000 -#define MSM_GPIO2_SIZE SZ_4K - -#define MSM_CLK_CTL_BASE IOMEM(0xF8005000) -#define MSM_CLK_CTL_PHYS 0xA8600000 -#define MSM_CLK_CTL_SIZE SZ_4K - -#define MSM_SHARED_RAM_BASE IOMEM(0xF8100000) -#define MSM_SHARED_RAM_PHYS 0x01F00000 -#define MSM_SHARED_RAM_SIZE SZ_1M - -#define MSM_UART1_PHYS 0xA9A00000 -#define MSM_UART1_SIZE SZ_4K - -#define MSM_UART2_PHYS 0xA9B00000 -#define MSM_UART2_SIZE SZ_4K - -#define MSM_UART3_PHYS 0xA9C00000 -#define MSM_UART3_SIZE SZ_4K - -#define MSM_SDC1_PHYS 0xA0400000 -#define MSM_SDC1_SIZE SZ_4K - -#define MSM_SDC2_PHYS 0xA0500000 -#define MSM_SDC2_SIZE SZ_4K - -#define MSM_SDC3_PHYS 0xA0600000 -#define MSM_SDC3_SIZE SZ_4K - -#define MSM_SDC4_PHYS 0xA0700000 -#define MSM_SDC4_SIZE SZ_4K - -#define MSM_NAND_PHYS 0xA0A00000 -#define MSM_NAND_SIZE SZ_4K - -#define MSM_I2C_PHYS 0xA9900000 -#define MSM_I2C_SIZE SZ_4K - -#define MSM_HSUSB_PHYS 0xA0800000 -#define MSM_HSUSB_SIZE SZ_4K - -#define MSM_PMDH_PHYS 0xAA600000 -#define MSM_PMDH_SIZE SZ_4K - -#define MSM_EMDH_PHYS 0xAA700000 -#define MSM_EMDH_SIZE SZ_4K - -#define MSM_MDP_PHYS 0xAA200000 -#define MSM_MDP_SIZE 0x000F0000 - -#define MSM_MDC_BASE IOMEM(0xF8200000) -#define MSM_MDC_PHYS 0xAA500000 -#define MSM_MDC_SIZE SZ_1M - -#define MSM_AD5_BASE IOMEM(0xF8300000) -#define MSM_AD5_PHYS 0xAC000000 -#define MSM_AD5_SIZE (SZ_1M*13) - -#define MSM_VFE_PHYS 0xA0F00000 -#define MSM_VFE_SIZE SZ_1M - -#define MSM_UART1DM_PHYS 0xA0200000 -#define MSM_UART2DM_PHYS 0xA0300000 - -#define MSM_SSBI_PHYS 0xA8100000 -#define MSM_SSBI_SIZE SZ_4K - -#define MSM_TSSC_PHYS 0xAA300000 -#define MSM_TSSC_SIZE SZ_4K - -#if defined(CONFIG_ARCH_MSM7X30) -#define MSM_GCC_BASE IOMEM(0xF8009000) -#define MSM_GCC_PHYS 0xC0182000 -#define MSM_GCC_SIZE SZ_4K -#endif - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_otg.h b/arch/arm/mach-msm/include/mach/msm_otg.h deleted file mode 100644 index 9d30cb9735c4..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_otg.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ARCH_ARM_MACH_MSM_OTG_H -#define __ARCH_ARM_MACH_MSM_OTG_H - -#include -#include - -/* - * The otg driver needs to interact with both device side and host side - * usb controllers. it decides which controller is active at a given - * moment, using the transceiver, ID signal. - */ - -struct msm_otg_transceiver { - struct device *dev; - struct clk *clk; - struct clk *pclk; - int in_lpm; - struct msm_otg_ops *dcd_ops; - struct msm_otg_ops *hcd_ops; - int irq; - int flags; - int state; - int active; - void __iomem *regs; /* device memory/io */ - struct work_struct work; - spinlock_t lock; - struct wake_lock wlock; - - /* bind/unbind the host controller */ - int (*set_host)(struct msm_otg_transceiver *otg, - struct msm_otg_ops *hcd_ops); - - /* bind/unbind the peripheral controller */ - int (*set_peripheral)(struct msm_otg_transceiver *otg, - struct msm_otg_ops *dcd_ops); - int (*set_suspend)(struct msm_otg_transceiver *otg, - int suspend); - -}; - -struct msm_otg_ops { - void (*request)(void *, int); - void *handle; -}; - -/* for usb host and peripheral controller drivers */ -#ifdef CONFIG_USB_MSM_OTG - -extern struct msm_otg_transceiver *msm_otg_get_transceiver(void); -extern void msm_otg_put_transceiver(struct msm_otg_transceiver *xceiv); - -#else - -static inline struct msm_otg_transceiver *msm_otg_get_transceiver(void) -{ - return NULL; -} - -static inline void msm_otg_put_transceiver(struct msm_otg_transceiver *xceiv) -{ -} - -#endif /*CONFIG_USB_MSM_OTG*/ - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_qdsp6_audiov2.h b/arch/arm/mach-msm/include/mach/msm_qdsp6_audiov2.h deleted file mode 100644 index f862c36897fa..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_qdsp6_audiov2.h +++ /dev/null @@ -1,87 +0,0 @@ -/* arch/arm/mach-msm/include/mach/msm_qdsp6_audio.h - * - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MACH_MSM_QDSP6_Q6AUDIO_ -#define _MACH_MSM_QDSP6_Q6AUDIO_ - -#define AUDIO_FLAG_READ 0 -#define AUDIO_FLAG_WRITE 1 - -extern char *audio_data; -extern int32_t audio_phys; -extern uint32_t tx_clk_freq; - -struct audio_buffer { - dma_addr_t phys; - void *data; - uint32_t size; - uint32_t used; /* 1 = CPU is waiting for DSP to consume this buf */ - uint32_t actual_size; /* actual number of bytes read by DSP */ -}; - -struct audio_client { - struct audio_buffer buf[2]; - int cpu_buf; /* next buffer the CPU will touch */ - int dsp_buf; /* next buffer the DSP will touch */ - int running; - int session; - - wait_queue_head_t wait; - struct dal_client *client; - - int cb_status; - uint32_t flags; -}; - -/* Obtain a 16bit signed, interleaved audio channel of the specified - * rate (Hz) and channels (1 or 2), with two buffers of bufsz bytes. - */ - -struct audio_client *q6voice_open(void); -int q6voice_setup(void); -int q6voice_teardown(void); -int q6voice_close(struct audio_client *ac); - - -struct audio_client *q6audio_open(uint32_t bufsz, uint32_t flags); -int q6audio_start(struct audio_client *ac, void *rpc, uint32_t len); - -int q6audio_close(struct audio_client *ac); -int q6audio_read(struct audio_client *ac, struct audio_buffer *ab); -int q6audio_write(struct audio_client *ac, struct audio_buffer *ab); -int q6audio_async(struct audio_client *ac); - -int q6audio_do_routing(uint32_t route); -int q6audio_set_tx_mute(int mute); -int q6audio_update_acdb(uint32_t id_src, uint32_t id_dst); -int q6audio_set_rx_volume(int level); -int q6audio_set_route(const char *name); - -struct q6audio_analog_ops { - void (*init)(void); - void (*speaker_enable)(int en); - void (*headset_enable)(int en); - void (*receiver_enable)(int en); - void (*bt_sco_enable)(int en); - void (*int_mic_enable)(int en); - void (*ext_mic_enable)(int en); -}; - -void q6audio_register_analog_ops(struct q6audio_analog_ops *ops); - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_serial_debugger.h b/arch/arm/mach-msm/include/mach/msm_serial_debugger.h deleted file mode 100644 index f490b1be4f21..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_serial_debugger.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ASM_ARCH_MSM_SERIAL_DEBUGGER_H -#define __ASM_ARCH_MSM_SERIAL_DEBUGGER_H - -#if defined(CONFIG_MSM_SERIAL_DEBUGGER) -void msm_serial_debug_init(unsigned int base, int irq, - struct device *clk_device, int signal_irq, int wakeup_irq); -#else -static inline void msm_serial_debug_init(unsigned int base, int irq, - struct device *clk_device, int signal_irq, int wakeup_irq) {} -#endif - -#endif diff --git a/arch/arm/mach-msm/include/mach/msm_touchpad.h b/arch/arm/mach-msm/include/mach/msm_touchpad.h deleted file mode 100644 index 2cc6e0577b28..000000000000 --- a/arch/arm/mach-msm/include/mach/msm_touchpad.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -/* - * Touchpad driver for QSD platform. - */ - -struct msm_touchpad_platform_data { - int gpioirq; - int gpiosuspend; - int (*gpio_setup) (void); - void (*gpio_shutdown)(void); -}; diff --git a/arch/arm/mach-msm/include/mach/qdsp5/acdb_commands.h b/arch/arm/mach-msm/include/mach/qdsp5/acdb_commands.h deleted file mode 100644 index b24a3d9ea2e0..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/acdb_commands.h +++ /dev/null @@ -1,303 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_ACDB_COMMANDS_H -#define _MACH_QDSP5_V2_ACDB_COMMANDS_H - -#define ACDB_VOICE_NETWORK_ID_DEFAULT 0x00010037 -#define ACDB_INITIALISING 0 -#define ACDB_READY 1 - - -/* 4KB */ -#define ACDB_PAGE_SIZE 0x1000 - -#define ACDB_CDMA_NB 0x0108b153 -#define ACDB_CDMA_WB 0x0108b154 -#define ACDB_GSM_NB 0x0108b155 -#define ACDB_GSM_WB 0x0108b156 -#define ACDB_WCDMA_NB 0x0108b157 -#define ACDB_WCDMA_WB 0x0108b158 - - -/* ACDB commands */ - - -/* struct acdb_cmd_install_device */ -#define ACDB_INSTALL_DEVICE 0x0108d245 - -/* struct acdb_cmd_install_device */ -#define ACDB_UNINSTALL_DEVICE 0x0108d246 - -/* struct acdb_cmd_device */ -#define ACDB_GET_DEVICE 0x0108bb92 - -/* struct acdb_cmd_device */ -#define ACDB_SET_DEVICE 0x0108bb93 - -/* struct acdb_cmd_get_device_table */ -#define ACDB_GET_DEVICE_TABLE 0x0108bb97 - -/* struct acdb_cmd_get_device_capabilities */ -#define ACDB_GET_DEVICE_CAPABILITIES 0x0108f5ca - -/* struct acdb_cmd_get_device_info */ -#define ACDB_GET_DEVICE_INFO 0x0108f5cb - -/*command to intitialize ACDB based on codec type*/ -#define ACDB_CMD_INITIALIZE_FOR_ADIE 0x00011283 - - -/* ACDB Error codes */ - -#define ACDB_RES_SUCCESS 0 -#define ACDB_RES_FAILURE -1 -#define ACDB_RES_BADPARM -2 -#define ACDB_RES_BADSTATE -3 - -#define TGTVERS_MSM7x30_BRING_UP 0x00010064 - - - -/* Algorithm Aspect IDs */ - -#define IID_ENABLE_FLAG 0x0108b6b9 - - -#define IID_ENABLE_FLAG_SIZE 1 -#define IID_ECHO_CANCELLER_VERSION_SIZE 2 -#define IID_ECHO_CANCELLER_MODE_SIZE 2 -#define IID_ECHO_CANCELLER_NOISE_SUPPRESSOR_ENABLE_SIZE 1 -#define IID_ECHO_CANCELLER_PARAMETERS_SIZE 32 -#define IID_ECHO_CANCELLER_NEXTGEN_NB_PARAMETERS_SIZE (38 * 2) -#define IID_ECHO_CANCELLER_NEXTGEN_WB_PARAMETERS_SIZE (38 * 2) -#define IID_FLUENCE_PARAMETERS_SIZE 486 -#define IID_AFE_VOLUME_CONTROL_SIZE 6 -#define IID_GAIN_SIZE 2 -#define IID_VOICE_FIR_FILTER_SIZE 14 -#define IID_VOICE_IIR_FILTER_SIZE 114 -#define IID_RX_DBM_OFFSET_SIZE 2 -#define IID_AGC_SIZE 36 -#define IID_AVC_SIZE 80 - -#define IID_AUDIO_IIR_COEFF_SIZE 100 -#define IID_MBADRC_PARAMETERS_SIZE 8 -#define IID_MBADRC_EXT_BUFF_SIZE 392 -#define IID_MBADRC_BAND_CONFIG_SIZE 100 -#define IID_QAFX_PARAMETERS_SIZE 2 -#define IID_QCONCERT_PARAMETERS_SIZE 2 -#define IID_AUDIO_AGC_PARAMETERS_SIZE 42 -#define IID_NS_PARAMETERS_SIZE 14 - -#define IID_ECHO_CANCELLER_VERSION 0x00010042 -#define IID_ECHO_CANCELLER_MODE 0x00010043 -#define IID_ECHO_CANCELLER_NOISE_SUPPRESSOR_ENABLE 0x00010044 -#define IID_ECHO_CANCELLER_PARAMETERS 0x00010045 -#define IID_ECHO_CANCELLER_NEXTGEN_NB_PARAMETERS 0x00010046 -#define IID_ECHO_CANCELLER_NEXTGEN_WB_PARAMETERS 0x00010047 -#define IID_FLUENCE_PARAMETERS 0x00010048 -#define IID_AFE_VOLUME_CONTROL 0x00010049 -#define IID_GAIN 0x0001004A -#define IID_VOICE_FIR_FILTER 0x0001004B -#define IID_VOICE_IIR_FILTER 0x0001004C -#define IID_AGC 0x0001004E -#define IID_AVC 0x0001004F -#define ABID_SIDETONE_GAIN 0x00010050 -#define ABID_TX_VOICE_GAIN 0x00010051 -#define ABID_TX_DTMF_GAIN 0x00010052 -#define ABID_CODEC_TX_GAIN 0x00010053 -#define ABID_HSSD 0x00010054 -#define ABID_TX_AGC 0x00010055 -#define ABID_TX_VOICE_FIR 0x00010056 -#define ABID_TX_VOICE_IIR 0x00010057 -#define ABID_ECHO_CANCELLER 0x00010058 -#define ABID_ECHO_CANCELLER_NB_LVHF 0x00010059 -#define ABID_ECHO_CANCELLER_WB_LVHF 0x0001005A -#define ABID_FLUENCE 0x0001005B -#define ABID_CODEC_RX_GAIN 0x0001005C -#define ABID_RX_DBM_OFFSET 0x0001005D -#define ABID_RX_AGC 0x0001005E -#define ABID_AVC 0x0001005F -#define ABID_RX_VOICE_FIR 0x00010060 -#define ABID_RX_VOICE_IIR 0x00010061 -#define ABID_AFE_VOL_CTRL 0x00010067 - - -/* AUDIO IDs */ -#define ABID_AUDIO_AGC_TX 0x00010068 -#define ABID_AUDIO_NS_TX 0x00010069 -#define ABID_VOICE_NS 0x0001006A -#define ABID_AUDIO_IIR_TX 0x0001006B -#define ABID_AUDIO_IIR_RX 0x0001006C -#define ABID_AUDIO_MBADRC_RX 0x0001006E -#define ABID_AUDIO_QAFX_RX 0x0001006F -#define ABID_AUDIO_QCONCERT_RX 0x00010070 -#define ABID_AUDIO_STF_RX 0x00010071 -#define ABID_AUDIO_CALIBRATION_GAIN_RX 0x00011162 -#define ABID_AUDIO_CALIBRATION_GAIN_TX 0x00011149 -#define ABID_AUDIO_PBE_RX 0x00011197 -#define ABID_AUDIO_RMC_TX 0x00011226 -#define ABID_AUDIO_FLUENCE_TX 0x00011244 - - -#define IID_AUDIO_AGC_PARAMETERS 0x0001007E -#define IID_NS_PARAMETERS 0x00010072 -#define IID_AUDIO_IIR_COEFF 0x00010073 -#define IID_MBADRC_EXT_BUFF 0x00010075 -#define IID_MBADRC_BAND_CONFIG 0x00010076 -#define IID_MBADRC_PARAMETERS 0x00010077 -#define IID_QAFX_PARAMETERS 0x00010079 -#define IID_QCONCERT_PARAMETERS 0x0001007A -#define IID_STF_COEFF 0x0001007B -#define IID_AUDIO_CALIBRATION_GAIN_RX 0x00011163 -#define IID_AUDIO_CALIBRATION_GAIN_TX 0x00011171 -#define IID_PBE_CONFIG_PARAMETERS 0x00011198 -#define IID_AUDIO_PBE_RX_ENABLE_FLAG 0x00011199 -#define IID_AUDIO_RMC_PARAM 0x00011227 -#define IID_AUDIO_FLUENCE_TX 0x00011245 - - -#define TOPID_RX_TOPOLOGY_1 0x00010062 -#define TOPID_TX_TOPOLOGY_1 0x00010063 -#define AFERID_INT_SINK 0x00010065 -#define AFERID_INT_SOURCE 0x00010066 -#define AFERID_NO_SINK 0x00000000 -#define AFERID_NULL_SINK 0x0108ea92 - - -struct acdb_cmd_install_device { - u32 command_id; - u32 device_id; - u32 topology_id; - u32 afe_routing_id; - u32 cad_routing_id; /* see "Sample Rate Bit Mask" below */ - u32 sample_rate_mask; - - /* represents device direction: Tx, Rx (aux pga - loopback) */ - u8 device_type; - u8 channel_config; /* Mono or Stereo */ - u32 adie_codec_path_id; -}; - - -struct acdb_cmd_get_device_capabilities { - u32 command_id; - u32 total_bytes; /* Length in bytes allocated for buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - - -struct acdb_cmd_get_device_info { - u32 command_id; - u32 device_id; - u32 total_bytes; /* Length in bytes allocated for buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_cmd_device { - u32 command_id; - u32 device_id; - u32 network_id; - u32 sample_rate_id; /* Actual sample rate value */ - u32 interface_id; /* See interface id's above */ - u32 algorithm_block_id; /* See enumerations above */ - u32 total_bytes; /* Length in bytes used by buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_cmd_get_device_table { - u32 command_id; - u32 device_id; - u32 network_id; - u32 sample_rate_id; /* Actual sample rate value */ - u32 total_bytes; /* Length in bytes used by buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_result { - /* This field is populated in response to the */ - /* ACDB_GET_DEVICE_CAPABILITIES command and indicates the total */ - /* devices whose capabilities are copied to the physical memory. */ - u32 total_devices; - u32 *buf; /* Physical Address of data */ - u32 used_bytes; /* The size in bytes of the data */ - u32 result; /* See ACDB Error codes above */ -}; - -struct acdb_device_capability { - u32 device_id; - u32 sample_rate_mask; /* See "Sample Rate Bit Mask" below */ -}; - -struct acdb_dev_info { - u32 cad_routing_id; - u32 sample_rate_mask; /* See "Sample Rate Bit Mask" below */ - u32 adsp_device_id; /* QDSP6 device ID */ - u32 device_type; /* Tx, Rx (aux pga - loopback) */ - u32 channel_config; /* Mono or Stereo */ - s32 min_volume; /* Min volume (mB) */ - s32 max_volume; /* Max volume (mB) */ -}; - -/*structure is used to intialize ACDB software on modem -based on adie type detected*/ -struct acdb_cmd_init_adie { - u32 command_id; - u32 adie_type; -}; - -#define ACDB_CURRENT_ADIE_MODE_UNKNOWN 0 -#define ACDB_CURRENT_ADIE_MODE_TIMPANI 1 -#define ACDB_CURRENT_ADIE_MODE_MARIMBA 2 - -/* Sample Rate Bit Mask */ - -/* AUX PGA devices will have a sample rate mask of 0xFFFFFFFF */ -/* 8kHz 0x00000001 */ -/* 11.025kHz 0x00000002 */ -/* 12kHz 0x00000004 */ -/* 16kHz 0x00000008 */ -/* 22.5kHz 0x00000010 */ -/* 24kHz 0x00000020 */ -/* 32kHz 0x00000040 */ -/* 44.1kHz 0x00000080 */ -/* 48kHz 0x00000100 */ - - -/* Device type enumeration */ -enum { - RX_DEVICE = 1, - TX_DEVICE, - AUXPGA_DEVICE, - DEVICE_TYPE_MAX -}; - -#ifdef CONFIG_DEBUG_FS -/*These are ABID used for RTC*/ -#define ABID_AUDIO_RTC_MBADRC_RX 0x0001118A -#define ABID_AUDIO_RTC_VOLUME_PAN_RX 0x0001118C -#define ABID_AUDIO_RTC_SPA 0x0001118E -#define ABID_AUDIO_RTC_EQUALIZER_PARAMETERS 0x0001119F - -/*These are IID used for RTC*/ -#define IID_AUDIO_RTC_MBADRC_PARAMETERS 0x0001118B -#define IID_AUDIO_RTC_VOLUME_PAN_PARAMETERS 0x0001118D -#define IID_AUDIO_RTC_SPA_PARAMETERS 0x0001118F -#define IID_AUDIO_RTC_EQUALIZER_PARAMETERS 0x0001119E -#define IID_AUDIO_RTC_AGC_PARAMETERS 0x000111A7 -#define IID_AUDIO_RTC_TX_IIR_COEFF 0x000111A8 - -#endif - - -#endif - diff --git a/arch/arm/mach-msm/include/mach/qdsp5/audio_acdb_def.h b/arch/arm/mach-msm/include/mach/qdsp5/audio_acdb_def.h deleted file mode 100644 index 5fc87e0fc99c..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/audio_acdb_def.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H -#define _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H - -/* Define ACDB device ID */ -#define ACDB_ID_HANDSET_SPKR 1 -#define ACDB_ID_HANDSET_MIC 2 -#define ACDB_ID_HEADSET_MIC 3 -#define ACDB_ID_HEADSET_SPKR_MONO 4 -#define ACDB_ID_HEADSET_SPKR_STEREO 5 -#define ACDB_ID_SPKR_PHONE_MIC 6 -#define ACDB_ID_SPKR_PHONE_MONO 7 -#define ACDB_ID_SPKR_PHONE_STEREO 8 -#define ACDB_ID_BT_SCO_MIC 9 -#define ACDB_ID_BT_SCO_SPKR 0x0A -#define ACDB_ID_BT_A2DP_SPKR 0x0B -#define ACDB_ID_BT_A2DP_TX 0x10 -#define ACDB_ID_TTY_HEADSET_MIC 0x0C -#define ACDB_ID_TTY_HEADSET_SPKR 0x0D -#define ACDB_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define ACDB_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 -#define ACDB_ID_FM_TX_LOOPBACK 0x17 -#define ACDB_ID_FM_TX 0x18 -#define ACDB_ID_LP_FM_SPKR_PHONE_STEREO_RX 0x19 -#define ACDB_ID_LP_FM_HEADSET_SPKR_STEREO_RX 0x1A -#define ACDB_ID_I2S_RX 0x20 -#define ACDB_ID_SPKR_PHONE_MIC_BROADSIDE 0x2B -#define ACDB_ID_HANDSET_MIC_BROADSIDE 0x2C -#define ACDB_ID_SPKR_PHONE_MIC_ENDFIRE 0x2D -#define ACDB_ID_HANDSET_MIC_ENDFIRE 0x2E -#define ACDB_ID_I2S_TX 0x30 -#define ACDB_ID_HDMI 0x40 -#define ACDB_ID_FM_RX 0x4F -/*Replace the max device ID,if any new device is added Specific to RTC only*/ -#define ACDB_ID_MAX ACDB_ID_FM_RX - -/* ID used for virtual devices */ -#define PSEUDO_ACDB_ID 0xFFFF - -int is_acdb_enabled(void); -#endif /* _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5/audio_acdbi.h b/arch/arm/mach-msm/include/mach/qdsp5/audio_acdbi.h deleted file mode 100644 index 682e4d951bf7..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/audio_acdbi.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_AUDIO_ACDBI_H -#define _MACH_QDSP5_V2_AUDIO_ACDBI_H - -#define DBOR_SIGNATURE 0x524F4244 - -void acdb_rtc_set_err(u32 err_code); - - -struct header { - u32 dbor_signature; - u32 abid; - u32 iid; - u32 data_len; -}; - -enum { - ACDB_AGC_BLOCK = 197, - ACDB_IIR_BLOCK = 245, - ACDB_MBADRC_BLOCK = 343 -}; - -/* Structure to query for acdb parameter */ -struct acdb_get_block { - u32 acdb_id; - u32 sample_rate_id; /* Actual sample rate value */ - u32 interface_id; /* Interface id's */ - u32 algorithm_block_id; /* Algorithm block id */ - u32 total_bytes; /* Length in bytes used by buffer for - configuration */ - u32 *buf_ptr; /* Address for storing configuration - data */ -}; - -struct acdb_agc_block { - u16 enable_status; - u16 comp_rlink_static_gain; - u16 comp_rlink_aig_flag; - u16 exp_rlink_threshold; - u16 exp_rlink_slope; - u16 comp_rlink_threshold; - u16 comp_rlink_slope; - u16 comp_rlink_aig_attack_k; - u16 comp_rlink_aig_leak_down; - u16 comp_rlink_aig_leak_up; - u16 comp_rlink_aig_max; - u16 comp_rlink_aig_min; - u16 comp_rlink_aig_release_k; - u16 comp_rlink_aig_sm_leak_rate_fast; - u16 comp_rlink_aig_sm_leak_rate_slow; - u16 comp_rlink_attack_k_msw; - u16 comp_rlink_attack_k_lsw; - u16 comp_rlink_delay; - u16 comp_rlink_release_k_msw; - u16 comp_rlink_release_k_lsw; - u16 comp_rlink_rms_trav; -}; - - -struct iir_coeff_type { - u16 b0_lo; - u16 b0_hi; - u16 b1_lo; - u16 b1_hi; - u16 b2_lo; - u16 b2_hi; -}; - -struct iir_coeff_stage_a { - u16 a1_lo; - u16 a1_hi; - u16 a2_lo; - u16 a2_hi; -}; - -struct acdb_iir_block { - u16 enable_flag; - u16 stage_count; - struct iir_coeff_type stages[4]; - struct iir_coeff_stage_a stages_a[4]; - u16 shift_factor[4]; - u16 pan[4]; -}; - -struct mbadrc_band_config_type { - u16 mbadrc_sub_band_enable; - u16 mbadrc_sub_mute; - u16 mbadrc_comp_rms_tav; - u16 mbadrc_comp_threshold; - u16 mbadrc_comp_slop; - u16 mbadrc_comp_attack_msw; - u16 mbadrc_comp_attack_lsw; - u16 mbadrc_comp_release_msw; - u16 mbadrc_comp_release_lsw; - u16 mbadrc_make_up_gain; -}; - -struct mbadrc_parameter { - u16 mbadrc_enable; - u16 mbadrc_num_bands; - u16 mbadrc_down_sample_level; - u16 mbadrc_delay; -}; - -struct acdb_mbadrc_block { - u16 ext_buf[196]; - struct mbadrc_band_config_type band_config[5]; - struct mbadrc_parameter parameters; -}; - -struct acdb_ns_tx_block { - unsigned short ec_mode_new; - unsigned short dens_gamma_n; - unsigned short dens_nfe_block_size; - unsigned short dens_limit_ns; - unsigned short dens_limit_ns_d; - unsigned short wb_gamma_e; - unsigned short wb_gamma_n; -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaycmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaycmdi.h deleted file mode 100644 index 67ee5490486a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaycmdi.h +++ /dev/null @@ -1,129 +0,0 @@ -#ifndef QDSP5AUDPLAYCMDI_H -#define QDSP5AUDPLAYCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - Q D S P 5 A U D I O P L A Y T A S K C O M M A N D S - -GENERAL DESCRIPTION - Command Interface for AUDPLAYTASK on QDSP5 - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - - audplay_cmd_dec_data_avail - Send buffer to AUDPLAY task - - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/Audio/drivers/QDSP5Driver/QDSP5Interface/main/latest/qdsp5audplaycmdi.h#2 $ - -===========================================================================*/ - -#define AUDPLAY_CMD_BITSTREAM_DATA_AVAIL 0x0000 -#define AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_LEN \ - sizeof(audplay_cmd_bitstream_data_avail) - -/* Type specification of dec_data_avail message sent to AUDPLAYTASK -*/ -typedef struct { - /*command ID*/ - unsigned int cmd_id; - - /* Decoder ID for which message is being sent */ - unsigned int decoder_id; - - /* Start address of data in ARM global memory */ - unsigned int buf_ptr; - - /* Number of 16-bit words of bit-stream data contiguously available at the - * above-mentioned address - */ - unsigned int buf_size; - - /* Partition number used by audPlayTask to communicate with DSP's RTOS - * kernel - */ - unsigned int partition_number; - -} __attribute__((packed)) audplay_cmd_bitstream_data_avail; - -#define AUDPLAY_CMD_HPCM_BUF_CFG 0x0003 -#define AUDPLAY_CMD_HPCM_BUF_CFG_LEN \ - sizeof(struct audplay_cmd_hpcm_buf_cfg) - -struct audplay_cmd_hpcm_buf_cfg { - unsigned int cmd_id; - unsigned int hostpcm_config; - unsigned int feedback_frequency; - unsigned int byte_swap; - unsigned int max_buffers; - unsigned int partition_number; -} __attribute__((packed)); - -#define AUDPLAY_CMD_BUFFER_REFRESH 0x0004 -#define AUDPLAY_CMD_BUFFER_REFRESH_LEN \ - sizeof(struct audplay_cmd_buffer_update) - -struct audplay_cmd_buffer_refresh { - unsigned int cmd_id; - unsigned int num_buffers; - unsigned int buf_read_count; - unsigned int buf0_address; - unsigned int buf0_length; - unsigned int buf1_address; - unsigned int buf1_length; -} __attribute__((packed)); - -#define AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2 0x0005 -#define AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2_LEN \ - sizeof(audplay_cmd_bitstream_data_avail_nt2) - -/* Type specification of dec_data_avail message sent to AUDPLAYTASK - * for NT2 */ -struct audplay_cmd_bitstream_data_avail_nt2 { - /*command ID*/ - unsigned int cmd_id; - - /* Decoder ID for which message is being sent */ - unsigned int decoder_id; - - /* Start address of data in ARM global memory */ - unsigned int buf_ptr; - - /* Number of 16-bit words of bit-stream data contiguously available at the - * above-mentioned address - */ - unsigned int buf_size; - - /* Partition number used by audPlayTask to communicate with DSP's RTOS - * kernel - */ - unsigned int partition_number; - - /* bitstream write pointer */ - unsigned int dspBitstreamWritePtr; - -} __attribute__((packed)); - -#endif /* QDSP5AUDPLAYCMD_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaymsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaymsg.h deleted file mode 100644 index e79554afb955..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audplaymsg.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef QDSP5AUDPLAYMSG_H -#define QDSP5AUDPLAYMSG_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - Q D S P 5 A U D I O P L A Y T A S K M S G - -GENERAL DESCRIPTION - Message sent by AUDPLAY task - -REFERENCES - None - - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/Audio/drivers/QDSP5Driver/QDSP5Interface/main/latest/qdsp5audplaymsg.h#3 $ - -===========================================================================*/ -#define AUDPLAY_MSG_DEC_NEEDS_DATA 0x0001 -#define AUDPLAY_MSG_DEC_NEEDS_DATA_MSG_LEN \ - sizeof(audplay_msg_dec_needs_data) - -typedef struct{ - /* reserved*/ - unsigned int dec_id; - - /*The read pointer offset of external memory till which bitstream - has been dme’d in*/ - unsigned int adecDataReadPtrOffset; - - /* The buffer size of external memory. */ - unsigned int adecDataBufSize; - - unsigned int bitstream_free_len; - unsigned int bitstream_write_ptr; - unsigned int bitstarem_buf_start; - unsigned int bitstream_buf_len; -} __attribute__((packed)) audplay_msg_dec_needs_data; - -#define AUDPLAY_UP_STREAM_INFO 0x0003 -#define AUDPLAY_UP_STREAM_INFO_LEN \ - sizeof(struct audplay_msg_stream_info) - -struct audplay_msg_stream_info { - unsigned int decoder_id; - unsigned int channel_info; - unsigned int sample_freq; - unsigned int bitstream_info; - unsigned int bit_rate; -} __attribute__((packed)); - -#define AUDPLAY_MSG_BUFFER_UPDATE 0x0004 -#define AUDPLAY_MSG_BUFFER_UPDATE_LEN \ - sizeof(struct audplay_msg_buffer_update) - -struct audplay_msg_buffer_update { - unsigned int buffer_write_count; - unsigned int num_of_buffer; - unsigned int buf0_address; - unsigned int buf0_length; - unsigned int buf1_address; - unsigned int buf1_length; -} __attribute__((packed)); - -#define ADSP_MESSAGE_ID 0xFFFF -#endif /* QDSP5AUDPLAYMSG_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audpreproc.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audpreproc.h deleted file mode 100644 index 7153c2d08037..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5audpreproc.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef QDSP5AUDPREPROC_H -#define _QDSP5AUDPREPROC_H - -#include -#include - -#define MSM_AUD_ENC_MODE_TUNNEL 0x00000100 -#define MSM_AUD_ENC_MODE_NONTUNNEL 0x00000200 - -#define AUDPREPROC_CODEC_MASK 0x00FF -#define AUDPREPROC_MODE_MASK 0xFF00 - -#define MSM_ADSP_ENC_MODE_TUNNEL 24 -#define MSM_ADSP_ENC_MODE_NON_TUNNEL 25 - -/* event callback routine prototype*/ -typedef void (*audpreproc_event_func)(void *private, unsigned id, void *msg); - -struct audpreproc_event_callback { - audpreproc_event_func fn; - void *private; -}; - -/*holds audrec information*/ -struct audrec_session_info { - int session_id; - int sampling_freq; -}; - -/* Exported common api's from audpreproc layer */ -int audpreproc_aenc_alloc(unsigned enc_type, const char **module_name, - unsigned *queue_id); -void audpreproc_aenc_free(int enc_id); - -int audpreproc_enable(int enc_id, audpreproc_event_func func, void *private); -void audpreproc_disable(int enc_id, void *private); - -int audpreproc_unregister_event_callback(struct audpreproc_event_callback *ecb); - -int audpreproc_register_event_callback(struct audpreproc_event_callback *ecb); - -int audpreproc_update_audrec_info(struct audrec_session_info - *audrec_session_info); -int get_audrec_session_info(struct audrec_session_info *info); - -int audpreproc_dsp_set_agc(audpreproc_cmd_cfg_agc_params *agc, - unsigned len); -int audpreproc_dsp_set_ns(audpreproc_cmd_cfg_ns_params *ns, - unsigned len); -int audpreproc_dsp_set_iir(audpreproc_cmd_cfg_iir_tuning_filter_params *iir, - unsigned len); - -int audpreproc_send_preproccmdqueue(void *cmd, unsigned len); -typedef void (*audrec_event_func)(void *private, unsigned id, uint16_t *msg); -int audrectask_enable(unsigned enc_type, audrec_event_func func, void *private); -void audrectask_disable(unsigned enc_type, void *private); - -int audrectask_send_cmdqueue(void *cmd, unsigned len); -int audrectask_send_bitstreamqueue(void *cmd, unsigned len); - -#endif /* QDSP5AUDPREPROC_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegcmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegcmdi.h deleted file mode 100644 index 40e96d780169..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegcmdi.h +++ /dev/null @@ -1,377 +0,0 @@ -#ifndef QDSP5VIDJPEGCMDI_H -#define QDSP5VIDJPEGCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - J P E G I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by JPEG Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5jpegcmdi.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: -when who what, where, why --------- --- ---------------------------------------------------------- -06/09/08 sv initial version -===========================================================================*/ - -/* - * ARM to JPEG configuration commands are passed through the - * uPJpegCfgCmdQueue - */ - -/* - * Command to configure JPEG Encoder - */ - -#define JPEG_CMD_ENC_CFG 0x0000 -#define JPEG_CMD_ENC_CFG_LEN sizeof(jpeg_cmd_enc_cfg) - -#define JPEG_CMD_ENC_PROCESS_CFG_OP_ROTATION_0 0x0000 -#define JPEG_CMD_ENC_PROCESS_CFG_OP_ROTATION_90 0x0100 -#define JPEG_CMD_ENC_PROCESS_CFG_OP_ROTATION_180 0x0200 -#define JPEG_CMD_ENC_PROCESS_CFG_OP_ROTATION_270 0x0300 -#define JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_M 0x0003 -#define JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_H2V2 0x0000 -#define JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_H2V1 0x0001 -#define JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_H1V2 0x0002 - -#define JPEG_CMD_IP_SIZE_CFG_LUMA_HEIGHT_M 0x0000FFFF -#define JPEG_CMD_IP_SIZE_CFG_LUMA_WIDTH_M 0xFFFF0000 -#define JPEG_CMD_ENC_UPSAMP_IP_SIZE_CFG_ENA 0x0001 -#define JPEG_CMD_ENC_UPSAMP_IP_SIZE_CFG_DIS 0x0000 - -#define JPEG_CMD_FRAG_SIZE_LUMA_HEIGHT_M 0xFFFF - -typedef struct { - unsigned int cmd_id; - unsigned int process_cfg; - unsigned int ip_size_cfg; - unsigned int op_size_cfg; - unsigned int frag_cfg; - unsigned int frag_cfg_part[16]; - - unsigned int part_num; - - unsigned int op_buf_0_cfg_part1; - unsigned int op_buf_0_cfg_part2; - unsigned int op_buf_1_cfg_part1; - unsigned int op_buf_1_cfg_part2; - - unsigned int luma_qunt_table[32]; - unsigned int chroma_qunt_table[32]; - - unsigned int upsamp_ip_size_cfg; - unsigned int upsamp_ip_frame_off; - unsigned int upsamp_pp_filter_coeff[64]; -} __attribute__((packed)) jpeg_cmd_enc_cfg; - -/* - * Command to configure JPEG Decoder - */ - -#define JPEG_CMD_DEC_CFG 0x0001 -#define JPEG_CMD_DEC_CFG_LEN sizeof(jpeg_cmd_dec_cfg) - -#define JPEG_CMD_DEC_OP_DATA_FORMAT_M 0x0001 -#define JPEG_CMD_DEC_OP_DATA_FORMAT_H2V2 0x0000 -#define JPEG_CMD_DEC_OP_DATA_FORMAT_H2V1 0x0001 - -#define JPEG_CMD_DEC_OP_DATA_FORMAT_SCALE_FACTOR_8 0x000000 -#define JPEG_CMD_DEC_OP_DATA_FORMAT_SCALE_FACTOR_4 0x010000 -#define JPEG_CMD_DEC_OP_DATA_FORMAT_SCALE_FACTOR_2 0x020000 -#define JPEG_CMD_DEC_OP_DATA_FORMAT_SCALE_FACTOR_1 0x030000 - -#define JPEG_CMD_DEC_IP_STREAM_BUF_CFG_PART3_NOT_FINAL 0x0000 -#define JPEG_CMD_DEC_IP_STREAM_BUF_CFG_PART3_FINAL 0x0001 - - -typedef struct { - unsigned int cmd_id; - unsigned int img_dimension_cfg; - unsigned int op_data_format; - unsigned int restart_interval; - unsigned int ip_buf_partition_num; - unsigned int ip_stream_buf_cfg_part1; - unsigned int ip_stream_buf_cfg_part2; - unsigned int ip_stream_buf_cfg_part3; - unsigned int op_stream_buf_0_cfg_part1; - unsigned int op_stream_buf_0_cfg_part2; - unsigned int op_stream_buf_0_cfg_part3; - unsigned int op_stream_buf_1_cfg_part1; - unsigned int op_stream_buf_1_cfg_part2; - unsigned int op_stream_buf_1_cfg_part3; - unsigned int luma_qunt_table_0_3; - unsigned int luma_qunt_table_4_7; - unsigned int luma_qunt_table_8_11; - unsigned int luma_qunt_table_12_15; - unsigned int luma_qunt_table_16_19; - unsigned int luma_qunt_table_20_23; - unsigned int luma_qunt_table_24_27; - unsigned int luma_qunt_table_28_31; - unsigned int luma_qunt_table_32_35; - unsigned int luma_qunt_table_36_39; - unsigned int luma_qunt_table_40_43; - unsigned int luma_qunt_table_44_47; - unsigned int luma_qunt_table_48_51; - unsigned int luma_qunt_table_52_55; - unsigned int luma_qunt_table_56_59; - unsigned int luma_qunt_table_60_63; - unsigned int chroma_qunt_table_0_3; - unsigned int chroma_qunt_table_4_7; - unsigned int chroma_qunt_table_8_11; - unsigned int chroma_qunt_table_12_15; - unsigned int chroma_qunt_table_16_19; - unsigned int chroma_qunt_table_20_23; - unsigned int chroma_qunt_table_24_27; - unsigned int chroma_qunt_table_28_31; - unsigned int chroma_qunt_table_32_35; - unsigned int chroma_qunt_table_36_39; - unsigned int chroma_qunt_table_40_43; - unsigned int chroma_qunt_table_44_47; - unsigned int chroma_qunt_table_48_51; - unsigned int chroma_qunt_table_52_55; - unsigned int chroma_qunt_table_56_59; - unsigned int chroma_qunt_table_60_63; - unsigned int luma_dc_hm_code_cnt_table_0_3; - unsigned int luma_dc_hm_code_cnt_table_4_7; - unsigned int luma_dc_hm_code_cnt_table_8_11; - unsigned int luma_dc_hm_code_cnt_table_12_15; - unsigned int luma_dc_hm_code_val_table_0_3; - unsigned int luma_dc_hm_code_val_table_4_7; - unsigned int luma_dc_hm_code_val_table_8_11; - unsigned int chroma_dc_hm_code_cnt_table_0_3; - unsigned int chroma_dc_hm_code_cnt_table_4_7; - unsigned int chroma_dc_hm_code_cnt_table_8_11; - unsigned int chroma_dc_hm_code_cnt_table_12_15; - unsigned int chroma_dc_hm_code_val_table_0_3; - unsigned int chroma_dc_hm_code_val_table_4_7; - unsigned int chroma_dc_hm_code_val_table_8_11; - unsigned int luma_ac_hm_code_cnt_table_0_3; - unsigned int luma_ac_hm_code_cnt_table_4_7; - unsigned int luma_ac_hm_code_cnt_table_8_11; - unsigned int luma_ac_hm_code_cnt_table_12_15; - unsigned int luma_ac_hm_code_val_table_0_3; - unsigned int luma_ac_hm_code_val_table_4_7; - unsigned int luma_ac_hm_code_val_table_8_11; - unsigned int luma_ac_hm_code_val_table_12_15; - unsigned int luma_ac_hm_code_val_table_16_19; - unsigned int luma_ac_hm_code_val_table_20_23; - unsigned int luma_ac_hm_code_val_table_24_27; - unsigned int luma_ac_hm_code_val_table_28_31; - unsigned int luma_ac_hm_code_val_table_32_35; - unsigned int luma_ac_hm_code_val_table_36_39; - unsigned int luma_ac_hm_code_val_table_40_43; - unsigned int luma_ac_hm_code_val_table_44_47; - unsigned int luma_ac_hm_code_val_table_48_51; - unsigned int luma_ac_hm_code_val_table_52_55; - unsigned int luma_ac_hm_code_val_table_56_59; - unsigned int luma_ac_hm_code_val_table_60_63; - unsigned int luma_ac_hm_code_val_table_64_67; - unsigned int luma_ac_hm_code_val_table_68_71; - unsigned int luma_ac_hm_code_val_table_72_75; - unsigned int luma_ac_hm_code_val_table_76_79; - unsigned int luma_ac_hm_code_val_table_80_83; - unsigned int luma_ac_hm_code_val_table_84_87; - unsigned int luma_ac_hm_code_val_table_88_91; - unsigned int luma_ac_hm_code_val_table_92_95; - unsigned int luma_ac_hm_code_val_table_96_99; - unsigned int luma_ac_hm_code_val_table_100_103; - unsigned int luma_ac_hm_code_val_table_104_107; - unsigned int luma_ac_hm_code_val_table_108_111; - unsigned int luma_ac_hm_code_val_table_112_115; - unsigned int luma_ac_hm_code_val_table_116_119; - unsigned int luma_ac_hm_code_val_table_120_123; - unsigned int luma_ac_hm_code_val_table_124_127; - unsigned int luma_ac_hm_code_val_table_128_131; - unsigned int luma_ac_hm_code_val_table_132_135; - unsigned int luma_ac_hm_code_val_table_136_139; - unsigned int luma_ac_hm_code_val_table_140_143; - unsigned int luma_ac_hm_code_val_table_144_147; - unsigned int luma_ac_hm_code_val_table_148_151; - unsigned int luma_ac_hm_code_val_table_152_155; - unsigned int luma_ac_hm_code_val_table_156_159; - unsigned int luma_ac_hm_code_val_table_160_161; - unsigned int chroma_ac_hm_code_cnt_table_0_3; - unsigned int chroma_ac_hm_code_cnt_table_4_7; - unsigned int chroma_ac_hm_code_cnt_table_8_11; - unsigned int chroma_ac_hm_code_cnt_table_12_15; - unsigned int chroma_ac_hm_code_val_table_0_3; - unsigned int chroma_ac_hm_code_val_table_4_7; - unsigned int chroma_ac_hm_code_val_table_8_11; - unsigned int chroma_ac_hm_code_val_table_12_15; - unsigned int chroma_ac_hm_code_val_table_16_19; - unsigned int chroma_ac_hm_code_val_table_20_23; - unsigned int chroma_ac_hm_code_val_table_24_27; - unsigned int chroma_ac_hm_code_val_table_28_31; - unsigned int chroma_ac_hm_code_val_table_32_35; - unsigned int chroma_ac_hm_code_val_table_36_39; - unsigned int chroma_ac_hm_code_val_table_40_43; - unsigned int chroma_ac_hm_code_val_table_44_47; - unsigned int chroma_ac_hm_code_val_table_48_51; - unsigned int chroma_ac_hm_code_val_table_52_55; - unsigned int chroma_ac_hm_code_val_table_56_59; - unsigned int chroma_ac_hm_code_val_table_60_63; - unsigned int chroma_ac_hm_code_val_table_64_67; - unsigned int chroma_ac_hm_code_val_table_68_71; - unsigned int chroma_ac_hm_code_val_table_72_75; - unsigned int chroma_ac_hm_code_val_table_76_79; - unsigned int chroma_ac_hm_code_val_table_80_83; - unsigned int chroma_ac_hm_code_val_table_84_87; - unsigned int chroma_ac_hm_code_val_table_88_91; - unsigned int chroma_ac_hm_code_val_table_92_95; - unsigned int chroma_ac_hm_code_val_table_96_99; - unsigned int chroma_ac_hm_code_val_table_100_103; - unsigned int chroma_ac_hm_code_val_table_104_107; - unsigned int chroma_ac_hm_code_val_table_108_111; - unsigned int chroma_ac_hm_code_val_table_112_115; - unsigned int chroma_ac_hm_code_val_table_116_119; - unsigned int chroma_ac_hm_code_val_table_120_123; - unsigned int chroma_ac_hm_code_val_table_124_127; - unsigned int chroma_ac_hm_code_val_table_128_131; - unsigned int chroma_ac_hm_code_val_table_132_135; - unsigned int chroma_ac_hm_code_val_table_136_139; - unsigned int chroma_ac_hm_code_val_table_140_143; - unsigned int chroma_ac_hm_code_val_table_144_147; - unsigned int chroma_ac_hm_code_val_table_148_151; - unsigned int chroma_ac_hm_code_val_table_152_155; - unsigned int chroma_ac_hm_code_val_table_156_159; - unsigned int chroma_ac_hm_code_val_table_160_161; -} __attribute__((packed)) jpeg_cmd_dec_cfg; - - -/* - * ARM to JPEG configuration commands are passed through the - * uPJpegActionCmdQueue - */ - -/* - * Command to start the encode process - */ - -#define JPEG_CMD_ENC_ENCODE 0x0001 -#define JPEG_CMD_ENC_ENCODE_LEN sizeof(jpeg_cmd_enc_encode) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) jpeg_cmd_enc_encode; - - -/* - * Command to transition from current state of encoder to IDLE state - */ - -#define JPEG_CMD_ENC_IDLE 0x0006 -#define JPEG_CMD_ENC_IDLE_LEN sizeof(jpeg_cmd_enc_idle) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) jpeg_cmd_enc_idle; - - -/* - * Command to inform the encoder that another buffer is ready - */ - -#define JPEG_CMD_ENC_OP_CONSUMED 0x0002 -#define JPEG_CMD_ENC_OP_CONSUMED_LEN sizeof(jpeg_cmd_enc_op_consumed) - - -typedef struct { - unsigned int cmd_id; - unsigned int op_buf_addr; - unsigned int op_buf_size; -} __attribute__((packed)) jpeg_cmd_enc_op_consumed; - - -/* - * Command to start the decoding process - */ - -#define JPEG_CMD_DEC_DECODE 0x0003 -#define JPEG_CMD_DEC_DECODE_LEN sizeof(jpeg_cmd_dec_decode) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) jpeg_cmd_dec_decode; - - -/* - * Command to transition from the current state of decoder to IDLE - */ - -#define JPEG_CMD_DEC_IDLE 0x0007 -#define JPEG_CMD_DEC_IDLE_LEN sizeof(jpeg_cmd_dec_idle) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) jpeg_cmd_dec_idle; - - -/* - * Command to inform that an op buffer is ready for use - */ - -#define JPEG_CMD_DEC_OP_CONSUMED 0x0004 -#define JPEG_CMD_DEC_OP_CONSUMED_LEN sizeof(jpeg_cmd_dec_op_consumed) - - -typedef struct { - unsigned int cmd_id; - unsigned int luma_op_buf_addr; - unsigned int luma_op_buf_size; - unsigned int chroma_op_buf_addr; -} __attribute__((packed)) jpeg_cmd_dec_op_consumed; - - -/* - * Command to pass a new ip buffer to the jpeg decoder - */ - -#define JPEG_CMD_DEC_IP 0x0005 -#define JPEG_CMD_DEC_IP_LEN sizeof(jpeg_cmd_dec_ip_len) - -#define JPEG_CMD_EOI_INDICATOR_NOT_END 0x0000 -#define JPEG_CMD_EOI_INDICATOR_END 0x0001 - -typedef struct { - unsigned int cmd_id; - unsigned int ip_buf_addr; - unsigned int ip_buf_size; - unsigned int eoi_indicator; -} __attribute__((packed)) jpeg_cmd_dec_ip; - - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegmsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegmsg.h deleted file mode 100644 index 9b5ce77e5b24..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5jpegmsg.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef QDSP5VIDJPEGMSGI_H -#define QDSP5VIDJPEGMSGI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - J P E G I N T E R N A L M E S S A G E S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of messages - that are sent by JPEG Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5jpegmsg.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -05/10/08 sv initial version -===========================================================================*/ - -/* - * Messages from JPEG task to ARM through jpeguPMsgQueue - */ - -/* - * Message is ACK for CMD_JPEGE_ENCODE cmd - */ - -#define JPEG_MSG_ENC_ENCODE_ACK 0x0000 -#define JPEG_MSG_ENC_ENCODE_ACK_LEN \ - sizeof(jpeg_msg_enc_encode_ack) - -typedef struct { -} __attribute__((packed)) jpeg_msg_enc_encode_ack; - - -/* - * Message informs the up when op buffer is ready for consumption and - * when encoding is complete or errors - */ - -#define JPEG_MSG_ENC_OP_PRODUCED 0x0001 -#define JPEG_MSG_ENC_OP_PRODUCED_LEN \ - sizeof(jpeg_msg_enc_op_produced) - -#define JPEG_MSGOP_OP_BUF_STATUS_ENC_DONE_PROGRESS 0x0000 -#define JPEG_MSGOP_OP_BUF_STATUS_ENC_DONE_COMPLETE 0x0001 -#define JPEG_MSGOP_OP_BUF_STATUS_ENC_ERR 0x10000 - -typedef struct { - unsigned int op_buf_addr; - unsigned int op_buf_size; - unsigned int op_buf_status; -} __attribute__((packed)) jpeg_msg_enc_op_produced; - - -/* - * Message to ack CMD_JPEGE_IDLE - */ - -#define JPEG_MSG_ENC_IDLE_ACK 0x0002 -#define JPEG_MSG_ENC_IDLE_ACK_LEN sizeof(jpeg_msg_enc_idle_ack) - - -typedef struct { -} __attribute__ ((packed)) jpeg_msg_enc_idle_ack; - - -/* - * Message to indicate the illegal command - */ - -#define JPEG_MSG_ENC_ILLEGAL_COMMAND 0x0003 -#define JPEG_MSG_ENC_ILLEGAL_COMMAND_LEN \ - sizeof(jpeg_msg_enc_illegal_command) - -typedef struct { - unsigned int status; -} __attribute__((packed)) jpeg_msg_enc_illegal_command; - - -/* - * Message to ACK CMD_JPEGD_DECODE - */ - -#define JPEG_MSG_DEC_DECODE_ACK 0x0004 -#define JPEG_MSG_DEC_DECODE_ACK_LEN \ - sizeof(jpeg_msg_dec_decode_ack) - - -typedef struct { -} __attribute__((packed)) jpeg_msg_dec_decode_ack; - - -/* - * Message to inform up that an op buffer is ready for consumption and when - * decoding is complete or an error occurs - */ - -#define JPEG_MSG_DEC_OP_PRODUCED 0x0005 -#define JPEG_MSG_DEC_OP_PRODUCED_LEN \ - sizeof(jpeg_msg_dec_op_produced) - -#define JPEG_MSG_DEC_OP_BUF_STATUS_PROGRESS 0x0000 -#define JPEG_MSG_DEC_OP_BUF_STATUS_DONE 0x0001 - -typedef struct { - unsigned int luma_op_buf_addr; - unsigned int chroma_op_buf_addr; - unsigned int num_mcus; - unsigned int op_buf_status; -} __attribute__((packed)) jpeg_msg_dec_op_produced; - -/* - * Message to ack CMD_JPEGD_IDLE cmd - */ - -#define JPEG_MSG_DEC_IDLE_ACK 0x0006 -#define JPEG_MSG_DEC_IDLE_ACK_LEN sizeof(jpeg_msg_dec_idle_ack) - - -typedef struct { -} __attribute__((packed)) jpeg_msg_dec_idle_ack; - - -/* - * Message to indicate illegal cmd was received - */ - -#define JPEG_MSG_DEC_ILLEGAL_COMMAND 0x0007 -#define JPEG_MSG_DEC_ILLEGAL_COMMAND_LEN \ - sizeof(jpeg_msg_dec_illegal_command) - - -typedef struct { - unsigned int status; -} __attribute__((packed)) jpeg_msg_dec_illegal_command; - -/* - * Message to request up for the next segment of ip bit stream - */ - -#define JPEG_MSG_DEC_IP_REQUEST 0x0008 -#define JPEG_MSG_DEC_IP_REQUEST_LEN \ - sizeof(jpeg_msg_dec_ip_request) - - -typedef struct { -} __attribute__((packed)) jpeg_msg_dec_ip_request; - - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmcmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmcmdi.h deleted file mode 100644 index 3d4fe5618d62..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmcmdi.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef QDSP5LPMCMDI_H -#define QDSP5LPMCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - L P M I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by LPM Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5lpmcmdi.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -06/12/08 sv initial version -===========================================================================*/ - - -/* - * Command to start LPM processing based on the config params - */ - -#define LPM_CMD_START 0x0000 -#define LPM_CMD_START_LEN sizeof(lpm_cmd_start) - -#define LPM_CMD_SPATIAL_FILTER_PART_OPMODE_0 0x00000000 -#define LPM_CMD_SPATIAL_FILTER_PART_OPMODE_1 0x00010000 -typedef struct { - unsigned int cmd_id; - unsigned int ip_data_cfg_part1; - unsigned int ip_data_cfg_part2; - unsigned int ip_data_cfg_part3; - unsigned int ip_data_cfg_part4; - unsigned int op_data_cfg_part1; - unsigned int op_data_cfg_part2; - unsigned int op_data_cfg_part3; - unsigned int spatial_filter_part[32]; -} __attribute__((packed)) lpm_cmd_start; - - - -/* - * Command to stop LPM processing - */ - -#define LPM_CMD_IDLE 0x0001 -#define LPM_CMD_IDLE_LEN sizeof(lpm_cmd_idle) - -typedef struct { - unsigned int cmd_id; -} __attribute__((packed)) lpm_cmd_idle; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmmsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmmsg.h deleted file mode 100644 index 81f766d38fa0..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5lpmmsg.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef QDSP5LPMMSGI_H -#define QDSP5LPMMSGI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - L P M I N T E R N A L M E S S A G E S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by LPM Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5lpmmsg.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -06/12/08 sv initial version -===========================================================================*/ - -/* - * Message to acknowledge CMD_LPM_IDLE command - */ - -#define LPM_MSG_IDLE_ACK 0x0000 -#define LPM_MSG_IDLE_ACK_LEN sizeof(lpm_msg_idle_ack) - -typedef struct { -} __attribute__((packed)) lpm_msg_idle_ack; - - -/* - * Message to acknowledge CMD_LPM_START command - */ - - -#define LPM_MSG_START_ACK 0x0001 -#define LPM_MSG_START_ACK_LEN sizeof(lpm_msg_start_ack) - - -typedef struct { -} __attribute__((packed)) lpm_msg_start_ack; - - -/* - * Message to notify the ARM that LPM processing is complete - */ - -#define LPM_MSG_DONE 0x0002 -#define LPM_MSG_DONE_LEN sizeof(lpm_msg_done) - -typedef struct { -} __attribute__((packed)) lpm_msg_done; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtcmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtcmdi.h deleted file mode 100644 index 9b9521fa17b8..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtcmdi.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef QDSP5RMTCMDI_H -#define QDSP5RMTCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - R M T A S K I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by RM Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ - -/* - * ARM to RMTASK Commands - * - * ARM uses one command queue to communicate with AUDPPTASK - * 1) apuRmtQueue: Used to send commands to RMTASK from APPS processor - * Location : MEMA - * Buffer Size : 3 words - */ - -#define RM_CMD_AUD_CODEC_CFG 0x0 - -#define RM_AUD_CLIENT_ID 0x0 -#define RMT_ENABLE 0x1 -#define RMT_DISABLE 0x0 - -struct aud_codec_config_cmd { - unsigned short cmd_id; - unsigned char task_id; - unsigned char client_id; - unsigned short enable; - unsigned short dec_type; -} __attribute__((packed)); - -#endif /* QDSP5RMTCMDI_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtmsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtmsg.h deleted file mode 100644 index 4e7ed33e1f9c..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5rmtmsg.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef QDSP5RMTMSG_H -#define QDSP5RMTMSG_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - R M T A S K M S G - -GENERAL DESCRIPTION - Messages sent by RMTASK to APPS PROCESSOR - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ - -/* - * RMTASK uses RmtApuRlist to send messages to the APPS PROCESSOR - * Location : MEMA - * Buffer Size : 3 - */ - -#define RMT_CODEC_CONFIG_ACK 0x1 - -struct aud_codec_config_ack { - unsigned char task_id; - unsigned char client_id; - unsigned char reason; - unsigned char enable; - unsigned short dec_type; -} __attribute__((packed)); - -#define RMT_DSP_OUT_OF_MIPS 0x2 - -struct rmt_dsp_out_of_mips { - unsigned short dec_info; - unsigned short rvd_0; - unsigned short rvd_1; -} __attribute__((packed)); - -#endif /* QDSP5RMTMSG_H */ - diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdeccmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdeccmdi.h deleted file mode 100644 index 89af4aae143a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdeccmdi.h +++ /dev/null @@ -1,189 +0,0 @@ -#ifndef QDSP5VIDDECCMDI_H -#define QDSP5VIDDECCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - V I D E O D E C O D E R I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by VIDDEC Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5vdeccmdi.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -05/10/08 ac initial version -===========================================================================*/ - - -/* - * Command to inform VIDDEC that new subframe packet is ready - */ - -#define VIDDEC_CMD_SUBFRAME_PKT 0x0000 -#define VIDDEC_CMD_SUBFRAME_PKT_LEN \ - sizeof(viddec_cmd_subframe_pkt) - -#define VIDDEC_CMD_SF_INFO_1_DM_DMA_STATS_EXCHANGE_FLAG_DM 0x0000 -#define VIDDEC_CMD_SF_INFO_1_DM_DMA_STATS_EXCHANGE_FLAG_DMA 0x0001 - -#define VIDDEC_CMD_SF_INFO_0_SUBFRAME_CONTI 0x0000 -#define VIDDEC_CMD_SF_INFO_0_SUBFRAME_FIRST 0x0001 -#define VIDDEC_CMD_SF_INFO_0_SUBFRAME_LAST 0x0002 -#define VIDDEC_CMD_SF_INFO_0_SUBFRAME_FIRST_AND_LAST 0x0003 - -#define VIDDEC_CMD_CODEC_SELECTION_WORD_MPEG_4 0x0000 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_H_263_P0 0x0001 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_H_264 0x0002 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_H_263_p3 0x0003 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_RV9 0x0004 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_WMV9 0x0005 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_SMCDB 0x0006 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_QFRE 0x0007 -#define VIDDEC_CMD_CODEC_SELECTION_WORD_VLD 0x0008 - -typedef struct { - unsigned short cmd_id; - unsigned short packet_seq_number; - unsigned short codec_instance_id; - unsigned short subframe_packet_size_high; - unsigned short subframe_packet_size_low; - unsigned short subframe_packet_high; - unsigned short subframe_packet_low; - unsigned short subframe_packet_partition; - unsigned short statistics_packet_size_high; - unsigned short statistics_packet_size_low; - unsigned short statistics_packet_high; - unsigned short statistics_packet_low; - unsigned short statistics_partition; - unsigned short subframe_info_1; - unsigned short subframe_info_0; - unsigned short codec_selection_word; - unsigned short num_mbs; -} __attribute__((packed)) viddec_cmd_subframe_pkt; - - -/* - * Command to inform VIDDEC task that post processing is required for the frame - */ - -#define VIDDEC_CMD_PP_ENABLE 0x0001 -#define VIDDEC_CMD_PP_ENABLE_LEN \ - sizeof(viddec_cmd_pp_enable) - -#define VIDDEC_CMD_PP_INFO_0_DM_DMA_LS_EXCHANGE_FLAG_DM 0x0000 -#define VIDDEC_CMD_PP_INFO_0_DM_DMA_LS_EXCHANGE_FLAG_DMA 0x0001 - -typedef struct { - unsigned short cmd_id; - unsigned short packet_seq_num; - unsigned short codec_instance_id; - unsigned short postproc_info_0; - unsigned short codec_selection_word; - unsigned short pp_output_addr_high; - unsigned short pp_output_addr_low; - unsigned short postproc_info_1; - unsigned short load_sharing_packet_size_high; - unsigned short load_sharing_packet_size_low; - unsigned short load_sharing_packet_high; - unsigned short load_sharing_packet_low; - unsigned short load_sharing_partition; - unsigned short pp_param_0; - unsigned short pp_param_1; - unsigned short pp_param_2; - unsigned short pp_param_3; -} __attribute__((packed)) viddec_cmd_pp_enable; - - -/* - * FRAME Header Packet : It is at the start of new frame - */ - -#define VIDDEC_CMD_FRAME_HEADER_PACKET 0x0002 - -#define VIDDEC_CMD_FRAME_INFO_0_ERROR_SKIP 0x0000 -#define VIDDEC_CMD_FRAME_INFO_0_ERROR_BLACK 0x0800 - -/* - * SLICE HEADER PACKET - * I-Slice and P-Slice - */ - -#define VIDDEC_CMD_SLICE_HEADER_PKT_ISLICE 0x0003 -#define VIDDEC_CMD_SLICE_HEADER_PKT_ISLICE_LEN \ - sizeof(viddec_cmd_slice_header_pkt_islice) - -#define VIDDEC_CMD_ISLICE_INFO_1_MOD_SLICE_TYPE_PSLICE 0x0000 -#define VIDDEC_CMD_ISLICE_INFO_1_MOD_SLICE_TYPE_BSLICE 0x0100 -#define VIDDEC_CMD_ISLICE_INFO_1_MOD_SLICE_TYPE_ISLICE 0x0200 -#define VIDDEC_CMD_ISLICE_INFO_1_MOD_SLICE_TYPE_SPSLICE 0x0300 -#define VIDDEC_CMD_ISLICE_INFO_1_MOD_SLICE_TYPE_SISLICE 0x0400 -#define VIDDEC_CMD_ISLICE_INFO_1_NOPADDING 0x0000 -#define VIDDEC_CMD_ISLICE_INFO_1_PADDING 0x0800 - -#define VIDDEC_CMD_ISLICE_EOP_MARKER 0x7FFF - -typedef struct { - unsigned short cmd_id; - unsigned short packet_id; - unsigned short slice_info_0; - unsigned short slice_info_1; - unsigned short slice_info_2; - unsigned short num_bytes_in_rbsp_high; - unsigned short num_bytes_in_rbsp_low; - unsigned short num_bytes_in_rbsp_consumed; - unsigned short end_of_packet_marker; -} __attribute__((packed)) viddec_cmd_slice_header_pkt_islice; - - -#define VIDDEC_CMD_SLICE_HEADER_PKT_PSLICE 0x0003 -#define VIDDEC_CMD_SLICE_HEADER_PKT_PSLICE_LEN \ - sizeof(viddec_cmd_slice_header_pkt_pslice) - - -typedef struct { - unsigned short cmd_id; - unsigned short packet_id; - unsigned short slice_info_0; - unsigned short slice_info_1; - unsigned short slice_info_2; - unsigned short slice_info_3; - unsigned short refidx_l0_map_tab_info_0; - unsigned short refidx_l0_map_tab_info_1; - unsigned short refidx_l0_map_tab_info_2; - unsigned short refidx_l0_map_tab_info_3; - unsigned short num_bytes_in_rbsp_high; - unsigned short num_bytes_in_rbsp_low; - unsigned short num_bytes_in_rbsp_consumed; - unsigned short end_of_packet_marker; -} __attribute__((packed)) viddec_cmd_slice_header_pkt_pslice; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdecmsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdecmsg.h deleted file mode 100644 index ccd129d19a44..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vdecmsg.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef QDSP5VIDDECMSGI_H -#define QDSP5VIDDECMSGI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - V I D E O D E C O D E R I N T E R N A L M E S S A G E S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of messages - that are sent by VIDDEC Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5vdecmsg.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -05/10/08 ac initial version -===========================================================================*/ - -/* - * Message to inform ARM which VDEC_SUBFRAME_PKT_CMD processed by VIDDEC TASK - */ - -#define VIDDEC_MSG_SUBF_DONE 0x0000 -#define VIDDEC_MSG_SUBF_DONE_LEN \ - sizeof(viddec_msg_subf_done) - -typedef struct { - unsigned short packet_seq_number; - unsigned short codec_instance_id; -} __attribute__((packed)) viddec_msg_subf_done; - - -/* - * Message to inform ARM one frame has been decoded - */ - -#define VIDDEC_MSG_FRAME_DONE 0x0001 -#define VIDDEC_MSG_FRAME_DONE_LEN \ - sizeof(viddec_msg_frame_done) - -typedef struct { - unsigned short packet_seq_number; - unsigned short codec_instance_id; -} __attribute__((packed)) viddec_msg_frame_done; - - -/* - * Message to inform ARM that post processing frame has been decoded - */ - -#define VIDDEC_MSG_PP_ENABLE_CMD_DONE 0x0002 -#define VIDDEC_MSG_PP_ENABLE_CMD_DONE_LEN \ - sizeof(viddec_msg_pp_enable_cmd_done) - -typedef struct { - unsigned short packet_seq_number; - unsigned short codec_instance_id; -} __attribute__((packed)) viddec_msg_pp_enable_cmd_done; - - -/* - * Message to inform ARM that one post processing frame has been decoded - */ - - -#define VIDDEC_MSG_PP_FRAME_DONE 0x0003 -#define VIDDEC_MSG_PP_FRAME_DONE_LEN \ - sizeof(viddec_msg_pp_frame_done) - -#define VIDDEC_MSG_DISP_WORTHY_DISP 0x0000 -#define VIDDEC_MSG_DISP_WORTHY_DISP_NONE 0xFFFF - - -typedef struct { - unsigned short packet_seq_number; - unsigned short codec_instance_id; - unsigned short display_worthy; -} __attribute__((packed)) viddec_msg_pp_frame_done; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5venccmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5venccmdi.h deleted file mode 100644 index 34e00a61a349..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5venccmdi.h +++ /dev/null @@ -1,231 +0,0 @@ -#ifndef QDSP5VIDENCCMDI_H -#define QDSP5VIDENCCMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - V I D E O E N C O D E R I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by VIDENC Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -09/25/08 umeshp initial version -===========================================================================*/ - - #define VIDENC_CMD_CFG 0x0000 - #define VIDENC_CMD_ACTIVE 0x0001 - #define VIDENC_CMD_IDLE 0x0002 - #define VIDENC_CMD_FRAME_START 0x0003 - #define VIDENC_CMD_STATUS_QUERY 0x0004 - #define VIDENC_CMD_RC_CFG 0x0005 - #define VIDENC_CMD_INTRA_REFRESH 0x0006 - #define VIDENC_CMD_CODEC_CONFIG 0x0007 - #define VIDENC_CMD_VIDEO_CONFIG 0x0008 - #define VIDENC_CMD_PARAMETER_UPDATE 0x0009 - #define VIDENC_CMD_VENC_CLOCK 0x000A - #define VIDENC_CMD_DIS_CFG 0x000B - #define VIDENC_CMD_DIS 0x000C - #define VIDENC_CMD_DIGITAL_ZOOM 0x000D - - - - -/* - * Command to pass the frame message information to VIDENC - */ - - -#define VIDENC_CMD_FRAME_START_LEN \ - sizeof(videnc_cmd_frame_start) - -typedef struct { - unsigned short cmd_id; - unsigned short frame_info; - unsigned short frame_rho_budget_word_high; - unsigned short frame_rho_budget_word_low; - unsigned short input_luma_addr_high; - unsigned short input_luma_addr_low; - unsigned short input_chroma_addr_high; - unsigned short input_chroma_addr_low; - unsigned short ref_vop_buf_ptr_high; - unsigned short ref_vop_buf_ptr_low; - unsigned short enc_pkt_buf_ptr_high; - unsigned short enc_pkt_buf_ptr_low; - unsigned short enc_pkt_buf_size_high; - unsigned short enc_pkt_buf_size_low; - unsigned short unfilt_recon_vop_buf_ptr_high; - unsigned short unfilt_recon_vop_buf_ptr_low; - unsigned short filt_recon_vop_buf_ptr_high; - unsigned short filt_recon_vop_buf_ptr_low; -} __attribute__((packed)) videnc_cmd_frame_start; - -/* - * Command to pass the frame-level digital stabilization parameters to VIDENC - */ - - -#define VIDENC_CMD_DIS_LEN \ - sizeof(videnc_cmd_dis) - -typedef struct { - unsigned short cmd_id; - unsigned short vfe_out_prev_luma_addr_high; - unsigned short vfe_out_prev_luma_addr_low; - unsigned short stabilization_info; -} __attribute__((packed)) videnc_cmd_dis; - -/* - * Command to pass the codec related parameters to VIDENC - */ - - -#define VIDENC_CMD_CFG_LEN \ - sizeof(videnc_cmd_cfg) - -typedef struct { - unsigned short cmd_id; - unsigned short cfg_info_0; - unsigned short cfg_info_1; - unsigned short four_mv_threshold; - unsigned short ise_fse_mv_cost_fac; - unsigned short venc_frame_dim; - unsigned short venc_DM_partition; -} __attribute__((packed)) videnc_cmd_cfg; - -/* - * Command to start the video encoding - */ - - -#define VIDENC_CMD_ACTIVE_LEN \ - sizeof(videnc_cmd_active) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) videnc_cmd_active; - -/* - * Command to stop the video encoding - */ - - -#define VIDENC_CMD_IDLE_LEN \ - sizeof(videnc_cmd_idle) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) videnc_cmd_idle; - -/* - * Command to query staus of VIDENC - */ - - -#define VIDENC_CMD_STATUS_QUERY_LEN \ - sizeof(videnc_cmd_status_query) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) videnc_cmd_status_query; - -/* - * Command to set rate control for a frame - */ - - -#define VIDENC_CMD_RC_CFG_LEN \ - sizeof(videnc_cmd_rc_cfg) - -typedef struct { - unsigned short cmd_id; - unsigned short max_frame_qp_delta; - unsigned short max_min_frame_qp; -} __attribute__((packed)) videnc_cmd_rc_cfg; - -/* - * Command to set intra-refreshing - */ - - -#define VIDENC_CMD_INTRA_REFRESH_LEN \ - sizeof(videnc_cmd_intra_refresh) - -typedef struct { - unsigned short cmd_id; - unsigned short num_mb_refresh; - unsigned short mb_index[15]; -} __attribute__((packed)) videnc_cmd_intra_refresh; - -/* - * Command to pass digital zoom information to the VIDENC - */ -#define VIDENC_CMD_DIGITAL_ZOOM_LEN \ - sizeof(videnc_cmd_digital_zoom) - -typedef struct { - unsigned short cmd_id; - unsigned short digital_zoom_en; - unsigned short luma_frame_shift_X; - unsigned short luma_frame_shift_Y; - unsigned short up_ip_luma_rows; - unsigned short up_ip_luma_cols; - unsigned short up_ip_chroma_rows; - unsigned short up_ip_chroma_cols; - unsigned short luma_ph_incr_V_low; - unsigned short luma_ph_incr_V_high; - unsigned short luma_ph_incr_H_low; - unsigned short luma_ph_incr_H_high; - unsigned short chroma_ph_incr_V_low; - unsigned short chroma_ph_incr_V_high; - unsigned short chroma_ph_incr_H_low; - unsigned short chroma_ph_incr_H_high; -} __attribute__((packed)) videnc_cmd_digital_zoom; - -/* - * Command to configure digital stabilization parameters - */ - -#define VIDENC_CMD_DIS_CFG_LEN \ - sizeof(videnc_cmd_dis_cfg) - -typedef struct { - unsigned short cmd_id; - unsigned short image_stab_subf_start_row_col; - unsigned short image_stab_subf_dim; - unsigned short image_stab_info_0; -} __attribute__((packed)) videnc_cmd_dis_cfg; - - -/* - * Command to set VIDENC_CMD_VENC_CLOCK - */ - - -#define VIDENC_CMD_VENC_CLOCK_LEN \ - sizeof(struct videnc_cmd_venc_clock) - -struct videnc_cmd_venc_clock { - unsigned short cmd_id; - unsigned short payload; -} __attribute__((packed)) ; - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfecmdi.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfecmdi.h deleted file mode 100644 index 18ea21cc59a0..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfecmdi.h +++ /dev/null @@ -1,910 +0,0 @@ -#ifndef QDSP5VFECMDI_H -#define QDSP5VFECMDI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - V F E I N T E R N A L C O M M A N D S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are accepted by VFE Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5vfecmdi.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -06/12/08 sv initial version -===========================================================================*/ - -/****************************************************************************** - * Commands through vfeCommandScaleQueue - *****************************************************************************/ - -/* - * Command to program scaler for op1 . max op of scaler is VGA - */ - - -#define VFE_CMD_SCALE_OP1_CFG 0x0000 -#define VFE_CMD_SCALE_OP1_CFG_LEN \ - sizeof(vfe_cmd_scale_op1_cfg) - -#define VFE_CMD_SCALE_OP1_SEL_IP_SEL_Y_STANDARD 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_IP_SEL_Y_CASCADED 0x0001 -#define VFE_CMD_SCALE_OP1_SEL_H_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_H_Y_SCALER_ENA 0x0002 -#define VFE_CMD_SCALE_OP1_SEL_H_PP_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_H_PP_Y_SCALER_ENA 0x0004 -#define VFE_CMD_SCALE_OP1_SEL_V_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_V_Y_SCALER_ENA 0x0008 -#define VFE_CMD_SCALE_OP1_SEL_V_PP_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_V_PP_Y_SCALER_ENA 0x0010 -#define VFE_CMD_SCALE_OP1_SEL_IP_SEL_CBCR_STANDARD 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_IP_SEL_CBCR_CASCADED 0x0020 -#define VFE_CMD_SCALE_OP1_SEL_H_CBCR_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_H_CBCR_SCALER_ENA 0x0040 -#define VFE_CMD_SCALE_OP1_SEL_V_CBCR_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP1_SEL_V_CBCR_SCALER_ENA 0x0080 - -#define VFE_CMD_OP1_PP_Y_SCALER_CFG_PART1_DONT_LOAD_COEFFS 0x80000000 -#define VFE_CMD_OP1_PP_Y_SCALER_CFG_PART1_LOAD_COEFFS 0x80000000 - -typedef struct { - unsigned int cmd_id; - unsigned int scale_op1_sel; - unsigned int y_scaler_cfg_part1; - unsigned int y_scaler_cfg_part2; - unsigned int cbcr_scaler_cfg_part1; - unsigned int cbcr_scaler_cfg_part2; - unsigned int cbcr_scaler_cfg_part3; - unsigned int pp_y_scaler_cfg_part1; - unsigned int pp_y_scaler_cfg_part2; - unsigned int y_scaler_v_coeff_bank_part1[16]; - unsigned int y_scaler_v_coeff_bank_part2[16]; - unsigned int y_scaler_h_coeff_bank_part1[16]; - unsigned int y_scaler_h_coeff_bank_part2[16]; -} __attribute__((packed)) vfe_cmd_scale_op1_cfg; - - -/* - * Command to program scaler for op2 - */ - -#define VFE_CMD_SCALE_OP2_CFG 0x0001 -#define VFE_CMD_SCALE_OP2_CFG_LEN \ - sizeof(vfe_cmd_scale_op2_cfg) - -#define VFE_CMD_SCALE_OP2_SEL_IP_SEL_Y_STANDARD 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_IP_SEL_Y_CASCADED 0x0001 -#define VFE_CMD_SCALE_OP2_SEL_H_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_H_Y_SCALER_ENA 0x0002 -#define VFE_CMD_SCALE_OP2_SEL_H_PP_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_H_PP_Y_SCALER_ENA 0x0004 -#define VFE_CMD_SCALE_OP2_SEL_V_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_V_Y_SCALER_ENA 0x0008 -#define VFE_CMD_SCALE_OP2_SEL_V_PP_Y_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_V_PP_Y_SCALER_ENA 0x0010 -#define VFE_CMD_SCALE_OP2_SEL_IP_SEL_CBCR_STANDARD 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_IP_SEL_CBCR_CASCADED 0x0020 -#define VFE_CMD_SCALE_OP2_SEL_H_CBCR_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_H_CBCR_SCALER_ENA 0x0040 -#define VFE_CMD_SCALE_OP2_SEL_V_CBCR_SCALER_DIS 0x0000 -#define VFE_CMD_SCALE_OP2_SEL_V_CBCR_SCALER_ENA 0x0080 - -#define VFE_CMD_OP2_PP_Y_SCALER_CFG_PART1_DONT_LOAD_COEFFS 0x80000000 -#define VFE_CMD_OP2_PP_Y_SCALER_CFG_PART1_LOAD_COEFFS 0x80000000 - -typedef struct { - unsigned int cmd_id; - unsigned int scale_op2_sel; - unsigned int y_scaler_cfg_part1; - unsigned int y_scaler_cfg_part2; - unsigned int cbcr_scaler_cfg_part1; - unsigned int cbcr_scaler_cfg_part2; - unsigned int cbcr_scaler_cfg_part3; - unsigned int pp_y_scaler_cfg_part1; - unsigned int pp_y_scaler_cfg_part2; - unsigned int y_scaler_v_coeff_bank_part1[16]; - unsigned int y_scaler_v_coeff_bank_part2[16]; - unsigned int y_scaler_h_coeff_bank_part1[16]; - unsigned int y_scaler_h_coeff_bank_part2[16]; -} __attribute__((packed)) vfe_cmd_scale_op2_cfg; - - -/****************************************************************************** - * Commands through vfeCommandTableQueue - *****************************************************************************/ - -/* - * Command to program the AXI ip paths - */ - -#define VFE_CMD_AXI_IP_CFG 0x0000 -#define VFE_CMD_AXI_IP_CFG_LEN sizeof(vfe_cmd_axi_ip_cfg) - -#define VFE_CMD_IP_SEL_IP_FORMAT_8 0x0000 -#define VFE_CMD_IP_SEL_IP_FORMAT_10 0x0001 -#define VFE_CMD_IP_SEL_IP_FORMAT_12 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int ip_sel; - unsigned int ip_cfg_part1; - unsigned int ip_cfg_part2; - unsigned int ip_unpack_cfg_part[6]; - unsigned int ip_buf_addr[8]; -} __attribute__ ((packed)) vfe_cmd_axi_ip_cfg; - - -/* - * Command to program axi op paths - */ - -#define VFE_CMD_AXI_OP_CFG 0x0001 -#define VFE_CMD_AXI_OP_CFG_LEN sizeof(vfe_cmd_axi_op_cfg) - -#define VFE_CMD_OP_SEL_OP1 0x0000 -#define VFE_CMD_OP_SEL_OP2 0x0001 -#define VFE_CMD_OP_SEL_OP1_OP2 0x0002 -#define VFE_CMD_OP_SEL_CTOA 0x0003 -#define VFE_CMD_OP_SEL_CTOA_OP1 0x0004 -#define VFE_CMD_OP_SEL_CTOA_OP2 0x0005 -#define VFE_CMD_OP_SEL_OP_FORMAT_8 0x0000 -#define VFE_CMD_OP_SEL_OP_FORMAT_10 0x0008 -#define VFE_CMD_OP_SEL_OP_FORMAT_12 0x0010 - - -typedef struct { - unsigned int cmd_id; - unsigned int op_sel; - unsigned int op1_y_cfg_part1; - unsigned int op1_y_cfg_part2; - unsigned int op1_cbcr_cfg_part1; - unsigned int op1_cbcr_cfg_part2; - unsigned int op2_y_cfg_part1; - unsigned int op2_y_cfg_part2; - unsigned int op2_cbcr_cfg_part1; - unsigned int op2_cbcr_cfg_part2; - unsigned int op1_buf1_addr[16]; - unsigned int op2_buf1_addr[16]; -} __attribute__((packed)) vfe_cmd_axi_op_cfg; - - - - -/* - * Command to program the roll off correction module - */ - -#define VFE_CMD_ROLLOFF_CFG 0x0002 -#define VFE_CMD_ROLLOFF_CFG_LEN \ - sizeof(vfe_cmd_rolloff_cfg) - - -typedef struct { - unsigned int cmd_id; - unsigned int correction_opt_center_pos; - unsigned int radius_square_entry[32]; - unsigned int red_table_entry[32]; - unsigned int green_table_entry[32]; - unsigned int blue_table_entry[32]; -} __attribute__((packed)) vfe_cmd_rolloff_cfg; - -/* - * Command to program RGB gamma table - */ - -#define VFE_CMD_RGB_GAMMA_CFG 0x0003 -#define VFE_CMD_RGB_GAMMA_CFG_LEN \ - sizeof(vfe_cmd_rgb_gamma_cfg) - -#define VFE_CMD_RGB_GAMMA_SEL_LINEAR 0x0000 -#define VFE_CMD_RGB_GAMMA_SEL_PW_LINEAR 0x0001 -typedef struct { - unsigned int cmd_id; - unsigned int rgb_gamma_sel; - unsigned int rgb_gamma_entry[256]; -} __attribute__((packed)) vfe_cmd_rgb_gamma_cfg; - - -/* - * Command to program luma gamma table for the noise reduction path - */ - -#define VFE_CMD_Y_GAMMA_CFG 0x0004 -#define VFE_CMD_Y_GAMMA_CFG_LEN \ - sizeof(vfe_cmd_y_gamma_cfg) - -#define VFE_CMD_Y_GAMMA_SEL_LINEAR 0x0000 -#define VFE_CMD_Y_GAMMA_SEL_PW_LINEAR 0x0001 - -typedef struct { - unsigned int cmd_id; - unsigned int y_gamma_sel; - unsigned int y_gamma_entry[256]; -} __attribute__((packed)) vfe_cmd_y_gamma_cfg; - - - -/****************************************************************************** - * Commands through vfeCommandQueue - *****************************************************************************/ - -/* - * Command to reset the VFE to a known good state.All previously programmed - * Params will be lost - */ - - -#define VFE_CMD_RESET 0x0000 -#define VFE_CMD_RESET_LEN sizeof(vfe_cmd_reset) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) vfe_cmd_reset; - - -/* - * Command to start VFE processing based on the config params - */ - - -#define VFE_CMD_START 0x0001 -#define VFE_CMD_START_LEN sizeof(vfe_cmd_start) - -#define VFE_CMD_STARTUP_PARAMS_SRC_CAMIF 0x0000 -#define VFE_CMD_STARTUP_PARAMS_SRC_AXI 0x0001 -#define VFE_CMD_STARTUP_PARAMS_MODE_CONTINUOUS 0x0000 -#define VFE_CMD_STARTUP_PARAMS_MODE_SNAPSHOT 0x0002 - -#define VFE_CMD_IMAGE_PL_BLACK_LVL_CORR_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_BLACK_LVL_CORR_ENA 0x0001 -#define VFE_CMD_IMAGE_PL_ROLLOFF_CORR_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_ROLLOFF_CORR_ENA 0x0002 -#define VFE_CMD_IMAGE_PL_WHITE_BAL_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_WHITE_BAL_ENA 0x0004 -#define VFE_CMD_IMAGE_PL_RGB_GAMMA_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_RGB_GAMMA_ENA 0x0008 -#define VFE_CMD_IMAGE_PL_LUMA_NOISE_RED_PATH_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_LUMA_NOISE_RED_PATH_ENA 0x0010 -#define VFE_CMD_IMAGE_PL_ADP_FILTER_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_ADP_FILTER_ENA 0x0020 -#define VFE_CMD_IMAGE_PL_CHROMA_SAMP_DIS 0x0000 -#define VFE_CMD_IMAGE_PL_CHROMA_SAMP_ENA 0x0040 - - -typedef struct { - unsigned int cmd_id; - unsigned int startup_params; - unsigned int image_pipeline; - unsigned int frame_dimension; -} __attribute__((packed)) vfe_cmd_start; - - -/* - * Command to halt all processing - */ - -#define VFE_CMD_STOP 0x0002 -#define VFE_CMD_STOP_LEN sizeof(vfe_cmd_stop) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) vfe_cmd_stop; - - -/* - * Command to commit the params that have been programmed to take - * effect on the next frame - */ - -#define VFE_CMD_UPDATE 0x0003 -#define VFE_CMD_UPDATE_LEN sizeof(vfe_cmd_update) - - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) vfe_cmd_update; - - -/* - * Command to program CAMIF module - */ - -#define VFE_CMD_CAMIF_CFG 0x0004 -#define VFE_CMD_CAMIF_CFG_LEN sizeof(vfe_cmd_camif_cfg) - -#define VFE_CMD_CFG_VSYNC_SYNC_EDGE_HIGH 0x0000 -#define VFE_CMD_CFG_VSYNC_SYNC_EDGE_LOW 0x0002 -#define VFE_CMD_CFG_HSYNC_SYNC_EDGE_HIGH 0x0000 -#define VFE_CMD_CFG_HSYNC_SYNC_EDGE_LOW 0x0004 -#define VFE_CMD_CFG_SYNC_MODE_APS 0x0000 -#define VFE_CMD_CFG_SYNC_MODE_EFS 0X0008 -#define VFE_CMD_CFG_SYNC_MODE_ELS 0x0010 -#define VFE_CMD_CFG_SYNC_MODE_RVD 0x0018 -#define VFE_CMD_CFG_VFE_SUBSAMP_EN_DIS 0x0000 -#define VFE_CMD_CFG_VFE_SUBSAMP_EN_ENA 0x0020 -#define VFE_CMD_CFG_BUS_SUBSAMP_EN_DIS 0x0000 -#define VFE_CMD_CFG_BUS_SUBSAMP_EN_ENA 0x0080 -#define VFE_CMD_CFG_IRQ_SUBSAMP_EN_DIS 0x0000 -#define VFE_CMD_CFG_IRQ_SUBSAMP_EN_ENA 0x0800 - -#define VFE_CMD_SUBSAMP2_CFG_PIXEL_SKIP_16 0x0000 -#define VFE_CMD_SUBSAMP2_CFG_PIXEL_SKIP_12 0x0010 - -#define VFE_CMD_EPOCH_IRQ_1_DIS 0x0000 -#define VFE_CMD_EPOCH_IRQ_1_ENA 0x4000 -#define VFE_CMD_EPOCH_IRQ_2_DIS 0x0000 -#define VFE_CMD_EPOCH_IRQ_2_ENA 0x8000 - -typedef struct { - unsigned int cmd_id; - unsigned int cfg; - unsigned int efs_cfg; - unsigned int frame_cfg; - unsigned int window_width_cfg; - unsigned int window_height_cfg; - unsigned int subsamp1_cfg; - unsigned int subsamp2_cfg; - unsigned int epoch_irq; -} __attribute__((packed)) vfe_cmd_camif_cfg; - - - -/* - * Command to program the black level module - */ - -#define VFE_CMD_BLACK_LVL_CFG 0x0005 -#define VFE_CMD_BLACK_LVL_CFG_LEN sizeof(vfe_cmd_black_lvl_cfg) - -#define VFE_CMD_BL_SEL_MANUAL 0x0000 -#define VFE_CMD_BL_SEL_AUTO 0x0001 - -typedef struct { - unsigned int cmd_id; - unsigned int black_lvl_sel; - unsigned int cfg_part[3]; -} __attribute__((packed)) vfe_cmd_black_lvl_cfg; - - -/* - * Command to program the active region by cropping the region of interest - */ - -#define VFE_CMD_ACTIVE_REGION_CFG 0x0006 -#define VFE_CMD_ACTIVE_REGION_CFG_LEN \ - sizeof(vfe_cmd_active_region_cfg) - - -typedef struct { - unsigned int cmd_id; - unsigned int cfg_part1; - unsigned int cfg_part2; -} __attribute__((packed)) vfe_cmd_active_region_cfg; - - - -/* - * Command to program the defective pixel correction(DPC) , - * adaptive bayer filter (ABF) and demosaic modules - */ - -#define VFE_CMD_DEMOSAIC_CFG 0x0007 -#define VFE_CMD_DEMOSAIC_CFG_LEN sizeof(vfe_cmd_demosaic_cfg) - -#define VFE_CMD_DEMOSAIC_PART1_ABF_EN_DIS 0x0000 -#define VFE_CMD_DEMOSAIC_PART1_ABF_EN_ENA 0x0001 -#define VFE_CMD_DEMOSAIC_PART1_DPC_EN_DIS 0x0000 -#define VFE_CMD_DEMOSAIC_PART1_DPC_EN_ENA 0x0002 -#define VFE_CMD_DEMOSAIC_PART1_FORCE_ABF_OFF 0x0000 -#define VFE_CMD_DEMOSAIC_PART1_FORCE_ABF_ON 0x0004 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_1 0x00000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_2 0x10000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_4 0x20000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_8 0x30000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_1_2 0x50000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_1_4 0x60000000 -#define VFE_CMD_DEMOSAIC_PART1_SLOPE_SHIFT_1_8 0x70000000 - -typedef struct { - unsigned int cmd_id; - unsigned int demosaic_part1; - unsigned int demosaic_part2; - unsigned int demosaic_part3; - unsigned int demosaic_part4; - unsigned int demosaic_part5; -} __attribute__((packed)) vfe_cmd_demosaic_cfg; - - -/* - * Command to program the ip format - */ - -#define VFE_CMD_IP_FORMAT_CFG 0x0008 -#define VFE_CMD_IP_FORMAT_CFG_LEN \ - sizeof(vfe_cmd_ip_format_cfg) - -#define VFE_CMD_IP_FORMAT_SEL_RGRG 0x0000 -#define VFE_CMD_IP_FORMAT_SEL_GRGR 0x0001 -#define VFE_CMD_IP_FORMAT_SEL_BGBG 0x0002 -#define VFE_CMD_IP_FORMAT_SEL_GBGB 0x0003 -#define VFE_CMD_IP_FORMAT_SEL_YCBYCR 0x0004 -#define VFE_CMD_IP_FORMAT_SEL_YCRYCB 0x0005 -#define VFE_CMD_IP_FORMAT_SEL_CBYCRY 0x0006 -#define VFE_CMD_IP_FORMAT_SEL_CRYCBY 0x0007 -#define VFE_CMD_IP_FORMAT_SEL_NO_CHROMA 0x0000 -#define VFE_CMD_IP_FORMAT_SEL_CHROMA 0x0008 - - -typedef struct { - unsigned int cmd_id; - unsigned int ip_format_sel; - unsigned int balance_gains_part1; - unsigned int balance_gains_part2; -} __attribute__((packed)) vfe_cmd_ip_format_cfg; - - - -/* - * Command to program max and min allowed op values - */ - -#define VFE_CMD_OP_CLAMP_CFG 0x0009 -#define VFE_CMD_OP_CLAMP_CFG_LEN \ - sizeof(vfe_cmd_op_clamp_cfg) - -typedef struct { - unsigned int cmd_id; - unsigned int op_clamp_max; - unsigned int op_clamp_min; -} __attribute__((packed)) vfe_cmd_op_clamp_cfg; - - -/* - * Command to program chroma sub sample module - */ - -#define VFE_CMD_CHROMA_SUBSAMPLE_CFG 0x000A -#define VFE_CMD_CHROMA_SUBSAMPLE_CFG_LEN \ - sizeof(vfe_cmd_chroma_subsample_cfg) - -#define VFE_CMD_CHROMA_SUBSAMP_SEL_H_INTERESTIAL_SAMPS 0x0000 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_H_COSITED_SAMPS 0x0001 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_V_INTERESTIAL_SAMPS 0x0000 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_V_COSITED_SAMPS 0x0002 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_H_SUBSAMP_DIS 0x0000 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_H_SUBSAMP_ENA 0x0004 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_V_SUBSAMP_DIS 0x0000 -#define VFE_CMD_CHROMA_SUBSAMP_SEL_V_SUBSAMP_ENA 0x0008 - -typedef struct { - unsigned int cmd_id; - unsigned int chroma_subsamp_sel; -} __attribute__((packed)) vfe_cmd_chroma_subsample_cfg; - - -/* - * Command to program the white balance module - */ - -#define VFE_CMD_WHITE_BALANCE_CFG 0x000B -#define VFE_CMD_WHITE_BALANCE_CFG_LEN \ - sizeof(vfe_cmd_white_balance_cfg) - -typedef struct { - unsigned int cmd_id; - unsigned int white_balance_gains; -} __attribute__((packed)) vfe_cmd_white_balance_cfg; - - -/* - * Command to program the color processing module - */ - -#define VFE_CMD_COLOR_PROCESS_CFG 0x000C -#define VFE_CMD_COLOR_PROCESS_CFG_LEN \ - sizeof(vfe_cmd_color_process_cfg) - -#define VFE_CMD_COLOR_CORRE_PART7_Q7_FACTORS 0x0000 -#define VFE_CMD_COLOR_CORRE_PART7_Q8_FACTORS 0x0001 -#define VFE_CMD_COLOR_CORRE_PART7_Q9_FACTORS 0x0002 -#define VFE_CMD_COLOR_CORRE_PART7_Q10_FACTORS 0x0003 - -typedef struct { - unsigned int cmd_id; - unsigned int color_correction_part1; - unsigned int color_correction_part2; - unsigned int color_correction_part3; - unsigned int color_correction_part4; - unsigned int color_correction_part5; - unsigned int color_correction_part6; - unsigned int color_correction_part7; - unsigned int chroma_enhance_part1; - unsigned int chroma_enhance_part2; - unsigned int chroma_enhance_part3; - unsigned int chroma_enhance_part4; - unsigned int chroma_enhance_part5; - unsigned int luma_calc_part1; - unsigned int luma_calc_part2; -} __attribute__((packed)) vfe_cmd_color_process_cfg; - - -/* - * Command to program adaptive filter module - */ - -#define VFE_CMD_ADP_FILTER_CFG 0x000D -#define VFE_CMD_ADP_FILTER_CFG_LEN \ - sizeof(vfe_cmd_adp_filter_cfg) - -#define VFE_CMD_ASF_CFG_PART_SMOOTH_FILTER_DIS 0x0000 -#define VFE_CMD_ASF_CFG_PART_SMOOTH_FILTER_ENA 0x0001 -#define VFE_CMD_ASF_CFG_PART_NO_SHARP_MODE 0x0000 -#define VFE_CMD_ASF_CFG_PART_SINGLE_FILTER 0x0002 -#define VFE_CMD_ASF_CFG_PART_DUAL_FILTER 0x0004 -#define VFE_CMD_ASF_CFG_PART_SHARP_MODE 0x0007 - -typedef struct { - unsigned int cmd_id; - unsigned int asf_cfg_part[7]; -} __attribute__((packed)) vfe_cmd_adp_filter_cfg; - - -/* - * Command to program for frame skip pattern for op1 and op2 - */ - -#define VFE_CMD_FRAME_SKIP_CFG 0x000E -#define VFE_CMD_FRAME_SKIP_CFG_LEN \ - sizeof(vfe_cmd_frame_skip_cfg) - -typedef struct { - unsigned int cmd_id; - unsigned int frame_skip_pattern_op1; - unsigned int frame_skip_pattern_op2; -} __attribute__((packed)) vfe_cmd_frame_skip_cfg; - - -/* - * Command to program field-of-view crop for digital zoom - */ - -#define VFE_CMD_FOV_CROP 0x000F -#define VFE_CMD_FOV_CROP_LEN sizeof(vfe_cmd_fov_crop) - -typedef struct { - unsigned int cmd_id; - unsigned int fov_crop_part1; - unsigned int fov_crop_part2; -} __attribute__((packed)) vfe_cmd_fov_crop; - - - -/* - * Command to program auto focus(AF) statistics module - */ - -#define VFE_CMD_STATS_AUTOFOCUS_CFG 0x0010 -#define VFE_CMD_STATS_AUTOFOCUS_CFG_LEN \ - sizeof(vfe_cmd_stats_autofocus_cfg) - -#define VFE_CMD_AF_STATS_SEL_STATS_DIS 0x0000 -#define VFE_CMD_AF_STATS_SEL_STATS_ENA 0x0001 -#define VFE_CMD_AF_STATS_SEL_PRI_FIXED 0x0000 -#define VFE_CMD_AF_STATS_SEL_PRI_VAR 0x0002 -#define VFE_CMD_AF_STATS_CFG_PART_METRIC_SUM 0x00000000 -#define VFE_CMD_AF_STATS_CFG_PART_METRIC_MAX 0x00200000 - -typedef struct { - unsigned int cmd_id; - unsigned int af_stats_sel; - unsigned int af_stats_cfg_part[8]; - unsigned int af_stats_op_buf_hdr; - unsigned int af_stats_op_buf[3]; -} __attribute__((packed)) vfe_cmd_stats_autofocus_cfg; - - -/* - * Command to program White balance(wb) and exposure (exp) - * statistics module - */ - -#define VFE_CMD_STATS_WB_EXP_CFG 0x0011 -#define VFE_CMD_STATS_WB_EXP_CFG_LEN \ - sizeof(vfe_cmd_stats_wb_exp_cfg) - -#define VFE_CMD_WB_EXP_STATS_SEL_STATS_DIS 0x0000 -#define VFE_CMD_WB_EXP_STATS_SEL_STATS_ENA 0x0001 -#define VFE_CMD_WB_EXP_STATS_SEL_PRI_FIXED 0x0000 -#define VFE_CMD_WB_EXP_STATS_SEL_PRI_VAR 0x0002 - -#define VFE_CMD_WB_EXP_STATS_CFG_PART1_EXP_REG_8_8 0x0000 -#define VFE_CMD_WB_EXP_STATS_CFG_PART1_EXP_REG_16_16 0x0001 -#define VFE_CMD_WB_EXP_STATS_CFG_PART1_EXP_SREG_8_8 0x0000 -#define VFE_CMD_WB_EXP_STATS_CFG_PART1_EXP_SREG_4_4 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int wb_exp_stats_sel; - unsigned int wb_exp_stats_cfg_part1; - unsigned int wb_exp_stats_cfg_part2; - unsigned int wb_exp_stats_cfg_part3; - unsigned int wb_exp_stats_cfg_part4; - unsigned int wb_exp_stats_op_buf_hdr; - unsigned int wb_exp_stats_op_buf[3]; -} __attribute__((packed)) vfe_cmd_stats_wb_exp_cfg; - - -/* - * Command to program histogram(hg) stats module - */ - -#define VFE_CMD_STATS_HG_CFG 0x0012 -#define VFE_CMD_STATS_HG_CFG_LEN \ - sizeof(vfe_cmd_stats_hg_cfg) - -#define VFE_CMD_HG_STATS_SEL_PRI_FIXED 0x0000 -#define VFE_CMD_HG_STATS_SEL_PRI_VAR 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int hg_stats_sel; - unsigned int hg_stats_cfg_part1; - unsigned int hg_stats_cfg_part2; - unsigned int hg_stats_op_buf_hdr; - unsigned int hg_stats_op_buf; -} __attribute__((packed)) vfe_cmd_stats_hg_cfg; - - -/* - * Command to acknowledge last MSG_VFE_OP1 message - */ - -#define VFE_CMD_OP1_ACK 0x0013 -#define VFE_CMD_OP1_ACK_LEN sizeof(vfe_cmd_op1_ack) - -typedef struct { - unsigned int cmd_id; - unsigned int op1_buf_y_addr; - unsigned int op1_buf_cbcr_addr; -} __attribute__((packed)) vfe_cmd_op1_ack; - - - -/* - * Command to acknowledge last MSG_VFE_OP2 message - */ - -#define VFE_CMD_OP2_ACK 0x0014 -#define VFE_CMD_OP2_ACK_LEN sizeof(vfe_cmd_op2_ack) - -typedef struct { - unsigned int cmd_id; - unsigned int op2_buf_y_addr; - unsigned int op2_buf_cbcr_addr; -} __attribute__((packed)) vfe_cmd_op2_ack; - - - -/* - * Command to acknowledge MSG_VFE_STATS_AUTOFOCUS msg - */ - -#define VFE_CMD_STATS_AF_ACK 0x0015 -#define VFE_CMD_STATS_AF_ACK_LEN sizeof(vfe_cmd_stats_af_ack) - - -typedef struct { - unsigned int cmd_id; - unsigned int af_stats_op_buf; -} __attribute__((packed)) vfe_cmd_stats_af_ack; - - -/* - * Command to acknowledge MSG_VFE_STATS_WB_EXP msg - */ - -#define VFE_CMD_STATS_WB_EXP_ACK 0x0016 -#define VFE_CMD_STATS_WB_EXP_ACK_LEN sizeof(vfe_cmd_stats_wb_exp_ack) - -typedef struct { - unsigned int cmd_id; - unsigned int wb_exp_stats_op_buf; -} __attribute__((packed)) vfe_cmd_stats_wb_exp_ack; - - -/* - * Command to acknowledge MSG_VFE_EPOCH1 message - */ - -#define VFE_CMD_EPOCH1_ACK 0x0017 -#define VFE_CMD_EPOCH1_ACK_LEN sizeof(vfe_cmd_epoch1_ack) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) vfe_cmd_epoch1_ack; - - -/* - * Command to acknowledge MSG_VFE_EPOCH2 message - */ - -#define VFE_CMD_EPOCH2_ACK 0x0018 -#define VFE_CMD_EPOCH2_ACK_LEN sizeof(vfe_cmd_epoch2_ack) - -typedef struct { - unsigned short cmd_id; -} __attribute__((packed)) vfe_cmd_epoch2_ack; - - - -/* - * Command to configure, enable or disable synchronous timer1 - */ - -#define VFE_CMD_SYNC_TIMER1_CFG 0x0019 -#define VFE_CMD_SYNC_TIMER1_CFG_LEN \ - sizeof(vfe_cmd_sync_timer1_cfg) - -#define VFE_CMD_SYNC_T1_CFG_PART1_TIMER_DIS 0x0000 -#define VFE_CMD_SYNC_T1_CFG_PART1_TIMER_ENA 0x0001 -#define VFE_CMD_SYNC_T1_CFG_PART1_POL_HIGH 0x0000 -#define VFE_CMD_SYNC_T1_CFG_PART1_POL_LOW 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int sync_t1_cfg_part1; - unsigned int sync_t1_h_sync_countdown; - unsigned int sync_t1_pclk_countdown; - unsigned int sync_t1_duration; -} __attribute__((packed)) vfe_cmd_sync_timer1_cfg; - - -/* - * Command to configure, enable or disable synchronous timer1 - */ - -#define VFE_CMD_SYNC_TIMER2_CFG 0x001A -#define VFE_CMD_SYNC_TIMER2_CFG_LEN \ - sizeof(vfe_cmd_sync_timer2_cfg) - -#define VFE_CMD_SYNC_T2_CFG_PART1_TIMER_DIS 0x0000 -#define VFE_CMD_SYNC_T2_CFG_PART1_TIMER_ENA 0x0001 -#define VFE_CMD_SYNC_T2_CFG_PART1_POL_HIGH 0x0000 -#define VFE_CMD_SYNC_T2_CFG_PART1_POL_LOW 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int sync_t2_cfg_part1; - unsigned int sync_t2_h_sync_countdown; - unsigned int sync_t2_pclk_countdown; - unsigned int sync_t2_duration; -} __attribute__((packed)) vfe_cmd_sync_timer2_cfg; - - -/* - * Command to configure and start asynchronous timer1 - */ - -#define VFE_CMD_ASYNC_TIMER1_START 0x001B -#define VFE_CMD_ASYNC_TIMER1_START_LEN \ - sizeof(vfe_cmd_async_timer1_start) - -#define VFE_CMD_ASYNC_T1_POLARITY_A_HIGH 0x0000 -#define VFE_CMD_ASYNC_T1_POLARITY_A_LOW 0x0001 -#define VFE_CMD_ASYNC_T1_POLARITY_B_HIGH 0x0000 -#define VFE_CMD_ASYNC_T1_POLARITY_B_LOW 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int async_t1a_cfg; - unsigned int async_t1b_cfg; - unsigned int async_t1_polarity; -} __attribute__((packed)) vfe_cmd_async_timer1_start; - - -/* - * Command to configure and start asynchronous timer2 - */ - -#define VFE_CMD_ASYNC_TIMER2_START 0x001C -#define VFE_CMD_ASYNC_TIMER2_START_LEN \ - sizeof(vfe_cmd_async_timer2_start) - -#define VFE_CMD_ASYNC_T2_POLARITY_A_HIGH 0x0000 -#define VFE_CMD_ASYNC_T2_POLARITY_A_LOW 0x0001 -#define VFE_CMD_ASYNC_T2_POLARITY_B_HIGH 0x0000 -#define VFE_CMD_ASYNC_T2_POLARITY_B_LOW 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int async_t2a_cfg; - unsigned int async_t2b_cfg; - unsigned int async_t2_polarity; -} __attribute__((packed)) vfe_cmd_async_timer2_start; - - -/* - * Command to program partial configurations of auto focus(af) - */ - -#define VFE_CMD_STATS_AF_UPDATE 0x001D -#define VFE_CMD_STATS_AF_UPDATE_LEN \ - sizeof(vfe_cmd_stats_af_update) - -#define VFE_CMD_AF_UPDATE_PART1_WINDOW_ONE 0x00000000 -#define VFE_CMD_AF_UPDATE_PART1_WINDOW_MULTI 0x80000000 - -typedef struct { - unsigned int cmd_id; - unsigned int af_update_part1; - unsigned int af_update_part2; -} __attribute__((packed)) vfe_cmd_stats_af_update; - - -/* - * Command to program partial cfg of wb and exp - */ - -#define VFE_CMD_STATS_WB_EXP_UPDATE 0x001E -#define VFE_CMD_STATS_WB_EXP_UPDATE_LEN \ - sizeof(vfe_cmd_stats_wb_exp_update) - -#define VFE_CMD_WB_EXP_UPDATE_PART1_REGIONS_8_8 0x0000 -#define VFE_CMD_WB_EXP_UPDATE_PART1_REGIONS_16_16 0x0001 -#define VFE_CMD_WB_EXP_UPDATE_PART1_SREGIONS_8_8 0x0000 -#define VFE_CMD_WB_EXP_UPDATE_PART1_SREGIONS_4_4 0x0002 - -typedef struct { - unsigned int cmd_id; - unsigned int wb_exp_update_part1; - unsigned int wb_exp_update_part2; - unsigned int wb_exp_update_part3; - unsigned int wb_exp_update_part4; -} __attribute__((packed)) vfe_cmd_stats_wb_exp_update; - - - -/* - * Command to re program the CAMIF FRAME CONFIG settings - */ - -#define VFE_CMD_UPDATE_CAMIF_FRAME_CFG 0x001F -#define VFE_CMD_UPDATE_CAMIF_FRAME_CFG_LEN \ - sizeof(vfe_cmd_update_camif_frame_cfg) - -typedef struct { - unsigned int cmd_id; - unsigned int camif_frame_cfg; -} __attribute__((packed)) vfe_cmd_update_camif_frame_cfg; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfemsg.h b/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfemsg.h deleted file mode 100644 index 7d7f73169306..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/qdsp5vfemsg.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef QDSP5VFEMSGI_H -#define QDSP5VFEMSGI_H - -/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* - - V F E I N T E R N A L M E S S A G E S - -GENERAL DESCRIPTION - This file contains defintions of format blocks of commands - that are sent by VFE Task - -REFERENCES - None - -EXTERNALIZED FUNCTIONS - None - -Copyright (c) 1992-2009, The Linux Foundation. All rights reserved. - -This software is licensed under the terms of the GNU General Public -License version 2, as published by the Free Software Foundation, and -may be copied, distributed, and modified under those terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/ -/*=========================================================================== - - EDIT HISTORY FOR FILE - -This section contains comments describing changes made to this file. -Notice that changes are listed in reverse chronological order. - -$Header: //source/qcom/qct/multimedia2/AdspSvc/7XXX/qdsp5cmd/video/qdsp5vfemsg.h#2 $ $DateTime: 2008/07/30 10:50:23 $ $Author: pavanr $ -Revision History: - -when who what, where, why --------- --- ---------------------------------------------------------- -06/12/08 sv initial version -===========================================================================*/ - - -/* - * Message to acknowledge CMD_VFE_REST command - */ - -#define VFE_MSG_RESET_ACK 0x0000 -#define VFE_MSG_RESET_ACK_LEN sizeof(vfe_msg_reset_ack) - -typedef struct { -} __attribute__((packed)) vfe_msg_reset_ack; - - -/* - * Message to acknowledge CMD_VFE_START command - */ - -#define VFE_MSG_START_ACK 0x0001 -#define VFE_MSG_START_ACK_LEN sizeof(vfe_msg_start_ack) - -typedef struct { -} __attribute__((packed)) vfe_msg_start_ack; - -/* - * Message to acknowledge CMD_VFE_STOP command - */ - -#define VFE_MSG_STOP_ACK 0x0002 -#define VFE_MSG_STOP_ACK_LEN sizeof(vfe_msg_stop_ack) - -typedef struct { -} __attribute__((packed)) vfe_msg_stop_ack; - - -/* - * Message to acknowledge CMD_VFE_UPDATE command - */ - -#define VFE_MSG_UPDATE_ACK 0x0003 -#define VFE_MSG_UPDATE_ACK_LEN sizeof(vfe_msg_update_ack) - -typedef struct { -} __attribute__((packed)) vfe_msg_update_ack; - - -/* - * Message to notify the ARM that snapshot processing is complete - * and that the VFE is now STATE_VFE_IDLE - */ - -#define VFE_MSG_SNAPSHOT_DONE 0x0004 -#define VFE_MSG_SNAPSHOT_DONE_LEN \ - sizeof(vfe_msg_snapshot_done) - -typedef struct { -} __attribute__((packed)) vfe_msg_snapshot_done; - - - -/* - * Message to notify ARM that illegal cmd was received and - * system is in the IDLE state - */ - -#define VFE_MSG_ILLEGAL_CMD 0x0005 -#define VFE_MSG_ILLEGAL_CMD_LEN \ - sizeof(vfe_msg_illegal_cmd) - -typedef struct { - unsigned int status; -} __attribute__((packed)) vfe_msg_illegal_cmd; - - -/* - * Message to notify ARM that op1 buf is full and ready - */ - -#define VFE_MSG_OP1 0x0006 -#define VFE_MSG_OP1_LEN sizeof(vfe_msg_op1) - -typedef struct { - unsigned int op1_buf_y_addr; - unsigned int op1_buf_cbcr_addr; - unsigned int black_level_even_col; - unsigned int black_level_odd_col; - unsigned int defect_pixels_detected; - unsigned int asf_max_edge; -} __attribute__((packed)) vfe_msg_op1; - - -/* - * Message to notify ARM that op2 buf is full and ready - */ - -#define VFE_MSG_OP2 0x0007 -#define VFE_MSG_OP2_LEN sizeof(vfe_msg_op2) - -typedef struct { - unsigned int op2_buf_y_addr; - unsigned int op2_buf_cbcr_addr; - unsigned int black_level_even_col; - unsigned int black_level_odd_col; - unsigned int defect_pixels_detected; - unsigned int asf_max_edge; -} __attribute__((packed)) vfe_msg_op2; - - -/* - * Message to notify ARM that autofocus(af) stats are ready - */ - -#define VFE_MSG_STATS_AF 0x0008 -#define VFE_MSG_STATS_AF_LEN sizeof(vfe_msg_stats_af) - -typedef struct { - unsigned int af_stats_op_buffer; -} __attribute__((packed)) vfe_msg_stats_af; - - -/* - * Message to notify ARM that white balance(wb) and exposure (exp) - * stats are ready - */ - -#define VFE_MSG_STATS_WB_EXP 0x0009 -#define VFE_MSG_STATS_WB_EXP_LEN \ - sizeof(vfe_msg_stats_wb_exp) - -typedef struct { - unsigned int wb_exp_stats_op_buf; -} __attribute__((packed)) vfe_msg_stats_wb_exp; - - -/* - * Message to notify the ARM that histogram(hg) stats are ready - */ - -#define VFE_MSG_STATS_HG 0x000A -#define VFE_MSG_STATS_HG_LEN sizeof(vfe_msg_stats_hg) - -typedef struct { - unsigned int hg_stats_op_buf; -} __attribute__((packed)) vfe_msg_stats_hg; - - -/* - * Message to notify the ARM that epoch1 event occurred in the CAMIF - */ - -#define VFE_MSG_EPOCH1 0x000B -#define VFE_MSG_EPOCH1_LEN sizeof(vfe_msg_epoch1) - -typedef struct { -} __attribute__((packed)) vfe_msg_epoch1; - - -/* - * Message to notify the ARM that epoch2 event occurred in the CAMIF - */ - -#define VFE_MSG_EPOCH2 0x000C -#define VFE_MSG_EPOCH2_LEN sizeof(vfe_msg_epoch2) - -typedef struct { -} __attribute__((packed)) vfe_msg_epoch2; - - -/* - * Message to notify the ARM that sync timer1 op is completed - */ - -#define VFE_MSG_SYNC_T1_DONE 0x000D -#define VFE_MSG_SYNC_T1_DONE_LEN sizeof(vfe_msg_sync_t1_done) - -typedef struct { -} __attribute__((packed)) vfe_msg_sync_t1_done; - - -/* - * Message to notify the ARM that sync timer2 op is completed - */ - -#define VFE_MSG_SYNC_T2_DONE 0x000E -#define VFE_MSG_SYNC_T2_DONE_LEN sizeof(vfe_msg_sync_t2_done) - -typedef struct { -} __attribute__((packed)) vfe_msg_sync_t2_done; - - -/* - * Message to notify the ARM that async t1 operation completed - */ - -#define VFE_MSG_ASYNC_T1_DONE 0x000F -#define VFE_MSG_ASYNC_T1_DONE_LEN sizeof(vfe_msg_async_t1_done) - -typedef struct { -} __attribute__((packed)) vfe_msg_async_t1_done; - - - -/* - * Message to notify the ARM that async t2 operation completed - */ - -#define VFE_MSG_ASYNC_T2_DONE 0x0010 -#define VFE_MSG_ASYNC_T2_DONE_LEN sizeof(vfe_msg_async_t2_done) - -typedef struct { -} __attribute__((packed)) vfe_msg_async_t2_done; - - - -/* - * Message to notify the ARM that an error has occurred - */ - -#define VFE_MSG_ERROR 0x0011 -#define VFE_MSG_ERROR_LEN sizeof(vfe_msg_error) - -#define VFE_MSG_ERR_COND_NO_CAMIF_ERR 0x0000 -#define VFE_MSG_ERR_COND_CAMIF_ERR 0x0001 -#define VFE_MSG_ERR_COND_OP1_Y_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_OP1_Y_BUS_OF 0x0002 -#define VFE_MSG_ERR_COND_OP1_CBCR_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_OP1_CBCR_BUS_OF 0x0004 -#define VFE_MSG_ERR_COND_OP2_Y_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_OP2_Y_BUS_OF 0x0008 -#define VFE_MSG_ERR_COND_OP2_CBCR_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_OP2_CBCR_BUS_OF 0x0010 -#define VFE_MSG_ERR_COND_AF_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_AF_BUS_OF 0x0020 -#define VFE_MSG_ERR_COND_WB_EXP_NO_BUS_OF 0x0000 -#define VFE_MSG_ERR_COND_WB_EXP_BUS_OF 0x0040 -#define VFE_MSG_ERR_COND_NO_AXI_ERR 0x0000 -#define VFE_MSG_ERR_COND_AXI_ERR 0x0080 - -#define VFE_MSG_CAMIF_STS_IDLE 0x0000 -#define VFE_MSG_CAMIF_STS_CAPTURE_DATA 0x0001 - -typedef struct { - unsigned int err_cond; - unsigned int camif_sts; -} __attribute__((packed)) vfe_msg_error; - - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5/snd_adie.h b/arch/arm/mach-msm/include/mach/qdsp5/snd_adie.h deleted file mode 100644 index 2bad3b00842a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5/snd_adie.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SND_ADIE_SVC_H_ -#define __SND_ADIE_SVC_H_ - -#define ADIE_SVC_PROG 0x30000002 -#define ADIE_SVC_VERS 0x00020003 - -#define ADIE_SVC_CLIENT_STATUS_FUNC_PTR_TYPE_PROC 0xFFFFFF01 -#define SND_ADIE_SVC_CLIENT_REGISTER_PROC 34 -#define SND_ADIE_SVC_CONFIG_ADIE_BLOCK_PROC 35 -#define SND_ADIE_SVC_CLIENT_DEREGISTER_PROC 36 - -#define ADIE_SVC_MAX_CLIENTS 5 - -enum adie_svc_client_operation{ - ADIE_SVC_REGISTER_CLIENT, - ADIE_SVC_DEREGISTER_CLIENT, - ADIE_SVC_CONFIG_ADIE_BLOCK, -}; - -enum adie_svc_status_type{ - ADIE_SVC_STATUS_SUCCESS, - ADIE_SVC_STATUS_FAILURE, - ADIE_SVC_STATUS_INUSE -}; - -enum adie_block_enum_type{ - MIC_BIAS, - HSSD, - HPH_PA -}; - -enum adie_config_enum_type{ - DISABLE, - ENABLE -}; - -struct adie_svc_client{ - int client_id; - int cb_id; - enum adie_svc_status_type status; - bool adie_svc_cb_done; - struct mutex lock; - wait_queue_head_t wq; - struct msm_rpc_client *rpc_client; -}; - -struct adie_svc_client_register_cb_cb_args { - int cb_id; - uint32_t size; - int client_id; - enum adie_block_enum_type adie_block; - enum adie_svc_status_type status; - enum adie_svc_client_operation client_operation; -}; - -struct adie_svc_client_register_cb_args { - int cb_id; -}; - -struct adie_svc_client_deregister_cb_args { - int client_id; -}; - -struct adie_svc_config_adie_block_cb_args { - int client_id; - enum adie_block_enum_type adie_block; - enum adie_config_enum_type config; -}; - -int adie_svc_get(void); -int adie_svc_put(int id); -int adie_svc_config_adie_block(int id, - enum adie_block_enum_type adie_block_type, bool enable); -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/acdb_commands.h b/arch/arm/mach-msm/include/mach/qdsp5v2/acdb_commands.h deleted file mode 100644 index 93863078a6aa..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/acdb_commands.h +++ /dev/null @@ -1,303 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_ACDB_COMMANDS_H -#define _MACH_QDSP5_V2_ACDB_COMMANDS_H - -#define ACDB_VOICE_NETWORK_ID_DEFAULT 0x00010037 -#define ACDB_INITIALISING 0 -#define ACDB_READY 1 - - -/* 4KB */ -#define ACDB_PAGE_SIZE 0x1000 - -#define ACDB_CDMA_NB 0x0108b153 -#define ACDB_CDMA_WB 0x0108b154 -#define ACDB_GSM_NB 0x0108b155 -#define ACDB_GSM_WB 0x0108b156 -#define ACDB_WCDMA_NB 0x0108b157 -#define ACDB_WCDMA_WB 0x0108b158 - - -/* ACDB commands */ - - -/* struct acdb_cmd_install_device */ -#define ACDB_INSTALL_DEVICE 0x0108d245 - -/* struct acdb_cmd_install_device */ -#define ACDB_UNINSTALL_DEVICE 0x0108d246 - -/* struct acdb_cmd_device */ -#define ACDB_GET_DEVICE 0x0108bb92 - -/* struct acdb_cmd_device */ -#define ACDB_SET_DEVICE 0x0108bb93 - -/* struct acdb_cmd_get_device_table */ -#define ACDB_GET_DEVICE_TABLE 0x0108bb97 - -/* struct acdb_cmd_get_device_capabilities */ -#define ACDB_GET_DEVICE_CAPABILITIES 0x0108f5ca - -/* struct acdb_cmd_get_device_info */ -#define ACDB_GET_DEVICE_INFO 0x0108f5cb - -/*command to intitialize ACDB based on codec type*/ -#define ACDB_CMD_INITIALIZE_FOR_ADIE 0x00011283 - - -/* ACDB Error codes */ - -#define ACDB_RES_SUCCESS 0 -#define ACDB_RES_FAILURE -1 -#define ACDB_RES_BADPARM -2 -#define ACDB_RES_BADSTATE -3 - -#define TGTVERS_MSM7x30_BRING_UP 0x00010064 - - - -/* Algorithm Aspect IDs */ - -#define IID_ENABLE_FLAG 0x0108b6b9 - - -#define IID_ENABLE_FLAG_SIZE 1 -#define IID_ECHO_CANCELLER_VERSION_SIZE 2 -#define IID_ECHO_CANCELLER_MODE_SIZE 2 -#define IID_ECHO_CANCELLER_NOISE_SUPPRESSOR_ENABLE_SIZE 1 -#define IID_ECHO_CANCELLER_PARAMETERS_SIZE 32 -#define IID_ECHO_CANCELLER_NEXTGEN_NB_PARAMETERS_SIZE (38 * 2) -#define IID_ECHO_CANCELLER_NEXTGEN_WB_PARAMETERS_SIZE (38 * 2) -#define IID_FLUENCE_PARAMETERS_SIZE 486 -#define IID_AFE_VOLUME_CONTROL_SIZE 6 -#define IID_GAIN_SIZE 2 -#define IID_VOICE_FIR_FILTER_SIZE 14 -#define IID_VOICE_IIR_FILTER_SIZE 114 -#define IID_RX_DBM_OFFSET_SIZE 2 -#define IID_AGC_SIZE 36 -#define IID_AVC_SIZE 80 - -#define IID_AUDIO_IIR_COEFF_SIZE 100 -#define IID_MBADRC_PARAMETERS_SIZE 8 -#define IID_MBADRC_EXT_BUFF_SIZE 392 -#define IID_MBADRC_BAND_CONFIG_SIZE 100 -#define IID_QAFX_PARAMETERS_SIZE 2 -#define IID_QCONCERT_PARAMETERS_SIZE 2 -#define IID_AUDIO_AGC_PARAMETERS_SIZE 42 -#define IID_NS_PARAMETERS_SIZE 14 - -#define IID_ECHO_CANCELLER_VERSION 0x00010042 -#define IID_ECHO_CANCELLER_MODE 0x00010043 -#define IID_ECHO_CANCELLER_NOISE_SUPPRESSOR_ENABLE 0x00010044 -#define IID_ECHO_CANCELLER_PARAMETERS 0x00010045 -#define IID_ECHO_CANCELLER_NEXTGEN_NB_PARAMETERS 0x00010046 -#define IID_ECHO_CANCELLER_NEXTGEN_WB_PARAMETERS 0x00010047 -#define IID_FLUENCE_PARAMETERS 0x00010048 -#define IID_AFE_VOLUME_CONTROL 0x00010049 -#define IID_GAIN 0x0001004A -#define IID_VOICE_FIR_FILTER 0x0001004B -#define IID_VOICE_IIR_FILTER 0x0001004C -#define IID_AGC 0x0001004E -#define IID_AVC 0x0001004F -#define ABID_SIDETONE_GAIN 0x00010050 -#define ABID_TX_VOICE_GAIN 0x00010051 -#define ABID_TX_DTMF_GAIN 0x00010052 -#define ABID_CODEC_TX_GAIN 0x00010053 -#define ABID_HSSD 0x00010054 -#define ABID_TX_AGC 0x00010055 -#define ABID_TX_VOICE_FIR 0x00010056 -#define ABID_TX_VOICE_IIR 0x00010057 -#define ABID_ECHO_CANCELLER 0x00010058 -#define ABID_ECHO_CANCELLER_NB_LVHF 0x00010059 -#define ABID_ECHO_CANCELLER_WB_LVHF 0x0001005A -#define ABID_FLUENCE 0x0001005B -#define ABID_CODEC_RX_GAIN 0x0001005C -#define ABID_RX_DBM_OFFSET 0x0001005D -#define ABID_RX_AGC 0x0001005E -#define ABID_AVC 0x0001005F -#define ABID_RX_VOICE_FIR 0x00010060 -#define ABID_RX_VOICE_IIR 0x00010061 -#define ABID_AFE_VOL_CTRL 0x00010067 - - -/* AUDIO IDs */ -#define ABID_AUDIO_AGC_TX 0x00010068 -#define ABID_AUDIO_NS_TX 0x00010069 -#define ABID_VOICE_NS 0x0001006A -#define ABID_AUDIO_IIR_TX 0x0001006B -#define ABID_AUDIO_IIR_RX 0x0001006C -#define ABID_AUDIO_MBADRC_RX 0x0001006E -#define ABID_AUDIO_QAFX_RX 0x0001006F -#define ABID_AUDIO_QCONCERT_RX 0x00010070 -#define ABID_AUDIO_STF_RX 0x00010071 -#define ABID_AUDIO_CALIBRATION_GAIN_RX 0x00011162 -#define ABID_AUDIO_CALIBRATION_GAIN_TX 0x00011149 -#define ABID_AUDIO_PBE_RX 0x00011197 -#define ABID_AUDIO_RMC_TX 0x00011226 -#define ABID_AUDIO_FLUENCE_TX 0x00011244 - - -#define IID_AUDIO_AGC_PARAMETERS 0x0001007E -#define IID_NS_PARAMETERS 0x00010072 -#define IID_AUDIO_IIR_COEFF 0x00010073 -#define IID_MBADRC_EXT_BUFF 0x00010075 -#define IID_MBADRC_BAND_CONFIG 0x00010076 -#define IID_MBADRC_PARAMETERS 0x00010077 -#define IID_QAFX_PARAMETERS 0x00010079 -#define IID_QCONCERT_PARAMETERS 0x0001007A -#define IID_STF_COEFF 0x0001007B -#define IID_AUDIO_CALIBRATION_GAIN_RX 0x00011163 -#define IID_AUDIO_CALIBRATION_GAIN_TX 0x00011171 -#define IID_PBE_CONFIG_PARAMETERS 0x00011198 -#define IID_AUDIO_PBE_RX_ENABLE_FLAG 0x00011199 -#define IID_AUDIO_RMC_PARAM 0x00011227 -#define IID_AUDIO_FLUENCE_TX 0x00011245 - - -#define TOPID_RX_TOPOLOGY_1 0x00010062 -#define TOPID_TX_TOPOLOGY_1 0x00010063 -#define AFERID_INT_SINK 0x00010065 -#define AFERID_INT_SOURCE 0x00010066 -#define AFERID_NO_SINK 0x00000000 -#define AFERID_NULL_SINK 0x0108ea92 - - -struct acdb_cmd_install_device { - u32 command_id; - u32 device_id; - u32 topology_id; - u32 afe_routing_id; - u32 cad_routing_id; /* see "Sample Rate Bit Mask" below */ - u32 sample_rate_mask; - - /* represents device direction: Tx, Rx (aux pga - loopback) */ - u8 device_type; - u8 channel_config; /* Mono or Stereo */ - u32 adie_codec_path_id; -}; - - -struct acdb_cmd_get_device_capabilities { - u32 command_id; - u32 total_bytes; /* Length in bytes allocated for buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - - -struct acdb_cmd_get_device_info { - u32 command_id; - u32 device_id; - u32 total_bytes; /* Length in bytes allocated for buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_cmd_device { - u32 command_id; - u32 device_id; - u32 network_id; - u32 sample_rate_id; /* Actual sample rate value */ - u32 interface_id; /* See interface id's above */ - u32 algorithm_block_id; /* See enumerations above */ - u32 total_bytes; /* Length in bytes used by buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_cmd_get_device_table { - u32 command_id; - u32 device_id; - u32 network_id; - u32 sample_rate_id; /* Actual sample rate value */ - u32 total_bytes; /* Length in bytes used by buffer */ - u32 *phys_buf; /* Physical Address of data */ -}; - -struct acdb_result { - /* This field is populated in response to the */ - /* ACDB_GET_DEVICE_CAPABILITIES command and indicates the total */ - /* devices whose capabilities are copied to the physical memory. */ - u32 total_devices; - u32 *buf; /* Physical Address of data */ - u32 used_bytes; /* The size in bytes of the data */ - u32 result; /* See ACDB Error codes above */ -}; - -struct acdb_device_capability { - u32 device_id; - u32 sample_rate_mask; /* See "Sample Rate Bit Mask" below */ -}; - -struct acdb_dev_info { - u32 cad_routing_id; - u32 sample_rate_mask; /* See "Sample Rate Bit Mask" below */ - u32 adsp_device_id; /* QDSP6 device ID */ - u32 device_type; /* Tx, Rx (aux pga - loopback) */ - u32 channel_config; /* Mono or Stereo */ - s32 min_volume; /* Min volume (mB) */ - s32 max_volume; /* Max volume (mB) */ -}; - -/*structure is used to intialize ACDB software on modem -based on adie type detected*/ -struct acdb_cmd_init_adie { - u32 command_id; - u32 adie_type; -}; - -#define ACDB_CURRENT_ADIE_MODE_UNKNOWN 0 -#define ACDB_CURRENT_ADIE_MODE_TIMPANI 1 -#define ACDB_CURRENT_ADIE_MODE_MARIMBA 2 - -/* Sample Rate Bit Mask */ - -/* AUX PGA devices will have a sample rate mask of 0xFFFFFFFF */ -/* 8kHz 0x00000001 */ -/* 11.025kHz 0x00000002 */ -/* 12kHz 0x00000004 */ -/* 16kHz 0x00000008 */ -/* 22.5kHz 0x00000010 */ -/* 24kHz 0x00000020 */ -/* 32kHz 0x00000040 */ -/* 44.1kHz 0x00000080 */ -/* 48kHz 0x00000100 */ - - -/* Device type enumeration */ -enum { - RX_DEVICE = 1, - TX_DEVICE, - AUXPGA_DEVICE, - DEVICE_TYPE_MAX -}; - -#ifdef CONFIG_DEBUG_FS -/*These are ABID used for RTC*/ -#define ABID_AUDIO_RTC_MBADRC_RX 0x0001118A -#define ABID_AUDIO_RTC_VOLUME_PAN_RX 0x0001118C -#define ABID_AUDIO_RTC_SPA 0x0001118E -#define ABID_AUDIO_RTC_EQUALIZER_PARAMETERS 0x0001119F - -/*These are IID used for RTC*/ -#define IID_AUDIO_RTC_MBADRC_PARAMETERS 0x0001118B -#define IID_AUDIO_RTC_VOLUME_PAN_PARAMETERS 0x0001118D -#define IID_AUDIO_RTC_SPA_PARAMETERS 0x0001118F -#define IID_AUDIO_RTC_EQUALIZER_PARAMETERS 0x0001119E -#define IID_AUDIO_RTC_AGC_PARAMETERS 0x000111A7 -#define IID_AUDIO_RTC_TX_IIR_COEFF 0x000111A8 - -#endif - - -#endif - diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/audio_acdb_def.h b/arch/arm/mach-msm/include/mach/qdsp5v2/audio_acdb_def.h deleted file mode 100644 index 0a0c3082125f..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/audio_acdb_def.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (c) 2010 - 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H -#define _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H - -/* Define ACDB device ID */ -#define ACDB_ID_HANDSET_SPKR 1 -#define ACDB_ID_HANDSET_MIC 2 -#define ACDB_ID_HEADSET_MIC 3 -#define ACDB_ID_HEADSET_SPKR_MONO 4 -#define ACDB_ID_HEADSET_SPKR_STEREO 5 -#define ACDB_ID_SPKR_PHONE_MIC 6 -#define ACDB_ID_SPKR_PHONE_MONO 7 -#define ACDB_ID_SPKR_PHONE_STEREO 8 -#define ACDB_ID_BT_SCO_MIC 9 -#define ACDB_ID_BT_SCO_SPKR 0x0A -#define ACDB_ID_BT_A2DP_SPKR 0x0B -#define ACDB_ID_BT_A2DP_TX 0x10 -#define ACDB_ID_TTY_HEADSET_MIC 0x0C -#define ACDB_ID_TTY_HEADSET_SPKR 0x0D -#define ACDB_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define ACDB_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 -#define ACDB_ID_FM_TX_LOOPBACK 0x17 -#define ACDB_ID_FM_TX 0x18 -#define ACDB_ID_LP_FM_SPKR_PHONE_STEREO_RX 0x19 -#define ACDB_ID_LP_FM_HEADSET_SPKR_STEREO_RX 0x1A -#define ACDB_ID_I2S_RX 0x20 -#define ACDB_ID_SPKR_PHONE_MIC_BROADSIDE 0x2B -#define ACDB_ID_HANDSET_MIC_BROADSIDE 0x2C -#define ACDB_ID_SPKR_PHONE_MIC_ENDFIRE 0x2D -#define ACDB_ID_HANDSET_MIC_ENDFIRE 0x2E -#define ACDB_ID_I2S_TX 0x30 -#define ACDB_ID_HDMI 0x40 -#define ACDB_ID_FM_RX 0x4F -/*Replace the max device ID,if any new device is added Specific to RTC only*/ -#define ACDB_ID_MAX ACDB_ID_FM_RX - -/* ID used for virtual devices */ -#define PSEUDO_ACDB_ID 0xFFFF - -#endif /* _MACH_QDSP5_V2_AUDIO_ACDB_DEF_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/audio_interct.h b/arch/arm/mach-msm/include/mach/qdsp5v2/audio_interct.h deleted file mode 100644 index 2690bf5bd8a3..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/audio_interct.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_AUDIO_INTERCT_H -#define __MACH_QDSP5_V2_AUDIO_INTERCT_H - -#define AUDIO_INTERCT_ADSP 0 -#define AUDIO_INTERCT_LPA 1 -#define AUDIO_ADSP_A 1 -#define AUDIO_ADSP_V 0 - -void audio_interct_lpa(u32 source); -void audio_interct_aux_regsel(u32 source); -void audio_interct_rpcm_source(u32 source); -void audio_interct_tpcm_source(u32 source); -void audio_interct_pcmmi2s(u32 source); -void audio_interct_codec(u32 source); -void audio_interct_multichannel(u32 source); - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/aux_pcm.h b/arch/arm/mach-msm/include/mach/qdsp5v2/aux_pcm.h deleted file mode 100644 index d9b9427d11a8..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/aux_pcm.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_AUX_PCM_H -#define __MACH_QDSP5_V2_AUX_PCM_H -#include - -/* define some values in AUX_CODEC_CTL register */ -#define AUX_CODEC_CTL__ADSP_CODEC_CTL_EN__MSM_V 0 /* default */ -#define AUX_CODEC_CTL__ADSP_CODEC_CTL_EN__ADSP_V 0x800 -#define AUX_CODEC_CTL__PCM_SYNC_LONG_OFFSET_V 0x400 -#define AUX_CODEC_CTL__PCM_SYNC_SHORT_OFFSET_V 0x200 -#define AUX_CODEC_CTL__I2S_SAMPLE_CLK_SRC__SDAC_V 0 -#define AUX_CODEC_CTL__I2S_SAMPLE_CLK_SRC__ICODEC_V 0x80 -#define AUX_CODEC_CTL__I2S_SAMPLE_CLK_MODE__MASTER_V 0 -#define AUX_CODEC_CTL__I2S_SAMPLE_CLK_MODE__SLAVE_V 0x40 -#define AUX_CODEC_CTL__I2S_RX_MODE__REV_V 0 -#define AUX_CODEC_CTL__I2S_RX_MODE__TRAN_V 0x20 -#define AUX_CODEC_CTL__I2S_CLK_MODE__MASTER_V 0 -#define AUX_CODEC_CTL__I2S_CLK_MODE__SLAVE_V 0x10 -#define AUX_CODEC_CTL__AUX_PCM_MODE__PRIM_MASTER_V 0 -#define AUX_CODEC_CTL__AUX_PCM_MODE__AUX_MASTER_V 0x4 -#define AUX_CODEC_CTL__AUX_PCM_MODE__PRIM_SLAVE_V 0x8 -#define AUX_CODEC_CTL__AUX_CODEC_MDOE__PCM_V 0 -#define AUX_CODEC_CTL__AUX_CODEC_MODE__I2S_V 0x2 - -/* define some values in PCM_PATH_CTL register */ -#define PCM_PATH_CTL__ADSP_CTL_EN__MSM_V 0 -#define PCM_PATH_CTL__ADSP_CTL_EN__ADSP_V 0x8 - -/* define some values for aux codec config of AFE*/ -/* PCM CTL */ -#define PCM_CTL__RPCM_WIDTH__LINEAR_V 0x1 -#define PCM_CTL__TPCM_WIDTH__LINEAR_V 0x2 -/* AUX_CODEC_INTF_CTL */ -#define AUX_CODEC_INTF_CTL__PCMINTF_DATA_EN_V 0x800 -/* DATA_FORMAT_PADDING_INFO */ -#define DATA_FORMAT_PADDING_INFO__RPCM_FORMAT_V 0x400 -#define DATA_FORMAT_PADDING_INFO__TPCM_FORMAT_V 0x2000 - -void aux_codec_adsp_codec_ctl_en(bool msm_adsp_en); -void aux_codec_pcm_path_ctl_en(bool msm_adsp_en); -int aux_pcm_gpios_request(void); -void aux_pcm_gpios_free(void); - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h b/arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h deleted file mode 100644 index 2cfdabf7b679..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/codec_utils.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright (c) 2010, 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef CODEC_UTILS_H -#define CODEC_UTILS_H - -#include - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -#define PCM_BUFSZ_MIN 4800 /* Hold one stereo MP3 frame */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 -#define AUDPP_DEC_STATUS_EOS 5 - -/* worst case delay of 3secs(3000ms) for AV Sync Query response */ -#define AVSYNC_EVENT_TIMEOUT 3000 - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; -}; -struct audio; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audio_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct codec_operations { - long (*ioctl)(struct file *, unsigned int, unsigned long); - void (*adec_params)(struct audio *); -}; - -struct audio { - spinlock_t dsp_lock; - - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_bits; /* bits per sample (used by PCM decoder) */ - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - - uint32_t drv_status; - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audio_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - uint32_t device_switch; /* Flag to indicate device switch */ - uint64_t bytecount_consumed; - uint64_t bytecount_head; - uint64_t bytecount_given; - uint64_t bytecount_query; - - struct list_head ion_region_queue; /* protected by lock */ - struct ion_client *client; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; - - unsigned int minor_no; - struct codec_operations codec_ops; - uint32_t buffer_size; - uint32_t buffer_count; -}; - -#endif /* !CODEC_UTILS_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/lpa.h b/arch/arm/mach-msm/include/mach/qdsp5v2/lpa.h deleted file mode 100644 index d9d9ab1a548b..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/lpa.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_LPA_H__ -#define __MACH_QDSP5_V2_LPA_H__ - -#define LPA_OUTPUT_INTF_WB_CODEC 3 -#define LPA_OUTPUT_INTF_SDAC 1 -#define LPA_OUTPUT_INTF_MI2S 2 - -struct lpa_codec_config { - uint32_t sample_rate; - uint32_t sample_width; - uint32_t output_interface; - uint32_t num_channels; -}; - -struct lpa_drv; - -struct lpa_drv *lpa_get(void); -void lpa_put(struct lpa_drv *lpa); -int lpa_cmd_codec_config(struct lpa_drv *lpa, - struct lpa_codec_config *config_ptr); -int lpa_cmd_enable_codec(struct lpa_drv *lpa, bool enable); - -#endif - diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/lpa_hw.h b/arch/arm/mach-msm/include/mach/qdsp5v2/lpa_hw.h deleted file mode 100644 index beb4aeeab6a4..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/lpa_hw.h +++ /dev/null @@ -1,236 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_LPA_HW_H__ -#define __MACH_QDSP5_V2_LPA_HW_H__ - -#define LPA_MAX_BUF_SIZE 0x30000 - -/* LPA Output config registers */ -enum { - LPA_OBUF_CONTROL = 0x00000000, - LPA_OBUF_CODEC = 0x00000004, - LPA_OBUF_HLB_MIN_ADDR = 0x00000008, - LPA_OBUF_HLB_MAX_ADDR = 0x0000000C, - LPA_OBUF_HLB_WPTR = 0x00000010, - LPA_OBUF_HLB_VOLUME_CONTROL = 0x00000014, - LPA_OBUF_LLB_MIN_ADDR = 0x00000018, - LPA_OBUF_LLB_MAX_ADDR = 0x0000001C, - LPA_OBUF_SB_MIN_ADDR = 0x00000020, - LPA_OBUF_SB_MAX_ADDR = 0x00000024, - LPA_OBUF_INTR_ENABLE = 0x00000028, - LPA_OBUF_INTR_STATUS = 0x0000002C, - LPA_OBUF_WMARK_ASSIGN = 0x00000030, - LPA_OBUF_WMARK_0_LLB = 0x00000034, - LPA_OBUF_WMARK_1_LLB = 0x00000038, - LPA_OBUF_WMARK_2_LLB = 0x0000003C, - LPA_OBUF_WMARK_3_LLB = 0x00000040, - LPA_OBUF_WMARK_HLB = 0x00000044, - LPA_OBUF_WMARK_SB = 0x00000048, - LPA_OBUF_RDPTR_LLB = 0x0000004C, - LPA_OBUF_RDPTR_HLB = 0x00000050, - LPA_OBUF_WRPTR_SB = 0x00000054, - LPA_OBUF_UTC_CONFIG = 0x00000058, - LPA_OBUF_UTC_INTR_LOW = 0x0000005C, - LPA_OBUF_UTC_INTR_HIGH = 0x00000060, - LPA_OBUF_UTC_LOW = 0x00000064, - LPA_OBUF_UTC_HIGH = 0x00000068, - LPA_OBUF_MISR = 0x0000006C, - LPA_OBUF_STATUS = 0x00000070, - LPA_OBUF_ACK = 0x00000074, - LPA_OBUF_MEMORY_CONTROL = 0x00000078, - LPA_OBUF_MEMORY_STATUS = 0x0000007C, - LPA_OBUF_MEMORY_TIME_CONTROL = 0x00000080, - LPA_OBUF_ACC_LV = 0x00000084, - LPA_OBUF_ACC_HV = 0x0000008c, - LPA_OBUF_RESETS = 0x00000090, - LPA_OBUF_TESTBUS = 0x00000094, -}; - -/* OBUF_CODEC definition */ -#define LPA_OBUF_CODEC_RESERVED31_22_BMSK 0xffc00000 -#define LPA_OBUF_CODEC_RESERVED31_22_SHFT 0x16 -#define LPA_OBUF_CODEC_LOAD_BMSK 0x200000 -#define LPA_OBUF_CODEC_LOAD_SHFT 0x15 -#define LPA_OBUF_CODEC_CODEC_INTF_EN_BMSK 0x100000 -#define LPA_OBUF_CODEC_CODEC_INTF_EN_SHFT 0x14 -#define LPA_OBUF_CODEC_SAMP_BMSK 0xf0000 -#define LPA_OBUF_CODEC_SAMP_SHFT 0x10 -#define LPA_OBUF_CODEC_BITS_PER_CHAN_BMSK 0xc000 -#define LPA_OBUF_CODEC_BITS_PER_CHAN_SHFT 0xe -#define LPA_OBUF_CODEC_RESERVED_13_7_BMSK 0x3f80 -#define LPA_OBUF_CODEC_RESERVED_13_7_SHFT 0x7 -#define LPA_OBUF_CODEC_INTF_BMSK 0x70 -#define LPA_OBUF_CODEC_INTF_SHFT 0x4 -#define LPA_OBUF_CODEC_NUM_CHAN_BMSK 0xf -#define LPA_OBUF_CODEC_NUM_CHAN_SHFT 0 - -/* OBUF_CONTROL definition */ -#define LPA_OBUF_CONTROL_RESERVED31_9_BMSK 0xfffffe00 -#define LPA_OBUF_CONTROL_RESERVED31_9_SHFT 0x9 -#define LPA_OBUF_CONTROL_TEST_EN_BMSK 0x100 -#define LPA_OBUF_CONTROL_TEST_EN_SHFT 0x8 -#define LPA_OBUF_CONTROL_LLB_CLR_CMD_BMSK 0x80 -#define LPA_OBUF_CONTROL_LLB_CLR_CMD_SHFT 0x7 -#define LPA_OBUF_CONTROL_SB_SAT_EN_BMSK 0x40 -#define LPA_OBUF_CONTROL_SB_SAT_EN_SHFT 0x6 -#define LPA_OBUF_CONTROL_LLB_SAT_EN_BMSK 0x20 -#define LPA_OBUF_CONTROL_LLB_SAT_EN_SHFT 0x5 -#define LPA_OBUF_CONTROL_RESERVED4_BMSK 0x10 -#define LPA_OBUF_CONTROL_RESERVED4_SHFT 0x4 -#define LPA_OBUF_CONTROL_LLB_ACC_EN_BMSK 0x8 -#define LPA_OBUF_CONTROL_LLB_ACC_EN_SHFT 0x3 -#define LPA_OBUF_CONTROL_HLB_EN_BMSK 0x4 -#define LPA_OBUF_CONTROL_HLB_EN_SHFT 0x2 -#define LPA_OBUF_CONTROL_LLB_EN_BMSK 0x2 -#define LPA_OBUF_CONTROL_LLB_EN_SHFT 0x1 -#define LPA_OBUF_CONTROL_SB_EN_BMSK 0x1 -#define LPA_OBUF_CONTROL_SB_EN_SHFT 0 - -/* OBUF_RESET definition */ -#define LPA_OBUF_RESETS_MISR_RESET 0x1 -#define LPA_OBUF_RESETS_OVERALL_RESET 0x2 - -/* OBUF_STATUS definition */ -#define LPA_OBUF_STATUS_RESET_DONE 0x80000 -#define LPA_OBUF_STATUS_LLB_CLR_BMSK 0x40000 -#define LPA_OBUF_STATUS_LLB_CLR_SHFT 0x12 - -/* OBUF_HLB_MIN_ADDR definition */ -#define LPA_OBUF_HLB_MIN_ADDR_LOAD_BMSK 0x40000 -#define LPA_OBUF_HLB_MIN_ADDR_SEG_BMSK 0x3e000 - -/* OBUF_HLB_MAX_ADDR definition */ -#define LPA_OBUF_HLB_MAX_ADDR_SEG_BMSK 0x3fff8 - -/* OBUF_LLB_MIN_ADDR definition */ -#define LPA_OBUF_LLB_MIN_ADDR_LOAD_BMSK 0x40000 -#define LPA_OBUF_LLB_MIN_ADDR_SEG_BMSK 0x3e000 - -/* OBUF_LLB_MAX_ADDR definition */ -#define LPA_OBUF_LLB_MAX_ADDR_SEG_BMSK 0x3ff8 -#define LPA_OBUF_LLB_MAX_ADDR_SEG_SHFT 0x3 - -/* OBUF_SB_MIN_ADDR definition */ -#define LPA_OBUF_SB_MIN_ADDR_LOAD_BMSK 0x4000 -#define LPA_OBUF_SB_MIN_ADDR_SEG_BMSK 0x3e00 - -/* OBUF_SB_MAX_ADDR definition */ -#define LPA_OBUF_SB_MAX_ADDR_SEG_BMSK 0x3ff8 - -/* OBUF_MEMORY_CONTROL definition */ -#define LPA_OBUF_MEM_CTL_PWRUP_BMSK 0xfff -#define LPA_OBUF_MEM_CTL_PWRUP_SHFT 0x0 - -/* OBUF_INTR_ENABLE definition */ -#define LPA_OBUF_INTR_EN_BMSK 0x3 - -/* OBUF_WMARK_ASSIGN definition */ -#define LPA_OBUF_WMARK_ASSIGN_BMSK 0xF -#define LPA_OBUF_WMARK_ASSIGN_DONE 0xF - -/* OBUF_WMARK_n_LLB definition */ -#define LPA_OBUF_WMARK_n_LLB_ADDR(n) (0x00000034 + 0x4 * (n)) -#define LPA_OBUF_LLB_WMARK_CTRL_BMSK 0xc0000 -#define LPA_OBUF_LLB_WMARK_CTRL_SHFT 0x12 -#define LPA_OBUF_LLB_WMARK_MAP_BMSK 0xf00000 -#define LPA_OBUF_LLB_WMARK_MAP_SHFT 0x14 - -/* OBUF_WMARK_SB definition */ -#define LPA_OBUF_SB_WMARK_CTRL_BMSK 0xc0000 -#define LPA_OBUF_SB_WMARK_CTRL_SHFT 0x12 -#define LPA_OBUF_SB_WMARK_MAP_BMSK 0xf00000 -#define LPA_OBUF_SB_WMARK_MAP_SHFT 0x14 - -/* OBUF_WMARK_HLB definition */ -#define LPA_OBUF_HLB_WMARK_CTRL_BMSK 0xc0000 -#define LPA_OBUF_HLB_WMARK_CTRL_SHFT 0x12 -#define LPA_OBUF_HLB_WMARK_MAP_BMSK 0xf00000 -#define LPA_OBUF_HLB_WMARK_MAP_SHFT 0x14 - -/* OBUF_UTC_CONFIG definition */ -#define LPA_OBUF_UTC_CONFIG_MAP_BMSK 0xf0 -#define LPA_OBUF_UTC_CONFIG_MAP_SHFT 0x4 -#define LPA_OBUF_UTC_CONFIG_EN_BMSK 0x1 -#define LPA_OBUF_UTC_CONFIG_EN_SHFT 0 -#define LPA_OBUF_UTC_CONFIG_NO_INTR 0xF - -/* OBUF_ACK definition */ -#define LPA_OBUF_ACK_RESET_DONE_BMSK 0x80000 -#define LPA_OBUF_ACK_RESET_DONE_SHFT 0x13 -enum { - LPA_SAMPLE_RATE_8KHZ = 0x0000, - LPA_SAMPLE_RATE_11P025KHZ = 0x0001, - LPA_SAMPLE_RATE_16KHZ = 0x0002, - LPA_SAMPLE_RATE_22P05KHZ = 0x0003, - LPA_SAMPLE_RATE_32KHZ = 0x0004, - LPA_SAMPLE_RATE_44P1KHZ = 0x0005, - LPA_SAMPLE_RATE_48KHZ = 0x0006, - LPA_SAMPLE_RATE_64KHZ = 0x0007, - LPA_SAMPLE_RATE_96KHZ = 0x0008, -}; - -enum { - LPA_BITS_PER_CHAN_16BITS = 0x0000, - LPA_BITS_PER_CHAN_24BITS = 0x0001, - LPA_BITS_PER_CHAN_32BITS = 0x0002, - LPA_BITS_PER_CHAN_RESERVED = 0x0003, -}; - -enum { - LPA_INTF_WB_CODEC = 0x0000, - LPA_INTF_SDAC = 0x0001, - LPA_INTF_MI2S = 0x0002, - LPA_INTF_RESERVED = 0x0003, -}; - -enum { - LPA_BUF_ID_HLB, /* HLB buffer */ - LPA_BUF_ID_LLB, /* LLB buffer */ - LPA_BUF_ID_SB, /* SB buffer */ - LPA_BUF_ID_UTC, -}; - -/* WB_CODEC & SDAC can only support 16bit mono/stereo. - * MI2S can bit format and number of channel - */ -enum { - LPA_NUM_CHAN_MONO = 0x0000, - LPA_NUM_CHAN_STEREO = 0x0001, - LPA_NUM_CHAN_5P1 = 0x0002, - LPA_NUM_CHAN_7P1 = 0x0003, - LPA_NUM_CHAN_4_CHANNEL = 0x0004, -}; - -enum { - LPA_WMARK_CTL_DISABLED = 0x0, - LPA_WMARK_CTL_NON_BLOCK = 0x1, - LPA_WMARK_CTL_ZERO_INSERT = 0x2, - LPA_WMARK_CTL_RESERVED = 0x3 -}; - -struct lpa_mem_bank_select { - u32 b0:1; /*RAM bank 0 16KB=2Kx64(0) */ - u32 b1:1; /*RAM bank 1 16KB=2Kx64(0) */ - u32 b2:1; /*RAM bank 2 16KB=2Kx64(0) */ - u32 b3:1; /*RAM bank 3 16KB=2Kx64(0) */ - u32 b4:1; /*RAM bank 4 16KB=2Kx64(1) */ - u32 b5:1; /*RAM bank 5 16KB=2Kx64(1) */ - u32 b6:1; /*RAM bank 6 16KB=2Kx64(1) */ - u32 b7:1; /*RAM bank 7 16KB=2Kx64(1) */ - u32 b8:1; /*RAM bank 8 16KB=4Kx32(0) */ - u32 b9:1; /*RAM bank 9 16KB=4Kx32(1) */ - u32 b10:1; /*RAM bank 10 16KB=4Kx32(2) */ - u32 llb:1; /*RAM bank 11 16KB=4Kx32(3) */ -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/marimba_profile.h b/arch/arm/mach-msm/include/mach/qdsp5v2/marimba_profile.h deleted file mode 100644 index 7e455a13ac71..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/marimba_profile.h +++ /dev/null @@ -1,3201 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_MARIMBA_PROFILE_H__ -#define __MACH_QDSP5_V2_MARIMBA_PROFILE_H__ - -/***************************************************************************\ - Handset -\***************************************************************************/ - - -#define HANDSET_RX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_RX_16000_OSR_256 HANDSET_RX_8000_OSR_256 - -#define HANDSET_RX_48000_OSR_64\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x47)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xfF, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_RX_48000_OSR_256\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xfF, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_TX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xd0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE6)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_TX_16000_OSR_256 HANDSET_TX_8000_OSR_256 - -#define HANDSET_TX_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xd0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE6)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/***************************************************************************\ - Headset -\***************************************************************************/ - - - -#define HEADSET_STEREO_TX_8000_OSR_256\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE8, 0xE8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_TX_16000_OSR_256 HEADSET_STEREO_TX_8000_OSR_256 - -#define HEADSET_STEREO_TX_48000_OSR_64\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xfc, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x46)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE8, 0xE8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_TX_48000_OSR_256\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FALSH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xfc, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE8, 0xE8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_MONO_TX_16000_OSR_256\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xfc, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFf, 0xc8)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_MONO_TX_8000_OSR_256 HEADSET_MONO_TX_16000_OSR_256 - -#define HEADSET_MONO_TX_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0xC8)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CAPLESS_8000_OSR_256\ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xeb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CAPLESS_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xab)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CAPLESS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xab)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_RX_LEGACY_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_LEGACY_16000_OSR_256 HEADSET_RX_LEGACY_8000_OSR_256 - -#define HEADSET_RX_LEGACY_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_RX_LEGACY_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CLASS_D_LEGACY_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_RX_CLASS_D_LEGACY_11025_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xbb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_RX_CLASS_D_LEGACY_16000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_RX_CLASS_D_LEGACY_22050_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xbb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xd2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xd2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_CLASS_D_LEGACY_32000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xf4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xf4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CLASS_D_LEGACY_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CLASS_D_LEGACY_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x50, 0x50)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xBB)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CAPLESS_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xeb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CAPLESS_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xab)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - - -#define HEADSET_STEREO_RX_CAPLESS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xab)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_LEGACY_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xaC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xaC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_LEGACY_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_LEGACY_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_11025_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xbb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_16000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_22050_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xbb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xd2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xd2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_32000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xf4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xf4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_RX_CLASS_D_LEGACY_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xBB)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_RX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe2, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define SPEAKER_RX_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe2, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_RX_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe2, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_STEREO_RX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe6, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x0f, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define SPEAKER_STEREO_RX_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe6, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x0f, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_STEREO_RX_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe6, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x0f, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define SPEAKER_TX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_TX_48000_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x46)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define SPEAKER_TX_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define FM_HANDSET_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x47)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define FM_HEADSET_STEREO_CLASS_D_LEGACY_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define FM_HEADSET_CLASS_AB_STEREO_LEGACY_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define FM_HEADSET_CLASS_AB_STEREO_CAPLESS_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xeb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define FM_SPEAKER_OSR_64 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x67)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe2, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8a, 0x8a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define AUXPGA_HEADSET_STEREO_RX_LEGACY \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0x18, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define AUXPGA_HEADSET_MONO_RX_LEGACY \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0x18, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define AUXPGA_HEADSET_STEREO_RX_CAPLESS \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xeb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0x18, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define AUXPGA_HEADSET_MONO_RX_CAPLESS \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xeb)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0x18, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define AUXPGA_HEADSET_STEREO_RX_CLASS_D \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x20, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFC, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x20, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -#define AUXPGA_HEADSET_MONO_RX_CLASS_D \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xDD)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFC, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x20, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define AUXPGA_EAR \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2B, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2C, 0xff, 0x89)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0x20, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0x20, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -/***************************************************************************\ - DigitalMicprofile -\***************************************************************************/ -#define DIGITAL_MIC \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x1A, 0xff, 0xc0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x66)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/***************************************************************************\ - DualMicprofile -\***************************************************************************/ -#define SPEAKER_MIC1_LEFT_LINE_IN_RIGHT_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE2, 0xE2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xc0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define SPEAKER_MIC1_LEFT_AUX_IN_RIGHT_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE2, 0xE1)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xc0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define MIC1_LEFT_LINE_IN_RIGHT_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE2, 0xE2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xc0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define MIC1_LEFT_AUX_IN_RIGHT_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE1, 0xE1)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xc0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - - -/***************************************************************************\ - AnalogDualMicProfile -\***************************************************************************/ -#define ANALOG_DUAL_MIC \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xfd, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xE2, 0xE2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xD0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x1c)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0e, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0d, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x1c, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } -/***************************************************************************\ - TTY -\***************************************************************************/ -#define TTY_HEADSET_MONO_TX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xfc, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x5E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFf, 0xA8)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x0A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define TTY_HEADSET_MONO_TX_16000_OSR_256 TTY_HEADSET_MONO_TX_8000_OSR_256 - -#define TTY_HEADSET_MONO_RX_CLASS_D_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xc4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0xF4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define TTY_HEADSET_MONO_RX_CLASS_D_16000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xd4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0xF4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define TTY_HEADSET_MONO_RX_CLASS_D_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xf8, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x28, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x29, 0xfF, 0xCA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xBB)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0f)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xFF, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xff)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4a, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0a, 0x0a)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x3E8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0xF4)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0x0f, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/***************************************************************************\ - FFA -\***************************************************************************/ -#define HANDSET_RX_8000_OSR_256_FFA \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_RX_16000_OSR_256_FFA HANDSET_RX_8000_OSR_256_FFA - -#define HANDSET_RX_48000_OSR_64_FFA \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x47)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xfF, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x42)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0xD5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_RX_48000_OSR_256_FFA \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xfF, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3d, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x21, 0x21)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x2710}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x40)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x05, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x36, 0xc0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x40, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_TX_8000_OSR_256_FFA \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xd0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HANDSET_TX_16000_OSR_256_FFA HANDSET_TX_8000_OSR_256_FFA - -#define HANDSET_TX_48000_OSR_256_FFA \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x10, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xd0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_SPEAKER_STEREO_RX_CAPLESS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_FLASH_IMAGE}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xac)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0x82)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x37, 0xe6, 0xa0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0x2b)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x23, 0x23)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x8A, 0x8A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xa0)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x98)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x88)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x78)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x68)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x58)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x48)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x38)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x28)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x18)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xaC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0xaC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x7530}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } -#endif /* __MARIMBA_PROFILE_H__ */ - - - - diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/mi2s.h b/arch/arm/mach-msm/include/mach/qdsp5v2/mi2s.h deleted file mode 100644 index 2106bfcb00f1..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/mi2s.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_MI2S_H -#define _MACH_QDSP5_V2_MI2S_H - -#define WT_16_BIT 0 -#define WT_24_BIT 1 -#define WT_32_BIT 2 -#define WT_MAX 4 - -enum mi2s_ret_enum_type { - MI2S_FALSE = 0, - MI2S_TRUE -}; - -#define MI2S_CHAN_MONO_RAW 0 -#define MI2S_CHAN_MONO_PACKED 1 -#define MI2S_CHAN_STEREO 2 -#define MI2S_CHAN_4CHANNELS 3 -#define MI2S_CHAN_6CHANNELS 4 -#define MI2S_CHAN_8CHANNELS 5 -#define MI2S_CHAN_MAX_OUTBOUND_CHANNELS MI2S__CHAN_8CHANNELS - -#define MI2S_SD_0 0x01 -#define MI2S_SD_1 0x02 -#define MI2S_SD_2 0x04 -#define MI2S_SD_3 0x08 - -#define MI2S_SD_LINE_MASK (MI2S_SD_0 | MI2S_SD_1 | MI2S_SD_2 | MI2S_SD_3) - -bool mi2s_set_hdmi_output_path(uint8_t channels, uint8_t size, - uint8_t sd_line); - -bool mi2s_set_hdmi_input_path(uint8_t channels, uint8_t size, uint8_t sd_line); - -bool mi2s_set_codec_output_path(uint8_t channels, uint8_t size); - -bool mi2s_set_codec_input_path(uint8_t channels, uint8_t size); - -#endif /* #ifndef MI2S_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/mp3_funcs.h b/arch/arm/mach-msm/include/mach/qdsp5v2/mp3_funcs.h deleted file mode 100644 index b3f7c54486ad..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/mp3_funcs.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef MP3_FUNCS_H -#define MP3_FUNCS_H - -/* Function Prototypes */ -long mp3_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -void audpp_cmd_cfg_mp3_params(struct audio *audio); - -#endif /* !MP3_FUNCS_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/msm_lpa.h b/arch/arm/mach-msm/include/mach/qdsp5v2/msm_lpa.h deleted file mode 100644 index cdfa19b258c5..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/msm_lpa.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_MSM_LPA_H -#define _MACH_QDSP5_V2_MSM_LPA_H - -struct lpa_mem_config { - u32 llb_min_addr; - u32 llb_max_addr; - u32 sb_min_addr; - u32 sb_max_addr; -}; - -struct msm_lpa_platform_data { - u32 obuf_hlb_size; - u32 dsp_proc_id; - u32 app_proc_id; - struct lpa_mem_config nosb_config; /* no summing */ - struct lpa_mem_config sb_config; /* summing required */ -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/pcm_funcs.h b/arch/arm/mach-msm/include/mach/qdsp5v2/pcm_funcs.h deleted file mode 100644 index b8fe2ba20c3d..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/pcm_funcs.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef PCM_FUNCS_H -#define PCM_FUNCS_H - -long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -void audpp_cmd_cfg_pcm_params(struct audio *audio); - -#endif /* !PCM_FUNCS_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afecmdi.h b/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afecmdi.h deleted file mode 100644 index b4ff5b82594a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afecmdi.h +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_QDSP5AFECMDI_H -#define __MACH_QDSP5_V2_QDSP5AFECMDI_H - -#define QDSP5_DEVICE_mI2S_CODEC_RX 1 /* internal codec rx path */ -#define QDSP5_DEVICE_mI2S_CODEC_TX 2 /* internal codec tx path */ -#define QDSP5_DEVICE_AUX_CODEC_RX 3 /* external codec rx path */ -#define QDSP5_DEVICE_AUX_CODEC_TX 4 /* external codec tx path */ -#define QDSP5_DEVICE_mI2S_HDMI_RX 5 /* HDMI/FM block rx path */ -#define QDSP5_DEVICE_mI2S_HDMI_TX 6 /* HDMI/FM block tx path */ -#define QDSP5_DEVICE_ID_MAX 7 - -#define AFE_CMD_CODEC_CONFIG_CMD 0x1 -#define AFE_CMD_CODEC_CONFIG_LEN sizeof(struct afe_cmd_codec_config) - -struct afe_cmd_codec_config{ - uint16_t cmd_id; - uint16_t device_id; - uint16_t activity; - uint16_t sample_rate; - uint16_t channel_mode; - uint16_t volume; - uint16_t reserved; -} __attribute__ ((packed)); - -#define AFE_CMD_DEVICE_VOLUME_CTRL 0x2 -#define AFE_CMD_DEVICE_VOLUME_CTRL_LEN \ - sizeof(struct afe_cmd_device_volume_ctrl) - -struct afe_cmd_device_volume_ctrl { - uint16_t cmd_id; - uint16_t device_id; - uint16_t device_volume; - uint16_t reserved; -} __attribute__ ((packed)); - -#define AFE_CMD_AUX_CODEC_CONFIG_CMD 0x3 -#define AFE_CMD_AUX_CODEC_CONFIG_LEN sizeof(struct afe_cmd_aux_codec_config) - -struct afe_cmd_aux_codec_config{ - uint16_t cmd_id; - uint16_t dma_path_ctl; - uint16_t pcm_ctl; - uint16_t eight_khz_int_mode; - uint16_t aux_codec_intf_ctl; - uint16_t data_format_padding_info; -} __attribute__ ((packed)); - -#define AFE_CMD_FM_RX_ROUTING_CMD 0x6 -#define AFE_CMD_FM_RX_ROUTING_LEN sizeof(struct afe_cmd_fm_codec_config) - -struct afe_cmd_fm_codec_config{ - uint16_t cmd_id; - uint16_t enable; - uint16_t device_id; -} __attribute__ ((packed)); - -#define AFE_CMD_FM_PLAYBACK_VOLUME_CMD 0x8 -#define AFE_CMD_FM_PLAYBACK_VOLUME_LEN sizeof(struct afe_cmd_fm_volume_config) - -struct afe_cmd_fm_volume_config{ - uint16_t cmd_id; - uint16_t volume; - uint16_t reserved; -} __attribute__ ((packed)); - -#define AFE_CMD_FM_CALIBRATION_GAIN_CMD 0x11 -#define AFE_CMD_FM_CALIBRATION_GAIN_LEN \ - sizeof(struct afe_cmd_fm_calibgain_config) - -struct afe_cmd_fm_calibgain_config{ - uint16_t cmd_id; - uint16_t device_id; - uint16_t calibration_gain; -} __attribute__ ((packed)); - -#define AFE_CMD_LOOPBACK 0xD -#define AFE_CMD_EXT_LOOPBACK 0xE -#define AFE_CMD_LOOPBACK_LEN sizeof(struct afe_cmd_loopback) -#define AFE_LOOPBACK_ENABLE_COMMAND 0xFFFF -#define AFE_LOOPBACK_DISABLE_COMMAND 0x0000 - -struct afe_cmd_loopback { - uint16_t cmd_id; - uint16_t enable_flag; - uint16_t reserved[2]; -} __attribute__ ((packed)); - -struct afe_cmd_ext_loopback { - uint16_t cmd_id; - uint16_t enable_flag; - uint16_t source_id; - uint16_t dst_id; - uint16_t reserved[2]; -} __packed; - -#define AFE_CMD_CFG_RMC_PARAMS 0x12 -#define AFE_CMD_CFG_RMC_LEN \ - sizeof(struct afe_cmd_cfg_rmc) - -struct afe_cmd_cfg_rmc { - unsigned short cmd_id; - signed short rmc_mode; - unsigned short rmc_ipw_length_ms; - unsigned short rmc_peak_length_ms; - unsigned short rmc_init_pulse_length_ms; - unsigned short rmc_total_int_length_ms; - unsigned short rmc_rampupdn_length_ms; - unsigned short rmc_delay_length_ms; - unsigned short rmc_detect_start_threshdb; - signed short rmc_init_pulse_threshdb; -} __attribute__((packed)); - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afemsg.h b/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afemsg.h deleted file mode 100644 index 292683adbd0f..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/qdsp5afemsg.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_QDSP5AFEMSG_H -#define __MACH_QDSP5_V2_QDSP5AFEMSG_H - -#define AFE_APU_MSG_CODEC_CONFIG_ACK 0x0001 -#define AFE_APU_MSG_CODEC_CONFIG_ACK_LEN \ - sizeof(struct afe_msg_codec_config_ack) - -#define AFE_APU_MSG_VOC_TIMING_SUCCESS 0x0002 - -#define AFE_MSG_CODEC_CONFIG_ENABLED 0x1 -#define AFE_MSG_CODEC_CONFIG_DISABLED 0xFFFF - -struct afe_msg_codec_config_ack { - uint16_t device_id; - uint16_t device_activity; - uint16_t reserved; -} __attribute__((packed)); - -#endif /* QDSP5AFEMSG_H */ diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_ecodec.h b/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_ecodec.h deleted file mode 100644 index 8e7d96c5657a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_ecodec.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_SNDDEV_ECODEC_H -#define __MACH_QDSP5_V2_SNDDEV_ECODEC_H -#include - -struct snddev_ecodec_data { - u32 capability; /* RX or TX */ - const char *name; - u32 copp_id; /* audpp routing */ - u32 acdb_id; /* Audio Cal purpose */ - u8 channel_mode; - u32 conf_pcm_ctl_val; - u32 conf_aux_codec_intf; - u32 conf_data_format_padding_val; - s32 max_voice_rx_vol[VOC_RX_VOL_ARRAY_NUM]; /* [0]:NB, [1]:WB */ - s32 min_voice_rx_vol[VOC_RX_VOL_ARRAY_NUM]; -}; -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_icodec.h b/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_icodec.h deleted file mode 100644 index 7a811a0be7ab..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_icodec.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_SNDDEV_ICODEC_H -#define __MACH_QDSP5_V2_SNDDEV_ICODEC_H -#include -#include -#include - -struct snddev_icodec_data { - u32 capability; /* RX or TX */ - const char *name; - u32 copp_id; /* audpp routing */ - u32 acdb_id; /* Audio Cal purpose */ - /* Adie profile */ - struct adie_codec_dev_profile *profile; - /* Afe setting */ - u8 channel_mode; - enum hsed_controller *pmctl_id; /* tx only enable mic bias */ - u32 pmctl_id_sz; - u32 default_sample_rate; - void (*pamp_on) (void); - void (*pamp_off) (void); - void (*voltage_on) (void); - void (*voltage_off) (void); - s32 max_voice_rx_vol[VOC_RX_VOL_ARRAY_NUM]; /* [0]: NB,[1]: WB */ - s32 min_voice_rx_vol[VOC_RX_VOL_ARRAY_NUM]; - u32 dev_vol_type; - u32 property; /*variable used to hold the properties - internal to the device*/ -}; -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_mi2s.h b/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_mi2s.h deleted file mode 100644 index a8f523442125..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_mi2s.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_SNDDEV_MI2S_H -#define __MACH_QDSP5_V2_SNDDEV_MI2S_H - -struct snddev_mi2s_data { - u32 capability; /* RX or TX */ - const char *name; - u32 copp_id; /* audpp routing */ - u32 acdb_id; /* Audio Cal purpose */ - u8 channel_mode; - u8 sd_lines; - void (*route) (void); - void (*deroute) (void); - u32 default_sample_rate; -}; - -int mi2s_config_clk_gpio(void); - -int mi2s_config_data_gpio(u32 direction, u8 sd_line_mask); - -int mi2s_unconfig_clk_gpio(void); - -int mi2s_unconfig_data_gpio(u32 direction, u8 sd_line_mask); - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_virtual.h b/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_virtual.h deleted file mode 100644 index 639e981f1cb7..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/snddev_virtual.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef __MACH_QDSP5_V2_SNDDEV_VIRTUAL_H -#define __MACH_QDSP5_V2_SNDDEV_VIRTUAL_H -#include - -struct snddev_virtual_data { - u32 capability; /* RX or TX */ - const char *name; - u32 copp_id; /* audpp routing */ - u32 acdb_id; /* Audio Cal purpose */ -}; -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp5v2/voice.h b/arch/arm/mach-msm/include/mach/qdsp5v2/voice.h deleted file mode 100644 index 93f9bad2943a..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp5v2/voice.h +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2009-2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _MACH_QDSP5_V2_VOICE_H -#define _MACH_QDSP5_V2_VOICE_H - -#define VOICE_DALRPC_DEVICEID 0x02000075 -#define VOICE_DALRPC_PORT_NAME "DAL00" -#define VOICE_DALRPC_CPU 0 - - -/* Commands sent to Modem */ -#define CMD_VOICE_INIT 0x1 -#define CMD_ACQUIRE_DONE 0x2 -#define CMD_RELEASE_DONE 0x3 -#define CMD_DEVICE_INFO 0x4 -#define CMD_DEVICE_CHANGE 0x6 - -/* EVENTS received from MODEM */ -#define EVENT_ACQUIRE_START 0x51 -#define EVENT_RELEASE_START 0x52 -#define EVENT_CHANGE_START 0x54 -#define EVENT_NETWORK_RECONFIG 0x53 - -/* voice state */ -enum { - VOICE_INIT = 0, - VOICE_ACQUIRE, - VOICE_CHANGE, - VOICE_RELEASE, -}; - -enum { - NETWORK_CDMA = 0, - NETWORK_GSM, - NETWORK_WCDMA, - NETWORK_WCDMA_WB, -}; - -enum { - VOICE_DALRPC_CMD = DALDEVICE_FIRST_DEVICE_API_IDX -}; - -/* device state */ -enum { - DEV_INIT = 0, - DEV_READY, - DEV_CHANGE, - DEV_CONCUR, - DEV_REL_DONE, -}; - -/* Voice Event */ -enum{ - VOICE_RELEASE_START = 1, - VOICE_CHANGE_START, - VOICE_ACQUIRE_START, - VOICE_NETWORK_RECONFIG, -}; - -/* Device Event */ -#define DEV_CHANGE_READY 0x1 - -#define VOICE_CALL_START 0x1 -#define VOICE_CALL_END 0 - -#define VOICE_DEV_ENABLED 0x1 -#define VOICE_DEV_DISABLED 0 - -struct voice_header { - uint32_t id; - uint32_t data_len; -}; - -struct voice_init { - struct voice_header hdr; - void *cb_handle; -}; - - -/* Device information payload structure */ -struct voice_device { - struct voice_header hdr; - uint32_t rx_device; - uint32_t tx_device; - uint32_t rx_volume; - uint32_t rx_mute; - uint32_t tx_mute; - uint32_t rx_sample; - uint32_t tx_sample; -}; - -/*Voice command structure*/ -struct voice_network { - struct voice_header hdr; - uint32_t network_info; -}; - -struct device_data { - uint32_t dev_acdb_id; - uint32_t volume; /* in percentage */ - uint32_t mute; - uint32_t sample; - uint32_t enabled; - uint32_t dev_id; -}; - -#endif diff --git a/arch/arm/mach-msm/include/mach/qdsp6v2/apr_us_a.h b/arch/arm/mach-msm/include/mach/qdsp6v2/apr_us_a.h deleted file mode 100644 index 782f3aed1936..000000000000 --- a/arch/arm/mach-msm/include/mach/qdsp6v2/apr_us_a.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __APR_US_A_H__ -#define __APR_US_A_H__ - -#include "apr_us.h" - -/* ======================================================================= */ -/* Session Level commands */ -#define USM_SESSION_CMD_MEMORY_MAP 0x00012304 -struct usm_stream_cmd_memory_map { - struct apr_hdr hdr; - u32 buf_add; - u32 buf_size; - u16 mempool_id; - u16 reserved; -} __packed; - -#define USM_SESSION_CMD_MEMORY_UNMAP 0x00012305 -struct usm_stream_cmd_memory_unmap { - struct apr_hdr hdr; - u32 buf_add; -} __packed; - -#define USM_DATA_CMD_READ 0x0001230E -struct usm_stream_cmd_read { - struct apr_hdr hdr; - u32 buf_add; - u32 buf_size; - u32 uid; - u32 counter; -} __packed; - -#define USM_DATA_EVENT_READ_DONE 0x0001230F - -#define USM_DATA_CMD_WRITE 0x00011273 -struct usm_stream_cmd_write { - struct apr_hdr hdr; - u32 buf_add; - u32 buf_size; - u32 uid; - u32 msw_ts; - u32 lsw_ts; - u32 flags; -} __packed; - -#define USM_DATA_EVENT_WRITE_DONE 0x00011274 - -/* Max number of static located ports (bytes) */ -#define USM_MAX_PORT_NUMBER_A 4 - -/* Parameter structures used in USM_STREAM_CMD_SET_ENCDEC_PARAM command */ -/* common declarations */ -struct usm_cfg_common_a { - u16 ch_cfg; - u16 bits_per_sample; - u32 sample_rate; - u32 dev_id; - u8 data_map[USM_MAX_PORT_NUMBER_A]; -} __packed; - -struct usm_stream_media_format_update { - struct apr_hdr hdr; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common_a cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_encode_cfg_blk { - u32 frames_per_buf; - u32 format_id; - /* = sizeof(usm_cfg_common)+|transp_data| */ - u32 cfg_size; - struct usm_cfg_common_a cfg_common; - /* Transparent configuration data for specific encoder */ - u8 transp_data[USM_MAX_CFG_DATA_SIZE]; -} __packed; - -struct usm_stream_cmd_encdec_cfg_blk { - struct apr_hdr hdr; - u32 param_id; - u32 param_size; - struct usm_encode_cfg_blk enc_blk; -} __packed; -#endif /* __APR_US_A_H__ */ diff --git a/arch/arm/mach-msm/irq-vic.c b/arch/arm/mach-msm/irq-vic.c deleted file mode 100644 index 7e485edb33a2..000000000000 --- a/arch/arm/mach-msm/irq-vic.c +++ /dev/null @@ -1,723 +0,0 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2009, 2011 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include -#include - -#include "fiq.h" -#include "smd_private.h" - -enum { - IRQ_DEBUG_SLEEP_INT_TRIGGER = 1U << 0, - IRQ_DEBUG_SLEEP_INT = 1U << 1, - IRQ_DEBUG_SLEEP_ABORT = 1U << 2, - IRQ_DEBUG_SLEEP = 1U << 3, - IRQ_DEBUG_SLEEP_REQUEST = 1U << 4, -}; -static int msm_irq_debug_mask; -module_param_named(debug_mask, msm_irq_debug_mask, int, - S_IRUGO | S_IWUSR | S_IWGRP); - -#define VIC_REG(off) (MSM_VIC_BASE + (off)) -#define VIC_INT_TO_REG_ADDR(base, irq) (base + (irq / 32) * 4) -#define VIC_INT_TO_REG_INDEX(irq) ((irq >> 5) & 3) - -#define VIC_INT_SELECT0 VIC_REG(0x0000) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_SELECT1 VIC_REG(0x0004) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_SELECT2 VIC_REG(0x0008) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_SELECT3 VIC_REG(0x000C) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_EN0 VIC_REG(0x0010) -#define VIC_INT_EN1 VIC_REG(0x0014) -#define VIC_INT_EN2 VIC_REG(0x0018) -#define VIC_INT_EN3 VIC_REG(0x001C) -#define VIC_INT_ENCLEAR0 VIC_REG(0x0020) -#define VIC_INT_ENCLEAR1 VIC_REG(0x0024) -#define VIC_INT_ENCLEAR2 VIC_REG(0x0028) -#define VIC_INT_ENCLEAR3 VIC_REG(0x002C) -#define VIC_INT_ENSET0 VIC_REG(0x0030) -#define VIC_INT_ENSET1 VIC_REG(0x0034) -#define VIC_INT_ENSET2 VIC_REG(0x0038) -#define VIC_INT_ENSET3 VIC_REG(0x003C) -#define VIC_INT_TYPE0 VIC_REG(0x0040) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_TYPE1 VIC_REG(0x0044) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_TYPE2 VIC_REG(0x0048) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_TYPE3 VIC_REG(0x004C) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_POLARITY0 VIC_REG(0x0050) /* 1: NEG, 0: POS */ -#define VIC_INT_POLARITY1 VIC_REG(0x0054) /* 1: NEG, 0: POS */ -#define VIC_INT_POLARITY2 VIC_REG(0x0058) /* 1: NEG, 0: POS */ -#define VIC_INT_POLARITY3 VIC_REG(0x005C) /* 1: NEG, 0: POS */ -#define VIC_NO_PEND_VAL VIC_REG(0x0060) - -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) -#define VIC_NO_PEND_VAL_FIQ VIC_REG(0x0064) -#define VIC_INT_MASTEREN VIC_REG(0x0068) /* 1: IRQ, 2: FIQ */ -#define VIC_CONFIG VIC_REG(0x006C) /* 1: USE SC VIC */ -#else -#define VIC_INT_MASTEREN VIC_REG(0x0064) /* 1: IRQ, 2: FIQ */ -#define VIC_PROTECTION VIC_REG(0x006C) /* 1: ENABLE */ -#define VIC_CONFIG VIC_REG(0x0068) /* 1: USE ARM1136 VIC */ -#endif - -#define VIC_IRQ_STATUS0 VIC_REG(0x0080) -#define VIC_IRQ_STATUS1 VIC_REG(0x0084) -#define VIC_IRQ_STATUS2 VIC_REG(0x0088) -#define VIC_IRQ_STATUS3 VIC_REG(0x008C) -#define VIC_FIQ_STATUS0 VIC_REG(0x0090) -#define VIC_FIQ_STATUS1 VIC_REG(0x0094) -#define VIC_FIQ_STATUS2 VIC_REG(0x0098) -#define VIC_FIQ_STATUS3 VIC_REG(0x009C) -#define VIC_RAW_STATUS0 VIC_REG(0x00A0) -#define VIC_RAW_STATUS1 VIC_REG(0x00A4) -#define VIC_RAW_STATUS2 VIC_REG(0x00A8) -#define VIC_RAW_STATUS3 VIC_REG(0x00AC) -#define VIC_INT_CLEAR0 VIC_REG(0x00B0) -#define VIC_INT_CLEAR1 VIC_REG(0x00B4) -#define VIC_INT_CLEAR2 VIC_REG(0x00B8) -#define VIC_INT_CLEAR3 VIC_REG(0x00BC) -#define VIC_SOFTINT0 VIC_REG(0x00C0) -#define VIC_SOFTINT1 VIC_REG(0x00C4) -#define VIC_SOFTINT2 VIC_REG(0x00C8) -#define VIC_SOFTINT3 VIC_REG(0x00CC) -#define VIC_IRQ_VEC_RD VIC_REG(0x00D0) /* pending int # */ -#define VIC_IRQ_VEC_PEND_RD VIC_REG(0x00D4) /* pending vector addr */ -#define VIC_IRQ_VEC_WR VIC_REG(0x00D8) - -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) -#define VIC_FIQ_VEC_RD VIC_REG(0x00DC) -#define VIC_FIQ_VEC_PEND_RD VIC_REG(0x00E0) -#define VIC_FIQ_VEC_WR VIC_REG(0x00E4) -#define VIC_IRQ_IN_SERVICE VIC_REG(0x00E8) -#define VIC_IRQ_IN_STACK VIC_REG(0x00EC) -#define VIC_FIQ_IN_SERVICE VIC_REG(0x00F0) -#define VIC_FIQ_IN_STACK VIC_REG(0x00F4) -#define VIC_TEST_BUS_SEL VIC_REG(0x00F8) -#define VIC_IRQ_CTRL_CONFIG VIC_REG(0x00FC) -#else -#define VIC_IRQ_IN_SERVICE VIC_REG(0x00E0) -#define VIC_IRQ_IN_STACK VIC_REG(0x00E4) -#define VIC_TEST_BUS_SEL VIC_REG(0x00E8) -#endif - -#define VIC_VECTPRIORITY(n) VIC_REG(0x0200+((n) * 4)) -#define VIC_VECTADDR(n) VIC_REG(0x0400+((n) * 4)) - -#if defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_FSM9XXX) -#define VIC_NUM_REGS 4 -#else -#define VIC_NUM_REGS 2 -#endif - -#if VIC_NUM_REGS == 2 -#define DPRINT_REGS(base_reg, format, ...) \ - printk(KERN_INFO format " %x %x\n", ##__VA_ARGS__, \ - readl(base_reg ## 0), readl(base_reg ## 1)) -#define DPRINT_ARRAY(array, format, ...) \ - printk(KERN_INFO format " %x %x\n", ##__VA_ARGS__, \ - array[0], array[1]) -#elif VIC_NUM_REGS == 4 -#define DPRINT_REGS(base_reg, format, ...) \ - printk(KERN_INFO format " %x %x %x %x\n", ##__VA_ARGS__, \ - readl(base_reg ## 0), readl(base_reg ## 1), \ - readl(base_reg ## 2), readl(base_reg ## 3)) -#define DPRINT_ARRAY(array, format, ...) \ - printk(KERN_INFO format " %x %x %x %x\n", ##__VA_ARGS__, \ - array[0], array[1], \ - array[2], array[3]) -#else -#error "VIC_NUM_REGS set to illegal value" -#endif - -static uint32_t msm_irq_smsm_wake_enable[2]; -static struct { - uint32_t int_en[2]; - uint32_t int_type; - uint32_t int_polarity; - uint32_t int_select; -} msm_irq_shadow_reg[VIC_NUM_REGS]; -static uint32_t msm_irq_idle_disable[VIC_NUM_REGS]; - -#define SMSM_FAKE_IRQ (0xff) -#if !defined(CONFIG_ARCH_FSM9XXX) -static uint8_t msm_irq_to_smsm[NR_IRQS] = { -#if !defined(CONFIG_ARCH_MSM7X27A) - [INT_MDDI_EXT] = 1, - [INT_MDDI_PRI] = 2, - [INT_MDDI_CLIENT] = 3, -#endif - [INT_USB_OTG] = 4, - - [INT_PWB_I2C] = 5, - [INT_SDC1_0] = 6, - [INT_SDC1_1] = 7, - [INT_SDC2_0] = 8, - - [INT_SDC2_1] = 9, - [INT_ADSP_A9_A11] = 10, - [INT_UART1] = 11, - [INT_UART2] = 12, - - [INT_UART3] = 13, - [INT_UART1_RX] = 14, - [INT_UART2_RX] = 15, - [INT_UART3_RX] = 16, - - [INT_UART1DM_IRQ] = 17, - [INT_UART1DM_RX] = 18, - [INT_KEYSENSE] = 19, -#if !defined(CONFIG_ARCH_MSM7X30) - [INT_AD_HSSD] = 20, -#endif - - [INT_NAND_WR_ER_DONE] = 21, - [INT_NAND_OP_DONE] = 22, - [INT_TCHSCRN1] = 23, - [INT_TCHSCRN2] = 24, - - [INT_TCHSCRN_SSBI] = 25, - [INT_USB_HS] = 26, - [INT_UART2DM_RX] = 27, - [INT_UART2DM_IRQ] = 28, - - [INT_SDC4_1] = 29, - [INT_SDC4_0] = 30, - [INT_SDC3_1] = 31, - [INT_SDC3_0] = 32, - - /* fake wakeup interrupts */ - [INT_GPIO_GROUP1] = SMSM_FAKE_IRQ, - [INT_GPIO_GROUP2] = SMSM_FAKE_IRQ, - [INT_A9_M2A_0] = SMSM_FAKE_IRQ, - [INT_A9_M2A_1] = SMSM_FAKE_IRQ, - [INT_A9_M2A_5] = SMSM_FAKE_IRQ, - [INT_GP_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_DEBUG_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_ADSP_A11] = SMSM_FAKE_IRQ, -#ifdef CONFIG_ARCH_QSD8X50 - [INT_SIRC_0] = SMSM_FAKE_IRQ, - [INT_SIRC_1] = SMSM_FAKE_IRQ, -#endif -}; -# else /* CONFIG_ARCH_FSM9XXX */ -static uint8_t msm_irq_to_smsm[NR_IRQS] = { - [INT_UART1] = 11, - [INT_A9_M2A_0] = SMSM_FAKE_IRQ, - [INT_A9_M2A_1] = SMSM_FAKE_IRQ, - [INT_A9_M2A_5] = SMSM_FAKE_IRQ, - [INT_GP_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_DEBUG_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_SIRC_0] = 10, - [INT_ADSP_A11] = SMSM_FAKE_IRQ, -}; -#endif /* CONFIG_ARCH_FSM9XXX */ - -static inline void msm_irq_write_all_regs(void __iomem *base, unsigned int val) -{ - int i; - - for (i = 0; i < VIC_NUM_REGS; i++) - writel(val, base + (i * 4)); -} - -static void msm_irq_ack(struct irq_data *d) -{ - uint32_t mask; - - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_CLEAR0, d->irq); - mask = 1 << (d->irq & 31); - writel(mask, reg); - mb(); -} - -static void msm_irq_disable(struct irq_data *d) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_ENCLEAR0, d->irq); - unsigned index = VIC_INT_TO_REG_INDEX(d->irq); - uint32_t mask = 1UL << (d->irq & 31); - int smsm_irq = msm_irq_to_smsm[d->irq]; - - if (!(msm_irq_shadow_reg[index].int_en[1] & mask)) { - msm_irq_shadow_reg[index].int_en[0] &= ~mask; - writel(mask, reg); - mb(); - if (smsm_irq == 0) - msm_irq_idle_disable[index] &= ~mask; - else { - mask = 1UL << (smsm_irq - 1); - msm_irq_smsm_wake_enable[0] &= ~mask; - } - } -} - -static void msm_irq_mask(struct irq_data *d) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_ENCLEAR0, d->irq); - unsigned index = VIC_INT_TO_REG_INDEX(d->irq); - uint32_t mask = 1UL << (d->irq & 31); - int smsm_irq = msm_irq_to_smsm[d->irq]; - - msm_irq_shadow_reg[index].int_en[0] &= ~mask; - writel(mask, reg); - mb(); - if (smsm_irq == 0) - msm_irq_idle_disable[index] &= ~mask; - else { - mask = 1UL << (smsm_irq - 1); - msm_irq_smsm_wake_enable[0] &= ~mask; - } -} - -static void msm_irq_unmask(struct irq_data *d) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_ENSET0, d->irq); - unsigned index = VIC_INT_TO_REG_INDEX(d->irq); - uint32_t mask = 1UL << (d->irq & 31); - int smsm_irq = msm_irq_to_smsm[d->irq]; - - msm_irq_shadow_reg[index].int_en[0] |= mask; - writel(mask, reg); - mb(); - - if (smsm_irq == 0) - msm_irq_idle_disable[index] |= mask; - else { - mask = 1UL << (smsm_irq - 1); - msm_irq_smsm_wake_enable[0] |= mask; - } -} - -static int msm_irq_set_wake(struct irq_data *d, unsigned int on) -{ - unsigned index = VIC_INT_TO_REG_INDEX(d->irq); - uint32_t mask = 1UL << (d->irq & 31); - int smsm_irq = msm_irq_to_smsm[d->irq]; - - if (smsm_irq == 0) { - printk(KERN_ERR "msm_irq_set_wake: bad wakeup irq %d\n", d->irq); - return -EINVAL; - } - if (on) - msm_irq_shadow_reg[index].int_en[1] |= mask; - else - msm_irq_shadow_reg[index].int_en[1] &= ~mask; - - if (smsm_irq == SMSM_FAKE_IRQ) - return 0; - - mask = 1UL << (smsm_irq - 1); - if (on) - msm_irq_smsm_wake_enable[1] |= mask; - else - msm_irq_smsm_wake_enable[1] &= ~mask; - return 0; -} - -static int msm_irq_set_type(struct irq_data *d, unsigned int flow_type) -{ - void __iomem *treg = VIC_INT_TO_REG_ADDR(VIC_INT_TYPE0, d->irq); - void __iomem *preg = VIC_INT_TO_REG_ADDR(VIC_INT_POLARITY0, d->irq); - unsigned index = VIC_INT_TO_REG_INDEX(d->irq); - int b = 1 << (d->irq & 31); - uint32_t polarity; - uint32_t type; - - polarity = msm_irq_shadow_reg[index].int_polarity; - if (flow_type & (IRQF_TRIGGER_FALLING | IRQF_TRIGGER_LOW)) - polarity |= b; - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_HIGH)) - polarity &= ~b; - writel(polarity, preg); - msm_irq_shadow_reg[index].int_polarity = polarity; - - type = msm_irq_shadow_reg[index].int_type; - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { - type |= b; - __irq_set_handler_locked(d->irq, handle_edge_irq); - } - if (flow_type & (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW)) { - type &= ~b; - __irq_set_handler_locked(d->irq, handle_level_irq); - } - writel(type, treg); - mb(); - msm_irq_shadow_reg[index].int_type = type; - return 0; -} - -unsigned int msm_irq_pending(void) -{ - unsigned int i, pending = 0; - - for (i = 0; (i < VIC_NUM_REGS) && !pending; i++) - pending |= readl(VIC_IRQ_STATUS0 + (i * 4)); - - return pending; -} - -int msm_irq_idle_sleep_allowed(void) -{ - uint32_t i, disable = 0; - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_REQUEST) - DPRINT_ARRAY(msm_irq_idle_disable, - "msm_irq_idle_sleep_allowed: disable"); - - for (i = 0; i < VIC_NUM_REGS; i++) - disable |= msm_irq_idle_disable[i]; - - return !disable; -} - -/* - * Prepare interrupt subsystem for entering sleep -- phase 1. - * If modem_wake is true, return currently enabled interrupts in *irq_mask. - */ -void msm_irq_enter_sleep1(bool modem_wake, int from_idle, uint32_t *irq_mask) -{ - if (modem_wake) { - *irq_mask = msm_irq_smsm_wake_enable[!from_idle]; - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - printk(KERN_INFO - "%s irq_mask %x\n", __func__, *irq_mask); - } -} - -/* - * Prepare interrupt subsystem for entering sleep -- phase 2. - * Detect any pending interrupts and configure interrupt hardware. - * - * Return value: - * -EAGAIN: there are pending interrupt(s); interrupt configuration - * is not changed. - * 0: success - */ -int msm_irq_enter_sleep2(bool modem_wake, int from_idle) -{ - int i, limit = 10; - uint32_t pending[VIC_NUM_REGS]; - - if (from_idle && !modem_wake) - return 0; - - /* edge triggered interrupt may get lost if this mode is used */ - WARN_ON_ONCE(!modem_wake && !from_idle); - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - DPRINT_REGS(VIC_IRQ_STATUS, "%s change irq, pend", __func__); - - for (i = 0; i < VIC_NUM_REGS; i++) { - pending[i] = readl(VIC_IRQ_STATUS0 + (i * 4)); - pending[i] &= msm_irq_shadow_reg[i].int_en[!from_idle]; - } - - /* - * Clear INT_A9_M2A_5 since requesting sleep triggers it. - * In some arch e.g. FSM9XXX, INT_A9_M2A_5 may not be in the first set. - */ - pending[INT_A9_M2A_5 / 32] &= ~(1U << (INT_A9_M2A_5 % 32)); - - for (i = 0; i < VIC_NUM_REGS; i++) { - if (pending[i]) { - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_ABORT) - DPRINT_ARRAY(pending, "%s abort", - __func__); - return -EAGAIN; - } - } - - msm_irq_write_all_regs(VIC_INT_EN0, 0); - - while (limit-- > 0) { - int pend_irq; - int irq = readl(VIC_IRQ_VEC_RD); - if (irq == -1) - break; - pend_irq = readl(VIC_IRQ_VEC_PEND_RD); - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) - printk(KERN_INFO "%s cleared int %d (%d)\n", - __func__, irq, pend_irq); - } - - if (modem_wake) { - struct irq_data d = { .irq = INT_A9_M2A_6 }; - msm_irq_set_type(&d, IRQF_TRIGGER_RISING); - __raw_writel(1U << (INT_A9_M2A_6 % 32), - VIC_INT_TO_REG_ADDR(VIC_INT_ENSET0, INT_A9_M2A_6)); - } else { - for (i = 0; i < VIC_NUM_REGS; i++) - writel(msm_irq_shadow_reg[i].int_en[1], - VIC_INT_ENSET0 + (i * 4)); - } - mb(); - - return 0; -} - -/* - * Restore interrupt subsystem from sleep -- phase 1. - * Configure interrupt hardware. - */ -void msm_irq_exit_sleep1(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs) -{ - int i; - struct irq_data d = { .irq = INT_A9_M2A_6 }; - - msm_irq_ack(&d); - - for (i = 0; i < VIC_NUM_REGS; i++) { - writel(msm_irq_shadow_reg[i].int_type, - VIC_INT_TYPE0 + i * 4); - writel(msm_irq_shadow_reg[i].int_polarity, - VIC_INT_POLARITY0 + i * 4); - writel(msm_irq_shadow_reg[i].int_en[0], - VIC_INT_EN0 + i * 4); - writel(msm_irq_shadow_reg[i].int_select, - VIC_INT_SELECT0 + i * 4); - } - - writel(3, VIC_INT_MASTEREN); - mb(); - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - DPRINT_REGS(VIC_IRQ_STATUS, "%s %x %x %x now", - __func__, irq_mask, pending_irqs, wakeup_reason); -} - -/* - * Restore interrupt subsystem from sleep -- phase 2. - * Poke the specified pending interrupts into interrupt hardware. - */ -void msm_irq_exit_sleep2(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending) -{ - int i; - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - DPRINT_REGS(VIC_IRQ_STATUS, "%s %x %x %x now", - __func__, irq_mask, pending, wakeup_reason); - - for (i = 0; pending && i < ARRAY_SIZE(msm_irq_to_smsm); i++) { - unsigned reg_offset = VIC_INT_TO_REG_ADDR(0, i); - uint32_t reg_mask = 1UL << (i & 31); - int smsm_irq = msm_irq_to_smsm[i]; - uint32_t smsm_mask; - - if (smsm_irq == 0) - continue; - - smsm_mask = 1U << (smsm_irq - 1); - if (!(pending & smsm_mask)) - continue; - - pending &= ~smsm_mask; - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) - DPRINT_REGS(VIC_IRQ_STATUS, - "%s: irq %d still pending %x now", - __func__, i, pending); -#ifdef DEBUG_INTERRUPT_TRIGGER - if (readl(VIC_IRQ_STATUS0 + reg_offset) & reg_mask) - writel(reg_mask, VIC_INT_CLEAR0 + reg_offset); -#endif - if (readl(VIC_IRQ_STATUS0 + reg_offset) & reg_mask) - continue; - - writel(reg_mask, VIC_SOFTINT0 + reg_offset); - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT_TRIGGER) - DPRINT_REGS(VIC_IRQ_STATUS, - "%s: irq %d need trigger, now", - __func__, i); - } - mb(); -} - -/* - * Restore interrupt subsystem from sleep -- phase 3. - * Print debug information. - */ -void msm_irq_exit_sleep3(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs) -{ - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - DPRINT_REGS(VIC_IRQ_STATUS, "%s %x %x %x state %x now", - __func__, irq_mask, pending_irqs, wakeup_reason, - smsm_get_state(SMSM_MODEM_STATE)); -} - -static struct irq_chip msm_irq_chip = { - .name = "msm", - .irq_disable = msm_irq_disable, - .irq_ack = msm_irq_ack, - .irq_mask = msm_irq_mask, - .irq_unmask = msm_irq_unmask, - .irq_set_wake = msm_irq_set_wake, - .irq_set_type = msm_irq_set_type, -}; - -void __init msm_init_irq(void) -{ - unsigned n; - - /* select level interrupts */ - msm_irq_write_all_regs(VIC_INT_TYPE0, 0); - - /* select highlevel interrupts */ - msm_irq_write_all_regs(VIC_INT_POLARITY0, 0); - - /* select IRQ for all INTs */ - msm_irq_write_all_regs(VIC_INT_SELECT0, 0); - - /* disable all INTs */ - msm_irq_write_all_regs(VIC_INT_EN0, 0); - - /* don't use vic */ - writel(0, VIC_CONFIG); - - - for (n = 0; n < NR_MSM_IRQS; n++) { - irq_set_chip_and_handler(n, &msm_irq_chip, handle_level_irq); - set_irq_flags(n, IRQF_VALID); - } - - /* enable interrupt controller */ - writel(3, VIC_INT_MASTEREN); - mb(); -} - -static inline void msm_vic_handle_irq(void __iomem *base_addr, struct pt_regs - *regs) -{ - u32 irqnr; - - do { - /* 0xD0 has irq# or old irq# if the irq has been handled - * 0xD4 has irq# or -1 if none pending *but* if you just - * read 0xD4 you never get the first irq for some reason - */ - irqnr = readl_relaxed(base_addr + 0xD0); - irqnr = readl_relaxed(base_addr + 0xD4); - if (irqnr == -1) - break; - handle_IRQ(irqnr, regs); - } while (1); -} - -/* enable imprecise aborts */ -#define local_cpsie_enable() __asm__ __volatile__("cpsie a @ enable") - -asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs) -{ - local_cpsie_enable(); - msm_vic_handle_irq((void __iomem *)MSM_VIC_BASE, regs); -} - -#if defined(CONFIG_MSM_FIQ_SUPPORT) -void msm_trigger_irq(int irq) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_SOFTINT0, irq); - uint32_t mask = 1UL << (irq & 31); - writel(mask, reg); - mb(); -} - -void msm_fiq_enable(int irq) -{ - struct irq_data d = { .irq = irq }; - unsigned long flags; - local_irq_save(flags); - msm_irq_unmask(&d); - local_irq_restore(flags); -} - -void msm_fiq_disable(int irq) -{ - struct irq_data d = { .irq = irq }; - unsigned long flags; - local_irq_save(flags); - msm_irq_mask(&d); - local_irq_restore(flags); -} - -void msm_fiq_select(int irq) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_SELECT0, irq); - unsigned index = VIC_INT_TO_REG_INDEX(irq); - uint32_t mask = 1UL << (irq & 31); - unsigned long flags; - - local_irq_save(flags); - msm_irq_shadow_reg[index].int_select |= mask; - writel(msm_irq_shadow_reg[index].int_select, reg); - mb(); - local_irq_restore(flags); -} - -void msm_fiq_unselect(int irq) -{ - void __iomem *reg = VIC_INT_TO_REG_ADDR(VIC_INT_SELECT0, irq); - unsigned index = VIC_INT_TO_REG_INDEX(irq); - uint32_t mask = 1UL << (irq & 31); - unsigned long flags; - - local_irq_save(flags); - msm_irq_shadow_reg[index].int_select &= (!mask); - writel(msm_irq_shadow_reg[index].int_select, reg); - mb(); - local_irq_restore(flags); -} -/* set_fiq_handler originally from arch/arm/kernel/fiq.c */ -static void set_fiq_handler(void *start, unsigned int length) -{ - memcpy((void *)0xffff001c, start, length); - flush_icache_range(0xffff001c, 0xffff001c + length); - if (!vectors_high()) - flush_icache_range(0x1c, 0x1c + length); -} - -static void (*fiq_func)(void *data, void *regs); -static unsigned long long fiq_stack[256]; - -int msm_fiq_set_handler(void (*func)(void *data, void *regs), void *data) -{ - unsigned long flags; - int ret = -ENOMEM; - - local_irq_save(flags); - if (fiq_func == 0) { - fiq_func = func; - fiq_glue_setup(func, data, fiq_stack + 255); - set_fiq_handler(&fiq_glue, (&fiq_glue_end - &fiq_glue)); - ret = 0; - } - local_irq_restore(flags); - return ret; -} -#endif diff --git a/arch/arm/mach-msm/irq.c b/arch/arm/mach-msm/irq.c deleted file mode 100644 index 280160aa018c..000000000000 --- a/arch/arm/mach-msm/irq.c +++ /dev/null @@ -1,607 +0,0 @@ -/* linux/arch/arm/mach-msm/irq.c - * - * Copyright (C) 2007 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include "sirc.h" -#include "smd_private.h" - -enum { - IRQ_DEBUG_SLEEP_INT_TRIGGER = 1U << 0, - IRQ_DEBUG_SLEEP_INT = 1U << 1, - IRQ_DEBUG_SLEEP_ABORT = 1U << 2, - IRQ_DEBUG_SLEEP = 1U << 3, - IRQ_DEBUG_SLEEP_REQUEST = 1U << 4, -}; -static int msm_irq_debug_mask; -module_param_named(debug_mask, msm_irq_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP); - -#define VIC_REG(off) (MSM_VIC_BASE + (off)) - -#define VIC_INT_SELECT0 VIC_REG(0x0000) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_SELECT1 VIC_REG(0x0004) /* 1: FIQ, 0: IRQ */ -#define VIC_INT_EN0 VIC_REG(0x0010) -#define VIC_INT_EN1 VIC_REG(0x0014) -#define VIC_INT_ENCLEAR0 VIC_REG(0x0020) -#define VIC_INT_ENCLEAR1 VIC_REG(0x0024) -#define VIC_INT_ENSET0 VIC_REG(0x0030) -#define VIC_INT_ENSET1 VIC_REG(0x0034) -#define VIC_INT_TYPE0 VIC_REG(0x0040) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_TYPE1 VIC_REG(0x0044) /* 1: EDGE, 0: LEVEL */ -#define VIC_INT_POLARITY0 VIC_REG(0x0050) /* 1: NEG, 0: POS */ -#define VIC_INT_POLARITY1 VIC_REG(0x0054) /* 1: NEG, 0: POS */ -#define VIC_NO_PEND_VAL VIC_REG(0x0060) - -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) -#define VIC_NO_PEND_VAL_FIQ VIC_REG(0x0064) -#define VIC_INT_MASTEREN VIC_REG(0x0068) /* 1: IRQ, 2: FIQ */ -#define VIC_CONFIG VIC_REG(0x006C) /* 1: USE SC VIC */ -#else -#define VIC_INT_MASTEREN VIC_REG(0x0064) /* 1: IRQ, 2: FIQ */ -#define VIC_CONFIG VIC_REG(0x0068) /* 1: USE ARM1136 VIC */ -#define VIC_PROTECTION VIC_REG(0x006C) /* 1: ENABLE */ -#endif -#define VIC_IRQ_STATUS0 VIC_REG(0x0080) -#define VIC_IRQ_STATUS1 VIC_REG(0x0084) -#define VIC_FIQ_STATUS0 VIC_REG(0x0090) -#define VIC_FIQ_STATUS1 VIC_REG(0x0094) -#define VIC_RAW_STATUS0 VIC_REG(0x00A0) -#define VIC_RAW_STATUS1 VIC_REG(0x00A4) -#define VIC_INT_CLEAR0 VIC_REG(0x00B0) -#define VIC_INT_CLEAR1 VIC_REG(0x00B4) -#define VIC_SOFTINT0 VIC_REG(0x00C0) -#define VIC_SOFTINT1 VIC_REG(0x00C4) -#define VIC_IRQ_VEC_RD VIC_REG(0x00D0) /* pending int # */ -#define VIC_IRQ_VEC_PEND_RD VIC_REG(0x00D4) /* pending vector addr */ -#define VIC_IRQ_VEC_WR VIC_REG(0x00D8) - -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) -#define VIC_FIQ_VEC_RD VIC_REG(0x00DC) -#define VIC_FIQ_VEC_PEND_RD VIC_REG(0x00E0) -#define VIC_FIQ_VEC_WR VIC_REG(0x00E4) -#define VIC_IRQ_IN_SERVICE VIC_REG(0x00E8) -#define VIC_IRQ_IN_STACK VIC_REG(0x00EC) -#define VIC_FIQ_IN_SERVICE VIC_REG(0x00F0) -#define VIC_FIQ_IN_STACK VIC_REG(0x00F4) -#define VIC_TEST_BUS_SEL VIC_REG(0x00F8) -#define VIC_IRQ_CTRL_CONFIG VIC_REG(0x00FC) -#else -#define VIC_IRQ_IN_SERVICE VIC_REG(0x00E0) -#define VIC_IRQ_IN_STACK VIC_REG(0x00E4) -#define VIC_TEST_BUS_SEL VIC_REG(0x00E8) -#endif - -#define VIC_VECTPRIORITY(n) VIC_REG(0x0200+((n) * 4)) -#define VIC_VECTADDR(n) VIC_REG(0x0400+((n) * 4)) - -static uint32_t msm_irq_smsm_wake_enable[2]; -static struct { - uint32_t int_en[2]; - uint32_t int_type; - uint32_t int_polarity; - uint32_t int_select; -} msm_irq_shadow_reg[2]; -static uint32_t msm_irq_idle_disable[2]; - -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) -#define INT_INFO_SMSM_ID SMEM_SMSM_INT_INFO -struct smsm_interrupt_info *smsm_int_info; -#else -#define INT_INFO_SMSM_ID SMEM_APPS_DEM_SLAVE_DATA -struct msm_dem_slave_data *smsm_int_info; -#endif - - -#define SMSM_FAKE_IRQ (0xff) -static uint8_t msm_irq_to_smsm[NR_MSM_IRQS + NR_SIRC_IRQS] = { - [INT_MDDI_EXT] = 1, - [INT_MDDI_PRI] = 2, - [INT_MDDI_CLIENT] = 3, - [INT_USB_OTG] = 4, - - /* [INT_PWB_I2C] = 5 -- not usable */ - [INT_SDC1_0] = 6, - [INT_SDC1_1] = 7, - [INT_SDC2_0] = 8, - - [INT_SDC2_1] = 9, - [INT_ADSP_A9_A11] = 10, - [INT_UART1] = 11, - [INT_UART2] = 12, - - [INT_UART3] = 13, - [INT_UART1_RX] = 14, - [INT_UART2_RX] = 15, - [INT_UART3_RX] = 16, - - [INT_UART1DM_IRQ] = 17, - [INT_UART1DM_RX] = 18, - [INT_KEYSENSE] = 19, - [INT_AD_HSSD] = 20, - - [INT_NAND_WR_ER_DONE] = 21, - [INT_NAND_OP_DONE] = 22, - [INT_TCHSCRN1] = 23, - [INT_TCHSCRN2] = 24, - - [INT_TCHSCRN_SSBI] = 25, - [INT_USB_HS] = 26, - [INT_UART2DM_RX] = 27, - [INT_UART2DM_IRQ] = 28, - - [INT_SDC4_1] = 29, - [INT_SDC4_0] = 30, - [INT_SDC3_1] = 31, - [INT_SDC3_0] = 32, - - /* fake wakeup interrupts */ - [INT_GPIO_GROUP1] = SMSM_FAKE_IRQ, - [INT_GPIO_GROUP2] = SMSM_FAKE_IRQ, - [INT_A9_M2A_0] = SMSM_FAKE_IRQ, - [INT_A9_M2A_1] = SMSM_FAKE_IRQ, - [INT_A9_M2A_5] = SMSM_FAKE_IRQ, - [INT_GP_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_DEBUG_TIMER_EXP] = SMSM_FAKE_IRQ, - [INT_ADSP_A11] = SMSM_FAKE_IRQ, -#if defined(CONFIG_ARCH_MSM_SCORPION) && !defined(CONFIG_MSM_SMP) - [INT_SIRC_0] = SMSM_FAKE_IRQ, - [INT_SIRC_1] = SMSM_FAKE_IRQ, -#endif -}; - -static void msm_irq_ack(unsigned int irq) -{ - void __iomem *reg = VIC_INT_CLEAR0 + ((irq & 32) ? 4 : 0); - irq = 1 << (irq & 31); - writel(irq, reg); -} - -static void msm_irq_mask(unsigned int irq) -{ - void __iomem *reg = VIC_INT_ENCLEAR0 + ((irq & 32) ? 4 : 0); - unsigned index = (irq >> 5) & 1; - uint32_t mask = 1UL << (irq & 31); - int smsm_irq = msm_irq_to_smsm[irq]; - - msm_irq_shadow_reg[index].int_en[0] &= ~mask; - writel(mask, reg); - if (smsm_irq == 0) - msm_irq_idle_disable[index] &= ~mask; - else { - mask = 1UL << (smsm_irq - 1); - msm_irq_smsm_wake_enable[0] &= ~mask; - } -} - -static void msm_irq_unmask(unsigned int irq) -{ - void __iomem *reg = VIC_INT_ENSET0 + ((irq & 32) ? 4 : 0); - unsigned index = (irq >> 5) & 1; - uint32_t mask = 1UL << (irq & 31); - int smsm_irq = msm_irq_to_smsm[irq]; - - msm_irq_shadow_reg[index].int_en[0] |= mask; - writel(mask, reg); - - if (smsm_irq == 0) - msm_irq_idle_disable[index] |= mask; - else { - mask = 1UL << (smsm_irq - 1); - msm_irq_smsm_wake_enable[0] |= mask; - } -} - -static int msm_irq_set_wake(unsigned int irq, unsigned int on) -{ - unsigned index = (irq >> 5) & 1; - uint32_t mask = 1UL << (irq & 31); - int smsm_irq = msm_irq_to_smsm[irq]; - - if (smsm_irq == 0) { - printk(KERN_ERR "msm_irq_set_wake: bad wakeup irq %d\n", irq); - return -EINVAL; - } - if (on) - msm_irq_shadow_reg[index].int_en[1] |= mask; - else - msm_irq_shadow_reg[index].int_en[1] &= ~mask; - - if (smsm_irq == SMSM_FAKE_IRQ) - return 0; - - mask = 1UL << (smsm_irq - 1); - if (on) - msm_irq_smsm_wake_enable[1] |= mask; - else - msm_irq_smsm_wake_enable[1] &= ~mask; - return 0; -} - -static int msm_irq_set_type(unsigned int irq, unsigned int flow_type) -{ - void __iomem *treg = VIC_INT_TYPE0 + ((irq & 32) ? 4 : 0); - void __iomem *preg = VIC_INT_POLARITY0 + ((irq & 32) ? 4 : 0); - unsigned index = (irq >> 5) & 1; - int b = 1 << (irq & 31); - uint32_t polarity; - uint32_t type; - - polarity = msm_irq_shadow_reg[index].int_polarity; - if (flow_type & (IRQF_TRIGGER_FALLING | IRQF_TRIGGER_LOW)) - polarity |= b; - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_HIGH)) - polarity &= ~b; - writel(polarity, preg); - msm_irq_shadow_reg[index].int_polarity = polarity; - - type = msm_irq_shadow_reg[index].int_type; - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { - type |= b; - __irq_set_handler_locked(d->irq, handle_edge_irq); - } - if (flow_type & (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW)) { - type &= ~b; - __irq_set_handler_locked(d->irq, handle_level_irq); - } - writel(type, treg); - msm_irq_shadow_reg[index].int_type = type; - return 0; -} - -int msm_irq_pending(void) -{ - return readl(VIC_IRQ_STATUS0) || readl(VIC_IRQ_STATUS1); -} - -int msm_irq_idle_sleep_allowed(void) -{ - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_REQUEST) - printk(KERN_INFO "msm_irq_idle_sleep_allowed: disable %x %x\n", - msm_irq_idle_disable[0], msm_irq_idle_disable[1]); - return !(msm_irq_idle_disable[0] || msm_irq_idle_disable[1] || - !smsm_int_info); -} - -/* If arm9_wake is set: pass control to the other core. - * If from_idle is not set: disable non-wakeup interrupts. - */ -void msm_irq_enter_sleep1(bool arm9_wake, int from_idle) -{ - if (!arm9_wake || !smsm_int_info) - return; - smsm_int_info->interrupt_mask = msm_irq_smsm_wake_enable[!from_idle]; - smsm_int_info->pending_interrupts = 0; -} - -int msm_irq_enter_sleep2(bool arm9_wake, int from_idle) -{ - int limit = 10; - uint32_t pending0, pending1; - - if (from_idle && !arm9_wake) - return 0; - - /* edge triggered interrupt may get lost if this mode is used */ - WARN_ON_ONCE(!arm9_wake && !from_idle); - - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - printk(KERN_INFO "msm_irq_enter_sleep change irq, pend %x %x\n", - readl(VIC_IRQ_STATUS0), readl(VIC_IRQ_STATUS1)); - pending0 = readl(VIC_IRQ_STATUS0); - pending1 = readl(VIC_IRQ_STATUS1); - pending0 &= msm_irq_shadow_reg[0].int_en[!from_idle]; - /* Clear INT_A9_M2A_5 since requesting sleep triggers it */ - pending0 &= ~(1U << INT_A9_M2A_5); - pending1 &= msm_irq_shadow_reg[1].int_en[!from_idle]; - if (pending0 || pending1) { - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_ABORT) - printk(KERN_INFO "msm_irq_enter_sleep2 abort %x %x\n", - pending0, pending1); - return -EAGAIN; - } - - writel(0, VIC_INT_EN0); - writel(0, VIC_INT_EN1); - - while (limit-- > 0) { - int pend_irq; - int irq = readl(VIC_IRQ_VEC_RD); - if (irq == -1) - break; - pend_irq = readl(VIC_IRQ_VEC_PEND_RD); - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) - printk(KERN_INFO "msm_irq_enter_sleep cleared " - "int %d (%d)\n", irq, pend_irq); - } - - if (arm9_wake) { - msm_irq_set_type(INT_A9_M2A_6, IRQF_TRIGGER_RISING); - msm_irq_ack(INT_A9_M2A_6); - writel(1U << INT_A9_M2A_6, VIC_INT_ENSET0); - } else { - writel(msm_irq_shadow_reg[0].int_en[1], VIC_INT_ENSET0); - writel(msm_irq_shadow_reg[1].int_en[1], VIC_INT_ENSET1); - } - return 0; -} - -void msm_irq_exit_sleep1(void) -{ - int i; - - msm_irq_ack(INT_A9_M2A_6); - msm_irq_ack(INT_PWB_I2C); - for (i = 0; i < 2; i++) { - writel(msm_irq_shadow_reg[i].int_type, VIC_INT_TYPE0 + i * 4); - writel(msm_irq_shadow_reg[i].int_polarity, VIC_INT_POLARITY0 + i * 4); - writel(msm_irq_shadow_reg[i].int_en[0], VIC_INT_EN0 + i * 4); - writel(msm_irq_shadow_reg[i].int_select, VIC_INT_SELECT0 + i * 4); - } - writel(3, VIC_INT_MASTEREN); - if (!smsm_int_info) { - printk(KERN_ERR "msm_irq_exit_sleep \n"); - return; - } - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - printk(KERN_INFO "msm_irq_exit_sleep1 %x %x %x now %x %x\n", - smsm_int_info->interrupt_mask, - smsm_int_info->pending_interrupts, - smsm_int_info->wakeup_reason, - readl(VIC_IRQ_STATUS0), readl(VIC_IRQ_STATUS1)); -} - -void msm_irq_exit_sleep2(void) -{ - int i; - uint32_t pending; - - if (!smsm_int_info) { - printk(KERN_ERR "msm_irq_exit_sleep \n"); - return; - } - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - printk(KERN_INFO "msm_irq_exit_sleep2 %x %x %x now %x %x\n", - smsm_int_info->interrupt_mask, - smsm_int_info->pending_interrupts, - smsm_int_info->wakeup_reason, - readl(VIC_IRQ_STATUS0), readl(VIC_IRQ_STATUS1)); - pending = smsm_int_info->pending_interrupts; - for (i = 0; pending && i < ARRAY_SIZE(msm_irq_to_smsm); i++) { - unsigned reg_offset = (i & 32) ? 4 : 0; - uint32_t reg_mask = 1UL << (i & 31); - int smsm_irq = msm_irq_to_smsm[i]; - uint32_t smsm_mask; - if (smsm_irq == 0) - continue; - smsm_mask = 1U << (smsm_irq - 1); - if (!(pending & smsm_mask)) - continue; - pending &= ~smsm_mask; - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) - printk(KERN_INFO "msm_irq_exit_sleep2: irq %d " - "still pending %x now %x %x\n", i, pending, - readl(VIC_IRQ_STATUS0), readl(VIC_IRQ_STATUS1)); -#if 0 /* debug intetrrupt trigger */ - if (readl(VIC_IRQ_STATUS0 + reg_offset) & reg_mask) - writel(reg_mask, VIC_INT_CLEAR0 + reg_offset); -#endif - if (readl(VIC_IRQ_STATUS0 + reg_offset) & reg_mask) - continue; - writel(reg_mask, VIC_SOFTINT0 + reg_offset); - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP_INT_TRIGGER) - printk(KERN_INFO "msm_irq_exit_sleep2: irq %d need " - "trigger, now %x %x\n", i, - readl(VIC_IRQ_STATUS0), readl(VIC_IRQ_STATUS1)); - } -} - -void msm_irq_exit_sleep3(void) -{ - if (!smsm_int_info) { - printk(KERN_ERR "msm_irq_exit_sleep \n"); - return; - } - if (msm_irq_debug_mask & IRQ_DEBUG_SLEEP) - printk(KERN_INFO "msm_irq_exit_sleep3 %x %x %x now %x %x " - "state %x\n", smsm_int_info->interrupt_mask, - smsm_int_info->pending_interrupts, - smsm_int_info->wakeup_reason, readl(VIC_IRQ_STATUS0), - readl(VIC_IRQ_STATUS1), - smsm_get_state(SMSM_STATE_MODEM)); -} - -static struct irq_chip msm_irq_chip = { - .name = "msm", - .disable = msm_irq_mask, - .ack = msm_irq_ack, - .mask = msm_irq_mask, - .unmask = msm_irq_unmask, - .set_wake = msm_irq_set_wake, - .set_type = msm_irq_set_type, -}; - -void __init msm_init_irq(void) -{ - unsigned n; - - /* select level interrupts */ - writel(0, VIC_INT_TYPE0); - writel(0, VIC_INT_TYPE1); - - /* select highlevel interrupts */ - writel(0, VIC_INT_POLARITY0); - writel(0, VIC_INT_POLARITY1); - - /* select IRQ for all INTs */ - writel(0, VIC_INT_SELECT0); - writel(0, VIC_INT_SELECT1); - - /* disable all INTs */ - writel(0, VIC_INT_EN0); - writel(0, VIC_INT_EN1); - - /* don't use 1136 vic */ - writel(0, VIC_CONFIG); - - /* enable interrupt controller */ - writel(3, VIC_INT_MASTEREN); - - for (n = 0; n < NR_MSM_IRQS; n++) { - irq_set_chip_and_handler(n, &msm_irq_chip, handle_level_irq); - set_irq_flags(n, IRQF_VALID); - } - - msm_init_sirc(); -} - -static int __init msm_init_irq_late(void) -{ - smsm_int_info = smem_alloc(INT_INFO_SMSM_ID, sizeof(*smsm_int_info)); - if (!smsm_int_info) - pr_err("set_wakeup_mask NO INT_INFO (%d)\n", INT_INFO_SMSM_ID); - return 0; -} -late_initcall(msm_init_irq_late); - -#if defined(CONFIG_MSM_FIQ_SUPPORT) -void msm_trigger_irq(int irq) -{ - void __iomem *reg = VIC_SOFTINT0 + ((irq & 32) ? 4 : 0); - uint32_t mask = 1UL << (irq & 31); - writel(mask, reg); -} - -void msm_fiq_enable(int irq) -{ - unsigned long flags; - local_irq_save(flags); - irq_desc[irq].chip->unmask(irq); - local_irq_restore(flags); -} - -void msm_fiq_disable(int irq) -{ - unsigned long flags; - local_irq_save(flags); - irq_desc[irq].chip->mask(irq); - local_irq_restore(flags); -} - -static void _msm_fiq_select(int irq) -{ - void __iomem *reg = VIC_INT_SELECT0 + ((irq & 32) ? 4 : 0); - unsigned index = (irq >> 5) & 1; - uint32_t mask = 1UL << (irq & 31); - unsigned long flags; - - local_irq_save(flags); - msm_irq_shadow_reg[index].int_select |= mask; - writel(msm_irq_shadow_reg[index].int_select, reg); - local_irq_restore(flags); -} - -static void _msm_fiq_unselect(int irq) -{ - void __iomem *reg = VIC_INT_SELECT0 + ((irq & 32) ? 4 : 0); - unsigned index = (irq >> 5) & 1; - uint32_t mask = 1UL << (irq & 31); - unsigned long flags; - - local_irq_save(flags); - msm_irq_shadow_reg[index].int_select &= (!mask); - writel(msm_irq_shadow_reg[index].int_select, reg); - local_irq_restore(flags); -} - -void msm_fiq_select(int irq) -{ - if (irq < FIRST_SIRC_IRQ) - _msm_fiq_select(irq); - else if (irq < FIRST_GPIO_IRQ) - sirc_fiq_select(irq, true); - else - pr_err("unsupported fiq %d", irq); -} - -void msm_fiq_unselect(int irq) -{ - if (irq < FIRST_SIRC_IRQ) - _msm_fiq_unselect(irq); - else if (irq < FIRST_GPIO_IRQ) - sirc_fiq_select(irq, false); - else - pr_err("unsupported fiq %d", irq); -} - -/* set_fiq_handler originally from arch/arm/kernel/fiq.c */ -static void set_fiq_handler(void *start, unsigned int length) -{ - memcpy((void *)0xffff001c, start, length); - flush_icache_range(0xffff001c, 0xffff001c + length); - if (!vectors_high()) - flush_icache_range(0x1c, 0x1c + length); -} - -extern unsigned char fiq_glue, fiq_glue_end; - -static void (*fiq_func)(void *data, void *regs, void *svc_sp); -static void *fiq_data; -static void *fiq_stack; - -void fiq_glue_setup(void *func, void *data, void *sp); - -int msm_fiq_set_handler(void (*func)(void *data, void *regs, void *svc_sp), - void *data) -{ - unsigned long flags; - int ret = -ENOMEM; - - if (!fiq_stack) - fiq_stack = kzalloc(THREAD_SIZE, GFP_KERNEL); - if (!fiq_stack) - return -ENOMEM; - - local_irq_save(flags); - if (fiq_func == 0) { - fiq_func = func; - fiq_data = data; - fiq_glue_setup(func, data, fiq_stack + THREAD_START_SP); - set_fiq_handler(&fiq_glue, (&fiq_glue_end - &fiq_glue)); - ret = 0; - } - local_irq_restore(flags); - return ret; -} - -void msm_fiq_exit_sleep(void) -{ - if (fiq_stack) - fiq_glue_setup(fiq_func, fiq_data, fiq_stack + THREAD_START_SP); -} -#endif diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c deleted file mode 100644 index 9c392a29fc7e..000000000000 --- a/arch/arm/mach-msm/last_radio_log.c +++ /dev/null @@ -1,71 +0,0 @@ -/* arch/arm/mach-msm/last_radio_log.c - * - * Extract the log from a modem crash though SMEM - * - * Copyright (C) 2007 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include "smd_private.h" - -static void *radio_log_base; -static size_t radio_log_size; - -extern void *smem_item(unsigned id, unsigned *size); - -static ssize_t last_radio_log_read(struct file *file, char __user *buf, - size_t len, loff_t *offset) -{ - return simple_read_from_buffer(buf, len, offset, - radio_log_base, radio_log_size); -} - -static struct file_operations last_radio_log_fops = { - .read = last_radio_log_read, - .llseek = default_llseek, -}; - -void msm_init_last_radio_log(struct module *owner) -{ - struct proc_dir_entry *entry; - - if (last_radio_log_fops.owner) { - pr_err("%s: already claimed\n", __func__); - return; - } - - radio_log_base = smem_item(SMEM_CLKREGIM_BSP, &radio_log_size); - if (!radio_log_base) { - pr_err("%s: could not retrieve SMEM_CLKREGIM_BSP\n", __func__); - return; - } - - entry = proc_create("last_radio_log", S_IRUGO, NULL, - &last_radio_log_fops); - if (!entry) { - pr_err("%s: could not create proc entry for radio log\n", - __func__); - return; - } - - pr_err("%s: last radio log is %d bytes long\n", __func__, - radio_log_size); - last_radio_log_fops.owner = owner; - proc_set_size(entry, radio_log_size); -} -EXPORT_SYMBOL(msm_init_last_radio_log); diff --git a/arch/arm/mach-msm/lpm_resources.c b/arch/arm/mach-msm/lpm_resources.c deleted file mode 100644 index c96db4b2bc61..000000000000 --- a/arch/arm/mach-msm/lpm_resources.c +++ /dev/null @@ -1,1009 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "spm.h" -#include "lpm_resources.h" -#include "rpm-notifier.h" -#include "idle.h" - - -/*Debug Definitions*/ -enum { - MSM_LPMRS_DEBUG_RPM = BIT(0), - MSM_LPMRS_DEBUG_PXO = BIT(1), - MSM_LPMRS_DEBUG_VDD_DIG = BIT(2), - MSM_LPMRS_DEBUG_VDD_MEM = BIT(3), - MSM_LPMRS_DEBUG_L2 = BIT(4), - MSM_LPMRS_DEBUG_LVLS = BIT(5), -}; - -static int msm_lpm_debug_mask; -module_param_named( - debug_mask, msm_lpm_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP -); - -static bool msm_lpm_get_rpm_notif = true; - -/*Macros*/ -#define MAX_RS_NAME (16) -#define MAX_RS_SIZE (4) -#define IS_RPM_CTL(rs) \ - (!strncmp(rs->name, "rpm_ctl", MAX_RS_NAME)) -#define MAX_STR_LEN 30 - -static bool msm_lpm_beyond_limits_vdd_dig(struct msm_rpmrs_limits *limits); -static void msm_lpm_aggregate_vdd_dig(struct msm_rpmrs_limits *limits); -static void msm_lpm_flush_vdd_dig(int notify_rpm); -static void msm_lpm_notify_vdd_dig(struct msm_rpm_notifier_data - *rpm_notifier_cb); -static int msm_lpm_init_value_vdd_dig(struct device_node *node, - char *key, uint32_t *default_value); - -static bool msm_lpm_beyond_limits_vdd_mem(struct msm_rpmrs_limits *limits); -static void msm_lpm_aggregate_vdd_mem(struct msm_rpmrs_limits *limits); -static void msm_lpm_flush_vdd_mem(int notify_rpm); -static void msm_lpm_notify_vdd_mem(struct msm_rpm_notifier_data - *rpm_notifier_cb); -static int msm_lpm_init_value_vdd_mem(struct device_node *node, - char *key, uint32_t *default_value); - - -static bool msm_lpm_beyond_limits_pxo(struct msm_rpmrs_limits *limits); -static void msm_lpm_aggregate_pxo(struct msm_rpmrs_limits *limits); -static void msm_lpm_flush_pxo(int notify_rpm); -static void msm_lpm_notify_pxo(struct msm_rpm_notifier_data - *rpm_notifier_cb); -static int msm_lpm_init_value_pxo(struct device_node *node, - char *key, uint32_t *default_value); - - -static bool msm_lpm_beyond_limits_l2(struct msm_rpmrs_limits *limits); -static void msm_lpm_flush_l2(int notify_rpm); -static void msm_lpm_aggregate_l2(struct msm_rpmrs_limits *limits); -static int msm_lpm_init_value_l2(struct device_node *node, - char *key, uint32_t *default_value); - -static void msm_lpm_flush_rpm_ctl(int notify_rpm); - -static int msm_lpm_rpm_callback(struct notifier_block *rpm_nb, - unsigned long action, void *rpm_notif); - -static int msm_lpm_cpu_callback(struct notifier_block *cpu_nb, - unsigned long action, void *hcpu); - -static ssize_t msm_lpm_resource_attr_show( - struct kobject *kobj, struct kobj_attribute *attr, char *buf); -static ssize_t msm_lpm_resource_attr_store(struct kobject *kobj, - struct kobj_attribute *attr, const char *buf, size_t count); - - -#define RPMRS_ATTR(_name) \ - __ATTR(_name, S_IRUGO|S_IWUSR, \ - msm_lpm_resource_attr_show, msm_lpm_resource_attr_store) - -/*Data structures*/ -struct msm_lpm_rs_data { - uint32_t type; - uint32_t id; - uint32_t key; - uint32_t value; - uint32_t default_value; - struct msm_rpm_request *handle; -}; - -enum { - MSM_LPM_RPM_RS_TYPE = 0, - MSM_LPM_LOCAL_RS_TYPE = 1, -}; - -enum { - MSM_SCM_L2_ON = 0, - MSM_SCM_L2_OFF = 1, - MSM_SCM_L2_GDHS = 3, -}; - -struct msm_lpm_resource { - struct msm_lpm_rs_data rs_data; - uint32_t sleep_value; - char name[MAX_RS_NAME]; - - uint32_t enable_low_power; - bool valid; - - bool (*beyond_limits)(struct msm_rpmrs_limits *limits); - void (*aggregate)(struct msm_rpmrs_limits *limits); - void (*flush)(int notify_rpm); - void (*notify)(struct msm_rpm_notifier_data *rpm_notifier_cb); - struct kobj_attribute ko_attr; - int (*init_value)(struct device_node *node, - char *key, uint32_t *default_value); -}; - -struct lpm_lookup_table { - uint32_t modes; - const char *mode_name; -}; - -static struct msm_lpm_resource msm_lpm_l2 = { - .name = "l2", - .beyond_limits = msm_lpm_beyond_limits_l2, - .aggregate = msm_lpm_aggregate_l2, - .flush = msm_lpm_flush_l2, - .notify = NULL, - .valid = false, - .ko_attr = RPMRS_ATTR(l2), - .init_value = msm_lpm_init_value_l2, -}; - -static struct msm_lpm_resource msm_lpm_vdd_dig = { - .name = "vdd-dig", - .beyond_limits = msm_lpm_beyond_limits_vdd_dig, - .aggregate = msm_lpm_aggregate_vdd_dig, - .flush = msm_lpm_flush_vdd_dig, - .notify = msm_lpm_notify_vdd_dig, - .valid = false, - .ko_attr = RPMRS_ATTR(vdd_dig), - .init_value = msm_lpm_init_value_vdd_dig, -}; - -static struct msm_lpm_resource msm_lpm_vdd_mem = { - .name = "vdd-mem", - .beyond_limits = msm_lpm_beyond_limits_vdd_mem, - .aggregate = msm_lpm_aggregate_vdd_mem, - .flush = msm_lpm_flush_vdd_mem, - .notify = msm_lpm_notify_vdd_mem, - .valid = false, - .ko_attr = RPMRS_ATTR(vdd_mem), - .init_value = msm_lpm_init_value_vdd_mem, -}; - -static struct msm_lpm_resource msm_lpm_pxo = { - .name = "pxo", - .beyond_limits = msm_lpm_beyond_limits_pxo, - .aggregate = msm_lpm_aggregate_pxo, - .flush = msm_lpm_flush_pxo, - .notify = msm_lpm_notify_pxo, - .valid = false, - .ko_attr = RPMRS_ATTR(pxo), - .init_value = msm_lpm_init_value_pxo, -}; - -static struct msm_lpm_resource *msm_lpm_resources[] = { - &msm_lpm_vdd_dig, - &msm_lpm_vdd_mem, - &msm_lpm_pxo, - &msm_lpm_l2, -}; - -static struct msm_lpm_resource msm_lpm_rpm_ctl = { - .name = "rpm_ctl", - .beyond_limits = NULL, - .aggregate = NULL, - .flush = msm_lpm_flush_rpm_ctl, - .valid = true, - .ko_attr = RPMRS_ATTR(rpm_ctl), -}; - -static struct notifier_block msm_lpm_rpm_nblk = { - .notifier_call = msm_lpm_rpm_callback, -}; - -static struct notifier_block __refdata msm_lpm_cpu_nblk = { - .notifier_call = msm_lpm_cpu_callback, -}; - -static DEFINE_SPINLOCK(msm_lpm_sysfs_lock); - -/* Attribute Definitions */ -static struct attribute *msm_lpm_attributes[] = { - &msm_lpm_vdd_dig.ko_attr.attr, - &msm_lpm_vdd_mem.ko_attr.attr, - &msm_lpm_pxo.ko_attr.attr, - &msm_lpm_l2.ko_attr.attr, - NULL, -}; - -static struct attribute_group msm_lpm_attribute_group = { - .attrs = msm_lpm_attributes, -}; - -static struct attribute *msm_lpm_rpm_ctl_attribute[] = { - &msm_lpm_rpm_ctl.ko_attr.attr, - NULL, -}; - -static struct attribute_group msm_lpm_rpm_ctl_attr_group = { - .attrs = msm_lpm_rpm_ctl_attribute, -}; - -#define GET_RS_FROM_ATTR(attr) \ - (container_of(attr, struct msm_lpm_resource, ko_attr)) - -/* RPM */ -static struct msm_rpm_request *msm_lpm_create_rpm_request - (uint32_t rsc_type, uint32_t rsc_id) -{ - struct msm_rpm_request *handle = NULL; - - handle = msm_rpm_create_request(MSM_RPM_CTX_SLEEP_SET, - rsc_type, - rsc_id, 1); - return handle; -} - -static int msm_lpm_send_sleep_data(struct msm_rpm_request *handle, - uint32_t key, uint8_t *value) -{ - int ret = 0; - int msg_id; - - if (!handle) - return ret; - - ret = msm_rpm_add_kvp_data_noirq(handle, key, value, MAX_RS_SIZE); - - if (ret < 0) { - pr_err("%s: Error adding kvp data key %u, size %d\n", - __func__, key, MAX_RS_SIZE); - return ret; - } - - msg_id = msm_rpm_send_request_noirq(handle); - if (!msg_id) { - pr_err("%s: Error sending RPM request key %u, handle 0x%x\n", - __func__, key, (unsigned int)handle); - ret = -EIO; - return ret; - } - - ret = msm_rpm_wait_for_ack_noirq(msg_id); - if (ret < 0) { - pr_err("%s: Couldn't get ACK from RPM for Msg %d Error %d", - __func__, msg_id, ret); - return ret; - } - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_RPM) - pr_info("Rs key %u, value %u, size %d\n", key, - *(unsigned int *)value, MAX_RS_SIZE); - return ret; -} - -/* RPM Notifier */ -static int msm_lpm_rpm_callback(struct notifier_block *rpm_nb, - unsigned long action, - void *rpm_notif) -{ - int i; - struct msm_lpm_resource *rs = NULL; - struct msm_rpm_notifier_data *rpm_notifier_cb = - (struct msm_rpm_notifier_data *)rpm_notif; - - if (!msm_lpm_get_rpm_notif) - return NOTIFY_DONE; - - if (!(rpm_nb && rpm_notif)) - return NOTIFY_BAD; - - for (i = 0; i < ARRAY_SIZE(msm_lpm_resources); i++) { - rs = msm_lpm_resources[i]; - if (rs && rs->valid && rs->notify) - rs->notify(rpm_notifier_cb); - } - - return NOTIFY_OK; -} - -/* SYSFS */ -static ssize_t msm_lpm_resource_attr_show( - struct kobject *kobj, struct kobj_attribute *attr, char *buf) -{ - struct kernel_param kp; - unsigned long flags; - unsigned int temp; - int rc; - - spin_lock_irqsave(&msm_lpm_sysfs_lock, flags); - temp = GET_RS_FROM_ATTR(attr)->enable_low_power; - spin_unlock_irqrestore(&msm_lpm_sysfs_lock, flags); - - kp.arg = &temp; - rc = param_get_uint(buf, &kp); - - if (rc > 0) { - strlcat(buf, "\n", PAGE_SIZE); - rc++; - } - - return rc; -} - -static ssize_t msm_lpm_resource_attr_store(struct kobject *kobj, - struct kobj_attribute *attr, const char *buf, size_t count) -{ - struct kernel_param kp; - unsigned long flags; - unsigned int temp; - int rc; - - kp.arg = &temp; - rc = param_set_uint(buf, &kp); - if (rc) - return rc; - - spin_lock_irqsave(&msm_lpm_sysfs_lock, flags); - GET_RS_FROM_ATTR(attr)->enable_low_power = temp; - - if (IS_RPM_CTL(GET_RS_FROM_ATTR(attr))) { - struct msm_lpm_resource *rs = GET_RS_FROM_ATTR(attr); - rs->flush(false); - } - - spin_unlock_irqrestore(&msm_lpm_sysfs_lock, flags); - - return count; -} - -/* lpm resource handling functions */ -/* Common */ -static void msm_lpm_notify_common(struct msm_rpm_notifier_data *cb, - struct msm_lpm_resource *rs) -{ - if ((cb->rsc_type == rs->rs_data.type) && - (cb->rsc_id == rs->rs_data.id) && - (cb->key == rs->rs_data.key)) { - - BUG_ON(cb->size > MAX_RS_SIZE); - - if (rs->valid) { - if (cb->value) { - memcpy(&rs->rs_data.value, cb->value, cb->size); - msm_rpm_add_kvp_data_noirq(rs->rs_data.handle, - cb->key, cb->value, cb->size); - } - else - rs->rs_data.value = rs->rs_data.default_value; - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_RPM) - pr_info("Notification received Rs %s value %u\n", - rs->name, rs->rs_data.value); - } - } -} - -/* L2 */ -static bool msm_lpm_beyond_limits_l2(struct msm_rpmrs_limits *limits) -{ - uint32_t l2; - bool ret = false; - struct msm_lpm_resource *rs = &msm_lpm_l2; - - if (rs->valid) { - uint32_t l2_buf = rs->rs_data.value; - - if (rs->enable_low_power == 1) - l2 = MSM_LPM_L2_CACHE_GDHS; - else if (rs->enable_low_power == 2) - l2 = MSM_LPM_L2_CACHE_HSFS_OPEN; - else - l2 = MSM_LPM_L2_CACHE_ACTIVE ; - - if (l2_buf > l2) - l2 = l2_buf; - ret = (l2 > limits->l2_cache); - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_L2) - pr_info("%s: l2 buf %u, l2 %u, limits %u\n", - __func__, l2_buf, l2, limits->l2_cache); - } - return ret; -} - -static void msm_lpm_aggregate_l2(struct msm_rpmrs_limits *limits) -{ - struct msm_lpm_resource *rs = &msm_lpm_l2; - - if (rs->valid) - rs->sleep_value = limits->l2_cache; - trace_lpm_resources(rs->sleep_value, rs->name); -} - -static void msm_lpm_set_l2_mode(int sleep_mode) -{ - int lpm, rc; - - msm_pm_set_l2_flush_flag(MSM_SCM_L2_ON); - - switch (sleep_mode) { - case MSM_LPM_L2_CACHE_HSFS_OPEN: - lpm = MSM_SPM_L2_MODE_POWER_COLLAPSE; - msm_pm_set_l2_flush_flag(MSM_SCM_L2_OFF); - break; - case MSM_LPM_L2_CACHE_GDHS: - lpm = MSM_SPM_L2_MODE_GDHS; - msm_pm_set_l2_flush_flag(MSM_SCM_L2_GDHS); - break; - case MSM_LPM_L2_CACHE_RETENTION: - lpm = MSM_SPM_L2_MODE_RETENTION; - break; - default: - case MSM_LPM_L2_CACHE_ACTIVE: - lpm = MSM_SPM_L2_MODE_DISABLED; - break; - } - - rc = msm_spm_l2_set_low_power_mode(lpm, true); - - if (rc < 0) - pr_err("%s: Failed to set L2 low power mode %d", - __func__, lpm); - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_L2) - pr_info("%s: Requesting low power mode %d\n", - __func__, lpm); -} - -static int msm_lpm_init_value_l2(struct device_node *node, - char *key, uint32_t *default_value) -{ - return msm_lpm_get_l2_cache_value(node, key, default_value); -} - -static void msm_lpm_flush_l2(int notify_rpm) -{ - struct msm_lpm_resource *rs = &msm_lpm_l2; - - msm_lpm_set_l2_mode(rs->sleep_value); -} - -int msm_lpm_get_l2_cache_value(struct device_node *node, - char *key, uint32_t *l2_val) -{ - int i; - struct lpm_lookup_table l2_mode_lookup[] = { - {MSM_LPM_L2_CACHE_HSFS_OPEN, "l2_cache_pc"}, - {MSM_LPM_L2_CACHE_GDHS, "l2_cache_gdhs"}, - {MSM_LPM_L2_CACHE_RETENTION, "l2_cache_retention"}, - {MSM_LPM_L2_CACHE_ACTIVE, "l2_cache_active"} - }; - const char *l2_str; - int ret; - - ret = of_property_read_string(node, key, &l2_str); - if (!ret) { - ret = -EINVAL; - for (i = 0; i < ARRAY_SIZE(l2_mode_lookup); i++) { - if (!strncmp(l2_str, l2_mode_lookup[i].mode_name, - MAX_STR_LEN)) { - *l2_val = l2_mode_lookup[i].modes; - ret = 0; - break; - } - } - } - return ret; -} - -/* RPM CTL */ -static void msm_lpm_flush_rpm_ctl(int notify_rpm) -{ - struct msm_lpm_resource *rs = &msm_lpm_rpm_ctl; - msm_lpm_send_sleep_data(rs->rs_data.handle, - rs->rs_data.key, - (uint8_t *)&rs->sleep_value); -} - -/*VDD Dig*/ -static bool msm_lpm_beyond_limits_vdd_dig(struct msm_rpmrs_limits *limits) -{ - bool ret = true; - struct msm_lpm_resource *rs = &msm_lpm_vdd_dig; - - if (rs->valid) { - uint32_t vdd_buf = rs->rs_data.value; - uint32_t vdd_dig = rs->enable_low_power ? rs->enable_low_power : - rs->rs_data.default_value; - - if (vdd_buf > vdd_dig) - vdd_dig = vdd_buf; - - ret = (vdd_dig > limits->vdd_dig_upper_bound); - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_VDD_DIG) - pr_info("%s:buf %d vdd dig %d limits%d\n", - __func__, vdd_buf, vdd_dig, - limits->vdd_dig_upper_bound); - } - return ret; -} - -static int msm_lpm_init_value_vdd_dig(struct device_node *node, - char *key, uint32_t *default_value) -{ - return of_property_read_u32(node, key, default_value); -} - -static void msm_lpm_aggregate_vdd_dig(struct msm_rpmrs_limits *limits) -{ - struct msm_lpm_resource *rs = &msm_lpm_vdd_dig; - - if (rs->valid) { - uint32_t vdd_buf = rs->rs_data.value; - if (limits->vdd_dig_lower_bound > vdd_buf) - rs->sleep_value = limits->vdd_dig_lower_bound; - else - rs->sleep_value = vdd_buf; - } - trace_lpm_resources(rs->sleep_value, rs->name); -} - -static void msm_lpm_flush_vdd_dig(int notify_rpm) -{ - if (notify_rpm) { - struct msm_lpm_resource *rs = &msm_lpm_vdd_dig; - msm_lpm_send_sleep_data(rs->rs_data.handle, - rs->rs_data.key, - (uint8_t *)&rs->sleep_value); - } -} - -static void msm_lpm_notify_vdd_dig(struct msm_rpm_notifier_data - *rpm_notifier_cb) -{ - struct msm_lpm_resource *rs = &msm_lpm_vdd_dig; - msm_lpm_notify_common(rpm_notifier_cb, rs); -} - -/*VDD Mem*/ -static bool msm_lpm_beyond_limits_vdd_mem(struct msm_rpmrs_limits *limits) -{ - bool ret = true; - struct msm_lpm_resource *rs = &msm_lpm_vdd_mem; - - if (rs->valid) { - uint32_t vdd_buf = rs->rs_data.value; - uint32_t vdd_mem = rs->enable_low_power ? rs->enable_low_power : - rs->rs_data.default_value; - - if (vdd_buf > vdd_mem) - vdd_mem = vdd_buf; - - ret = (vdd_mem > limits->vdd_mem_upper_bound); - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_VDD_MEM) - pr_info("%s:buf %d vdd mem %d limits%d\n", - __func__, vdd_buf, vdd_mem, - limits->vdd_mem_upper_bound); - } - return ret; -} - -static void msm_lpm_aggregate_vdd_mem(struct msm_rpmrs_limits *limits) -{ - struct msm_lpm_resource *rs = &msm_lpm_vdd_mem; - - if (rs->valid) { - uint32_t vdd_buf = rs->rs_data.value; - if (limits->vdd_mem_lower_bound > vdd_buf) - rs->sleep_value = limits->vdd_mem_lower_bound; - else - rs->sleep_value = vdd_buf; - } - trace_lpm_resources(rs->sleep_value, rs->name); -} - -static void msm_lpm_flush_vdd_mem(int notify_rpm) -{ - if (notify_rpm) { - struct msm_lpm_resource *rs = &msm_lpm_vdd_mem; - msm_lpm_send_sleep_data(rs->rs_data.handle, - rs->rs_data.key, - (uint8_t *)&rs->sleep_value); - } -} - -static void msm_lpm_notify_vdd_mem(struct msm_rpm_notifier_data - *rpm_notifier_cb) -{ - struct msm_lpm_resource *rs = &msm_lpm_vdd_mem; - msm_lpm_notify_common(rpm_notifier_cb, rs); -} - -static int msm_lpm_init_value_vdd_mem(struct device_node *node, - char *key, uint32_t *default_value) -{ - return of_property_read_u32(node, key, default_value); -} - -/*PXO*/ -static bool msm_lpm_beyond_limits_pxo(struct msm_rpmrs_limits *limits) -{ - bool ret = true; - struct msm_lpm_resource *rs = &msm_lpm_pxo; - - if (rs->valid) { - uint32_t pxo_buf = rs->rs_data.value; - uint32_t pxo = rs->enable_low_power ? MSM_LPM_PXO_OFF : - rs->rs_data.default_value; - - if (pxo_buf > pxo) - pxo = pxo_buf; - - ret = (pxo > limits->pxo); - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_PXO) - pr_info("%s:pxo buf %d pxo %d limits pxo %d\n", - __func__, pxo_buf, pxo, limits->pxo); - } - return ret; -} - -static void msm_lpm_aggregate_pxo(struct msm_rpmrs_limits *limits) -{ - struct msm_lpm_resource *rs = &msm_lpm_pxo; - - if (rs->valid) { - uint32_t pxo_buf = rs->rs_data.value; - if (limits->pxo > pxo_buf) - rs->sleep_value = limits->pxo; - else - rs->sleep_value = pxo_buf; - - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_PXO) - pr_info("%s: pxo buf %d sleep value %d\n", - __func__, pxo_buf, rs->sleep_value); - } - trace_lpm_resources(rs->sleep_value, rs->name); -} - -static void msm_lpm_flush_pxo(int notify_rpm) -{ - if (notify_rpm) { - struct msm_lpm_resource *rs = &msm_lpm_pxo; - msm_lpm_send_sleep_data(rs->rs_data.handle, - rs->rs_data.key, - (uint8_t *)&rs->sleep_value); - } -} - -static void msm_lpm_notify_pxo(struct msm_rpm_notifier_data - *rpm_notifier_cb) -{ - struct msm_lpm_resource *rs = &msm_lpm_pxo; - msm_lpm_notify_common(rpm_notifier_cb, rs); -} - -static int msm_lpm_init_value_pxo(struct device_node *node, - char *key, uint32_t *default_value) -{ - return msm_lpm_get_xo_value(node, key, default_value); -} - -static inline bool msm_lpm_use_mpm(struct msm_rpmrs_limits *limits) -{ - return (limits->pxo == MSM_LPM_PXO_OFF); -} - -int msm_lpm_get_xo_value(struct device_node *node, - char *key, uint32_t *xo_val) -{ - int i; - struct lpm_lookup_table pxo_mode_lookup[] = { - {MSM_LPM_PXO_OFF, "xo_off"}, - {MSM_LPM_PXO_ON, "xo_on"} - }; - const char *xo_str; - int ret; - - ret = of_property_read_string(node, key, &xo_str); - if (!ret) { - ret = -EINVAL; - for (i = 0; i < ARRAY_SIZE(pxo_mode_lookup); i++) { - if (!strncmp(xo_str, pxo_mode_lookup[i].mode_name, - MAX_STR_LEN)) { - *xo_val = pxo_mode_lookup[i].modes; - ret = 0; - break; - } - } - } - return ret; -} - -/* LPM levels interface */ -bool msm_lpm_level_beyond_limit(struct msm_rpmrs_limits *limits) -{ - int i; - struct msm_lpm_resource *rs; - bool beyond_limit = false; - - for (i = 0; i < ARRAY_SIZE(msm_lpm_resources); i++) { - rs = msm_lpm_resources[i]; - if (rs->beyond_limits && rs->beyond_limits(limits)) { - beyond_limit = true; - if (msm_lpm_debug_mask & MSM_LPMRS_DEBUG_LVLS) - pr_info("%s: %s beyond limit", __func__, - rs->name); - break; - } - } - - return beyond_limit; -} - -int msm_lpmrs_enter_sleep(uint32_t sclk_count, struct msm_rpmrs_limits *limits, - bool from_idle, bool notify_rpm) -{ - int ret = 0; - int i; - struct msm_lpm_resource *rs = NULL; - - for (i = 0; i < ARRAY_SIZE(msm_lpm_resources); i++) { - rs = msm_lpm_resources[i]; - if (rs->aggregate) - rs->aggregate(limits); - } - - msm_lpm_get_rpm_notif = false; - for (i = 0; i < ARRAY_SIZE(msm_lpm_resources); i++) { - rs = msm_lpm_resources[i]; - if (rs->valid && rs->flush) - rs->flush(notify_rpm); - } - msm_lpm_get_rpm_notif = true; - - if (notify_rpm) - msm_mpm_enter_sleep(sclk_count, from_idle); - - return ret; -} - -void msm_lpmrs_exit_sleep(struct msm_rpmrs_limits *limits, - bool from_idle, bool notify_rpm, bool collapsed) -{ - if (msm_lpm_use_mpm(limits)) - msm_mpm_exit_sleep(from_idle); - - if (msm_lpm_l2.valid) - msm_lpm_set_l2_mode(msm_lpm_l2.rs_data.default_value); -} - -static int msm_lpm_cpu_callback(struct notifier_block *cpu_nb, - unsigned long action, void *hcpu) -{ - struct msm_lpm_resource *rs = &msm_lpm_l2; - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - rs->rs_data.value = rs->rs_data.default_value; - break; - case CPU_ONLINE_FROZEN: - case CPU_ONLINE: - if (num_online_cpus() > 1) - rs->rs_data.value = rs->rs_data.default_value; - break; - case CPU_DEAD_FROZEN: - case CPU_DEAD: - if (num_online_cpus() == 1) - rs->rs_data.value = MSM_LPM_L2_CACHE_HSFS_OPEN; - break; - } - return NOTIFY_OK; -} - -/* RPM CTL */ -static int msm_lpm_init_rpm_ctl(void) -{ - struct msm_lpm_resource *rs = &msm_lpm_rpm_ctl; - - rs->rs_data.handle = msm_rpm_create_request( - MSM_RPM_CTX_ACTIVE_SET, - rs->rs_data.type, - rs->rs_data.id, 1); - if (!rs->rs_data.handle) - return -EIO; - - rs->valid = true; - return 0; -} - -static int msm_lpm_resource_sysfs_add(void) -{ - struct kobject *module_kobj = NULL; - struct kobject *low_power_kobj = NULL; - struct kobject *mode_kobj = NULL; - int rc = 0; - - module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME); - if (!module_kobj) { - pr_err("%s: cannot find kobject for module %s\n", - __func__, KBUILD_MODNAME); - rc = -ENOENT; - goto resource_sysfs_add_exit; - } - - low_power_kobj = kobject_create_and_add( - "enable_low_power", module_kobj); - if (!low_power_kobj) { - pr_err("%s: cannot create kobject\n", __func__); - rc = -ENOMEM; - goto resource_sysfs_add_exit; - } - - mode_kobj = kobject_create_and_add( - "mode", module_kobj); - if (!mode_kobj) { - pr_err("%s: cannot create kobject\n", __func__); - rc = -ENOMEM; - goto resource_sysfs_add_exit; - } - - rc = sysfs_create_group(low_power_kobj, &msm_lpm_attribute_group); - if (rc) { - pr_err("%s: cannot create kobject attribute group\n", __func__); - goto resource_sysfs_add_exit; - } - - rc = sysfs_create_group(mode_kobj, &msm_lpm_rpm_ctl_attr_group); - if (rc) { - pr_err("%s: cannot create kobject attribute group\n", __func__); - goto resource_sysfs_add_exit; - } - -resource_sysfs_add_exit: - if (rc) { - if (low_power_kobj) - sysfs_remove_group(low_power_kobj, - &msm_lpm_attribute_group); - kobject_del(low_power_kobj); - kobject_del(mode_kobj); - } - - return rc; -} - -late_initcall(msm_lpm_resource_sysfs_add); - -static int msm_lpmrs_probe(struct platform_device *pdev) -{ - struct device_node *node = NULL; - char *key = NULL; - int ret = 0; - - for_each_child_of_node(pdev->dev.of_node, node) { - struct msm_lpm_resource *rs = NULL; - const char *val; - int i; - bool local_resource; - - key = "qcom,name"; - ret = of_property_read_string(node, key, &val); - if (ret) { - pr_err("Cannot read string\n"); - goto fail; - } - - for (i = 0; i < ARRAY_SIZE(msm_lpm_resources); i++) { - char *lpmrs_name = msm_lpm_resources[i]->name; - if (!msm_lpm_resources[i]->valid && - !strncmp(val, lpmrs_name, strnlen(lpmrs_name, - MAX_RS_NAME))) { - rs = msm_lpm_resources[i]; - break; - } - } - - if (!rs) { - pr_err("LPM resource not found\n"); - continue; - } - - key = "qcom,init-value"; - ret = rs->init_value(node, key, &rs->rs_data.default_value); - if (ret) { - pr_err("%s():Failed to read %s\n", __func__, key); - goto fail; - } - - rs->rs_data.value = rs->rs_data.default_value; - - key = "qcom,local-resource-type"; - local_resource = of_property_read_bool(node, key); - - if (!local_resource) { - key = "qcom,type"; - ret = of_property_read_u32(node, key, - &rs->rs_data.type); - if (ret) { - pr_err("Failed to read type\n"); - goto fail; - } - - key = "qcom,id"; - ret = of_property_read_u32(node, key, &rs->rs_data.id); - if (ret) { - pr_err("Failed to read id\n"); - goto fail; - } - - key = "qcom,key"; - ret = of_property_read_u32(node, key, &rs->rs_data.key); - if (ret) { - pr_err("Failed to read key\n"); - goto fail; - } - - rs->rs_data.handle = msm_lpm_create_rpm_request( - rs->rs_data.type, - rs->rs_data.id); - - if (!rs->rs_data.handle) { - pr_err("%s: Failed to allocate handle for %s\n", - __func__, rs->name); - ret = -1; - goto fail; - } - /* fall through */ - } - - rs->valid = true; - } - msm_rpm_register_notifier(&msm_lpm_rpm_nblk); - msm_lpm_init_rpm_ctl(); - - if (msm_lpm_l2.valid) { - register_hotcpu_notifier(&msm_lpm_cpu_nblk); - /* For UP mode, set the default to HSFS OPEN*/ - if (num_possible_cpus() == 1) { - msm_lpm_l2.rs_data.default_value = - MSM_LPM_L2_CACHE_HSFS_OPEN; - msm_lpm_l2.rs_data.value = MSM_LPM_L2_CACHE_HSFS_OPEN; - } - msm_pm_set_l2_flush_flag(0); - } else - msm_pm_set_l2_flush_flag(1); - -fail: - return ret; -} - -static struct of_device_id msm_lpmrs_match_table[] = { - {.compatible = "qcom,lpm-resources"}, - {}, -}; - -static struct platform_driver msm_lpmrs_driver = { - .probe = msm_lpmrs_probe, - .driver = { - .name = "lpm-resources", - .owner = THIS_MODULE, - .of_match_table = msm_lpmrs_match_table, - }, -}; - -int __init msm_lpmrs_module_init(void) -{ - return platform_driver_register(&msm_lpmrs_driver); -} diff --git a/arch/arm/mach-msm/mdm.c b/arch/arm/mach-msm/mdm.c deleted file mode 100644 index b707f3d009d1..000000000000 --- a/arch/arm/mach-msm/mdm.c +++ /dev/null @@ -1,489 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_watchdog.h" -#include "devices.h" - -#define CHARM_MODEM_TIMEOUT 6000 -#define CHARM_HOLD_TIME 4000 -#define CHARM_MODEM_DELTA 100 - -static void (*power_on_charm)(void); -static void (*power_down_charm)(void); - -static int charm_debug_on; -static int charm_status_irq; -static int charm_errfatal_irq; -static int charm_ready; -static enum charm_boot_type boot_type = CHARM_NORMAL_BOOT; -static int charm_boot_status; -static int charm_ram_dump_status; -static struct workqueue_struct *charm_queue; - -#define CHARM_DBG(...) do { if (charm_debug_on) \ - pr_info(__VA_ARGS__); \ - } while (0); - - -DECLARE_COMPLETION(charm_needs_reload); -DECLARE_COMPLETION(charm_boot); -DECLARE_COMPLETION(charm_ram_dumps); - -static void charm_disable_irqs(void) -{ - disable_irq_nosync(charm_errfatal_irq); - disable_irq_nosync(charm_status_irq); - -} - -static int charm_subsys_shutdown(const struct subsys_desc *crashed_subsys, - bool force_stop) -{ - charm_ready = 0; - power_down_charm(); - return 0; -} - -static int charm_subsys_powerup(const struct subsys_desc *crashed_subsys) -{ - power_on_charm(); - boot_type = CHARM_NORMAL_BOOT; - complete(&charm_needs_reload); - wait_for_completion(&charm_boot); - pr_info("%s: charm modem has been restarted\n", __func__); - INIT_COMPLETION(charm_boot); - return charm_boot_status; -} - -static int charm_subsys_ramdumps(int want_dumps, - const struct subsys_desc *crashed_subsys) -{ - charm_ram_dump_status = 0; - if (want_dumps) { - boot_type = CHARM_RAM_DUMPS; - complete(&charm_needs_reload); - wait_for_completion(&charm_ram_dumps); - INIT_COMPLETION(charm_ram_dumps); - power_down_charm(); - } - return charm_ram_dump_status; -} - -static struct subsys_device *charm_subsys; - -static struct subsys_desc charm_subsystem = { - .shutdown = charm_subsys_shutdown, - .ramdump = charm_subsys_ramdumps, - .powerup = charm_subsys_powerup, - .name = "external_modem", -}; - -static int charm_panic_prep(struct notifier_block *this, - unsigned long event, void *ptr) -{ - int i; - - CHARM_DBG("%s: setting AP2MDM_ERRFATAL high for a non graceful reset\n", - __func__); - if (subsys_get_restart_level(charm_subsys) == RESET_SOC) - pm8xxx_stay_on(); - - charm_disable_irqs(); - gpio_set_value(AP2MDM_ERRFATAL, 1); - gpio_set_value(AP2MDM_WAKEUP, 1); - for (i = CHARM_MODEM_TIMEOUT; i > 0; i -= CHARM_MODEM_DELTA) { - pet_watchdog(); - mdelay(CHARM_MODEM_DELTA); - if (gpio_get_value(MDM2AP_STATUS) == 0) - break; - } - if (i <= 0) - pr_err("%s: MDM2AP_STATUS never went low\n", __func__); - return NOTIFY_DONE; -} - -static struct notifier_block charm_panic_blk = { - .notifier_call = charm_panic_prep, -}; - -static int first_boot = 1; - -static long charm_modem_ioctl(struct file *filp, unsigned int cmd, - unsigned long arg) -{ - - int status, ret = 0; - - if (_IOC_TYPE(cmd) != CHARM_CODE) { - pr_err("%s: invalid ioctl code\n", __func__); - return -EINVAL; - } - - CHARM_DBG("%s: Entering ioctl cmd = %d\n", __func__, _IOC_NR(cmd)); - switch (cmd) { - case WAKE_CHARM: - CHARM_DBG("%s: Powering on\n", __func__); - power_on_charm(); - break; - case CHECK_FOR_BOOT: - if (gpio_get_value(MDM2AP_STATUS) == 0) - put_user(1, (unsigned long __user *) arg); - else - put_user(0, (unsigned long __user *) arg); - break; - case NORMAL_BOOT_DONE: - CHARM_DBG("%s: check if charm is booted up\n", __func__); - get_user(status, (unsigned long __user *) arg); - if (status) - charm_boot_status = -EIO; - else - charm_boot_status = 0; - charm_ready = 1; - - gpio_set_value(AP2MDM_KPDPWR_N, 0); - if (!first_boot) - complete(&charm_boot); - else - first_boot = 0; - break; - case RAM_DUMP_DONE: - CHARM_DBG("%s: charm done collecting RAM dumps\n", __func__); - get_user(status, (unsigned long __user *) arg); - if (status) - charm_ram_dump_status = -EIO; - else - charm_ram_dump_status = 0; - complete(&charm_ram_dumps); - break; - case WAIT_FOR_RESTART: - CHARM_DBG("%s: wait for charm to need images reloaded\n", - __func__); - ret = wait_for_completion_interruptible(&charm_needs_reload); - if (!ret) - put_user(boot_type, (unsigned long __user *) arg); - INIT_COMPLETION(charm_needs_reload); - break; - default: - pr_err("%s: invalid ioctl cmd = %d\n", __func__, _IOC_NR(cmd)); - ret = -EINVAL; - break; - } - - return ret; -} - -static int charm_modem_open(struct inode *inode, struct file *file) -{ - return 0; -} - -static const struct file_operations charm_modem_fops = { - .owner = THIS_MODULE, - .open = charm_modem_open, - .unlocked_ioctl = charm_modem_ioctl, -}; - - -struct miscdevice charm_modem_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "mdm", - .fops = &charm_modem_fops -}; - - - -static void charm_status_fn(struct work_struct *work) -{ - pr_info("Reseting the charm because status changed\n"); - subsystem_restart_dev(charm_subsys); -} - -static DECLARE_WORK(charm_status_work, charm_status_fn); - -static void charm_fatal_fn(struct work_struct *work) -{ - pr_info("Reseting the charm due to an errfatal\n"); - if (subsys_get_restart_level(charm_subsys) == RESET_SOC) - pm8xxx_stay_on(); - subsystem_restart_dev(charm_subsys); -} - -static DECLARE_WORK(charm_fatal_work, charm_fatal_fn); - -static irqreturn_t charm_errfatal(int irq, void *dev_id) -{ - CHARM_DBG("%s: charm got errfatal interrupt\n", __func__); - if (charm_ready && (gpio_get_value(MDM2AP_STATUS) == 1)) { - CHARM_DBG("%s: scheduling work now\n", __func__); - queue_work(charm_queue, &charm_fatal_work); - } - return IRQ_HANDLED; -} - -static irqreturn_t charm_status_change(int irq, void *dev_id) -{ - CHARM_DBG("%s: charm sent status change interrupt\n", __func__); - if ((gpio_get_value(MDM2AP_STATUS) == 0) && charm_ready) { - CHARM_DBG("%s: scheduling work now\n", __func__); - queue_work(charm_queue, &charm_status_work); - } else if (gpio_get_value(MDM2AP_STATUS) == 1) { - CHARM_DBG("%s: charm is now ready\n", __func__); - } - return IRQ_HANDLED; -} - -static int charm_debug_on_set(void *data, u64 val) -{ - charm_debug_on = val; - return 0; -} - -static int charm_debug_on_get(void *data, u64 *val) -{ - *val = charm_debug_on; - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(charm_debug_on_fops, - charm_debug_on_get, - charm_debug_on_set, "%llu\n"); - -static int charm_debugfs_init(void) -{ - struct dentry *dent; - - dent = debugfs_create_dir("charm_dbg", 0); - if (IS_ERR(dent)) - return PTR_ERR(dent); - - debugfs_create_file("debug_on", 0644, dent, NULL, - &charm_debug_on_fops); - return 0; -} - -static int gsbi9_uart_notifier_cb(struct notifier_block *this, - unsigned long code, void *_cmd) -{ - switch (code) { - case SUBSYS_AFTER_SHUTDOWN: - platform_device_unregister(msm_device_uart_gsbi9); - msm_device_uart_gsbi9 = msm_add_gsbi9_uart(); - if (IS_ERR(msm_device_uart_gsbi9)) - pr_err("%s(): Failed to create uart gsbi9 device\n", - __func__); - default: - break; - } - return NOTIFY_DONE; -} - -static struct notifier_block gsbi9_nb = { - .notifier_call = gsbi9_uart_notifier_cb, -}; - -static int __init charm_modem_probe(struct platform_device *pdev) -{ - int ret, irq; - struct charm_platform_data *d = pdev->dev.platform_data; - - gpio_request(AP2MDM_STATUS, "AP2MDM_STATUS"); - gpio_request(AP2MDM_ERRFATAL, "AP2MDM_ERRFATAL"); - gpio_request(AP2MDM_KPDPWR_N, "AP2MDM_KPDPWR_N"); - gpio_request(AP2MDM_PMIC_RESET_N, "AP2MDM_PMIC_RESET_N"); - gpio_request(MDM2AP_STATUS, "MDM2AP_STATUS"); - gpio_request(MDM2AP_ERRFATAL, "MDM2AP_ERRFATAL"); - gpio_request(AP2MDM_WAKEUP, "AP2MDM_WAKEUP"); - - gpio_direction_output(AP2MDM_STATUS, 1); - gpio_direction_output(AP2MDM_ERRFATAL, 0); - gpio_direction_output(AP2MDM_WAKEUP, 0); - gpio_direction_input(MDM2AP_STATUS); - gpio_direction_input(MDM2AP_ERRFATAL); - - power_on_charm = d->charm_modem_on; - power_down_charm = d->charm_modem_off; - - charm_queue = create_singlethread_workqueue("charm_queue"); - if (!charm_queue) { - pr_err("%s: could not create workqueue. All charm \ - functionality will be disabled\n", - __func__); - ret = -ENOMEM; - goto fatal_err; - } - - atomic_notifier_chain_register(&panic_notifier_list, &charm_panic_blk); - charm_debugfs_init(); - - charm_subsys = subsys_register(&charm_subsystem); - if (IS_ERR(charm_subsys)) { - ret = PTR_ERR(charm_subsys); - goto fatal_err; - } - subsys_default_online(charm_subsys); - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - pr_err("%s: could not get MDM2AP_ERRFATAL IRQ resource. \ - error=%d No IRQ will be generated on errfatal.", - __func__, irq); - goto errfatal_err; - } - - ret = request_irq(irq, charm_errfatal, - IRQF_TRIGGER_RISING , "charm errfatal", NULL); - - if (ret < 0) { - pr_err("%s: MDM2AP_ERRFATAL IRQ#%d request failed with error=%d\ - . No IRQ will be generated on errfatal.", - __func__, irq, ret); - goto errfatal_err; - } - charm_errfatal_irq = irq; - -errfatal_err: - - irq = platform_get_irq(pdev, 1); - if (irq < 0) { - pr_err("%s: could not get MDM2AP_STATUS IRQ resource. \ - error=%d No IRQ will be generated on status change.", - __func__, irq); - goto status_err; - } - - ret = request_threaded_irq(irq, NULL, charm_status_change, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - "charm status", NULL); - - if (ret < 0) { - pr_err("%s: MDM2AP_STATUS IRQ#%d request failed with error=%d\ - . No IRQ will be generated on status change.", - __func__, irq, ret); - goto status_err; - } - charm_status_irq = irq; - -status_err: - subsys_notif_register_notifier("external_modem", &gsbi9_nb); - - pr_info("%s: Registering charm modem\n", __func__); - - return misc_register(&charm_modem_misc); - -fatal_err: - gpio_free(AP2MDM_STATUS); - gpio_free(AP2MDM_ERRFATAL); - gpio_free(AP2MDM_KPDPWR_N); - gpio_free(AP2MDM_PMIC_RESET_N); - gpio_free(MDM2AP_STATUS); - gpio_free(MDM2AP_ERRFATAL); - return ret; - -} - - -static int charm_modem_remove(struct platform_device *pdev) -{ - gpio_free(AP2MDM_STATUS); - gpio_free(AP2MDM_ERRFATAL); - gpio_free(AP2MDM_KPDPWR_N); - gpio_free(AP2MDM_PMIC_RESET_N); - gpio_free(MDM2AP_STATUS); - gpio_free(MDM2AP_ERRFATAL); - - return misc_deregister(&charm_modem_misc); -} - -static void charm_modem_shutdown(struct platform_device *pdev) -{ - int i; - - CHARM_DBG("%s: setting AP2MDM_STATUS low for a graceful restart\n", - __func__); - - charm_disable_irqs(); - - gpio_set_value(AP2MDM_STATUS, 0); - gpio_set_value(AP2MDM_WAKEUP, 1); - - for (i = CHARM_MODEM_TIMEOUT; i > 0; i -= CHARM_MODEM_DELTA) { - pet_watchdog(); - msleep(CHARM_MODEM_DELTA); - if (gpio_get_value(MDM2AP_STATUS) == 0) - break; - } - - if (i <= 0) { - pr_err("%s: MDM2AP_STATUS never went low.\n", - __func__); - gpio_direction_output(AP2MDM_PMIC_RESET_N, 1); - for (i = CHARM_HOLD_TIME; i > 0; i -= CHARM_MODEM_DELTA) { - pet_watchdog(); - msleep(CHARM_MODEM_DELTA); - } - gpio_direction_output(AP2MDM_PMIC_RESET_N, 0); - } - gpio_set_value(AP2MDM_WAKEUP, 0); -} - -static struct platform_driver charm_modem_driver = { - .remove = charm_modem_remove, - .shutdown = charm_modem_shutdown, - .driver = { - .name = "charm_modem", - .owner = THIS_MODULE - }, -}; - -static int __init charm_modem_init(void) -{ - return platform_driver_probe(&charm_modem_driver, charm_modem_probe); -} - -static void __exit charm_modem_exit(void) -{ - platform_driver_unregister(&charm_modem_driver); -} - -module_init(charm_modem_init); -module_exit(charm_modem_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("msm8660 charm modem driver"); -MODULE_VERSION("1.0"); -MODULE_ALIAS("charm_modem"); diff --git a/arch/arm/mach-msm/memory_topology.c b/arch/arm/mach-msm/memory_topology.c deleted file mode 100644 index de904273e8c9..000000000000 --- a/arch/arm/mach-msm/memory_topology.c +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_ARCH_MSM8960) -#include "rpm_resources.h" -#endif - -struct smem_ram_ptn { - char name[16]; - unsigned start; - unsigned size; - - /* RAM Partition attribute: READ_ONLY, READWRITE etc. */ - unsigned attr; - - /* RAM Partition category: EBI0, EBI1, IRAM, IMEM */ - unsigned category; - - /* RAM Partition domain: APPS, MODEM, APPS & MODEM (SHARED) etc. */ - unsigned domain; - - /* RAM Partition type: system, bootloader, appsboot, apps etc. */ - unsigned type; - - /* reserved for future expansion without changing version number */ - unsigned reserved2, reserved3, reserved4, reserved5; -} __attribute__ ((__packed__)); - - -struct smem_ram_ptable { - #define _SMEM_RAM_PTABLE_MAGIC_1 0x9DA5E0A8 - #define _SMEM_RAM_PTABLE_MAGIC_2 0xAF9EC4E2 - unsigned magic[2]; - unsigned version; - unsigned reserved1; - unsigned len; - struct smem_ram_ptn parts[32]; - unsigned buf; -} __attribute__ ((__packed__)); - -static struct mem_region_t { - u64 start; - u64 size; - /* reserved for future use */ - u64 num_partitions; - int state; -} mem_regions[MAX_NR_REGIONS]; - -static struct mutex mem_regions_mutex; -static unsigned int nr_mem_regions; -static int mem_regions_mask; - -enum { - STATE_POWER_DOWN = 0x0, - STATE_ACTIVE = 0x2, - STATE_DEFAULT = STATE_ACTIVE -}; - -static int default_mask = ~0x0; - -/* Return the number of chipselects populated with a memory bank */ -/* This is 7x30 only and will be re-implemented in the future */ - -#if defined(CONFIG_ARCH_MSM7X30) -unsigned int get_num_populated_chipselects() -{ - /* Currently, Linux cannot determine the memory toplogy of a target */ - /* This is a kludge until all this info is figured out from smem */ - - /* There is atleast one chipselect populated for hosting the 1st bank */ - unsigned int num_chipselects = 1; - int i; - for (i = 0; i < meminfo.nr_banks; i++) { - struct membank *bank = &meminfo.bank[i]; - if (bank->start == EBI1_PHYS_OFFSET) - num_chipselects++; - } - return num_chipselects; -} -#endif - -unsigned int get_num_memory_banks(void) -{ - return nr_mem_regions; -} - -unsigned int get_memory_bank_size(unsigned int id) -{ - BUG_ON(id >= nr_mem_regions); - return mem_regions[id].size; -} - -unsigned int get_memory_bank_start(unsigned int id) -{ - BUG_ON(id >= nr_mem_regions); - return mem_regions[id].start; -} - -int __init meminfo_init(unsigned int type, unsigned int min_bank_size) -{ - unsigned int i, j; - unsigned long bank_size; - unsigned long bank_start; - unsigned long region_size; - struct smem_ram_ptable *ram_ptable; - /* physical memory banks */ - unsigned int nr_mem_banks = 0; - /* logical memory regions for dmm */ - nr_mem_regions = 0; - - ram_ptable = smem_alloc(SMEM_USABLE_RAM_PARTITION_TABLE, - sizeof(struct smem_ram_ptable)); - - if (!ram_ptable) { - pr_err("Could not read ram partition table\n"); - return -EINVAL; - } - - pr_info("meminfo_init: smem ram ptable found: ver: %d len: %d\n", - ram_ptable->version, ram_ptable->len); - - for (i = 0; i < ram_ptable->len; i++) { - /* A bank is valid only if is greater than min_bank_size. If - * non-valid memory (e.g. modem memory) became greater than - * min_bank_size, there is currently no way to differentiate. - */ - if (ram_ptable->parts[i].type == type && - ram_ptable->parts[i].size >= min_bank_size) { - bank_start = ram_ptable->parts[i].start; - bank_size = ram_ptable->parts[i].size; - region_size = bank_size / NR_REGIONS_PER_BANK; - - for (j = 0; j < NR_REGIONS_PER_BANK; j++) { - mem_regions[nr_mem_regions].start = - bank_start; - mem_regions[nr_mem_regions].size = - region_size; - mem_regions[nr_mem_regions].state = - STATE_DEFAULT; - bank_start += region_size; - nr_mem_regions++; - } - nr_mem_banks++; - } - } - mutex_init(&mem_regions_mutex); - mem_regions_mask = default_mask; - pr_info("Found %d memory banks grouped into %d memory regions\n", - nr_mem_banks, nr_mem_regions); - return 0; -} diff --git a/arch/arm/mach-msm/mpm-8625.c b/arch/arm/mach-msm/mpm-8625.c deleted file mode 100644 index 99b7bd63a6ff..000000000000 --- a/arch/arm/mach-msm/mpm-8625.c +++ /dev/null @@ -1,334 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "mpm-8625.h" - -#define NUM_REGS_ENABLE 2 -/* (NR_MSM_IRQS/32) 96 max irqs supported */ -#define NUM_REGS_DISABLE 3 -#define GIC_IRQ_MASK(irq) BIT(irq % 32) -#define GIC_IRQ_INDEX(irq) (irq / 32) - -enum { - IRQ_DEBUG_SLEEP_INT_TRIGGER = BIT(0), - IRQ_DEBUG_SLEEP_INT = BIT(1), - IRQ_DEBUG_SLEEP_ABORT = BIT(2), - IRQ_DEBUG_SLEEP = BIT(3), - IRQ_DEBUG_SLEEP_REQUEST = BIT(4) -}; - -static int msm_gic_irq_debug_mask; -module_param_named(debug_mask, msm_gic_irq_debug_mask, int, - S_IRUGO | S_IWUSR | S_IWGRP); - -static uint32_t msm_gic_irq_smsm_wake_enable[NUM_REGS_ENABLE]; -static uint32_t msm_gic_irq_idle_disable[NUM_REGS_DISABLE]; - - /* - * Some of the interrupts which will not be considered as wake capable - * should be marked as FAKE. - * Interrupts: GPIO, Timers etc.. - */ -#define SMSM_FAKE_IRQ (0xff) - - /* msm_gic_irq_to_smsm: IRQ's those will be monitored by Modem */ -static uint8_t msm_gic_irq_to_smsm[NR_IRQS] = { - [MSM8625_INT_USB_OTG] = 4, - [MSM8625_INT_PWB_I2C] = 5, - [MSM8625_INT_SDC1_0] = 6, - [MSM8625_INT_SDC1_1] = 7, - [MSM8625_INT_SDC2_0] = 8, - [MSM8625_INT_SDC2_1] = 9, - [MSM8625_INT_ADSP_A9_A11] = 10, - [MSM8625_INT_UART1] = 11, - [MSM8625_INT_UART2] = 12, - [MSM8625_INT_UART3] = 13, - [MSM8625_INT_UART1_RX] = 14, - [MSM8625_INT_UART2_RX] = 15, - [MSM8625_INT_UART3_RX] = 16, - [MSM8625_INT_UART1DM_IRQ] = 17, - [MSM8625_INT_UART1DM_RX] = 18, - [MSM8625_INT_KEYSENSE] = 19, - [MSM8625_INT_AD_HSSD] = 20, - [MSM8625_INT_NAND_WR_ER_DONE] = 21, - [MSM8625_INT_NAND_OP_DONE] = 22, - [MSM8625_INT_TCHSCRN1] = 23, - [MSM8625_INT_TCHSCRN2] = 24, - [MSM8625_INT_TCHSCRN_SSBI] = 25, - [MSM8625_INT_USB_HS] = 26, - [MSM8625_INT_UART2DM_RX] = 27, - [MSM8625_INT_UART2DM_IRQ] = 28, - [MSM8625_INT_SDC4_1] = 29, - [MSM8625_INT_SDC4_0] = 30, - [MSM8625_INT_SDC3_1] = 31, - [MSM8625_INT_SDC3_0] = 32, - - /* fake wakeup interrupts */ - [MSM8625_INT_GPIO_GROUP1] = SMSM_FAKE_IRQ, - [MSM8625_INT_GPIO_GROUP2] = SMSM_FAKE_IRQ, - [MSM8625_INT_A9_M2A_0] = SMSM_FAKE_IRQ, - [MSM8625_INT_A9_M2A_1] = SMSM_FAKE_IRQ, - [MSM8625_INT_A9_M2A_2] = SMSM_FAKE_IRQ, - [MSM8625_INT_A9_M2A_5] = SMSM_FAKE_IRQ, - [MSM8625_INT_GP_TIMER_EXP] = SMSM_FAKE_IRQ, - [MSM8625_INT_DEBUG_TIMER_EXP] = SMSM_FAKE_IRQ, - [MSM8625_INT_ADSP_A11] = SMSM_FAKE_IRQ, -}; - -static uint16_t msm_bypassed_apps_irqs[] = { - MSM8625_INT_CPR_IRQ0, - MSM8625_INT_L2CC_INTR, -}; - -/* Check IRQ falls into bypassed list are not */ -static bool msm_mpm_bypass_apps_irq(unsigned int irq) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(msm_bypassed_apps_irqs); i++) - if (irq == msm_bypassed_apps_irqs[i]) - return true; - - return false; -} - -static void msm_gic_mask_irq(struct irq_data *d) -{ - unsigned int index = GIC_IRQ_INDEX(d->irq); - uint32_t mask; - int smsm_irq = msm_gic_irq_to_smsm[d->irq]; - - mask = GIC_IRQ_MASK(d->irq); - - /* check whether irq to be bypassed are not */ - if (msm_mpm_bypass_apps_irq(d->irq)) - return; - - if (smsm_irq == 0) { - msm_gic_irq_idle_disable[index] &= ~mask; - } else { - mask = GIC_IRQ_MASK(smsm_irq - 1); - msm_gic_irq_smsm_wake_enable[0] &= ~mask; - } -} - -static void msm_gic_unmask_irq(struct irq_data *d) -{ - unsigned int index = GIC_IRQ_INDEX(d->irq); - uint32_t mask; - int smsm_irq = msm_gic_irq_to_smsm[d->irq]; - - mask = GIC_IRQ_MASK(d->irq); - - /* check whether irq to be bypassed are not */ - if (msm_mpm_bypass_apps_irq(d->irq)) - return; - - if (smsm_irq == 0) { - msm_gic_irq_idle_disable[index] |= mask; - } else { - mask = GIC_IRQ_MASK(smsm_irq - 1); - msm_gic_irq_smsm_wake_enable[0] |= mask; - } -} - -static int msm_gic_set_irq_wake(struct irq_data *d, unsigned int on) -{ - uint32_t mask; - int smsm_irq = msm_gic_irq_to_smsm[d->irq]; - - if (smsm_irq == 0) { - pr_err("bad wake up irq %d\n", d->irq); - return -EINVAL; - } - - /* check whether irq to be bypassed are not */ - if (msm_mpm_bypass_apps_irq(d->irq)) - return 0; - - if (smsm_irq == SMSM_FAKE_IRQ) - return 0; - - mask = GIC_IRQ_MASK(smsm_irq - 1); - if (on) - msm_gic_irq_smsm_wake_enable[1] |= mask; - else - msm_gic_irq_smsm_wake_enable[1] &= ~mask; - - return 0; -} - -void __init msm_gic_irq_extn_init(void) -{ - gic_arch_extn.irq_mask = msm_gic_mask_irq; - gic_arch_extn.irq_unmask = msm_gic_unmask_irq; - gic_arch_extn.irq_disable = msm_gic_mask_irq; - gic_arch_extn.irq_set_wake = msm_gic_set_irq_wake; -} - -/* Power APIs */ - - /* - * Iterate over the disable list - */ - -int msm_gic_irq_idle_sleep_allowed(void) -{ - uint32_t i, disable = 0; - - for (i = 0; i < NUM_REGS_DISABLE; i++) - disable |= msm_gic_irq_idle_disable[i]; - - return !disable; -} - - /* - * Prepare interrupt subsystem for entering sleep -- phase 1 - * If modem_wake is true, return currently enabled interrupt - * mask in *irq_mask - */ -void msm_gic_irq_enter_sleep1(bool modem_wake, int from_idle, uint32_t - *irq_mask) -{ - if (modem_wake) { - *irq_mask = msm_gic_irq_smsm_wake_enable[!from_idle]; - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) - pr_info("%s irq_mask %x\n", __func__, *irq_mask); - } -} - - /* - * Prepare interrupt susbsytem for entering sleep -- phase 2 - * Detect any pending interrupts and configure interrupt hardware. - * Return value: - * -EAGAIN: there are pending interrupt(s); interrupt configuration is not - * changed - * 0: Success - */ -int msm_gic_irq_enter_sleep2(bool modem_wake, int from_idle) -{ - if (from_idle && !modem_wake) - return 0; - - /* edge triggered interrupt may get lost if this mode is used */ - WARN_ON_ONCE(!modem_wake && !from_idle); - - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) - pr_info("%s interrupts pending\n", __func__); - - /* check the pending interrupts */ - if (msm_gic_spi_ppi_pending()) { - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP_ABORT) - pr_info("%s aborted....\n", __func__); - return -EAGAIN; - } - - if (modem_wake) { - /* save the contents of GIC CPU interface and Distributor - * Disable all the Interrupts, if we enter from idle pc - */ - msm_gic_save(modem_wake, from_idle); - irq_set_irq_type(MSM8625_INT_A9_M2A_6, IRQF_TRIGGER_RISING); - enable_irq(MSM8625_INT_A9_M2A_6); - pr_debug("%s going for sleep now\n", __func__); - } - - return 0; -} - - /* - * Restore interrupt subsystem from sleep -- phase 1 - * Configure the interrupt hardware. - */ -void msm_gic_irq_exit_sleep1(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs) -{ - /* Restore GIC contents, which were saved */ - msm_gic_restore(); - - /* Disable A9_M2A_6 */ - disable_irq(MSM8625_INT_A9_M2A_6); - - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) - pr_info("%s %x %x %x now\n", __func__, irq_mask, - pending_irqs, wakeup_reason); -} - - /* - * Restore interrupt subsystem from sleep -- phase 2 - * Poke the specified pending interrupts into interrupt hardware. - */ -void msm_gic_irq_exit_sleep2(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending) -{ - int i, smsm_irq, smsm_mask; - struct irq_desc *desc; - - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) - pr_info("%s %x %x %x now\n", __func__, irq_mask, - pending, wakeup_reason); - - for (i = 0; pending && i < ARRAY_SIZE(msm_gic_irq_to_smsm); i++) { - smsm_irq = msm_gic_irq_to_smsm[i]; - - if (smsm_irq == 0) - continue; - - smsm_mask = BIT(smsm_irq - 1); - if (!(pending & smsm_mask)) - continue; - - pending &= ~smsm_mask; - - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP_INT) - pr_info("%s, irq %d, still pending %x now\n", - __func__, i, pending); - /* Peding IRQ */ - desc = i ? irq_to_desc(i) : NULL; - - /* Check if the pending */ - if (desc && !irqd_is_level_type(&desc->irq_data)) { - /* Mark the IRQ as pending, if not Level */ - irq_set_pending(i); - check_irq_resend(desc, i); - } - } -} - - /* - * Restore interrupt subsystem from sleep -- phase 3 - * Print debug information - */ -void msm_gic_irq_exit_sleep3(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs) -{ - if (msm_gic_irq_debug_mask & IRQ_DEBUG_SLEEP) - pr_info("%s, irq_mask %x pending_irqs %x, wakeup_reason %x," - "state %x now\n", __func__, irq_mask, - pending_irqs, wakeup_reason, - smsm_get_state(SMSM_MODEM_STATE)); -} diff --git a/arch/arm/mach-msm/mpm-8625.h b/arch/arm/mach-msm/mpm-8625.h deleted file mode 100644 index 884f6c9a5348..000000000000 --- a/arch/arm/mach-msm/mpm-8625.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _ARCH_ARM_MACH_MSM_MPM_8625_H_ -#define _ARCH_ARM_MACH_MSM_MPM_8625_H_ - -void msm_gic_irq_extn_init(void); - -unsigned int msm_gic_spi_ppi_pending(void); -int msm_gic_irq_idle_sleep_allowed(void); -void msm_gic_irq_enter_sleep1(bool modem_wake, int from_idle, uint32_t - *irq_mask); -int msm_gic_irq_enter_sleep2(bool modem_wake, int from_idle); -void msm_gic_irq_exit_sleep1(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs); -void msm_gic_irq_exit_sleep2(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending); -void msm_gic_irq_exit_sleep3(uint32_t irq_mask, uint32_t wakeup_reason, - uint32_t pending_irqs); -#endif diff --git a/arch/arm/mach-msm/mpp.c b/arch/arm/mach-msm/mpp.c deleted file mode 100644 index 82e0f34250e4..000000000000 --- a/arch/arm/mach-msm/mpp.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* Qualcomm PMIC Multi-Purpose Pin Configurations */ - -#include -#include -#include -#include -#include - -#include -#include - -int mpp_config_digital_out(unsigned mpp, unsigned config) -{ - int err; - err = msm_proc_comm(PCOM_PM_MPP_CONFIG, &mpp, &config); - if (err) - pr_err("%s: msm_proc_comm(PCOM_PM_MPP_CONFIG) failed\n", - __func__); - return err; -} -EXPORT_SYMBOL(mpp_config_digital_out); - -int mpp_config_digital_in(unsigned mpp, unsigned config) -{ - int err; - err = msm_proc_comm(PCOM_PM_MPP_CONFIG_DIGITAL_INPUT, &mpp, &config); - if (err) - pr_err("%s: msm_proc_comm(PCOM_PM_MPP_CONFIG) failed\n", - __func__); - return err; -} -EXPORT_SYMBOL(mpp_config_digital_in); - -#if defined(CONFIG_DEBUG_FS) -static int test_result; - -static int mpp_debug_set(void *data, u64 val) -{ - unsigned mpp = (unsigned) data; - - test_result = mpp_config_digital_out(mpp, (unsigned)val); - if (test_result) { - printk(KERN_ERR - "%s: mpp_config_digital_out \ - [mpp(%d) = 0x%x] failed (err=%d)\n", - __func__, mpp, (unsigned)val, test_result); - } - return 0; -} - -static int mpp_debug_get(void *data, u64 *val) -{ - if (!test_result) - *val = 0; - else - *val = 1; - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(mpp_fops, mpp_debug_get, mpp_debug_set, "%llu\n"); - -static int __init mpp_debug_init(void) -{ - struct dentry *dent; - int n; - char file_name[16]; - - dent = debugfs_create_dir("mpp", 0); - if (IS_ERR(dent)) - return 0; - - for (n = 0; n < MPPS; n++) { - snprintf(file_name, sizeof(file_name), "mpp%d", n + 1); - debugfs_create_file(file_name, 0644, dent, - (void *)n, &mpp_fops); - } - - return 0; -} - -device_initcall(mpp_debug_init); -#endif - diff --git a/arch/arm/mach-msm/msm-keypad-devices.h b/arch/arm/mach-msm/msm-keypad-devices.h deleted file mode 100644 index 153c69adece2..000000000000 --- a/arch/arm/mach-msm/msm-keypad-devices.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MSM_KEYPAD_DEVICES_H -#define _MSM_KEYPAD_DEVICES_H - -extern struct platform_device keypad_device_7k_ffa; -extern struct platform_device keypad_device_8k_ffa; -extern struct platform_device keypad_device_surf; - -#endif diff --git a/arch/arm/mach-msm/msm7k_fiq.c b/arch/arm/mach-msm/msm7k_fiq.c deleted file mode 100644 index d6441214d432..000000000000 --- a/arch/arm/mach-msm/msm7k_fiq.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm_watchdog.h" - -#define MODULE_NAME "MSM7K_FIQ" - -struct msm_watchdog_dump msm_dump_cpu_ctx; -static int fiq_counter; -void *msm7k_fiq_stack; - -/* Called from the FIQ asm handler */ -void msm7k_fiq_handler(void) -{ - struct irq_data *d; - struct irq_chip *c; - - pr_info("Fiq is received %s\n", __func__); - fiq_counter++; - d = irq_get_irq_data(MSM8625_INT_A9_M2A_2); - c = irq_data_get_irq_chip(d); - c->irq_mask(d); - local_irq_disable(); - - /* Clear the IRQ from the ENABLE_SET */ - gic_clear_irq_pending(MSM8625_INT_A9_M2A_2); - local_irq_enable(); - flush_cache_all(); - outer_flush_all(); - return; -} - -struct fiq_handler msm7k_fh = { - .name = MODULE_NAME, -}; - -static int __init msm_setup_fiq_handler(void) -{ - int ret = 0; - - claim_fiq(&msm7k_fh); - set_fiq_handler(&msm7k_fiq_start, msm7k_fiq_length); - msm7k_fiq_stack = (void *)__get_free_pages(GFP_KERNEL, - THREAD_SIZE_ORDER); - if (msm7k_fiq_stack == NULL) { - pr_err("FIQ STACK SETUP IS NOT SUCCESSFUL\n"); - return -ENOMEM; - } - - fiq_set_type(MSM8625_INT_A9_M2A_2, IRQF_TRIGGER_RISING); - gic_set_irq_secure(MSM8625_INT_A9_M2A_2); - enable_irq(MSM8625_INT_A9_M2A_2); - pr_info("%s : msm7k fiq setup--done\n", __func__); - return ret; -} - -static int __init init7k_fiq(void) -{ - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - return 0; - - if (msm_setup_fiq_handler()) - pr_err("MSM7K FIQ INIT FAILED\n"); - - return 0; -} -late_initcall(init7k_fiq); diff --git a/arch/arm/mach-msm/msm7k_fiq_handler.S b/arch/arm/mach-msm/msm7k_fiq_handler.S deleted file mode 100644 index e2da9cf6fdbe..000000000000 --- a/arch/arm/mach-msm/msm7k_fiq_handler.S +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -#define VERSION_ID 0x1 -#define MAGIC 0xDEAD0000 | VERSION_ID - .text - .align 3 - -ENTRY(msm7k_fiq_start) - sub r14, r14, #4 @return address - ldr r8, Lmsm_fiq_stack - ldr sp, [r8] @get stack - stmfa sp!, {r0-r7, lr} - stmfa sp!, {r8-r9} - ldr r8, Ldump_cpu_ctx - @ store magic to indicate a valid dump - ldr r9, Lmagic - str r9, [r8], #4 - @ get the current cpsr - mrs r9, cpsr - str r9, [r8],#4 - stmia r8!, {r0-r7} @ get the USR r0-r7 - mov r4, r8 - mov r5, #PSR_I_BIT | PSR_F_BIT | SYSTEM_MODE - msr cpsr_c, r5 @ select SYSTEM mode - stmia r4!, {r8-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | IRQ_MODE - msr cpsr_c, r5 @ select IRQ mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | SVC_MODE - msr cpsr_c, r5 @ select SVC mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r0, r13 - mov r1, r14 - mov r5, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE - msr cpsr_c, r5 @ select FIQ mode - stmfa sp!, {r0-r1} - mov r5, #PSR_I_BIT | PSR_F_BIT | ABT_MODE - msr cpsr_c, r5 @ select ABT mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | UND_MODE - msr cpsr_c, r5 @ select UND mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE - msr cpsr_c, r5 @ select FIQ mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r8-r14} - dsb - mov r5, #PSR_I_BIT | PSR_F_BIT | SVC_MODE - msr cpsr_c, r5 @ select SVC mode - ldr r2, Lmsm_fiq_handler - blx r2 - mov r5, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE - msr cpsr_c, r5 @ select FIQ mode - ldmfa sp!, {r0, r1} - mov r5, #PSR_I_BIT | PSR_F_BIT | SVC_MODE - msr cpsr_c, r5 @ select SVC mode - mov r13, r0 - mov r14, r1 - mov r5, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE - msr cpsr_c, r5 @ select SVC mode - ldmfa sp!, {r8-r9} - ldmfa sp!, {r0-r7, pc}^ -Ldump_cpu_ctx: - .word msm_dump_cpu_ctx -Lmsm_fiq_stack: - .word msm7k_fiq_stack -Lmagic: - .word MAGIC -Lmsm_fiq_handler: - .word msm7k_fiq_handler -ENTRY(msm7k_fiq_length) - .word . - msm7k_fiq_start diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8064.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8064.c deleted file mode 100644 index ff3dc21c7371..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8064.c +++ /dev/null @@ -1,972 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" - -#define NMASTERS 54 -#define NSLAVES 75 -#define NFAB_8064 5 - -enum msm_bus_fabric_tiered_slave_type { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0 = 1, - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_1, - MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM, - - MSM_BUS_TIERED_SLAVE_MM_IMEM = 1, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_1, - - MSM_BUS_TIERED_SLAVE_EBI1_CH0 = 1, - MSM_BUS_TIERED_SLAVE_EBI1_CH1, - MSM_BUS_TIERED_SLAVE_KMPSS_L2, -}; - -enum msm_bus_8064_master_ports_type { - MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB = 0, - MSM_BUS_MASTER_PORT_SPS, - MSM_BUS_MASTER_PORT_ADM_PORT0, - MSM_BUS_MASTER_PORT_ADM_PORT1, - MSM_BUS_MASTER_PORT_LPASS_PROC, - MSM_BUS_MASTER_PORT_GSS_NAV, - MSM_BUS_MASTER_PORT_PCIE, - MSM_BUS_MASTER_PORT_RIVA, - MSM_BUS_MASTER_PORT_SATA, - MSM_BUS_MASTER_PORT_LPASS, - MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI, - MSM_BUS_SYSTEM_MASTER_PORT_CRYPTO, - - MSM_BUS_MASTER_PORT_MDP_PORT0 = 0, - MSM_BUS_MASTER_PORT_MDP_PORT1, - MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT0, - MSM_BUS_MASTER_PORT_ROTATOR, - MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT1, - MSM_BUS_MASTER_PORT_JPEG_DEC, - MSM_BUS_MASTER_PORT_VIDEO_CAP, - MSM_BUS_MASTER_PORT_VFE, - MSM_BUS_MASTER_PORT_VPE, - MSM_BUS_MASTER_PORT_JPEG_ENC, - MSM_BUS_MASTER_PORT_VIDEO_DEC, - MSM_BUS_MMSS_MASTER_PORT_APPS_FAB, - MSM_BUS_MASTER_PORT_VIDEO_ENC, - - MSM_BUS_MASTER_PORT_KMPSS_M0 = 0, - MSM_BUS_MASTER_PORT_KMPSS_M1, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_1, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_1, - -}; - -enum msm_bus_8064_slave_ports_type { - MSM_BUS_SLAVE_PORT_MM_IMEM = 0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_1, - - MSM_BUS_SLAVE_PORT_EBI1_CH0 = 0, - MSM_BUS_SLAVE_PORT_EBI1_CH1, - MSM_BUS_SLAVE_PORT_KMPSS_L2, - MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB, - MSM_BUS_SLAVE_PORT_SYSTEM_FAB, - - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0 = 0, - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_1, - MSM_BUS_SLAVE_PORT_SPS, - MSM_BUS_SLAVE_PORT_SYSTEM_IMEM, - MSM_BUS_SLAVE_PORT_CORESIGHT, - MSM_BUS_SLAVE_PORT_PCIE, - MSM_BUS_SLAVE_PORT_KMPSS, - MSM_BUS_SLAVE_PORT_GSS, - MSM_BUS_SLAVE_PORT_LPASS, - MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB, - MSM_BUS_SLAVE_PORT_RIVA, - MSM_BUS_SLAVE_PORT_SATA, - MSM_BUS_SLAVE_PORT_CRYPTO, -}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -static int mport_kmpss_m0[] = {MSM_BUS_MASTER_PORT_KMPSS_M0,}; -static int mport_kmpss_m1[] = {MSM_BUS_MASTER_PORT_KMPSS_M1,}; - -static int mmss_mport_apps_fab[] = {MSM_BUS_MMSS_MASTER_PORT_APPS_FAB,}; -static int system_mport_appss_fab[] = {MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB,}; -static int sport_ebi1_ch0[] = { - MSM_BUS_SLAVE_PORT_EBI1_CH0, - MSM_BUS_SLAVE_PORT_EBI1_CH1, -}; -static int sport_ebi1_ch1[] = {MSM_BUS_SLAVE_PORT_EBI1_CH1,}; -static int sport_kmpss_l2[] = {MSM_BUS_SLAVE_PORT_KMPSS_L2,}; -static int appss_sport_mmss_fab[] = {MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB,}; -static int sport_system_fab[] = {MSM_BUS_SLAVE_PORT_SYSTEM_FAB,}; - -static int tiered_slave_ebi1_ch0[] = { - MSM_BUS_TIERED_SLAVE_EBI1_CH0, - MSM_BUS_TIERED_SLAVE_EBI1_CH1, -}; -static int tiered_slave_ebi1_ch1[] = {MSM_BUS_TIERED_SLAVE_EBI1_CH1,}; - -static int tiered_slave_kmpss[] = {MSM_BUS_TIERED_SLAVE_KMPSS_L2,}; - -static struct msm_bus_node_info apps_fabric_info[] = { - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = mport_kmpss_m0, - .num_mports = ARRAY_SIZE(mport_kmpss_m0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_AMPSS_M1, - .masterp = mport_kmpss_m1, - .num_mports = ARRAY_SIZE(mport_kmpss_m1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi1_ch0, - .num_sports = ARRAY_SIZE(sport_ebi1_ch0), - .tier = tiered_slave_ebi1_ch0, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch0), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_EBI_CH1, - .slavep = sport_ebi1_ch1, - .num_sports = ARRAY_SIZE(sport_ebi1_ch1), - .tier = tiered_slave_ebi1_ch1, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch1), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_AMPSS_L2, - .slavep = sport_kmpss_l2, - .num_sports = ARRAY_SIZE(sport_kmpss_l2), - .tier = tiered_slave_kmpss, - .num_tiers = ARRAY_SIZE(tiered_slave_kmpss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_MMSS, - .gateway = 1, - .slavep = appss_sport_mmss_fab, - .num_sports = ARRAY_SIZE(appss_sport_mmss_fab), - .masterp = mmss_mport_apps_fab, - .num_mports = ARRAY_SIZE(mmss_mport_apps_fab), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = sport_system_fab, - .num_sports = ARRAY_SIZE(sport_system_fab), - .masterp = system_mport_appss_fab, - .num_mports = ARRAY_SIZE(system_mport_appss_fab), - .buswidth = 8, - }, -}; - -static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,}; -static int mport_adm_port0[] = {MSM_BUS_MASTER_PORT_ADM_PORT0,}; -static int mport_adm_port1[] = {MSM_BUS_MASTER_PORT_ADM_PORT1,}; -static int mport_gss_nav[] = {MSM_BUS_MASTER_PORT_GSS_NAV,}; -static int mport_pcie[] = {MSM_BUS_MASTER_PORT_PCIE,}; -static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,}; -static int mport_sata[] = {MSM_BUS_MASTER_PORT_SATA,}; - -static int mport_riva[] = {MSM_BUS_MASTER_PORT_RIVA,}; -static int mport_crypto[] = {MSM_BUS_SYSTEM_MASTER_PORT_CRYPTO,}; -static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,}; -static int system_mport_mmss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB,}; -static int system_mport_adm_ahb_ci[] = {MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,}; -static int appss_mport_fab_system[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_1 -}; -static int mport_system_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,}; -static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,}; - -static int system_sport_appss_fab[] = { - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0, - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_1 -}; -static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,}; -static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,}; -static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,}; -static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,}; -static int sport_coresight[] = {MSM_BUS_SLAVE_PORT_CORESIGHT,}; -static int sport_crypto[] = {MSM_BUS_SLAVE_PORT_CRYPTO,}; -static int sport_riva[] = {MSM_BUS_SLAVE_PORT_RIVA,}; -static int sport_sata[] = {MSM_BUS_SLAVE_PORT_SATA,}; -static int sport_kmpss[] = {MSM_BUS_SLAVE_PORT_KMPSS,}; -static int sport_gss[] = {MSM_BUS_SLAVE_PORT_GSS,}; -static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,}; -static int sport_mmss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB,}; - -static int tiered_slave_system_imem[] = {MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM,}; -static int system_tiered_slave_fab_appss[] = { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0, - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_1, -}; - -static struct msm_bus_node_info system_fabric_info[] = { - { - .id = MSM_BUS_MASTER_SPS, - .masterp = mport_sps, - .num_mports = ARRAY_SIZE(mport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT0, - .masterp = mport_adm_port0, - .num_mports = ARRAY_SIZE(mport_adm_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT1, - .masterp = mport_adm_port1, - .num_mports = ARRAY_SIZE(mport_adm_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GSS_NAV, - .masterp = mport_gss_nav, - .num_mports = ARRAY_SIZE(mport_gss_nav), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_PCIE, - .masterp = mport_pcie, - .num_mports = ARRAY_SIZE(mport_pcie), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RIVA, - .masterp = mport_riva, - .num_mports = ARRAY_SIZE(mport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_SATA, - .masterp = mport_sata, - .num_mports = ARRAY_SIZE(mport_sata), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_CRYPTO, - .masterp = mport_crypto, - .num_mports = ARRAY_SIZE(mport_crypto), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS, - .masterp = mport_lpass, - .num_mports = ARRAY_SIZE(mport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_MMSS_FPB, - .masterp = system_mport_mmss_fpb, - .num_mports = ARRAY_SIZE(system_mport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM0_CI, - .masterp = system_mport_adm_ahb_ci, - .num_mports = ARRAY_SIZE(system_mport_adm_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = system_sport_appss_fab, - .num_sports = ARRAY_SIZE(system_sport_appss_fab), - .masterp = appss_mport_fab_system, - .num_mports = ARRAY_SIZE(appss_mport_fab_system), - .tier = system_tiered_slave_fab_appss, - .num_tiers = ARRAY_SIZE(system_tiered_slave_fab_appss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_FAB_CPSS_FPB, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_SLAVE_SPS, - .slavep = sport_sps, - .num_sports = ARRAY_SIZE(sport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "dfab_clk", - .slaveclk[ACTIVE_CTX] = "dfab_a_clk", - }, - { - .id = MSM_BUS_SLAVE_SYSTEM_IMEM, - .slavep = sport_system_imem, - .num_sports = ARRAY_SIZE(sport_system_imem), - .tier = tiered_slave_system_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_system_imem), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_CORESIGHT, - .slavep = sport_coresight, - .num_sports = ARRAY_SIZE(sport_coresight), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_CRYPTO, - .slavep = sport_crypto, - .num_sports = ARRAY_SIZE(sport_crypto), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_RIVA, - .slavep = sport_riva, - .num_sports = ARRAY_SIZE(sport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_SATA, - .slavep = sport_sata, - .num_sports = ARRAY_SIZE(sport_sata), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_kmpss, - .num_sports = ARRAY_SIZE(sport_kmpss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_GSS, - .slavep = sport_gss, - .num_sports = ARRAY_SIZE(sport_gss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SYSTEM_SLAVE_MMSS_FPB, - .slavep = sport_mmss_fpb, - .num_sports = ARRAY_SIZE(sport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, -}; - -static int mport_mdp[] = {MSM_BUS_MASTER_PORT_MDP_PORT0,}; -static int mport_mdp1[] = {MSM_BUS_MASTER_PORT_MDP_PORT1,}; -static int mport_rotator[] = {MSM_BUS_MASTER_PORT_ROTATOR,}; -static int mport_graphics_3d_port0[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT0,}; -static int mport_graphics_3d_port1[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT1,}; -static int mport_jpeg_dec[] = {MSM_BUS_MASTER_PORT_JPEG_DEC,}; -static int mport_video_cap[] = {MSM_BUS_MASTER_PORT_VIDEO_CAP,}; -static int mport_vfe[] = {MSM_BUS_MASTER_PORT_VFE,}; -static int mport_vpe[] = {MSM_BUS_MASTER_PORT_VPE,}; -static int mport_jpeg_enc[] = {MSM_BUS_MASTER_PORT_JPEG_ENC,}; -static int mport_video_enc[] = {MSM_BUS_MASTER_PORT_VIDEO_ENC,}; -static int mport_video_dec[] = {MSM_BUS_MASTER_PORT_VIDEO_DEC,}; -static int appss_mport_fab_mmss[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_1 -}; - -static int mmss_sport_apps_fab[] = { - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_1 -}; -static int sport_mm_imem[] = {MSM_BUS_SLAVE_PORT_MM_IMEM,}; - -static int mmss_tiered_slave_fab_apps[] = { - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_1, -}; -static int tiered_slave_mm_imem[] = {MSM_BUS_TIERED_SLAVE_MM_IMEM,}; - - -static struct msm_bus_node_info mmss_fabric_info[] = { - { - .id = MSM_BUS_MASTER_MDP_PORT0, - .masterp = mport_mdp, - .num_mports = ARRAY_SIZE(mport_mdp), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MDP_PORT1, - .masterp = mport_mdp1, - .num_mports = ARRAY_SIZE(mport_mdp1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ROTATOR, - .masterp = mport_rotator, - .num_mports = ARRAY_SIZE(mport_rotator), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D, - .masterp = mport_graphics_3d_port0, - .num_mports = ARRAY_SIZE(mport_graphics_3d_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .masterp = mport_graphics_3d_port1, - .num_mports = ARRAY_SIZE(mport_graphics_3d_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_DEC, - .masterp = mport_jpeg_dec, - .num_mports = ARRAY_SIZE(mport_jpeg_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VIDEO_CAP, - .masterp = mport_video_cap, - .num_mports = ARRAY_SIZE(mport_video_cap), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VIDEO_ENC, - .masterp = mport_video_enc, - .num_mports = ARRAY_SIZE(mport_video_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VFE, - .masterp = mport_vfe, - .num_mports = ARRAY_SIZE(mport_vfe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VPE, - .masterp = mport_vpe, - .num_mports = ARRAY_SIZE(mport_vpe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_ENC, - .masterp = mport_jpeg_enc, - .num_mports = ARRAY_SIZE(mport_jpeg_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - /* This port has been added for V2. It is absent in V1 */ - { - .id = MSM_BUS_MASTER_VIDEO_DEC, - .masterp = mport_video_dec, - .num_mports = ARRAY_SIZE(mport_video_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = mmss_sport_apps_fab, - .num_sports = ARRAY_SIZE(mmss_sport_apps_fab), - .masterp = appss_mport_fab_mmss, - .num_mports = ARRAY_SIZE(appss_mport_fab_mmss), - .tier = mmss_tiered_slave_fab_apps, - .num_tiers = ARRAY_SIZE(mmss_tiered_slave_fab_apps), - .buswidth = 16, - }, - { - .id = MSM_BUS_SLAVE_MM_IMEM, - .slavep = sport_mm_imem, - .num_sports = ARRAY_SIZE(sport_mm_imem), - .tier = tiered_slave_mm_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_mm_imem), - .buswidth = 8, - }, -}; - -static struct msm_bus_node_info sys_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_MASTER_SPDM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RPM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_SPDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM_MSG_RAM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_B, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_C, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_B, - .buswidth = 4, - .ahb = 1, - }, -}; - -static struct msm_bus_node_info cpss_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_NAND, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS0, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS3, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS4, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS5, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_TSIF, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TSSC, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_DIMEM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TCSR, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PRNG, - .buswidth = 4, - .ahb = 1, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) { - WARN(fabreg->info[i].id >= NMASTERS, - "id %d exceeds array size!\n", - fabreg->info[i].id); - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - } else { - WARN((fabreg->info[i].id - SLAVE_ID_KEY) >= - NSLAVES, "id %d exceeds array size!\n", - fabreg->info[i].id); - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } - } else - fabreg->info[i].priv_id = fabreg->info[i].id; - } -} - -static int msm_bus_board_8064_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return CHECK_ID(((id < SLAVE_ID_KEY) ? master_iids[id] : - slave_iids[id - SLAVE_ID_KEY]), id); -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_8064, - .get_iid = msm_bus_board_8064_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_8064_apps_fabric_pdata = { - .id = MSM_BUS_FAB_APPSS, - .name = "msm_apps_fab", - .info = apps_fabric_info, - .len = ARRAY_SIZE(apps_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_APPS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_APPS_FABRIC_ARB_0, - .nmasters = 6, - .nslaves = 5, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8064_sys_fabric_pdata = { - .id = MSM_BUS_FAB_SYSTEM, - .name = "msm_sys_fab", - system_fabric_info, - ARRAY_SIZE(system_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0, - .nmasters = 15, - .nslaves = 15, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8064_mm_fabric_pdata = { - .id = MSM_BUS_FAB_MMSS, - .name = "msm_mm_fab", - mmss_fabric_info, - ARRAY_SIZE(mmss_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_MM_FABRIC_ARB_0, - .nmasters = 13, - .nslaves = 3, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8064_sys_fpb_pdata = { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .name = "msm_sys_fpb", - sys_fpb_fabric_info, - ARRAY_SIZE(sys_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8064_cpss_fpb_pdata = { - .id = MSM_BUS_FAB_CPSS_FPB, - .name = "msm_cpss_fpb", - cpss_fpb_fabric_info, - ARRAY_SIZE(cpss_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c deleted file mode 100644 index d3d1ffa598fc..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c +++ /dev/null @@ -1,928 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" - -#define NMASTERS 39 -#define NSLAVES 68 -#define NFAB_8660 5 - -enum msm_bus_fabric_tiered_slave_type { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS = 1, - MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM, - - MSM_BUS_TIERED_SLAVE_SMI = 1, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS, - MSM_BUS_TIERED_SLAVE_MM_IMEM, - - MSM_BUS_TIERED_SLAVE_EBI_CH0 = 1, - MSM_BUS_TIERED_SLAVE_SMPSS_L2, -}; - -enum msm_bus_8660_master_ports_type { - MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB = 0, - MSM_BUS_MASTER_PORT_SPS, - MSM_BUS_MASTER_PORT_ADM0_PORT0, - MSM_BUS_MASTER_PORT_ADM0_PORT1, - MSM_BUS_MASTER_PORT_ADM1_PORT0, - MSM_BUS_MASTER_PORT_ADM1_PORT1, - MSM_BUS_MASTER_PORT_LPASS_PROC, - MSM_BUS_MASTER_PORT_MSS_PROCI, - MSM_BUS_MASTER_PORT_MSM_MSS_PROCD, - MSM_BUS_MASTER_PORT_MSM_MDM_PORT0, - MSM_BUS_MASTER_PORT_LPASS, - MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB, - MSM_BUS_MASTER_PORT_SYSTEM_FPB, - MSM_BUS_MASTER_PORT_MMSS_FPB, - MSM_BUS_MASTER_PORT_ADM1_AHB_CI, - MSM_BUS_MASTER_PORT_ADM0_AHB_CI, - MSM_BUS_MASTER_PORT_MSS_MDM_PORT1, - - MSM_BUS_MASTER_PORT_MDP_PORT0 = 0, - MSM_BUS_MASTER_PORT_MDP_PORT1, - MSM_BUS_MMSS_MASTER_PORT_ADM1_PORT0, - MSM_BUS_MASTER_PORT_ROTATOR, - MSM_BUS_MASTER_PORT_GRAPHICS_3D, - MSM_BUS_MASTER_PORT_JPEG_DEC, - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE0, - MSM_BUS_MASTER_PORT_VFE, - MSM_BUS_MASTER_PORT_VPE, - MSM_BUS_MASTER_PORT_JPEG_ENC, - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE1, - MSM_BUS_MMSS_MASTER_PORT_APPS_FAB, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT0, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT1, - - MSM_BUS_MASTER_PORT_SMPSS_M0 = 0, - MSM_BUS_MASTER_PORT_SMPSS_M1, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM, - -}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; - -enum msm_bus_8660_slave_ports_type { - MSM_BUS_SLAVE_PORT_SMI = 0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_1, - MSM_BUS_SLAVE_PORT_MM_IMEM, - - MSM_BUS_SLAVE_PORT_EBI_CH0 = 0, - MSM_BUS_SLAVE_PORT_SMPSS_L2, - MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB, - MSM_BUS_SLAVE_PORT_SYSTEM_FAB, - - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB = 0, - MSM_BUS_SLAVE_PORT_SPS, - MSM_BUS_SLAVE_PORT_SYSTEM_IMEM, - MSM_BUS_SLAVE_PORT_SMPSS, - MSM_BUS_SLAVE_PORT_MSS, - MSM_BUS_SLAVE_PORT_LPASS, - MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB, - MSM_BUS_SLAVE_PORT_MMSS_FPB, -}; - -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -static int ampss_m0_mports[] = {MSM_BUS_MASTER_PORT_SMPSS_M0,}; -static int ampss_m1_mports[] = {MSM_BUS_MASTER_PORT_SMPSS_M1,}; -static int mmss_mport_apps_fab[] = {MSM_BUS_MMSS_MASTER_PORT_APPS_FAB,}; -static int system_mport_appss_fab[] = {MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB,}; - -static int sport_ebi_ch0[] = {MSM_BUS_SLAVE_PORT_EBI_CH0,}; -static int sport_smpss_l2[] = {MSM_BUS_SLAVE_PORT_SMPSS_L2,}; -static int appss_sport_mmss_fab[] = {MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB,}; -static int sport_system_fab[] = {MSM_BUS_SLAVE_PORT_SYSTEM_FAB,}; - -static int tiered_slave_ebi[] = {MSM_BUS_TIERED_SLAVE_EBI_CH0,}; -static int tiered_slave_smpss[] = {MSM_BUS_TIERED_SLAVE_SMPSS_L2,}; - -static struct msm_bus_node_info apps_fabric_info[] = { - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = ampss_m0_mports, - .num_mports = ARRAY_SIZE(ampss_m0_mports), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_AMPSS_M1, - .masterp = ampss_m1_mports, - .num_mports = ARRAY_SIZE(ampss_m1_mports), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi_ch0, - .num_sports = ARRAY_SIZE(sport_ebi_ch0), - .tier = tiered_slave_ebi, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_AMPSS_L2, - .slavep = sport_smpss_l2, - .num_sports = ARRAY_SIZE(sport_smpss_l2), - .tier = tiered_slave_smpss, - .num_tiers = ARRAY_SIZE(tiered_slave_smpss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_MMSS, - .gateway = 1, - .slavep = appss_sport_mmss_fab, - .num_sports = ARRAY_SIZE(appss_sport_mmss_fab), - .masterp = mmss_mport_apps_fab, - .num_mports = ARRAY_SIZE(mmss_mport_apps_fab), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = sport_system_fab, - .num_sports = ARRAY_SIZE(sport_system_fab), - .masterp = system_mport_appss_fab, - .num_mports = ARRAY_SIZE(system_mport_appss_fab), - .buswidth = 8, - }, -}; - -static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,}; -static int mport_adm0_port0[] = {MSM_BUS_MASTER_PORT_ADM0_PORT0,}; -static int mport_adm0_port1[] = {MSM_BUS_MASTER_PORT_ADM0_PORT1,}; -static int mport_adm1_port0[] = {MSM_BUS_MASTER_PORT_ADM1_PORT0,}; -static int mport_adm1_port1[] = {MSM_BUS_MASTER_PORT_ADM1_PORT1,}; -static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,}; -static int mport_mss_proci[] = {MSM_BUS_MASTER_PORT_MSS_PROCI,}; -static int mport_msm_mss_procd[] = {MSM_BUS_MASTER_PORT_MSM_MSS_PROCD,}; -static int mport_mss_mdm_port0[] = {MSM_BUS_MASTER_PORT_MSM_MDM_PORT0,}; -static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,}; -static int mport_mmss_fpb[] = {MSM_BUS_MASTER_PORT_MMSS_FPB,}; -static int mport_adm1_ahb_ci[] = {MSM_BUS_MASTER_PORT_ADM1_AHB_CI,}; -static int mport_adm0_ahb_ci[] = {MSM_BUS_MASTER_PORT_ADM0_AHB_CI,}; -static int mport_mss_mdm_port1[] = {MSM_BUS_MASTER_PORT_MSS_MDM_PORT1,}; -static int appss_mport_fab_system[] = {MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM,}; -static int mport_system_fpb[] = {MSM_BUS_MASTER_PORT_SYSTEM_FPB,}; -static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,}; - -static int system_sport_appss_fab[] = {MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB,}; -static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,}; -static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,}; -static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,}; -static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,}; -static int sport_smpss[] = {MSM_BUS_SLAVE_PORT_SMPSS,}; -static int sport_mss[] = {MSM_BUS_SLAVE_PORT_MSS,}; -static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,}; -static int sport_mmss_fpb[] = {MSM_BUS_SLAVE_PORT_MMSS_FPB,}; - -static int tiered_slave_system_imem[] = {MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM,}; -static int system_tiered_slave_fab_appss[] = { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS,}; - -static struct msm_bus_node_info system_fabric_info[] = { - { - .id = MSM_BUS_MASTER_SPS, - .masterp = mport_sps, - .num_mports = ARRAY_SIZE(mport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT0, - .masterp = mport_adm0_port0, - .num_mports = ARRAY_SIZE(mport_adm0_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT1, - .masterp = mport_adm0_port1, - .num_mports = ARRAY_SIZE(mport_adm0_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_ADM1_PORT0, - .masterp = mport_adm1_port0, - .num_mports = ARRAY_SIZE(mport_adm1_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM1_PORT1, - .masterp = mport_adm1_port1, - .num_mports = ARRAY_SIZE(mport_adm1_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_PROCI, - .masterp = mport_mss_proci, - .num_mports = ARRAY_SIZE(mport_mss_proci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_PROCD, - .masterp = mport_msm_mss_procd, - .num_mports = ARRAY_SIZE(mport_msm_mss_procd), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_MDM_PORT0, - .masterp = mport_mss_mdm_port0, - .num_mports = ARRAY_SIZE(mport_mss_mdm_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS, - .masterp = mport_lpass, - .num_mports = ARRAY_SIZE(mport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_MMSS_FPB, - .masterp = mport_mmss_fpb, - .num_mports = ARRAY_SIZE(mport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM1_CI, - .masterp = mport_adm1_ahb_ci, - .num_mports = ARRAY_SIZE(mport_adm1_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM0_CI, - .masterp = mport_adm0_ahb_ci, - .num_mports = ARRAY_SIZE(mport_adm0_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_MDM_PORT1, - .masterp = mport_mss_mdm_port1, - .num_mports = ARRAY_SIZE(mport_mss_mdm_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = system_sport_appss_fab, - .num_sports = ARRAY_SIZE(system_sport_appss_fab), - .masterp = appss_mport_fab_system, - .num_mports = ARRAY_SIZE(appss_mport_fab_system), - .tier = system_tiered_slave_fab_appss, - .num_tiers = ARRAY_SIZE(system_tiered_slave_fab_appss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_FAB_CPSS_FPB, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_SLAVE_SPS, - .slavep = sport_sps, - .num_sports = ARRAY_SIZE(sport_sps), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_SYSTEM_IMEM, - .slavep = sport_system_imem, - .num_sports = ARRAY_SIZE(sport_system_imem), - .tier = tiered_slave_system_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_system_imem), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_smpss, - .num_sports = ARRAY_SIZE(sport_smpss), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_MSS, - .slavep = sport_mss, - .num_sports = ARRAY_SIZE(sport_mss), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .buswidth = 8, - }, - { - .id = MSM_BUS_SYSTEM_SLAVE_MMSS_FPB, - .slavep = sport_mmss_fpb, - .num_sports = ARRAY_SIZE(sport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, -}; - -static int mport_mdp_port0[] = {MSM_BUS_MASTER_PORT_MDP_PORT0,}; -static int mport_mdp_port1[] = {MSM_BUS_MASTER_PORT_MDP_PORT1,}; -static int mmss_mport_adm1_port0[] = {MSM_BUS_MMSS_MASTER_PORT_ADM1_PORT0,}; -static int mport_rotator[] = {MSM_BUS_MASTER_PORT_ROTATOR,}; -static int mport_graphics_3d[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D,}; -static int mport_jpeg_dec[] = {MSM_BUS_MASTER_PORT_JPEG_DEC,}; -static int mport_graphics_2d_core0[] = {MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE0,}; -static int mport_vfe[] = {MSM_BUS_MASTER_PORT_VFE,}; -static int mport_vpe[] = {MSM_BUS_MASTER_PORT_VPE,}; -static int mport_jpeg_enc[] = {MSM_BUS_MASTER_PORT_JPEG_ENC,}; -static int mport_graphics_2d_core1[] = {MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE1,}; -static int mport_hd_codec_port0[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT0,}; -static int mport_hd_codec_port1[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT1,}; -static int appss_mport_fab_mmss[] = {MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS,}; - -static int sport_smi[] = {MSM_BUS_SLAVE_PORT_SMI,}; -static int mmss_sport_apps_fab_0[] = {MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0,}; -static int sport_mm_imem[] = {MSM_BUS_SLAVE_PORT_MM_IMEM,}; - -static int tiered_slave_smi[] = {MSM_BUS_TIERED_SLAVE_SMI,}; -static int mmss_tiered_slave_fab_apps[] = {MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS,}; -static int tiered_slave_mm_imem[] = {MSM_BUS_TIERED_SLAVE_MM_IMEM,}; - -static struct msm_bus_node_info mmss_fabric_info[] = { - { - .id = MSM_BUS_MASTER_MDP_PORT0, - .masterp = mport_mdp_port0, - .num_mports = ARRAY_SIZE(mport_mdp_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MDP_PORT1, - .masterp = mport_mdp_port1, - .num_mports = ARRAY_SIZE(mport_mdp_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MMSS_MASTER_ADM1_PORT0, - .masterp = mmss_mport_adm1_port0, - .num_mports = ARRAY_SIZE(mmss_mport_adm1_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ROTATOR, - .masterp = mport_rotator, - .num_mports = ARRAY_SIZE(mport_rotator), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D, - .masterp = mport_graphics_3d, - .num_mports = ARRAY_SIZE(mport_graphics_3d), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_DEC, - .masterp = mport_jpeg_dec, - .num_mports = ARRAY_SIZE(mport_jpeg_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .masterp = mport_graphics_2d_core0, - .num_mports = ARRAY_SIZE(mport_graphics_2d_core0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VFE, - .masterp = mport_vfe, - .num_mports = ARRAY_SIZE(mport_vfe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VPE, - .masterp = mport_vpe, - .num_mports = ARRAY_SIZE(mport_vpe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_ENC, - .masterp = mport_jpeg_enc, - .num_mports = ARRAY_SIZE(mport_jpeg_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - /* This port has been added for V2. It is absent in V1 */ - { - .id = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .masterp = mport_graphics_2d_core1, - .num_mports = ARRAY_SIZE(mport_graphics_2d_core1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT0, - .masterp = mport_hd_codec_port0, - .num_mports = ARRAY_SIZE(mport_hd_codec_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT1, - .masterp = mport_hd_codec_port1, - .num_mports = ARRAY_SIZE(mport_hd_codec_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_SMI, - .slavep = sport_smi, - .num_sports = ARRAY_SIZE(sport_smi), - .tier = tiered_slave_smi, - .num_tiers = ARRAY_SIZE(tiered_slave_smi), - .buswidth = 16, - .slaveclk[DUAL_CTX] = "smi_clk", - .slaveclk[ACTIVE_CTX] = "smi_a_clk", - }, - { - .id = MSM_BUS_MMSS_SLAVE_FAB_APPS_1, - .slavep = mmss_sport_apps_fab_0, - .num_sports = ARRAY_SIZE(mmss_sport_apps_fab_0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = mmss_sport_apps_fab_0, - .num_sports = ARRAY_SIZE(mmss_sport_apps_fab_0), - .masterp = appss_mport_fab_mmss, - .num_mports = ARRAY_SIZE(appss_mport_fab_mmss), - .tier = mmss_tiered_slave_fab_apps, - .num_tiers = ARRAY_SIZE(mmss_tiered_slave_fab_apps), - .buswidth = 16, - }, - { - .id = MSM_BUS_SLAVE_MM_IMEM, - .slavep = sport_mm_imem, - .num_sports = ARRAY_SIZE(sport_mm_imem), - .tier = tiered_slave_mm_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_mm_imem), - .buswidth = 8, - }, -}; - -static struct msm_bus_node_info sys_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_MASTER_SPDM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RPM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_SPDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM_MSG_RAM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_B, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_C, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_B, - .buswidth = 4, - .ahb = 1, - }, -}; - -static struct msm_bus_node_info cpss_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_NAND, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS0, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS3, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS4, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS5, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_TSIF, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TSSC, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_DIMEM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TCSR, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PRNG, - .buswidth = 4, - .ahb = 1, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - else - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } else - fabreg->info[i].priv_id = fabreg->info[i].id; - } -} - -static int msm_bus_board_8660_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return CHECK_ID(((id < SLAVE_ID_KEY) ? master_iids[id] : - slave_iids[id - SLAVE_ID_KEY]), id); -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_8660, - .get_iid = msm_bus_board_8660_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_apps_fabric_pdata = { - .id = MSM_BUS_FAB_APPSS, - .name = "msm_apps_fab", - .info = apps_fabric_info, - .len = ARRAY_SIZE(apps_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_APPS_FABRIC_HALT_0, - .offset = MSM_RPM_ID_APPS_FABRIC_ARB_0, - .nmasters = 4, - .nslaves = 4, - .ntieredslaves = 2, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_sys_fabric_pdata = { - .id = MSM_BUS_FAB_SYSTEM, - .name = "msm_sys_fab", - system_fabric_info, - ARRAY_SIZE(system_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_SYSTEM_FABRIC_HALT_0, - .offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0, - .nmasters = 17, - .nslaves = 9, - .ntieredslaves = 2, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_mm_fabric_pdata = { - .id = MSM_BUS_FAB_MMSS, - .name = "msm_mm_fab", - mmss_fabric_info, - ARRAY_SIZE(mmss_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_MM_FABRIC_HALT_0, - .offset = MSM_RPM_ID_MM_FABRIC_ARB_0, - .nmasters = 14, - .nslaves = 4, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_sys_fpb_pdata = { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .name = "msm_sys_fpb", - sys_fpb_fabric_info, - ARRAY_SIZE(sys_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_cpss_fpb_pdata = { - .id = MSM_BUS_FAB_CPSS_FPB, - .name = "msm_cpss_fpb", - cpss_fpb_fabric_info, - ARRAY_SIZE(cpss_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -int msm_bus_board_rpm_get_il_ids(uint16_t id[]) -{ - return -ENXIO; -} - -void msm_bus_board_init(struct msm_bus_fabric_registration *pdata) -{ -} diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8930.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8930.c deleted file mode 100644 index af513559ecc8..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8930.c +++ /dev/null @@ -1,877 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" - -#define NMASTERS 45 -#define NSLAVES 75 -#define NFAB_8930 5 - -enum msm_bus_fabric_tiered_slave_type { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0 = 1, - MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM, - - MSM_BUS_TIERED_SLAVE_MM_IMEM = 1, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0, - - MSM_BUS_TIERED_SLAVE_EBI1_CH0 = 1, - MSM_BUS_TIERED_SLAVE_KMPSS_L2, -}; - -enum msm_bus_8930_master_ports_type { - MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB = 0, - MSM_BUS_MASTER_PORT_SPS, - MSM_BUS_MASTER_PORT_ADM_PORT0, - MSM_BUS_MASTER_PORT_ADM_PORT1, - MSM_BUS_MASTER_PORT_LPASS_PROC, - MSM_BUS_MASTER_PORT_MSS, - MSM_BUS_MASTER_PORT_RIVA, - MSM_BUS_MASTER_PORT_MSS_SW_PROC, - MSM_BUS_MASTER_PORT_MSS_FW_PROC, - MSM_BUS_MASTER_PORT_LPASS, - MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI, - - MSM_BUS_MASTER_PORT_MDP_PORT0 = 0, - MSM_BUS_MASTER_PORT_MDP_PORT1, - MSM_BUS_MASTER_PORT_GRAPHICS_3D, - MSM_BUS_MASTER_PORT_ROTATOR, - MSM_BUS_MASTER_PORT_VFE, - MSM_BUS_MASTER_PORT_VPE, - MSM_BUS_MASTER_PORT_JPEG_ENC, - MSM_BUS_MMSS_MASTER_PORT_APPS_FAB, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT0, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT1, - - MSM_BUS_MASTER_PORT_KMPSS_M0 = 0, - MSM_BUS_MASTER_PORT_KMPSS_M1, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, -}; - -enum msm_bus_8930_slave_ports_type { - MSM_BUS_SLAVE_PORT_MM_IMEM = 0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - - MSM_BUS_SLAVE_PORT_EBI1_CH0 = 0, - MSM_BUS_SLAVE_PORT_KMPSS_L2, - MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB, - MSM_BUS_SLAVE_PORT_SYSTEM_FAB, - - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0 = 0, - MSM_BUS_SLAVE_PORT_SPS, - MSM_BUS_SLAVE_PORT_SYSTEM_IMEM, - MSM_BUS_SLAVE_PORT_CORESIGHT, - MSM_BUS_SLAVE_PORT_KMPSS, - MSM_BUS_SLAVE_PORT_MSS, - MSM_BUS_SLAVE_PORT_LPASS, - MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB, - MSM_BUS_SLAVE_PORT_RIVA, -}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -static int mport_kmpss_m0[] = {MSM_BUS_MASTER_PORT_KMPSS_M0,}; -static int mport_kmpss_m1[] = {MSM_BUS_MASTER_PORT_KMPSS_M1,}; - -static int mmss_mport_apps_fab[] = {MSM_BUS_MMSS_MASTER_PORT_APPS_FAB,}; -static int system_mport_appss_fab[] = {MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB,}; -static int sport_ebi1_ch0[] = { - MSM_BUS_SLAVE_PORT_EBI1_CH0, -}; -static int sport_kmpss_l2[] = {MSM_BUS_SLAVE_PORT_KMPSS_L2,}; -static int appss_sport_mmss_fab[] = {MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB,}; -static int sport_system_fab[] = {MSM_BUS_SLAVE_PORT_SYSTEM_FAB,}; - -static int tiered_slave_ebi1_ch0[] = { - MSM_BUS_TIERED_SLAVE_EBI1_CH0, -}; - -static int tiered_slave_kmpss[] = {MSM_BUS_TIERED_SLAVE_KMPSS_L2,}; - -static struct msm_bus_node_info apps_fabric_info[] = { - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = mport_kmpss_m0, - .num_mports = ARRAY_SIZE(mport_kmpss_m0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_AMPSS_M1, - .masterp = mport_kmpss_m1, - .num_mports = ARRAY_SIZE(mport_kmpss_m1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi1_ch0, - .num_sports = ARRAY_SIZE(sport_ebi1_ch0), - .tier = tiered_slave_ebi1_ch0, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch0), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_AMPSS_L2, - .slavep = sport_kmpss_l2, - .num_sports = ARRAY_SIZE(sport_kmpss_l2), - .tier = tiered_slave_kmpss, - .num_tiers = ARRAY_SIZE(tiered_slave_kmpss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_MMSS, - .gateway = 1, - .slavep = appss_sport_mmss_fab, - .num_sports = ARRAY_SIZE(appss_sport_mmss_fab), - .masterp = mmss_mport_apps_fab, - .num_mports = ARRAY_SIZE(mmss_mport_apps_fab), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = sport_system_fab, - .num_sports = ARRAY_SIZE(sport_system_fab), - .masterp = system_mport_appss_fab, - .num_mports = ARRAY_SIZE(system_mport_appss_fab), - .buswidth = 8, - }, -}; - -static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,}; -static int mport_adm_port0[] = {MSM_BUS_MASTER_PORT_ADM_PORT0,}; -static int mport_adm_port1[] = {MSM_BUS_MASTER_PORT_ADM_PORT1,}; -static int mport_mss[] = {MSM_BUS_MASTER_PORT_MSS,}; -static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,}; -static int mport_riva[] = {MSM_BUS_MASTER_PORT_RIVA,}; -static int mport_mss_sw_proc[] = {MSM_BUS_MASTER_PORT_MSS_SW_PROC,}; -static int mport_mss_fw_proc[] = {MSM_BUS_MASTER_PORT_MSS_FW_PROC,}; -static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,}; -static int system_mport_mmss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB,}; -static int system_mport_adm_ahb_ci[] = {MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,}; -static int appss_mport_fab_system[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, -}; -static int mport_system_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,}; -static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,}; - -static int system_sport_appss_fab[] = { - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0, -}; -static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,}; -static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,}; -static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,}; -static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,}; -static int sport_coresight[] = {MSM_BUS_SLAVE_PORT_CORESIGHT,}; -static int sport_riva[] = {MSM_BUS_SLAVE_PORT_RIVA,}; -static int sport_kmpss[] = {MSM_BUS_SLAVE_PORT_KMPSS,}; -static int sport_mss[] = {MSM_BUS_SLAVE_PORT_MSS,}; -static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,}; -static int sport_mmss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB,}; - -static int tiered_slave_system_imem[] = {MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM,}; -static int system_tiered_slave_fab_appss[] = { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0, -}; - -static struct msm_bus_node_info system_fabric_info[] = { - { - .id = MSM_BUS_MASTER_SPS, - .masterp = mport_sps, - .num_mports = ARRAY_SIZE(mport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT0, - .masterp = mport_adm_port0, - .num_mports = ARRAY_SIZE(mport_adm_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT1, - .masterp = mport_adm_port1, - .num_mports = ARRAY_SIZE(mport_adm_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS, - .masterp = mport_mss, - .num_mports = ARRAY_SIZE(mport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RIVA, - .masterp = mport_riva, - .num_mports = ARRAY_SIZE(mport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_SW_PROC, - .masterp = mport_mss_sw_proc, - .num_mports = ARRAY_SIZE(mport_mss_sw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_FW_PROC, - .masterp = mport_mss_fw_proc, - .num_mports = ARRAY_SIZE(mport_mss_fw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS, - .masterp = mport_lpass, - .num_mports = ARRAY_SIZE(mport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_MMSS_FPB, - .masterp = system_mport_mmss_fpb, - .num_mports = ARRAY_SIZE(system_mport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM0_CI, - .masterp = system_mport_adm_ahb_ci, - .num_mports = ARRAY_SIZE(system_mport_adm_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = system_sport_appss_fab, - .num_sports = ARRAY_SIZE(system_sport_appss_fab), - .masterp = appss_mport_fab_system, - .num_mports = ARRAY_SIZE(appss_mport_fab_system), - .tier = system_tiered_slave_fab_appss, - .num_tiers = ARRAY_SIZE(system_tiered_slave_fab_appss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_FAB_CPSS_FPB, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_SLAVE_SPS, - .slavep = sport_sps, - .num_sports = ARRAY_SIZE(sport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "dfab_clk", - .slaveclk[ACTIVE_CTX] = "dfab_a_clk", - }, - { - .id = MSM_BUS_SLAVE_SYSTEM_IMEM, - .slavep = sport_system_imem, - .num_sports = ARRAY_SIZE(sport_system_imem), - .tier = tiered_slave_system_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_system_imem), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_CORESIGHT, - .slavep = sport_coresight, - .num_sports = ARRAY_SIZE(sport_coresight), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_RIVA, - .slavep = sport_riva, - .num_sports = ARRAY_SIZE(sport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_kmpss, - .num_sports = ARRAY_SIZE(sport_kmpss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_MSS, - .slavep = sport_mss, - .num_sports = ARRAY_SIZE(sport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SYSTEM_SLAVE_MMSS_FPB, - .slavep = sport_mmss_fpb, - .num_sports = ARRAY_SIZE(sport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, -}; - -static int mport_mdp[] = {MSM_BUS_MASTER_PORT_MDP_PORT0,}; -static int mport_mdp1[] = {MSM_BUS_MASTER_PORT_MDP_PORT1,}; -static int mport_rotator[] = {MSM_BUS_MASTER_PORT_ROTATOR,}; -static int mport_graphics_3d[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D,}; -static int mport_vfe[] = {MSM_BUS_MASTER_PORT_VFE,}; -static int mport_vpe[] = {MSM_BUS_MASTER_PORT_VPE,}; -static int mport_jpeg_enc[] = {MSM_BUS_MASTER_PORT_JPEG_ENC,}; -static int mport_hd_codec_port0[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT0,}; -static int mport_hd_codec_port1[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT1,}; -static int appss_mport_fab_mmss[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, -}; - -static int mmss_sport_apps_fab[] = { - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, -}; -static int sport_mm_imem[] = {MSM_BUS_SLAVE_PORT_MM_IMEM,}; - -static int mmss_tiered_slave_fab_apps[] = { - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0, -}; -static int tiered_slave_mm_imem[] = {MSM_BUS_TIERED_SLAVE_MM_IMEM,}; - - -static struct msm_bus_node_info mmss_fabric_info[] = { - { - .id = MSM_BUS_MASTER_MDP_PORT0, - .masterp = mport_mdp, - .num_mports = ARRAY_SIZE(mport_mdp), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MDP_PORT1, - .masterp = mport_mdp1, - .num_mports = ARRAY_SIZE(mport_mdp1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ROTATOR, - .masterp = mport_rotator, - .num_mports = ARRAY_SIZE(mport_rotator), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D, - .masterp = mport_graphics_3d, - .num_mports = ARRAY_SIZE(mport_graphics_3d), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VFE, - .masterp = mport_vfe, - .num_mports = ARRAY_SIZE(mport_vfe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VPE, - .masterp = mport_vpe, - .num_mports = ARRAY_SIZE(mport_vpe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_ENC, - .masterp = mport_jpeg_enc, - .num_mports = ARRAY_SIZE(mport_jpeg_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT0, - .masterp = mport_hd_codec_port0, - .num_mports = ARRAY_SIZE(mport_hd_codec_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT1, - .masterp = mport_hd_codec_port1, - .num_mports = ARRAY_SIZE(mport_hd_codec_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = mmss_sport_apps_fab, - .num_sports = ARRAY_SIZE(mmss_sport_apps_fab), - .masterp = appss_mport_fab_mmss, - .num_mports = ARRAY_SIZE(appss_mport_fab_mmss), - .tier = mmss_tiered_slave_fab_apps, - .num_tiers = ARRAY_SIZE(mmss_tiered_slave_fab_apps), - .buswidth = 16, - }, - { - .id = MSM_BUS_SLAVE_MM_IMEM, - .slavep = sport_mm_imem, - .num_sports = ARRAY_SIZE(sport_mm_imem), - .tier = tiered_slave_mm_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_mm_imem), - .buswidth = 8, - }, -}; - -static struct msm_bus_node_info sys_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_MASTER_SPDM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RPM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_SPDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM_MSG_RAM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_B, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_C, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_B, - .buswidth = 4, - .ahb = 1, - }, -}; - -static struct msm_bus_node_info cpss_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_NAND, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS0, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS3, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS4, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS5, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_TSIF, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TSSC, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_DIMEM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TCSR, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PRNG, - .buswidth = 4, - .ahb = 1, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - else - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } else - fabreg->info[i].priv_id = fabreg->info[i].id; - } -} - -static int msm_bus_board_8930_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return CHECK_ID(((id < SLAVE_ID_KEY) ? master_iids[id] : - slave_iids[id - SLAVE_ID_KEY]), id); -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_8930, - .get_iid = msm_bus_board_8930_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_8930_apps_fabric_pdata = { - .id = MSM_BUS_FAB_APPSS, - .name = "msm_apps_fab", - .info = apps_fabric_info, - .len = ARRAY_SIZE(apps_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_APPS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_APPS_FABRIC_ARB_0, - .nmasters = 4, - .nslaves = 4, - .ntieredslaves = 2, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8930_sys_fabric_pdata = { - .id = MSM_BUS_FAB_SYSTEM, - .name = "msm_sys_fab", - system_fabric_info, - ARRAY_SIZE(system_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0, - .nmasters = 14, - .nslaves = 11, - .ntieredslaves = 2, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8930_mm_fabric_pdata = { - .id = MSM_BUS_FAB_MMSS, - .name = "msm_mm_fab", - mmss_fabric_info, - ARRAY_SIZE(mmss_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_MM_FABRIC_ARB_0, - .nmasters = 10, - .nslaves = 2, - .ntieredslaves = 2, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8930_sys_fpb_pdata = { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .name = "msm_sys_fpb", - sys_fpb_fabric_info, - ARRAY_SIZE(sys_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8930_cpss_fpb_pdata = { - .id = MSM_BUS_FAB_CPSS_FPB, - .name = "msm_cpss_fpb", - cpss_fpb_fabric_info, - ARRAY_SIZE(cpss_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c deleted file mode 100644 index 295b91b76962..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c +++ /dev/null @@ -1,1117 +0,0 @@ -/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" - -#define NMASTERS 55 -#define NSLAVES 75 -#define NFAB_8960 5 - -enum msm_bus_fabric_tiered_slave_type { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0 = 1, - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_1, - MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM, - - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0 = 1, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_1, - MSM_BUS_TIERED_SLAVE_MM_IMEM, - - MSM_BUS_TIERED_SLAVE_EBI1_CH0 = 1, - MSM_BUS_TIERED_SLAVE_EBI1_CH1, - MSM_BUS_TIERED_SLAVE_KMPSS_L2, -}; - -enum msm_bus_sg_tiered_slaves_type { - SG_TIERED_SLAVE_MM_IMEM = 1, - SG_MMSS_TIERED_SLAVE_FAB_APPS_0, - SG_MMSS_TIERED_SLAVE_FAB_APPS_1, -}; - -enum msm_bus_8960_master_ports_type { - MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB = 0, - MSM_BUS_MASTER_PORT_SPS, - MSM_BUS_MASTER_PORT_ADM_PORT0, - MSM_BUS_MASTER_PORT_ADM_PORT1, - MSM_BUS_MASTER_PORT_LPASS_PROC, - MSM_BUS_MASTER_PORT_MSS, - MSM_BUS_SYSTEM_MASTER_PORT_UNUSED_6, - MSM_BUS_MASTER_PORT_RIVA, - MSM_BUS_MASTER_PORT_MSS_SW_PROC, - MSM_BUS_MASTER_PORT_MSS_FW_PROC, - MSM_BUS_MASTER_PORT_LPASS, - MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI, - - MSM_BUS_MASTER_PORT_MDP_PORT0 = 0, - MSM_BUS_MASTER_PORT_MDP_PORT1, - MSM_BUS_MMSS_MASTER_PORT_UNUSED_2, - MSM_BUS_MASTER_PORT_ROTATOR, - MSM_BUS_MASTER_PORT_GRAPHICS_3D, - MSM_BUS_MASTER_PORT_JPEG_DEC, - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE0, - MSM_BUS_MASTER_PORT_VFE, - MSM_BUS_MASTER_PORT_VPE, - MSM_BUS_MASTER_PORT_JPEG_ENC, - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE1, - MSM_BUS_MMSS_MASTER_PORT_APPS_FAB, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT0, - MSM_BUS_MASTER_PORT_HD_CODEC_PORT1, - - MSM_BUS_MASTER_PORT_KMPSS_M0 = 0, - MSM_BUS_MASTER_PORT_KMPSS_M1, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_1, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_1, - -}; - -enum msm_bus_8660_slave_ports_type { - MSM_BUS_MMSS_SLAVE_PORT_UNUSED_0 = 0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_1, - MSM_BUS_SLAVE_PORT_MM_IMEM, - - MSM_BUS_SLAVE_PORT_EBI1_CH0 = 0, - MSM_BUS_SLAVE_PORT_EBI1_CH1, - MSM_BUS_SLAVE_PORT_KMPSS_L2, - MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB, - MSM_BUS_SLAVE_PORT_SYSTEM_FAB, - - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0 = 0, - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_1, - MSM_BUS_SLAVE_PORT_SPS, - MSM_BUS_SLAVE_PORT_SYSTEM_IMEM, - MSM_BUS_SLAVE_PORT_CORESIGHT, - MSM_BUS_SLAVE_PORT_KMPSS, - MSM_BUS_SLAVE_PORT_MSS, - MSM_BUS_SLAVE_PORT_LPASS, - MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB, - MSM_BUS_SLAVE_PORT_RIVA, -}; - -enum msm_bus_8960_sg_master_ports_type { - MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT0 = - MSM_BUS_MMSS_MASTER_PORT_UNUSED_2, - MSM_BUS_MASTER_PORT_VIDEO_CAP = - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE0, - MSM_BUS_MASTER_PORT_VIDEO_DEC = - MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE1, - MSM_BUS_MASTER_PORT_VIDEO_ENC = - MSM_BUS_MASTER_PORT_HD_CODEC_PORT0, -}; - -enum msm_bus_8960_sg_slave_ports_type { - SG_SLAVE_PORT_MM_IMEM = 0, - SG_MMSS_SLAVE_PORT_APPS_FAB_0, - SG_MMSS_SLAVE_PORT_APPS_FAB_1, -}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -static int mport_kmpss_m0[] = {MSM_BUS_MASTER_PORT_KMPSS_M0,}; -static int mport_kmpss_m1[] = {MSM_BUS_MASTER_PORT_KMPSS_M1,}; - -static int mmss_mport_apps_fab[] = {MSM_BUS_MMSS_MASTER_PORT_APPS_FAB,}; -static int system_mport_appss_fab[] = {MSM_BUS_SYSTEM_MASTER_PORT_APPSS_FAB,}; -static int sport_ebi1_ch0[] = { - MSM_BUS_SLAVE_PORT_EBI1_CH0, - MSM_BUS_SLAVE_PORT_EBI1_CH1, -}; -static int sport_ebi1_ch1[] = {MSM_BUS_SLAVE_PORT_EBI1_CH1,}; -static int sport_kmpss_l2[] = {MSM_BUS_SLAVE_PORT_KMPSS_L2,}; -static int appss_sport_mmss_fab[] = {MSM_BUS_APPSS_SLAVE_PORT_MMSS_FAB,}; -static int sport_system_fab[] = {MSM_BUS_SLAVE_PORT_SYSTEM_FAB,}; - -static int tiered_slave_ebi1_ch0[] = { - MSM_BUS_TIERED_SLAVE_EBI1_CH0, - MSM_BUS_TIERED_SLAVE_EBI1_CH1, -}; -static int tiered_slave_ebi1_ch1[] = {MSM_BUS_TIERED_SLAVE_EBI1_CH1,}; - -static int tiered_slave_kmpss[] = {MSM_BUS_TIERED_SLAVE_KMPSS_L2,}; - -static struct msm_bus_node_info apps_fabric_info[] = { - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = mport_kmpss_m0, - .num_mports = ARRAY_SIZE(mport_kmpss_m0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_AMPSS_M1, - .masterp = mport_kmpss_m1, - .num_mports = ARRAY_SIZE(mport_kmpss_m1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi1_ch0, - .num_sports = ARRAY_SIZE(sport_ebi1_ch0), - .tier = tiered_slave_ebi1_ch0, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch0), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_EBI_CH1, - .slavep = sport_ebi1_ch1, - .num_sports = ARRAY_SIZE(sport_ebi1_ch1), - .tier = tiered_slave_ebi1_ch1, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch1), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_AMPSS_L2, - .slavep = sport_kmpss_l2, - .num_sports = ARRAY_SIZE(sport_kmpss_l2), - .tier = tiered_slave_kmpss, - .num_tiers = ARRAY_SIZE(tiered_slave_kmpss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_MMSS, - .gateway = 1, - .slavep = appss_sport_mmss_fab, - .num_sports = ARRAY_SIZE(appss_sport_mmss_fab), - .masterp = mmss_mport_apps_fab, - .num_mports = ARRAY_SIZE(mmss_mport_apps_fab), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = sport_system_fab, - .num_sports = ARRAY_SIZE(sport_system_fab), - .masterp = system_mport_appss_fab, - .num_mports = ARRAY_SIZE(system_mport_appss_fab), - .buswidth = 8, - }, -}; - -static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,}; -static int mport_adm_port0[] = {MSM_BUS_MASTER_PORT_ADM_PORT0,}; -static int mport_adm_port1[] = {MSM_BUS_MASTER_PORT_ADM_PORT1,}; -static int mport_mss[] = {MSM_BUS_MASTER_PORT_MSS,}; -static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,}; -static int system_mport_unused_6[] = {MSM_BUS_SYSTEM_MASTER_PORT_UNUSED_6,}; -static int mport_riva[] = {MSM_BUS_MASTER_PORT_RIVA,}; -static int mport_mss_sw_proc[] = {MSM_BUS_MASTER_PORT_MSS_SW_PROC,}; -static int mport_mss_fw_proc[] = {MSM_BUS_MASTER_PORT_MSS_FW_PROC,}; -static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,}; -static int system_mport_mmss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_MMSS_FPB,}; -static int system_mport_adm_ahb_ci[] = {MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,}; -static int appss_mport_fab_system[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_SYSTEM_1 -}; -static int mport_system_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,}; -static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,}; - -static int system_sport_appss_fab[] = { - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_0, - MSM_BUS_SYSTEM_SLAVE_PORT_APPSS_FAB_1 -}; -static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,}; -static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,}; -static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,}; -static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,}; -static int sport_coresight[] = {MSM_BUS_SLAVE_PORT_CORESIGHT,}; -static int sport_riva[] = {MSM_BUS_SLAVE_PORT_RIVA,}; -static int sport_kmpss[] = {MSM_BUS_SLAVE_PORT_KMPSS,}; -static int sport_mss[] = {MSM_BUS_SLAVE_PORT_MSS,}; -static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,}; -static int sport_mmss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_MMSS_FPB,}; - -static int tiered_slave_system_imem[] = {MSM_BUS_TIERED_SLAVE_SYSTEM_IMEM,}; -static int system_tiered_slave_fab_appss[] = { - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_0, - MSM_BUS_SYSTEM_TIERED_SLAVE_FAB_APPSS_1, -}; - -static struct msm_bus_node_info system_fabric_info[] = { - { - .id = MSM_BUS_MASTER_SPS, - .masterp = mport_sps, - .num_mports = ARRAY_SIZE(mport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT0, - .masterp = mport_adm_port0, - .num_mports = ARRAY_SIZE(mport_adm_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT1, - .masterp = mport_adm_port1, - .num_mports = ARRAY_SIZE(mport_adm_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS, - .masterp = mport_mss, - .num_mports = ARRAY_SIZE(mport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_UNUSED_6, - .masterp = system_mport_unused_6, - .num_mports = ARRAY_SIZE(system_mport_unused_6), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RIVA, - .masterp = mport_riva, - .num_mports = ARRAY_SIZE(mport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_SW_PROC, - .masterp = mport_mss_sw_proc, - .num_mports = ARRAY_SIZE(mport_mss_sw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_FW_PROC, - .masterp = mport_mss_fw_proc, - .num_mports = ARRAY_SIZE(mport_mss_fw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS, - .masterp = mport_lpass, - .num_mports = ARRAY_SIZE(mport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SYSTEM_MASTER_MMSS_FPB, - .masterp = system_mport_mmss_fpb, - .num_mports = ARRAY_SIZE(system_mport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM0_CI, - .masterp = system_mport_adm_ahb_ci, - .num_mports = ARRAY_SIZE(system_mport_adm_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = system_sport_appss_fab, - .num_sports = ARRAY_SIZE(system_sport_appss_fab), - .masterp = appss_mport_fab_system, - .num_mports = ARRAY_SIZE(appss_mport_fab_system), - .tier = system_tiered_slave_fab_appss, - .num_tiers = ARRAY_SIZE(system_tiered_slave_fab_appss), - .buswidth = 8, - }, - { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_FAB_CPSS_FPB, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_SLAVE_SPS, - .slavep = sport_sps, - .num_sports = ARRAY_SIZE(sport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "dfab_clk", - .slaveclk[ACTIVE_CTX] = "dfab_a_clk", - }, - { - .id = MSM_BUS_SLAVE_SYSTEM_IMEM, - .slavep = sport_system_imem, - .num_sports = ARRAY_SIZE(sport_system_imem), - .tier = tiered_slave_system_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_system_imem), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_CORESIGHT, - .slavep = sport_coresight, - .num_sports = ARRAY_SIZE(sport_coresight), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_RIVA, - .slavep = sport_riva, - .num_sports = ARRAY_SIZE(sport_riva), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_kmpss, - .num_sports = ARRAY_SIZE(sport_kmpss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_MSS, - .slavep = sport_mss, - .num_sports = ARRAY_SIZE(sport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SYSTEM_SLAVE_MMSS_FPB, - .slavep = sport_mmss_fpb, - .num_sports = ARRAY_SIZE(sport_mmss_fpb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, -}; - -static int mport_mdp[] = {MSM_BUS_MASTER_PORT_MDP_PORT0,}; -static int mport_mdp1[] = {MSM_BUS_MASTER_PORT_MDP_PORT1,}; -static int mport_rotator[] = {MSM_BUS_MASTER_PORT_ROTATOR,}; -static int mport_graphics_3d[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D,}; -static int pro_mport_graphics_3d[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D_PORT0,}; -static int pro_mport_graphics_3d_p1[] = {MSM_BUS_MASTER_PORT_GRAPHICS_3D,}; -static int mport_jpeg_dec[] = {MSM_BUS_MASTER_PORT_JPEG_DEC,}; -static int mport_graphics_2d_core0[] = {MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE0,}; -static int mport_vfe[] = {MSM_BUS_MASTER_PORT_VFE,}; -static int mport_vpe[] = {MSM_BUS_MASTER_PORT_VPE,}; -static int mport_jpeg_enc[] = {MSM_BUS_MASTER_PORT_JPEG_ENC,}; -static int mport_graphics_2d_core1[] = {MSM_BUS_MASTER_PORT_GRAPHICS_2D_CORE1,}; -static int mport_hd_codec_port0[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT0,}; -static int mport_hd_codec_port1[] = {MSM_BUS_MASTER_PORT_HD_CODEC_PORT1,}; -static int mport_video_cap[] = {MSM_BUS_MASTER_PORT_VIDEO_CAP}; -static int mport_video_enc[] = {MSM_BUS_MASTER_PORT_VIDEO_ENC}; -static int mport_video_dec[] = {MSM_BUS_MASTER_PORT_VIDEO_DEC}; -static int appss_mport_fab_mmss[] = { - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_0, - MSM_BUS_APPSS_MASTER_PORT_FAB_MMSS_1 -}; - -static int mmss_sport_apps_fab[] = { - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_0, - MSM_BUS_MMSS_SLAVE_PORT_APPS_FAB_1, -}; -static int sg_sport_apps_fab[] = { - SG_MMSS_SLAVE_PORT_APPS_FAB_0, - SG_MMSS_SLAVE_PORT_APPS_FAB_1, -}; -static int sport_mm_imem[] = {MSM_BUS_SLAVE_PORT_MM_IMEM,}; -static int sg_sport_mm_imem[] = {SG_SLAVE_PORT_MM_IMEM,}; - -static int mmss_tiered_slave_fab_apps[] = { - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_0, - MSM_BUS_MMSS_TIERED_SLAVE_FAB_APPS_1, -}; -static int sg_tiered_slave_fab_apps[] = { - SG_MMSS_TIERED_SLAVE_FAB_APPS_0, - SG_MMSS_TIERED_SLAVE_FAB_APPS_1, -}; -static int tiered_slave_mm_imem[] = {MSM_BUS_TIERED_SLAVE_MM_IMEM,}; -static int sg_tiered_slave_mm_imem[] = {SG_TIERED_SLAVE_MM_IMEM,}; - - -static struct msm_bus_node_info mmss_fabric_info[] = { - { - .id = MSM_BUS_MASTER_MDP_PORT0, - .masterp = mport_mdp, - .num_mports = ARRAY_SIZE(mport_mdp), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MDP_PORT1, - .masterp = mport_mdp1, - .num_mports = ARRAY_SIZE(mport_mdp1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ROTATOR, - .masterp = mport_rotator, - .num_mports = ARRAY_SIZE(mport_rotator), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D, - .masterp = mport_graphics_3d, - .num_mports = ARRAY_SIZE(mport_graphics_3d), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_DEC, - .masterp = mport_jpeg_dec, - .num_mports = ARRAY_SIZE(mport_jpeg_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_2D_CORE0, - .masterp = mport_graphics_2d_core0, - .num_mports = ARRAY_SIZE(mport_graphics_2d_core0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VFE, - .masterp = mport_vfe, - .num_mports = ARRAY_SIZE(mport_vfe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VPE, - .masterp = mport_vpe, - .num_mports = ARRAY_SIZE(mport_vpe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_ENC, - .masterp = mport_jpeg_enc, - .num_mports = ARRAY_SIZE(mport_jpeg_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - /* This port has been added for V2. It is absent in V1 */ - { - .id = MSM_BUS_MASTER_GRAPHICS_2D_CORE1, - .masterp = mport_graphics_2d_core1, - .num_mports = ARRAY_SIZE(mport_graphics_2d_core1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT0, - .masterp = mport_hd_codec_port0, - .num_mports = ARRAY_SIZE(mport_hd_codec_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_HD_CODEC_PORT1, - .masterp = mport_hd_codec_port1, - .num_mports = ARRAY_SIZE(mport_hd_codec_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = mmss_sport_apps_fab, - .num_sports = ARRAY_SIZE(mmss_sport_apps_fab), - .masterp = appss_mport_fab_mmss, - .num_mports = ARRAY_SIZE(appss_mport_fab_mmss), - .tier = mmss_tiered_slave_fab_apps, - .num_tiers = ARRAY_SIZE(mmss_tiered_slave_fab_apps), - .buswidth = 16, - }, - { - .id = MSM_BUS_SLAVE_MM_IMEM, - .slavep = sport_mm_imem, - .num_sports = ARRAY_SIZE(sport_mm_imem), - .tier = tiered_slave_mm_imem, - .num_tiers = ARRAY_SIZE(tiered_slave_mm_imem), - .buswidth = 8, - }, -}; - -static struct msm_bus_node_info sg_mmss_fabric_info[] = { - { - .id = MSM_BUS_MASTER_MDP_PORT0, - .masterp = mport_mdp, - .num_mports = ARRAY_SIZE(mport_mdp), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MDP_PORT1, - .masterp = mport_mdp1, - .num_mports = ARRAY_SIZE(mport_mdp1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ROTATOR, - .masterp = mport_rotator, - .num_mports = ARRAY_SIZE(mport_rotator), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D, - .masterp = pro_mport_graphics_3d, - .num_mports = ARRAY_SIZE(pro_mport_graphics_3d), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, - .masterp = pro_mport_graphics_3d_p1, - .num_mports = ARRAY_SIZE(pro_mport_graphics_3d_p1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_DEC, - .masterp = mport_jpeg_dec, - .num_mports = ARRAY_SIZE(mport_jpeg_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VIDEO_CAP, - .masterp = mport_video_cap, - .num_mports = ARRAY_SIZE(mport_video_cap), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VFE, - .masterp = mport_vfe, - .num_mports = ARRAY_SIZE(mport_vfe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VPE, - .masterp = mport_vpe, - .num_mports = ARRAY_SIZE(mport_vpe), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_JPEG_ENC, - .masterp = mport_jpeg_enc, - .num_mports = ARRAY_SIZE(mport_jpeg_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - /* This port has been added for V2. It is absent in V1 */ - { - .id = MSM_BUS_MASTER_VIDEO_DEC, - .masterp = mport_video_dec, - .num_mports = ARRAY_SIZE(mport_video_dec), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_VIDEO_ENC, - .masterp = mport_video_enc, - .num_mports = ARRAY_SIZE(mport_video_enc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_APPSS, - .gateway = 1, - .slavep = sg_sport_apps_fab, - .num_sports = ARRAY_SIZE(sg_sport_apps_fab), - .masterp = appss_mport_fab_mmss, - .num_mports = ARRAY_SIZE(appss_mport_fab_mmss), - .tier = sg_tiered_slave_fab_apps, - .num_tiers = ARRAY_SIZE(sg_tiered_slave_fab_apps), - .buswidth = 16, - }, - { - .id = MSM_BUS_SLAVE_MM_IMEM, - .slavep = sg_sport_mm_imem, - .num_sports = ARRAY_SIZE(sg_sport_mm_imem), - .tier = sg_tiered_slave_mm_imem, - .num_tiers = ARRAY_SIZE(sg_tiered_slave_mm_imem), - .buswidth = 8, - }, -}; - -static struct msm_bus_node_info sys_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_MASTER_SPDM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_RPM, - .ahb = 1, - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_SLAVE_SPDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_RPM_MSG_RAM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MPM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_B, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC1_SSBI1_C, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_A, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_PMIC2_SSBI2_B, - .buswidth = 4, - .ahb = 1, - }, -}; - -static struct msm_bus_node_info cpss_fpb_fabric_info[] = { - { - .id = MSM_BUS_FAB_SYSTEM, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_UART, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI1_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI2_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI3_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI4_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI5_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI6_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI7_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI8_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI9_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI10_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI11_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_GSBI12_QUP, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_NAND, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS0, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS3, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS4, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_EBI2_CS5, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS1, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_USB_FS2, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_TSIF, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TSSC, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PDM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_DIMEM, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_TCSR, - .buswidth = 8, - .ahb = 1, - }, - { - .id = MSM_BUS_SLAVE_MSM_PRNG, - .buswidth = 4, - .ahb = 1, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - else - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } else - fabreg->info[i].priv_id = fabreg->info[i].id; - } -} - -static int msm_bus_board_8960_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return CHECK_ID(((id < SLAVE_ID_KEY) ? master_iids[id] : - slave_iids[id - SLAVE_ID_KEY]), id); -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_8960, - .get_iid = msm_bus_board_8960_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_8960_apps_fabric_pdata = { - .id = MSM_BUS_FAB_APPSS, - .name = "msm_apps_fab", - .info = apps_fabric_info, - .len = ARRAY_SIZE(apps_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_APPS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_APPS_FABRIC_ARB_0, - .nmasters = 6, - .nslaves = 5, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8960_sys_fabric_pdata = { - .id = MSM_BUS_FAB_SYSTEM, - .name = "msm_sys_fab", - system_fabric_info, - ARRAY_SIZE(system_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0, - .nmasters = 15, - .nslaves = 12, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8960_mm_fabric_pdata = { - .id = MSM_BUS_FAB_MMSS, - .name = "msm_mm_fab", - mmss_fabric_info, - ARRAY_SIZE(mmss_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_MM_FABRIC_ARB_0, - .nmasters = 14, - .nslaves = 4, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8960_sg_mm_fabric_pdata = { - .id = MSM_BUS_FAB_MMSS, - .name = "msm_mm_fab", - sg_mmss_fabric_info, - ARRAY_SIZE(sg_mmss_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_MM_FABRIC_ARB_0, - .nmasters = 13, - .nslaves = 3, - .ntieredslaves = 3, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8960_sys_fpb_pdata = { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .name = "msm_sys_fpb", - sys_fpb_fabric_info, - ARRAY_SIZE(sys_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_8960_cpss_fpb_pdata = { - .id = MSM_BUS_FAB_CPSS_FPB, - .name = "msm_cpss_fpb", - cpss_fpb_fabric_info, - ARRAY_SIZE(cpss_fpb_fabric_info), - .ahb = 1, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -int msm_bus_board_rpm_get_il_ids(uint16_t id[]) -{ - id[0] = MSM_RPM_STATUS_ID_EBI1_CH0_RANGE; - id[1] = MSM_RPM_STATUS_ID_EBI1_CH1_RANGE; - return 0; -} - -void msm_bus_board_init(struct msm_bus_fabric_registration *pdata) -{ -} diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_9615.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_9615.c deleted file mode 100644 index 862bb46801b4..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_9615.c +++ /dev/null @@ -1,317 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" - -#define NMASTERS 14 -#define NSLAVES 12 -#define NFAB_9615 2 - -enum msm_bus_fabric_tiered_slave_type { - MSM_BUS_TIERED_SLAVE_EBI1_CH0 = 1, -}; - -enum msm_bus_9615_master_ports_type { - MSM_BUS_MASTER_PORT_SPS = 0, - MSM_BUS_MASTER_PORT_APSS_PROC, - MSM_BUS_MASTER_PORT_ADM_PORT0, - MSM_BUS_MASTER_PORT_ADM_PORT1, - MSM_BUS_MASTER_PORT_LPASS_PROC, - MSM_BUS_MASTER_PORT_MSS, - MSM_BUS_MASTER_PORT_MSS_SW_PROC, - MSM_BUS_MASTER_PORT_MSS_FW_PROC, - MSM_BUS_MASTER_PORT_LPASS, - MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB, - MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI, -}; - -enum msm_bus_9615_slave_ports_type { - MSM_BUS_SLAVE_PORT_SPS = 0, - MSM_BUS_SLAVE_PORT_EBI1_CH0, - MSM_BUS_SLAVE_PORT_APSS_L2, - MSM_BUS_SLAVE_PORT_SYSTEM_IMEM, - MSM_BUS_SLAVE_PORT_CORESIGHT, - MSM_BUS_SLAVE_PORT_APSS, - MSM_BUS_SLAVE_PORT_MSS, - MSM_BUS_SLAVE_PORT_LPASS, - MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB, - MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB, -}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -static int sport_ebi1_ch0[] = {MSM_BUS_SLAVE_PORT_EBI1_CH0,}; -static int sport_apss_l2[] = {MSM_BUS_SLAVE_PORT_APSS_L2,}; - -static int tiered_slave_ebi1_ch0[] = {MSM_BUS_TIERED_SLAVE_EBI1_CH0,}; - -static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,}; -static int mport_apss_proc[] = {MSM_BUS_MASTER_PORT_APSS_PROC,}; -static int mport_adm_port0[] = {MSM_BUS_MASTER_PORT_ADM_PORT0,}; -static int mport_adm_port1[] = {MSM_BUS_MASTER_PORT_ADM_PORT1,}; -static int mport_mss[] = {MSM_BUS_MASTER_PORT_MSS,}; -static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,}; -static int mport_mss_sw_proc[] = {MSM_BUS_MASTER_PORT_MSS_SW_PROC,}; -static int mport_mss_fw_proc[] = {MSM_BUS_MASTER_PORT_MSS_FW_PROC,}; -static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,}; -static int system_mport_adm_ahb_ci[] = {MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,}; -static int mport_system_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,}; -static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,}; - -static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,}; -static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,}; -static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,}; -static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,}; -static int sport_coresight[] = {MSM_BUS_SLAVE_PORT_CORESIGHT,}; -static int sport_apss[] = {MSM_BUS_SLAVE_PORT_APSS,}; -static int sport_mss[] = {MSM_BUS_SLAVE_PORT_MSS,}; -static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,}; - -static struct msm_bus_node_info system_fabric_info[] = { - { - .id = MSM_BUS_MASTER_SPS, - .masterp = mport_sps, - .num_mports = ARRAY_SIZE(mport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT0, - .masterp = mport_adm_port0, - .num_mports = ARRAY_SIZE(mport_adm_port0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM_PORT1, - .masterp = mport_adm_port1, - .num_mports = ARRAY_SIZE(mport_adm_port1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS, - .masterp = mport_mss, - .num_mports = ARRAY_SIZE(mport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = mport_apss_proc, - .num_mports = ARRAY_SIZE(mport_apss_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_SW_PROC, - .masterp = mport_mss_sw_proc, - .num_mports = ARRAY_SIZE(mport_mss_sw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_MSS_FW_PROC, - .masterp = mport_mss_fw_proc, - .num_mports = ARRAY_SIZE(mport_mss_fw_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_LPASS, - .masterp = mport_lpass, - .num_mports = ARRAY_SIZE(mport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_MASTER_ADM0_CI, - .masterp = system_mport_adm_ahb_ci, - .num_mports = ARRAY_SIZE(system_mport_adm_ahb_ci), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - }, - { - .id = MSM_BUS_FAB_SYSTEM_FPB, - .gateway = 1, - .slavep = system_sport_system_fpb, - .num_sports = ARRAY_SIZE(system_sport_system_fpb), - .masterp = mport_system_fpb, - .num_mports = ARRAY_SIZE(mport_system_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_FAB_CPSS_FPB, - .gateway = 1, - .slavep = system_sport_cpss_fpb, - .num_sports = ARRAY_SIZE(system_sport_cpss_fpb), - .masterp = system_mport_cpss_fpb, - .num_mports = ARRAY_SIZE(system_mport_cpss_fpb), - .buswidth = 4, - }, - { - .id = MSM_BUS_SLAVE_SPS, - .slavep = sport_sps, - .num_sports = ARRAY_SIZE(sport_sps), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "dfab_clk", - .slaveclk[ACTIVE_CTX] = "dfab_a_clk", - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi1_ch0, - .num_sports = ARRAY_SIZE(sport_ebi1_ch0), - .tier = tiered_slave_ebi1_ch0, - .num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch0), - .buswidth = 8, - .slaveclk[DUAL_CTX] = "mem_clk", - .slaveclk[ACTIVE_CTX] = "mem_a_clk", - }, - { - .id = MSM_BUS_SLAVE_SYSTEM_IMEM, - .slavep = sport_system_imem, - .num_sports = ARRAY_SIZE(sport_system_imem), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_CORESIGHT, - .slavep = sport_coresight, - .num_sports = ARRAY_SIZE(sport_coresight), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_apss, - .num_sports = ARRAY_SIZE(sport_apss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_AMPSS_L2, - .slavep = sport_apss_l2, - .num_sports = ARRAY_SIZE(sport_apss_l2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_MSS, - .slavep = sport_mss, - .num_sports = ARRAY_SIZE(sport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - else - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } else - fabreg->info[i].priv_id = fabreg->info[i].id; - } -} - -static int msm_bus_board_9615_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return ((id < SLAVE_ID_KEY) ? master_iids[id] : slave_iids[id - - SLAVE_ID_KEY]); -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_9615, - .get_iid = msm_bus_board_9615_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_9615_sys_fabric_pdata = { - .id = MSM_BUS_FAB_SYSTEM, - .name = "msm_sys_fab", - system_fabric_info, - ARRAY_SIZE(system_fabric_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0, - .offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0, - .nmasters = 12, - .nslaves = 10, - .ntieredslaves = 1, - .board_algo = &msm_bus_board_algo, -}; - -struct msm_bus_fabric_registration msm_bus_9615_def_fab_pdata = { - .id = MSM_BUS_FAB_DEFAULT, - .name = "msm_def_fab", - .ahb = 1, - .nmasters = 0, - .nslaves = 0, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, -}; - -int msm_bus_board_rpm_get_il_ids(uint16_t id[]) -{ - return -ENXIO; -} - -void msm_bus_board_init(struct msm_bus_fabric_registration *pdata) -{ -} diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_9625.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_9625.c deleted file mode 100644 index 77fecf7404ef..000000000000 --- a/arch/arm/mach-msm/msm_bus/msm_bus_board_9625.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_bus_core.h" -#include "msm_bus_noc.h" -#include "msm_bus_bimc.h" - -#define NMASTERS 120 -#define NSLAVES 150 -#define NFAB_9625 4 - -enum msm_bus_9625_master_ports_type { - /* System NOC Masters */ - MASTER_PORT_LPASS_AHB = 0, - MASTER_PORT_QDSS_BAM, - MASTER_PORT_SNOC_CFG, - MASTER_PORT_GW_BIMC_SNOC, - MASTER_PORT_GW_CNOC_SNOC, - MASTER_PORT_CRYPTO_CORE0, - MASTER_PORT_LPASS_PROC, - MASTER_PORT_MSS, - MASTER_PORT_MSS_NAV, - MASTER_PORT_IPA, - MASTER_PORT_GW_PNOC_SNOC, - MASTER_PORT_QDSS_ETR, - - /* BIMC Masters */ - MASTER_PORT_KMPSS_M0 = 0, - MASTER_PORT_MSS_PROC, - MASTER_PORT_GW_SNOC_BIMC_0, - - /* Peripheral NOC Masters */ - MASTER_PORT_QPIC = 0, - MASTER_PORT_SDCC_1, - MASTER_PORT_SDCC_3, - MASTER_PORT_SDCC_2, - MASTER_PORT_SDCC_4, - MASTER_PORT_TSIF, - MASTER_PORT_BAM_DMA, - MASTER_PORT_BLSP_2, - MASTER_PORT_USB_HSIC, - MASTER_PORT_BLSP_1, - MASTER_PORT_USB_HS1, - MASTER_PORT_USB_HS2, - MASTER_PORT_PNOC_CFG, - MASTER_PORT_GW_SNOC_PNOC, - - /* Config NOC Masters */ - MASTER_PORT_RPM_INST = 0, - MASTER_PORT_RPM_DATA, - MASTER_PORT_RPM_SYS, - MASTER_PORT_DEHR, - MASTER_PORT_QDSS_DAP, - MASTER_PORT_SPDM, - MASTER_PORT_TIC, - MASTER_PORT_GW_SNOC_CNOC, -}; - -enum msm_bus_9625_slave_ports_type { - /* System NOC Slaves */ - SLAVE_PORT_KMPSS = 1, - SLAVE_PORT_LPASS, - SLAVE_PORT_GW_SNOC_BIMC_P0, - SLAVE_PORT_GW_SNOC_CNOC, - SLAVE_PORT_OCIMEM, - SLAVE_PORT_GW_SNOC_PNOC, - SLAVE_PORT_SERVICE_SNOC, - SLAVE_PORT_QDSS_STM, - - /* BIMC Slaves */ - SLAVE_PORT_EBI1_CH0 = 0, - SLAVE_PORT_GW_BIMC_SNOC, - - /*Peripheral NOC Slaves */ - SLAVE_PORT_QPIC = 0, - SLAVE_PORT_SDCC_1, - SLAVE_PORT_SDCC_3, - SLAVE_PORT_SDCC_2, - SLAVE_PORT_SDCC_4, - SLAVE_PORT_TSIF, - SLAVE_PORT_BAM_DMA, - SLAVE_PORT_BLSP_2, - SLAVE_PORT_USB_HSIC, - SLAVE_PORT_BLSP_1, - SLAVE_PORT_USB_HS1, - SLAVE_PORT_USB_HS2, - SLAVE_PORT_PDM, - SLAVE_PORT_PERIPH_APU_CFG, - SLAVE_PORT_PNOC_MPU_CFG, - SLAVE_PORT_PRNG, - SLAVE_PORT_GW_PNOC_SNOC, - SLAVE_PORT_SERVICE_PNOC, - - /* Config NOC slaves */ - SLAVE_PORT_CLK_CTL = 0, - SLAVE_PORT_CNOC_MSS, - SLAVE_PORT_SECURITY, - SLAVE_PORT_TCSR, - SLAVE_PORT_TLMM, - SLAVE_PORT_CRYPTO_0_CFG, - SLAVE_PORT_IMEM_CFG, - SLAVE_PORT_IPS_CFG, - SLAVE_PORT_MESSAGE_RAM, - SLAVE_PORT_BIMC_CFG, - SLAVE_PORT_BOOT_ROM, - SLAVE_PORT_PMIC_ARB, - SLAVE_PORT_SPDM_WRAPPER, - SLAVE_PORT_DEHR_CFG, - SLAVE_PORT_MPM, - SLAVE_PORT_QDSS_CFG, - SLAVE_PORT_RBCPR_CFG, - SLAVE_PORT_RBCPR_QDSS_APU_CFG, - SLAVE_PORT_SNOC_MPU_CFG, - SLAVE_PORT_PNOC_CFG, - SLAVE_PORT_SNOC_CFG, - SLAVE_PORT_PHY_APU_CFG, - SLAVE_PORT_EBI1_PHY_CFG, - SLAVE_PORT_RPM, - SLAVE_PORT_GW_CNOC_SNOC, - SLAVE_PORT_SERVICE_CNOC, -}; - -/* Hardware IDs for RPM */ -enum msm_bus_9625_mas_hw_id { - MAS_APPSS_PROC = 0, - MAS_AMSS_PROC, - MAS_MNOC_BIMC, - MAS_SNOC_BIMC, - MAS_CNOC_MNOC_MMSS_CFG, - MAS_CNOC_MNOC_CFG, - MAS_GFX3D, - MAS_JPEG, - MAS_MDP, - MAS_VIDEO_P0, - MAS_VIDEO_P1, - MAS_VFE, - MAS_CNOC_ONOC_CFG, - MAS_JPEG_OCMEM, - MAS_MDP_OCMEM, - MAS_VIDEO_P0_OCMEM, - MAS_VIDEO_P1_OCMEM, - MAS_VFE_OCMEM, - MAS_LPASS_AHB, - MAS_QDSS_BAM, - MAS_SNOC_CFG, - MAS_BIMC_SNOC, - MAS_CNOC_SNOC, - MAS_CRYPTO_CORE0, - MAS_CRYPTO_CORE1, - MAS_LPASS_PROC, - MAS_MSS, - MAS_MSS_NAV, - MAS_OCMEM_DMA, - MAS_PNOC_SNOC, - MAS_WCSS, - MAS_QDSS_ETR, - MAS_USB3, - MAS_SDCC_1, - MAS_SDCC_3, - MAS_SDCC_2, - MAS_SDCC_4, - MAS_TSIF, - MAS_BAM_DMA, - MAS_BLSP_2, - MAS_USB_HSIC, - MAS_BLSP_1, - MAS_USB_HS, - MAS_PNOC_CFG, - MAS_SNOC_PNOC, - MAS_RPM_INST, - MAS_RPM_DATA, - MAS_RPM_SYS, - MAS_DEHR, - MAS_QDSS_DAP, - MAS_SPDM, - MAS_TIC, - MAS_SNOC_CNOC, - MAS_OVNOC_SNOC, - MAS_OVNOC_ONOC, - MAS_V_OCMEM_GFX3D, - MAS_ONOC_OVNOC, - MAS_SNOC_OVNOC, - MAS_QPIC, - MAS_IPA, -}; - -enum msm_bus_9625_slv_hw_id { - SLV_EBI = 0, - SLV_APSS_L2, - SLV_BIMC_SNOC, - SLV_CAMERA_CFG, - SLV_DISPLAY_CFG, - SLV_OCMEM_CFG, - SLV_CPR_CFG, - SLV_CPR_XPU_CFG, - SLV_MISC_CFG, - SLV_MISC_XPU_CFG, - SLV_VENUS_CFG, - SLV_GFX3D_CFG, - SLV_MMSS_CLK_CFG, - SLV_MMSS_CLK_XPU_CFG, - SLV_MNOC_MPU_CFG, - SLV_ONOC_MPU_CFG, - SLV_MMSS_BIMC, - SLV_SERVICE_MNOC, - SLV_OCMEM, - SLV_SERVICE_ONOC, - SLV_APPSS, - SLV_LPASS, - SLV_USB3, - SLV_WCSS, - SLV_SNOC_BIMC, - SLV_SNOC_CNOC, - SLV_OCIMEM, - SLV_SNOC_OCMEM, - SLV_SNOC_PNOC, - SLV_SERVICE_SNOC, - SLV_QDSS_STM, - SLV_SDCC_1, - SLV_SDCC_3, - SLV_SDCC_2, - SLV_SDCC_4, - SLV_TSIF, - SLV_BAM_DMA, - SLV_BLSP_2, - SLV_USB_HSIC, - SLV_BLSP_1, - SLV_USB_HS, - SLV_PDM, - SLV_PERIPH_APU_CFG, - SLV_MPU_CFG, - SLV_PRNG, - SLV_PNOC_SNOC, - SLV_SERVICE_PNOC, - SLV_CLK_CTL, - SLV_CNOC_MSS, - SLV_SECURITY, - SLV_TCSR, - SLV_TLMM, - SLV_CRYPTO_0_CFG, - SLV_CRYPTO_1_CFG, - SLV_IMEM_CFG, - SLV_MESSAGE_RAM, - SLV_BIMC_CFG, - SLV_BOOT_ROM, - SLV_CNOC_MNOC_MMSS_CFG, - SLV_PMIC_ARB, - SLV_SPDM_WRAPPER, - SLV_DEHR_CFG, - SLV_MPM, - SLV_QDSS_CFG, - SLV_RBCPR_CFG, - SLV_RBCPR_QDSS_APU_CFG, - SLV_CNOC_MNOC_CFG, - SLV_SNOC_MPU_CFG, - SLV_CNOC_ONOC_CFG, - SLV_PNOC_CFG, - SLV_SNOC_CFG, - SLV_EBI1_DLL_CFG, - SLV_PHY_APU_CFG, - SLV_EBI1_PHY_CFG, - SLV_RPM, - SLV_CNOC_SNOC, - SLV_SERVICE_CNOC, - SLV_SNOC_OVNOC, - SLV_ONOC_OVNOC, - SLV_USB_HS2, - SLV_QPIC, - SLV_IPS_CFG, -}; - -static uint32_t master_iids[NMASTERS]; -static uint32_t slave_iids[NSLAVES]; - -/* System NOC nodes */ -static int mport_lpass_ahb[] = {MASTER_PORT_LPASS_AHB,}; -static int mport_qdss_bam[] = {MASTER_PORT_QDSS_BAM,}; -static int mport_snoc_cfg[] = {MASTER_PORT_SNOC_CFG,}; -static int mport_gw_bimc_snoc[] = {MASTER_PORT_GW_BIMC_SNOC,}; -static int mport_gw_cnoc_snoc[] = {MASTER_PORT_GW_CNOC_SNOC,}; -static int mport_crypto_core0[] = {MASTER_PORT_CRYPTO_CORE0,}; -static int mport_lpass_proc[] = {MASTER_PORT_LPASS_PROC}; -static int mport_mss[] = {MASTER_PORT_MSS}; -static int mport_mss_nav[] = {MASTER_PORT_MSS_NAV}; -static int mport_ipa[] = {MASTER_PORT_IPA}; -static int mport_gw_pnoc_snoc[] = {MASTER_PORT_GW_PNOC_SNOC}; -static int mport_qdss_etr[] = {MASTER_PORT_QDSS_ETR}; - -static int sport_kmpss[] = {SLAVE_PORT_KMPSS}; -static int sport_lpass[] = {SLAVE_PORT_LPASS}; -static int sport_gw_snoc_bimc[] = {SLAVE_PORT_GW_SNOC_BIMC_P0}; -static int sport_gw_snoc_cnoc[] = {SLAVE_PORT_GW_SNOC_CNOC}; -static int sport_ocimem[] = {SLAVE_PORT_OCIMEM}; -static int sport_gw_snoc_pnoc[] = {SLAVE_PORT_GW_SNOC_PNOC}; -static int sport_service_snoc[] = {SLAVE_PORT_SERVICE_SNOC}; -static int sport_qdss_stm[] = {SLAVE_PORT_QDSS_STM}; - -/* BIMC Nodes */ - -static int mport_kmpss_m0[] = {MASTER_PORT_KMPSS_M0,}; -static int mport_mss_proc[] = {MASTER_PORT_MSS_PROC}; -static int mport_gw_snoc_bimc[] = {MASTER_PORT_GW_SNOC_BIMC_0}; - -static int sport_ebi1[] = {SLAVE_PORT_EBI1_CH0}; -static int sport_gw_bimc_snoc[] = {SLAVE_PORT_GW_BIMC_SNOC,}; - -/* Peripheral NOC Nodes */ -static int mport_sdcc_1[] = {MASTER_PORT_SDCC_1,}; -static int mport_sdcc_3[] = {MASTER_PORT_SDCC_3,}; -static int mport_sdcc_2[] = {MASTER_PORT_SDCC_2,}; -static int mport_sdcc_4[] = {MASTER_PORT_SDCC_4,}; -static int mport_tsif[] = {MASTER_PORT_TSIF,}; -static int mport_bam_dma[] = {MASTER_PORT_BAM_DMA,}; -static int mport_blsp_2[] = {MASTER_PORT_BLSP_2,}; -static int mport_usb_hsic[] = {MASTER_PORT_USB_HSIC,}; -static int mport_usb_hs1[] = {MASTER_PORT_USB_HS1,}; -static int mport_usb_hs2[] = {MASTER_PORT_USB_HS2,}; -static int mport_blsp_1[] = {MASTER_PORT_BLSP_1,}; -static int mport_pnoc_cfg[] = {MASTER_PORT_PNOC_CFG,}; -static int mport_qpic[] = {MASTER_PORT_QPIC,}; -static int mport_gw_snoc_pnoc[] = {MASTER_PORT_GW_SNOC_PNOC,}; - -static int sport_sdcc_1[] = {SLAVE_PORT_SDCC_1,}; -static int sport_sdcc_3[] = {SLAVE_PORT_SDCC_3,}; -static int sport_sdcc_2[] = {SLAVE_PORT_SDCC_2,}; -static int sport_sdcc_4[] = {SLAVE_PORT_SDCC_4,}; -static int sport_tsif[] = {SLAVE_PORT_TSIF,}; -static int sport_qpic[] = {SLAVE_PORT_QPIC,}; -static int sport_bam_dma[] = {SLAVE_PORT_BAM_DMA,}; -static int sport_blsp_2[] = {SLAVE_PORT_BLSP_2,}; -static int sport_usb_hsic[] = {SLAVE_PORT_USB_HSIC,}; -static int sport_blsp_1[] = {SLAVE_PORT_BLSP_1,}; -static int sport_pdm[] = {SLAVE_PORT_PDM,}; -static int sport_periph_apu_cfg[] = { - SLAVE_PORT_PERIPH_APU_CFG, -}; -static int sport_pnoc_mpu_cfg[] = {SLAVE_PORT_PNOC_MPU_CFG,}; -static int sport_prng[] = {SLAVE_PORT_PRNG,}; -static int sport_gw_pnoc_snoc[] = {SLAVE_PORT_GW_PNOC_SNOC,}; -static int sport_service_pnoc[] = {SLAVE_PORT_SERVICE_PNOC,}; - -/* Config NOC Nodes */ -static int mport_rpm_inst[] = {MASTER_PORT_RPM_INST,}; -static int mport_rpm_data[] = {MASTER_PORT_RPM_DATA,}; -static int mport_rpm_sys[] = {MASTER_PORT_RPM_SYS,}; -static int mport_dehr[] = {MASTER_PORT_DEHR,}; -static int mport_qdss_dap[] = {MASTER_PORT_QDSS_DAP,}; -static int mport_spdm[] = {MASTER_PORT_SPDM,}; -static int mport_tic[] = {MASTER_PORT_TIC,}; -static int mport_gw_snoc_cnoc[] = {MASTER_PORT_GW_SNOC_CNOC,}; - -static int sport_clk_ctl[] = {SLAVE_PORT_CLK_CTL,}; -static int sport_cnoc_mss[] = {SLAVE_PORT_CNOC_MSS,}; -static int sport_security[] = {SLAVE_PORT_SECURITY,}; -static int sport_tcsr[] = {SLAVE_PORT_TCSR,}; -static int sport_tlmm[] = {SLAVE_PORT_TLMM,}; -static int sport_crypto_0_cfg[] = {SLAVE_PORT_CRYPTO_0_CFG,}; -static int sport_imem_cfg[] = {SLAVE_PORT_IMEM_CFG,}; -static int sport_ips_cfg[] = {SLAVE_PORT_IPS_CFG,}; -static int sport_message_ram[] = {SLAVE_PORT_MESSAGE_RAM,}; -static int sport_bimc_cfg[] = {SLAVE_PORT_BIMC_CFG,}; -static int sport_boot_rom[] = {SLAVE_PORT_BOOT_ROM,}; -static int sport_pmic_arb[] = {SLAVE_PORT_PMIC_ARB,}; -static int sport_spdm_wrapper[] = {SLAVE_PORT_SPDM_WRAPPER,}; -static int sport_dehr_cfg[] = {SLAVE_PORT_DEHR_CFG,}; -static int sport_mpm[] = {SLAVE_PORT_MPM,}; -static int sport_qdss_cfg[] = {SLAVE_PORT_QDSS_CFG,}; -static int sport_rbcpr_cfg[] = {SLAVE_PORT_RBCPR_CFG,}; -static int sport_rbcpr_qdss_apu_cfg[] = {SLAVE_PORT_RBCPR_QDSS_APU_CFG,}; -static int sport_snoc_mpu_cfg[] = {SLAVE_PORT_SNOC_MPU_CFG,}; -static int sport_pnoc_cfg[] = {SLAVE_PORT_PNOC_CFG,}; -static int sport_snoc_cfg[] = {SLAVE_PORT_SNOC_CFG,}; -static int sport_phy_apu_cfg[] = {SLAVE_PORT_PHY_APU_CFG,}; -static int sport_ebi1_phy_cfg[] = {SLAVE_PORT_EBI1_PHY_CFG,}; -static int sport_rpm[] = {SLAVE_PORT_RPM,}; -static int sport_gw_cnoc_snoc[] = {SLAVE_PORT_GW_CNOC_SNOC,}; -static int sport_service_cnoc[] = {SLAVE_PORT_SERVICE_CNOC,}; - -static int tier2[] = {MSM_BUS_BW_TIER2,}; - -/* - * QOS Ports defined only when qos ports are different than - * master ports - **/ -static int qports_crypto_c0[] = {2}; -static int qports_lpass_proc[] = {4}; -static int qports_gw_snoc_bimc[] = {2}; -static int qports_kmpss[] = {0}; -static int qports_lpass_ahb[] = {0}; -static int qports_qdss_bam[] = {1}; -static int qports_gw_pnoc_snoc[] = {8}; -static int qports_ipa[] = {3}; -static int qports_qdss_etr[] = {10}; - -static struct msm_bus_node_info sys_noc_info[] = { - { - .id = MSM_BUS_MASTER_LPASS_AHB, - .masterp = mport_lpass_ahb, - .num_mports = ARRAY_SIZE(mport_lpass_ahb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .qport = qports_lpass_ahb, - .mas_hw_id = MAS_LPASS_AHB, - .mode = NOC_QOS_MODE_FIXED, - .prio_rd = 2, - .prio_wr = 2, - }, - { - .id = MSM_BUS_MASTER_QDSS_BAM, - .masterp = mport_qdss_bam, - .num_mports = ARRAY_SIZE(mport_qdss_bam), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mode = NOC_QOS_MODE_FIXED, - .qport = qports_qdss_bam, - .mas_hw_id = MAS_QDSS_BAM, - }, - { - .id = MSM_BUS_MASTER_SNOC_CFG, - .masterp = mport_snoc_cfg, - .num_mports = ARRAY_SIZE(mport_snoc_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mas_hw_id = MAS_SNOC_CFG, - }, - { - .id = MSM_BUS_FAB_BIMC, - .gateway = 1, - .slavep = sport_gw_snoc_bimc, - .num_sports = ARRAY_SIZE(sport_gw_snoc_bimc), - .masterp = mport_gw_bimc_snoc, - .num_mports = ARRAY_SIZE(mport_gw_bimc_snoc), - .buswidth = 8, - .mas_hw_id = MAS_BIMC_SNOC, - .slv_hw_id = SLV_SNOC_BIMC, - }, - { - .id = MSM_BUS_FAB_CONFIG_NOC, - .gateway = 1, - .slavep = sport_gw_snoc_cnoc, - .num_sports = ARRAY_SIZE(sport_gw_snoc_cnoc), - .masterp = mport_gw_cnoc_snoc, - .num_mports = ARRAY_SIZE(mport_gw_cnoc_snoc), - .buswidth = 8, - .mas_hw_id = MAS_CNOC_SNOC, - .slv_hw_id = SLV_SNOC_CNOC, - }, - { - .id = MSM_BUS_FAB_PERIPH_NOC, - .gateway = 1, - .slavep = sport_gw_snoc_pnoc, - .num_sports = ARRAY_SIZE(sport_gw_snoc_pnoc), - .masterp = mport_gw_pnoc_snoc, - .num_mports = ARRAY_SIZE(mport_gw_pnoc_snoc), - .buswidth = 8, - .qport = qports_gw_pnoc_snoc, - .mas_hw_id = MAS_PNOC_SNOC, - .slv_hw_id = SLV_SNOC_PNOC, - .mode = NOC_QOS_MODE_FIXED, - .prio_rd = 2, - .prio_wr = 2, - }, - { - .id = MSM_BUS_MASTER_CRYPTO_CORE0, - .masterp = mport_crypto_core0, - .num_mports = ARRAY_SIZE(mport_crypto_core0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mode = NOC_QOS_MODE_FIXED, - .qport = qports_crypto_c0, - .mas_hw_id = MAS_CRYPTO_CORE0, - .hw_sel = MSM_BUS_NOC, - }, - { - .id = MSM_BUS_MASTER_LPASS_PROC, - .masterp = mport_lpass_proc, - .num_mports = ARRAY_SIZE(mport_lpass_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .qport = qports_lpass_proc, - .mas_hw_id = MAS_LPASS_PROC, - .mode = NOC_QOS_MODE_FIXED, - .prio_rd = 2, - .prio_wr = 2, - }, - { - .id = MSM_BUS_MASTER_MSS, - .masterp = mport_mss, - .num_mports = ARRAY_SIZE(mport_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mas_hw_id = MAS_MSS, - }, - { - .id = MSM_BUS_MASTER_MSS_NAV, - .masterp = mport_mss_nav, - .num_mports = ARRAY_SIZE(mport_mss_nav), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mas_hw_id = MAS_MSS_NAV, - }, - { - .id = MSM_BUS_MASTER_IPA, - .masterp = mport_ipa, - .num_mports = ARRAY_SIZE(mport_ipa), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .mode = NOC_QOS_MODE_FIXED, - .qport = qports_ipa, - .mas_hw_id = MAS_IPA, - .hw_sel = MSM_BUS_NOC, - .iface_clk_node = "msm_bus_ipa", - }, - { - .id = MSM_BUS_MASTER_QDSS_ETR, - .masterp = mport_qdss_etr, - .num_mports = ARRAY_SIZE(mport_qdss_etr), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .qport = qports_qdss_etr, - .mode = NOC_QOS_MODE_FIXED, - .mas_hw_id = MAS_QDSS_ETR, - }, - { - .id = MSM_BUS_SLAVE_AMPSS, - .slavep = sport_kmpss, - .num_sports = ARRAY_SIZE(sport_kmpss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_APPSS, - }, - { - .id = MSM_BUS_SLAVE_LPASS, - .slavep = sport_lpass, - .num_sports = ARRAY_SIZE(sport_lpass), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_LPASS, - }, - { - .id = MSM_BUS_SLAVE_OCIMEM, - .slavep = sport_ocimem, - .num_sports = ARRAY_SIZE(sport_ocimem), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_OCIMEM, - }, - { - .id = MSM_BUS_SLAVE_SERVICE_SNOC, - .slavep = sport_service_snoc, - .num_sports = ARRAY_SIZE(sport_service_snoc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SERVICE_SNOC, - }, - { - .id = MSM_BUS_SLAVE_QDSS_STM, - .slavep = sport_qdss_stm, - .num_sports = ARRAY_SIZE(sport_qdss_stm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_QDSS_STM, - }, -}; - -static struct msm_bus_node_info bimc_info[] = { - { - .id = MSM_BUS_MASTER_AMPSS_M0, - .masterp = mport_kmpss_m0, - .num_mports = ARRAY_SIZE(mport_kmpss_m0), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .hw_sel = MSM_BUS_BIMC, - .mode = NOC_QOS_MODE_FIXED, - .qport = qports_kmpss, - .ws = 10000, - .mas_hw_id = MAS_APPSS_PROC, - .prio_lvl = 0, - .prio_rd = 0, - .prio_wr = 0, - }, - { - .id = MSM_BUS_MASTER_MSS_PROC, - .masterp = mport_mss_proc, - .num_mports = ARRAY_SIZE(mport_mss_proc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .hw_sel = MSM_BUS_RPM, - .mas_hw_id = MAS_AMSS_PROC, - }, - { - .id = MSM_BUS_FAB_SYS_NOC, - .gateway = 1, - .slavep = sport_gw_bimc_snoc, - .num_sports = ARRAY_SIZE(sport_gw_bimc_snoc), - .masterp = mport_gw_snoc_bimc, - .num_mports = ARRAY_SIZE(mport_gw_snoc_bimc), - .qport = qports_gw_snoc_bimc, - .buswidth = 8, - .ws = 10000, - .mas_hw_id = MAS_SNOC_BIMC, - .slv_hw_id = SLV_BIMC_SNOC, - .mode = NOC_QOS_MODE_BYPASS, - }, - { - .id = MSM_BUS_SLAVE_EBI_CH0, - .slavep = sport_ebi1, - .num_sports = ARRAY_SIZE(sport_ebi1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_EBI, - .mode = NOC_QOS_MODE_BYPASS, - }, -}; - -static struct msm_bus_node_info periph_noc_info[] = { - { - .id = MSM_BUS_MASTER_PNOC_CFG, - .masterp = mport_pnoc_cfg, - .num_mports = ARRAY_SIZE(mport_pnoc_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_PNOC_CFG, - }, - { - .id = MSM_BUS_MASTER_QPIC, - .masterp = mport_qpic, - .num_mports = ARRAY_SIZE(mport_qpic), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_QPIC, - }, - { - .id = MSM_BUS_MASTER_SDCC_1, - .masterp = mport_sdcc_1, - .num_mports = ARRAY_SIZE(mport_sdcc_1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SDCC_1, - }, - { - .id = MSM_BUS_MASTER_SDCC_3, - .masterp = mport_sdcc_3, - .num_mports = ARRAY_SIZE(mport_sdcc_3), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SDCC_3, - }, - { - .id = MSM_BUS_MASTER_SDCC_4, - .masterp = mport_sdcc_4, - .num_mports = ARRAY_SIZE(mport_sdcc_4), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SDCC_4, - }, - { - .id = MSM_BUS_MASTER_SDCC_2, - .masterp = mport_sdcc_2, - .num_mports = ARRAY_SIZE(mport_sdcc_2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SDCC_2, - }, - { - .id = MSM_BUS_MASTER_TSIF, - .masterp = mport_tsif, - .num_mports = ARRAY_SIZE(mport_tsif), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_TSIF, - }, - { - .id = MSM_BUS_MASTER_BAM_DMA, - .masterp = mport_bam_dma, - .num_mports = ARRAY_SIZE(mport_bam_dma), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_BAM_DMA, - }, - { - .id = MSM_BUS_MASTER_BLSP_2, - .masterp = mport_blsp_2, - .num_mports = ARRAY_SIZE(mport_blsp_2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_BLSP_2, - }, - { - .id = MSM_BUS_MASTER_USB_HSIC, - .masterp = mport_usb_hsic, - .num_mports = ARRAY_SIZE(mport_usb_hsic), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_USB_HSIC, - }, - { - .id = MSM_BUS_MASTER_USB_HS, - .masterp = mport_usb_hs1, - .num_mports = ARRAY_SIZE(mport_usb_hs1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_MASTER_USB_HS2, - .masterp = mport_usb_hs2, - .num_mports = ARRAY_SIZE(mport_usb_hs2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - }, - { - .id = MSM_BUS_MASTER_BLSP_1, - .masterp = mport_blsp_1, - .num_mports = ARRAY_SIZE(mport_blsp_1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_BLSP_1, - }, - { - .id = MSM_BUS_FAB_SYS_NOC, - .gateway = 1, - .slavep = sport_gw_pnoc_snoc, - .num_sports = ARRAY_SIZE(sport_gw_pnoc_snoc), - .masterp = mport_gw_snoc_pnoc, - .num_mports = ARRAY_SIZE(mport_gw_snoc_pnoc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PNOC_SNOC, - .mas_hw_id = MAS_SNOC_PNOC, - }, - { - .id = MSM_BUS_SLAVE_SDCC_1, - .slavep = sport_sdcc_1, - .num_sports = ARRAY_SIZE(sport_sdcc_1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SDCC_1, - }, - { - .id = MSM_BUS_SLAVE_SDCC_3, - .slavep = sport_sdcc_3, - .num_sports = ARRAY_SIZE(sport_sdcc_3), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SDCC_3, - }, - { - .id = MSM_BUS_SLAVE_SDCC_2, - .slavep = sport_sdcc_2, - .num_sports = ARRAY_SIZE(sport_sdcc_2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SDCC_2, - }, - { - .id = MSM_BUS_SLAVE_SDCC_4, - .slavep = sport_sdcc_4, - .num_sports = ARRAY_SIZE(sport_sdcc_4), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SDCC_4, - }, - { - .id = MSM_BUS_SLAVE_TSIF, - .slavep = sport_tsif, - .num_sports = ARRAY_SIZE(sport_tsif), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_TSIF, - }, - { - .id = MSM_BUS_SLAVE_BAM_DMA, - .slavep = sport_bam_dma, - .num_sports = ARRAY_SIZE(sport_bam_dma), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_BAM_DMA, - }, - { - .id = MSM_BUS_SLAVE_QPIC, - .masterp = sport_qpic, - .num_mports = ARRAY_SIZE(sport_qpic), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = SLV_QPIC, - }, - { - .id = MSM_BUS_SLAVE_BLSP_2, - .slavep = sport_blsp_2, - .num_sports = ARRAY_SIZE(sport_blsp_2), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_BLSP_2, - }, - { - .id = MSM_BUS_SLAVE_USB_HSIC, - .slavep = sport_usb_hsic, - .num_sports = ARRAY_SIZE(sport_usb_hsic), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_USB_HSIC, - }, - { - .id = MSM_BUS_SLAVE_BLSP_1, - .slavep = sport_blsp_1, - .num_sports = ARRAY_SIZE(sport_blsp_1), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_BLSP_1, - }, - { - .id = MSM_BUS_SLAVE_PDM, - .slavep = sport_pdm, - .num_sports = ARRAY_SIZE(sport_pdm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PDM, - }, - { - .id = MSM_BUS_SLAVE_PERIPH_APU_CFG, - .slavep = sport_periph_apu_cfg, - .num_sports = ARRAY_SIZE(sport_periph_apu_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PERIPH_APU_CFG, - }, - { - .id = MSM_BUS_SLAVE_PNOC_MPU_CFG, - .slavep = sport_pnoc_mpu_cfg, - .num_sports = ARRAY_SIZE(sport_pnoc_mpu_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_MPU_CFG, - }, - { - .id = MSM_BUS_SLAVE_PRNG, - .slavep = sport_prng, - .num_sports = ARRAY_SIZE(sport_prng), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PRNG, - }, - { - .id = MSM_BUS_SLAVE_SERVICE_PNOC, - .slavep = sport_service_pnoc, - .num_sports = ARRAY_SIZE(sport_service_pnoc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SERVICE_PNOC, - }, -}; - -static struct msm_bus_node_info config_noc_info[] = { - { - .id = MSM_BUS_MASTER_RPM_INST, - .masterp = mport_rpm_inst, - .num_mports = ARRAY_SIZE(mport_rpm_inst), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_RPM_INST, - }, - { - .id = MSM_BUS_MASTER_RPM_DATA, - .masterp = mport_rpm_data, - .num_mports = ARRAY_SIZE(mport_rpm_data), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_RPM_DATA, - }, - { - .id = MSM_BUS_MASTER_RPM_SYS, - .masterp = mport_rpm_sys, - .num_mports = ARRAY_SIZE(mport_rpm_sys), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_RPM_SYS, - }, - { - .id = MSM_BUS_MASTER_DEHR, - .masterp = mport_dehr, - .num_mports = ARRAY_SIZE(mport_dehr), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_DEHR, - }, - { - .id = MSM_BUS_MASTER_QDSS_DAP, - .masterp = mport_qdss_dap, - .num_mports = ARRAY_SIZE(mport_qdss_dap), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_QDSS_DAP, - }, - { - .id = MSM_BUS_MASTER_SPDM, - .masterp = mport_spdm, - .num_mports = ARRAY_SIZE(mport_spdm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SPDM, - }, - { - .id = MSM_BUS_MASTER_TIC, - .masterp = mport_tic, - .num_mports = ARRAY_SIZE(mport_tic), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_TIC, - }, - { - .id = MSM_BUS_SLAVE_CLK_CTL, - .slavep = sport_clk_ctl, - .num_sports = ARRAY_SIZE(sport_clk_ctl), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_CLK_CTL, - }, - { - .id = MSM_BUS_SLAVE_CNOC_MSS, - .slavep = sport_cnoc_mss, - .num_sports = ARRAY_SIZE(sport_cnoc_mss), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_CNOC_MSS, - }, - { - .id = MSM_BUS_SLAVE_SECURITY, - .slavep = sport_security, - .num_sports = ARRAY_SIZE(sport_security), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SECURITY, - }, - { - .id = MSM_BUS_SLAVE_TCSR, - .slavep = sport_tcsr, - .num_sports = ARRAY_SIZE(sport_tcsr), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_TCSR, - }, - { - .id = MSM_BUS_SLAVE_TLMM, - .slavep = sport_tlmm, - .num_sports = ARRAY_SIZE(sport_tlmm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_TLMM, - }, - { - .id = MSM_BUS_SLAVE_CRYPTO_0_CFG, - .slavep = sport_crypto_0_cfg, - .num_sports = ARRAY_SIZE(sport_crypto_0_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_CRYPTO_0_CFG, - }, - { - .id = MSM_BUS_SLAVE_IMEM_CFG, - .slavep = sport_imem_cfg, - .num_sports = ARRAY_SIZE(sport_imem_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_IMEM_CFG, - }, - { - .id = MSM_BUS_SLAVE_IPS_CFG, - .slavep = sport_ips_cfg, - .num_sports = ARRAY_SIZE(sport_ips_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_IPS_CFG, - }, - { - .id = MSM_BUS_SLAVE_MESSAGE_RAM, - .slavep = sport_message_ram, - .num_sports = ARRAY_SIZE(sport_message_ram), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_MESSAGE_RAM, - }, - { - .id = MSM_BUS_SLAVE_BIMC_CFG, - .slavep = sport_bimc_cfg, - .num_sports = ARRAY_SIZE(sport_bimc_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_BIMC_CFG, - }, - { - .id = MSM_BUS_SLAVE_BOOT_ROM, - .slavep = sport_boot_rom, - .num_sports = ARRAY_SIZE(sport_boot_rom), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_BOOT_ROM, - }, - { - .id = MSM_BUS_SLAVE_PMIC_ARB, - .slavep = sport_pmic_arb, - .num_sports = ARRAY_SIZE(sport_pmic_arb), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PMIC_ARB, - }, - { - .id = MSM_BUS_SLAVE_SPDM_WRAPPER, - .slavep = sport_spdm_wrapper, - .num_sports = ARRAY_SIZE(sport_spdm_wrapper), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SPDM_WRAPPER, - }, - { - .id = MSM_BUS_SLAVE_DEHR_CFG, - .slavep = sport_dehr_cfg, - .num_sports = ARRAY_SIZE(sport_dehr_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_DEHR_CFG, - }, - { - .id = MSM_BUS_SLAVE_MPM, - .slavep = sport_mpm, - .num_sports = ARRAY_SIZE(sport_mpm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_MPM, - }, - { - .id = MSM_BUS_SLAVE_QDSS_CFG, - .slavep = sport_qdss_cfg, - .num_sports = ARRAY_SIZE(sport_qdss_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_QDSS_CFG, - }, - { - .id = MSM_BUS_SLAVE_RBCPR_CFG, - .slavep = sport_rbcpr_cfg, - .num_sports = ARRAY_SIZE(sport_rbcpr_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_RBCPR_CFG, - }, - { - .id = MSM_BUS_SLAVE_RBCPR_QDSS_APU_CFG, - .slavep = sport_rbcpr_qdss_apu_cfg, - .num_sports = ARRAY_SIZE(sport_rbcpr_qdss_apu_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_RBCPR_QDSS_APU_CFG, - }, - { - .id = MSM_BUS_FAB_SYS_NOC, - .gateway = 1, - .slavep = sport_gw_cnoc_snoc, - .num_sports = ARRAY_SIZE(sport_gw_cnoc_snoc), - .masterp = mport_gw_snoc_cnoc, - .num_mports = ARRAY_SIZE(mport_gw_snoc_cnoc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .mas_hw_id = MAS_SNOC_CNOC, - .slv_hw_id = SLV_CNOC_SNOC, - }, - { - .id = MSM_BUS_SLAVE_PNOC_CFG, - .slavep = sport_pnoc_cfg, - .num_sports = ARRAY_SIZE(sport_pnoc_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PNOC_CFG, - }, - { - .id = MSM_BUS_SLAVE_SNOC_MPU_CFG, - .slavep = sport_snoc_mpu_cfg, - .num_sports = ARRAY_SIZE(sport_snoc_mpu_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SNOC_MPU_CFG, - }, - { - .id = MSM_BUS_SLAVE_SNOC_CFG, - .slavep = sport_snoc_cfg, - .num_sports = ARRAY_SIZE(sport_snoc_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SNOC_CFG, - }, - { - .id = MSM_BUS_SLAVE_PHY_APU_CFG, - .slavep = sport_phy_apu_cfg, - .num_sports = ARRAY_SIZE(sport_phy_apu_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_PHY_APU_CFG, - }, - { - .id = MSM_BUS_SLAVE_EBI1_PHY_CFG, - .slavep = sport_ebi1_phy_cfg, - .num_sports = ARRAY_SIZE(sport_ebi1_phy_cfg), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_EBI1_PHY_CFG, - }, - { - .id = MSM_BUS_SLAVE_RPM, - .slavep = sport_rpm, - .num_sports = ARRAY_SIZE(sport_rpm), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_RPM, - }, - { - .id = MSM_BUS_SLAVE_SERVICE_CNOC, - .slavep = sport_service_cnoc, - .num_sports = ARRAY_SIZE(sport_service_cnoc), - .tier = tier2, - .num_tiers = ARRAY_SIZE(tier2), - .buswidth = 8, - .slv_hw_id = SLV_SERVICE_CNOC, - }, -}; - -static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration - *fabreg, int fabid) -{ - int i; - for (i = 0; i < fabreg->len; i++) { - if (!fabreg->info[i].gateway) { - fabreg->info[i].priv_id = fabid + fabreg->info[i].id; - if (fabreg->info[i].id < SLAVE_ID_KEY) { - WARN(fabreg->info[i].id >= NMASTERS, - "id %d exceeds array size!\n", - fabreg->info[i].id); - master_iids[fabreg->info[i].id] = - fabreg->info[i].priv_id; - } else { - WARN((fabreg->info[i].id - SLAVE_ID_KEY) >= - NSLAVES, "id %d exceeds array size!\n", - fabreg->info[i].id); - slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)] - = fabreg->info[i].priv_id; - } - } else { - fabreg->info[i].priv_id = fabreg->info[i].id; - } - } -} - -static int msm_bus_board_9625_get_iid(int id) -{ - if ((id < SLAVE_ID_KEY && id >= NMASTERS) || - id >= (SLAVE_ID_KEY + NSLAVES)) { - MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id); - return -EINVAL; - } - - return CHECK_ID(((id < SLAVE_ID_KEY) ? master_iids[id] : - slave_iids[id - SLAVE_ID_KEY]), id); -} - -int msm_bus_board_rpm_get_il_ids(uint16_t *id) -{ - return -ENXIO; -} - -static struct msm_bus_board_algorithm msm_bus_board_algo = { - .board_nfab = NFAB_9625, - .get_iid = msm_bus_board_9625_get_iid, - .assign_iids = msm_bus_board_assign_iids, -}; - -struct msm_bus_fabric_registration msm_bus_9625_sys_noc_pdata = { - .id = MSM_BUS_FAB_SYS_NOC, - .name = "msm_sys_noc", - .info = sys_noc_info, - .len = ARRAY_SIZE(sys_noc_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 15, - .nslaves = 12, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, - .qos_freq = 4800, - .hw_sel = MSM_BUS_NOC, - .rpm_enabled = 1, -}; - -struct msm_bus_fabric_registration msm_bus_9625_bimc_pdata = { - .id = MSM_BUS_FAB_BIMC, - .name = "msm_bimc", - .info = bimc_info, - .len = ARRAY_SIZE(bimc_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "mem_clk", - .fabclk[ACTIVE_CTX] = "mem_a_clk", - .nmasters = 7, - .nslaves = 4, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, - .qos_freq = 4800, - .hw_sel = MSM_BUS_BIMC, - .rpm_enabled = 1, -}; - -struct msm_bus_fabric_registration msm_bus_9625_periph_noc_pdata = { - .id = MSM_BUS_FAB_PERIPH_NOC, - .name = "msm_periph_noc", - .info = periph_noc_info, - .len = ARRAY_SIZE(periph_noc_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 14, - .nslaves = 15, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, - .hw_sel = MSM_BUS_NOC, - .rpm_enabled = 1, -}; - -struct msm_bus_fabric_registration msm_bus_9625_config_noc_pdata = { - .id = MSM_BUS_FAB_CONFIG_NOC, - .name = "msm_config_noc", - .info = config_noc_info, - .len = ARRAY_SIZE(config_noc_info), - .ahb = 0, - .fabclk[DUAL_CTX] = "bus_clk", - .fabclk[ACTIVE_CTX] = "bus_a_clk", - .nmasters = 8, - .nslaves = 30, - .ntieredslaves = 0, - .board_algo = &msm_bus_board_algo, - .hw_sel = MSM_BUS_NOC, - .rpm_enabled = 1, -}; - -void msm_bus_board_init(struct msm_bus_fabric_registration *pdata) -{ -} - -void msm_bus_board_set_nfab(struct msm_bus_fabric_registration *pdata, - int nfab) -{ - if (nfab <= 0) - return; - - msm_bus_board_algo.board_nfab = nfab; -} diff --git a/arch/arm/mach-msm/msm_cpu_pwrctl.c b/arch/arm/mach-msm/msm_cpu_pwrctl.c deleted file mode 100644 index 89b8a099a68e..000000000000 --- a/arch/arm/mach-msm/msm_cpu_pwrctl.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - -static const phys_addr_t primary_cpu_pwrctl_phys = 0x2088004; - -static int __init msm_cpu_pwrctl_init(void) -{ - void *pwrctl_ptr; - unsigned int value; - int rc = 0; - - pwrctl_ptr = ioremap_nocache(primary_cpu_pwrctl_phys, SZ_4K); - if (unlikely(!pwrctl_ptr)) { - pr_err("Failed to remap APCS_CPU_PWR_CTL register for CPU0\n"); - rc = -EINVAL; - goto done; - } - - value = readl_relaxed(pwrctl_ptr); - value |= 0x100; - writel_relaxed(value, pwrctl_ptr); - mb(); - iounmap(pwrctl_ptr); - -done: - return rc; -} - -early_initcall(msm_cpu_pwrctl_init); diff --git a/arch/arm/mach-msm/msm_dsps.c b/arch/arm/mach-msm/msm_dsps.c deleted file mode 100644 index 3e7cec754020..000000000000 --- a/arch/arm/mach-msm/msm_dsps.c +++ /dev/null @@ -1,757 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * msm_dsps - control DSPS clocks, gpios and vregs. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "timer.h" - -#define DRV_NAME "msm_dsps" -#define DRV_VERSION "4.03" - - -#define PPSS_TIMER0_32KHZ_REG 0x1004 -#define PPSS_TIMER0_20MHZ_REG 0x0804 - -/** - * Driver Context - * - * @dev_class - device class. - * @dev_num - device major & minor number. - * @dev - the device. - * @cdev - character device for user interface. - * @pdata - platform data. - * @pil - handle to DSPS Firmware loader. - * @dspsfw_ramdump_dev - handle to ramdump device for DSPS - * @dspsfw_ramdump_segments - Ramdump segment information for DSPS - * @smem_ramdump_dev - handle to ramdump device for smem - * @smem_ramdump_segments - Ramdump segment information for smem - * @is_on - DSPS is on. - * @ref_count - open/close reference count. - * @ppss_base - ppss registers virtual base address. - */ -struct dsps_drv { - - struct class *dev_class; - dev_t dev_num; - struct device *dev; - struct cdev *cdev; - - struct msm_dsps_platform_data *pdata; - - void *pil; - - int is_on; - int ref_count; - - void __iomem *ppss_base; -}; - -/** - * Driver context. - */ -static struct dsps_drv *drv; - -/** - * Load DSPS Firmware. - */ -static int dsps_load(void) -{ - pr_debug("%s.\n", __func__); - - drv->pil = subsystem_get("dsps"); - if (IS_ERR(drv->pil)) { - pr_err("%s: fail to load DSPS firmware.\n", __func__); - return -ENODEV; - } - msleep(20); - return 0; -} - -/** - * Unload DSPS Firmware. - */ -static void dsps_unload(void) -{ - pr_debug("%s.\n", __func__); - - subsystem_put(drv->pil); -} - -/** - * Suspend DSPS CPU. - * - * Only call if dsps_pwr_ctl_en is false. - * If dsps_pwr_ctl_en is true, then DSPS will control its own power state. - */ -static void dsps_suspend(void) -{ - pr_debug("%s.\n", __func__); - - writel_relaxed(1, drv->ppss_base + drv->pdata->ppss_pause_reg); - mb(); /* Make sure write commited before ioctl returns. */ -} - -/** - * Resume DSPS CPU. - * - * Only call if dsps_pwr_ctl_en is false. - * If dsps_pwr_ctl_en is true, then DSPS will control its own power state. - */ -static void dsps_resume(void) -{ - pr_debug("%s.\n", __func__); - - writel_relaxed(0, drv->ppss_base + drv->pdata->ppss_pause_reg); - mb(); /* Make sure write commited before ioctl returns. */ -} - -/** - * Read DSPS slow timer. - */ -static u32 dsps_read_slow_timer(void) -{ - u32 val; - - /* Read the timer value from the MSM sclk. The MSM slow clock & DSPS - * timers are in sync, so these are the same value */ - val = msm_timer_get_sclk_ticks(); - pr_debug("%s.count=%d.\n", __func__, val); - - return val; -} - -/** - * Read DSPS fast timer. - */ -static u32 dsps_read_fast_timer(void) -{ - u32 val; - - val = readl_relaxed(drv->ppss_base + PPSS_TIMER0_20MHZ_REG); - rmb(); /* order reads from the user output buffer */ - - pr_debug("%s.count=%d.\n", __func__, val); - - return val; -} - -/** - * Power on request. - * - * Set clocks to ON. - * Set sensors chip-select GPIO to non-reset (on) value. - * - */ -static int dsps_power_on_handler(void) -{ - int ret = 0; - int i, ci, gi, ri; - - pr_debug("%s.\n", __func__); - - if (drv->is_on) { - pr_debug("%s: already ON.\n", __func__); - return 0; - } - - for (ci = 0; ci < drv->pdata->clks_num; ci++) { - const char *name = drv->pdata->clks[ci].name; - u32 rate = drv->pdata->clks[ci].rate; - struct clk *clock = drv->pdata->clks[ci].clock; - - if (clock == NULL) - continue; - - if (rate > 0) { - ret = clk_set_rate(clock, rate); - pr_debug("%s: clk %s set rate %d.", - __func__, name, rate); - if (ret) { - pr_err("%s: clk %s set rate %d. err=%d.", - __func__, name, rate, ret); - goto clk_err; - } - - } - - ret = clk_prepare_enable(clock); - if (ret) { - pr_err("%s: enable clk %s err %d.", - __func__, name, ret); - goto clk_err; - } - } - - for (gi = 0; gi < drv->pdata->gpios_num; gi++) { - const char *name = drv->pdata->gpios[gi].name; - int num = drv->pdata->gpios[gi].num; - int val = drv->pdata->gpios[gi].on_val; - int is_owner = drv->pdata->gpios[gi].is_owner; - - if (!is_owner) - continue; - - ret = gpio_direction_output(num, val); - if (ret) { - pr_err("%s: set GPIO %s num %d to %d err %d.", - __func__, name, num, val, ret); - goto gpio_err; - } - } - - for (ri = 0; ri < drv->pdata->regs_num; ri++) { - const char *name = drv->pdata->regs[ri].name; - struct regulator *reg = drv->pdata->regs[ri].reg; - int volt = drv->pdata->regs[ri].volt; - - if (reg == NULL) - continue; - - pr_debug("%s: set regulator %s.", __func__, name); - - ret = regulator_set_voltage(reg, volt, volt); - - if (ret) { - pr_err("%s: set regulator %s voltage %d err = %d.\n", - __func__, name, volt, ret); - goto reg_err; - } - - ret = regulator_enable(reg); - if (ret) { - pr_err("%s: enable regulator %s err = %d.\n", - __func__, name, ret); - goto reg_err; - } - } - - drv->is_on = true; - - return 0; - - /* - * If failling to set ANY clock/gpio/regulator to ON then we set - * them back to OFF to avoid consuming power for unused - * clocks/gpios/regulators. - */ -reg_err: - for (i = 0; i < ri; i++) { - struct regulator *reg = drv->pdata->regs[ri].reg; - - if (reg == NULL) - continue; - - regulator_disable(reg); - } - -gpio_err: - for (i = 0; i < gi; i++) { - int num = drv->pdata->gpios[i].num; - int val = drv->pdata->gpios[i].off_val; - int is_owner = drv->pdata->gpios[i].is_owner; - - if (!is_owner) - continue; - - ret = gpio_direction_output(num, val); - } - -clk_err: - for (i = 0; i < ci; i++) { - struct clk *clock = drv->pdata->clks[i].clock; - - if (clock == NULL) - continue; - - clk_disable_unprepare(clock); - } - - return -ENODEV; -} - -/** - * Power off request. - * - * Set clocks to OFF. - * Set sensors chip-select GPIO to reset (off) value. - * - */ -static int dsps_power_off_handler(void) -{ - int ret; - int i; - - pr_debug("%s.\n", __func__); - - if (!drv->is_on) { - pr_debug("%s: already OFF.\n", __func__); - return 0; - } - - for (i = 0; i < drv->pdata->clks_num; i++) - if (drv->pdata->clks[i].clock) { - const char *name = drv->pdata->clks[i].name; - - pr_debug("%s: set clk %s off.", __func__, name); - clk_disable_unprepare(drv->pdata->clks[i].clock); - } - - for (i = 0; i < drv->pdata->regs_num; i++) - if (drv->pdata->regs[i].reg) { - const char *name = drv->pdata->regs[i].name; - - pr_debug("%s: set regulator %s off.", __func__, name); - regulator_disable(drv->pdata->regs[i].reg); - } - - /* Clocks on/off has reference count but GPIOs don't. */ - drv->is_on = false; - - for (i = 0; i < drv->pdata->gpios_num; i++) { - const char *name = drv->pdata->gpios[i].name; - int num = drv->pdata->gpios[i].num; - int val = drv->pdata->gpios[i].off_val; - - pr_debug("%s: set gpio %s off.", __func__, name); - - ret = gpio_direction_output(num, val); - if (ret) { - pr_err("%s: set GPIO %s err %d.", __func__, name, ret); - return ret; - } - } - - return 0; -} - -/** - * IO Control - handle commands from client. - * - */ -static long dsps_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ret = 0; - u32 val = 0; - - pr_debug("%s.\n", __func__); - - switch (cmd) { - case DSPS_IOCTL_ON: - if (!drv->pdata->dsps_pwr_ctl_en) { - ret = dsps_power_on_handler(); - dsps_resume(); - } - break; - case DSPS_IOCTL_OFF: - if (!drv->pdata->dsps_pwr_ctl_en) { - dsps_suspend(); - ret = dsps_power_off_handler(); - } - break; - case DSPS_IOCTL_READ_SLOW_TIMER: - val = dsps_read_slow_timer(); - ret = put_user(val, (u32 __user *) arg); - break; - case DSPS_IOCTL_READ_FAST_TIMER: - val = dsps_read_fast_timer(); - ret = put_user(val, (u32 __user *) arg); - break; - case DSPS_IOCTL_RESET: - pr_err("%s: User-initiated DSPS reset.\nResetting DSPS\n", - __func__); - subsystem_restart("dsps"); - ret = 0; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -/** - * allocate resources. - * @pdev - pointer to platform device. - */ -static int dsps_alloc_resources(struct platform_device *pdev) -{ - int ret = -ENODEV; - struct resource *ppss_res; - int i; - - pr_debug("%s.\n", __func__); - - if ((drv->pdata->signature != DSPS_SIGNATURE)) { - pr_err("%s: invalid signature for pdata.", __func__); - return -EINVAL; - } - - ppss_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, - "ppss_reg"); - if (!ppss_res) { - pr_err("%s: failed to get ppss_reg resource.\n", __func__); - return -EINVAL; - } - - for (i = 0; i < drv->pdata->clks_num; i++) { - const char *name = drv->pdata->clks[i].name; - struct clk *clock; - - drv->pdata->clks[i].clock = NULL; - - pr_debug("%s: get clk %s.", __func__, name); - - clock = clk_get(drv->dev, name); - if (IS_ERR(clock)) { - pr_err("%s: can't get clk %s.", __func__, name); - goto clk_err; - } - drv->pdata->clks[i].clock = clock; - } - - for (i = 0; i < drv->pdata->gpios_num; i++) { - const char *name = drv->pdata->gpios[i].name; - int num = drv->pdata->gpios[i].num; - - drv->pdata->gpios[i].is_owner = false; - - pr_debug("%s: get gpio %s.", __func__, name); - - ret = gpio_request(num, name); - if (ret) { - pr_err("%s: request GPIO %s err %d.", - __func__, name, ret); - goto gpio_err; - } - - drv->pdata->gpios[i].is_owner = true; - - } - - for (i = 0; i < drv->pdata->regs_num; i++) { - const char *name = drv->pdata->regs[i].name; - - drv->pdata->regs[i].reg = NULL; - - pr_debug("%s: get regulator %s.", __func__, name); - - drv->pdata->regs[i].reg = regulator_get(drv->dev, name); - if (IS_ERR(drv->pdata->regs[i].reg)) { - pr_err("%s: get regulator %s failed.", - __func__, name); - goto reg_err; - } - } - - drv->ppss_base = ioremap(ppss_res->start, - resource_size(ppss_res)); - - if (drv->pdata->init) - drv->pdata->init(drv->pdata); - - return 0; - -reg_err: - for (i = 0; i < drv->pdata->regs_num; i++) { - if (drv->pdata->regs[i].reg) { - regulator_put(drv->pdata->regs[i].reg); - drv->pdata->regs[i].reg = NULL; - } - } - -gpio_err: - for (i = 0; i < drv->pdata->gpios_num; i++) - if (drv->pdata->gpios[i].is_owner) { - gpio_free(drv->pdata->gpios[i].num); - drv->pdata->gpios[i].is_owner = false; - } -clk_err: - for (i = 0; i < drv->pdata->clks_num; i++) - if (drv->pdata->clks[i].clock) { - clk_put(drv->pdata->clks[i].clock); - drv->pdata->clks[i].clock = NULL; - } - - return ret; -} - -/** - * Open File. - * - */ -static int dsps_open(struct inode *ip, struct file *fp) -{ - int ret = 0; - - pr_debug("%s.\n", __func__); - - if (drv->ref_count == 0) { - - /* clocks must be ON before loading.*/ - ret = dsps_power_on_handler(); - if (ret) - return ret; - - ret = dsps_load(); - - if (ret) { - dsps_power_off_handler(); - return ret; - } - - if (!drv->pdata->dsps_pwr_ctl_en) - dsps_resume(); - } - drv->ref_count++; - - return ret; -} - -/** - * free resources. - * - */ -static void dsps_free_resources(void) -{ - int i; - - pr_debug("%s.\n", __func__); - - for (i = 0; i < drv->pdata->clks_num; i++) - if (drv->pdata->clks[i].clock) { - clk_put(drv->pdata->clks[i].clock); - drv->pdata->clks[i].clock = NULL; - } - - for (i = 0; i < drv->pdata->gpios_num; i++) - if (drv->pdata->gpios[i].is_owner) { - gpio_free(drv->pdata->gpios[i].num); - drv->pdata->gpios[i].is_owner = false; - } - - for (i = 0; i < drv->pdata->regs_num; i++) { - if (drv->pdata->regs[i].reg) { - regulator_put(drv->pdata->regs[i].reg); - drv->pdata->regs[i].reg = NULL; - } - } - - iounmap(drv->ppss_base); -} - -/** - * Close File. - * - * The client shall close and re-open the file for re-loading the DSPS - * firmware. - * The file system will close the file if the user space app has crashed. - * - * If the DSPS is running, then we must reset DSPS CPU & HW before - * setting the clocks off. - * The DSPS reset should be done as part of the subsystem_put(). - * The DSPS reset should be used for error recovery if the DSPS firmware - * has crashed and re-loading the firmware is required. - */ -static int dsps_release(struct inode *inode, struct file *file) -{ - pr_debug("%s.\n", __func__); - - drv->ref_count--; - - if (drv->ref_count == 0) { - if (!drv->pdata->dsps_pwr_ctl_en) { - dsps_suspend(); - - dsps_unload(); - - dsps_power_off_handler(); - } - } - - return 0; -} - -const struct file_operations dsps_fops = { - .owner = THIS_MODULE, - .open = dsps_open, - .release = dsps_release, - .unlocked_ioctl = dsps_ioctl, -}; - -/** - * platform driver - * - */ -static int dsps_probe(struct platform_device *pdev) -{ - int ret; - - pr_debug("%s.\n", __func__); - - if (pdev->dev.platform_data == NULL) { - pr_err("%s: platform data is NULL.\n", __func__); - return -ENODEV; - } - - drv = kzalloc(sizeof(*drv), GFP_KERNEL); - if (drv == NULL) { - pr_err("%s: kzalloc fail.\n", __func__); - goto alloc_err; - } - drv->pdata = pdev->dev.platform_data; - - drv->dev_class = class_create(THIS_MODULE, DRV_NAME); - if (drv->dev_class == NULL) { - pr_err("%s: class_create fail.\n", __func__); - goto res_err; - } - - ret = alloc_chrdev_region(&drv->dev_num, 0, 1, DRV_NAME); - if (ret) { - pr_err("%s: alloc_chrdev_region fail.\n", __func__); - goto alloc_chrdev_region_err; - } - - drv->dev = device_create(drv->dev_class, NULL, - drv->dev_num, - drv, DRV_NAME); - if (IS_ERR(drv->dev)) { - pr_err("%s: device_create fail.\n", __func__); - goto device_create_err; - } - - drv->cdev = cdev_alloc(); - if (drv->cdev == NULL) { - pr_err("%s: cdev_alloc fail.\n", __func__); - goto cdev_alloc_err; - } - cdev_init(drv->cdev, &dsps_fops); - drv->cdev->owner = THIS_MODULE; - - ret = cdev_add(drv->cdev, drv->dev_num, 1); - if (ret) { - pr_err("%s: cdev_add fail.\n", __func__); - goto cdev_add_err; - } - - ret = dsps_alloc_resources(pdev); - if (ret) { - pr_err("%s: failed to allocate dsps resources.\n", __func__); - goto cdev_add_err; - } - - return 0; - -cdev_add_err: - kfree(drv->cdev); -cdev_alloc_err: - device_destroy(drv->dev_class, drv->dev_num); -device_create_err: - unregister_chrdev_region(drv->dev_num, 1); -alloc_chrdev_region_err: - class_destroy(drv->dev_class); -res_err: - kfree(drv); - drv = NULL; -alloc_err: - return -ENODEV; -} - -static int dsps_remove(struct platform_device *pdev) -{ - pr_debug("%s.\n", __func__); - - dsps_power_off_handler(); - dsps_free_resources(); - - cdev_del(drv->cdev); - kfree(drv->cdev); - drv->cdev = NULL; - device_destroy(drv->dev_class, drv->dev_num); - unregister_chrdev_region(drv->dev_num, 1); - class_destroy(drv->dev_class); - kfree(drv); - drv = NULL; - - return 0; -} - -static struct platform_driver dsps_driver = { - .probe = dsps_probe, - .remove = dsps_remove, - .driver = { - .name = "msm_dsps", - }, -}; - -/** - * Module Init. - */ -static int __init dsps_init(void) -{ - int ret; - - pr_info("%s driver version %s.\n", DRV_NAME, DRV_VERSION); - - ret = platform_driver_register(&dsps_driver); - - if (ret) - pr_err("dsps_init.err=%d.\n", ret); - - return ret; -} - -/** - * Module Exit. - */ -static void __exit dsps_exit(void) -{ - pr_debug("%s.\n", __func__); - - platform_driver_unregister(&dsps_driver); -} - -module_init(dsps_init); -module_exit(dsps_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Dedicated Sensors Processor Subsystem (DSPS) driver"); -MODULE_AUTHOR("Amir Samuelov "); - diff --git a/arch/arm/mach-msm/msm_fault_handlers.c b/arch/arm/mach-msm/msm_fault_handlers.c deleted file mode 100644 index 7b2dc8c3c573..000000000000 --- a/arch/arm/mach-msm/msm_fault_handlers.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 1995 Linus Torvalds - * Modifications for ARM processor (c) 1995-2004 Russell King - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include "acpuclock.h" - -#define __str(x) #x -#define MRC(x, v1, v2, v4, v5, v6) do { \ - unsigned int __##x; \ - asm("mrc " __str(v1) ", " __str(v2) ", %0, " __str(v4) ", " \ - __str(v5) ", " __str(v6) "\n" \ - : "=r" (__##x)); \ - pr_info("%s: %s = 0x%.8x\n", __func__, #x, __##x); \ -} while (0) - -static int msm_imp_ext_abort(unsigned long addr, unsigned int fsr, - struct pt_regs *regs) -{ - int cpu; - unsigned int regval; - static unsigned char flush_toggle; - - asm("mrc p15, 7, %0, c15, c0, 1\n" /* read EFSR for fault status */ - : "=r" (regval)); - if (regval == 0x2) { - /* Fault was caused by icache parity error. Alternate - * simply retrying the access and flushing the icache. */ - flush_toggle ^= 1; - if (flush_toggle) - asm("mcr p15, 0, %0, c7, c5, 0\n" - : - : "r" (regval)); /* input value is ignored */ - /* Clear fault in EFSR. */ - asm("mcr p15, 7, %0, c15, c0, 1\n" - : - : "r" (regval)); - /* Clear fault in ADFSR. */ - regval = 0; - asm("mcr p15, 0, %0, c5, c1, 0\n" - : - : "r" (regval)); - return 0; - } - - MRC(ADFSR, p15, 0, c5, c1, 0); - MRC(DFSR, p15, 0, c5, c0, 0); - MRC(ACTLR, p15, 0, c1, c0, 1); - MRC(EFSR, p15, 7, c15, c0, 1); - MRC(L2SR, p15, 3, c15, c1, 0); - MRC(L2CR0, p15, 3, c15, c0, 1); - MRC(L2CPUESR, p15, 3, c15, c1, 1); - MRC(L2CPUCR, p15, 3, c15, c0, 2); - MRC(SPESR, p15, 1, c9, c7, 0); - MRC(SPCR, p15, 0, c9, c7, 0); - MRC(DMACHSR, p15, 1, c11, c0, 0); - MRC(DMACHESR, p15, 1, c11, c0, 1); - MRC(DMACHCR, p15, 0, c11, c0, 2); - for_each_online_cpu(cpu) - pr_info("cpu %d, acpuclk rate: %lu kHz\n", cpu, - acpuclk_get_rate(cpu)); - - return 1; -} - -static int __init msm_register_fault_handlers(void) -{ - /* hook in our handler for imprecise abort for when we get - i-cache parity errors */ - hook_fault_code(22, msm_imp_ext_abort, SIGBUS, 0, - "imprecise external abort"); - - return 0; -} -arch_initcall(msm_register_fault_handlers); diff --git a/arch/arm/mach-msm/msm_smem_iface.c b/arch/arm/mach-msm/msm_smem_iface.c deleted file mode 100644 index d08eb5fc9b80..000000000000 --- a/arch/arm/mach-msm/msm_smem_iface.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "msm_smem_iface.h" - -/** - * mem_get_cpr_info() - Copy Core Power Reduction (CPR) driver specific - * data from Shared memory (SMEM). - * @cpr_info - Pointer to CPR data. Memory to be allocated and freed by - * calling function. - * - * Copy CPR specific data from SMEM to cpr_info. - */ - -void msm_smem_get_cpr_info(struct cpr_info_type *cpr_info) -{ - struct boot_info_for_apps *boot_info; - struct cpr_info_type *temp_cpr_info; - uint32_t smem_boot_info_size; - - boot_info = smem_get_entry(SMEM_BOOT_INFO_FOR_APPS, - &smem_boot_info_size); - BUG_ON(!boot_info); - if (smem_boot_info_size < sizeof(struct boot_info_for_apps)) { - pr_err("%s: Shared boot info data structure too small!\n", - __func__); - BUG(); - } else { - pr_debug("%s: Shared boot info available.\n", __func__); - } - temp_cpr_info = (struct cpr_info_type *) &(boot_info->cpr_info); - cpr_info->ring_osc = temp_cpr_info->ring_osc; - cpr_info->turbo_quot = temp_cpr_info->turbo_quot; - cpr_info->pvs_fuse = temp_cpr_info->pvs_fuse; - cpr_info->floor_fuse = temp_cpr_info->floor_fuse; - cpr_info->disable_cpr = temp_cpr_info->disable_cpr; -} diff --git a/arch/arm/mach-msm/msm_smem_iface.h b/arch/arm/mach-msm/msm_smem_iface.h deleted file mode 100644 index c9c56d991d93..000000000000 --- a/arch/arm/mach-msm/msm_smem_iface.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ARCH_ARM_MACH_MSM_SMEM_IFACE_H -#define __ARCH_ARM_MACH_MSM_SMEM_IFACE_H - -#include -#include - -#define MAX_KEY_EVENTS 10 -#define MAX_SEC_KEY_PAYLOAD 32 - -struct boot_shared_ssd_status_info { - uint32_t update_status; /* To check if process is successful or not */ - uint32_t bl_error_code; /* To indicate error code in bootloader */ -}; - -struct boot_symmetric_key_info { - uint32_t key_len; /* Encrypted Symmetric Key Length */ - uint32_t iv_len; /* Initialization Vector Length */ - uint8_t key[MAX_SEC_KEY_PAYLOAD]; /* Encrypted Symmetric Key */ - uint8_t iv[MAX_SEC_KEY_PAYLOAD]; /* Initialization Vector */ -}; - -/* floor_fuse to re-use the fuse bit earlier used by ring_osc */ -struct cpr_info_type { - uint8_t ring_osc; /* CPR FUSE [0]: TURBO RO SEL BIT */ - uint8_t turbo_quot; /* CPRFUSE[1:7] : TURBO QUOT*/ - uint8_t pvs_fuse; /* TURBO PVS FUSE */ - uint8_t floor_fuse; /* Vmin Selection. b1: FAB_ID(2), b0: CPR_fuse[0] */ - bool disable_cpr; -}; - -struct boot_info_for_apps { - uint32_t apps_image_start_addr; /* apps image start address */ - uint32_t boot_flags; /* bit mask of upto 32 flags */ - struct boot_shared_ssd_status_info ssd_status_info; /* SSD status */ - struct boot_symmetric_key_info key_info; - uint16_t boot_keys_pressed[MAX_KEY_EVENTS]; /* Log of key presses */ - uint32_t timetick; /* Modem tick timer value before apps out of reset */ - struct cpr_info_type cpr_info; - uint8_t PAD[23]; -}; - -void msm_smem_get_cpr_info(struct cpr_info_type *cpr_info); - -#endif /* __ARCH_ARM_MACH_MSM_SMEM_IFACE_H */ diff --git a/arch/arm/mach-msm/msm_vp.c b/arch/arm/mach-msm/msm_vp.c deleted file mode 100644 index 6b673a6fba17..000000000000 --- a/arch/arm/mach-msm/msm_vp.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* Address for Perf Level Registor */ -#define VDD_APC_PLEVEL_BASE (MSM_CLK_CTL_BASE + 0x0298) -#define VDD_APC_PLEVEL(n) (VDD_APC_PLEVEL_BASE + 4 * n) - -/* Address for SYS_P_Level register */ -#define VDD_SVS_PLEVEL_ADDR (MSM_CSR_BASE + 0x124) - -#define MV_TO_UV(mv) ((mv)*1000) -#define UV_TO_MV(uv) (((uv)+999)/1000) - -#define MSM_VP_REGULATOR_DEV_NAME "vp-regulator" - -/** - * Convert Voltage to PLEVEL register value - * Here x is required voltage in minivolt - * e.g. if Required voltage is 1200mV then - * required value to be programmed into the - * Plevel register is 0x32. This equation is - * based on H/W logic being used in SVS controller. - * - * Here we are taking the minimum voltage step - * to be 12.5mV as per H/W logic and adding 0x20 - * is for selecting the reference voltage. - * 750mV is minimum voltage of MSMC2 smps. - */ -#define VOLT_TO_BIT(x) (((x-750)/(12500/1000)) + 0x20) -#define VREG_VREF_SEL (1 << 5) -#define VREG_VREF_SEL_SHIFT (0x5) -#define VREG_PD_EN (1 << 6) -#define VREG_PD_EN_SHIFT (0x6) -#define VREG_LVL_M (0x1F) - -/** - * struct msm_vp - Structure for VP - * @regulator_dev: structure for regulator device - * @current_voltage: current voltage value - */ -struct msm_vp { - struct device *dev; - struct regulator_dev *rdev; - int current_voltage; -}; - -/* Function to change the Vdd Level */ -static int vp_reg_set_voltage(struct regulator_dev *rdev, int min_uV, - int max_uV, unsigned *sel) -{ - struct msm_vp *vp = rdev_get_drvdata(rdev); - uint32_t reg_val, perf_level, plevel, cur_plevel, fine_step_volt; - - reg_val = readl_relaxed(VDD_SVS_PLEVEL_ADDR); - perf_level = reg_val & 0x07; - - plevel = (min_uV - 750000) / 25000; - fine_step_volt = (min_uV - 750000) % 25000; - - /** - * Program the new voltage level for the current perf_level - * in corresponding PLEVEL register. - */ - cur_plevel = readl_relaxed(VDD_APC_PLEVEL(perf_level)); - /* clear lower 7 bits */ - cur_plevel &= ~(0x7F); - cur_plevel |= (plevel | VREG_VREF_SEL); - if (fine_step_volt >= 12500) - cur_plevel |= VREG_PD_EN; - writel_relaxed(cur_plevel, VDD_APC_PLEVEL(perf_level)); - - /* Clear the current perf level */ - reg_val &= 0xF8; - writel_relaxed(reg_val, VDD_SVS_PLEVEL_ADDR); - - /* Initiate the PMIC SSBI request to change the voltage */ - reg_val |= (BIT(7) | perf_level << 3); - writel_relaxed(reg_val, VDD_SVS_PLEVEL_ADDR); - mb(); - udelay(62); - - if ((readl_relaxed(VDD_SVS_PLEVEL_ADDR) & 0x07) != perf_level) { - pr_err("Vdd Set Failed\n"); - return -EIO; - } - - vp->current_voltage = (min_uV / 1000); - return 0; -} - -static int vp_reg_get_voltage(struct regulator_dev *rdev) -{ - uint32_t reg_val, perf_level, vlevel, cur_plevel; - uint32_t vref_sel, pd_en; - uint32_t cur_voltage; - - reg_val = readl_relaxed(VDD_SVS_PLEVEL_ADDR); - perf_level = reg_val & 0x07; - - cur_plevel = readl_relaxed(VDD_APC_PLEVEL(perf_level)); - vref_sel = (cur_plevel >> VREG_VREF_SEL_SHIFT) & 0x1; - pd_en = (cur_plevel >> VREG_PD_EN_SHIFT) & 0x1; - vlevel = cur_plevel & VREG_LVL_M; - - cur_voltage = (750000 + (pd_en * 12500) + - (vlevel * 25000)) * (2 - vref_sel); - return cur_voltage; -} - -static int vp_reg_enable(struct regulator_dev *rdev) -{ - return 0; -} - -static int vp_reg_disable(struct regulator_dev *rdev) -{ - return 0; -} - -/* Regulator registration specific data */ -/* FIXME: should move to board-xx-regulator.c file */ -static struct regulator_consumer_supply vp_consumer = - REGULATOR_SUPPLY("vddx_cx", "msm-cpr"); - -static struct regulator_init_data vp_reg_data = { - .constraints = { - .name = "vddx_c2", - .min_uV = 750000, - .max_uV = 1500000, - .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | - REGULATOR_CHANGE_STATUS, - .valid_modes_mask = REGULATOR_MODE_NORMAL, - .boot_on = 1, - .input_uV = 0, - .always_on = 1, - }, - .num_consumer_supplies = 1, - .consumer_supplies = &vp_consumer, -}; - -/* Regulator specific ops */ -static struct regulator_ops vp_reg_ops = { - .enable = vp_reg_enable, - .disable = vp_reg_disable, - .get_voltage = vp_reg_get_voltage, - .set_voltage = vp_reg_set_voltage, -}; - -/* Regulator Description */ -static struct regulator_desc vp_reg = { - .name = "vddcx", - .id = -1, - .ops = &vp_reg_ops, - .type = REGULATOR_VOLTAGE, -}; - -static int msm_vp_reg_probe(struct platform_device *pdev) -{ - struct msm_vp *vp; - int rc; - - vp = kzalloc(sizeof(struct msm_vp), GFP_KERNEL); - if (!vp) { - pr_err("Could not allocate memory for VP\n"); - return -ENOMEM; - } - - vp->rdev = regulator_register(&vp_reg, NULL, &vp_reg_data, vp, NULL); - if (IS_ERR(vp->rdev)) { - rc = PTR_ERR(vp->rdev); - pr_err("Failed to register regulator: %d\n", rc); - goto error; - } - - platform_set_drvdata(pdev, vp); - - return 0; -error: - kfree(vp); - return rc; -} - -static int msm_vp_reg_remove(struct platform_device *pdev) -{ - struct msm_vp *vp = platform_get_drvdata(pdev); - - regulator_unregister(vp->rdev); - platform_set_drvdata(pdev, NULL); - kfree(vp); - - return 0; -} - -static struct platform_driver msm_vp_reg_driver = { - .probe = msm_vp_reg_probe, - .remove = msm_vp_reg_remove, - .driver = { - .name = MSM_VP_REGULATOR_DEV_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init msm_vp_reg_init(void) -{ - return platform_driver_register(&msm_vp_reg_driver); -} -postcore_initcall(msm_vp_reg_init); - -static void __exit msm_vp_reg_exit(void) -{ - platform_driver_unregister(&msm_vp_reg_driver); -} -module_exit(msm_vp_reg_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MSM VP regulator driver"); -MODULE_VERSION("1.0"); -MODULE_ALIAS("platform:" MSM_VP_REGULATOR_DEV_NAME); diff --git a/arch/arm/mach-msm/msm_watchdog.c b/arch/arm/mach-msm/msm_watchdog.c deleted file mode 100644 index e11be221942e..000000000000 --- a/arch/arm/mach-msm/msm_watchdog.c +++ /dev/null @@ -1,482 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "msm_watchdog.h" -#include "timer.h" - -#define MODULE_NAME "msm_watchdog" - -#define TCSR_WDT_CFG 0x30 - -#define WDT_RST 0x0 -#define WDT_EN 0x8 -#define WDT_STS 0xC -#define WDT_BARK_TIME 0x14 -#define WDT_BITE_TIME 0x24 - -#define WDT_HZ 32768 - -struct msm_watchdog_dump msm_dump_cpu_ctx; - -static void __iomem *msm_wdt_base; - -static unsigned long delay_time; -static unsigned long bark_time; -static unsigned long long last_pet; -static bool has_vic; -static unsigned int msm_wdog_irq; - -/* - * On the kernel command line specify - * msm_watchdog.enable=1 to enable the watchdog - * By default watchdog is turned on - */ -static int enable = 1; -module_param(enable, int, 0); - -/* - * Watchdog bark reboot timeout in seconds. - * Can be specified in kernel command line. - */ -static int reboot_bark_timeout = 22; -module_param(reboot_bark_timeout, int, 0644); -/* - * If the watchdog is enabled at bootup (enable=1), - * the runtime_disable sysfs node at - * /sys/module/msm_watchdog/runtime_disable - * can be used to deactivate the watchdog. - * This is a one-time setting. The watchdog - * cannot be re-enabled once it is disabled. - */ -static int runtime_disable; -static DEFINE_MUTEX(disable_lock); -static int wdog_enable_set(const char *val, struct kernel_param *kp); -module_param_call(runtime_disable, wdog_enable_set, param_get_int, - &runtime_disable, 0644); - -/* - * On the kernel command line specify msm_watchdog.appsbark=1 to handle - * watchdog barks in Linux. By default barks are processed by the secure side. - */ -static int appsbark; -module_param(appsbark, int, 0); - -static int appsbark_fiq; - -/* - * Use /sys/module/msm_watchdog/parameters/print_all_stacks - * to control whether stacks of all running - * processes are printed when a wdog bark is received. - */ -static int print_all_stacks = 1; -module_param(print_all_stacks, int, S_IRUGO | S_IWUSR); - -/* Area for context dump in secure mode */ -static void *scm_regsave; - -static struct msm_watchdog_pdata __percpu **percpu_pdata; - -static void pet_watchdog_work(struct work_struct *work); -static void init_watchdog_work(struct work_struct *work); -static DECLARE_DELAYED_WORK(dogwork_struct, pet_watchdog_work); -static DECLARE_WORK(init_dogwork_struct, init_watchdog_work); - -/* Called from the FIQ bark handler */ -void msm_wdog_bark_fin(void) -{ - flush_cache_all(); - pr_crit("\nApps Watchdog bark received - Calling Panic\n"); - panic("Apps Watchdog Bark received\n"); -} - -static int msm_watchdog_suspend(struct device *dev) -{ - if (!enable) - return 0; - - __raw_writel(1, msm_wdt_base + WDT_RST); - __raw_writel(0, msm_wdt_base + WDT_EN); - mb(); - return 0; -} - -static int msm_watchdog_resume(struct device *dev) -{ - if (!enable) - return 0; - - __raw_writel(1, msm_wdt_base + WDT_EN); - __raw_writel(1, msm_wdt_base + WDT_RST); - mb(); - return 0; -} - -static int panic_wdog_handler(struct notifier_block *this, - unsigned long event, void *ptr) -{ - if (panic_timeout == 0) { - __raw_writel(0, msm_wdt_base + WDT_EN); - mb(); - } else { - __raw_writel(WDT_HZ * (panic_timeout + 4), - msm_wdt_base + WDT_BARK_TIME); - __raw_writel(WDT_HZ * (panic_timeout + 4), - msm_wdt_base + WDT_BITE_TIME); - __raw_writel(1, msm_wdt_base + WDT_RST); - } - return NOTIFY_DONE; -} - -static struct notifier_block panic_blk = { - .notifier_call = panic_wdog_handler, -}; - -#define get_sclk_hz(t_ms) ((t_ms / 1000) * WDT_HZ) -#define get_reboot_bark_timeout(t_s) ((t_s * MSEC_PER_SEC) < bark_time ? \ - get_sclk_hz(bark_time) : get_sclk_hz(t_s * MSEC_PER_SEC)) - -static int msm_watchdog_reboot_notifier(struct notifier_block *this, - unsigned long code, void *unused) -{ - - u64 timeout = get_reboot_bark_timeout(reboot_bark_timeout); - __raw_writel(timeout, msm_wdt_base + WDT_BARK_TIME); - __raw_writel(timeout + 3 * WDT_HZ, - msm_wdt_base + WDT_BITE_TIME); - __raw_writel(1, msm_wdt_base + WDT_RST); - - return NOTIFY_DONE; -} - -static struct notifier_block msm_reboot_notifier = { - .notifier_call = msm_watchdog_reboot_notifier, -}; - -struct wdog_disable_work_data { - struct work_struct work; - struct completion complete; -}; - -static void wdog_disable_work(struct work_struct *work) -{ - struct wdog_disable_work_data *work_data = - container_of(work, struct wdog_disable_work_data, work); - __raw_writel(0, msm_wdt_base + WDT_EN); - mb(); - if (has_vic) { - free_irq(msm_wdog_irq, 0); - } else { - disable_percpu_irq(msm_wdog_irq); - if (!appsbark_fiq) { - free_percpu_irq(msm_wdog_irq, - percpu_pdata); - free_percpu(percpu_pdata); - } - } - enable = 0; - atomic_notifier_chain_unregister(&panic_notifier_list, &panic_blk); - unregister_reboot_notifier(&msm_reboot_notifier); - cancel_delayed_work(&dogwork_struct); - /* may be suspended after the first write above */ - __raw_writel(0, msm_wdt_base + WDT_EN); - complete(&work_data->complete); - pr_info("MSM Watchdog deactivated.\n"); -} - -static int wdog_enable_set(const char *val, struct kernel_param *kp) -{ - int ret = 0; - int old_val = runtime_disable; - struct wdog_disable_work_data work_data; - - mutex_lock(&disable_lock); - if (!enable) { - printk(KERN_INFO "MSM Watchdog is not active.\n"); - ret = -EINVAL; - goto done; - } - - ret = param_set_int(val, kp); - if (ret) - goto done; - - if (runtime_disable == 1) { - if (old_val) - goto done; - init_completion(&work_data.complete); - INIT_WORK_ONSTACK(&work_data.work, wdog_disable_work); - schedule_work_on(0, &work_data.work); - wait_for_completion(&work_data.complete); - } else { - runtime_disable = old_val; - ret = -EINVAL; - } -done: - mutex_unlock(&disable_lock); - return ret; -} - -unsigned min_slack_ticks = UINT_MAX; -unsigned long long min_slack_ns = ULLONG_MAX; - -void pet_watchdog(void) -{ - int slack; - unsigned long long time_ns; - unsigned long long slack_ns; - unsigned long long bark_time_ns = bark_time * 1000000ULL; - - if (!enable) - return; - - slack = __raw_readl(msm_wdt_base + WDT_STS) >> 3; - slack = ((bark_time*WDT_HZ)/1000) - slack; - if (slack < min_slack_ticks) - min_slack_ticks = slack; - __raw_writel(1, msm_wdt_base + WDT_RST); - time_ns = sched_clock(); - slack_ns = (last_pet + bark_time_ns) - time_ns; - if (slack_ns < min_slack_ns) - min_slack_ns = slack_ns; - last_pet = time_ns; -} - -static void pet_watchdog_work(struct work_struct *work) -{ - pet_watchdog(); - - if (enable) - schedule_delayed_work_on(0, &dogwork_struct, delay_time); -} - -static irqreturn_t wdog_bark_handler(int irq, void *dev_id) -{ - unsigned long nanosec_rem; - unsigned long long t = sched_clock(); - struct task_struct *tsk; - - nanosec_rem = do_div(t, 1000000000); - printk(KERN_INFO "Watchdog bark! Now = %lu.%06lu\n", (unsigned long) t, - nanosec_rem / 1000); - - nanosec_rem = do_div(last_pet, 1000000000); - printk(KERN_INFO "Watchdog last pet at %lu.%06lu\n", (unsigned long) - last_pet, nanosec_rem / 1000); - - if (print_all_stacks) { - - /* Suspend wdog until all stacks are printed */ - msm_watchdog_suspend(NULL); - - printk(KERN_INFO "Stack trace dump:\n"); - - for_each_process(tsk) { - printk(KERN_INFO "\nPID: %d, Name: %s\n", - tsk->pid, tsk->comm); - show_stack(tsk, NULL); - } - - msm_watchdog_resume(NULL); - } - - panic("Apps watchdog bark received!"); - return IRQ_HANDLED; -} - -#define SCM_SET_REGSAVE_CMD 0x2 - -static void configure_bark_dump(void) -{ - int ret; - struct { - unsigned addr; - int len; - } cmd_buf; - - if (!appsbark) { - scm_regsave = (void *)__get_free_page(GFP_KERNEL); - - if (scm_regsave) { - cmd_buf.addr = __pa(scm_regsave); - cmd_buf.len = PAGE_SIZE; - - ret = scm_call(SCM_SVC_UTIL, SCM_SET_REGSAVE_CMD, - &cmd_buf, sizeof(cmd_buf), NULL, 0); - if (ret) - pr_err("Setting register save address failed.\n" - "Registers won't be dumped on a dog " - "bite\n"); - } else { - pr_err("Allocating register save space failed\n" - "Registers won't be dumped on a dog bite\n"); - /* - * No need to bail if allocation fails. Simply don't - * send the command, and the secure side will reset - * without saving registers. - */ - } - } -} - -struct fiq_handler wdog_fh = { - .name = MODULE_NAME, -}; - -static void init_watchdog_work(struct work_struct *work) -{ - u64 timeout = (bark_time * WDT_HZ)/1000; - void *stack; - int ret; - - if (has_vic) { - ret = request_irq(msm_wdog_irq, wdog_bark_handler, 0, - "apps_wdog_bark", NULL); - if (ret) - return; - } else if (appsbark_fiq) { - claim_fiq(&wdog_fh); - set_fiq_handler(&msm_wdog_fiq_start, msm_wdog_fiq_length); - stack = (void *)__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER); - if (!stack) { - pr_info("No free pages available - %s fails\n", - __func__); - return; - } - - msm_wdog_fiq_setup(stack); - gic_set_irq_secure(msm_wdog_irq); - } else { - percpu_pdata = alloc_percpu(struct msm_watchdog_pdata *); - if (!percpu_pdata) { - pr_err("%s: memory allocation failed for percpu data\n", - __func__); - return; - } - - /* Must request irq before sending scm command */ - ret = request_percpu_irq(msm_wdog_irq, - wdog_bark_handler, "apps_wdog_bark", percpu_pdata); - if (ret) { - free_percpu(percpu_pdata); - return; - } - } - - configure_bark_dump(); - - __raw_writel(timeout, msm_wdt_base + WDT_BARK_TIME); - __raw_writel(timeout + 3*WDT_HZ, msm_wdt_base + WDT_BITE_TIME); - - schedule_delayed_work_on(0, &dogwork_struct, delay_time); - - atomic_notifier_chain_register(&panic_notifier_list, - &panic_blk); - - ret = register_reboot_notifier(&msm_reboot_notifier); - if (ret) - pr_err("Failed to register reboot notifier\n"); - - __raw_writel(1, msm_wdt_base + WDT_EN); - __raw_writel(1, msm_wdt_base + WDT_RST); - last_pet = sched_clock(); - - if (!has_vic) - enable_percpu_irq(msm_wdog_irq, IRQ_TYPE_EDGE_RISING); - - printk(KERN_INFO "MSM Watchdog Initialized\n"); - - return; -} - -static int msm_watchdog_probe(struct platform_device *pdev) -{ - struct msm_watchdog_pdata *pdata = pdev->dev.platform_data; - - if (!enable || !pdata || !pdata->pet_time || !pdata->bark_time) { - printk(KERN_INFO "MSM Watchdog Not Initialized\n"); - return -ENODEV; - } - - bark_time = pdata->bark_time; - /* reboot_bark_timeout (in seconds) might have been supplied as - * module parameter. - */ - if ((reboot_bark_timeout * MSEC_PER_SEC) < bark_time) - reboot_bark_timeout = (bark_time / MSEC_PER_SEC); - has_vic = pdata->has_vic; - if (!pdata->has_secure) { - appsbark = 1; - appsbark_fiq = pdata->use_kernel_fiq; - } - - msm_wdt_base = pdata->base; - msm_wdog_irq = platform_get_irq(pdev, 0); - - /* - * This is only temporary till SBLs turn on the XPUs - * This initialization will be done in SBLs on a later releases - */ - if (cpu_is_msm9615()) - __raw_writel(0xF, MSM_TCSR_BASE + TCSR_WDT_CFG); - - if (pdata->needs_expired_enable) - __raw_writel(0x1, MSM_CLK_CTL_BASE + 0x3820); - - delay_time = msecs_to_jiffies(pdata->pet_time); - schedule_work_on(0, &init_dogwork_struct); - return 0; -} - -static const struct dev_pm_ops msm_watchdog_dev_pm_ops = { - .suspend_noirq = msm_watchdog_suspend, - .resume_noirq = msm_watchdog_resume, -}; - -static struct platform_driver msm_watchdog_driver = { - .probe = msm_watchdog_probe, - .driver = { - .name = MODULE_NAME, - .owner = THIS_MODULE, - .pm = &msm_watchdog_dev_pm_ops, - }, -}; - -static int init_watchdog(void) -{ - return platform_driver_register(&msm_watchdog_driver); -} - -late_initcall(init_watchdog); -MODULE_DESCRIPTION("MSM Watchdog Driver"); -MODULE_VERSION("1.0"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/msm_watchdog_asm.S b/arch/arm/mach-msm/msm_watchdog_asm.S deleted file mode 100644 index ea6cc383540b..000000000000 --- a/arch/arm/mach-msm/msm_watchdog_asm.S +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#define VERSION_ID 0x1 -#define MAGIC 0xDEAD0000 | VERSION_ID - - .text - - .align 3 - -ENTRY(msm_wdog_fiq_start) - mov sp, r8 @get stack - ldr r8, Ldump_cpu_ctx - @ store magic to indicate a valid dump - ldr r9, Lmagic - str r9, [r8], #4 - @ get the current cpsr - mrs r9, cpsr - str r9, [r8],#4 - @ get the USR r0-r7 - stmia r8!, {r0-r7} - mov r4, r8 - mov r5, #PSR_I_BIT | PSR_F_BIT | SYSTEM_MODE - msr cpsr_c, r5 @ select SYSTEM mode - stmia r4!, {r8-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | IRQ_MODE - msr cpsr_c, r5 @ select IRQ mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | SVC_MODE - msr cpsr_c, r5 @ select SVC mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | ABT_MODE - msr cpsr_c, r5 @ select ABT mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | UND_MODE - msr cpsr_c, r5 @ select UND mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r13-r14} - mov r5, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE - msr cpsr_c, r5 @ select FIQ mode - mrs r5, spsr - str r5, [r4], #4 - stmia r4!, {r8-r14} - dsb - mov r5, #PSR_F_BIT | SVC_MODE - msr cpsr_c, r5 @ select SVC mode - ldr r2, Lwatchdog_bark_fin - blx r2 -Ldump_cpu_ctx: - .word msm_dump_cpu_ctx -Lmagic: - .word MAGIC -Lwatchdog_bark_fin: - .word msm_wdog_bark_fin -ENTRY(msm_wdog_fiq_length) - .word . - msm_wdog_fiq_start - -/* setup the stack */ -ENTRY(msm_wdog_fiq_setup) - mrs r3, cpsr - msr cpsr_c, #(FIQ_MODE | PSR_I_BIT | PSR_F_BIT) - mov r8, r0 - msr cpsr_c, r3 - bx lr diff --git a/arch/arm/mach-msm/msm_xo.c b/arch/arm/mach-msm/msm_xo.c deleted file mode 100644 index e7c4a6a41734..000000000000 --- a/arch/arm/mach-msm/msm_xo.c +++ /dev/null @@ -1,387 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "rpm_resources.h" - -static DEFINE_MUTEX(msm_xo_lock); - -struct msm_xo { - unsigned votes[NUM_MSM_XO_MODES]; - unsigned mode; - struct list_head voters; -}; - -struct msm_xo_voter { - const char *name; - unsigned mode; - struct msm_xo *xo; - struct list_head list; -}; - -static struct msm_xo msm_xo_sources[NUM_MSM_XO_IDS]; - -#ifdef CONFIG_DEBUG_FS -static const char *msm_xo_to_str[NUM_MSM_XO_IDS] = { - [MSM_XO_TCXO_D0] = "D0", - [MSM_XO_TCXO_D1] = "D1", - [MSM_XO_TCXO_A0] = "A0", - [MSM_XO_TCXO_A1] = "A1", - [MSM_XO_TCXO_A2] = "A2", - [MSM_XO_CORE] = "CORE", -}; - -static const char *msm_xo_mode_to_str[NUM_MSM_XO_MODES] = { - [MSM_XO_MODE_ON] = "ON", - [MSM_XO_MODE_PIN_CTRL] = "PIN", - [MSM_XO_MODE_OFF] = "OFF", -}; - -static int msm_xo_debugfs_open(struct inode *inode, struct file *filp) -{ - filp->private_data = inode->i_private; - return 0; -} - -static ssize_t msm_xo_debugfs_read(struct file *filp, char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - int r; - char buf[10]; - struct msm_xo_voter *xo = filp->private_data; - - r = snprintf(buf, sizeof(buf), "%s\n", msm_xo_mode_to_str[xo->mode]); - return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); -} - -static ssize_t msm_xo_debugfs_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct msm_xo_voter *xo = filp->private_data; - char buf[10], *b; - int i, ret; - - if (cnt > sizeof(buf) - 1) - return -EINVAL; - - if (copy_from_user(&buf, ubuf, cnt)) - return -EFAULT; - buf[cnt] = '\0'; - b = strstrip(buf); - - for (i = 0; i < ARRAY_SIZE(msm_xo_mode_to_str); i++) - if (!strncasecmp(b, msm_xo_mode_to_str[i], sizeof(buf))) { - ret = msm_xo_mode_vote(xo, i); - return ret ? : cnt; - } - - return -EINVAL; -} - -static const struct file_operations msm_xo_debugfs_fops = { - .open = msm_xo_debugfs_open, - .read = msm_xo_debugfs_read, - .write = msm_xo_debugfs_write, -}; - -static struct dentry *xo_debugfs_root; -static struct msm_xo_voter *xo_debugfs_voters[NUM_MSM_XO_IDS]; - -static int __init msm_xo_init_debugfs_voters(void) -{ - int i; - - xo_debugfs_root = debugfs_create_dir("msm_xo", NULL); - if (!xo_debugfs_root) - return -ENOMEM; - - for (i = 0; i < ARRAY_SIZE(msm_xo_sources); i++) { - xo_debugfs_voters[i] = msm_xo_get(i, "debugfs"); - if (IS_ERR(xo_debugfs_voters[i])) - goto err; - debugfs_create_file(msm_xo_to_str[i], S_IRUGO | S_IWUSR, - xo_debugfs_root, xo_debugfs_voters[i], - &msm_xo_debugfs_fops); - } - return 0; -err: - while (--i >= 0) - msm_xo_put(xo_debugfs_voters[i]); - debugfs_remove_recursive(xo_debugfs_root); - return -ENOMEM; -} - -static void msm_xo_dump_xo(struct seq_file *m, struct msm_xo *xo, - const char *name) -{ - struct msm_xo_voter *voter; - - seq_printf(m, "CXO %-16s%s\n", name, msm_xo_mode_to_str[xo->mode]); - list_for_each_entry(voter, &xo->voters, list) - seq_printf(m, " %s %-16s %s\n", - xo->mode == voter->mode ? "*" : " ", - voter->name, - msm_xo_mode_to_str[voter->mode]); -} - -static int msm_xo_show_voters(struct seq_file *m, void *v) -{ - int i; - - mutex_lock(&msm_xo_lock); - for (i = 0; i < ARRAY_SIZE(msm_xo_sources); i++) - msm_xo_dump_xo(m, &msm_xo_sources[i], msm_xo_to_str[i]); - mutex_unlock(&msm_xo_lock); - - return 0; -} - -static int msm_xo_voters_open(struct inode *inode, struct file *file) -{ - return single_open(file, msm_xo_show_voters, inode->i_private); -} - -static const struct file_operations msm_xo_voters_ops = { - .open = msm_xo_voters_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; - -static int __init msm_xo_debugfs_init(void) -{ - msm_xo_init_debugfs_voters(); - if (!debugfs_create_file("xo_voters", S_IRUGO, NULL, NULL, - &msm_xo_voters_ops)) - return -ENOMEM; - return 0; -} -#else -static int __init msm_xo_debugfs_init(void) { return 0; } -#endif - -static int msm_xo_update_vote(struct msm_xo *xo) -{ - int ret; - unsigned vote, prev_vote = xo->mode; - struct msm_rpm_iv_pair cmd; - - if (xo->votes[MSM_XO_MODE_ON]) - vote = MSM_XO_MODE_ON; - else if (xo->votes[MSM_XO_MODE_PIN_CTRL]) - vote = MSM_XO_MODE_PIN_CTRL; - else - vote = MSM_XO_MODE_OFF; - - if (vote == prev_vote) - return 0; - - /* - * Change the vote here to simplify the TCXO logic. If the RPM - * command fails we'll rollback. - */ - xo->mode = vote; - cmd.id = MSM_RPM_ID_CXO_BUFFERS; - cmd.value = (msm_xo_sources[MSM_XO_TCXO_D0].mode << 0) | - (msm_xo_sources[MSM_XO_TCXO_D1].mode << 8) | - (msm_xo_sources[MSM_XO_TCXO_A0].mode << 16) | - (msm_xo_sources[MSM_XO_TCXO_A1].mode << 24) | - (msm_xo_sources[MSM_XO_TCXO_A2].mode << 28) | - /* - * 8660 RPM has XO_CORE at bit 18 and 8960 RPM has - * XO_CORE at bit 20. Since the opposite bit is - * reserved in both cases, just set both and be - * done with it. - */ - ((msm_xo_sources[MSM_XO_CORE].mode ? 1 : 0) << 20) | - ((msm_xo_sources[MSM_XO_CORE].mode ? 1 : 0) << 18); - ret = msm_rpm_set(MSM_RPM_CTX_SET_0, &cmd, 1); - - if (ret) - xo->mode = prev_vote; - - return ret; -} - -static int __msm_xo_mode_vote(struct msm_xo_voter *xo_voter, unsigned mode) -{ - int ret; - struct msm_xo *xo = xo_voter->xo; - int is_d0 = xo == &msm_xo_sources[MSM_XO_TCXO_D0]; - int needs_workaround = soc_class_is_msm8960() || - soc_class_is_apq8064() || - soc_class_is_msm8930() || cpu_is_msm9615(); - - if (xo_voter->mode == mode) - return 0; - - xo->votes[mode]++; - xo->votes[xo_voter->mode]--; - ret = msm_xo_update_vote(xo); - if (ret) { - xo->votes[xo_voter->mode]++; - xo->votes[mode]--; - goto out; - } - /* TODO: Remove once RPM separates the concept of D0 and CXO */ - if (is_d0 && needs_workaround) { - static struct clk *xo_clk; - - if (!xo_clk) { - xo_clk = clk_get_sys("msm_xo", "xo"); - BUG_ON(IS_ERR(xo_clk)); - } - /* Ignore transitions from pin to on or vice versa */ - if (mode && xo_voter->mode == MSM_XO_MODE_OFF) - clk_prepare_enable(xo_clk); - else if (!mode) - clk_disable_unprepare(xo_clk); - } - xo_voter->mode = mode; -out: - return ret; -} - -/** - * msm_xo_mode_vote() - Vote for an XO to be ON, OFF, or under PIN_CTRL - * @xo_voter - Valid handle returned from msm_xo_get() - * @mode - Mode to vote for (ON, OFF, PIN_CTRL) - * - * Vote for an XO to be either ON, OFF, or under PIN_CTRL. Votes are - * aggregated with ON taking precedence over PIN_CTRL taking precedence - * over OFF. - * - * This function returns 0 on success or a negative error code on failure. - */ -int msm_xo_mode_vote(struct msm_xo_voter *xo_voter, enum msm_xo_modes mode) -{ - int ret; - - if (!xo_voter) - return 0; - - if (mode >= NUM_MSM_XO_MODES || IS_ERR(xo_voter)) - return -EINVAL; - - mutex_lock(&msm_xo_lock); - ret = __msm_xo_mode_vote(xo_voter, mode); - mutex_unlock(&msm_xo_lock); - - return ret; -} -EXPORT_SYMBOL(msm_xo_mode_vote); - -/** - * msm_xo_get() - Get a voting handle for an XO - * @xo_id - XO identifier - * @voter - Debug string to identify users - * - * XO voters vote for OFF by default. This function returns a pointer - * indicating success. An ERR_PTR is returned on failure. - * - * If XO voting is disabled, %NULL is returned. - */ -struct msm_xo_voter *msm_xo_get(enum msm_xo_ids xo_id, const char *voter) -{ - int ret; - struct msm_xo_voter *xo_voter; - - if (xo_id >= NUM_MSM_XO_IDS) { - ret = -EINVAL; - goto err; - } - - xo_voter = kzalloc(sizeof(*xo_voter), GFP_KERNEL); - if (!xo_voter) { - ret = -ENOMEM; - goto err; - } - - xo_voter->name = kstrdup(voter, GFP_KERNEL); - if (!xo_voter->name) { - ret = -ENOMEM; - goto err_name; - } - - xo_voter->xo = &msm_xo_sources[xo_id]; - - /* Voters vote for OFF by default */ - mutex_lock(&msm_xo_lock); - xo_voter->xo->votes[MSM_XO_MODE_OFF]++; - list_add(&xo_voter->list, &xo_voter->xo->voters); - mutex_unlock(&msm_xo_lock); - - return xo_voter; - -err_name: - kfree(xo_voter); -err: - return ERR_PTR(ret); -} -EXPORT_SYMBOL(msm_xo_get); - -/** - * msm_xo_put() - Release a voting handle - * @xo_voter - Valid handle returned from msm_xo_get() - * - * Release a reference to an XO voting handle. This also removes the voter's - * vote, therefore calling msm_xo_mode_vote(xo_voter, MSM_XO_MODE_OFF) - * beforehand is unnecessary. - */ -void msm_xo_put(struct msm_xo_voter *xo_voter) -{ - if (!xo_voter || IS_ERR(xo_voter)) - return; - - mutex_lock(&msm_xo_lock); - __msm_xo_mode_vote(xo_voter, MSM_XO_MODE_OFF); - xo_voter->xo->votes[MSM_XO_MODE_OFF]--; - list_del(&xo_voter->list); - mutex_unlock(&msm_xo_lock); - - kfree(xo_voter->name); - kfree(xo_voter); -} -EXPORT_SYMBOL(msm_xo_put); - -int __init msm_xo_init(void) -{ - int i, ret; - struct msm_rpm_iv_pair cmd[1]; - - for (i = 0; i < ARRAY_SIZE(msm_xo_sources); i++) - INIT_LIST_HEAD(&msm_xo_sources[i].voters); - - cmd[0].id = MSM_RPM_ID_CXO_BUFFERS; - cmd[0].value = 0; - ret = msm_rpmrs_set(MSM_RPM_CTX_SET_0, cmd, ARRAY_SIZE(cmd)); - if (ret) - return ret; - msm_xo_debugfs_init(); - return 0; -} diff --git a/arch/arm/mach-msm/nand_partitions.c b/arch/arm/mach-msm/nand_partitions.c deleted file mode 100644 index ad2a10ec1640..000000000000 --- a/arch/arm/mach-msm/nand_partitions.c +++ /dev/null @@ -1,202 +0,0 @@ -/* arch/arm/mach-msm/nand_partitions.c - * - * Code to extract partition information from ATAG set up by the - * bootloader. - * - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2008-2009,2011,2013 The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#include -#include - -#include - -#include -#include - -#include - -#include -#ifdef CONFIG_MSM_SMD -#include -#endif - -/* configuration tags specific to msm */ - -#define ATAG_MSM_PARTITION 0x4d534D70 /* MSMp */ - -struct msm_ptbl_entry { - char name[16]; - __u32 offset; - __u32 size; - __u32 flags; -}; - -#define MSM_MAX_PARTITIONS 18 - -static struct mtd_partition msm_nand_partitions[MSM_MAX_PARTITIONS]; -static char msm_nand_names[MSM_MAX_PARTITIONS * 16]; - -extern struct flash_platform_data msm_nand_data; - -static int __init parse_tag_msm_partition(const struct tag *tag) -{ - struct mtd_partition *ptn = msm_nand_partitions; - char *name = msm_nand_names; - struct msm_ptbl_entry *entry = (void *) &tag->u; - unsigned count, n; - - count = (tag->hdr.size - 2) / - (sizeof(struct msm_ptbl_entry) / sizeof(__u32)); - - if (count > MSM_MAX_PARTITIONS) - count = MSM_MAX_PARTITIONS; - - for (n = 0; n < count; n++) { - memcpy(name, entry->name, 15); - name[15] = 0; - - ptn->name = name; - ptn->offset = entry->offset; - ptn->size = entry->size; - - printk(KERN_INFO "Partition (from atag) %s " - "-- Offset:%llx Size:%llx\n", - ptn->name, ptn->offset, ptn->size); - - name += 16; - entry++; - ptn++; - } - - msm_nand_data.nr_parts = count; - msm_nand_data.parts = msm_nand_partitions; - - return 0; -} - -__tagtable(ATAG_MSM_PARTITION, parse_tag_msm_partition); - -#define FLASH_PART_MAGIC1 0x55EE73AA -#define FLASH_PART_MAGIC2 0xE35EBDDB -#define FLASH_PARTITION_VERSION 0x3 - -#define LINUX_FS_PARTITION_NAME "0:EFS2APPS" - -struct flash_partition_entry { - char name[16]; - u32 offset; /* Offset in blocks from beginning of device */ - u32 length; /* Length of the partition in blocks */ - u8 attrib1; - u8 attrib2; - u8 attrib3; - u8 which_flash; /* Numeric ID (first = 0, second = 1) */ -}; -struct flash_partition_table { - u32 magic1; - u32 magic2; - u32 version; - u32 numparts; - struct flash_partition_entry part_entry[16]; -}; - -#ifdef CONFIG_MSM_SMD -static int get_nand_partitions(void) -{ - struct flash_partition_table *partition_table; - struct flash_partition_entry *part_entry; - struct mtd_partition *ptn = msm_nand_partitions; - char *name = msm_nand_names; - int part; - - if (msm_nand_data.nr_parts) - return 0; - - partition_table = (struct flash_partition_table *) - smem_alloc(SMEM_AARM_PARTITION_TABLE, - sizeof(struct flash_partition_table)); - - if (!partition_table) { - printk(KERN_WARNING "%s: no flash partition table in shared " - "memory\n", __func__); - return -ENOENT; - } - - if ((partition_table->magic1 != (u32) FLASH_PART_MAGIC1) || - (partition_table->magic2 != (u32) FLASH_PART_MAGIC2) || - (partition_table->version != (u32) FLASH_PARTITION_VERSION)) { - printk(KERN_WARNING "%s: version mismatch -- magic1=%#x, " - "magic2=%#x, version=%#x\n", __func__, - partition_table->magic1, - partition_table->magic2, - partition_table->version); - return -EFAULT; - } - - msm_nand_data.nr_parts = 0; - - /* Get the LINUX FS partition info */ - for (part = 0; part < partition_table->numparts; part++) { - part_entry = &partition_table->part_entry[part]; - - /* Find a match for the Linux file system partition */ - if (strcmp(part_entry->name, LINUX_FS_PARTITION_NAME) == 0) { - strcpy(name, part_entry->name); - ptn->name = name; - - /*TODO: Get block count and size info */ - ptn->offset = part_entry->offset; - - /* For SMEM, -1 indicates remaining space in flash, - * but for MTD it is 0 - */ - if (part_entry->length == (u32)-1) - ptn->size = 0; - else - ptn->size = part_entry->length; - - msm_nand_data.nr_parts = 1; - msm_nand_data.parts = msm_nand_partitions; - - printk(KERN_INFO "Partition(from smem) %s " - "-- Offset:%llx Size:%llx\n", - ptn->name, ptn->offset, ptn->size); - - return 0; - } - } - - printk(KERN_WARNING "%s: no partition table found!", __func__); - - return -ENODEV; -} -#else -static int get_nand_partitions(void) -{ - - if (msm_nand_data.nr_parts) - return 0; - - printk(KERN_WARNING "%s: no partition table found!", __func__); - - return -ENODEV; -} -#endif - -device_initcall(get_nand_partitions); diff --git a/arch/arm/mach-msm/perf_event_msm_l2.c b/arch/arm/mach-msm/perf_event_msm_l2.c deleted file mode 100644 index 00773b692d8a..000000000000 --- a/arch/arm/mach-msm/perf_event_msm_l2.c +++ /dev/null @@ -1,946 +0,0 @@ -/* - * Copyright (c) 2011, 2012 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include - - -#define MAX_SCORPION_L2_CTRS 10 - -#define SCORPION_L2CYCLE_CTR_BIT 31 -#define SCORPION_L2CYCLE_CTR_RAW_CODE 0xfe -#define SCORPIONL2_PMNC_E (1 << 0) /* Enable all counters */ -#define SCORPION_L2_EVT_PREFIX 3 -#define SCORPION_MAX_L2_REG 4 - -#define L2_EVT_MASK 0xfffff -#define L2_EVT_PREFIX_MASK 0xf0000 -#define L2_EVT_PREFIX_SHIFT 16 -#define L2_SLAVE_EVT_PREFIX 4 - -#define PMCR_NUM_EV_SHIFT 11 -#define PMCR_NUM_EV_MASK 0x1f - -/* - * The L2 PMU is shared between all CPU's, so protect - * its bitmap access. - */ -struct pmu_constraints { - u64 pmu_bitmap; - u8 codes[64]; - raw_spinlock_t lock; -} l2_pmu_constraints = { - .pmu_bitmap = 0, - .codes = {-1}, - .lock = __RAW_SPIN_LOCK_UNLOCKED(l2_pmu_constraints.lock), -}; - -/* NRCCG format for perf RAW codes. */ -PMU_FORMAT_ATTR(l2_prefix, "config:16-19"); -PMU_FORMAT_ATTR(l2_reg, "config:12-15"); -PMU_FORMAT_ATTR(l2_code, "config:4-11"); -PMU_FORMAT_ATTR(l2_grp, "config:0-3"); - -static struct attribute *msm_l2_ev_formats[] = { - &format_attr_l2_prefix.attr, - &format_attr_l2_reg.attr, - &format_attr_l2_code.attr, - &format_attr_l2_grp.attr, - NULL, -}; - -/* - * Format group is essential to access PMU's from userspace - * via their .name field. - */ -static struct attribute_group msm_l2_pmu_format_group = { - .name = "format", - .attrs = msm_l2_ev_formats, -}; - -static const struct attribute_group *msm_l2_pmu_attr_grps[] = { - &msm_l2_pmu_format_group, - NULL, -}; - -static u32 total_l2_ctrs; -static u32 l2_cycle_ctr_idx; - -static u32 pmu_type; - -static struct arm_pmu scorpion_l2_pmu; - -static u32 l2_orig_filter_prefix = 0x000f0030; - -/* L2 slave port traffic filtering */ -static u32 l2_slv_filter_prefix = 0x000f0010; - -static struct perf_event *l2_events[MAX_SCORPION_L2_CTRS]; -static unsigned long l2_used_mask[BITS_TO_LONGS(MAX_SCORPION_L2_CTRS)]; - -static struct pmu_hw_events scorpion_l2_pmu_hw_events = { - .events = l2_events, - .used_mask = l2_used_mask, - .pmu_lock = - __RAW_SPIN_LOCK_UNLOCKED(scorpion_l2_pmu_hw_events.pmu_lock), -}; - -struct scorpion_l2_scorp_evt { - u32 evt_type; - u32 val; - u8 grp; - u32 evt_type_act; -}; - -enum scorpion_perf_types { - SCORPIONL2_TOTAL_BANK_REQ = 0x90, - SCORPIONL2_DSIDE_READ = 0x91, - SCORPIONL2_DSIDE_WRITE = 0x92, - SCORPIONL2_ISIDE_READ = 0x93, - SCORPIONL2_L2CACHE_ISIDE_READ = 0x94, - SCORPIONL2_L2CACHE_BANK_REQ = 0x95, - SCORPIONL2_L2CACHE_DSIDE_READ = 0x96, - SCORPIONL2_L2CACHE_DSIDE_WRITE = 0x97, - SCORPIONL2_L2NOCACHE_DSIDE_WRITE = 0x98, - SCORPIONL2_L2NOCACHE_ISIDE_READ = 0x99, - SCORPIONL2_L2NOCACHE_TOTAL_REQ = 0x9a, - SCORPIONL2_L2NOCACHE_DSIDE_READ = 0x9b, - SCORPIONL2_DSIDE_READ_NOL1 = 0x9c, - SCORPIONL2_L2CACHE_WRITETHROUGH = 0x9d, - SCORPIONL2_BARRIERS = 0x9e, - SCORPIONL2_HARDWARE_TABLE_WALKS = 0x9f, - SCORPIONL2_MVA_POC = 0xa0, - SCORPIONL2_L2CACHE_HW_TABLE_WALKS = 0xa1, - SCORPIONL2_SETWAY_CACHE_OPS = 0xa2, - SCORPIONL2_DSIDE_WRITE_HITS = 0xa3, - SCORPIONL2_ISIDE_READ_HITS = 0xa4, - SCORPIONL2_CACHE_DSIDE_READ_NOL1 = 0xa5, - SCORPIONL2_TOTAL_CACHE_HITS = 0xa6, - SCORPIONL2_CACHE_MATCH_MISS = 0xa7, - SCORPIONL2_DREAD_HIT_L1_DATA = 0xa8, - SCORPIONL2_L2LINE_LOCKED = 0xa9, - SCORPIONL2_HW_TABLE_WALK_HIT = 0xaa, - SCORPIONL2_CACHE_MVA_POC = 0xab, - SCORPIONL2_L2ALLOC_DWRITE_MISS = 0xac, - SCORPIONL2_CORRECTED_TAG_ARRAY = 0xad, - SCORPIONL2_CORRECTED_DATA_ARRAY = 0xae, - SCORPIONL2_CORRECTED_REPLACEMENT_ARRAY = 0xaf, - SCORPIONL2_PMBUS_MPAAF = 0xb0, - SCORPIONL2_PMBUS_MPWDAF = 0xb1, - SCORPIONL2_PMBUS_MPBRT = 0xb2, - SCORPIONL2_CPU0_GRANT = 0xb3, - SCORPIONL2_CPU1_GRANT = 0xb4, - SCORPIONL2_CPU0_NOGRANT = 0xb5, - SCORPIONL2_CPU1_NOGRANT = 0xb6, - SCORPIONL2_CPU0_LOSING_ARB = 0xb7, - SCORPIONL2_CPU1_LOSING_ARB = 0xb8, - SCORPIONL2_SLAVEPORT_NOGRANT = 0xb9, - SCORPIONL2_SLAVEPORT_BPQ_FULL = 0xba, - SCORPIONL2_SLAVEPORT_LOSING_ARB = 0xbb, - SCORPIONL2_SLAVEPORT_GRANT = 0xbc, - SCORPIONL2_SLAVEPORT_GRANTLOCK = 0xbd, - SCORPIONL2_L2EM_STREX_PASS = 0xbe, - SCORPIONL2_L2EM_STREX_FAIL = 0xbf, - SCORPIONL2_LDREX_RESERVE_L2EM = 0xc0, - SCORPIONL2_SLAVEPORT_LDREX = 0xc1, - SCORPIONL2_CPU0_L2EM_CLEARED = 0xc2, - SCORPIONL2_CPU1_L2EM_CLEARED = 0xc3, - SCORPIONL2_SLAVEPORT_L2EM_CLEARED = 0xc4, - SCORPIONL2_CPU0_CLAMPED = 0xc5, - SCORPIONL2_CPU1_CLAMPED = 0xc6, - SCORPIONL2_CPU0_WAIT = 0xc7, - SCORPIONL2_CPU1_WAIT = 0xc8, - SCORPIONL2_CPU0_NONAMBAS_WAIT = 0xc9, - SCORPIONL2_CPU1_NONAMBAS_WAIT = 0xca, - SCORPIONL2_CPU0_DSB_WAIT = 0xcb, - SCORPIONL2_CPU1_DSB_WAIT = 0xcc, - SCORPIONL2_AXI_READ = 0xcd, - SCORPIONL2_AXI_WRITE = 0xce, - - SCORPIONL2_1BEAT_WRITE = 0xcf, - SCORPIONL2_2BEAT_WRITE = 0xd0, - SCORPIONL2_4BEAT_WRITE = 0xd1, - SCORPIONL2_8BEAT_WRITE = 0xd2, - SCORPIONL2_12BEAT_WRITE = 0xd3, - SCORPIONL2_16BEAT_WRITE = 0xd4, - SCORPIONL2_1BEAT_DSIDE_READ = 0xd5, - SCORPIONL2_2BEAT_DSIDE_READ = 0xd6, - SCORPIONL2_4BEAT_DSIDE_READ = 0xd7, - SCORPIONL2_8BEAT_DSIDE_READ = 0xd8, - SCORPIONL2_CSYS_READ_1BEAT = 0xd9, - SCORPIONL2_CSYS_READ_2BEAT = 0xda, - SCORPIONL2_CSYS_READ_4BEAT = 0xdb, - SCORPIONL2_CSYS_READ_8BEAT = 0xdc, - SCORPIONL2_4BEAT_IFETCH_READ = 0xdd, - SCORPIONL2_8BEAT_IFETCH_READ = 0xde, - SCORPIONL2_CSYS_WRITE_1BEAT = 0xdf, - SCORPIONL2_CSYS_WRITE_2BEAT = 0xe0, - SCORPIONL2_AXI_READ_DATA_BEAT = 0xe1, - SCORPIONL2_AXI_WRITE_EVT1 = 0xe2, - SCORPIONL2_AXI_WRITE_EVT2 = 0xe3, - SCORPIONL2_LDREX_REQ = 0xe4, - SCORPIONL2_STREX_PASS = 0xe5, - SCORPIONL2_STREX_FAIL = 0xe6, - SCORPIONL2_CPREAD = 0xe7, - SCORPIONL2_CPWRITE = 0xe8, - SCORPIONL2_BARRIER_REQ = 0xe9, - SCORPIONL2_AXI_READ_SLVPORT = 0xea, - SCORPIONL2_AXI_WRITE_SLVPORT = 0xeb, - SCORPIONL2_AXI_READ_SLVPORT_DATABEAT = 0xec, - SCORPIONL2_AXI_WRITE_SLVPORT_DATABEAT = 0xed, - SCORPIONL2_SNOOPKILL_PREFILTER = 0xee, - SCORPIONL2_SNOOPKILL_FILTEROUT = 0xef, - SCORPIONL2_SNOOPED_IC = 0xf0, - SCORPIONL2_SNOOPED_BP = 0xf1, - SCORPIONL2_SNOOPED_BARRIERS = 0xf2, - SCORPIONL2_SNOOPED_TLB = 0xf3, - SCORPION_L2_MAX_EVT, -}; - -static const struct scorpion_l2_scorp_evt sc_evt[] = { - {SCORPIONL2_TOTAL_BANK_REQ, 0x80000001, 0, 0x00}, - {SCORPIONL2_DSIDE_READ, 0x80000100, 0, 0x01}, - {SCORPIONL2_DSIDE_WRITE, 0x80010000, 0, 0x02}, - {SCORPIONL2_ISIDE_READ, 0x81000000, 0, 0x03}, - {SCORPIONL2_L2CACHE_ISIDE_READ, 0x80000002, 0, 0x00}, - {SCORPIONL2_L2CACHE_BANK_REQ, 0x80000200, 0, 0x01}, - {SCORPIONL2_L2CACHE_DSIDE_READ, 0x80020000, 0, 0x02}, - {SCORPIONL2_L2CACHE_DSIDE_WRITE, 0x82000000, 0, 0x03}, - {SCORPIONL2_L2NOCACHE_DSIDE_WRITE, 0x80000003, 0, 0x00}, - {SCORPIONL2_L2NOCACHE_ISIDE_READ, 0x80000300, 0, 0x01}, - {SCORPIONL2_L2NOCACHE_TOTAL_REQ, 0x80030000, 0, 0x02}, - {SCORPIONL2_L2NOCACHE_DSIDE_READ, 0x83000000, 0, 0x03}, - {SCORPIONL2_DSIDE_READ_NOL1, 0x80000004, 0, 0x00}, - {SCORPIONL2_L2CACHE_WRITETHROUGH, 0x80000400, 0, 0x01}, - {SCORPIONL2_BARRIERS, 0x84000000, 0, 0x03}, - {SCORPIONL2_HARDWARE_TABLE_WALKS, 0x80000005, 0, 0x00}, - {SCORPIONL2_MVA_POC, 0x80000500, 0, 0x01}, - {SCORPIONL2_L2CACHE_HW_TABLE_WALKS, 0x80050000, 0, 0x02}, - {SCORPIONL2_SETWAY_CACHE_OPS, 0x85000000, 0, 0x03}, - {SCORPIONL2_DSIDE_WRITE_HITS, 0x80000006, 0, 0x00}, - {SCORPIONL2_ISIDE_READ_HITS, 0x80000600, 0, 0x01}, - {SCORPIONL2_CACHE_DSIDE_READ_NOL1, 0x80060000, 0, 0x02}, - {SCORPIONL2_TOTAL_CACHE_HITS, 0x86000000, 0, 0x03}, - {SCORPIONL2_CACHE_MATCH_MISS, 0x80000007, 0, 0x00}, - {SCORPIONL2_DREAD_HIT_L1_DATA, 0x87000000, 0, 0x03}, - {SCORPIONL2_L2LINE_LOCKED, 0x80000008, 0, 0x00}, - {SCORPIONL2_HW_TABLE_WALK_HIT, 0x80000800, 0, 0x01}, - {SCORPIONL2_CACHE_MVA_POC, 0x80080000, 0, 0x02}, - {SCORPIONL2_L2ALLOC_DWRITE_MISS, 0x88000000, 0, 0x03}, - {SCORPIONL2_CORRECTED_TAG_ARRAY, 0x80001A00, 0, 0x01}, - {SCORPIONL2_CORRECTED_DATA_ARRAY, 0x801A0000, 0, 0x02}, - {SCORPIONL2_CORRECTED_REPLACEMENT_ARRAY, 0x9A000000, 0, 0x03}, - {SCORPIONL2_PMBUS_MPAAF, 0x80001C00, 0, 0x01}, - {SCORPIONL2_PMBUS_MPWDAF, 0x801C0000, 0, 0x02}, - {SCORPIONL2_PMBUS_MPBRT, 0x9C000000, 0, 0x03}, - - {SCORPIONL2_CPU0_GRANT, 0x80000001, 1, 0x04}, - {SCORPIONL2_CPU1_GRANT, 0x80000100, 1, 0x05}, - {SCORPIONL2_CPU0_NOGRANT, 0x80020000, 1, 0x06}, - {SCORPIONL2_CPU1_NOGRANT, 0x82000000, 1, 0x07}, - {SCORPIONL2_CPU0_LOSING_ARB, 0x80040000, 1, 0x06}, - {SCORPIONL2_CPU1_LOSING_ARB, 0x84000000, 1, 0x07}, - {SCORPIONL2_SLAVEPORT_NOGRANT, 0x80000007, 1, 0x04}, - {SCORPIONL2_SLAVEPORT_BPQ_FULL, 0x80000700, 1, 0x05}, - {SCORPIONL2_SLAVEPORT_LOSING_ARB, 0x80070000, 1, 0x06}, - {SCORPIONL2_SLAVEPORT_GRANT, 0x87000000, 1, 0x07}, - {SCORPIONL2_SLAVEPORT_GRANTLOCK, 0x80000008, 1, 0x04}, - {SCORPIONL2_L2EM_STREX_PASS, 0x80000009, 1, 0x04}, - {SCORPIONL2_L2EM_STREX_FAIL, 0x80000900, 1, 0x05}, - {SCORPIONL2_LDREX_RESERVE_L2EM, 0x80090000, 1, 0x06}, - {SCORPIONL2_SLAVEPORT_LDREX, 0x89000000, 1, 0x07}, - {SCORPIONL2_CPU0_L2EM_CLEARED, 0x800A0000, 1, 0x06}, - {SCORPIONL2_CPU1_L2EM_CLEARED, 0x8A000000, 1, 0x07}, - {SCORPIONL2_SLAVEPORT_L2EM_CLEARED, 0x80000B00, 1, 0x05}, - {SCORPIONL2_CPU0_CLAMPED, 0x8000000E, 1, 0x04}, - {SCORPIONL2_CPU1_CLAMPED, 0x80000E00, 1, 0x05}, - {SCORPIONL2_CPU0_WAIT, 0x800F0000, 1, 0x06}, - {SCORPIONL2_CPU1_WAIT, 0x8F000000, 1, 0x07}, - {SCORPIONL2_CPU0_NONAMBAS_WAIT, 0x80000010, 1, 0x04}, - {SCORPIONL2_CPU1_NONAMBAS_WAIT, 0x80001000, 1, 0x05}, - {SCORPIONL2_CPU0_DSB_WAIT, 0x80000014, 1, 0x04}, - {SCORPIONL2_CPU1_DSB_WAIT, 0x80001400, 1, 0x05}, - - {SCORPIONL2_AXI_READ, 0x80000001, 2, 0x08}, - {SCORPIONL2_AXI_WRITE, 0x80000100, 2, 0x09}, - {SCORPIONL2_1BEAT_WRITE, 0x80010000, 2, 0x0a}, - {SCORPIONL2_2BEAT_WRITE, 0x80010000, 2, 0x0b}, - {SCORPIONL2_4BEAT_WRITE, 0x80000002, 2, 0x08}, - {SCORPIONL2_8BEAT_WRITE, 0x80000200, 2, 0x09}, - {SCORPIONL2_12BEAT_WRITE, 0x80020000, 2, 0x0a}, - {SCORPIONL2_16BEAT_WRITE, 0x82000000, 2, 0x0b}, - {SCORPIONL2_1BEAT_DSIDE_READ, 0x80000003, 2, 0x08}, - {SCORPIONL2_2BEAT_DSIDE_READ, 0x80000300, 2, 0x09}, - {SCORPIONL2_4BEAT_DSIDE_READ, 0x80030000, 2, 0x0a}, - {SCORPIONL2_8BEAT_DSIDE_READ, 0x83000000, 2, 0x0b}, - {SCORPIONL2_CSYS_READ_1BEAT, 0x80000004, 2, 0x08}, - {SCORPIONL2_CSYS_READ_2BEAT, 0x80000400, 2, 0x09}, - {SCORPIONL2_CSYS_READ_4BEAT, 0x80040000, 2, 0x0a}, - {SCORPIONL2_CSYS_READ_8BEAT, 0x84000000, 2, 0x0b}, - {SCORPIONL2_4BEAT_IFETCH_READ, 0x80000005, 2, 0x08}, - {SCORPIONL2_8BEAT_IFETCH_READ, 0x80000500, 2, 0x09}, - {SCORPIONL2_CSYS_WRITE_1BEAT, 0x80050000, 2, 0x0a}, - {SCORPIONL2_CSYS_WRITE_2BEAT, 0x85000000, 2, 0x0b}, - {SCORPIONL2_AXI_READ_DATA_BEAT, 0x80000600, 2, 0x09}, - {SCORPIONL2_AXI_WRITE_EVT1, 0x80060000, 2, 0x0a}, - {SCORPIONL2_AXI_WRITE_EVT2, 0x86000000, 2, 0x0b}, - {SCORPIONL2_LDREX_REQ, 0x80000007, 2, 0x08}, - {SCORPIONL2_STREX_PASS, 0x80000700, 2, 0x09}, - {SCORPIONL2_STREX_FAIL, 0x80070000, 2, 0x0a}, - {SCORPIONL2_CPREAD, 0x80000008, 2, 0x08}, - {SCORPIONL2_CPWRITE, 0x80000800, 2, 0x09}, - {SCORPIONL2_BARRIER_REQ, 0x88000000, 2, 0x0b}, - - {SCORPIONL2_AXI_READ_SLVPORT, 0x80000001, 3, 0x0c}, - {SCORPIONL2_AXI_WRITE_SLVPORT, 0x80000100, 3, 0x0d}, - {SCORPIONL2_AXI_READ_SLVPORT_DATABEAT, 0x80010000, 3, 0x0e}, - {SCORPIONL2_AXI_WRITE_SLVPORT_DATABEAT, 0x81000000, 3, 0x0f}, - - {SCORPIONL2_SNOOPKILL_PREFILTER, 0x80000001, 4, 0x10}, - {SCORPIONL2_SNOOPKILL_FILTEROUT, 0x80000100, 4, 0x11}, - {SCORPIONL2_SNOOPED_IC, 0x80000002, 4, 0x10}, - {SCORPIONL2_SNOOPED_BP, 0x80000200, 4, 0x11}, - {SCORPIONL2_SNOOPED_BARRIERS, 0x80020000, 4, 0x12}, - {SCORPIONL2_SNOOPED_TLB, 0x82000000, 4, 0x13}, -}; - -static struct pmu_hw_events *scorpion_l2_get_hw_events(void) -{ - return &scorpion_l2_pmu_hw_events; -} -static u32 scorpion_l2_read_l2pm0(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c7, 0" : "=r" (val)); - return val; -} - -static void scorpion_l2_write_l2pm0(u32 val) -{ - asm volatile ("mcr p15, 3, %0, c15, c7, 0" : : "r" (val)); -} - -static u32 scorpion_l2_read_l2pm1(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c7, 1" : "=r" (val)); - return val; -} - -static void scorpion_l2_write_l2pm1(u32 val) -{ - asm volatile ("mcr p15, 3, %0, c15, c7, 1" : : "r" (val)); -} - -static u32 scorpion_l2_read_l2pm2(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c7, 2" : "=r" (val)); - return val; -} - -static void scorpion_l2_write_l2pm2(u32 val) -{ - asm volatile ("mcr p15, 3, %0, c15, c7, 2" : : "r" (val)); -} - -static u32 scorpion_l2_read_l2pm3(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c7, 3" : "=r" (val)); - return val; -} - -static void scorpion_l2_write_l2pm3(u32 val) -{ - asm volatile ("mcr p15, 3, %0, c15, c7, 3" : : "r" (val)); -} - -static u32 scorpion_l2_read_l2pm4(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c7, 4" : "=r" (val)); - return val; -} - -static void scorpion_l2_write_l2pm4(u32 val) -{ - asm volatile ("mcr p15, 3, %0, c15, c7, 4" : : "r" (val)); -} - -struct scorpion_scorpion_access_funcs { - u32(*read) (void); - void (*write) (u32); - void (*pre) (void); - void (*post) (void); -}; - -struct scorpion_scorpion_access_funcs scorpion_l2_func[] = { - {scorpion_l2_read_l2pm0, scorpion_l2_write_l2pm0, NULL, NULL}, - {scorpion_l2_read_l2pm1, scorpion_l2_write_l2pm1, NULL, NULL}, - {scorpion_l2_read_l2pm2, scorpion_l2_write_l2pm2, NULL, NULL}, - {scorpion_l2_read_l2pm3, scorpion_l2_write_l2pm3, NULL, NULL}, - {scorpion_l2_read_l2pm4, scorpion_l2_write_l2pm4, NULL, NULL}, -}; - -#define COLMN0MASK 0x000000ff -#define COLMN1MASK 0x0000ff00 -#define COLMN2MASK 0x00ff0000 - -static u32 scorpion_l2_get_columnmask(u32 setval) -{ - if (setval & COLMN0MASK) - return 0xffffff00; - else if (setval & COLMN1MASK) - return 0xffff00ff; - else if (setval & COLMN2MASK) - return 0xff00ffff; - else - return 0x80ffffff; -} - -static void scorpion_l2_evt_setup(u32 gr, u32 setval) -{ - u32 val; - if (scorpion_l2_func[gr].pre) - scorpion_l2_func[gr].pre(); - val = scorpion_l2_get_columnmask(setval) & scorpion_l2_func[gr].read(); - val = val | setval; - scorpion_l2_func[gr].write(val); - if (scorpion_l2_func[gr].post) - scorpion_l2_func[gr].post(); -} - -#define SCORPION_L2_EVT_START_IDX 0x90 -#define SCORPION_L2_INV_EVTYPE 0 - -static unsigned int get_scorpion_l2_evtinfo(unsigned int evt_type, - struct scorpion_l2_scorp_evt *evtinfo) -{ - u32 idx; - u8 prefix; - u8 reg; - u8 code; - u8 group; - - prefix = (evt_type & 0xF0000) >> 16; - if (prefix == SCORPION_L2_EVT_PREFIX || - prefix == L2_SLAVE_EVT_PREFIX) { - reg = (evt_type & 0x0F000) >> 12; - code = (evt_type & 0x00FF0) >> 4; - group = evt_type & 0x0000F; - - if ((group > 3) || (reg > SCORPION_MAX_L2_REG)) - return SCORPION_L2_INV_EVTYPE; - - evtinfo->val = 0x80000000 | (code << (group * 8)); - evtinfo->grp = reg; - evtinfo->evt_type_act = group | (reg << 2); - return evtinfo->evt_type_act; - } - - if (evt_type < SCORPION_L2_EVT_START_IDX - || evt_type >= SCORPION_L2_MAX_EVT) - return SCORPION_L2_INV_EVTYPE; - - idx = evt_type - SCORPION_L2_EVT_START_IDX; - - if (sc_evt[idx].evt_type == evt_type) { - evtinfo->val = sc_evt[idx].val; - evtinfo->grp = sc_evt[idx].grp; - evtinfo->evt_type_act = sc_evt[idx].evt_type_act; - return sc_evt[idx].evt_type_act; - } - return SCORPION_L2_INV_EVTYPE; -} - -static inline void scorpion_l2_pmnc_write(unsigned long val) -{ - val &= 0xff; - asm volatile ("mcr p15, 3, %0, c15, c4, 0" : : "r" (val)); -} - -static inline unsigned long scorpion_l2_pmnc_read(void) -{ - u32 val; - asm volatile ("mrc p15, 3, %0, c15, c4, 0" : "=r" (val)); - return val; -} - -static void scorpion_l2_set_evcntcr(void) -{ - u32 val = 0x0; - asm volatile ("mcr p15, 3, %0, c15, c6, 4" : : "r" (val)); -} - -static inline void scorpion_l2_set_evtyper(int ctr, int val) -{ - /* select ctr */ - asm volatile ("mcr p15, 3, %0, c15, c6, 0" : : "r" (ctr)); - - /* write into EVTYPER */ - asm volatile ("mcr p15, 3, %0, c15, c6, 7" : : "r" (val)); -} - -static void scorpion_l2_set_evfilter_task_mode(unsigned int is_slv) -{ - u32 filter_val = l2_orig_filter_prefix | 1 << smp_processor_id(); - - if (is_slv) - filter_val = l2_slv_filter_prefix; - - asm volatile ("mcr p15, 3, %0, c15, c6, 3" : : "r" (filter_val)); -} - -static void scorpion_l2_set_evfilter_sys_mode(unsigned int is_slv) -{ - u32 filter_val = l2_orig_filter_prefix | 0xf; - - if (is_slv) - filter_val = l2_slv_filter_prefix; - - asm volatile ("mcr p15, 3, %0, c15, c6, 3" : : "r" (filter_val)); -} - -static void scorpion_l2_enable_intenset(u32 idx) -{ - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mcr p15, 3, %0, c15, c5, 1" : : "r" - (1 << SCORPION_L2CYCLE_CTR_BIT)); - } else { - asm volatile ("mcr p15, 3, %0, c15, c5, 1" : : "r" (1 << idx)); - } -} - -static void scorpion_l2_disable_intenclr(u32 idx) -{ - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mcr p15, 3, %0, c15, c5, 0" : : "r" - (1 << SCORPION_L2CYCLE_CTR_BIT)); - } else { - asm volatile ("mcr p15, 3, %0, c15, c5, 0" : : "r" (1 << idx)); - } -} - -static void scorpion_l2_enable_counter(u32 idx) -{ - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mcr p15, 3, %0, c15, c4, 3" : : "r" - (1 << SCORPION_L2CYCLE_CTR_BIT)); - } else { - asm volatile ("mcr p15, 3, %0, c15, c4, 3" : : "r" (1 << idx)); - } -} - -static void scorpion_l2_disable_counter(u32 idx) -{ - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mcr p15, 3, %0, c15, c4, 2" : : "r" - (1 << SCORPION_L2CYCLE_CTR_BIT)); - } else { - asm volatile ("mcr p15, 3, %0, c15, c4, 2" : : "r" (1 << idx)); - } -} - -static u32 scorpion_l2_read_counter(int idx) -{ - u32 val; - unsigned long iflags; - - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mrc p15, 3, %0, c15, c4, 5" : "=r" (val)); - } else { - raw_spin_lock_irqsave(&scorpion_l2_pmu_hw_events.pmu_lock, - iflags); - asm volatile ("mcr p15, 3, %0, c15, c6, 0" : : "r" (idx)); - - /* read val from counter */ - asm volatile ("mrc p15, 3, %0, c15, c6, 5" : "=r" (val)); - raw_spin_unlock_irqrestore(&scorpion_l2_pmu_hw_events.pmu_lock, - iflags); - } - - return val; -} - -static void scorpion_l2_write_counter(int idx, u32 val) -{ - unsigned long iflags; - - if (idx == l2_cycle_ctr_idx) { - asm volatile ("mcr p15, 3, %0, c15, c4, 5" : : "r" (val)); - } else { - raw_spin_lock_irqsave(&scorpion_l2_pmu_hw_events.pmu_lock, - iflags); - - /* select counter */ - asm volatile ("mcr p15, 3, %0, c15, c6, 0" : : "r" (idx)); - - /* write val into counter */ - asm volatile ("mcr p15, 3, %0, c15, c6, 5" : : "r" (val)); - raw_spin_unlock_irqrestore(&scorpion_l2_pmu_hw_events.pmu_lock, - iflags); - } -} - -static void scorpion_l2_stop_counter(struct hw_perf_event *hwc, int idx) -{ - scorpion_l2_disable_intenclr(idx); - scorpion_l2_disable_counter(idx); - pr_debug("%s: event: %ld ctr: %d stopped\n", __func__, - hwc->config_base, idx); -} - -static void scorpion_l2_enable(struct hw_perf_event *hwc, int idx, int cpu) -{ - struct scorpion_l2_scorp_evt evtinfo; - int evtype = hwc->config_base; - int ev_typer; - unsigned long iflags; - unsigned int is_slv = 0; - unsigned int evt_prefix; - - raw_spin_lock_irqsave(&scorpion_l2_pmu_hw_events.pmu_lock, iflags); - - if (hwc->config_base == SCORPION_L2CYCLE_CTR_RAW_CODE) - goto out; - - /* Check if user requested any special origin filtering. */ - evt_prefix = (hwc->config_base & - L2_EVT_PREFIX_MASK) >> L2_EVT_PREFIX_SHIFT; - - if (evt_prefix == L2_SLAVE_EVT_PREFIX) - is_slv = 1; - - memset(&evtinfo, 0, sizeof(evtinfo)); - - ev_typer = get_scorpion_l2_evtinfo(evtype, &evtinfo); - - scorpion_l2_set_evtyper(idx, ev_typer); - - scorpion_l2_set_evcntcr(); - - if (cpu < 0) - scorpion_l2_set_evfilter_task_mode(is_slv); - else - scorpion_l2_set_evfilter_sys_mode(is_slv); - - scorpion_l2_evt_setup(evtinfo.grp, evtinfo.val); - -out: - - scorpion_l2_enable_intenset(idx); - - scorpion_l2_enable_counter(idx); - - raw_spin_unlock_irqrestore(&scorpion_l2_pmu_hw_events.pmu_lock, iflags); - - pr_debug("%s: ctr: %d group: %ld group_code: %lld started from cpu:%d\n", - __func__, idx, hwc->config_base, hwc->config, smp_processor_id()); -} - -static void scorpion_l2_disable(struct hw_perf_event *hwc, int idx) -{ - unsigned long iflags; - - raw_spin_lock_irqsave(&scorpion_l2_pmu_hw_events.pmu_lock, iflags); - - scorpion_l2_stop_counter(hwc, idx); - - raw_spin_unlock_irqrestore(&scorpion_l2_pmu_hw_events.pmu_lock, iflags); - - pr_debug("%s: event: %ld deleted\n", __func__, hwc->config_base); -} - -static int scorpion_l2_get_event_idx(struct pmu_hw_events *cpuc, - struct hw_perf_event *hwc) -{ - int ctr = 0; - - if (hwc->config_base == SCORPION_L2CYCLE_CTR_RAW_CODE) { - if (test_and_set_bit(l2_cycle_ctr_idx, - cpuc->used_mask)) - return -EAGAIN; - - return l2_cycle_ctr_idx; - } - - for (ctr = 0; ctr < total_l2_ctrs - 1; ctr++) { - if (!test_and_set_bit(ctr, cpuc->used_mask)) - return ctr; - } - - return -EAGAIN; -} - -static void scorpion_l2_start(void) -{ - isb(); - /* Enable all counters */ - scorpion_l2_pmnc_write(scorpion_l2_pmnc_read() | SCORPIONL2_PMNC_E); -} - -static void scorpion_l2_stop(void) -{ - /* Disable all counters */ - scorpion_l2_pmnc_write(scorpion_l2_pmnc_read() & ~SCORPIONL2_PMNC_E); - isb(); -} - -static inline u32 scorpion_l2_get_reset_pmovsr(void) -{ - u32 val; - - /* Read */ - asm volatile ("mrc p15, 3, %0, c15, c4, 1" : "=r" (val)); - - /* Write to clear flags */ - val &= 0xffffffff; - asm volatile ("mcr p15, 3, %0, c15, c4, 1" : : "r" (val)); - - return val; -} - -static irqreturn_t scorpion_l2_handle_irq(int irq_num, void *dev) -{ - unsigned long pmovsr; - struct perf_sample_data data; - struct pt_regs *regs; - struct perf_event *event; - struct hw_perf_event *hwc; - int bitp; - int idx = 0; - - pmovsr = scorpion_l2_get_reset_pmovsr(); - - if (!(pmovsr & 0xffffffff)) - return IRQ_NONE; - - regs = get_irq_regs(); - - perf_sample_data_init(&data, 0); - - while (pmovsr) { - bitp = __ffs(pmovsr); - - if (bitp == SCORPION_L2CYCLE_CTR_BIT) - idx = l2_cycle_ctr_idx; - else - idx = bitp; - - event = scorpion_l2_pmu_hw_events.events[idx]; - - if (!event) - goto next; - - if (!test_bit(idx, scorpion_l2_pmu_hw_events.used_mask)) - goto next; - - hwc = &event->hw; - - armpmu_event_update(event, hwc, idx); - - data.period = event->hw.last_period; - - if (!armpmu_event_set_period(event, hwc, idx)) - goto next; - - if (perf_event_overflow(event, &data, regs)) - scorpion_l2_disable_counter(hwc->idx); -next: - pmovsr &= (pmovsr - 1); - } - - irq_work_run(); - - return IRQ_HANDLED; -} - -static int scorpion_l2_map_event(struct perf_event *event) -{ - if (pmu_type > 0 && pmu_type == event->attr.type) - return event->attr.config & L2_EVT_MASK; - else - return -ENOENT; -} - -static int -scorpion_l2_pmu_generic_request_irq(int irq, irq_handler_t *handle_irq) -{ - return request_irq(irq, *handle_irq, - IRQF_DISABLED | IRQF_NOBALANCING, - "scorpion-l2-armpmu", NULL); -} - -static void -scorpion_l2_pmu_generic_free_irq(int irq) -{ - if (irq >= 0) - free_irq(irq, NULL); -} - -static int msm_l2_test_set_ev_constraint(struct perf_event *event) -{ - u32 evt_type = event->attr.config & L2_EVT_MASK; - u8 prefix = (evt_type & 0xF0000) >> 16; - u8 reg = (evt_type & 0x0F000) >> 12; - u8 group = evt_type & 0x0000F; - u8 code = (evt_type & 0x00FF0) >> 4; - unsigned long flags; - u32 err = 0; - u64 bitmap_t; - u32 shift_idx; - - if (!prefix) - return 0; - /* - * Cycle counter collision is detected in - * get_event_idx(). - */ - if (evt_type == SCORPION_L2CYCLE_CTR_RAW_CODE) - return err; - - raw_spin_lock_irqsave(&l2_pmu_constraints.lock, flags); - - shift_idx = ((reg * 4) + group); - - bitmap_t = 1 << shift_idx; - - if (!(l2_pmu_constraints.pmu_bitmap & bitmap_t)) { - l2_pmu_constraints.pmu_bitmap |= bitmap_t; - l2_pmu_constraints.codes[shift_idx] = code; - goto out; - } else { - /* - * If NRCCG's are identical, - * its not column exclusion. - */ - if (l2_pmu_constraints.codes[shift_idx] != code) - err = -EPERM; - else - /* - * If the event is counted in syswide mode - * then we want to count only on one CPU - * and set its filter to count from all. - * This sets the event OFF on all but one - * CPU. - */ - if (!(event->cpu < 0)) - event->state = PERF_EVENT_STATE_OFF; - } - -out: - raw_spin_unlock_irqrestore(&l2_pmu_constraints.lock, flags); - return err; -} - -static int msm_l2_clear_ev_constraint(struct perf_event *event) -{ - u32 evt_type = event->attr.config & L2_EVT_MASK; - u8 prefix = (evt_type & 0xF0000) >> 16; - u8 reg = (evt_type & 0x0F000) >> 12; - u8 group = evt_type & 0x0000F; - unsigned long flags; - u64 bitmap_t; - u32 shift_idx; - - if (!prefix) - return 0; - - raw_spin_lock_irqsave(&l2_pmu_constraints.lock, flags); - - shift_idx = ((reg * 4) + group); - - bitmap_t = 1 << shift_idx; - - /* Clear constraint bit. */ - l2_pmu_constraints.pmu_bitmap &= ~bitmap_t; - - raw_spin_unlock_irqrestore(&l2_pmu_constraints.lock, flags); - return 1; -} - -static int get_num_events(void) -{ - int val; - - val = scorpion_l2_pmnc_read(); - /* - * Read bits 15:11 of the L2PMCR and add 1 - * for the cycle counter. - */ - return ((val >> PMCR_NUM_EV_SHIFT) & PMCR_NUM_EV_MASK) + 1; -} - -static struct arm_pmu scorpion_l2_pmu = { - .id = ARM_PERF_PMU_ID_SCORPIONMP_L2, - .type = ARM_PMU_DEVICE_L2CC, - .name = "Scorpion L2CC PMU", - .start = scorpion_l2_start, - .stop = scorpion_l2_stop, - .handle_irq = scorpion_l2_handle_irq, - .request_pmu_irq = scorpion_l2_pmu_generic_request_irq, - .free_pmu_irq = scorpion_l2_pmu_generic_free_irq, - .enable = scorpion_l2_enable, - .disable = scorpion_l2_disable, - .read_counter = scorpion_l2_read_counter, - .get_event_idx = scorpion_l2_get_event_idx, - .write_counter = scorpion_l2_write_counter, - .map_event = scorpion_l2_map_event, - .max_period = (1LLU << 32) - 1, - .get_hw_events = scorpion_l2_get_hw_events, - .test_set_event_constraints = msm_l2_test_set_ev_constraint, - .clear_event_constraints = msm_l2_clear_ev_constraint, - .pmu.attr_groups = msm_l2_pmu_attr_grps, -}; - -static int scorpion_l2_pmu_device_probe(struct platform_device *pdev) -{ - scorpion_l2_pmu.plat_device = pdev; - - if (!armpmu_register(&scorpion_l2_pmu, "scorpionl2", -1)) - pmu_type = scorpion_l2_pmu.pmu.type; - - return 0; -} - -static struct platform_driver scorpion_l2_pmu_driver = { - .driver = { - .name = "l2-arm-pmu", - }, - .probe = scorpion_l2_pmu_device_probe, -}; - -static int __init register_scorpion_l2_pmu_driver(void) -{ - /* Avoid spurious interrupt if any */ - scorpion_l2_get_reset_pmovsr(); - - total_l2_ctrs = get_num_events(); - scorpion_l2_pmu.num_events = total_l2_ctrs; - - pr_info("Detected %d counters on the L2CC PMU.\n", - total_l2_ctrs); - - /* - * The L2 cycle counter index in the used_mask - * bit stream is always after the other counters. - * Counter indexes begin from 0 to keep it consistent - * with the h/w. - */ - l2_cycle_ctr_idx = total_l2_ctrs - 1; - - return platform_driver_register(&scorpion_l2_pmu_driver); -} -device_initcall(register_scorpion_l2_pmu_driver); diff --git a/arch/arm/mach-msm/perf_event_msm_pl310.c b/arch/arm/mach-msm/perf_event_msm_pl310.c deleted file mode 100644 index d829ff8ef375..000000000000 --- a/arch/arm/mach-msm/perf_event_msm_pl310.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (C) 2007 ARM Limited - * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include - -#include -#include - -/* - * Store dynamic PMU type after registration, - * to uniquely identify this PMU at runtime. - */ -static u32 pmu_type; - -/* This controller only supports 16 Events.*/ -PMU_FORMAT_ATTR(l2_config, "config:0-4"); - -static struct attribute *arm_l2_ev_formats[] = { - &format_attr_l2_config.attr, - NULL, -}; - -/* - * Format group is essential to access PMU's from userspace - * via their .name field. - */ -static struct attribute_group arm_l2_pmu_format_group = { - .name = "format", - .attrs = arm_l2_ev_formats, -}; - -static const struct attribute_group *arm_l2_pmu_attr_grps[] = { - &arm_l2_pmu_format_group, - NULL, -}; - -#define L2X0_AUX_CTRL_EVENT_MONITOR_SHIFT 20 -#define L2X0_INTR_MASK_ECNTR 1 - -/* L220/PL310 Event control register values */ -#define L2X0_EVENT_CNT_ENABLE_MASK 1 -#define L2X0_EVENT_CNT_ENABLE 1 -#define L2X0_EVENT_CNT_RESET(x) (1 << (x+1)) - -/* Bit-shifted event counter config values */ -enum l2x0_perf_types { - L2X0_EVENT_CNT_CFG_DISABLED = 0x0, - L2X0_EVENT_CNT_CFG_CO = 0x1, - L2X0_EVENT_CNT_CFG_DRHIT = 0x2, - L2X0_EVENT_CNT_CFG_DRREQ = 0x3, - L2X0_EVENT_CNT_CFG_DWHIT = 0x4, - L2X0_EVENT_CNT_CFG_DWREQ = 0x5, - L2X0_EVENT_CNT_CFG_DWTREQ = 0x6, - L2X0_EVENT_CNT_CFG_IRHIT = 0x7, - L2X0_EVENT_CNT_CFG_IRREQ = 0x8, - L2X0_EVENT_CNT_CFG_WA = 0x9, - - /* PL310 only */ - L2X0_EVENT_CNT_CFG_IPFALLOC = 0xA, - L2X0_EVENT_CNT_CFG_EPFHIT = 0xB, - L2X0_EVENT_CNT_CFG_EPFALLOC = 0xC, - L2X0_EVENT_CNT_CFG_SRRCVD = 0xD, - L2X0_EVENT_CNT_CFG_SRCONF = 0xE, - L2X0_EVENT_CNT_CFG_EPFRCVD = 0xF, -}; - -#define PL310_EVENT_CNT_CFG_MAX L2X0_EVENT_CNT_CFG_EPFRCVD - -#define L2X0_EVENT_CNT_CFG_SHIFT 2 -#define L2X0_EVENT_CNT_CFG_MASK (0xF << 2) - -#define L2X0_EVENT_CNT_CFG_INTR_MASK 0x3 -#define L2X0_EVENT_CNT_CFG_INTR_DISABLED 0x0 -#define L2X0_EVENT_CNT_CFG_INTR_INCREMENT 0x1 -#define L2X0_EVENT_CNT_CFG_INTR_OVERFLOW 0x2 - -#define L2X0_NUM_COUNTERS 2 -static struct arm_pmu l2x0_pmu; -static struct arm_pmu *l2x0_pmu_addr = &l2x0_pmu; - -static u32 l2x0pmu_max_event_id = 0xf; - -static struct perf_event *events[2]; -static unsigned long used_mask[BITS_TO_LONGS(2)]; -static struct pmu_hw_events l2x0pmu_hw_events = { - .events = events, - .used_mask = used_mask, - .pmu_lock = __RAW_SPIN_LOCK_UNLOCKED(l2x0pmu_hw_events.pmu_lock), -}; - -#define COUNTER_CFG_ADDR(idx) (l2x0_base + L2X0_EVENT_CNT0_CFG - 4*idx) - -#define COUNTER_CTRL_ADDR (l2x0_base + L2X0_EVENT_CNT_CTRL) - -#define COUNTER_ADDR(idx) (l2x0_base + L2X0_EVENT_CNT0_VAL - 4*idx) - -static void l2x0_clear_interrupts(u32 flags) -{ - writel_relaxed(flags, l2x0_base + L2X0_INTR_CLEAR); -} - -static struct pmu_hw_events *l2x0pmu_get_hw_events(void) -{ - return &l2x0pmu_hw_events; -} - -static u32 l2x0pmu_read_ctrl(void) -{ - return readl_relaxed(COUNTER_CTRL_ADDR); -} - -static void l2x0pmu_write_ctrl(u32 val) -{ - writel_relaxed(val, COUNTER_CTRL_ADDR); -} - -static u32 l2x0pmu_read_cfg(int idx) -{ - return readl_relaxed(COUNTER_CFG_ADDR(idx)); -} - -static void l2x0pmu_write_cfg(u32 val, int idx) -{ - writel_relaxed(val, COUNTER_CFG_ADDR(idx)); -} - -static void l2x0pmu_enable_counter(u32 cfg, int idx) -{ - cfg |= L2X0_EVENT_CNT_CFG_INTR_OVERFLOW; - l2x0pmu_write_cfg(cfg, idx); -} - -static u32 l2x0pmu_disable_counter(int idx) -{ - u32 cfg, oldcfg; - - cfg = oldcfg = l2x0pmu_read_cfg(idx); - - cfg &= ~L2X0_EVENT_CNT_CFG_MASK; - cfg &= ~L2X0_EVENT_CNT_CFG_INTR_MASK; - l2x0pmu_write_cfg(cfg, idx); - - return oldcfg; -} - -static u32 l2x0pmu_read_counter(struct perf_event *event) -{ - struct hw_perf_event *hwc = &event->hw; - int idx = hwc->idx; - u32 val = readl_relaxed(COUNTER_ADDR(idx)); - - return val; -} - -static void l2x0pmu_write_counter(struct perf_event *event, u32 val) -{ - struct hw_perf_event *hwc = &event->hw; - int idx = hwc->idx; - /* - * L2X0 counters can only be written to when they are disabled. - * As perf core does not disable counters before writing to them - * under interrupts, we must do so here. - */ - u32 cfg = l2x0pmu_disable_counter(idx); - writel_relaxed(val, COUNTER_ADDR(idx)); - l2x0pmu_write_cfg(cfg, idx); -} - -static int counter_is_saturated(struct perf_event *event) -{ - return l2x0pmu_read_counter(event) == 0xFFFFFFFF; -} - -static void l2x0pmu_start(struct arm_pmu *l2_pmu) -{ - unsigned long flags; - u32 val; - - raw_spin_lock_irqsave(&l2x0pmu_hw_events.pmu_lock, flags); - - /* - * TODO: Enable counter interrupt, - * once we know it works on this chip. - */ - - val = l2x0pmu_read_ctrl(); - - val |= L2X0_EVENT_CNT_ENABLE; - l2x0pmu_write_ctrl(val); - - raw_spin_unlock_irqrestore(&l2x0pmu_hw_events.pmu_lock, flags); -} - -static void l2x0pmu_stop(struct arm_pmu *l2_pmu) -{ - unsigned long flags; - u32 val; - - raw_spin_lock_irqsave(&l2x0pmu_hw_events.pmu_lock, flags); - - val = l2x0pmu_read_ctrl(); - val &= ~L2X0_EVENT_CNT_ENABLE_MASK; - l2x0pmu_write_ctrl(val); - - /* - * TODO: Disable counter interrupt, - * once we know it works on this chip. - */ - - raw_spin_unlock_irqrestore(&l2x0pmu_hw_events.pmu_lock, flags); -} - -static void l2x0pmu_enable(struct perf_event *event) -{ - struct hw_perf_event *hwc = &event->hw; - int idx = hwc->idx; - unsigned long flags; - u32 cfg; - - raw_spin_lock_irqsave(&l2x0pmu_hw_events.pmu_lock, flags); - - cfg = (hwc->config_base << L2X0_EVENT_CNT_CFG_SHIFT) & - L2X0_EVENT_CNT_CFG_MASK; - l2x0pmu_enable_counter(cfg, idx); - - raw_spin_unlock_irqrestore(&l2x0pmu_hw_events.pmu_lock, flags); -} - -static void l2x0pmu_disable(struct perf_event *event) -{ - struct hw_perf_event *hwc = &event->hw; - int idx = hwc->idx; - unsigned long flags; - - raw_spin_lock_irqsave(&l2x0pmu_hw_events.pmu_lock, flags); - l2x0pmu_disable_counter(idx); - raw_spin_unlock_irqrestore(&l2x0pmu_hw_events.pmu_lock, flags); -} - -static int l2x0pmu_get_event_idx(struct pmu_hw_events *events, - struct perf_event *event) -{ - int idx; - - /* Counters are identical. Just grab a free one. */ - for (idx = 0; idx < L2X0_NUM_COUNTERS; ++idx) { - if (!test_and_set_bit(idx, l2x0pmu_hw_events.used_mask)) - return idx; - } - - return -EAGAIN; -} - -/* - * As System PMUs are affine to CPU0, the fact that interrupts are disabled - * during interrupt handling is enough to serialise our actions and make this - * safe. We do not need to grab our pmu_lock here. - */ -static irqreturn_t l2x0pmu_handle_irq(int irq, void *dev) -{ - irqreturn_t status = IRQ_NONE; - struct perf_sample_data data; - struct pt_regs *regs; - int idx; - - regs = get_irq_regs(); - - for (idx = 0; idx < L2X0_NUM_COUNTERS; ++idx) { - struct perf_event *event = l2x0pmu_hw_events.events[idx]; - struct hw_perf_event *hwc; - - if (!counter_is_saturated(event)) - continue; - - status = IRQ_HANDLED; - - hwc = &event->hw; - - /* - * The armpmu_* functions expect counters to overflow, but - * L220/PL310 counters saturate instead. Fake the overflow - * here so the hardware is in sync with what the framework - * expects. - */ - l2x0pmu_write_counter(event, 0); - - armpmu_event_update(event); - data.period = event->hw.last_period; - - if (!armpmu_event_set_period(event)) - continue; - - if (perf_event_overflow(event, &data, regs)) - l2x0pmu_disable_counter(idx); - } - - l2x0_clear_interrupts(L2X0_INTR_MASK_ECNTR); - - irq_work_run(); - - return status; -} - -static int map_l2x0_raw_event(u64 config) -{ - return (config <= l2x0pmu_max_event_id) ? config : -ENOENT; -} - -static int l2x0pmu_map_event(struct perf_event *event) -{ - u64 config = event->attr.config; - u64 supported_samples = (PERF_SAMPLE_TIME | - PERF_SAMPLE_ID | - PERF_SAMPLE_PERIOD | - PERF_SAMPLE_STREAM_ID | - PERF_SAMPLE_RAW); - - if ((pmu_type == 0) || (pmu_type != event->attr.type)) - return -ENOENT; - - if (event->attr.sample_type & ~supported_samples) - return -ENOENT; - - return map_l2x0_raw_event(config); -} - -static int -arm_l2_pmu_generic_request_irq(int irq, irq_handler_t *handle_irq, void *dev_id) -{ - return request_irq(irq, *handle_irq, - IRQF_DISABLED | IRQF_NOBALANCING, - "arm-l2-armpmu", &l2x0_pmu_addr); -} - -static void -arm_l2_pmu_generic_free_irq(int irq, void *dev_id) -{ - if (irq >= 0) - free_irq(irq, &l2x0_pmu_addr); -} - -static struct arm_pmu l2x0_pmu = { - .name = "msm-l2", - .start = l2x0pmu_start, - .stop = l2x0pmu_stop, - .handle_irq = l2x0pmu_handle_irq, - .enable = l2x0pmu_enable, - .disable = l2x0pmu_disable, - .get_event_idx = l2x0pmu_get_event_idx, - .read_counter = l2x0pmu_read_counter, - .write_counter = l2x0pmu_write_counter, - .map_event = l2x0pmu_map_event, - .num_events = 2, - .max_period = 0xFFFFFFFF, - .get_hw_events = l2x0pmu_get_hw_events, - .pmu.attr_groups = arm_l2_pmu_attr_grps, - .request_pmu_irq = arm_l2_pmu_generic_request_irq, - .free_pmu_irq = arm_l2_pmu_generic_free_irq, - .request_irq = cpu_pmu_request_irq, - .free_irq = cpu_pmu_free_irq, -}; - -static int l2x0pmu_device_probe(struct platform_device *pdev) -{ - u32 aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); - u32 debug = readl_relaxed(l2x0_base + L2X0_DEBUG_CTRL); - l2x0_pmu.plat_device = pdev; - - if (!(aux & (1 << L2X0_AUX_CTRL_EVENT_MONITOR_SHIFT))) { - pr_err("Ev Monitor is OFF. L2 counters disabled.\n"); - return -EOPNOTSUPP; - } - - pr_info("L2CC PMU device found. DEBUG_CTRL: %x\n", debug); - - /* Get value of dynamically allocated PMU type. */ - if (!armpmu_register(&l2x0_pmu, -1)) - pmu_type = l2x0_pmu.pmu.type; - else { - pr_err("l2x0_pmu registration failed\n"); - return -EOPNOTSUPP; - } - - return 0; -} - -static struct platform_driver l2x0pmu_driver = { - .driver = { - .name = "l2-arm-pmu", - }, - .probe = l2x0pmu_device_probe, -}; - -static int __init register_pmu_driver(void) -{ - return platform_driver_register(&l2x0pmu_driver); -} -device_initcall(register_pmu_driver); diff --git a/arch/arm/mach-msm/platsmp-8625.c b/arch/arm/mach-msm/platsmp-8625.c deleted file mode 100644 index 8274eb6967ea..000000000000 --- a/arch/arm/mach-msm/platsmp-8625.c +++ /dev/null @@ -1,332 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "pm.h" -#include "platsmp.h" - -#define CORE_RESET_BASE 0xA8600590 -#define MSM_CORE_STATUS_MSK 0x02800000 - -static DEFINE_PER_CPU(bool, cold_boot_done); - -struct per_cpu_data { - unsigned int reset_off; - unsigned int offset; - unsigned int ipc_irq; - void __iomem *reset_core_base; -}; - -static uint32_t *msm8625_boot_vector; - -static struct per_cpu_data cpu_data[CONFIG_NR_CPUS]; - -static void __iomem *scu_base_addr(void) -{ - return MSM_SCU_BASE; -} - -static DEFINE_SPINLOCK(boot_lock); - -/* - * MP_CORE_IPC will be used to generate interrupt and can be used by either - * of core. - * To bring secondary cores out of GDFS we need to raise the SPI using the - * MP_CORE_IPC. - */ -static void raise_clear_spi(unsigned int cpu, bool set) -{ - int value; - - value = __raw_readl(MSM_CSR_BASE + 0x54); - if (set) - __raw_writel(value | BIT(cpu), MSM_CSR_BASE + 0x54); - else - __raw_writel(value & ~BIT(cpu), MSM_CSR_BASE + 0x54); - mb(); -} - -static void clear_pending_spi(unsigned int irq) -{ - struct irq_data *d = irq_get_irq_data(irq); - struct irq_chip *c = irq_data_get_irq_chip(d); - - c->irq_mask(d); - local_irq_disable(); - /* Clear the IRQ from the ENABLE_SET */ - gic_clear_irq_pending(irq); - local_irq_enable(); -} - -void __cpuinit msm8625_platform_secondary_init(unsigned int cpu) -{ - WARN_ON(msm_platform_secondary_init(cpu)); - - /* - * if any interrupts are already enabled for the primary - * core (e.g. timer irq), then they will not have been enabled - * for us: do so - */ - gic_secondary_init(0); - - /* - * let the primary processor know we're out of the - * pen, then head off into the C entry point - */ - write_pen_release(-1); - - /* clear the IPC pending SPI */ - if (per_cpu(power_collapsed, cpu)) { - raise_clear_spi(cpu, false); - clear_pending_spi(cpu_data[cpu].ipc_irq); - per_cpu(power_collapsed, cpu) = 0; - } - - /* - * Synchronise with the boot thread. - */ - spin_lock(&boot_lock); - spin_unlock(&boot_lock); -} - -static int __cpuinit msm8625_release_secondary(unsigned int cpu) -{ - void __iomem *base_ptr; - int value = 0; - unsigned long timeout; - - /* - * loop to ensure that the GHS_STATUS_CORE1 bit in the - * MPA5_STATUS_REG(0x3c) is set. The timeout for the while - * loop can be set as 20us as of now - */ - timeout = jiffies + usecs_to_jiffies(20); - while (time_before(jiffies, timeout)) { - value = __raw_readl(MSM_CFG_CTL_BASE + cpu_data[cpu].offset); - if ((value & MSM_CORE_STATUS_MSK) == - MSM_CORE_STATUS_MSK) - break; - udelay(1); - } - - if (!value) { - pr_err("Core %u cannot be brought out of Reset!!!\n", cpu); - return -ENODEV; - } - - base_ptr = ioremap_nocache(CORE_RESET_BASE + - cpu_data[cpu].reset_off, SZ_4); - if (!base_ptr) - return -ENODEV; - - /* Reset core out of reset */ - __raw_writel(0x0, base_ptr); - mb(); - - cpu_data[cpu].reset_core_base = base_ptr; - - return 0; -} - -void __iomem *core_reset_base(unsigned int cpu) -{ - return cpu_data[cpu].reset_core_base; -} - -int __cpuinit msm8625_boot_secondary(unsigned int cpu, struct task_struct *idle) -{ - unsigned long timeout; - - preset_lpj = loops_per_jiffy; - - if (per_cpu(cold_boot_done, cpu) == false) { - if (msm8625_release_secondary(cpu)) { - pr_err("Failed to release core %u\n", cpu); - return -ENODEV; - } - per_cpu(cold_boot_done, cpu) = true; - } - - /* - * Set synchronisation state between this boot processor - * and the secondary one - */ - spin_lock(&boot_lock); - - /* - * This is really belt and braces; we hold unintended secondary - * CPUs in the holding pen until we're ready for them. However, - * since we haven't sent them a soft interrupt, they shouldn't - * be there. - */ - write_pen_release(cpu); - - /* - * Send the secondary CPU a soft interrupt, thereby causing - * the boot monitor to read the system wide flags register, - * and branch to the address found there. - * - * power_collapsed is the flag which will be updated for Powercollapse. - * Once we are out of PC, as secondary cores will be in the state of - * GDFS which needs to be brought out by raising an SPI. - */ - - if (per_cpu(power_collapsed, cpu)) { - gic_configure_and_raise(cpu_data[cpu].ipc_irq, cpu); - raise_clear_spi(cpu, true); - } else { - gic_raise_softirq(cpumask_of(cpu), 1); - } - - timeout = jiffies + (1 * HZ); - while (time_before(jiffies, timeout)) { - smp_rmb(); - if (pen_release == -1) - break; - - udelay(10); - } - - /* - * now the secondary core is starting up let it run its - * calibrations, then wait for it to finish - */ - spin_unlock(&boot_lock); - - return 0; -} - -/* - * Initialise the CPU possible map early - this describes the CPUs - * which may be present or become present in the system. - */ -void __init msm8625_smp_init_cpus(void) -{ - void __iomem *scu_base = scu_base_addr(); - - unsigned int i, ncores; - - ncores = scu_base ? scu_get_core_count(scu_base) : 1; - - for (i = 0; i < ncores; i++) - set_cpu_possible(i, true); - - set_smp_cross_call(gic_raise_softirq); -} - -static void per_cpu_data(unsigned int cpu, unsigned int off, - unsigned int off1, unsigned int irq) -{ - cpu_data[cpu].reset_off = off; - cpu_data[cpu].offset = off1; - cpu_data[cpu].ipc_irq = irq; -} - -static void enable_boot_remapper(unsigned long bit, unsigned int off) -{ - int value; - - /* Enable boot remapper address */ - value = __raw_readl(MSM_CFG_CTL_BASE + off); - __raw_writel(value | bit, MSM_CFG_CTL_BASE + off) ; - mb(); -} - -static void remapper_address(unsigned long phys, unsigned int off) -{ - /* - * Write the address of secondary startup into the - * boot remapper register. The secondary CPU branches to this address. - */ - __raw_writel(phys, (MSM_CFG_CTL_BASE + off)); - mb(); -} - -static void __init msm8625_boot_vector_init(uint32_t *boot_vector, - unsigned long entry) -{ - if (!boot_vector) - return; - msm8625_boot_vector = boot_vector; - - msm8625_boot_vector[0] = 0xE51FF004; /* ldr pc, 4 */ - msm8625_boot_vector[1] = entry; -} - -void __init msm8625_platform_smp_prepare_cpus(unsigned int max_cpus) -{ - int cpu, value; - void __iomem *cpu_ptr; - - scu_enable(scu_base_addr()); - - cpu_ptr = ioremap_nocache(MSM8625_CPU_PHYS, SZ_8); - if (!cpu_ptr) { - pr_err("failed to ioremap for secondary cores\n"); - return; - } - - msm8625_boot_vector_init(cpu_ptr, - virt_to_phys(msm_secondary_startup)); - - iounmap(cpu_ptr); - - for_each_possible_cpu(cpu) { - switch (cpu) { - case 0: - break; - case 1: - remapper_address(MSM8625_CPU_PHYS, 0x34); - per_cpu_data(cpu, 0x0, 0x3c, - MSM8625_INT_ACSR_MP_CORE_IPC1); - enable_boot_remapper(BIT(26), 0x30); - break; - case 2: - remapper_address((MSM8625_CPU_PHYS >> 16), 0x4C); - per_cpu_data(cpu, 0x8, 0x50, - MSM8625_INT_ACSR_MP_CORE_IPC2); - enable_boot_remapper(BIT(25), 0x48); - break; - case 3: - value = __raw_readl(MSM_CFG_CTL_BASE + 0x4C); - remapper_address(value | MSM8625_CPU_PHYS, 0x4C); - per_cpu_data(cpu, 0xC, 0x50, - MSM8625_INT_ACSR_MP_CORE_IPC3); - enable_boot_remapper(BIT(26), 0x48); - break; - } - - } -} - -struct smp_operations msm8625_smp_ops __initdata = { - .smp_init_cpus = msm8625_smp_init_cpus, - .smp_prepare_cpus = msm8625_platform_smp_prepare_cpus, - .smp_secondary_init = msm8625_platform_secondary_init, - .smp_boot_secondary = msm8625_boot_secondary, - .cpu_kill = msm_cpu_kill, - .cpu_die = platform_cpu_die, - .cpu_disable = platform_cpu_disable -}; diff --git a/arch/arm/mach-msm/pm2.c b/arch/arm/mach-msm/pm2.c deleted file mode 100644 index 9f97a59d5122..000000000000 --- a/arch/arm/mach-msm/pm2.c +++ /dev/null @@ -1,1768 +0,0 @@ -/* arch/arm/mach-msm/pm2.c - * - * MSM Power Management Routines - * - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2008-2013 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_CPU_V7 -#include -#include -#endif -#ifdef CONFIG_CACHE_L2X0 -#include -#endif -#ifdef CONFIG_VFP -#include -#endif - -#ifdef CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND_DEEP_POWER_DOWN -#include -#endif -#include -#include -#include -#include -#include - -#include "smd_rpcrouter.h" -#include "acpuclock.h" -#include "clock.h" -#include "idle.h" -#include "irq.h" -#include "gpio.h" -#include "timer.h" -#include "pm.h" -#include "spm.h" -#include "sirc.h" -#include "pm-boot.h" -#include "devices-msm7x2xa.h" - -/****************************************************************************** - * Debug Definitions - *****************************************************************************/ - -enum { - MSM_PM_DEBUG_SUSPEND = BIT(0), - MSM_PM_DEBUG_POWER_COLLAPSE = BIT(1), - MSM_PM_DEBUG_STATE = BIT(2), - MSM_PM_DEBUG_CLOCK = BIT(3), - MSM_PM_DEBUG_RESET_VECTOR = BIT(4), - MSM_PM_DEBUG_SMSM_STATE = BIT(5), - MSM_PM_DEBUG_IDLE = BIT(6), - MSM_PM_DEBUG_HOTPLUG = BIT(7), -}; - -DEFINE_PER_CPU(int, power_collapsed); - -static int msm_pm_debug_mask; -module_param_named( - debug_mask, msm_pm_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP -); - -#define MSM_PM_DPRINTK(mask, level, message, ...) \ - do { \ - if ((mask) & msm_pm_debug_mask) \ - printk(level message, ## __VA_ARGS__); \ - } while (0) - -#define MSM_PM_DEBUG_PRINT_STATE(tag) \ - do { \ - MSM_PM_DPRINTK(MSM_PM_DEBUG_STATE, \ - KERN_INFO, "%s: " \ - "APPS_CLK_SLEEP_EN %x, APPS_PWRDOWN %x, " \ - "SMSM_POWER_MASTER_DEM %x, SMSM_MODEM_STATE %x, " \ - "SMSM_APPS_DEM %x\n", \ - tag, \ - __raw_readl(APPS_CLK_SLEEP_EN), \ - __raw_readl(APPS_PWRDOWN), \ - smsm_get_state(SMSM_POWER_MASTER_DEM), \ - smsm_get_state(SMSM_MODEM_STATE), \ - smsm_get_state(SMSM_APPS_DEM)); \ - } while (0) - -#define MSM_PM_DEBUG_PRINT_SLEEP_INFO() \ - do { \ - if (msm_pm_debug_mask & MSM_PM_DEBUG_SMSM_STATE) \ - smsm_print_sleep_info(msm_pm_smem_data->sleep_time, \ - msm_pm_smem_data->resources_used, \ - msm_pm_smem_data->irq_mask, \ - msm_pm_smem_data->wakeup_reason, \ - msm_pm_smem_data->pending_irqs); \ - } while (0) - - -/****************************************************************************** - * Sleep Modes and Parameters - *****************************************************************************/ - -static int msm_pm_idle_sleep_min_time = CONFIG_MSM7X00A_IDLE_SLEEP_MIN_TIME; -module_param_named( - idle_sleep_min_time, msm_pm_idle_sleep_min_time, - int, S_IRUGO | S_IWUSR | S_IWGRP -); - -enum { - MSM_PM_MODE_ATTR_SUSPEND, - MSM_PM_MODE_ATTR_IDLE, - MSM_PM_MODE_ATTR_LATENCY, - MSM_PM_MODE_ATTR_RESIDENCY, - MSM_PM_MODE_ATTR_NR, -}; - -static char *msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_NR] = { - [MSM_PM_MODE_ATTR_SUSPEND] = "suspend_enabled", - [MSM_PM_MODE_ATTR_IDLE] = "idle_enabled", - [MSM_PM_MODE_ATTR_LATENCY] = "latency", - [MSM_PM_MODE_ATTR_RESIDENCY] = "residency", -}; - -static char *msm_pm_sleep_mode_labels[MSM_PM_SLEEP_MODE_NR] = { - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_SUSPEND] = " ", - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = "power_collapse", - [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = - "ramp_down_and_wfi", - [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = "wfi", - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = - "power_collapse_no_xo_shutdown", - [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE] = - "standalone_power_collapse", -}; - -static struct msm_pm_platform_data *msm_pm_modes; -static struct msm_pm_irq_calls *msm_pm_irq_extns; -static struct msm_pm_cpr_ops *msm_cpr_ops; - -struct msm_pm_kobj_attribute { - unsigned int cpu; - struct kobj_attribute ka; -}; - -#define GET_CPU_OF_ATTR(attr) \ - (container_of(attr, struct msm_pm_kobj_attribute, ka)->cpu) - -struct msm_pm_sysfs_sleep_mode { - struct kobject *kobj; - struct attribute_group attr_group; - struct attribute *attrs[MSM_PM_MODE_ATTR_NR + 1]; - struct msm_pm_kobj_attribute kas[MSM_PM_MODE_ATTR_NR]; -}; - -/* - * Write out the attribute. - */ -static ssize_t msm_pm_mode_attr_show( - struct kobject *kobj, struct kobj_attribute *attr, char *buf) -{ - int ret = -EINVAL; - int i; - - for (i = 0; i < MSM_PM_SLEEP_MODE_NR; i++) { - struct kernel_param kp; - unsigned int cpu; - struct msm_pm_platform_data *mode; - - if (msm_pm_sleep_mode_labels[i] == NULL) - continue; - - if (strcmp(kobj->name, msm_pm_sleep_mode_labels[i])) - continue; - - cpu = GET_CPU_OF_ATTR(attr); - mode = &msm_pm_modes[MSM_PM_MODE(cpu, i)]; - - if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_SUSPEND])) { - u32 arg = mode->suspend_enabled; - kp.arg = &arg; - ret = param_get_ulong(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_IDLE])) { - u32 arg = mode->idle_enabled; - kp.arg = &arg; - ret = param_get_ulong(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_LATENCY])) { - u32 arg = mode->latency; - kp.arg = &arg; - ret = param_get_ulong(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_RESIDENCY])) { - u32 arg = mode->residency; - kp.arg = &arg; - ret = param_get_ulong(buf, &kp); - } - - break; - } - - if (ret > 0) { - strlcat(buf, "\n", PAGE_SIZE); - ret++; - } - - return ret; -} - -/* - * Read in the new attribute value. - */ -static ssize_t msm_pm_mode_attr_store(struct kobject *kobj, - struct kobj_attribute *attr, const char *buf, size_t count) -{ - int ret = -EINVAL; - int i; - - for (i = 0; i < MSM_PM_SLEEP_MODE_NR; i++) { - struct kernel_param kp; - unsigned int cpu; - struct msm_pm_platform_data *mode; - - if (msm_pm_sleep_mode_labels[i] == NULL) - continue; - - if (strcmp(kobj->name, msm_pm_sleep_mode_labels[i])) - continue; - - cpu = GET_CPU_OF_ATTR(attr); - mode = &msm_pm_modes[MSM_PM_MODE(cpu, i)]; - - if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_SUSPEND])) { - kp.arg = &mode->suspend_enabled; - ret = param_set_byte(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_IDLE])) { - kp.arg = &mode->idle_enabled; - ret = param_set_byte(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_LATENCY])) { - kp.arg = &mode->latency; - ret = param_set_ulong(buf, &kp); - } else if (!strcmp(attr->attr.name, - msm_pm_mode_attr_labels[MSM_PM_MODE_ATTR_RESIDENCY])) { - kp.arg = &mode->residency; - ret = param_set_ulong(buf, &kp); - } - - break; - } - - return ret ? ret : count; -} - - /* Add sysfs entries for one cpu. */ -static int __init msm_pm_mode_sysfs_add_cpu( - unsigned int cpu, struct kobject *modes_kobj) -{ - char cpu_name[8]; - struct kobject *cpu_kobj; - struct msm_pm_sysfs_sleep_mode *mode = NULL; - int i, j, k; - int ret; - - snprintf(cpu_name, sizeof(cpu_name), "cpu%u", cpu); - cpu_kobj = kobject_create_and_add(cpu_name, modes_kobj); - if (!cpu_kobj) { - pr_err("%s: cannot create %s kobject\n", __func__, cpu_name); - ret = -ENOMEM; - goto mode_sysfs_add_cpu_exit; - } - - for (i = 0; i < MSM_PM_SLEEP_MODE_NR; i++) { - int idx = MSM_PM_MODE(cpu, i); - - if ((!msm_pm_modes[idx].suspend_supported) && - (!msm_pm_modes[idx].idle_supported)) - continue; - - mode = kzalloc(sizeof(*mode), GFP_KERNEL); - if (!mode) { - pr_err("%s: cannot allocate memory for attributes\n", - __func__); - ret = -ENOMEM; - goto mode_sysfs_add_cpu_exit; - } - - mode->kobj = kobject_create_and_add( - msm_pm_sleep_mode_labels[i], cpu_kobj); - if (!mode->kobj) { - pr_err("%s: cannot create kobject\n", __func__); - ret = -ENOMEM; - goto mode_sysfs_add_cpu_exit; - } - - for (k = 0, j = 0; k < MSM_PM_MODE_ATTR_NR; k++) { - if ((k == MSM_PM_MODE_ATTR_IDLE) && - !msm_pm_modes[idx].idle_supported) - continue; - if ((k == MSM_PM_MODE_ATTR_SUSPEND) && - !msm_pm_modes[idx].suspend_supported) - continue; - mode->kas[j].cpu = cpu; - mode->kas[j].ka.attr.mode = 0644; - mode->kas[j].ka.show = msm_pm_mode_attr_show; - mode->kas[j].ka.store = msm_pm_mode_attr_store; - mode->kas[j].ka.attr.name = msm_pm_mode_attr_labels[k]; - mode->attrs[j] = &mode->kas[j].ka.attr; - j++; - } - mode->attrs[j] = NULL; - - mode->attr_group.attrs = mode->attrs; - ret = sysfs_create_group(mode->kobj, &mode->attr_group); - if (ret) { - printk(KERN_ERR - "%s: cannot create kobject attribute group\n", - __func__); - goto mode_sysfs_add_cpu_exit; - } - } - - ret = 0; - -mode_sysfs_add_cpu_exit: - if (ret) { - if (mode && mode->kobj) - kobject_del(mode->kobj); - kfree(mode); - } - - return ret; -} - -/* - * Add sysfs entries for the sleep modes. - */ -static int __init msm_pm_mode_sysfs_add(void) -{ - struct kobject *module_kobj = NULL; - struct kobject *modes_kobj = NULL; - unsigned int cpu; - int ret; - - module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME); - if (!module_kobj) { - printk(KERN_ERR "%s: cannot find kobject for module %s\n", - __func__, KBUILD_MODNAME); - ret = -ENOENT; - goto mode_sysfs_add_exit; - } - - modes_kobj = kobject_create_and_add("modes", module_kobj); - if (!modes_kobj) { - printk(KERN_ERR "%s: cannot create modes kobject\n", __func__); - ret = -ENOMEM; - goto mode_sysfs_add_exit; - } - - for_each_possible_cpu(cpu) { - ret = msm_pm_mode_sysfs_add_cpu(cpu, modes_kobj); - if (ret) - goto mode_sysfs_add_exit; - } - - ret = 0; - -mode_sysfs_add_exit: - return ret; -} - -s32 msm_cpuidle_get_deep_idle_latency(void) -{ - int i = MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN); - return msm_pm_modes[i].latency - 1; -} - -void __init msm_pm_set_platform_data( - struct msm_pm_platform_data *data, int count) -{ - BUG_ON(MSM_PM_SLEEP_MODE_NR * num_possible_cpus() > count); - msm_pm_modes = data; -} - -void __init msm_pm_set_irq_extns(struct msm_pm_irq_calls *irq_calls) -{ - /* sanity check */ - BUG_ON(irq_calls == NULL || irq_calls->irq_pending == NULL || - irq_calls->idle_sleep_allowed == NULL || - irq_calls->enter_sleep1 == NULL || - irq_calls->enter_sleep2 == NULL || - irq_calls->exit_sleep1 == NULL || - irq_calls->exit_sleep2 == NULL || - irq_calls->exit_sleep3 == NULL); - - msm_pm_irq_extns = irq_calls; -} - -void __init msm_pm_set_cpr_ops(struct msm_pm_cpr_ops *ops) -{ - msm_cpr_ops = ops; -} - -/****************************************************************************** - * Sleep Limitations - *****************************************************************************/ -enum { - SLEEP_LIMIT_NONE = 0, - SLEEP_LIMIT_NO_TCXO_SHUTDOWN = 2, - SLEEP_LIMIT_MASK = 0x03, -}; - -static uint32_t msm_pm_sleep_limit = SLEEP_LIMIT_NONE; -#ifdef CONFIG_MSM_MEMORY_LOW_POWER_MODE -enum { - SLEEP_RESOURCE_MEMORY_BIT0 = 0x0200, - SLEEP_RESOURCE_MEMORY_BIT1 = 0x0010, -}; -#endif - - -/****************************************************************************** - * Configure Hardware for Power Down/Up - *****************************************************************************/ - -#if defined(CONFIG_ARCH_MSM7X30) -#define APPS_CLK_SLEEP_EN (MSM_APCS_GCC_BASE + 0x020) -#define APPS_PWRDOWN (MSM_ACC0_BASE + 0x01c) -#define APPS_SECOP (MSM_TCSR_BASE + 0x038) -#define APPS_STANDBY_CTL NULL -#else -#define APPS_CLK_SLEEP_EN (MSM_CSR_BASE + 0x11c) -#define APPS_PWRDOWN (MSM_CSR_BASE + 0x440) -#define APPS_STANDBY_CTL (MSM_CSR_BASE + 0x108) -#define APPS_SECOP NULL -#endif - -/* - * Configure hardware registers in preparation for Apps power down. - */ -static void msm_pm_config_hw_before_power_down(void) -{ - if (cpu_is_msm7x30() || cpu_is_msm8x55()) { - __raw_writel(4, APPS_SECOP); - } else if (cpu_is_msm7x27()) { - __raw_writel(0x1f, APPS_CLK_SLEEP_EN); - } else if (cpu_is_msm7x27a() || cpu_is_msm7x27aa() || - cpu_is_msm7x25a() || cpu_is_msm7x25aa() || - cpu_is_msm7x25ab()) { - __raw_writel(0x7, APPS_CLK_SLEEP_EN); - } else if (cpu_is_qsd8x50()) { - __raw_writel(0x1f, APPS_CLK_SLEEP_EN); - mb(); - __raw_writel(0, APPS_STANDBY_CTL); - } - mb(); - __raw_writel(1, APPS_PWRDOWN); - mb(); -} - -/* - * Program the top csr from core0 context to put the - * core1 into GDFS, as core1 is not running yet. - */ -static void msm_pm_configure_top_csr(void) -{ - /* - * Enable TCSR for core - * Set reset bit for SPM - * Set CLK_OFF bit - * Set clamps bit - * Set power_up bit - * Disable TSCR for core - */ - uint32_t bit_pos[][6] = { - /* c2 */ - {17, 15, 13, 16, 14, 17}, - /* c1 & c3*/ - {22, 20, 18, 21, 19, 22}, - }; - uint32_t mpa5_cfg_ctl[2] = {0x30, 0x48}; - void __iomem *base_ptr; - unsigned int value = 0; - unsigned int cpu; - int i; - - /* Initialize all the SPM registers */ - msm_spm_reinit(); - - for_each_possible_cpu(cpu) { - /* skip for C0 */ - if (!cpu) - continue; - - base_ptr = core_reset_base(cpu); - if (!base_ptr) - return; - - /* bring the core out of reset */ - __raw_writel(0x3, base_ptr); - mb(); - - /* - * i == 0, Enable TCSR for core - * i == 1, Set reset bit for SPM - * i == 2, Set CLK_OFF bit - * i == 3, Set clamps bit - * i == 4, Set power_up bit - */ - for (i = 0; i < 5; i++) { - value = __raw_readl(MSM_CFG_CTL_BASE + - mpa5_cfg_ctl[cpu/2]); - value |= BIT(bit_pos[cpu%2][i]); - __raw_writel(value, MSM_CFG_CTL_BASE + - mpa5_cfg_ctl[cpu/2]); - mb(); - } - - /* i == 5, Disable TCSR for core */ - value = __raw_readl(MSM_CFG_CTL_BASE + - mpa5_cfg_ctl[cpu/2]); - value &= ~BIT(bit_pos[cpu%2][i]); - __raw_writel(value, MSM_CFG_CTL_BASE + - mpa5_cfg_ctl[cpu/2]); - mb(); - - __raw_writel(0x0, base_ptr); - mb(); - } -} - -/* - * Clear hardware registers after Apps powers up. - */ -static void msm_pm_config_hw_after_power_up(void) -{ - - if (cpu_is_msm7x30() || cpu_is_msm8x55()) { - __raw_writel(0, APPS_SECOP); - mb(); - __raw_writel(0, APPS_PWRDOWN); - mb(); - msm_spm_reinit(); - } else if (cpu_is_msm8625() || cpu_is_msm8625q()) { - __raw_writel(0, APPS_PWRDOWN); - mb(); - - if (per_cpu(power_collapsed, 1)) { - /* - * enable the SCU while coming out of power - * collapse. - */ - scu_enable(MSM_SCU_BASE); - /* - * Program the top csr to put the core1 into GDFS. - */ - msm_pm_configure_top_csr(); - } - } else { - __raw_writel(0, APPS_PWRDOWN); - mb(); - __raw_writel(0, APPS_CLK_SLEEP_EN); - mb(); - } -} - -/* - * Configure hardware registers in preparation for SWFI. - */ -static void msm_pm_config_hw_before_swfi(void) -{ - if (cpu_is_qsd8x50()) { - __raw_writel(0x1f, APPS_CLK_SLEEP_EN); - mb(); - } else if (cpu_is_msm7x27()) { - __raw_writel(0x0f, APPS_CLK_SLEEP_EN); - mb(); - } else if (cpu_is_msm7x27a() || cpu_is_msm7x27aa() || - cpu_is_msm7x25a() || cpu_is_msm7x25aa() || - cpu_is_msm7x25ab()) { - __raw_writel(0x7, APPS_CLK_SLEEP_EN); - mb(); - } -} - -/* - * Respond to timing out waiting for Modem - * - * NOTE: The function never returns. - */ -static void msm_pm_timeout(void) -{ -#if defined(CONFIG_MSM_PM_TIMEOUT_RESET_CHIP) - printk(KERN_EMERG "%s(): resetting chip\n", __func__); - msm_proc_comm(PCOM_RESET_CHIP_IMM, NULL, NULL); -#elif defined(CONFIG_MSM_PM_TIMEOUT_RESET_MODEM) - printk(KERN_EMERG "%s(): resetting modem\n", __func__); - msm_proc_comm_reset_modem_now(); -#elif defined(CONFIG_MSM_PM_TIMEOUT_HALT) - printk(KERN_EMERG "%s(): halting\n", __func__); -#endif - for (;;) - ; -} - - -/****************************************************************************** - * State Polling Definitions - *****************************************************************************/ - -struct msm_pm_polled_group { - uint32_t group_id; - - uint32_t bits_all_set; - uint32_t bits_all_clear; - uint32_t bits_any_set; - uint32_t bits_any_clear; - - uint32_t value_read; -}; - -/* - * Return true if all bits indicated by flag are set in source. - */ -static inline bool msm_pm_all_set(uint32_t source, uint32_t flag) -{ - return (source & flag) == flag; -} - -/* - * Return true if any bit indicated by flag are set in source. - */ -static inline bool msm_pm_any_set(uint32_t source, uint32_t flag) -{ - return !flag || (source & flag); -} - -/* - * Return true if all bits indicated by flag are cleared in source. - */ -static inline bool msm_pm_all_clear(uint32_t source, uint32_t flag) -{ - return (~source & flag) == flag; -} - -/* - * Return true if any bit indicated by flag are cleared in source. - */ -static inline bool msm_pm_any_clear(uint32_t source, uint32_t flag) -{ - return !flag || (~source & flag); -} - -/* - * Poll the shared memory states as indicated by the poll groups. - * - * nr_grps: number of groups in the array - * grps: array of groups - * - * The function returns when conditions specified by any of the poll - * groups become true. The conditions specified by a poll group are - * deemed true when 1) at least one bit from bits_any_set is set OR one - * bit from bits_any_clear is cleared; and 2) all bits in bits_all_set - * are set; and 3) all bits in bits_all_clear are cleared. - * - * Return value: - * >=0: index of the poll group whose conditions have become true - * -ETIMEDOUT: timed out - */ -static int msm_pm_poll_state(int nr_grps, struct msm_pm_polled_group *grps) -{ - int i, k; - - for (i = 0; i < 50000; i++) { - for (k = 0; k < nr_grps; k++) { - bool all_set, all_clear; - bool any_set, any_clear; - - grps[k].value_read = smsm_get_state(grps[k].group_id); - - all_set = msm_pm_all_set(grps[k].value_read, - grps[k].bits_all_set); - all_clear = msm_pm_all_clear(grps[k].value_read, - grps[k].bits_all_clear); - any_set = msm_pm_any_set(grps[k].value_read, - grps[k].bits_any_set); - any_clear = msm_pm_any_clear(grps[k].value_read, - grps[k].bits_any_clear); - - if (all_set && all_clear && (any_set || any_clear)) - return k; - } - udelay(50); - } - - printk(KERN_ERR "%s failed:\n", __func__); - for (k = 0; k < nr_grps; k++) - printk(KERN_ERR "(%x, %x, %x, %x) %x\n", - grps[k].bits_all_set, grps[k].bits_all_clear, - grps[k].bits_any_set, grps[k].bits_any_clear, - grps[k].value_read); - - return -ETIMEDOUT; -} - - -/****************************************************************************** - * Suspend Max Sleep Time - *****************************************************************************/ - -#define SCLK_HZ (32768) -#define MSM_PM_SLEEP_TICK_LIMIT (0x6DDD000) - -#ifdef CONFIG_MSM_SLEEP_TIME_OVERRIDE -static int msm_pm_sleep_time_override; -module_param_named(sleep_time_override, - msm_pm_sleep_time_override, int, S_IRUGO | S_IWUSR | S_IWGRP); -#endif - -static uint32_t msm_pm_max_sleep_time; - -/* - * Convert time from nanoseconds to slow clock ticks, then cap it to the - * specified limit - */ -static int64_t msm_pm_convert_and_cap_time(int64_t time_ns, int64_t limit) -{ - do_div(time_ns, NSEC_PER_SEC / SCLK_HZ); - return (time_ns > limit) ? limit : time_ns; -} - -/* - * Set the sleep time for suspend. 0 means infinite sleep time. - */ -void msm_pm_set_max_sleep_time(int64_t max_sleep_time_ns) -{ - unsigned long flags; - - local_irq_save(flags); - if (max_sleep_time_ns == 0) { - msm_pm_max_sleep_time = 0; - } else { - msm_pm_max_sleep_time = (uint32_t)msm_pm_convert_and_cap_time( - max_sleep_time_ns, MSM_PM_SLEEP_TICK_LIMIT); - - if (msm_pm_max_sleep_time == 0) - msm_pm_max_sleep_time = 1; - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND, KERN_INFO, - "%s(): Requested %lld ns Giving %u sclk ticks\n", __func__, - max_sleep_time_ns, msm_pm_max_sleep_time); - local_irq_restore(flags); -} -EXPORT_SYMBOL(msm_pm_set_max_sleep_time); - - -/****************************************************************************** - * Shared Memory Bits - *****************************************************************************/ - -#define DEM_MASTER_BITS_PER_CPU 6 - -/* Power Master State Bits - Per CPU */ -#define DEM_MASTER_SMSM_RUN \ - (0x01UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) -#define DEM_MASTER_SMSM_RSA \ - (0x02UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) -#define DEM_MASTER_SMSM_PWRC_EARLY_EXIT \ - (0x04UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) -#define DEM_MASTER_SMSM_SLEEP_EXIT \ - (0x08UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) -#define DEM_MASTER_SMSM_READY \ - (0x10UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) -#define DEM_MASTER_SMSM_SLEEP \ - (0x20UL << (DEM_MASTER_BITS_PER_CPU * SMSM_APPS_STATE)) - -/* Power Slave State Bits */ -#define DEM_SLAVE_SMSM_RUN (0x0001) -#define DEM_SLAVE_SMSM_PWRC (0x0002) -#define DEM_SLAVE_SMSM_PWRC_DELAY (0x0004) -#define DEM_SLAVE_SMSM_PWRC_EARLY_EXIT (0x0008) -#define DEM_SLAVE_SMSM_WFPI (0x0010) -#define DEM_SLAVE_SMSM_SLEEP (0x0020) -#define DEM_SLAVE_SMSM_SLEEP_EXIT (0x0040) -#define DEM_SLAVE_SMSM_MSGS_REDUCED (0x0080) -#define DEM_SLAVE_SMSM_RESET (0x0100) -#define DEM_SLAVE_SMSM_PWRC_SUSPEND (0x0200) - - -/****************************************************************************** - * Shared Memory Data - *****************************************************************************/ - -#define DEM_MAX_PORT_NAME_LEN (20) - -struct msm_pm_smem_t { - uint32_t sleep_time; - uint32_t irq_mask; - uint32_t resources_used; - uint32_t reserved1; - - uint32_t wakeup_reason; - uint32_t pending_irqs; - uint32_t rpc_prog; - uint32_t rpc_proc; - char smd_port_name[DEM_MAX_PORT_NAME_LEN]; - uint32_t reserved2; -}; - - -/****************************************************************************** - * - *****************************************************************************/ -static struct msm_pm_smem_t *msm_pm_smem_data; -static atomic_t msm_pm_init_done = ATOMIC_INIT(0); - -static int msm_pm_modem_busy(void) -{ - if (!(smsm_get_state(SMSM_POWER_MASTER_DEM) & DEM_MASTER_SMSM_READY)) { - MSM_PM_DPRINTK(MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, "%s(): master not ready\n", __func__); - return -EBUSY; - } - - return 0; -} - -/* - * Power collapse the Apps processor. This function executes the handshake - * protocol with Modem. - * - * Return value: - * -EAGAIN: modem reset occurred or early exit from power collapse - * -EBUSY: modem not ready for our power collapse -- no power loss - * -ETIMEDOUT: timed out waiting for modem's handshake -- no power loss - * 0: success - */ -static int msm_pm_power_collapse - (bool from_idle, uint32_t sleep_delay, uint32_t sleep_limit) -{ - struct msm_pm_polled_group state_grps[2]; - unsigned long saved_acpuclk_rate; - int collapsed = 0; - int ret; - int val; - int modem_early_exit = 0; - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, "%s(): idle %d, delay %u, limit %u\n", __func__, - (int)from_idle, sleep_delay, sleep_limit); - - if (!(smsm_get_state(SMSM_POWER_MASTER_DEM) & DEM_MASTER_SMSM_READY)) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND | MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, "%s(): master not ready\n", __func__); - ret = -EBUSY; - goto power_collapse_bail; - } - - memset(msm_pm_smem_data, 0, sizeof(*msm_pm_smem_data)); - - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - /* Program the SPM */ - ret = msm_spm_set_low_power_mode(MSM_SPM_MODE_POWER_COLLAPSE, - false); - WARN_ON(ret); - } - - /* Call CPR suspend only for "idlePC" case */ - if (msm_cpr_ops && from_idle) - msm_cpr_ops->cpr_suspend(); - - msm_pm_irq_extns->enter_sleep1(true, from_idle, - &msm_pm_smem_data->irq_mask); - - msm_pm_smem_data->sleep_time = sleep_delay; - msm_pm_smem_data->resources_used = sleep_limit; - - saved_acpuclk_rate = acpuclk_power_collapse(); - MSM_PM_DPRINTK(MSM_PM_DEBUG_CLOCK, KERN_INFO, - "%s(): change clock rate (old rate = %lu)\n", __func__, - saved_acpuclk_rate); - - if (saved_acpuclk_rate == 0) { - ret = -EAGAIN; - goto acpu_set_clock_fail; - } - - msm_sirc_enter_sleep(); - msm_gpio_enter_sleep(from_idle); - - /* Enter PWRC/PWRC_SUSPEND */ - - if (from_idle) - smsm_change_state(SMSM_APPS_DEM, DEM_SLAVE_SMSM_RUN, - DEM_SLAVE_SMSM_PWRC); - else - smsm_change_state(SMSM_APPS_DEM, DEM_SLAVE_SMSM_RUN, - DEM_SLAVE_SMSM_PWRC | DEM_SLAVE_SMSM_PWRC_SUSPEND); - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): PWRC"); - MSM_PM_DEBUG_PRINT_SLEEP_INFO(); - - memset(state_grps, 0, sizeof(state_grps)); - state_grps[0].group_id = SMSM_POWER_MASTER_DEM; - state_grps[0].bits_all_set = DEM_MASTER_SMSM_RSA; - state_grps[1].group_id = SMSM_MODEM_STATE; - state_grps[1].bits_all_set = SMSM_RESET; - - ret = msm_pm_poll_state(ARRAY_SIZE(state_grps), state_grps); - - if (ret < 0) { - printk(KERN_EMERG "%s(): power collapse entry " - "timed out waiting for Modem's response\n", __func__); - msm_pm_timeout(); - } - - if (ret == 1) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_poll_state detected Modem reset\n", - __func__); - goto power_collapse_early_exit; - } - - /* DEM Master in RSA */ - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): PWRC RSA"); - - ret = msm_pm_irq_extns->enter_sleep2(true, from_idle); - if (ret < 0) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_irq_enter_sleep2 aborted, %d\n", __func__, - ret); - goto power_collapse_early_exit; - } - - msm_pm_config_hw_before_power_down(); - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): pre power down"); - - msm_pm_boot_config_before_pc(smp_processor_id(), - virt_to_phys(msm_pm_collapse_exit)); - -#ifdef CONFIG_VFP - if (from_idle) - vfp_pm_suspend(); -#endif - -#ifdef CONFIG_CACHE_L2X0 - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - l2cc_suspend(); - else - apps_power_collapse = 1; -#endif - - collapsed = msm_pm_collapse(); - - /* - * TBD: Currently recognise the MODEM early exit - * path by reading the MPA5_GDFS_CNT_VAL register. - */ - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - int cpu; - /* - * on system reset, default value of MPA5_GDFS_CNT_VAL - * is = 0x0, later modem reprogram this value to - * 0x00030004/0x000F0004(8x25Q). Once APPS did - * a power collapse and coming out of it expected value - * of this register always be 0x00030004/0x000F0004(8x25Q). - * Incase if APPS sees the value as 0x00030002/0x000F0002(8x25Q) - * consider this case as a modem early exit. - */ - val = __raw_readl(MSM_CFG_CTL_BASE + 0x38); - - /* 8x25Q */ - if (cpu_is_msm8625q()) { - if (val != 0x000F0002) { - for_each_possible_cpu(cpu) { - if (!cpu) - continue; - per_cpu(power_collapsed, cpu) = 1; - } - /* - * override DBGNOPOWERDN and program the GDFS - * count val - */ - __raw_writel(0x000F0002, - (MSM_CFG_CTL_BASE + 0x38)); - } else - modem_early_exit = 1; - } else { - if (val != 0x00030002) { - for_each_possible_cpu(cpu) { - if (!cpu) - continue; - per_cpu(power_collapsed, cpu) = 1; - } - /* - * override DBGNOPOWERDN and program the GDFS - * count val - */ - __raw_writel(0x00030002, - (MSM_CFG_CTL_BASE + 0x38)); - } else - modem_early_exit = 1; - } - } - -#ifdef CONFIG_CACHE_L2X0 - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - l2cc_resume(); - else - apps_power_collapse = 0; -#endif - - msm_pm_boot_config_after_pc(smp_processor_id()); - - if (collapsed) { -#ifdef CONFIG_VFP - if (from_idle) - vfp_pm_resume(); -#endif - cpu_init(); - local_fiq_enable(); - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND | MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_collapse returned %d\n", __func__, collapsed); - - msm_pm_irq_extns->exit_sleep1(msm_pm_smem_data->irq_mask, - msm_pm_smem_data->wakeup_reason, - msm_pm_smem_data->pending_irqs); - - msm_pm_config_hw_after_power_up(); - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): post power up"); - - memset(state_grps, 0, sizeof(state_grps)); - state_grps[0].group_id = SMSM_POWER_MASTER_DEM; - state_grps[0].bits_any_set = - DEM_MASTER_SMSM_RSA | DEM_MASTER_SMSM_PWRC_EARLY_EXIT; - state_grps[1].group_id = SMSM_MODEM_STATE; - state_grps[1].bits_all_set = SMSM_RESET; - - ret = msm_pm_poll_state(ARRAY_SIZE(state_grps), state_grps); - - if (ret < 0) { - printk(KERN_EMERG "%s(): power collapse exit " - "timed out waiting for Modem's response\n", __func__); - msm_pm_timeout(); - } - - if (ret == 1) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_poll_state detected Modem reset\n", - __func__); - goto power_collapse_early_exit; - } - - /* Sanity check */ - if (collapsed && !modem_early_exit) { - BUG_ON(!(state_grps[0].value_read & DEM_MASTER_SMSM_RSA)); - } else { - BUG_ON(!(state_grps[0].value_read & - DEM_MASTER_SMSM_PWRC_EARLY_EXIT)); - goto power_collapse_early_exit; - } - - /* Enter WFPI */ - - smsm_change_state(SMSM_APPS_DEM, - DEM_SLAVE_SMSM_PWRC | DEM_SLAVE_SMSM_PWRC_SUSPEND, - DEM_SLAVE_SMSM_WFPI); - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): WFPI"); - - memset(state_grps, 0, sizeof(state_grps)); - state_grps[0].group_id = SMSM_POWER_MASTER_DEM; - state_grps[0].bits_all_set = DEM_MASTER_SMSM_RUN; - state_grps[1].group_id = SMSM_MODEM_STATE; - state_grps[1].bits_all_set = SMSM_RESET; - - ret = msm_pm_poll_state(ARRAY_SIZE(state_grps), state_grps); - - if (ret < 0) { - printk(KERN_EMERG "%s(): power collapse WFPI " - "timed out waiting for Modem's response\n", __func__); - msm_pm_timeout(); - } - - if (ret == 1) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_poll_state detected Modem reset\n", - __func__); - ret = -EAGAIN; - goto power_collapse_restore_gpio_bail; - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_CLOCK, KERN_INFO, - "%s(): restore clock rate to %lu\n", __func__, - saved_acpuclk_rate); - if (acpuclk_set_rate(smp_processor_id(), saved_acpuclk_rate, - SETRATE_PC) < 0) - pr_err("%s(): failed to restore clock rate(%lu)\n", - __func__, saved_acpuclk_rate); - - /* DEM Master == RUN */ - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): WFPI RUN"); - MSM_PM_DEBUG_PRINT_SLEEP_INFO(); - - msm_pm_irq_extns->exit_sleep2(msm_pm_smem_data->irq_mask, - msm_pm_smem_data->wakeup_reason, - msm_pm_smem_data->pending_irqs); - msm_pm_irq_extns->exit_sleep3(msm_pm_smem_data->irq_mask, - msm_pm_smem_data->wakeup_reason, - msm_pm_smem_data->pending_irqs); - msm_gpio_exit_sleep(); - msm_sirc_exit_sleep(); - - smsm_change_state(SMSM_APPS_DEM, - DEM_SLAVE_SMSM_WFPI, DEM_SLAVE_SMSM_RUN); - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): RUN"); - - smd_sleep_exit(); - - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - ret = msm_spm_set_low_power_mode(MSM_SPM_MODE_CLOCK_GATING, - false); - WARN_ON(ret); - } - - /* Call CPR resume only for "idlePC" case */ - if (msm_cpr_ops && from_idle) - msm_cpr_ops->cpr_resume(); - - return 0; - -power_collapse_early_exit: - /* Enter PWRC_EARLY_EXIT */ - - smsm_change_state(SMSM_APPS_DEM, - DEM_SLAVE_SMSM_PWRC | DEM_SLAVE_SMSM_PWRC_SUSPEND, - DEM_SLAVE_SMSM_PWRC_EARLY_EXIT); - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): EARLY_EXIT"); - - memset(state_grps, 0, sizeof(state_grps)); - state_grps[0].group_id = SMSM_POWER_MASTER_DEM; - state_grps[0].bits_all_set = DEM_MASTER_SMSM_PWRC_EARLY_EXIT; - state_grps[1].group_id = SMSM_MODEM_STATE; - state_grps[1].bits_all_set = SMSM_RESET; - - ret = msm_pm_poll_state(ARRAY_SIZE(state_grps), state_grps); - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): EARLY_EXIT EE"); - - if (ret < 0) { - printk(KERN_EMERG "%s(): power collapse EARLY_EXIT " - "timed out waiting for Modem's response\n", __func__); - msm_pm_timeout(); - } - - if (ret == 1) { - MSM_PM_DPRINTK( - MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_poll_state detected Modem reset\n", - __func__); - } - - /* DEM Master == RESET or PWRC_EARLY_EXIT */ - - ret = -EAGAIN; - -power_collapse_restore_gpio_bail: - msm_gpio_exit_sleep(); - msm_sirc_exit_sleep(); - - /* Enter RUN */ - smsm_change_state(SMSM_APPS_DEM, - DEM_SLAVE_SMSM_PWRC | DEM_SLAVE_SMSM_PWRC_SUSPEND | - DEM_SLAVE_SMSM_PWRC_EARLY_EXIT, DEM_SLAVE_SMSM_RUN); - - MSM_PM_DEBUG_PRINT_STATE("msm_pm_power_collapse(): RUN"); - - MSM_PM_DPRINTK(MSM_PM_DEBUG_CLOCK, KERN_INFO, - "%s(): restore clock rate to %lu\n", __func__, - saved_acpuclk_rate); - if (acpuclk_set_rate(smp_processor_id(), saved_acpuclk_rate, - SETRATE_PC) < 0) - pr_err("%s(): failed to restore clock rate(%lu)\n", - __func__, saved_acpuclk_rate); - - if (collapsed) - smd_sleep_exit(); - -acpu_set_clock_fail: - if (msm_cpr_ops && from_idle) - msm_cpr_ops->cpr_resume(); - -power_collapse_bail: - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - ret = msm_spm_set_low_power_mode(MSM_SPM_MODE_CLOCK_GATING, - false); - WARN_ON(ret); - } - - return ret; -} - -/* - * Power collapse the Apps processor without involving Modem. - * - * Return value: - * 0: success - */ -static int __ref msm_pm_power_collapse_standalone(bool from_idle) -{ - int collapsed = 0; - int ret; - void *entry; - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND|MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, "%s()\n", __func__); - - ret = msm_spm_set_low_power_mode(MSM_SPM_MODE_POWER_COLLAPSE, false); - WARN_ON(ret); - - entry = (!smp_processor_id() || from_idle) ? - msm_pm_collapse_exit : msm_secondary_startup; - - msm_pm_boot_config_before_pc(smp_processor_id(), - virt_to_phys(entry)); - -#ifdef CONFIG_VFP - vfp_pm_suspend(); -#endif - -#ifdef CONFIG_CACHE_L2X0 - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - l2cc_suspend(); -#endif - - collapsed = msm_pm_collapse(); - -#ifdef CONFIG_CACHE_L2X0 - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - l2cc_resume(); -#endif - - msm_pm_boot_config_after_pc(smp_processor_id()); - - if (collapsed) { -#ifdef CONFIG_VFP - vfp_pm_resume(); -#endif - cpu_init(); - local_fiq_enable(); - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND | MSM_PM_DEBUG_POWER_COLLAPSE, - KERN_INFO, - "%s(): msm_pm_collapse returned %d\n", __func__, collapsed); - - ret = msm_spm_set_low_power_mode(MSM_SPM_MODE_CLOCK_GATING, false); - WARN_ON(ret); - - return !collapsed; -} - -/* - * Bring the Apps processor to SWFI. - * - * Return value: - * -EIO: could not ramp Apps processor clock - * 0: success - */ -static int msm_pm_swfi(bool ramp_acpu) -{ - unsigned long saved_acpuclk_rate = 0; - - if (ramp_acpu) { - saved_acpuclk_rate = acpuclk_wait_for_irq(); - MSM_PM_DPRINTK(MSM_PM_DEBUG_CLOCK, KERN_INFO, - "%s(): change clock rate (old rate = %lu)\n", __func__, - saved_acpuclk_rate); - - if (!saved_acpuclk_rate) - return -EIO; - } - - if (!cpu_is_msm8625() && !cpu_is_msm8625q()) - msm_pm_config_hw_before_swfi(); - - msm_arch_idle(); - - if (ramp_acpu) { - MSM_PM_DPRINTK(MSM_PM_DEBUG_CLOCK, KERN_INFO, - "%s(): restore clock rate to %lu\n", __func__, - saved_acpuclk_rate); - if (acpuclk_set_rate(smp_processor_id(), saved_acpuclk_rate, - SETRATE_SWFI) < 0) - printk(KERN_ERR - "%s(): failed to restore clock rate(%lu)\n", - __func__, saved_acpuclk_rate); - } - - return 0; -} - -static int64_t msm_pm_timer_enter_suspend(int64_t *period) -{ - int64_t time = 0; - - time = msm_timer_get_sclk_time(period); - if (!time) - pr_err("%s: Unable to read sclk.\n", __func__); - return time; -} - -static int64_t msm_pm_timer_exit_suspend(int64_t time, int64_t period) -{ - - if (time != 0) { - int64_t end_time = msm_timer_get_sclk_time(NULL); - if (end_time != 0) { - time = end_time - time; - if (time < 0) - time += period; - } else - time = 0; - } - return time; -} - -/****************************************************************************** - * External Idle/Suspend Functions - *****************************************************************************/ - -/* - * Put CPU in low power mode. - */ -void arch_idle(void) -{ - bool allow[MSM_PM_SLEEP_MODE_NR]; - uint32_t sleep_limit = SLEEP_LIMIT_NONE; - - int64_t timer_expiration; - int latency_qos; - int ret; - int i; - unsigned int cpu; - int64_t t1; - static DEFINE_PER_CPU(int64_t, t2); - int exit_stat; - - if (!atomic_read(&msm_pm_init_done)) - return; - - cpu = smp_processor_id(); - latency_qos = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); - /* get the next timer expiration */ - timer_expiration = ktime_to_ns(tick_nohz_get_sleep_length()); - - t1 = ktime_to_ns(ktime_get()); - msm_pm_add_stat(MSM_PM_STAT_NOT_IDLE, t1 - __get_cpu_var(t2)); - msm_pm_add_stat(MSM_PM_STAT_REQUESTED_IDLE, timer_expiration); - exit_stat = MSM_PM_STAT_IDLE_SPIN; - - for (i = 0; i < ARRAY_SIZE(allow); i++) - allow[i] = true; - - if (num_online_cpus() > 1 || - (timer_expiration < msm_pm_idle_sleep_min_time) || - !msm_pm_irq_extns->idle_sleep_allowed()) { - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = false; - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = false; - } - - for (i = 0; i < ARRAY_SIZE(allow); i++) { - struct msm_pm_platform_data *mode = - &msm_pm_modes[MSM_PM_MODE(cpu, i)]; - if (!mode->idle_supported || !mode->idle_enabled || - mode->latency >= latency_qos || - mode->residency * 1000ULL >= timer_expiration) - allow[i] = false; - } - - if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE] || - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN]) { - uint32_t wait_us = CONFIG_MSM_IDLE_WAIT_ON_MODEM; - while (msm_pm_modem_busy() && wait_us) { - if (wait_us > 100) { - udelay(100); - wait_us -= 100; - } else { - udelay(wait_us); - wait_us = 0; - } - } - - if (msm_pm_modem_busy()) { - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = false; - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] - = false; - } - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_IDLE, KERN_INFO, - "%s(): latency qos %d, next timer %lld, sleep limit %u\n", - __func__, latency_qos, timer_expiration, sleep_limit); - - for (i = 0; i < ARRAY_SIZE(allow); i++) - MSM_PM_DPRINTK(MSM_PM_DEBUG_IDLE, KERN_INFO, - "%s(): allow %s: %d\n", __func__, - msm_pm_sleep_mode_labels[i], (int)allow[i]); - - if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE] || - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN]) { - /* Sync the timer with SCLK, it is needed only for modem - * assissted pollapse case. - */ - int64_t next_timer_exp = msm_timer_enter_idle(); - uint32_t sleep_delay; - bool low_power = false; - - sleep_delay = (uint32_t) msm_pm_convert_and_cap_time( - next_timer_exp, MSM_PM_SLEEP_TICK_LIMIT); - - if (sleep_delay == 0) /* 0 would mean infinite time */ - sleep_delay = 1; - - if (!allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE]) - sleep_limit = SLEEP_LIMIT_NO_TCXO_SHUTDOWN; - -#if defined(CONFIG_MSM_MEMORY_LOW_POWER_MODE_IDLE_ACTIVE) - sleep_limit |= SLEEP_RESOURCE_MEMORY_BIT1; -#elif defined(CONFIG_MSM_MEMORY_LOW_POWER_MODE_IDLE_RETENTION) - sleep_limit |= SLEEP_RESOURCE_MEMORY_BIT0; -#endif - - ret = msm_pm_power_collapse(true, sleep_delay, sleep_limit); - low_power = (ret != -EBUSY && ret != -ETIMEDOUT); - msm_timer_exit_idle(low_power); - - if (ret) - exit_stat = MSM_PM_STAT_IDLE_FAILED_POWER_COLLAPSE; - else { - exit_stat = MSM_PM_STAT_IDLE_POWER_COLLAPSE; - msm_pm_sleep_limit = sleep_limit; - } - } else if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE]) { - ret = msm_pm_power_collapse_standalone(true); - exit_stat = ret ? - MSM_PM_STAT_IDLE_FAILED_STANDALONE_POWER_COLLAPSE : - MSM_PM_STAT_IDLE_STANDALONE_POWER_COLLAPSE; - } else if (allow[MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT]) { - ret = msm_pm_swfi(true); - if (ret) - while (!msm_pm_irq_extns->irq_pending()) - udelay(1); - exit_stat = ret ? MSM_PM_STAT_IDLE_SPIN : MSM_PM_STAT_IDLE_WFI; - } else if (allow[MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT]) { - msm_pm_swfi(false); - exit_stat = MSM_PM_STAT_IDLE_WFI; - } else { - while (!msm_pm_irq_extns->irq_pending()) - udelay(1); - exit_stat = MSM_PM_STAT_IDLE_SPIN; - } - - __get_cpu_var(t2) = ktime_to_ns(ktime_get()); - msm_pm_add_stat(exit_stat, __get_cpu_var(t2) - t1); -} - -/* - * Suspend the Apps processor. - * - * Return value: - * -EPERM: Suspend happened by a not permitted core - * -EAGAIN: modem reset occurred or early exit from suspend - * -EBUSY: modem not ready for our suspend - * -EINVAL: invalid sleep mode - * -EIO: could not ramp Apps processor clock - * -ETIMEDOUT: timed out waiting for modem's handshake - * 0: success - */ -static int msm_pm_enter(suspend_state_t state) -{ - bool allow[MSM_PM_SLEEP_MODE_NR]; - uint32_t sleep_limit = SLEEP_LIMIT_NONE; - int ret = -EPERM; - int i; - int64_t period = 0; - int64_t time = 0; - - /* Must executed by CORE0 */ - if (smp_processor_id()) { - __WARN(); - goto suspend_exit; - } - - time = msm_pm_timer_enter_suspend(&period); - - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND, KERN_INFO, - "%s(): sleep limit %u\n", __func__, sleep_limit); - - for (i = 0; i < ARRAY_SIZE(allow); i++) - allow[i] = true; - - for (i = 0; i < ARRAY_SIZE(allow); i++) { - struct msm_pm_platform_data *mode; - mode = &msm_pm_modes[MSM_PM_MODE(0, i)]; - if (!mode->suspend_supported || !mode->suspend_enabled) - allow[i] = false; - } - - if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE] || - allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN]) { - enum msm_pm_time_stats_id id; - - clock_debug_print_enabled(); - -#ifdef CONFIG_MSM_SLEEP_TIME_OVERRIDE - if (msm_pm_sleep_time_override > 0) { - int64_t ns; - ns = NSEC_PER_SEC * (int64_t)msm_pm_sleep_time_override; - msm_pm_set_max_sleep_time(ns); - msm_pm_sleep_time_override = 0; - } -#endif - if (!allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE]) - sleep_limit = SLEEP_LIMIT_NO_TCXO_SHUTDOWN; - -#if defined(CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND_ACTIVE) - sleep_limit |= SLEEP_RESOURCE_MEMORY_BIT1; -#elif defined(CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND_RETENTION) - sleep_limit |= SLEEP_RESOURCE_MEMORY_BIT0; -#elif defined(CONFIG_MSM_MEMORY_LOW_POWER_MODE_SUSPEND_DEEP_POWER_DOWN) - if (get_msm_migrate_pages_status() != MEM_OFFLINE) - sleep_limit |= SLEEP_RESOURCE_MEMORY_BIT0; -#endif - - for (i = 0; i < 30 && msm_pm_modem_busy(); i++) - udelay(500); - - ret = msm_pm_power_collapse( - false, msm_pm_max_sleep_time, sleep_limit); - - if (ret) - id = MSM_PM_STAT_FAILED_SUSPEND; - else { - id = MSM_PM_STAT_SUSPEND; - msm_pm_sleep_limit = sleep_limit; - } - - time = msm_pm_timer_exit_suspend(time, period); - msm_pm_add_stat(id, time); - } else if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE]) { - ret = msm_pm_power_collapse_standalone(false); - } else if (allow[MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT]) { - ret = msm_pm_swfi(true); - if (ret) - while (!msm_pm_irq_extns->irq_pending()) - udelay(1); - } else if (allow[MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT]) { - msm_pm_swfi(false); - } - -suspend_exit: - MSM_PM_DPRINTK(MSM_PM_DEBUG_SUSPEND, KERN_INFO, - "%s(): return %d\n", __func__, ret); - - return ret; -} - -static struct platform_suspend_ops msm_pm_ops = { - .enter = msm_pm_enter, - .valid = suspend_valid_only_mem, -}; - -/* Hotplug the "non boot" CPU's and put - * the cores into low power mode - */ -void msm_pm_cpu_enter_lowpower(unsigned int cpu) -{ - bool allow[MSM_PM_SLEEP_MODE_NR]; - int i; - - for (i = 0; i < MSM_PM_SLEEP_MODE_NR; i++) { - struct msm_pm_platform_data *mode; - - mode = &msm_pm_modes[MSM_PM_MODE(cpu, i)]; - allow[i] = mode->suspend_supported && mode->suspend_enabled; - } - - MSM_PM_DPRINTK(MSM_PM_DEBUG_HOTPLUG, KERN_INFO, - "CPU%u: %s: shutting down cpu\n", cpu, __func__); - - if (allow[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE]) { - msm_pm_power_collapse_standalone(false); - } else if (allow[MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT]) { - msm_pm_swfi(false); - } else { - MSM_PM_DPRINTK(MSM_PM_DEBUG_HOTPLUG, KERN_INFO, - "CPU%u: %s: shutting down failed!!!\n", cpu, __func__); - } -} - -/* - * Initialize the power management subsystem. - * - * Return value: - * -ENODEV: initialization failed - * 0: success - */ -static int __init msm_pm_init(void) -{ - int ret; - int val; - enum msm_pm_time_stats_id enable_stats[] = { - MSM_PM_STAT_REQUESTED_IDLE, - MSM_PM_STAT_IDLE_SPIN, - MSM_PM_STAT_IDLE_WFI, - MSM_PM_STAT_IDLE_STANDALONE_POWER_COLLAPSE, - MSM_PM_STAT_IDLE_FAILED_STANDALONE_POWER_COLLAPSE, - MSM_PM_STAT_IDLE_POWER_COLLAPSE, - MSM_PM_STAT_IDLE_FAILED_POWER_COLLAPSE, - MSM_PM_STAT_SUSPEND, - MSM_PM_STAT_FAILED_SUSPEND, - MSM_PM_STAT_NOT_IDLE, - }; - -#ifdef CONFIG_CPU_V7 - pgd_t *pc_pgd; - pmd_t *pmd; - unsigned long pmdval; - unsigned long exit_phys; - - exit_phys = virt_to_phys(msm_pm_collapse_exit); - - /* Page table for cores to come back up safely. */ - pc_pgd = pgd_alloc(&init_mm); - if (!pc_pgd) - return -ENOMEM; - pmd = pmd_offset(pud_offset(pc_pgd + pgd_index(exit_phys), exit_phys), - exit_phys); - pmdval = (exit_phys & PGDIR_MASK) | - PMD_TYPE_SECT | PMD_SECT_AP_WRITE; - pmd[0] = __pmd(pmdval); - pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); - - msm_saved_state_phys = - allocate_contiguous_ebi_nomap(CPU_SAVED_STATE_SIZE * - num_possible_cpus(), 4); - if (!msm_saved_state_phys) - return -ENOMEM; - msm_saved_state = ioremap_nocache(msm_saved_state_phys, - CPU_SAVED_STATE_SIZE * - num_possible_cpus()); - if (!msm_saved_state) - return -ENOMEM; - - /* It is remotely possible that the code in msm_pm_collapse_exit() - * which turns on the MMU with this mapping is in the - * next even-numbered megabyte beyond the - * start of msm_pm_collapse_exit(). - * Map this megabyte in as well. - */ - pmd[2] = __pmd(pmdval + (2 << (PGDIR_SHIFT - 1))); - flush_pmd_entry(pmd); - msm_pm_pc_pgd = virt_to_phys(pc_pgd); - clean_caches((unsigned long)&msm_pm_pc_pgd, sizeof(msm_pm_pc_pgd), - virt_to_phys(&msm_pm_pc_pgd)); -#endif - - msm_pm_smem_data = smem_alloc(SMEM_APPS_DEM_SLAVE_DATA, - sizeof(*msm_pm_smem_data)); - if (msm_pm_smem_data == NULL) { - printk(KERN_ERR "%s: failed to get smsm_data\n", __func__); - return -ENODEV; - } - - ret = msm_timer_init_time_sync(msm_pm_timeout); - if (ret) - return ret; - - ret = smsm_change_intr_mask(SMSM_POWER_MASTER_DEM, 0xFFFFFFFF, 0); - if (ret) { - printk(KERN_ERR "%s: failed to clear interrupt mask, %d\n", - __func__, ret); - return ret; - } - - if (cpu_is_msm8625() || cpu_is_msm8625q()) { - target_type = TARGET_IS_8625; - clean_caches((unsigned long)&target_type, sizeof(target_type), - virt_to_phys(&target_type)); - - /* - * Configure the MPA5_GDFS_CNT_VAL register for - * DBGPWRUPEREQ_OVERRIDE[19:16] = Override the - * DBGNOPOWERDN for each cpu. - * MPA5_GDFS_CNT_VAL[9:0] = Delay counter for - * GDFS control. - */ - if (cpu_is_msm8625q()) - val = 0x000F0002; - else - val = 0x00030002; - - __raw_writel(val, (MSM_CFG_CTL_BASE + 0x38)); - - l2x0_base_addr = MSM_L2CC_BASE; - } - -#ifdef CONFIG_MSM_MEMORY_LOW_POWER_MODE - /* The wakeup_reason field is overloaded during initialization time - to signal Modem that Apps will control the low power modes of - the memory. - */ - msm_pm_smem_data->wakeup_reason = 1; - smsm_change_state(SMSM_APPS_DEM, 0, DEM_SLAVE_SMSM_RUN); -#endif - - BUG_ON(msm_pm_modes == NULL); - - suspend_set_ops(&msm_pm_ops); - - msm_pm_mode_sysfs_add(); - msm_pm_add_stats(enable_stats, ARRAY_SIZE(enable_stats)); - - atomic_set(&msm_pm_init_done, 1); - return 0; -} - -late_initcall_sync(msm_pm_init); diff --git a/arch/arm/mach-msm/pmic_debugfs.c b/arch/arm/mach-msm/pmic_debugfs.c deleted file mode 100644 index b91eef576c54..000000000000 --- a/arch/arm/mach-msm/pmic_debugfs.c +++ /dev/null @@ -1,1156 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include - -#include - - -static int debug_lp_mode_control(char *buf, int size) -{ - enum switch_cmd cmd; - enum vreg_lp_id id; - int cnt; - - - cnt = sscanf(buf, "%u %u", &cmd, &id); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d", __func__, cnt); - return -EINVAL; - } - - if (pmic_lp_mode_control(cmd, id) < 0) - return -EFAULT; - - return size; -} - -static int debug_vreg_set_level(char *buf, int size) -{ - enum vreg_id vreg; - int level; - int cnt; - - cnt = sscanf(buf, "%u %u", &vreg, &level); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d", __func__, cnt); - return -EINVAL; - } - if (pmic_vreg_set_level(vreg, level) < 0) - return -EFAULT; - - return size; -} - -static int debug_vreg_pull_down_switch(char *buf, int size) -{ - enum switch_cmd cmd; - enum vreg_pdown_id id; - int cnt; - - cnt = sscanf(buf, "%u %u", &cmd, &id); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d", __func__, cnt); - return -EINVAL; - } - if (pmic_vreg_pull_down_switch(cmd, id) < 0) - return -EFAULT; - - return size; -} - -static int debug_secure_mpp_control_digital_output(char *buf, int size) -{ - enum mpp_which which; - enum mpp_dlogic_level level; - enum mpp_dlogic_out_ctrl out; - int cnt; - - cnt = sscanf(buf, "%u %u %u", &which, &level, &out); - if (cnt < 3) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - - if (pmic_secure_mpp_control_digital_output(which, level, out) < 0) - return -EFAULT; - - return size; -} - -static int debug_secure_mpp_config_i_sink(char *buf, int size) -{ - enum mpp_which which; - enum mpp_i_sink_level level; - enum mpp_i_sink_switch onoff; - int cnt; - - cnt = sscanf(buf, "%u %u %u", &which, &level, &onoff); - if (cnt < 3) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - - if (pmic_secure_mpp_config_i_sink(which, level, onoff) < 0) - return -EFAULT; - - return size; -} - -static int debug_secure_mpp_config_digital_input(char *buf, int size) -{ - enum mpp_which which; - enum mpp_dlogic_level level; - enum mpp_dlogic_in_dbus dbus; - int cnt; - - cnt = sscanf(buf, "%u %u %u", &which, &level, &dbus); - if (cnt < 3) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_secure_mpp_config_digital_input(which, level, dbus) < 0) - return -EFAULT; - - return size; -} - -static int debug_rtc_start(char *buf, int size) -{ - uint time; - struct rtc_time *hal; - int cnt; - - cnt = sscanf(buf, "%d", &time); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - hal = (struct rtc_time *)&time; - if (pmic_rtc_start(hal) < 0) - return -EFAULT; - - return size; -} - -static int debug_rtc_stop(char *buf, int size) -{ - if (pmic_rtc_stop() < 0) - return -EFAULT; - - return size; -} - -static int debug_rtc_get_time(char *buf, int size) -{ - uint time; - struct rtc_time *hal; - - hal = (struct rtc_time *)&time; - if (pmic_rtc_get_time(hal) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", time); -} - -static int debug_rtc_alarm_ndx; - -int debug_rtc_enable_alarm(char *buf, int size) -{ - enum rtc_alarm alarm; - struct rtc_time *hal; - uint time; - int cnt; - - - cnt = sscanf(buf, "%u %u", &alarm, &time); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - hal = (struct rtc_time *)&time; - - if (pmic_rtc_enable_alarm(alarm, hal) < 0) - return -EFAULT; - - debug_rtc_alarm_ndx = alarm; - return size; -} - -static int debug_rtc_disable_alarm(char *buf, int size) -{ - - enum rtc_alarm alarm; - int cnt; - - cnt = sscanf(buf, "%u", &alarm); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_rtc_disable_alarm(alarm) < 0) - return -EFAULT; - - return size; -} - -static int debug_rtc_get_alarm_time(char *buf, int size) -{ - uint time; - struct rtc_time *hal; - - hal = (struct rtc_time *)&time; - if (pmic_rtc_get_alarm_time(debug_rtc_alarm_ndx, hal) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", time); -} -static int debug_rtc_get_alarm_status(char *buf, int size) -{ - int status;; - - if (pmic_rtc_get_alarm_status(&status) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", status); - -} - -static int debug_rtc_set_time_adjust(char *buf, int size) -{ - uint adjust; - int cnt; - - cnt = sscanf(buf, "%d", &adjust); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_rtc_set_time_adjust(adjust) < 0) - return -EFAULT; - - return size; -} - -static int debug_rtc_get_time_adjust(char *buf, int size) -{ - int adjust;; - - if (pmic_rtc_get_time_adjust(&adjust) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", adjust); -} - -static int debug_set_led_intensity(char *buf, int size) -{ - enum ledtype type; - int level; - int cnt; - - cnt = sscanf(buf, "%u %d", &type, &level); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_set_led_intensity(type, level) < 0) - return -EFAULT; - - return size; -} - -static int debug_flash_led_set_current(char *buf, int size) -{ - int milliamps; - int cnt; - - cnt = sscanf(buf, "%d", &milliamps); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_flash_led_set_current(milliamps) < 0) - return -EFAULT; - - return size; -} -static int debug_flash_led_set_mode(char *buf, int size) -{ - - uint mode; - int cnt; - - cnt = sscanf(buf, "%d", &mode); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_flash_led_set_mode(mode) < 0) - return -EFAULT; - - return size; -} - -static int debug_flash_led_set_polarity(char *buf, int size) -{ - int pol; - int cnt; - - cnt = sscanf(buf, "%d", &pol); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_flash_led_set_polarity(pol) < 0) - return -EFAULT; - - return size; -} - -static int debug_speaker_cmd(char *buf, int size) -{ - int cmd; - int cnt; - - cnt = sscanf(buf, "%d", &cmd); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_speaker_cmd(cmd) < 0) - return -EFAULT; - - return size; -} -static int debug_set_speaker_gain(char *buf, int size) -{ - int gain; - int cnt; - - cnt = sscanf(buf, "%d", &gain); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_set_speaker_gain(gain) < 0) - return -EFAULT; - - return size; -} - -static int debug_mic_en(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_mic_en(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_mic_is_en(char *buf, int size) -{ - int enabled; - - if (pmic_mic_is_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_mic_set_volt(char *buf, int size) -{ - int vol; - int cnt; - - cnt = sscanf(buf, "%d", &vol); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_mic_set_volt(vol) < 0) - return -EFAULT; - - return size; -} - -static int debug_mic_get_volt(char *buf, int size) -{ - uint vol; - - if (pmic_mic_get_volt(&vol) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", vol); -} - -static int debug_spkr_en_right_chan(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_right_chan(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_is_right_chan_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_right_chan_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} -static int debug_spkr_en_left_chan(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_left_chan(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_is_left_chan_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_left_chan_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_set_spkr_configuration(char *buf, int size) -{ - - struct spkr_config_mode cfg; - int cnt; - - cnt = sscanf(buf, "%d %d %d %d %d %d %d %d", - &cfg.is_right_chan_en, - &cfg.is_left_chan_en, - &cfg.is_right_left_chan_added, - &cfg.is_stereo_en, - &cfg.is_usb_with_hpf_20hz, - &cfg.is_mux_bypassed, - &cfg.is_hpf_en, - &cfg.is_sink_curr_from_ref_volt_cir_en); - - if (cnt < 8) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - - if (pmic_set_spkr_configuration(&cfg) < 0) - return -EFAULT; - - return size; -} - -static int debug_get_spkr_configuration(char *buf, int size) -{ - struct spkr_config_mode cfg; - - if (pmic_get_spkr_configuration(&cfg) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d %d %d %d %d %d %d %d\n", - cfg.is_right_chan_en, - cfg.is_left_chan_en, - cfg.is_right_left_chan_added, - cfg.is_stereo_en, - cfg.is_usb_with_hpf_20hz, - cfg.is_mux_bypassed, - cfg.is_hpf_en, - cfg.is_sink_curr_from_ref_volt_cir_en); - -} - -static int debug_set_speaker_delay(char *buf, int size) -{ - int delay; - int cnt; - - cnt = sscanf(buf, "%d", &delay); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_set_speaker_delay(delay) < 0) - return -EFAULT; - - return size; -} - -static int debug_speaker_1k6_zin_enable(char *buf, int size) -{ - uint enable; - int cnt; - - cnt = sscanf(buf, "%u", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_speaker_1k6_zin_enable(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_set_mux_hpf_corner_freq(char *buf, int size) -{ - int freq; - int cnt; - - cnt = sscanf(buf, "%d", &freq); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_set_mux_hpf_corner_freq(freq) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_get_mux_hpf_corner_freq(char *buf, int size) -{ - uint freq; - - if (pmic_spkr_get_mux_hpf_corner_freq(&freq) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", freq); -} - -static int debug_spkr_add_right_left_chan(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_add_right_left_chan(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_is_right_left_chan_added(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_right_left_chan_added(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_en_stereo(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_stereo(enable) < 0) - return -EFAULT; - - return size; -} -static int debug_spkr_is_stereo_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_stereo_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_select_usb_with_hpf_20hz(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_select_usb_with_hpf_20hz(enable) < 0) - return -EFAULT; - - return size; -} -static int debug_spkr_is_usb_with_hpf_20hz(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_usb_with_hpf_20hz(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_bypass_mux(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_bypass_mux(enable) < 0) - return -EFAULT; - - return size; -} -static int debug_spkr_is_mux_bypassed(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_mux_bypassed(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_en_hpf(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_hpf(enable) < 0) - return -EFAULT; - - return size; -} -static int debug_spkr_is_hpf_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_hpf_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_en_sink_curr_from_ref_volt_cir(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_sink_curr_from_ref_volt_cir(enable) < 0) - return -EFAULT; - - return size; -} - -static int debug_spkr_is_sink_curr_from_ref_volt_cir_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_sink_curr_from_ref_volt_cir_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_vib_mot_set_volt(char *buf, int size) -{ - int vol; - int cnt; - - cnt = sscanf(buf, "%d", &vol); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_vib_mot_set_volt(vol) < 0) - return -EFAULT; - - return size; -} -static int debug_vib_mot_set_mode(char *buf, int size) -{ - int mode; - int cnt; - - cnt = sscanf(buf, "%d", &mode); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_vib_mot_set_mode(mode) < 0) - return -EFAULT; - - return size; -} - -static int debug_vib_mot_set_polarity(char *buf, int size) -{ - int pol; - int cnt; - - cnt = sscanf(buf, "%d", &pol); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_vib_mot_set_polarity(pol) < 0) - return -EFAULT; - - return size; -} -static int debug_vid_en(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_vid_en(enable) < 0) - return -EFAULT; - - return size; -} -static int debug_vid_is_en(char *buf, int size) -{ - int enabled; - - if (pmic_vid_is_en(&enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_vid_load_detect_en(char *buf, int size) -{ - int enable; - int cnt; - - cnt = sscanf(buf, "%d", &enable); - if (cnt < 1) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_vid_load_detect_en(enable) < 0) - return -EFAULT; - - return size; -} - -/************************************************** - * speaker indexed by left_right -**************************************************/ -static enum spkr_left_right debug_spkr_left_right = LEFT_SPKR; - -static int debug_spkr_en(char *buf, int size) -{ - int left_right; - int enable; - int cnt; - - cnt = sscanf(buf, "%d %d", &left_right, &enable); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en(left_right, enable) >= 0) { - debug_spkr_left_right = left_right; - return size; - } - return -EFAULT; -} - -static int debug_spkr_is_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_en(debug_spkr_left_right, &enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -static int debug_spkr_set_gain(char *buf, int size) -{ - int left_right; - int enable; - int cnt; - - cnt = sscanf(buf, "%d %d", &left_right, &enable); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_set_gain(left_right, enable) >= 0) { - debug_spkr_left_right = left_right; - return size; - } - return -EFAULT; -} - -static int debug_spkr_get_gain(char *buf, int size) -{ - uint gain; - - if (pmic_spkr_get_gain(debug_spkr_left_right, &gain) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", gain); -} -static int debug_spkr_set_delay(char *buf, int size) -{ - int left_right; - int delay; - int cnt; - - cnt = sscanf(buf, "%d %d", &left_right, &delay); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_set_delay(left_right, delay) >= 0) { - debug_spkr_left_right = left_right; - return size; - } - return -EFAULT; -} - -static int debug_spkr_get_delay(char *buf, int size) -{ - uint delay; - - if (pmic_spkr_get_delay(debug_spkr_left_right, &delay) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", delay); -} - -static int debug_spkr_en_mute(char *buf, int size) -{ - int left_right; - int enable; - int cnt; - - cnt = sscanf(buf, "%d %d", &left_right, &enable); - if (cnt < 2) { - printk(KERN_ERR "%s: sscanf failed cnt=%d" , __func__, cnt); - return -EINVAL; - } - if (pmic_spkr_en_mute(left_right, enable) >= 0) { - debug_spkr_left_right = left_right; - return size; - } - return -EFAULT; -} - -static int debug_spkr_is_mute_en(char *buf, int size) -{ - int enabled; - - if (pmic_spkr_is_mute_en(debug_spkr_left_right, &enabled) < 0) - return -EFAULT; - - return snprintf(buf, size, "%d\n", enabled); -} - -/******************************************************************* - * debug function table -*******************************************************************/ - -struct pmic_debug_desc { - int (*get) (char *, int); - int (*set) (char *, int); -}; - -struct pmic_debug_desc pmic_debug[] = { - {NULL, NULL}, /*LIB_NULL_PROC */ - {NULL, NULL}, /* LIB_RPC_GLUE_CODE_INFO_REMOTE_PROC */ - {NULL, debug_lp_mode_control}, /* LP_MODE_CONTROL_PROC */ - {NULL, debug_vreg_set_level}, /*VREG_SET_LEVEL_PROC */ - {NULL, debug_vreg_pull_down_switch}, /*VREG_PULL_DOWN_SWITCH_PROC */ - {NULL, debug_secure_mpp_control_digital_output}, - /* SECURE_MPP_CONFIG_DIGITAL_OUTPUT_PROC */ - /*SECURE_MPP_CONFIG_I_SINK_PROC */ - {NULL, debug_secure_mpp_config_i_sink}, - {NULL, debug_rtc_start}, /*RTC_START_PROC */ - {NULL, debug_rtc_stop}, /* RTC_STOP_PROC */ - {debug_rtc_get_time, NULL}, /* RTC_GET_TIME_PROC */ - {NULL, debug_rtc_enable_alarm}, /* RTC_ENABLE_ALARM_PROC */ - {NULL , debug_rtc_disable_alarm}, /*RTC_DISABLE_ALARM_PROC */ - {debug_rtc_get_alarm_time, NULL}, /* RTC_GET_ALARM_TIME_PROC */ - {debug_rtc_get_alarm_status, NULL}, /* RTC_GET_ALARM_STATUS_PROC */ - {NULL, debug_rtc_set_time_adjust}, /* RTC_SET_TIME_ADJUST_PROC */ - {debug_rtc_get_time_adjust, NULL}, /* RTC_GET_TIME_ADJUST_PROC */ - {NULL, debug_set_led_intensity}, /* SET_LED_INTENSITY_PROC */ - {NULL, debug_flash_led_set_current}, /* FLASH_LED_SET_CURRENT_PROC */ - {NULL, debug_flash_led_set_mode}, /* FLASH_LED_SET_MODE_PROC */ - {NULL, debug_flash_led_set_polarity}, /* FLASH_LED_SET_POLARITY_PROC */ - {NULL, debug_speaker_cmd}, /* SPEAKER_CMD_PROC */ - {NULL, debug_set_speaker_gain}, /* SET_SPEAKER_GAIN_PROC */ - {NULL, debug_vib_mot_set_volt}, /* VIB_MOT_SET_VOLT_PROC */ - {NULL, debug_vib_mot_set_mode}, /* VIB_MOT_SET_MODE_PROC */ - {NULL, debug_vib_mot_set_polarity}, /* VIB_MOT_SET_POLARITY_PROC */ - {NULL, debug_vid_en}, /* VID_EN_PROC */ - {debug_vid_is_en, NULL}, /* VID_IS_EN_PROC */ - {NULL, debug_vid_load_detect_en}, /* VID_LOAD_DETECT_EN_PROC */ - {NULL, debug_mic_en}, /* MIC_EN_PROC */ - {debug_mic_is_en, NULL}, /* MIC_IS_EN_PROC */ - {NULL, debug_mic_set_volt}, /* MIC_SET_VOLT_PROC */ - {debug_mic_get_volt, NULL}, /* MIC_GET_VOLT_PROC */ - {NULL, debug_spkr_en_right_chan}, /* SPKR_EN_RIGHT_CHAN_PROC */ - {debug_spkr_is_right_chan_en, NULL}, /* SPKR_IS_RIGHT_CHAN_EN_PROC */ - {NULL, debug_spkr_en_left_chan}, /* SPKR_EN_LEFT_CHAN_PROC */ - {debug_spkr_is_left_chan_en, NULL}, /* SPKR_IS_LEFT_CHAN_EN_PROC */ - {NULL, debug_set_spkr_configuration}, /* SET_SPKR_CONFIGURATION_PROC */ - {debug_get_spkr_configuration, NULL}, /* GET_SPKR_CONFIGURATION_PROC */ - {debug_spkr_get_gain, NULL}, /* SPKR_GET_GAIN_PROC */ - {debug_spkr_is_en, NULL}, /* SPKR_IS_EN_PROC */ - {NULL, debug_spkr_en_mute}, /* SPKR_EN_MUTE_PROC */ - {debug_spkr_is_mute_en, NULL}, /* SPKR_IS_MUTE_EN_PROC */ - {NULL, debug_spkr_set_delay}, /* SPKR_SET_DELAY_PROC */ - {debug_spkr_get_delay, NULL}, /* SPKR_GET_DELAY_PROC */ - /* SECURE_MPP_CONFIG_DIGITAL_INPUT_PROC */ - {NULL, debug_secure_mpp_config_digital_input}, - {NULL, debug_set_speaker_delay}, /* SET_SPEAKER_DELAY_PROC */ - {NULL, debug_speaker_1k6_zin_enable}, /* SPEAKER_1K6_ZIN_ENABLE_PROC */ - /* SPKR_SET_MUX_HPF_CORNER_FREQ_PROC */ - {NULL, debug_spkr_set_mux_hpf_corner_freq}, - /* SPKR_GET_MUX_HPF_CORNER_FREQ_PROC */ - {debug_spkr_get_mux_hpf_corner_freq, NULL}, - /* SPKR_IS_RIGHT_LEFT_CHAN_ADDED_PROC */ - {debug_spkr_is_right_left_chan_added, NULL}, - {NULL, debug_spkr_en_stereo}, /* SPKR_EN_STEREO_PROC */ - {debug_spkr_is_stereo_en, NULL}, /* SPKR_IS_STEREO_EN_PROC */ - /* SPKR_SELECT_USB_WITH_HPF_20HZ_PROC */ - {NULL, debug_spkr_select_usb_with_hpf_20hz}, - /* SPKR_IS_USB_WITH_HPF_20HZ_PROC */ - {debug_spkr_is_usb_with_hpf_20hz, NULL}, - {NULL, debug_spkr_bypass_mux}, /* SPKR_BYPASS_MUX_PROC */ - {debug_spkr_is_mux_bypassed, NULL}, /* SPKR_IS_MUX_BYPASSED_PROC */ - {NULL, debug_spkr_en_hpf}, /* SPKR_EN_HPF_PROC */ - { debug_spkr_is_hpf_en, NULL}, /* SPKR_IS_HPF_EN_PROC */ - /* SPKR_EN_SINK_CURR_FROM_REF_VOLT_CIR_PROC */ - {NULL, debug_spkr_en_sink_curr_from_ref_volt_cir}, - /* SPKR_IS_SINK_CURR_FROM_REF_VOLT_CIR_EN_PROC */ - {debug_spkr_is_sink_curr_from_ref_volt_cir_en, NULL}, - /* SPKR_ADD_RIGHT_LEFT_CHAN_PROC */ - {NULL, debug_spkr_add_right_left_chan}, - {NULL, debug_spkr_set_gain}, /* SPKR_SET_GAIN_PROC */ - {NULL , debug_spkr_en}, /* SPKR_EN_PROC */ -}; - -/***********************************************************************/ - -#define PROC_END (sizeof(pmic_debug)/sizeof(struct pmic_debug_desc)) - - -#define PMIC_DEBUG_BUF 512 - -static int debug_proc; /* PROC's index */ - -static char debug_buf[PMIC_DEBUG_BUF]; - -static int proc_index_set(void *data, u64 val) -{ - int ndx; - - ndx = (int)val; - - if (ndx >= 0 && ndx <= PROC_END) - debug_proc = ndx; - - return 0; -} - -static int proc_index_get(void *data, u64 *val) -{ - *val = (u64)debug_proc; - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE( - proc_index_fops, - proc_index_get, - proc_index_set, - "%llu\n"); - - -static int pmic_debugfs_open(struct inode *inode, struct file *file) -{ - /* non-seekable */ - file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE); - return 0; -} - -static int pmic_debugfs_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static ssize_t pmic_debugfs_write( - struct file *file, - const char __user *buff, - size_t count, - loff_t *ppos) -{ - struct pmic_debug_desc *pd; - int len = 0; - - printk(KERN_INFO "%s: proc=%d count=%d *ppos=%d\n", - __func__, debug_proc, count, (uint)*ppos); - - if (count > sizeof(debug_buf)) - return -EFAULT; - - if (copy_from_user(debug_buf, buff, count)) - return -EFAULT; - - - debug_buf[count] = 0; /* end of string */ - - pd = &pmic_debug[debug_proc]; - - if (pd->set) { - len = pd->set(debug_buf, count); - printk(KERN_INFO "%s: len=%d\n", __func__, len); - return len; - } - - return 0; -} - -static ssize_t pmic_debugfs_read( - struct file *file, - char __user *buff, - size_t count, - loff_t *ppos) -{ - struct pmic_debug_desc *pd; - int len = 0; - - printk(KERN_INFO "%s: proc=%d count=%d *ppos=%d\n", - __func__, debug_proc, count, (uint)*ppos); - - pd = &pmic_debug[debug_proc]; - - if (*ppos) - return 0; /* the end */ - - if (pd->get) { - len = pd->get(debug_buf, sizeof(debug_buf)); - if (len > 0) { - if (len > count) - len = count; - if (copy_to_user(buff, debug_buf, len)) - return -EFAULT; - } - } - - printk(KERN_INFO "%s: len=%d\n", __func__, len); - - if (len < 0) - return 0; - - *ppos += len; /* increase offset */ - - return len; -} - -static const struct file_operations pmic_debugfs_fops = { - .open = pmic_debugfs_open, - .release = pmic_debugfs_release, - .read = pmic_debugfs_read, - .write = pmic_debugfs_write, -}; - -static int __init pmic_debugfs_init(void) -{ - struct dentry *dent = debugfs_create_dir("pmic", NULL); - - if (IS_ERR(dent)) { - printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n", - __FILE__, __LINE__, PTR_ERR(dent)); - return -1; - } - - if (debugfs_create_file("index", 0644, dent, 0, &proc_index_fops) - == NULL) { - printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n", - __FILE__, __LINE__); - return -1; - } - - if (debugfs_create_file("debug", 0644, dent, 0, &pmic_debugfs_fops) - == NULL) { - printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n", - __FILE__, __LINE__); - return -1; - } - - debug_proc = 0; - debug_rtc_alarm_ndx = 0; - - return 0; -} - -late_initcall(pmic_debugfs_init); diff --git a/arch/arm/mach-msm/pmu.c b/arch/arm/mach-msm/pmu.c deleted file mode 100644 index 157861913a1b..000000000000 --- a/arch/arm/mach-msm/pmu.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -static struct resource cpu_pmu_resource[] = { - { - .start = INT_ARMQC_PERFMON, - .end = INT_ARMQC_PERFMON, - .flags = IORESOURCE_IRQ, - }, -}; - -#ifdef CONFIG_CPU_HAS_L2_PMU -static struct resource l2_pmu_resource[] = { - { - .start = SC_SICL2PERFMONIRPTREQ, - .end = SC_SICL2PERFMONIRPTREQ, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device l2_pmu_device = { - .name = "l2-pmu", - .id = ARM_PMU_DEVICE_L2CC, - .resource = l2_pmu_resource, - .num_resources = ARRAY_SIZE(l2_pmu_resource), -}; - -#endif - -static struct platform_device cpu_pmu_device = { - .name = "cpu-pmu", - .id = ARM_PMU_DEVICE_CPU, - .resource = cpu_pmu_resource, - .num_resources = ARRAY_SIZE(cpu_pmu_resource), -}; - -static struct platform_device *pmu_devices[] = { - &cpu_pmu_device, -#ifdef CONFIG_CPU_HAS_L2_PMU - &l2_pmu_device, -#endif -}; - -static int __init msm_pmu_init(void) -{ - return platform_add_devices(pmu_devices, ARRAY_SIZE(pmu_devices)); -} - -arch_initcall(msm_pmu_init); diff --git a/arch/arm/mach-msm/proc_comm.c b/arch/arm/mach-msm/proc_comm.c deleted file mode 100644 index c7705e786934..000000000000 --- a/arch/arm/mach-msm/proc_comm.c +++ /dev/null @@ -1,158 +0,0 @@ -/* arch/arm/mach-msm/proc_comm.c - * - * Copyright (C) 2007-2008 Google, Inc. - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "smd_private.h" - -static inline void notify_other_proc_comm(void) -{ - /* Make sure the write completes before interrupt */ - wmb(); -#if defined(CONFIG_ARCH_MSM7X30) - __raw_writel(1 << 6, MSM_APCS_GCC_BASE + 0x8); -#elif defined(CONFIG_ARCH_MSM8X60) - __raw_writel(1 << 5, MSM_GCC_BASE + 0x8); -#else - __raw_writel(1, MSM_CSR_BASE + 0x400 + (6) * 4); -#endif -} - -#define APP_COMMAND 0x00 -#define APP_STATUS 0x04 -#define APP_DATA1 0x08 -#define APP_DATA2 0x0C - -#define MDM_COMMAND 0x10 -#define MDM_STATUS 0x14 -#define MDM_DATA1 0x18 -#define MDM_DATA2 0x1C - -static DEFINE_SPINLOCK(proc_comm_lock); -static int msm_proc_comm_disable; - -/* Poll for a state change, checking for possible - * modem crashes along the way (so we don't wait - * forever while the ARM9 is blowing up. - * - * Return an error in the event of a modem crash and - * restart so the msm_proc_comm() routine can restart - * the operation from the beginning. - */ -static int proc_comm_wait_for(unsigned addr, unsigned value) -{ - while (1) { - /* Barrier here prevents excessive spinning */ - mb(); - if (readl_relaxed(addr) == value) - return 0; - - if (smsm_check_for_modem_crash()) - return -EAGAIN; - - udelay(5); - } -} - -void msm_proc_comm_reset_modem_now(void) -{ - unsigned base = (unsigned)MSM_SHARED_RAM_BASE; - unsigned long flags; - - spin_lock_irqsave(&proc_comm_lock, flags); - -again: - if (proc_comm_wait_for(base + MDM_STATUS, PCOM_READY)) - goto again; - - writel_relaxed(PCOM_RESET_MODEM, base + APP_COMMAND); - writel_relaxed(0, base + APP_DATA1); - writel_relaxed(0, base + APP_DATA2); - - spin_unlock_irqrestore(&proc_comm_lock, flags); - - /* Make sure the writes complete before notifying the other side */ - wmb(); - notify_other_proc_comm(); - - return; -} -EXPORT_SYMBOL(msm_proc_comm_reset_modem_now); - -int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2) -{ - unsigned base = (unsigned)MSM_SHARED_RAM_BASE; - unsigned long flags; - int ret; - - spin_lock_irqsave(&proc_comm_lock, flags); - - if (msm_proc_comm_disable) { - ret = -EIO; - goto end; - } - - -again: - if (proc_comm_wait_for(base + MDM_STATUS, PCOM_READY)) - goto again; - - writel_relaxed(cmd, base + APP_COMMAND); - writel_relaxed(data1 ? *data1 : 0, base + APP_DATA1); - writel_relaxed(data2 ? *data2 : 0, base + APP_DATA2); - - /* Make sure the writes complete before notifying the other side */ - wmb(); - notify_other_proc_comm(); - - if (proc_comm_wait_for(base + APP_COMMAND, PCOM_CMD_DONE)) - goto again; - - if (readl_relaxed(base + APP_STATUS) == PCOM_CMD_SUCCESS) { - if (data1) - *data1 = readl_relaxed(base + APP_DATA1); - if (data2) - *data2 = readl_relaxed(base + APP_DATA2); - ret = 0; - } else { - ret = -EIO; - } - - writel_relaxed(PCOM_CMD_IDLE, base + APP_COMMAND); - - switch (cmd) { - case PCOM_RESET_CHIP: - case PCOM_RESET_CHIP_IMM: - case PCOM_RESET_APPS: - msm_proc_comm_disable = 1; - printk(KERN_ERR "msm: proc_comm: proc comm disabled\n"); - break; - } -end: - /* Make sure the writes complete before returning */ - wmb(); - spin_unlock_irqrestore(&proc_comm_lock, flags); - return ret; -} -EXPORT_SYMBOL(msm_proc_comm); diff --git a/arch/arm/mach-msm/proc_comm_test.c b/arch/arm/mach-msm/proc_comm_test.c deleted file mode 100644 index 7593ff249d41..000000000000 --- a/arch/arm/mach-msm/proc_comm_test.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* - * PROC COMM TEST Driver source file - */ - -#include -#include -#include -#include -#include - -static struct dentry *dent; -static int proc_comm_test_res; - -static int proc_comm_reverse_test(void) -{ - uint32_t data1, data2; - int rc; - - data1 = 10; - data2 = 20; - - rc = msm_proc_comm(PCOM_OEM_TEST_CMD, &data1, &data2); - if (rc) - return rc; - - if ((data1 != 20) || (data2 != 10)) - return -1; - - return 0; -} - -static ssize_t debug_read(struct file *fp, char __user *buf, - size_t count, loff_t *pos) -{ - char _buf[16]; - - snprintf(_buf, sizeof(_buf), "%i\n", proc_comm_test_res); - - return simple_read_from_buffer(buf, count, pos, _buf, strlen(_buf)); -} - -static ssize_t debug_write(struct file *fp, const char __user *buf, - size_t count, loff_t *pos) -{ - - unsigned char cmd[64]; - int len; - - if (count < 1) - return 0; - - len = count > 63 ? 63 : count; - - if (copy_from_user(cmd, buf, len)) - return -EFAULT; - - cmd[len] = 0; - - if (cmd[len-1] == '\n') { - cmd[len-1] = 0; - len--; - } - - if (!strncmp(cmd, "reverse_test", 64)) - proc_comm_test_res = proc_comm_reverse_test(); - else - proc_comm_test_res = -EINVAL; - - if (proc_comm_test_res) - pr_err("proc comm test fail %d\n", - proc_comm_test_res); - else - pr_info("proc comm test passed\n"); - - return count; -} - -static int debug_release(struct inode *ip, struct file *fp) -{ - return 0; -} - -static int debug_open(struct inode *ip, struct file *fp) -{ - return 0; -} - -static const struct file_operations debug_ops = { - .owner = THIS_MODULE, - .open = debug_open, - .release = debug_release, - .read = debug_read, - .write = debug_write, -}; - -static void __exit proc_comm_test_mod_exit(void) -{ - debugfs_remove(dent); -} - -static int __init proc_comm_test_mod_init(void) -{ - dent = debugfs_create_file("proc_comm", 0444, 0, NULL, &debug_ops); - proc_comm_test_res = -1; - return 0; -} - -module_init(proc_comm_test_mod_init); -module_exit(proc_comm_test_mod_exit); - -MODULE_DESCRIPTION("PROC COMM TEST Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/proccomm-regulator.c b/arch/arm/mach-msm/proccomm-regulator.c deleted file mode 100644 index f2c7a6420ba2..000000000000 --- a/arch/arm/mach-msm/proccomm-regulator.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "proccomm-regulator.h" - -#define MV_TO_UV(mv) ((mv)*1000) -#define UV_TO_MV(uv) (((uv)+999)/1000) - -/* - * Wrappers for the msm_proc_comm() calls. - * Does basic impedance matching between what the proccomm interface - * expects and how the driver sees the world. - */ - -/* Converts a proccomm error to an errno value. */ -static int _pcom_err_to_linux_errno(unsigned error) -{ - if (!error) /* 0 == no error */ - return 0; - else if (error & 0x1F) /* bits 0..4 => parameter 1..5 out of range */ - return -EDOM; - else if (error & 0x100) /* bit 8 => feature not supported */ - return -ENOSYS; - else /* anything else non-zero: unknown error */ - return -EINVAL; -} - -/* vreg_switch: (vreg ID, on/off) => (return code, ) */ -static int _vreg_switch(int vreg_id, bool enable) -{ - unsigned _id = (unsigned)vreg_id; - unsigned _enable = !!enable; - - return msm_proc_comm(PCOM_VREG_SWITCH, &_id, &_enable); -} - -/* vreg_set_level: (vreg ID, mV) => (return code, ) */ -static int _vreg_set_level(int vreg_id, int level_mV) -{ - unsigned _id = (unsigned)vreg_id; - unsigned _level = (unsigned)level_mV; - int rc; - - rc = msm_proc_comm(PCOM_VREG_SET_LEVEL, &_id, &_level); - - if (rc) - return rc; - - return _pcom_err_to_linux_errno(_id); -} - -/* vreg_pull_down: (pull down, vreg ID) => (, ) */ -/* Returns error code from msm_proc_comm. */ -static int _vreg_pull_down(int vreg_id, bool pull_down) -{ - unsigned _id = (unsigned)vreg_id; - unsigned _enable = !!pull_down; - - return msm_proc_comm(PCOM_VREG_PULLDOWN, &_enable, &_id); -} - -struct proccomm_regulator_drvdata { - struct regulator_desc rdesc; - int rise_time; - int last_voltage; - bool enabled; - bool negative; -}; - -static int proccomm_vreg_enable(struct regulator_dev *rdev) -{ - struct proccomm_regulator_drvdata *ddata; - int rc; - - ddata = rdev_get_drvdata(rdev); - rc = _vreg_switch(rdev_get_id(rdev), VREG_SWITCH_ENABLE); - - if (rc) { - dev_err(rdev_get_dev(rdev), - "could not enable regulator %d (%s): %d\n", - rdev_get_id(rdev), ddata->rdesc.name, rc); - } else { - dev_dbg(rdev_get_dev(rdev), - "enabled regulator %d (%s)\n", - rdev_get_id(rdev), ddata->rdesc.name); - ddata->enabled = 1; - } - - return rc; -} - -static int proccomm_vreg_disable(struct regulator_dev *rdev) -{ - struct proccomm_regulator_drvdata *ddata; - int rc; - - ddata = rdev_get_drvdata(rdev); - rc = _vreg_switch(rdev_get_id(rdev), VREG_SWITCH_DISABLE); - - if (rc) { - dev_err(rdev_get_dev(rdev), - "could not disable regulator %d (%s): %d\n", - rdev_get_id(rdev), ddata->rdesc.name, rc); - } else { - dev_dbg(rdev_get_dev(rdev), - "disabled regulator %d (%s)\n", - rdev_get_id(rdev), ddata->rdesc.name); - ddata->enabled = 0; - } - - return rc; -} - -static int proccomm_vreg_is_enabled(struct regulator_dev *rdev) -{ - struct proccomm_regulator_drvdata *ddata = rdev_get_drvdata(rdev); - - return ddata->enabled; -} - -static int proccomm_vreg_rise_time(struct regulator_dev *rdev) -{ - struct proccomm_regulator_drvdata *ddata = rdev_get_drvdata(rdev); - - return ddata->rise_time; -} - -static int proccomm_vreg_get_voltage(struct regulator_dev *rdev) -{ - - struct proccomm_regulator_drvdata *ddata = rdev_get_drvdata(rdev); - - return MV_TO_UV(ddata->last_voltage); -} - -static int proccomm_vreg_set_voltage(struct regulator_dev *rdev, - int min_uV, int max_uV, unsigned *sel) -{ - struct proccomm_regulator_drvdata *ddata = rdev_get_drvdata(rdev); - int level_mV = UV_TO_MV(min_uV); - int rc; - - rc = _vreg_set_level(rdev_get_id(rdev), - ddata->negative ? -level_mV : level_mV); - - if (rc) { - dev_err(rdev_get_dev(rdev), - "could not set voltage for regulator %d (%s) " - "to %d mV: %d\n", - rdev_get_id(rdev), ddata->rdesc.name, level_mV, rc); - } else { - dev_dbg(rdev_get_dev(rdev), - "voltage for regulator %d (%s) set to %d mV\n", - rdev_get_id(rdev), ddata->rdesc.name, level_mV); - ddata->last_voltage = level_mV; - } - - return rc; -} - -static struct regulator_ops proccomm_regulator_ops = { - .enable = proccomm_vreg_enable, - .disable = proccomm_vreg_disable, - .is_enabled = proccomm_vreg_is_enabled, - .get_voltage = proccomm_vreg_get_voltage, - .set_voltage = proccomm_vreg_set_voltage, - .enable_time = proccomm_vreg_rise_time, -}; - -/* - * Create and register a struct regulator_dev based on the information in - * a struct proccomm_regulator_info. - * Fills in the rdev field in struct proccomm_regulator_info. - */ -static struct regulator_dev *create_proccomm_rdev( - struct proccomm_regulator_info *info, struct device *parent) -{ - const char *name; - struct proccomm_regulator_drvdata *d; - struct regulator_dev *rdev; - int rc = 0; - - if (info->id < 0) { - dev_err(parent, "invalid regulator id %d\n", info->id); - rc = -EINVAL; - goto out; - } - - name = info->init_data.constraints.name; - - if (!name) { - dev_err(parent, - "could not register regulator with id %d: " - "no name specified\n", info->id); - rc = -EINVAL; - goto out; - } - - if (info->pulldown > 0) { - rc = _vreg_pull_down(info->id, info->pulldown); - if (rc) { - dev_err(parent, - "probing for regulator %d (%s) failed\n", - info->id, name); - goto out; - } - } - - d = kzalloc(sizeof(*d), GFP_KERNEL); - - if (!d) { - dev_err(parent, - "could not allocate struct proccomm_regulator_drvdata " - "for regulator %d (%s)\n", info->id, name); - rc = -ENOMEM; - goto out; - } - - d->rdesc.name = name; - d->rdesc.id = info->id; - d->rdesc.ops = &proccomm_regulator_ops; - d->rdesc.type = REGULATOR_VOLTAGE; - d->rdesc.owner = THIS_MODULE; - d->rise_time = info->rise_time; - d->enabled = 0; - d->negative = info->negative; - d->rdesc.n_voltages = info->n_voltages; - - rdev = regulator_register(&d->rdesc, parent, &info->init_data, d, NULL); - - if (IS_ERR(rdev)) { - rc = PTR_ERR(rdev); - dev_err(parent, "error registering regulator %d (%s): %d\n", - info->id, name, rc); - goto clean; - } - - dev_dbg(parent, "registered regulator %d (%s)\n", info->id, name); - - return rdev; - -clean: - kfree(d); -out: - return ERR_PTR(rc); -} - -/* - * Unregister and destroy a struct regulator_dev created by - * create_proccomm_rdev. - */ -static void destroy_proccomm_rdev(struct regulator_dev *rdev) -{ - struct proccomm_regulator_drvdata *d; - - if (!rdev) - return; - - d = rdev_get_drvdata(rdev); - - regulator_unregister(rdev); - - dev_dbg(rdev_get_dev(rdev)->parent, - "unregistered regulator %d (%s)\n", - d->rdesc.id, d->rdesc.name); - - kfree(d); -} - - -static int proccomm_vreg_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct proccomm_regulator_platform_data *pdata = dev->platform_data; - struct regulator_dev **rdevs; - int rc = 0; - size_t i = 0; - - if (!pdata) { - dev_err(dev, "invalid platform data\n"); - rc = -EINVAL; - goto check_fail; - } - - if (pdata->nregs == 0) { - dev_err(dev, "registering an empty regulator list; " - "this is probably not what you want\n"); - rc = -EINVAL; - goto check_fail; - } - - rdevs = kcalloc(pdata->nregs, sizeof(*rdevs), GFP_KERNEL); - - if (!rdevs) { - dev_err(dev, "could not allocate storage for " - "struct regulator_dev array\n"); - rc = -ENOMEM; - goto check_fail; - } - - platform_set_drvdata(pdev, rdevs); - - dev_dbg(dev, "registering %d proccomm regulators\n", pdata->nregs); - - for (i = 0; i < pdata->nregs; i++) { - rdevs[i] = create_proccomm_rdev(&pdata->regs[i], dev); - if (IS_ERR(rdevs[i])) { - rc = PTR_ERR(rdevs[i]); - goto backout; - } - } - - dev_dbg(dev, "%d proccomm regulators registered\n", pdata->nregs); - - return rc; - -backout: - while (--i >= 0) - destroy_proccomm_rdev(rdevs[i]); - - kfree(rdevs); - -check_fail: - return rc; -} - -static int proccomm_vreg_remove(struct platform_device *pdev) -{ - struct proccomm_regulator_platform_data *pdata; - struct regulator_dev **rdevs; - size_t i; - - pdata = pdev->dev.platform_data; - rdevs = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->nregs; i++) - destroy_proccomm_rdev(rdevs[i]); - - kfree(rdevs); - - return 0; -} - -static struct platform_driver proccomm_vreg_driver = { - .probe = proccomm_vreg_probe, - .remove = proccomm_vreg_remove, - .driver = { - .name = PROCCOMM_REGULATOR_DEV_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init proccomm_vreg_init(void) -{ - return platform_driver_register(&proccomm_vreg_driver); -} -postcore_initcall(proccomm_vreg_init); - -static void __exit proccomm_vreg_exit(void) -{ - platform_driver_unregister(&proccomm_vreg_driver); -} -module_exit(proccomm_vreg_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("ProcComm regulator driver"); -MODULE_VERSION("1.0"); -MODULE_ALIAS("platform:" PROCCOMM_REGULATOR_DEV_NAME); diff --git a/arch/arm/mach-msm/proccomm-regulator.h b/arch/arm/mach-msm/proccomm-regulator.h deleted file mode 100644 index 8a08e3e35c56..000000000000 --- a/arch/arm/mach-msm/proccomm-regulator.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ARCH_ARM_MACH_MSM_PROCCOMM_REGULATOR_H__ -#define __ARCH_ARM_MACH_MSM_PROCCOMM_REGULATOR_H__ - -#include - -#define PROCCOMM_REGULATOR_DEV_NAME "proccomm-regulator" - -/** - * struct proccomm_regulator_info - A description of one proccomm regulator - * @init_data: Initialization data for the regulator. - * Must contain: - * - A list of struct regulator_consumer_supply indicating - * supply names for the regulator - * - A filled out struct regulation_constraints containing: - * - The name of the regulator - * - The minimum and maximum voltages supported - * - The supported modes (REGULATOR_MODE_NORMAL) - * - The supported operations, currently limited to: - * REGULATOR_CHANGE_STATUS - * REGULATOR_CHANGE_VOLTAGE - * - The input voltage, if the regulator is powered by another - * - Properly set always_on, boot_on, and apply_uV flags - * - The name of the supply regulator, if applicable - * @id: The proccomm ID of this regulator. - * @rise_time: The time that the regulator takes to initialize, - * in microseconds. Set to 0 to disable rise-time checking. - * @pulldown: Whether the regulator should be pulled down when off. - * 1 to pull down the regulator. - * 0 to leave the regulator floating. - * -1 to indicate no preference. - */ -struct proccomm_regulator_info { - struct regulator_init_data init_data; - int id; - int rise_time; - int pulldown; - int negative; - int n_voltages; -}; - -/** - * struct proccomm_regulator_platform_data - proccomm driver platform data. - * - * Contains a description of a set of proccomm-controlled regulators. - * Pass this in the platform_data field when instantiating the driver. - * - * @regs: An array of struct proccomm_regulator_info describing - * the regulators to register. - * @nregs: The number of regulators to register. - */ -struct proccomm_regulator_platform_data { - struct proccomm_regulator_info *regs; - size_t nregs; -}; - -#if defined(CONFIG_MSM_VREG_SWITCH_INVERTED) -#define VREG_SWITCH_ENABLE 0 -#define VREG_SWITCH_DISABLE 1 -#else -#define VREG_SWITCH_ENABLE 1 -#define VREG_SWITCH_DISABLE 0 -#endif - -#endif diff --git a/arch/arm/mach-msm/qdsp5/Makefile b/arch/arm/mach-msm/qdsp5/Makefile deleted file mode 100644 index f4fe052c5508..000000000000 --- a/arch/arm/mach-msm/qdsp5/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -obj-y += adsp.o adsp_driver.o adsp_info.o adsp_rm.o dsp_debug.o adsp_debug.o -obj-y += adsp_video_verify_cmd.o -obj-y += adsp_videoenc_verify_cmd.o -obj-y += adsp_jpeg_verify_cmd.o adsp_jpeg_patch_event.o -obj-y += adsp_vfe_verify_cmd.o adsp_vfe_patch_event.o -obj-y += adsp_lpm_verify_cmd.o -ifdef CONFIG_MSM7X27A_AUDIO -obj-y += audio_pcm_in.o -obj-$(CONFIG_DEBUG_FS) += audio_voice_lb.o -else -obj-y += audio_in.o snd_pcm_client.o -endif -obj-$(CONFIG_MSM7X27A_AUDIO) += audio_aac_in.o audio_evrc_in.o audio_qcelp_in.o -obj-y += audio_out.o audio_mp3.o audmgr.o audpp.o audrec.o audpreproc.o -obj-y += audio_evrc.o audio_qcelp.o audio_amrnb.o audio_aac.o audio_amrnb_in.o -obj-y += audio_wma.o audio_voicememo.o audio_pcm.o audio_amrwb.o audio_wmapro.o -obj-y += snd.o snd_cad.o snd_adie.o audio_acdb.o -obj-$(CONFIG_ARCH_MSM7X27A) += audio_fm.o -obj-$(CONFIG_ARCH_MSM7X27A) += audio_mvs.o -obj-$(CONFIG_ARCH_MSM7X27A) += audio_lpa.o audio_ac3.o diff --git a/arch/arm/mach-msm/qdsp5/adsp.c b/arch/arm/mach-msm/qdsp5/adsp.c deleted file mode 100644 index 353de3df94a6..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp.c +++ /dev/null @@ -1,1509 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp.c - * - * Register/Interrupt access for userspace aDSP library. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* TODO: - * - move shareable rpc code outside of adsp.c - * - general solution for virt->phys patchup - * - queue IDs should be relative to modules - * - disallow access to non-associated queues - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_DEBUG_FS -static struct dentry *dentry_adsp; -static struct dentry *dentry_wdata; -static struct dentry *dentry_rdata; -static int wdump, rdump; -#endif /* CONFIG_DEBUG_FS */ -static struct wake_lock adsp_wake_lock; -static inline void prevent_suspend(void) -{ - wake_lock(&adsp_wake_lock); -} -static inline void allow_suspend(void) -{ - wake_unlock(&adsp_wake_lock); -} - -#include -#include -#include -#include "adsp.h" - -static struct adsp_info adsp_info; -static struct msm_rpc_endpoint *rpc_cb_server_client; -static struct msm_adsp_module *adsp_modules; -static int adsp_open_count; - -static uint32_t rpc_adsp_rtos_atom_prog; -static uint32_t rpc_adsp_rtos_atom_vers; -static uint32_t rpc_adsp_rtos_atom_vers_comp; -static uint32_t rpc_adsp_rtos_mtoa_prog; -static uint32_t rpc_adsp_rtos_mtoa_vers; -static uint32_t rpc_adsp_rtos_mtoa_vers_comp; -static DEFINE_MUTEX(adsp_open_lock); - -static struct workqueue_struct *msm_adsp_probe_work_queue; -static void adsp_probe_work(struct work_struct *work); -static DECLARE_WORK(msm_adsp_probe_work, adsp_probe_work); - -/* protect interactions with the ADSP command/message queue */ -static spinlock_t adsp_cmd_lock; -static spinlock_t adsp_write_lock; - -static uint32_t current_image = -1; - -void adsp_set_image(struct adsp_info *info, uint32_t image) -{ - current_image = image; -} - -/* - * Checks whether the module_id is available in the - * module_entries table.If module_id is available returns `0`. - * If module_id is not available returns `-ENXIO`. - */ -static int32_t adsp_validate_module(uint32_t module_id) -{ - uint32_t *ptr; - uint32_t module_index; - uint32_t num_mod_entries; - - ptr = adsp_info.init_info_ptr->module_entries; - num_mod_entries = adsp_info.init_info_ptr->module_table_size; - - for (module_index = 0; module_index < num_mod_entries; module_index++) - if (module_id == ptr[module_index]) - return 0; - - return -ENXIO; -} - -static int32_t adsp_validate_queue(uint32_t mod_id, unsigned q_idx, - uint32_t size) -{ - int32_t i; - struct adsp_rtos_mp_mtoa_init_info_type *sptr; - - sptr = adsp_info.init_info_ptr; - for (i = 0; i < sptr->mod_to_q_entries; i++) - if (mod_id == sptr->mod_to_q_tbl[i].module) - if (q_idx == sptr->mod_to_q_tbl[i].q_type) { - if (size <= sptr->mod_to_q_tbl[i].q_max_len) - return 0; - MM_ERR("q_idx: %d is not a valid queue \ - for module %x\n", q_idx, mod_id); - return -EINVAL; - } - MM_ERR("cmd_buf size is more than allowed size\n"); - return -EINVAL; -} - -uint32_t adsp_get_module(struct adsp_info *info, uint32_t task) -{ - return info->task_to_module[current_image][task]; -} - -uint32_t adsp_get_queue_offset(struct adsp_info *info, uint32_t queue_id) -{ - return info->queue_offset[current_image][queue_id]; -} - -static int rpc_adsp_rtos_app_to_modem(uint32_t cmd, uint32_t module, - struct msm_adsp_module *adsp_module) -{ - int rc; - struct rpc_adsp_rtos_app_to_modem_args_t rpc_req; - struct rpc_reply_hdr rpc_rsp; - - rpc_req.gotit = cpu_to_be32(1); - rpc_req.cmd = cpu_to_be32(cmd); - rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS); - rpc_req.module = cpu_to_be32(module); - rc = msm_rpc_call_reply(adsp_module->rpc_client, - RPC_ADSP_RTOS_APP_TO_MODEM_PROC, - &rpc_req, sizeof(rpc_req), - &rpc_rsp, sizeof(rpc_rsp), - 5 * HZ); - - if (rc < 0) { - MM_ERR("error receiving RPC reply: %d (%d)\n", - rc, -ERESTARTSYS); - return rc; - } - - if (be32_to_cpu(rpc_rsp.reply_stat) != RPCMSG_REPLYSTAT_ACCEPTED) { - MM_ERR("RPC call was denied!\n"); - return -EPERM; - } - - if (be32_to_cpu(rpc_rsp.data.acc_hdr.accept_stat) != - RPC_ACCEPTSTAT_SUCCESS) { - MM_ERR("RPC call was not successful (%d)\n", - be32_to_cpu(rpc_rsp.data.acc_hdr.accept_stat)); - return -EINVAL; - } - - return 0; -} - -static int get_module_index(uint32_t id) -{ - int mod_idx; - for (mod_idx = 0; mod_idx < adsp_info.module_count; mod_idx++) - if (adsp_info.module[mod_idx].id == id) - return mod_idx; - - return -ENXIO; -} - -static struct msm_adsp_module *find_adsp_module_by_id( - struct adsp_info *info, uint32_t id) -{ - int mod_idx; - - if (id > info->max_module_id) { - return NULL; - } else { - mod_idx = get_module_index(id); - if (mod_idx < 0) - return NULL; - return info->id_to_module[mod_idx]; - } -} - -static struct msm_adsp_module *find_adsp_module_by_name( - struct adsp_info *info, const char *name) -{ - unsigned n; - for (n = 0; n < info->module_count; n++) - if (!strcmp(name, adsp_modules[n].name)) - return adsp_modules + n; - return NULL; -} - -static int adsp_rpc_init(struct msm_adsp_module *adsp_module) -{ - /* remove the original connect once compatible support is complete */ - adsp_module->rpc_client = msm_rpc_connect( - rpc_adsp_rtos_atom_prog, - rpc_adsp_rtos_atom_vers, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(adsp_module->rpc_client)) - adsp_module->rpc_client = msm_rpc_connect_compatible( - rpc_adsp_rtos_atom_prog, - rpc_adsp_rtos_atom_vers_comp, - MSM_RPC_UNINTERRUPTIBLE); - - if (IS_ERR(adsp_module->rpc_client)) { - int rc = PTR_ERR(adsp_module->rpc_client); - adsp_module->rpc_client = 0; - MM_ERR("could not open rpc client: %d\n", rc); - return rc; - } - - return 0; -} - -/* - * Send RPC_ADSP_RTOS_CMD_GET_INIT_INFO cmd to ARM9 and get - * queue offsets and module entries (init info) as part of the event. - */ -static void msm_get_init_info(void) -{ - int rc; - struct rpc_adsp_rtos_app_to_modem_args_t rpc_req; - struct rpc_reply_hdr rpc_rsp; - - adsp_info.init_info_rpc_client = msm_rpc_connect( - rpc_adsp_rtos_atom_prog, - rpc_adsp_rtos_atom_vers, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(adsp_info.init_info_rpc_client)) { - adsp_info.init_info_rpc_client = msm_rpc_connect_compatible( - rpc_adsp_rtos_atom_prog, - rpc_adsp_rtos_atom_vers_comp, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(adsp_info.init_info_rpc_client)) { - rc = PTR_ERR(adsp_info.init_info_rpc_client); - adsp_info.init_info_rpc_client = 0; - MM_ERR("could not open rpc client: %d\n", rc); - return; - } - } - - rpc_req.gotit = cpu_to_be32(1); - rpc_req.cmd = cpu_to_be32(RPC_ADSP_RTOS_CMD_GET_INIT_INFO); - rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS); - rpc_req.module = 0; - - rc = msm_rpc_call_reply(adsp_info.init_info_rpc_client, - RPC_ADSP_RTOS_APP_TO_MODEM_PROC, - &rpc_req, sizeof(rpc_req), - &rpc_rsp, sizeof(rpc_rsp), - 5 * HZ); - - if (rc < 0) - MM_ERR("could not send RPC request: %d\n", rc); -} - -int msm_adsp_get(const char *name, struct msm_adsp_module **out, - struct msm_adsp_ops *ops, void *driver_data) -{ - struct msm_adsp_module *module; - int rc = 0; - static uint32_t init_info_cmd_sent; - - mutex_lock(&adsp_info.lock); - if (!init_info_cmd_sent) { - init_waitqueue_head(&adsp_info.init_info_wait); - msm_get_init_info(); - rc = wait_event_timeout(adsp_info.init_info_wait, - adsp_info.init_info_state == ADSP_STATE_INIT_INFO, - 5 * HZ); - if (!rc) { - MM_ERR("INIT_INFO failed\n"); - mutex_unlock(&adsp_info.lock); - return -ETIMEDOUT; - - } - init_info_cmd_sent++; - } - mutex_unlock(&adsp_info.lock); - - module = find_adsp_module_by_name(&adsp_info, name); - if (!module) - return -ENODEV; - - mutex_lock(&module->lock); - MM_INFO("opening module %s\n", module->name); - - if (module->ops) { - rc = -EBUSY; - goto done; - } - - rc = adsp_rpc_init(module); - if (rc) - goto done; - - module->ops = ops; - module->driver_data = driver_data; - *out = module; - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_REGISTER_APP, - module->id, module); - if (rc) { - module->ops = NULL; - module->driver_data = NULL; - *out = NULL; - MM_ERR("REGISTER_APP failed\n"); - goto done; - } - - MM_DBG("module %s has been registered\n", module->name); - -done: - mutex_unlock(&module->lock); - return rc; -} -EXPORT_SYMBOL(msm_adsp_get); - -static int msm_adsp_disable_locked(struct msm_adsp_module *module); - -void msm_adsp_put(struct msm_adsp_module *module) -{ - unsigned long flags; - - mutex_lock(&module->lock); - if (module->ops) { - MM_INFO("closing module %s\n", module->name); - - /* lock to ensure a dsp event cannot be delivered - * during or after removal of the ops and driver_data - */ - spin_lock_irqsave(&adsp_cmd_lock, flags); - module->ops = NULL; - module->driver_data = NULL; - spin_unlock_irqrestore(&adsp_cmd_lock, flags); - - if (module->state != ADSP_STATE_DISABLED) { - MM_INFO("disabling module %s\n", module->name); - msm_adsp_disable_locked(module); - } - - msm_rpc_close(module->rpc_client); - module->rpc_client = 0; - } else { - MM_INFO("module %s is already closed\n", module->name); - } - mutex_unlock(&module->lock); -} -EXPORT_SYMBOL(msm_adsp_put); - -/* this should be common code with rpc_servers.c */ -static int rpc_send_accepted_void_reply(struct msm_rpc_endpoint *client, - uint32_t xid, uint32_t accept_status) -{ - int rc = 0; - uint8_t reply_buf[sizeof(struct rpc_reply_hdr)]; - struct rpc_reply_hdr *reply = (struct rpc_reply_hdr *)reply_buf; - - reply->xid = cpu_to_be32(xid); - reply->type = cpu_to_be32(1); /* reply */ - reply->reply_stat = cpu_to_be32(RPCMSG_REPLYSTAT_ACCEPTED); - - reply->data.acc_hdr.accept_stat = cpu_to_be32(accept_status); - reply->data.acc_hdr.verf_flavor = 0; - reply->data.acc_hdr.verf_length = 0; - - rc = msm_rpc_write(rpc_cb_server_client, reply_buf, sizeof(reply_buf)); - if (rc < 0) - MM_ERR("could not write RPC response: %d\n", rc); - return rc; -} - -int __msm_adsp_write(struct msm_adsp_module *module, unsigned dsp_queue_addr, - void *cmd_buf, size_t cmd_size) -{ - uint32_t ctrl_word; - uint32_t dsp_q_addr; - uint32_t dsp_addr; - uint32_t cmd_id = 0; - int cnt = 0; - int ret_status = 0; - unsigned long flags; - struct adsp_info *info; - - if (!module || !cmd_buf) { - MM_ERR("Called with NULL parameters\n"); - return -EINVAL; - } - info = module->info; - spin_lock_irqsave(&adsp_write_lock, flags); - - if (module->state != ADSP_STATE_ENABLED) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("module %s not enabled before write\n", module->name); - return -ENODEV; - } - if (adsp_validate_module(module->id)) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("module id validation failed %s %d\n", - module->name, module->id); - return -ENXIO; - } - if (dsp_queue_addr >= QDSP_MAX_NUM_QUEUES) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("Invalid Queue Index: %d\n", dsp_queue_addr); - return -ENXIO; - } - if (adsp_validate_queue(module->id, dsp_queue_addr, cmd_size)) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - return -EINVAL; - } - dsp_q_addr = adsp_get_queue_offset(info, dsp_queue_addr); - dsp_q_addr &= ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M; - - /* Poll until the ADSP is ready to accept a command. - * Wait for 100us, return error if it's not responding. - * If this returns an error, we need to disable ALL modules and - * then retry. - */ - while (((ctrl_word = readl(info->write_ctrl)) & - ADSP_RTOS_WRITE_CTRL_WORD_READY_M) != - ADSP_RTOS_WRITE_CTRL_WORD_READY_V) { - if (cnt > 50) { - MM_ERR("timeout waiting for DSP write ready\n"); - ret_status = -EIO; - goto fail; - } - MM_DBG("waiting for DSP write ready\n"); - udelay(2); - cnt++; - } - - /* Set the mutex bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V; - - /* Clear the command bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_CMD_M); - - /* Set the queue address bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M); - ctrl_word |= dsp_q_addr; - - writel(ctrl_word, info->write_ctrl); - - /* Generate an interrupt to the DSP. This notifies the DSP that - * we are about to send a command on this particular queue. The - * DSP will in response change its state. - */ - writel(1, info->send_irq); - - /* Poll until the adsp responds to the interrupt; this does not - * generate an interrupt from the adsp. This should happen within - * 5ms. - */ - cnt = 0; - while ((readl(info->write_ctrl) & - ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M) == - ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V) { - if (cnt > 2500) { - MM_ERR("timeout waiting for adsp ack\n"); - ret_status = -EIO; - goto fail; - } - udelay(2); - cnt++; - } - - /* Read the ctrl word */ - ctrl_word = readl(info->write_ctrl); - - if ((ctrl_word & ADSP_RTOS_WRITE_CTRL_WORD_STATUS_M) != - ADSP_RTOS_WRITE_CTRL_WORD_NO_ERR_V) { - ret_status = -EAGAIN; - goto fail; - } else { - /* No error */ - /* Get the DSP buffer address */ - dsp_addr = (ctrl_word & ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M) + - (uint32_t)MSM_AD5_BASE; - - if (dsp_addr < (uint32_t)(MSM_AD5_BASE + QDSP_RAMC_OFFSET)) { - uint16_t *buf_ptr = (uint16_t *) cmd_buf; - uint16_t *dsp_addr16 = (uint16_t *)dsp_addr; - cmd_size /= sizeof(uint16_t); - - /* Save the command ID */ - cmd_id = (uint32_t) buf_ptr[0]; - - /* Copy the command to DSP memory */ - cmd_size++; - while (--cmd_size) - *dsp_addr16++ = *buf_ptr++; - } else { - uint32_t *buf_ptr = (uint32_t *) cmd_buf; - uint32_t *dsp_addr32 = (uint32_t *)dsp_addr; - cmd_size /= sizeof(uint32_t); - - /* Save the command ID */ - cmd_id = buf_ptr[0]; - - cmd_size++; - while (--cmd_size) - *dsp_addr32++ = *buf_ptr++; - } - - /* Set the mutex bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V; - - /* Set the command bits to write done */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_CMD_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_DONE_V; - - /* Set the queue address bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M); - ctrl_word |= dsp_q_addr; - - writel(ctrl_word, info->write_ctrl); - - /* Generate an interrupt to the DSP. It does not respond with - * an interrupt, and we do not need to wait for it to - * acknowledge, because it will hold the mutex lock until it's - * ready to receive more commands again. - */ - writel(1, info->send_irq); - - module->num_commands++; - } /* Ctrl word status bits were 00, no error in the ctrl word */ - -fail: - spin_unlock_irqrestore(&adsp_write_lock, flags); - return ret_status; -} -EXPORT_SYMBOL(msm_adsp_write); - -int msm_adsp_write(struct msm_adsp_module *module, unsigned dsp_queue_addr, - void *cmd_buf, size_t cmd_size) -{ - int rc, retries = 0; -#ifdef CONFIG_DEBUG_FS - uint16_t *ptr; - int ii; - - if (wdump > 0) { - ptr = cmd_buf; - pr_info("A->D:%x\n", module->id); - pr_info("adsp: %x %d\n", dsp_queue_addr, cmd_size); - for (ii = 0; ii < cmd_size/2; ii++) - pr_info("%x ", ptr[ii]); - pr_info("\n"); - } -#endif /* CONFIG_DEBUG_FS */ - do { - rc = __msm_adsp_write(module, dsp_queue_addr, cmd_buf, - cmd_size); - if (rc == -EAGAIN) - udelay(10); - } while (rc == -EAGAIN && retries++ < 300); - if (retries > 50) - MM_ERR("adsp: %s command took %d attempts: rc %d\n", - module->name, retries, rc); - return rc; -} - -static void *event_addr; -static void read_event(void *buf, size_t len) -{ - uint32_t dptr[3]; - struct rpc_adsp_rtos_modem_to_app_args_t *sptr; - struct adsp_rtos_mp_mtoa_type *pkt_ptr; - - sptr = event_addr; - pkt_ptr = &sptr->mtoa_pkt.adsp_rtos_mp_mtoa_data.mp_mtoa_packet; - - dptr[0] = be32_to_cpu(sptr->mtoa_pkt.mp_mtoa_header.event); - dptr[1] = be32_to_cpu(pkt_ptr->module); - dptr[2] = be32_to_cpu(pkt_ptr->image); - - if (len > EVENT_LEN) - len = EVENT_LEN; - - memcpy(buf, dptr, len); -} - -static void handle_adsp_rtos_mtoa_app(struct rpc_request_hdr *req) -{ - struct rpc_adsp_rtos_modem_to_app_args_t *args = - (struct rpc_adsp_rtos_modem_to_app_args_t *)req; - uint32_t event; - uint32_t proc_id; - uint32_t module_id; - uint32_t image; - struct msm_adsp_module *module; - struct adsp_rtos_mp_mtoa_type *pkt_ptr; - struct queue_to_offset_type *qptr; - struct queue_to_offset_type *qtbl; - struct mod_to_queue_offsets *mqptr; - struct mod_to_queue_offsets *mqtbl; - uint32_t *mptr; - uint32_t *mtbl; - uint32_t q_idx; - uint32_t num_entries; - uint32_t entries_per_image; - struct adsp_rtos_mp_mtoa_init_info_type *iptr; - struct adsp_rtos_mp_mtoa_init_info_type *sptr; - int32_t i_no, e_idx; - - event = be32_to_cpu(args->mtoa_pkt.mp_mtoa_header.event); - proc_id = be32_to_cpu(args->mtoa_pkt.mp_mtoa_header.proc_id); - - if (event == RPC_ADSP_RTOS_INIT_INFO) { - MM_INFO("INIT_INFO Event\n"); - sptr = &args->mtoa_pkt.adsp_rtos_mp_mtoa_data.mp_mtoa_init_packet; - - iptr = adsp_info.init_info_ptr; - iptr->image_count = be32_to_cpu(sptr->image_count); - if (iptr->image_count > IMG_MAX) - iptr->image_count = IMG_MAX; - iptr->num_queue_offsets = be32_to_cpu(sptr->num_queue_offsets); - num_entries = iptr->num_queue_offsets; - if (num_entries > ENTRIES_MAX) { - num_entries = ENTRIES_MAX; - iptr->num_queue_offsets = ENTRIES_MAX; - } - qptr = &sptr->queue_offsets_tbl[0][0]; - for (i_no = 0; i_no < iptr->image_count; i_no++) { - qtbl = &iptr->queue_offsets_tbl[i_no][0]; - for (e_idx = 0; e_idx < num_entries; e_idx++) { - qtbl[e_idx].offset = be32_to_cpu(qptr->offset); - qtbl[e_idx].queue = be32_to_cpu(qptr->queue); - q_idx = be32_to_cpu(qptr->queue); - iptr->queue_offsets[i_no][q_idx] = qtbl[e_idx].offset; - qptr++; - } - } - - num_entries = be32_to_cpu(sptr->num_task_module_entries); - if (num_entries > ENTRIES_MAX) - num_entries = ENTRIES_MAX; - iptr->num_task_module_entries = num_entries; - entries_per_image = num_entries / iptr->image_count; - mptr = &sptr->task_to_module_tbl[0][0]; - for (i_no = 0; i_no < iptr->image_count; i_no++) { - mtbl = &iptr->task_to_module_tbl[i_no][0]; - for (e_idx = 0; e_idx < entries_per_image; e_idx++) { - mtbl[e_idx] = be32_to_cpu(*mptr); - mptr++; - } - } - - iptr->module_table_size = be32_to_cpu(sptr->module_table_size); -#if CONFIG_ADSP_RPC_VER > 0x30001 - if (iptr->module_table_size > MODULES_MAX) - iptr->module_table_size = MODULES_MAX; -#else - if (iptr->module_table_size > ENTRIES_MAX) - iptr->module_table_size = ENTRIES_MAX; -#endif - mptr = &sptr->module_entries[0]; - for (i_no = 0; i_no < iptr->module_table_size; i_no++) - iptr->module_entries[i_no] = be32_to_cpu(mptr[i_no]); - - mqptr = &sptr->mod_to_q_tbl[0]; - mqtbl = &iptr->mod_to_q_tbl[0]; - iptr->mod_to_q_entries = be32_to_cpu(sptr->mod_to_q_entries); - if (iptr->mod_to_q_entries > ENTRIES_MAX) - iptr->mod_to_q_entries = ENTRIES_MAX; - for (e_idx = 0; e_idx < iptr->mod_to_q_entries; e_idx++) { - mqtbl[e_idx].module = be32_to_cpu(mqptr->module); - mqtbl[e_idx].q_type = be32_to_cpu(mqptr->q_type); - mqtbl[e_idx].q_max_len = be32_to_cpu(mqptr->q_max_len); - mqptr++; - } - - adsp_info.init_info_state = ADSP_STATE_INIT_INFO; - rpc_send_accepted_void_reply(rpc_cb_server_client, req->xid, - RPC_ACCEPTSTAT_SUCCESS); - wake_up(&adsp_info.init_info_wait); - - return; - } - - pkt_ptr = &args->mtoa_pkt.adsp_rtos_mp_mtoa_data.mp_mtoa_packet; - module_id = be32_to_cpu(pkt_ptr->module); - image = be32_to_cpu(pkt_ptr->image); - - MM_DBG("rpc event=%d, proc_id=%d, module=%d, image=%d\n", - event, proc_id, module_id, image); - - module = find_adsp_module_by_id(&adsp_info, module_id); - if (!module) { - MM_ERR("module %d is not supported!\n", module_id); - rpc_send_accepted_void_reply(rpc_cb_server_client, req->xid, - RPC_ACCEPTSTAT_GARBAGE_ARGS); - return; - } - - mutex_lock(&module->lock); - switch (event) { - case RPC_ADSP_RTOS_MOD_READY: - if (module->state == ADSP_STATE_ENABLING) { - MM_INFO("module %s: READY\n", module->name); - module->state = ADSP_STATE_ENABLED; - wake_up(&module->state_wait); - adsp_set_image(module->info, image); - break; - } else { - MM_ERR("module %s got READY event in state[%d]\n", - module->name, - module->state); - rpc_send_accepted_void_reply(rpc_cb_server_client, - req->xid, - RPC_ACCEPTSTAT_GARBAGE_ARGS); - mutex_unlock(&module->lock); - return; - } - case RPC_ADSP_RTOS_MOD_DISABLE: - MM_INFO("module %s: DISABLED\n", module->name); - module->state = ADSP_STATE_DISABLED; - wake_up(&module->state_wait); - break; - case RPC_ADSP_RTOS_SERVICE_RESET: - MM_INFO("module %s: SERVICE_RESET\n", module->name); - module->state = ADSP_STATE_DISABLED; - wake_up(&module->state_wait); - break; - case RPC_ADSP_RTOS_CMD_SUCCESS: - MM_INFO("module %s: CMD_SUCCESS\n", module->name); - break; - case RPC_ADSP_RTOS_CMD_FAIL: - MM_INFO("module %s: CMD_FAIL\n", module->name); - break; - case RPC_ADSP_RTOS_DISABLE_FAIL: - MM_INFO("module %s: DISABLE_FAIL\n", module->name); - break; - default: - MM_ERR("unknown event %d\n", event); - rpc_send_accepted_void_reply(rpc_cb_server_client, req->xid, - RPC_ACCEPTSTAT_GARBAGE_ARGS); - mutex_unlock(&module->lock); - return; - } - rpc_send_accepted_void_reply(rpc_cb_server_client, req->xid, - RPC_ACCEPTSTAT_SUCCESS); -#ifdef CONFIG_MSM_ADSP_REPORT_EVENTS - event_addr = (uint32_t *)req; - module->ops->event(module->driver_data, - EVENT_MSG_ID, - EVENT_LEN, - read_event); -#endif - mutex_unlock(&module->lock); -} - -static int handle_adsp_rtos_mtoa(struct rpc_request_hdr *req) -{ - switch (req->procedure) { - case RPC_ADSP_RTOS_MTOA_NULL_PROC: - rpc_send_accepted_void_reply(rpc_cb_server_client, - req->xid, - RPC_ACCEPTSTAT_SUCCESS); - break; -#if CONFIG_ADSP_RPC_VER > 0x30001 - case RPC_ADSP_RTOS_MTOA_INIT_INFO_PROC: - case RPC_ADSP_RTOS_MTOA_EVENT_INFO_PROC: -#else - case RPC_ADSP_RTOS_MODEM_TO_APP_PROC: -#endif - handle_adsp_rtos_mtoa_app(req); - break; - default: - MM_ERR("unknowned proc %d\n", req->procedure); - rpc_send_accepted_void_reply( - rpc_cb_server_client, req->xid, - RPC_ACCEPTSTAT_PROC_UNAVAIL); - break; - } - return 0; -} - -/* this should be common code with rpc_servers.c */ -static int adsp_rpc_thread(void *data) -{ - void *buffer; - struct rpc_request_hdr *req; - int rc, exit = 0; - - do { - rc = msm_rpc_read(rpc_cb_server_client, &buffer, -1, -1); - if (rc < 0) { - MM_ERR("could not read rpc: %d\n", rc); - break; - } - req = (struct rpc_request_hdr *)buffer; - - req->type = be32_to_cpu(req->type); - req->xid = be32_to_cpu(req->xid); - req->rpc_vers = be32_to_cpu(req->rpc_vers); - req->prog = be32_to_cpu(req->prog); - req->vers = be32_to_cpu(req->vers); - req->procedure = be32_to_cpu(req->procedure); - - if (req->type != 0) - goto bad_rpc; - if (req->rpc_vers != 2) - goto bad_rpc; - if (req->prog != rpc_adsp_rtos_mtoa_prog) - goto bad_rpc; - if (!msm_rpc_is_compatible_version(rpc_adsp_rtos_mtoa_vers, - req->vers)) - goto bad_rpc; - - handle_adsp_rtos_mtoa(req); - kfree(buffer); - continue; - -bad_rpc: - MM_ERR("bogus rpc from modem\n"); - kfree(buffer); - } while (!exit); - do_exit(0); -} - -static size_t read_event_size; -static void *read_event_addr; - -static void read_event_16(void *buf, size_t len) -{ - uint16_t *dst = buf; - uint16_t *src = read_event_addr; - len /= 2; - if (len > read_event_size) - len = read_event_size; - while (len--) - *dst++ = *src++; -} - -static void read_event_32(void *buf, size_t len) -{ - uint32_t *dst = buf; - uint32_t *src = read_event_addr; - len /= 2; - if (len > read_event_size) - len = read_event_size; - while (len--) - *dst++ = *src++; -} - -static int adsp_rtos_read_ctrl_word_cmd_tast_to_h_v( - struct adsp_info *info, void *dsp_addr) -{ - struct msm_adsp_module *module; - unsigned rtos_task_id; - unsigned msg_id; - unsigned msg_length; -#ifdef CONFIG_DEBUG_FS - uint16_t *ptr16; - uint32_t *ptr32; - int ii; -#endif /* CONFIG_DEBUG_FS */ - void (*func)(void *, size_t); - - if (dsp_addr >= (void *)(MSM_AD5_BASE + QDSP_RAMC_OFFSET)) { - uint32_t *dsp_addr32 = dsp_addr; - uint32_t tmp = *dsp_addr32++; - rtos_task_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M) >> 8; - msg_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M); - read_event_size = tmp >> 16; - read_event_addr = dsp_addr32; - msg_length = read_event_size * sizeof(uint32_t); - func = read_event_32; - } else { - uint16_t *dsp_addr16 = dsp_addr; - uint16_t tmp = *dsp_addr16++; - rtos_task_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M) >> 8; - msg_id = tmp & ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M; - read_event_size = *dsp_addr16++; - read_event_addr = dsp_addr16; - msg_length = read_event_size * sizeof(uint16_t); - func = read_event_16; - } - - if (rtos_task_id > info->max_task_id) { - MM_ERR("bogus task id %d\n", rtos_task_id); - return 0; - } - module = find_adsp_module_by_id(info, - adsp_get_module(info, rtos_task_id)); - - if (!module) { - MM_ERR("no module for task id %d\n", rtos_task_id); - return 0; - } - - module->num_events++; - - if (!module->ops) { - MM_ERR("module %s is not open\n", module->name); - return 0; - } -#ifdef CONFIG_DEBUG_FS - if (rdump > 0 && - (dsp_addr >= (void *)(MSM_AD5_BASE + QDSP_RAMC_OFFSET))) { - ptr32 = read_event_addr; - pr_info("D->A\n"); - pr_info("m_id = %x id = %x\n", module->id, msg_id); - for (ii = 0; ii < msg_length/4; ii++) - pr_info("%x ", ptr32[ii]); - pr_info("\n"); - } else if (rdump > 0) { - ptr16 = read_event_addr; - pr_info("D->A\n"); - pr_info("m_id = %x id = %x\n", module->id, msg_id); - for (ii = 0; ii < msg_length/2; ii++) - pr_info("%x ", ptr16[ii]); - pr_info("\n"); - } -#endif /* CONFIG_DEBUG_FS */ - - module->ops->event(module->driver_data, msg_id, msg_length, func); - return 0; -} - -static int adsp_get_event(struct adsp_info *info) -{ - uint32_t ctrl_word; - uint32_t ready; - void *dsp_addr; - uint32_t cmd_type; - int cnt; - unsigned long flags; - int rc = 0; - - spin_lock_irqsave(&adsp_cmd_lock, flags); - - /* Whenever the DSP has a message, it updates this control word - * and generates an interrupt. When we receive the interrupt, we - * read this register to find out what ADSP task the command is - * comming from. - * - * The ADSP should *always* be ready on the first call, but the - * irq handler calls us in a loop (to handle back-to-back command - * processing), so we give the DSP some time to return to the - * ready state. The DSP will not issue another IRQ for events - * pending between the first IRQ and the event queue being drained, - * unfortunately. - */ - - for (cnt = 0; cnt < 50; cnt++) { - ctrl_word = readl(info->read_ctrl); - - if ((ctrl_word & ADSP_RTOS_READ_CTRL_WORD_FLAG_M) == - ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_CONT_V) - goto ready; - - udelay(2); - } - MM_ERR("not ready after 100uS\n"); - rc = -EBUSY; - goto done; - -ready: - /* Here we check to see if there are pending messages. If there are - * none, we siply return -EAGAIN to indicate that there are no more - * messages pending. - */ - ready = ctrl_word & ADSP_RTOS_READ_CTRL_WORD_READY_M; - if ((ready != ADSP_RTOS_READ_CTRL_WORD_READY_V) && - (ready != ADSP_RTOS_READ_CTRL_WORD_CONT_V)) { - rc = -EAGAIN; - goto done; - } - - /* DSP says that there are messages waiting for the host to read */ - - /* Get the Command Type */ - cmd_type = ctrl_word & ADSP_RTOS_READ_CTRL_WORD_CMD_TYPE_M; - - /* Get the DSP buffer address */ - dsp_addr = (void *)((ctrl_word & - ADSP_RTOS_READ_CTRL_WORD_DSP_ADDR_M) + - (uint32_t)MSM_AD5_BASE); - - /* We can only handle Task-to-Host messages */ - if (cmd_type != ADSP_RTOS_READ_CTRL_WORD_CMD_TASK_TO_H_V) { - MM_ERR("unknown dsp cmd_type %d\n", cmd_type); - rc = -EIO; - goto done; - } - - adsp_rtos_read_ctrl_word_cmd_tast_to_h_v(info, dsp_addr); - - ctrl_word = readl(info->read_ctrl); - ctrl_word &= ~ADSP_RTOS_READ_CTRL_WORD_READY_M; - - /* Write ctrl word to the DSP */ - writel(ctrl_word, info->read_ctrl); - - /* Generate an interrupt to the DSP */ - writel(1, info->send_irq); - -done: - spin_unlock_irqrestore(&adsp_cmd_lock, flags); - return rc; -} - -static irqreturn_t adsp_irq_handler(int irq, void *data) -{ - struct adsp_info *info = &adsp_info; - int cnt = 0; - for (cnt = 0; cnt < 15; cnt++) - if (adsp_get_event(info) < 0) - break; - if (cnt > info->event_backlog_max) - info->event_backlog_max = cnt; - info->events_received += cnt; - if (cnt == 15) - MM_ERR("too many (%d) events for single irq!\n", cnt); - return IRQ_HANDLED; -} - -int adsp_set_clkrate(struct msm_adsp_module *module, unsigned long clk_rate) -{ - if (!module) - return -EINVAL; - - if (module->clk && clk_rate) - return clk_set_rate(module->clk, clk_rate); - - return -EINVAL; -} - -int msm_adsp_generate_event(void *data, - struct msm_adsp_module *mod, - unsigned event_id, - unsigned event_length, - unsigned event_size, - void *msg) -{ - unsigned long flags; - void (*func)(void *, size_t); - - if (!mod) - return -EINVAL; - - if (event_size == sizeof(uint32_t)) - func = read_event_32; - else if (event_size == sizeof(uint16_t)) - func = read_event_16; - else - return -EINVAL; - - spin_lock_irqsave(&adsp_cmd_lock, flags); - read_event_addr = msg; - read_event_size = event_length; - mod->ops->event(data, event_id, event_length, func); - spin_unlock_irqrestore(&adsp_cmd_lock, flags); - return 0; -} - -int msm_adsp_dump(struct msm_adsp_module *module) -{ - int rc = 0; - if (!module) { - MM_INFO("Invalid module. Dumps are not collected\n"); - return -EINVAL; - } - MM_INFO("starting DSP DUMP\n"); - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_CORE_DUMP, - module->id, module); - MM_INFO("DSP DUMP done rc =%d\n", rc); - return rc; -} -EXPORT_SYMBOL(msm_adsp_dump); - -int msm_adsp_enable(struct msm_adsp_module *module) -{ - int rc = 0; - struct msm_adsp_module *module_en = NULL; - - if (!module) - return -EINVAL; - - MM_INFO("enable '%s'state[%d] id[%d]\n", - module->name, module->state, module->id); - if (!strncmp(module->name, "JPEGTASK", sizeof(module->name))) - module_en = find_adsp_module_by_name(&adsp_info, "VIDEOTASK"); - else if (!strncmp(module->name, "VIDEOTASK", sizeof(module->name))) - module_en = find_adsp_module_by_name(&adsp_info, "JPEGTASK"); - if (module_en) { - mutex_lock(&module_en->lock); - if (module_en->state == ADSP_STATE_ENABLED || - module_en->state == ADSP_STATE_ENABLING) { - MM_ERR("both jpeg and video module can't"\ - " exist at a time\n"); - mutex_unlock(&module_en->lock); - return -EINVAL; - } - mutex_unlock(&module_en->lock); - } - - mutex_lock(&module->lock); - switch (module->state) { - case ADSP_STATE_DISABLED: - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_ENABLE, - module->id, module); - if (rc) - break; - module->state = ADSP_STATE_ENABLING; - mutex_unlock(&module->lock); - rc = wait_event_timeout(module->state_wait, - module->state != ADSP_STATE_ENABLING, - 1 * HZ); - mutex_lock(&module->lock); - if (module->state == ADSP_STATE_ENABLED) { - rc = 0; - } else { - MM_ERR("module '%s' enable timed out\n", module->name); - msm_adsp_dump(module); - rc = -ETIMEDOUT; - } - if (module->open_count++ == 0 && module->clk) - clk_prepare_enable(module->clk); - - mutex_lock(&adsp_open_lock); - if (adsp_open_count++ == 0) { - enable_irq(adsp_info.int_adsp); - prevent_suspend(); - } - mutex_unlock(&adsp_open_lock); - break; - case ADSP_STATE_ENABLING: - MM_DBG("module '%s' enable in progress\n", module->name); - break; - case ADSP_STATE_ENABLED: - MM_DBG("module '%s' already enabled\n", module->name); - break; - case ADSP_STATE_DISABLING: - MM_ERR("module '%s' disable in progress\n", module->name); - rc = -EBUSY; - break; - } - mutex_unlock(&module->lock); - return rc; -} -EXPORT_SYMBOL(msm_adsp_enable); - -int msm_adsp_disable_event_rsp(struct msm_adsp_module *module) -{ - int rc = 0; - - if (!module) - return -EINVAL; - - mutex_lock(&module->lock); - - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_DISABLE_EVENT_RSP, - module->id, module); - mutex_unlock(&module->lock); - - return rc; -} -EXPORT_SYMBOL(msm_adsp_disable_event_rsp); - -static int msm_adsp_disable_locked(struct msm_adsp_module *module) -{ - int rc = 0; - - if (!module) - return -EINVAL; - - switch (module->state) { - case ADSP_STATE_DISABLED: - MM_DBG("module '%s' already disabled\n", module->name); - break; - case ADSP_STATE_ENABLING: - case ADSP_STATE_ENABLED: - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_DISABLE, - module->id, module); - module->state = ADSP_STATE_DISABLED; - if (--module->open_count == 0 && module->clk) - clk_disable_unprepare(module->clk); - mutex_lock(&adsp_open_lock); - if (--adsp_open_count == 0) { - disable_irq(adsp_info.int_adsp); - allow_suspend(); - MM_DBG("disable interrupt\n"); - } - mutex_unlock(&adsp_open_lock); - } - return rc; -} - -int msm_adsp_disable(struct msm_adsp_module *module) -{ - int rc; - - if (!module) - return -EINVAL; - - MM_INFO("disable '%s'\n", module->name); - mutex_lock(&module->lock); - rc = msm_adsp_disable_locked(module); - mutex_unlock(&module->lock); - return rc; -} -EXPORT_SYMBOL(msm_adsp_disable); - -static int msm_adsp_probe(struct platform_device *pdev) -{ - unsigned count; - int rc, i; - - adsp_info.int_adsp = platform_get_irq(pdev, 0); - if (adsp_info.int_adsp < 0) { - MM_ERR("no irq resource?\n"); - return -ENODEV; - } - - wake_lock_init(&adsp_wake_lock, WAKE_LOCK_SUSPEND, "adsp"); - adsp_info.init_info_ptr = kzalloc( - (sizeof(struct adsp_rtos_mp_mtoa_init_info_type)), GFP_KERNEL); - if (!adsp_info.init_info_ptr) - return -ENOMEM; - - rc = adsp_init_info(&adsp_info); - if (rc) - return rc; - adsp_info.send_irq += (uint32_t) MSM_AD5_BASE; - adsp_info.read_ctrl += (uint32_t) MSM_AD5_BASE; - adsp_info.write_ctrl += (uint32_t) MSM_AD5_BASE; - count = adsp_info.module_count; - - adsp_modules = kzalloc( - (sizeof(struct msm_adsp_module) + sizeof(void *)) * - count, GFP_KERNEL); - if (!adsp_modules) - return -ENOMEM; - - adsp_info.id_to_module = (void *) (adsp_modules + count); - - spin_lock_init(&adsp_cmd_lock); - spin_lock_init(&adsp_write_lock); - mutex_init(&adsp_info.lock); - - rc = request_irq(adsp_info.int_adsp, adsp_irq_handler, - IRQF_TRIGGER_RISING, "adsp", 0); - if (rc < 0) - goto fail_request_irq; - disable_irq(adsp_info.int_adsp); - - rpc_cb_server_client = msm_rpc_open(); - if (IS_ERR(rpc_cb_server_client)) { - rpc_cb_server_client = NULL; - rc = PTR_ERR(rpc_cb_server_client); - MM_ERR("could not create rpc server (%d)\n", rc); - goto fail_rpc_open; - } - - rc = msm_rpc_register_server(rpc_cb_server_client, - rpc_adsp_rtos_mtoa_prog, - rpc_adsp_rtos_mtoa_vers); - if (rc) { - MM_ERR("could not register callback server (%d)\n", rc); - goto fail_rpc_register; - } - - /* schedule start of kernel thread later using work queue */ - queue_work(msm_adsp_probe_work_queue, &msm_adsp_probe_work); - - for (i = 0; i < count; i++) { - struct msm_adsp_module *mod = adsp_modules + i; - mutex_init(&mod->lock); - init_waitqueue_head(&mod->state_wait); - mod->info = &adsp_info; - mod->name = adsp_info.module[i].name; - mod->id = adsp_info.module[i].id; - if (adsp_info.module[i].clk_name) - mod->clk = clk_get(NULL, adsp_info.module[i].clk_name); - else - mod->clk = NULL; - if (mod->clk && adsp_info.module[i].clk_rate) - clk_set_rate(mod->clk, adsp_info.module[i].clk_rate); - mod->verify_cmd = adsp_info.module[i].verify_cmd; - mod->patch_event = adsp_info.module[i].patch_event; - INIT_HLIST_HEAD(&mod->ion_regions); - mod->pdev.name = adsp_info.module[i].pdev_name; - mod->pdev.id = -1; - adsp_info.id_to_module[i] = mod; - platform_device_register(&mod->pdev); - } - - msm_adsp_publish_cdevs(adsp_modules, count); - rmtask_init(); - - return 0; - -fail_rpc_register: - msm_rpc_close(rpc_cb_server_client); - rpc_cb_server_client = NULL; -fail_rpc_open: - enable_irq(adsp_info.int_adsp); - free_irq(adsp_info.int_adsp, 0); -fail_request_irq: - kfree(adsp_modules); - kfree(adsp_info.init_info_ptr); - return rc; -} - -static void adsp_probe_work(struct work_struct *work) -{ - /* start the kernel thread to process the callbacks */ - kthread_run(adsp_rpc_thread, NULL, "kadspd"); -} - -#ifdef CONFIG_DEBUG_FS -static int get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (strict_strtoul(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } - else - return -EINVAL; - } - return 0; -} - - -static ssize_t adsp_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - pr_debug("adsp debugfs opened\n"); - return 0; -} -static ssize_t adsp_debug_write(struct file *file, const char __user *buf, - size_t cnt, loff_t *ppos) -{ - char *access_str = file->private_data; - char lbuf[32]; - int rc; - long int param[5]; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - rc = copy_from_user(lbuf, buf, cnt); - if (rc) { - pr_info("Unable to copy data from user space\n"); - return -EFAULT; - } - lbuf[cnt] = '\0'; - - if (!strcmp(access_str, "write_log")) { - if (get_parameters(lbuf, param, 1) == 0) { - switch (param[0]) { - case 1: - if (wdump <= 0) - wdump = 1; - pr_debug("write cmd to DSP(A->D) dump \ - started:%d\n", wdump); - break; - case 0: - if (wdump > 0) - wdump = 0; - pr_debug("Stop write cmd to \ - DSP(A->D):%d\n", wdump); - break; - default: - rc = -EINVAL; - break; - } - } else - rc = -EINVAL; - } else if (!strcmp(access_str, "read_log")) { - if (get_parameters(lbuf, param, 1) == 0) { - switch (param[0]) { - case 1: - if (rdump <= 0) - rdump = 1; - pr_debug("write cmd from DSP(D->A) dump \ - started:%d\n", wdump); - break; - case 0: - if (rdump > 0) - rdump = 0; - pr_debug("Stop write cmd from \ - DSP(D->A):%d\n", wdump); - break; - default: - rc = -EINVAL; - break; - } - } else - rc = -EINVAL; - } else { - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else { - pr_err("%s: rc = %d\n", __func__, rc); - pr_info("\nWrong command: Use =>\n"); - pr_info("-------------------------\n"); - pr_info("To Start A->D:: echo \"1\">/sys/kernel/debug/ \ - adsp_cmd/write_log\n"); - pr_info("To Start D->A:: echo \"1\">/sys/kernel/debug/ \ - adsp_cmd/read_log\n"); - pr_info("To Stop A->D:: echo \"0\">/sys/kernel/debug/ \ - adsp_cmd/write_log\n"); - pr_info("To Stop D->A:: echo \"0\">/sys/kernel/debug/ \ - adsp_cmd/read_log\n"); - pr_info("------------------------\n"); - } - - return rc; -} -#endif - -static struct platform_driver msm_adsp_driver = { - .probe = msm_adsp_probe, - .driver = { - .owner = THIS_MODULE, - }, -}; - -static const char msm_adsp_driver_name[] = "msm_adsp"; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations adsp_debug_fops = { - .write = adsp_debug_write, - .open = adsp_debug_open, -}; -#endif - -static int __init adsp_init(void) -{ - int rc; - -#ifdef CONFIG_DEBUG_FS - dentry_adsp = debugfs_create_dir("adsp_cmd", 0); - if (!IS_ERR(dentry_adsp)) { - dentry_wdata = debugfs_create_file("write_log", \ - S_IFREG | S_IRUGO, dentry_adsp, - (void *) "write_log" , &adsp_debug_fops); - dentry_rdata = debugfs_create_file("read_log", \ - S_IFREG | S_IRUGO, dentry_adsp, - (void *) "read_log", &adsp_debug_fops); - } - rdump = 0; - wdump = 0; -#endif /* CONFIG_DEBUG_FS */ - - rpc_adsp_rtos_atom_prog = 0x3000000a; - rpc_adsp_rtos_atom_vers = 0x10001; - rpc_adsp_rtos_atom_vers_comp = 0x00010001; - rpc_adsp_rtos_mtoa_prog = 0x3000000b; -#if CONFIG_ADSP_RPC_VER > 0x30001 - rpc_adsp_rtos_mtoa_vers = 0x30002; - rpc_adsp_rtos_mtoa_vers_comp = 0x00030002; -#else - rpc_adsp_rtos_mtoa_vers = 0x30001; - rpc_adsp_rtos_mtoa_vers_comp = 0x00030001; -#endif - - msm_adsp_probe_work_queue = create_workqueue("msm_adsp_probe"); - if (msm_adsp_probe_work_queue == NULL) - return -ENOMEM; - msm_adsp_driver.driver.name = msm_adsp_driver_name; - rc = platform_driver_register(&msm_adsp_driver); - MM_INFO("%s -- %d\n", msm_adsp_driver_name, rc); - return rc; -} - -device_initcall(adsp_init); diff --git a/arch/arm/mach-msm/qdsp5/adsp.h b/arch/arm/mach-msm/qdsp5/adsp.h deleted file mode 100644 index 0922d883b586..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp.h +++ /dev/null @@ -1,361 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp.h - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2010, 2012 The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _ARCH_ARM_MACH_MSM_ADSP_H -#define _ARCH_ARM_MACH_MSM_ADSP_H - -#include -#include -#include -#include -#include - -int adsp_pmem_fixup(struct msm_adsp_module *module, void **addr, - unsigned long len); -int adsp_ion_do_cache_op(struct msm_adsp_module *module, void *addr, - void *paddr, unsigned long len, - unsigned long offset, int cmd); -int adsp_ion_fixup_kvaddr(struct msm_adsp_module *module, void **addr, - unsigned long *kvaddr, unsigned long len, - struct file **filp, unsigned long *offset); -int adsp_pmem_paddr_fixup(struct msm_adsp_module *module, void **addr); - -int adsp_vfe_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_jpeg_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_lpm_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_video_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_videoenc_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -void q5audio_dsp_not_responding(void); - -struct adsp_event; - -int adsp_vfe_patch_event(struct msm_adsp_module *module, - struct adsp_event *event); - -int adsp_jpeg_patch_event(struct msm_adsp_module *module, - struct adsp_event *event); - - -struct adsp_module_info { - const char *name; - const char *pdev_name; - uint32_t id; - const char *clk_name; - unsigned long clk_rate; - int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *, - size_t); - int (*patch_event) (struct msm_adsp_module*, struct adsp_event *); -}; - -#define ADSP_EVENT_MAX_SIZE 496 -#define EVENT_LEN 12 -#define EVENT_MSG_ID ((uint16_t)~0) - -struct adsp_event { - struct list_head list; - uint32_t size; /* always in bytes */ - uint16_t msg_id; - uint16_t type; /* 0 for msgs (from aDSP), -1 for events (from ARM9) */ - int is16; /* always 0 (msg is 32-bit) when the event type is 1(ARM9) */ - union { - uint16_t msg16[ADSP_EVENT_MAX_SIZE / 2]; - uint32_t msg32[ADSP_EVENT_MAX_SIZE / 4]; - } data; -}; - -struct adsp_info { - uint32_t send_irq; - uint32_t read_ctrl; - uint32_t write_ctrl; - - uint32_t max_msg16_size; - uint32_t max_msg32_size; - - uint32_t max_task_id; - uint32_t max_module_id; - uint32_t max_queue_id; - uint32_t max_image_id; - - /* for each image id, a map of queue id to offset */ - uint32_t **queue_offset; - - /* for each image id, a map of task id to module id */ - uint32_t **task_to_module; - - /* for each module id, map of module id to module */ - struct msm_adsp_module **id_to_module; - - uint32_t module_count; - struct adsp_module_info *module; - - /* stats */ - uint32_t events_received; - uint32_t event_backlog_max; - - /* rpc_client for init_info */ - struct msm_rpc_endpoint *init_info_rpc_client; - struct adsp_rtos_mp_mtoa_init_info_type *init_info_ptr; - wait_queue_head_t init_info_wait; - unsigned init_info_state; - struct mutex lock; - - /* Interrupt value */ - int int_adsp; -}; - -#define RPC_ADSP_RTOS_ATOM_NULL_PROC 0 -#define RPC_ADSP_RTOS_MTOA_NULL_PROC 0 -#define RPC_ADSP_RTOS_APP_TO_MODEM_PROC 2 -#define RPC_ADSP_RTOS_MODEM_TO_APP_PROC 2 -#define RPC_ADSP_RTOS_MTOA_EVENT_INFO_PROC 3 -#define RPC_ADSP_RTOS_MTOA_INIT_INFO_PROC 4 - -enum rpc_adsp_rtos_proc_type { - RPC_ADSP_RTOS_PROC_NONE = 0, - RPC_ADSP_RTOS_PROC_MODEM = 1, - RPC_ADSP_RTOS_PROC_APPS = 2, -}; - -enum { - RPC_ADSP_RTOS_CMD_REGISTER_APP, - RPC_ADSP_RTOS_CMD_ENABLE, - RPC_ADSP_RTOS_CMD_DISABLE, - RPC_ADSP_RTOS_CMD_KERNEL_COMMAND, - RPC_ADSP_RTOS_CMD_16_COMMAND, - RPC_ADSP_RTOS_CMD_32_COMMAND, - RPC_ADSP_RTOS_CMD_DISABLE_EVENT_RSP, - RPC_ADSP_RTOS_CMD_REMOTE_EVENT, - RPC_ADSP_RTOS_CMD_SET_STATE, - RPC_ADSP_RTOS_CMD_REMOTE_INIT_INFO_EVENT, - RPC_ADSP_RTOS_CMD_GET_INIT_INFO, - RPC_ADSP_RTOS_CMD_CORE_DUMP, -}; - -enum rpc_adsp_rtos_mod_status_type { - RPC_ADSP_RTOS_MOD_READY, - RPC_ADSP_RTOS_MOD_DISABLE, - RPC_ADSP_RTOS_SERVICE_RESET, - RPC_ADSP_RTOS_CMD_FAIL, - RPC_ADSP_RTOS_CMD_SUCCESS, - RPC_ADSP_RTOS_INIT_INFO, - RPC_ADSP_RTOS_DISABLE_FAIL, -}; - -struct rpc_adsp_rtos_app_to_modem_args_t { - struct rpc_request_hdr hdr; - uint32_t gotit; /* if 1, the next elements are present */ - uint32_t cmd; /* e.g., RPC_ADSP_RTOS_CMD_REGISTER_APP */ - uint32_t proc_id; /* e.g., RPC_ADSP_RTOS_PROC_APPS */ - uint32_t module; /* e.g., QDSP_MODULE_AUDPPTASK */ -}; - -enum qdsp_image_type { - QDSP_IMAGE_COMBO, - QDSP_IMAGE_GAUDIO, - QDSP_IMAGE_QTV_LP, - QDSP_IMAGE_MAX, - /* DO NOT USE: Force this enum to be a 32bit type to improve speed */ - QDSP_IMAGE_32BIT_DUMMY = 0x10000 -}; - -struct adsp_rtos_mp_mtoa_header_type { - enum rpc_adsp_rtos_mod_status_type event; - enum rpc_adsp_rtos_proc_type proc_id; -}; - -/* ADSP RTOS MP Communications - Modem to APP's Event Info*/ -struct adsp_rtos_mp_mtoa_type { - uint32_t module; - uint32_t image; - uint32_t apps_okts; -}; - -/* ADSP RTOS MP Communications - Modem to APP's Init Info */ -#if CONFIG_ADSP_RPC_VER > 0x30001 -#define IMG_MAX 2 -#define ENTRIES_MAX 36 -#define MODULES_MAX 64 -#else -#define IMG_MAX 6 -#define ENTRIES_MAX 48 -#endif -#define QUEUES_MAX 64 - -struct queue_to_offset_type { - uint32_t queue; - uint32_t offset; -}; - -struct mod_to_queue_offsets { - uint32_t module; - uint32_t q_type; - uint32_t q_max_len; -}; - -struct adsp_rtos_mp_mtoa_init_info_type { - uint32_t image_count; - uint32_t num_queue_offsets; - struct queue_to_offset_type queue_offsets_tbl[IMG_MAX][ENTRIES_MAX]; - uint32_t num_task_module_entries; - uint32_t task_to_module_tbl[IMG_MAX][ENTRIES_MAX]; - - uint32_t module_table_size; -#if CONFIG_ADSP_RPC_VER > 0x30001 - uint32_t module_entries[MODULES_MAX]; -#else - uint32_t module_entries[ENTRIES_MAX]; -#endif - uint32_t mod_to_q_entries; - struct mod_to_queue_offsets mod_to_q_tbl[ENTRIES_MAX]; - /* - * queue_offsets[] is to store only queue_offsets - */ - uint32_t queue_offsets[IMG_MAX][QUEUES_MAX]; -}; - -struct adsp_rtos_mp_mtoa_s_type { - struct adsp_rtos_mp_mtoa_header_type mp_mtoa_header; -#if CONFIG_ADSP_RPC_VER == 0x30001 - uint32_t desc_field; -#endif - union { - struct adsp_rtos_mp_mtoa_init_info_type mp_mtoa_init_packet; - struct adsp_rtos_mp_mtoa_type mp_mtoa_packet; - } adsp_rtos_mp_mtoa_data; -}; - -struct rpc_adsp_rtos_modem_to_app_args_t { - struct rpc_request_hdr hdr; - uint32_t gotit; /* if 1, the next elements are present */ - struct adsp_rtos_mp_mtoa_s_type mtoa_pkt; -}; - -#define ADSP_STATE_DISABLED 0 -#define ADSP_STATE_ENABLING 1 -#define ADSP_STATE_ENABLED 2 -#define ADSP_STATE_DISABLING 3 -#define ADSP_STATE_INIT_INFO 4 - -struct msm_adsp_module { - struct mutex lock; - const char *name; - unsigned id; - struct adsp_info *info; - - struct msm_rpc_endpoint *rpc_client; - struct msm_adsp_ops *ops; - void *driver_data; - - /* statistics */ - unsigned num_commands; - unsigned num_events; - - wait_queue_head_t state_wait; - unsigned state; - - struct platform_device pdev; - struct clk *clk; - int open_count; - - struct mutex ion_regions_lock; - struct hlist_head ion_regions; - int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *, - size_t); - int (*patch_event) (struct msm_adsp_module*, struct adsp_event *); -}; - -extern void msm_adsp_publish_cdevs(struct msm_adsp_module *, unsigned); -extern int adsp_init_info(struct adsp_info *info); -extern void rmtask_init(void); - -/* Value to indicate that a queue is not defined for a particular image */ -#define QDSP_RTOS_NO_QUEUE 0xfffffffe - -/* - * Constants used to communicate with the ADSP RTOS - */ -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M 0x80000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V 0x80000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_AVAIL_V 0x00000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_M 0x70000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_REQ_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_DONE_V 0x10000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_NO_CMD_V 0x70000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_STATUS_M 0x0E000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_NO_ERR_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_NO_FREE_BUF_V 0x02000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_KERNEL_FLG_M 0x01000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_MSG_WRITE_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_V 0x01000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_ID_M 0x00FFFFFFU - -/* Combination of MUTEX and CMD bits to check if the DSP is busy */ -#define ADSP_RTOS_WRITE_CTRL_WORD_READY_M 0xF0000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_READY_V 0x70000000U - -/* RTOS to Host processor command mask values */ -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_M 0x80000000U -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_WAIT_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_CONT_V 0x80000000U - -#define ADSP_RTOS_READ_CTRL_WORD_CMD_M 0x60000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_DONE_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_REQ_V 0x20000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_CMD_V 0x60000000U - -/* Combination of FLAG and COMMAND bits to check if MSG ready */ -#define ADSP_RTOS_READ_CTRL_WORD_READY_M 0xE0000000U -#define ADSP_RTOS_READ_CTRL_WORD_READY_V 0xA0000000U -#define ADSP_RTOS_READ_CTRL_WORD_CONT_V 0xC0000000U -#define ADSP_RTOS_READ_CTRL_WORD_DONE_V 0xE0000000U - -#define ADSP_RTOS_READ_CTRL_WORD_STATUS_M 0x18000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_ERR_V 0x00000000U - -#define ADSP_RTOS_READ_CTRL_WORD_IN_PROG_M 0x04000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_READ_IN_PROG_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_IN_PROG_V 0x04000000U - -#define ADSP_RTOS_READ_CTRL_WORD_CMD_TYPE_M 0x03000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_TASK_TO_H_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_KRNL_TO_H_V 0x01000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_H_TO_KRNL_CFM_V 0x02000000U - -#define ADSP_RTOS_READ_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU - -#define ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M 0x000000FFU -#define ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M 0x0000FF00U - -/* Base address of DSP and DSP hardware registers */ -#define QDSP_RAMC_OFFSET 0x400000 - -#endif diff --git a/arch/arm/mach-msm/qdsp5/adsp_6210.c b/arch/arm/mach-msm/qdsp5/adsp_6210.c deleted file mode 100644 index bf69ce2eebc1..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_6210.c +++ /dev/null @@ -1,283 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_6210.h - * - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "adsp.h" - -/* Firmware modules */ -typedef enum { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEO_AAC_VOC, - QDSP_MODULE_PCM_DEC, - QDSP_MODULE_AUDIO_DEC_MP3, - QDSP_MODULE_AUDIO_DEC_AAC, - QDSP_MODULE_AUDIO_DEC_WMA, - QDSP_MODULE_HOSTPCM, - QDSP_MODULE_DTMF, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_SBC_ENC, - QDSP_MODULE_VOC, - QDSP_MODULE_VOC_PCM, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_WAV_ENC, - QDSP_MODULE_AACLC_ENC, - QDSP_MODULE_VIDEO_AMR, - QDSP_MODULE_VOC_AMR, - QDSP_MODULE_VOC_EVRC, - QDSP_MODULE_VOC_13K, - QDSP_MODULE_VOC_FGV, - QDSP_MODULE_DIAGTASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_QCAMTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MIDI, - QDSP_MODULE_GAUDIO, - QDSP_MODULE_VDEC_LP_MODE, - QDSP_MODULE_MAX, -} qdsp_module_type; - -#define QDSP_RTOS_MAX_TASK_ID 19U - -/* Table of modules indexed by task ID for the GAUDIO image */ -static qdsp_module_type qdsp_gaudio_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the GAUDIO image */ -static uint32_t qdsp_gaudio_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x3be, /* QDSP_mpuAfeQueue */ - 0x3ee, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x3c2, /* QDSP_uPAudPPCmd1Queue */ - 0x3c6, /* QDSP_uPAudPPCmd2Queue */ - 0x3ca, /* QDSP_uPAudPPCmd3Queue */ - 0x3da, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - 0x3de, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - 0x3e2, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - 0x3e6, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - 0x3ea, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x3ce, /* QDSP_uPAudPreProcCmdQueue */ - 0x3d6, /* QDSP_uPAudRecBitStreamQueue */ - 0x3d2, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE /* QDSP_vfeCommandTableQueue */ -}; - -/* Table of modules indexed by task ID for the COMBO image */ -static qdsp_module_type qdsp_combo_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the COMBO image */ -static uint32_t qdsp_combo_queue_offset_table[] = { - 0x585, /* QDSP_lpmCommandQueue */ - 0x52d, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - 0x541, /* QDSP_mpuModmathCmdQueue */ - 0x555, /* QDSP_mpuVDecCmdQueue */ - 0x559, /* QDSP_mpuVDecPktQueue */ - 0x551, /* QDSP_mpuVEncCmdQueue */ - 0x535, /* QDSP_rxMpuDecCmdQueue */ - 0x539, /* QDSP_rxMpuDecPktQueue */ - 0x53d, /* QDSP_txMpuEncQueue */ - 0x55d, /* QDSP_uPAudPPCmd1Queue */ - 0x561, /* QDSP_uPAudPPCmd2Queue */ - 0x565, /* QDSP_uPAudPPCmd3Queue */ - 0x575, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - 0x579, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x569, /* QDSP_uPAudPreProcCmdQueue */ - 0x571, /* QDSP_uPAudRecBitStreamQueue */ - 0x56d, /* QDSP_uPAudRecCmdQueue */ - 0x581, /* QDSP_uPJpegActionCmdQueue */ - 0x57d, /* QDSP_uPJpegCfgCmdQueue */ - 0x531, /* QDSP_uPVocProcQueue */ - 0x545, /* QDSP_vfeCommandQueue */ - 0x54d, /* QDSP_vfeCommandScaleQueue */ - 0x549 /* QDSP_vfeCommandTableQueue */ -}; - -/* Table of modules indexed by task ID for the QTV_LP image */ -static qdsp_module_type qdsp_qtv_lp_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the QTV_LP image */ -static uint32_t qdsp_qtv_lp_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x40c, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - 0x410, /* QDSP_mpuVDecCmdQueue */ - 0x414, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x41c, /* QDSP_uPAudPPCmd1Queue */ - 0x420, /* QDSP_uPAudPPCmd2Queue */ - 0x424, /* QDSP_uPAudPPCmd3Queue */ - 0x430, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x418, /* QDSP_uPAudPreProcCmdQueue */ - 0x42c, /* QDSP_uPAudRecBitStreamQueue */ - 0x428, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE /* QDSP_vfeCommandTableQueue */ -}; - -/* Tables to convert tasks to modules */ -static uint32_t *qdsp_task_to_module[] = { - qdsp_combo_task_to_module_table, - qdsp_gaudio_task_to_module_table, - qdsp_qtv_lp_task_to_module_table, -}; - -/* Tables to retrieve queue offsets */ -static uint32_t *qdsp_queue_offset_table[] = { - qdsp_combo_queue_offset_table, - qdsp_gaudio_queue_offset_table, - qdsp_qtv_lp_queue_offset_table, -}; - -#define QDSP_MODULE(n) \ - { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n } - -static struct adsp_module_info module_info[] = { - QDSP_MODULE(AUDPPTASK), - QDSP_MODULE(AUDRECTASK), - QDSP_MODULE(AUDPREPROCTASK), - QDSP_MODULE(VFETASK), - QDSP_MODULE(QCAMTASK), - QDSP_MODULE(LPMTASK), - QDSP_MODULE(JPEGTASK), - QDSP_MODULE(VIDEOTASK), - QDSP_MODULE(VDEC_LP_MODE), -}; - -int adsp_init_info(struct adsp_info *info) -{ - info->send_irq = 0x00c00200; - info->read_ctrl = 0x00400038; - info->write_ctrl = 0x00400034; - - info->max_msg16_size = 193; - info->max_msg32_size = 8; - - info->max_task_id = 16; - info->max_module_id = QDSP_MODULE_MAX - 1; - info->max_queue_id = QDSP_QUEUE_MAX; - info->max_image_id = 2; - info->queue_offset = qdsp_queue_offset_table; - info->task_to_module = qdsp_task_to_module; - - info->module_count = ARRAY_SIZE(module_info); - info->module = module_info; - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_6220.c b/arch/arm/mach-msm/qdsp5/adsp_6220.c deleted file mode 100644 index 007379042831..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_6220.c +++ /dev/null @@ -1,284 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_6220.h - * - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "adsp.h" - -/* Firmware modules */ -typedef enum { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEO_AAC_VOC, - QDSP_MODULE_PCM_DEC, - QDSP_MODULE_AUDIO_DEC_MP3, - QDSP_MODULE_AUDIO_DEC_AAC, - QDSP_MODULE_AUDIO_DEC_WMA, - QDSP_MODULE_HOSTPCM, - QDSP_MODULE_DTMF, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_SBC_ENC, - QDSP_MODULE_VOC, - QDSP_MODULE_VOC_PCM, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_WAV_ENC, - QDSP_MODULE_AACLC_ENC, - QDSP_MODULE_VIDEO_AMR, - QDSP_MODULE_VOC_AMR, - QDSP_MODULE_VOC_EVRC, - QDSP_MODULE_VOC_13K, - QDSP_MODULE_VOC_FGV, - QDSP_MODULE_DIAGTASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_QCAMTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MIDI, - QDSP_MODULE_GAUDIO, - QDSP_MODULE_VDEC_LP_MODE, - QDSP_MODULE_MAX, -} qdsp_module_type; - -#define QDSP_RTOS_MAX_TASK_ID 19U - -/* Table of modules indexed by task ID for the GAUDIO image */ -static qdsp_module_type qdsp_gaudio_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the GAUDIO image */ -static uint32_t qdsp_gaudio_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x3f0, /* QDSP_mpuAfeQueue */ - 0x420, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x3f4, /* QDSP_uPAudPPCmd1Queue */ - 0x3f8, /* QDSP_uPAudPPCmd2Queue */ - 0x3fc, /* QDSP_uPAudPPCmd3Queue */ - 0x40c, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - 0x410, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - 0x414, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - 0x418, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - 0x41c, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x400, /* QDSP_uPAudPreProcCmdQueue */ - 0x408, /* QDSP_uPAudRecBitStreamQueue */ - 0x404, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE /* QDSP_vfeCommandTableQueue */ -}; - -/* Table of modules indexed by task ID for the COMBO image */ -static qdsp_module_type qdsp_combo_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the COMBO image */ -static uint32_t qdsp_combo_queue_offset_table[] = { - 0x6f2, /* QDSP_lpmCommandQueue */ - 0x69e, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - 0x6b2, /* QDSP_mpuModmathCmdQueue */ - 0x6c6, /* QDSP_mpuVDecCmdQueue */ - 0x6ca, /* QDSP_mpuVDecPktQueue */ - 0x6c2, /* QDSP_mpuVEncCmdQueue */ - 0x6a6, /* QDSP_rxMpuDecCmdQueue */ - 0x6aa, /* QDSP_rxMpuDecPktQueue */ - 0x6ae, /* QDSP_txMpuEncQueue */ - 0x6ce, /* QDSP_uPAudPPCmd1Queue */ - 0x6d2, /* QDSP_uPAudPPCmd2Queue */ - 0x6d6, /* QDSP_uPAudPPCmd3Queue */ - 0x6e6, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x6da, /* QDSP_uPAudPreProcCmdQueue */ - 0x6e2, /* QDSP_uPAudRecBitStreamQueue */ - 0x6de, /* QDSP_uPAudRecCmdQueue */ - 0x6ee, /* QDSP_uPJpegActionCmdQueue */ - 0x6ea, /* QDSP_uPJpegCfgCmdQueue */ - 0x6a2, /* QDSP_uPVocProcQueue */ - 0x6b6, /* QDSP_vfeCommandQueue */ - 0x6be, /* QDSP_vfeCommandScaleQueue */ - 0x6ba /* QDSP_vfeCommandTableQueue */ -}; - -/* Table of modules indexed by task ID for the QTV_LP image */ -static qdsp_module_type qdsp_qtv_lp_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX -}; - -/* Queue offset table indexed by queue ID for the QTV_LP image */ -static uint32_t qdsp_qtv_lp_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x430, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - 0x434, /* QDSP_mpuVDecCmdQueue */ - 0x438, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x440, /* QDSP_uPAudPPCmd1Queue */ - 0x444, /* QDSP_uPAudPPCmd2Queue */ - 0x448, /* QDSP_uPAudPPCmd3Queue */ - 0x454, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x43c, /* QDSP_uPAudPreProcCmdQueue */ - 0x450, /* QDSP_uPAudRecBitStreamQueue */ - 0x44c, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE /* QDSP_vfeCommandTableQueue */ -}; - -/* Tables to convert tasks to modules */ -static qdsp_module_type *qdsp_task_to_module[] = { - qdsp_combo_task_to_module_table, - qdsp_gaudio_task_to_module_table, - qdsp_qtv_lp_task_to_module_table, -}; - -/* Tables to retrieve queue offsets */ -static uint32_t *qdsp_queue_offset_table[] = { - qdsp_combo_queue_offset_table, - qdsp_gaudio_queue_offset_table, - qdsp_qtv_lp_queue_offset_table, -}; - -#define QDSP_MODULE(n) \ - { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n } - -static struct adsp_module_info module_info[] = { - QDSP_MODULE(AUDPLAY0TASK), - QDSP_MODULE(AUDPPTASK), - QDSP_MODULE(AUDPREPROCTASK), - QDSP_MODULE(AUDRECTASK), - QDSP_MODULE(VFETASK), - QDSP_MODULE(QCAMTASK), - QDSP_MODULE(LPMTASK), - QDSP_MODULE(JPEGTASK), - QDSP_MODULE(VIDEOTASK), - QDSP_MODULE(VDEC_LP_MODE), -}; - -int adsp_init_info(struct adsp_info *info) -{ - info->send_irq = 0x00c00200; - info->read_ctrl = 0x00400038; - info->write_ctrl = 0x00400034; - - info->max_msg16_size = 193; - info->max_msg32_size = 8; - - info->max_task_id = 16; - info->max_module_id = QDSP_MODULE_MAX - 1; - info->max_queue_id = QDSP_QUEUE_MAX; - info->max_image_id = 2; - info->queue_offset = qdsp_queue_offset_table; - info->task_to_module = qdsp_task_to_module; - - info->module_count = ARRAY_SIZE(module_info); - info->module = module_info; - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_6225.c b/arch/arm/mach-msm/qdsp5/adsp_6225.c deleted file mode 100644 index 6a402b7037aa..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_6225.c +++ /dev/null @@ -1,328 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_6225.h - * - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "adsp.h" - -/* Firmware modules */ -typedef enum { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEO_AAC_VOC, - QDSP_MODULE_PCM_DEC, - QDSP_MODULE_AUDIO_DEC_MP3, - QDSP_MODULE_AUDIO_DEC_AAC, - QDSP_MODULE_AUDIO_DEC_WMA, - QDSP_MODULE_HOSTPCM, - QDSP_MODULE_DTMF, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_SBC_ENC, - QDSP_MODULE_VOC_UMTS, - QDSP_MODULE_VOC_CDMA, - QDSP_MODULE_VOC_PCM, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_WAV_ENC, - QDSP_MODULE_AACLC_ENC, - QDSP_MODULE_VIDEO_AMR, - QDSP_MODULE_VOC_AMR, - QDSP_MODULE_VOC_EVRC, - QDSP_MODULE_VOC_13K, - QDSP_MODULE_VOC_FGV, - QDSP_MODULE_DIAGTASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_QCAMTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MIDI, - QDSP_MODULE_GAUDIO, - QDSP_MODULE_VDEC_LP_MODE, - QDSP_MODULE_MAX, -} qdsp_module_type; - -#define QDSP_RTOS_MAX_TASK_ID 30U - -/* Table of modules indexed by task ID for the GAUDIO image */ -static qdsp_module_type qdsp_gaudio_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_AUDPLAY2TASK, - QDSP_MODULE_AUDPLAY3TASK, - QDSP_MODULE_AUDPLAY4TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_GRAPHICSTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, -}; - -/* Queue offset table indexed by queue ID for the GAUDIO image */ -static uint32_t qdsp_gaudio_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x3f0, /* QDSP_mpuAfeQueue */ - 0x420, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x3f4, /* QDSP_uPAudPPCmd1Queue */ - 0x3f8, /* QDSP_uPAudPPCmd2Queue */ - 0x3fc, /* QDSP_uPAudPPCmd3Queue */ - 0x40c, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - 0x410, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - 0x414, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - 0x418, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - 0x41c, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x400, /* QDSP_uPAudPreProcCmdQueue */ - 0x408, /* QDSP_uPAudRecBitStreamQueue */ - 0x404, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandTableQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPDiagQueue */ -}; - -/* Table of modules indexed by task ID for the COMBO image */ -static qdsp_module_type qdsp_combo_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_VOCDECTASK, - QDSP_MODULE_VOCENCTASK, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_VIDEOENCTASK, - QDSP_MODULE_VOICEPROCTASK, - QDSP_MODULE_VFETASK, - QDSP_MODULE_JPEGTASK, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_AUDPLAY1TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_LPMTASK, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MODMATHTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_DIAGTASK, - QDSP_MODULE_MAX, -}; - -/* Queue offset table indexed by queue ID for the COMBO image */ -static uint32_t qdsp_combo_queue_offset_table[] = { - 0x714, /* QDSP_lpmCommandQueue */ - 0x6bc, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - 0x6d0, /* QDSP_mpuModmathCmdQueue */ - 0x6e8, /* QDSP_mpuVDecCmdQueue */ - 0x6ec, /* QDSP_mpuVDecPktQueue */ - 0x6e4, /* QDSP_mpuVEncCmdQueue */ - 0x6c4, /* QDSP_rxMpuDecCmdQueue */ - 0x6c8, /* QDSP_rxMpuDecPktQueue */ - 0x6cc, /* QDSP_txMpuEncQueue */ - 0x6f0, /* QDSP_uPAudPPCmd1Queue */ - 0x6f4, /* QDSP_uPAudPPCmd2Queue */ - 0x6f8, /* QDSP_uPAudPPCmd3Queue */ - 0x708, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x6fc, /* QDSP_uPAudPreProcCmdQueue */ - 0x704, /* QDSP_uPAudRecBitStreamQueue */ - 0x700, /* QDSP_uPAudRecCmdQueue */ - 0x710, /* QDSP_uPJpegActionCmdQueue */ - 0x70c, /* QDSP_uPJpegCfgCmdQueue */ - 0x6c0, /* QDSP_uPVocProcQueue */ - 0x6d8, /* QDSP_vfeCommandQueue */ - 0x6e0, /* QDSP_vfeCommandScaleQueue */ - 0x6dc, /* QDSP_vfeCommandTableQueue */ - 0x6d4, /* QDSP_uPDiagQueue */ -}; - -/* Table of modules indexed by task ID for the QTV_LP image */ -static qdsp_module_type qdsp_qtv_lp_task_to_module_table[] = { - QDSP_MODULE_KERNEL, - QDSP_MODULE_AFETASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_VIDEOTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDPPTASK, - QDSP_MODULE_AUDPLAY0TASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_AUDRECTASK, - QDSP_MODULE_AUDPREPROCTASK, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, - QDSP_MODULE_MAX, -}; - -/* Queue offset table indexed by queue ID for the QTV_LP image */ -static uint32_t qdsp_qtv_lp_queue_offset_table[] = { - QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ - 0x3fe, /* QDSP_mpuAfeQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ - 0x402, /* QDSP_mpuVDecCmdQueue */ - 0x406, /* QDSP_mpuVDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ - 0x40e, /* QDSP_uPAudPPCmd1Queue */ - 0x412, /* QDSP_uPAudPPCmd2Queue */ - 0x416, /* QDSP_uPAudPPCmd3Queue */ - 0x422, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ - 0x40a, /* QDSP_uPAudPreProcCmdQueue */ - 0x41e, /* QDSP_uPAudRecBitStreamQueue */ - 0x41a, /* QDSP_uPAudRecCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandTableQueue */ - QDSP_RTOS_NO_QUEUE, /* QDSP_uPDiagQueue */ -}; - -/* Tables to convert tasks to modules */ -static qdsp_module_type *qdsp_task_to_module[] = { - qdsp_combo_task_to_module_table, - qdsp_gaudio_task_to_module_table, - qdsp_qtv_lp_task_to_module_table, -}; - -/* Tables to retrieve queue offsets */ -static uint32_t *qdsp_queue_offset_table[] = { - qdsp_combo_queue_offset_table, - qdsp_gaudio_queue_offset_table, - qdsp_qtv_lp_queue_offset_table, -}; - -#define QDSP_MODULE(n, clkname, clkrate, verify_cmd_func, patch_event_func) \ - { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n, \ - .clk_name = clkname, .clk_rate = clkrate, \ - .verify_cmd = verify_cmd_func, .patch_event = patch_event_func } - -static struct adsp_module_info module_info[] = { - QDSP_MODULE(AUDPLAY0TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPPTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDRECTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPREPROCTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(VFETASK, "vfe_clk", 0, adsp_vfe_verify_cmd, - adsp_vfe_patch_event), - QDSP_MODULE(QCAMTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(LPMTASK, NULL, 0, adsp_lpm_verify_cmd, NULL), - QDSP_MODULE(JPEGTASK, "vdc_clk", 0, adsp_jpeg_verify_cmd, - adsp_jpeg_patch_event), - QDSP_MODULE(VIDEOTASK, "vdc_clk", 96000000, - adsp_video_verify_cmd, NULL), - QDSP_MODULE(VDEC_LP_MODE, NULL, 0, NULL, NULL), - QDSP_MODULE(VIDEOENCTASK, "vdc_clk", 96000000, - adsp_videoenc_verify_cmd, NULL), -}; - -int adsp_init_info(struct adsp_info *info) -{ - info->send_irq = 0x00c00200; - info->read_ctrl = 0x00400038; - info->write_ctrl = 0x00400034; - - info->max_msg16_size = 193; - info->max_msg32_size = 8; - - info->max_task_id = 16; - info->max_module_id = QDSP_MODULE_MAX - 1; - info->max_queue_id = QDSP_QUEUE_MAX; - info->max_image_id = 2; - info->queue_offset = qdsp_queue_offset_table; - info->task_to_module = qdsp_task_to_module; - - info->module_count = ARRAY_SIZE(module_info); - info->module = module_info; - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_debug.c b/arch/arm/mach-msm/qdsp5/adsp_debug.c deleted file mode 100644 index ccddd43fe4bf..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_debug.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "adsp.h" - -#define MAX_LEN 64 -#ifdef CONFIG_DEBUG_FS -static struct dentry *adsp_dentry; -#endif -static char l_buf[MAX_LEN]; -static unsigned int crash_enable; - -static ssize_t q5_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_DBG("q5 debugfs opened\n"); - return 0; -} - -static ssize_t q5_debug_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int len; - - if (count < 0) - return 0; - len = count > (MAX_LEN - 1) ? (MAX_LEN - 1) : count; - if (copy_from_user(l_buf, buf, len)) { - MM_INFO("Unable to copy data from user space\n"); - return -EFAULT; - } - l_buf[len] = 0; - if (l_buf[len - 1] == '\n') { - l_buf[len - 1] = 0; - len--; - } - if (!strncmp(l_buf, "boom", MAX_LEN)) { - q5audio_dsp_not_responding(); - } else if (!strncmp(l_buf, "enable", MAX_LEN)) { - crash_enable = 1; - MM_INFO("Crash enabled : %d\n", crash_enable); - } else if (!strncmp(l_buf, "disable", MAX_LEN)) { - crash_enable = 0; - MM_INFO("Crash disabled : %d\n", crash_enable); - } else - MM_INFO("Unknown Command\n"); - - return count; -} - -static const struct file_operations q5_debug_fops = { - .write = q5_debug_write, - .open = q5_debug_open, -}; - -static int __init q5_debug_init(void) -{ -#ifdef CONFIG_DEBUG_FS - adsp_dentry = debugfs_create_file("q5_debug", S_IFREG | S_IRUGO, - NULL, (void *) NULL, &q5_debug_fops); -#endif /* CONFIG_DEBUG_FS */ - return 0; -} -device_initcall(q5_debug_init); - diff --git a/arch/arm/mach-msm/qdsp5/adsp_driver.c b/arch/arm/mach-msm/qdsp5/adsp_driver.c deleted file mode 100644 index 157fbc31efca..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_driver.c +++ /dev/null @@ -1,744 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_driver.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009, 2012-2013 The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp.h" -#include -#include - -struct adsp_ion_info { - int fd; - void *vaddr; -}; - -struct adsp_ion_region { - struct hlist_node list; - void *vaddr; - dma_addr_t paddr; - unsigned long kvaddr; - unsigned long len; - unsigned long ion_flag; - struct file *file; - struct ion_handle *handle; - struct ion_client *client; - int fd; -}; - -struct adsp_device { - struct msm_adsp_module *module; - - spinlock_t event_queue_lock; - wait_queue_head_t event_wait; - struct list_head event_queue; - int abort; - - const char *name; - struct device *device; - struct cdev cdev; -}; - -static struct adsp_device *inode_to_device(struct inode *inode); - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = __v >= __r->vaddr && \ - __e <= __r->vaddr + __r->len; \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -static int adsp_ion_check(struct msm_adsp_module *module, - void *vaddr, unsigned long len) -{ - struct adsp_ion_region *region_elt; - struct hlist_node *node; - struct adsp_ion_region t = { .vaddr = vaddr, .len = len }; - - hlist_for_each_entry(region_elt, node, &module->ion_regions, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - MM_ERR("module %s:" - " region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", - module->name, - vaddr, len, - region_elt->vaddr, - (void *)region_elt->paddr, - region_elt->len); - return -EINVAL; - } - } - - return 0; -} - -static int get_ion_region_info(int fd, struct adsp_ion_region *region) -{ - unsigned long ionflag; - void *temp_ptr; - int rc = -EINVAL; - - region->client = msm_ion_client_create(UINT_MAX, "Video_Client"); - if (IS_ERR_OR_NULL(region->client)) { - pr_err("Unable to create ION client\n"); - goto client_error; - } - region->handle = ion_import_dma_buf(region->client, fd); - if (IS_ERR_OR_NULL(region->handle)) { - pr_err("%s: could not get handle of the given fd\n", __func__); - goto import_error; - } - rc = ion_handle_get_flags(region->client, region->handle, &ionflag); - if (rc) { - pr_err("%s: could not get flags for the handle\n", __func__); - goto flag_error; - } - temp_ptr = ion_map_kernel(region->client, region->handle); - if (IS_ERR_OR_NULL(temp_ptr)) { - pr_err("%s: could not get virtual address\n", __func__); - goto map_error; - } - region->kvaddr = (unsigned long) temp_ptr; - region->ion_flag = (unsigned long) ionflag; - - rc = ion_phys(region->client, region->handle, ®ion->paddr, - (size_t *)(®ion->len)); - if (rc) { - pr_err("%s: could not get physical address\n", __func__); - goto ion_error; - } - return rc; -ion_error: - ion_unmap_kernel(region->client, region->handle); -map_error: - ion_free(region->client, region->handle); -flag_error: -import_error: - ion_client_destroy(region->client); -client_error: - return -EINVAL; -} - -static void free_ion_region(struct ion_client *client, - struct ion_handle *handle) -{ - ion_unmap_kernel(client, handle); - ion_free(client, handle); - ion_client_destroy(client); -} - -static int adsp_ion_add(struct msm_adsp_module *module, - struct adsp_ion_info *info) -{ - struct adsp_ion_region *region; - int rc = -EINVAL; - mutex_lock(&module->ion_regions_lock); - region = kmalloc(sizeof(struct adsp_ion_region), GFP_KERNEL); - if (!region) { - rc = -ENOMEM; - goto end; - } - INIT_HLIST_NODE(®ion->list); - if (get_ion_region_info(info->fd, region)) { - kfree(region); - goto end; - } - - rc = adsp_ion_check(module, info->vaddr, region->len); - if (rc < 0) { - free_ion_region(region->client, region->handle); - kfree(region); - goto end; - } - region->vaddr = info->vaddr; - region->fd = info->fd; - region->file = NULL; - MM_INFO("adsp_ion_add: module %s: fd %d, vaddr Ox%x, len %d\n", - module->name, region->fd, (unsigned int)region->vaddr, - (int)region->len); - hlist_add_head(®ion->list, &module->ion_regions); -end: - mutex_unlock(&module->ion_regions_lock); - return rc; -} - -static int adsp_ion_lookup_vaddr(struct msm_adsp_module *module, void **addr, - unsigned long len, struct adsp_ion_region **region) -{ - struct hlist_node *node; - void *vaddr = *addr; - struct adsp_ion_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - hlist_for_each_entry(region_elt, node, &module->ion_regions, list) { - if (vaddr >= region_elt->vaddr && - vaddr < region_elt->vaddr + region_elt->len && - vaddr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * pmem buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("module %s: " - "multiple hits for vaddr %p, len %ld\n", - module->name, vaddr, len); - hlist_for_each_entry(region_elt, node, - &module->ion_regions, list) { - if (vaddr >= region_elt->vaddr && - vaddr < region_elt->vaddr + region_elt->len && - vaddr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("%p, %ld --> %p\n", - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -int adsp_ion_do_cache_op(struct msm_adsp_module *module, - void *addr, void *paddr, unsigned long len, - unsigned long offset, int cmd) -{ - struct adsp_ion_region *region; - void *vaddr = addr; - int ret; - ret = adsp_ion_lookup_vaddr(module, &vaddr, len, ®ion); - if (ret) { - MM_ERR("not patching %s (paddr & kvaddr)," \ - " lookup (%p, %ld) failed\n", - module->name, vaddr, len); - return ret; - } - if ((region->ion_flag == ION_FLAG_CACHED) && region->handle) { - len = ((((len) + 31) & (~31)) + 32); - ret = msm_ion_do_cache_op(region->client, region->handle, - (void *)paddr, len, cmd); - } - return ret; -} -int adsp_ion_fixup_kvaddr(struct msm_adsp_module *module, void **addr, - unsigned long *kvaddr, unsigned long len, - struct file **filp, unsigned long *offset) -{ - struct adsp_ion_region *region; - void *vaddr = *addr; - unsigned long *paddr = (unsigned long *)addr; - int ret; - - ret = adsp_ion_lookup_vaddr(module, addr, len, ®ion); - if (ret) { - MM_ERR("not patching %s (paddr & kvaddr)," - " lookup (%p, %ld) failed\n", - module->name, vaddr, len); - return ret; - } - *paddr = region->paddr + (vaddr - region->vaddr); - *kvaddr = region->kvaddr + (vaddr - region->vaddr); - if (filp) - *filp = region->file; - if (offset) - *offset = vaddr - region->vaddr; - return 0; -} - -int adsp_pmem_fixup(struct msm_adsp_module *module, void **addr, - unsigned long len) -{ - struct adsp_ion_region *region; - void *vaddr = *addr; - unsigned long *paddr = (unsigned long *)addr; - int ret; - - ret = adsp_ion_lookup_vaddr(module, addr, len, ®ion); - if (ret) { - MM_ERR("not patching %s, lookup (%p, %ld) failed\n", - module->name, vaddr, len); - return ret; - } - - *paddr = region->paddr + (vaddr - region->vaddr); - return 0; -} - -static int adsp_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - /* call the per module verifier */ - if (module->verify_cmd) - return module->verify_cmd(module, queue_id, cmd_data, - cmd_size); - else - MM_INFO("no packet verifying function " - "for task %s\n", module->name); - return 0; -} - -static long adsp_write_cmd(struct adsp_device *adev, void __user *arg) -{ - struct adsp_command_t cmd; - unsigned char buf[256]; - void *cmd_data; - long rc; - - if (copy_from_user(&cmd, (void __user *)arg, sizeof(cmd))) - return -EFAULT; - - if (cmd.len > 256) { - cmd_data = kmalloc(cmd.len, GFP_USER); - if (!cmd_data) - return -ENOMEM; - } else { - cmd_data = buf; - } - - if (copy_from_user(cmd_data, (void __user *)(cmd.data), cmd.len)) { - rc = -EFAULT; - goto end; - } - - mutex_lock(&adev->module->ion_regions_lock); - if (adsp_verify_cmd(adev->module, cmd.queue, cmd_data, cmd.len)) { - MM_ERR("module %s: verify failed.\n", adev->module->name); - rc = -EINVAL; - goto end; - } - /* complete the writes to the buffer */ - wmb(); - rc = msm_adsp_write(adev->module, cmd.queue, cmd_data, cmd.len); -end: - mutex_unlock(&adev->module->ion_regions_lock); - - if (cmd.len > 256) - kfree(cmd_data); - - return rc; -} - -static int adsp_events_pending(struct adsp_device *adev) -{ - unsigned long flags; - int yes; - spin_lock_irqsave(&adev->event_queue_lock, flags); - yes = !list_empty(&adev->event_queue); - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - return yes || adev->abort; -} - -static int adsp_ion_lookup_paddr(struct msm_adsp_module *module, void **addr, - struct adsp_ion_region **region) -{ - struct hlist_node *node; - unsigned long paddr = (unsigned long)(*addr); - struct adsp_ion_region *region_elt; - - hlist_for_each_entry(region_elt, node, &module->ion_regions, list) { - if (paddr >= region_elt->paddr && - paddr < region_elt->paddr + region_elt->len) { - *region = region_elt; - return 0; - } - } - return -1; -} - -int adsp_pmem_paddr_fixup(struct msm_adsp_module *module, void **addr) -{ - struct adsp_ion_region *region; - unsigned long paddr = (unsigned long)(*addr); - unsigned long *vaddr = (unsigned long *)addr; - int ret; - - ret = adsp_ion_lookup_paddr(module, addr, ®ion); - if (ret) { - MM_ERR("not patching %s, paddr %p lookup failed\n", - module->name, vaddr); - return ret; - } - - *vaddr = (unsigned long)region->vaddr + (paddr - region->paddr); - return 0; -} - -static int adsp_patch_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - /* call the per-module msg verifier */ - if (module->patch_event) - return module->patch_event(module, event); - return 0; -} - -static long adsp_get_event(struct adsp_device *adev, void __user *arg) -{ - unsigned long flags; - struct adsp_event *data = NULL; - struct adsp_event_t evt; - int timeout; - long rc = 0; - - if (copy_from_user(&evt, arg, sizeof(struct adsp_event_t))) - return -EFAULT; - - timeout = (int)evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - adev->event_wait, adsp_events_pending(adev), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - adev->event_wait, adsp_events_pending(adev)); - } - if (rc < 0) - return rc; - - if (adev->abort) - return -ENODEV; - - spin_lock_irqsave(&adev->event_queue_lock, flags); - if (!list_empty(&adev->event_queue)) { - data = list_first_entry(&adev->event_queue, - struct adsp_event, list); - list_del(&data->list); - } - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - - if (!data) - return -EAGAIN; - - /* DSP messages are type 0; they may contain physical addresses */ - if (data->type == 0) - adsp_patch_event(adev->module, data); - - /* map adsp_event --> adsp_event_t */ - if (evt.len < data->size) { - rc = -ETOOSMALL; - goto end; - } - /* order the reads to the buffer */ - rmb(); - if (data->msg_id != EVENT_MSG_ID) { - if (copy_to_user((void *)(evt.data), data->data.msg16, - data->size)) { - rc = -EFAULT; - goto end; - } - } else { - if (copy_to_user((void *)(evt.data), data->data.msg32, - data->size)) { - rc = -EFAULT; - goto end; - } - } - - evt.type = data->type; /* 0 --> from aDSP, 1 --> from ARM9 */ - evt.msg_id = data->msg_id; - evt.flags = data->is16; - evt.len = data->size; - if (copy_to_user(arg, &evt, sizeof(evt))) - rc = -EFAULT; -end: - kfree(data); - return rc; -} - -static int adsp_ion_del(struct msm_adsp_module *module) -{ - struct hlist_node *node, *tmp; - struct adsp_ion_region *region; - - mutex_lock(&module->ion_regions_lock); - hlist_for_each_safe(node, tmp, &module->ion_regions) { - region = hlist_entry(node, struct adsp_ion_region, list); - hlist_del(node); - MM_INFO("adsp_ion_del: module %s: fd %d, vaddr Ox%x, len %d\n", - module->name, region->fd, (unsigned int)region->vaddr, - (int)region->len); - free_ion_region(region->client, region->handle); - kfree(region); - } - mutex_unlock(&module->ion_regions_lock); - BUG_ON(!hlist_empty(&module->ion_regions)); - - return 0; -} - -static long adsp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct adsp_device *adev = filp->private_data; - - switch (cmd) { - case ADSP_IOCTL_ENABLE: - return msm_adsp_enable(adev->module); - - case ADSP_IOCTL_DISABLE: - return msm_adsp_disable(adev->module); - - case ADSP_IOCTL_DISABLE_EVENT_RSP: - return msm_adsp_disable_event_rsp(adev->module); - - case ADSP_IOCTL_DISABLE_ACK: - MM_ERR("ADSP_IOCTL_DISABLE_ACK is not implemented\n"); - break; - - case ADSP_IOCTL_WRITE_COMMAND: - return adsp_write_cmd(adev, (void __user *) arg); - - case ADSP_IOCTL_GET_EVENT: - return adsp_get_event(adev, (void __user *) arg); - - case ADSP_IOCTL_SET_CLKRATE: { - unsigned long clk_rate; - if (copy_from_user(&clk_rate, (void *) arg, sizeof(clk_rate))) - return -EFAULT; - return adsp_set_clkrate(adev->module, clk_rate); - } - - case ADSP_IOCTL_REGISTER_PMEM: { - struct adsp_ion_info info; - if (copy_from_user(&info, (void *) arg, sizeof(info))) - return -EFAULT; - return adsp_ion_add(adev->module, &info); - } - - case ADSP_IOCTL_ABORT_EVENT_READ: - adev->abort = 1; - wake_up(&adev->event_wait); - break; - - case ADSP_IOCTL_UNREGISTER_PMEM: - return adsp_ion_del(adev->module); - - default: - break; - } - return -EINVAL; -} - -static int adsp_release(struct inode *inode, struct file *filp) -{ - struct adsp_device *adev = filp->private_data; - struct msm_adsp_module *module = adev->module; - int rc = 0; - - MM_INFO("release '%s'\n", adev->name); - - /* clear module before putting it to avoid race with open() */ - adev->module = NULL; - - rc = adsp_ion_del(module); - - msm_adsp_put(module); - return rc; -} - -static void adsp_event(void *driver_data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct adsp_device *adev = driver_data; - struct adsp_event *event; - unsigned long flags; - - if (len > ADSP_EVENT_MAX_SIZE) { - MM_ERR("event too large (%d bytes)\n", len); - return; - } - - event = kmalloc(sizeof(*event), GFP_ATOMIC); - if (!event) { - MM_ERR("cannot allocate buffer\n"); - return; - } - - if (id != EVENT_MSG_ID) { - event->type = 0; - event->is16 = 0; - event->msg_id = id; - event->size = len; - - getevent(event->data.msg16, len); - } else { - event->type = 1; - event->is16 = 1; - event->msg_id = id; - event->size = len; - getevent(event->data.msg32, len); - } - - spin_lock_irqsave(&adev->event_queue_lock, flags); - list_add_tail(&event->list, &adev->event_queue); - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - wake_up(&adev->event_wait); -} - -static struct msm_adsp_ops adsp_ops = { - .event = adsp_event, -}; - -static int adsp_open(struct inode *inode, struct file *filp) -{ - struct adsp_device *adev; - int rc; - - rc = nonseekable_open(inode, filp); - if (rc < 0) - return rc; - - adev = inode_to_device(inode); - if (!adev) - return -ENODEV; - - MM_INFO("open '%s'\n", adev->name); - - rc = msm_adsp_get(adev->name, &adev->module, &adsp_ops, adev); - if (rc) - return rc; - - MM_INFO("opened module '%s' adev %p\n", adev->name, adev); - filp->private_data = adev; - adev->abort = 0; - INIT_HLIST_HEAD(&adev->module->ion_regions); - mutex_init(&adev->module->ion_regions_lock); - - return 0; -} - -static unsigned adsp_device_count; -static struct adsp_device *adsp_devices; - -static struct adsp_device *inode_to_device(struct inode *inode) -{ - unsigned n = MINOR(inode->i_rdev); - if (n < adsp_device_count) { - if (adsp_devices[n].device) - return adsp_devices + n; - } - return NULL; -} - -static dev_t adsp_devno; -static struct class *adsp_class; - -static struct file_operations adsp_fops = { - .owner = THIS_MODULE, - .open = adsp_open, - .unlocked_ioctl = adsp_ioctl, - .release = adsp_release, -}; - -static void adsp_create(struct adsp_device *adev, const char *name, - struct device *parent, dev_t devt) -{ - struct device *dev; - int rc; - - dev = device_create(adsp_class, parent, devt, "%s", name); - if (IS_ERR(dev)) - return; - - init_waitqueue_head(&adev->event_wait); - INIT_LIST_HEAD(&adev->event_queue); - spin_lock_init(&adev->event_queue_lock); - - cdev_init(&adev->cdev, &adsp_fops); - adev->cdev.owner = THIS_MODULE; - - rc = cdev_add(&adev->cdev, devt, 1); - if (rc < 0) { - device_destroy(adsp_class, devt); - } else { - adev->device = dev; - adev->name = name; - } -} - -void msm_adsp_publish_cdevs(struct msm_adsp_module *modules, unsigned n) -{ - int rc; - - adsp_devices = kzalloc(sizeof(struct adsp_device) * n, GFP_KERNEL); - if (!adsp_devices) - return; - - adsp_class = class_create(THIS_MODULE, "adsp"); - if (IS_ERR(adsp_class)) - goto fail_create_class; - - rc = alloc_chrdev_region(&adsp_devno, 0, n, "adsp"); - if (rc < 0) - goto fail_alloc_region; - - adsp_device_count = n; - for (n = 0; n < adsp_device_count; n++) { - adsp_create(adsp_devices + n, - modules[n].name, &modules[n].pdev.dev, - MKDEV(MAJOR(adsp_devno), n)); - } - - return; - -fail_alloc_region: - class_unregister(adsp_class); -fail_create_class: - kfree(adsp_devices); -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_info.c b/arch/arm/mach-msm/qdsp5/adsp_info.c deleted file mode 100644 index 69a2d180860e..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_info.c +++ /dev/null @@ -1,144 +0,0 @@ -/* arch/arm/mach-msm/adsp_info.c - * - * Copyright (c) 2008-2009, 2011-2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "adsp.h" - -/* Firmware modules */ -#define QDSP_MODULE_KERNEL 0x0106dd4e -#define QDSP_MODULE_AFETASK 0x0106dd6f -#define QDSP_MODULE_AUDPLAY0TASK 0x0106dd70 -#define QDSP_MODULE_AUDPLAY1TASK 0x0106dd71 -#define QDSP_MODULE_AUDPPTASK 0x0106dd72 -#define QDSP_MODULE_VIDEOTASK 0x0106dd73 -#define QDSP_MODULE_VIDEO_AAC_VOC 0x0106dd74 -#define QDSP_MODULE_PCM_DEC 0x0106dd75 -#define QDSP_MODULE_AUDIO_DEC_MP3 0x0106dd76 -#define QDSP_MODULE_AUDIO_DEC_AAC 0x0106dd77 -#define QDSP_MODULE_AUDIO_DEC_WMA 0x0106dd78 -#define QDSP_MODULE_HOSTPCM 0x0106dd79 -#define QDSP_MODULE_DTMF 0x0106dd7a -#define QDSP_MODULE_AUDRECTASK 0x0106dd7b -#define QDSP_MODULE_AUDPREPROCTASK 0x0106dd7c -#define QDSP_MODULE_SBC_ENC 0x0106dd7d -#define QDSP_MODULE_VOC_UMTS 0x0106dd9a -#define QDSP_MODULE_VOC_CDMA 0x0106dd98 -#define QDSP_MODULE_VOC_PCM 0x0106dd7f -#define QDSP_MODULE_VOCENCTASK 0x0106dd80 -#define QDSP_MODULE_VOCDECTASK 0x0106dd81 -#define QDSP_MODULE_VOICEPROCTASK 0x0106dd82 -#define QDSP_MODULE_VIDEOENCTASK 0x0106dd83 -#define QDSP_MODULE_VFETASK 0x0106dd84 -#define QDSP_MODULE_WAV_ENC 0x0106dd85 -#define QDSP_MODULE_AACLC_ENC 0x0106dd86 -#define QDSP_MODULE_VIDEO_AMR 0x0106dd87 -#define QDSP_MODULE_VOC_AMR 0x0106dd88 -#define QDSP_MODULE_VOC_EVRC 0x0106dd89 -#define QDSP_MODULE_VOC_13K 0x0106dd8a -#define QDSP_MODULE_VOC_FGV 0x0106dd8b -#define QDSP_MODULE_DIAGTASK 0x0106dd8c -#define QDSP_MODULE_JPEGTASK 0x0106dd8d -#define QDSP_MODULE_LPMTASK 0x0106dd8e -#define QDSP_MODULE_QCAMTASK 0x0106dd8f -#define QDSP_MODULE_MODMATHTASK 0x0106dd90 -#define QDSP_MODULE_AUDPLAY2TASK 0x0106dd91 -#define QDSP_MODULE_AUDPLAY3TASK 0x0106dd92 -#define QDSP_MODULE_AUDPLAY4TASK 0x0106dd93 -#define QDSP_MODULE_GRAPHICSTASK 0x0106dd94 -#define QDSP_MODULE_MIDI 0x0106dd95 -#define QDSP_MODULE_GAUDIO 0x0106dd96 -#define QDSP_MODULE_VDEC_LP_MODE 0x0106dd97 -#define QDSP_MODULE_VIDEO_AAC_VOC_TURBO 0x01089f77 -#define QDSP_MODULE_VIDEO_AMR_TURBO 0x01089f78 -#define QDSP_MODULE_WM_TURBO_MODE 0x01089f79 -#define QDSP_MODULE_VDEC_LP_MODE_TURBO 0x01089f7a -#define QDSP_MODULE_AUDREC0TASK 0x0109696f -#define QDSP_MODULE_AUDREC1TASK 0x01096970 -#define QDSP_MODULE_RMTASK 0x01090f8e -#define QDSP_MODULE_MAX 0x7fffffff - - /* DO NOT USE: Force this enum to be a 32bit type to improve speed */ -#define QDSP_MODULE_32BIT_DUMMY 0x10000 - -static uint32_t *qdsp_task_to_module[IMG_MAX]; -static uint32_t *qdsp_queue_offset_table[IMG_MAX]; - -#define QDSP_MODULE(n, clkname, clkrate, verify_cmd_func, patch_event_func) \ - { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n, \ - .clk_name = clkname, .clk_rate = clkrate, \ - .verify_cmd = verify_cmd_func, .patch_event = patch_event_func } - -static struct adsp_module_info module_info[] = { - QDSP_MODULE(AUDPLAY0TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY1TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY2TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY3TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPPTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPREPROCTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(RMTASK, NULL, 0, NULL, NULL), -#if !defined(CONFIG_ARCH_MSM7X30) - QDSP_MODULE(AUDRECTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(VFETASK, NULL, 0, adsp_vfe_verify_cmd, - adsp_vfe_patch_event), - QDSP_MODULE(QCAMTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(LPMTASK, NULL, 0, adsp_lpm_verify_cmd, NULL), - QDSP_MODULE(JPEGTASK, "vdc_clk", 96000000, adsp_jpeg_verify_cmd, - adsp_jpeg_patch_event), - QDSP_MODULE(VIDEOTASK, "vdc_clk", 96000000, - adsp_video_verify_cmd, NULL), - QDSP_MODULE(VDEC_LP_MODE, NULL, 0, NULL, NULL), - QDSP_MODULE(VIDEOENCTASK, "vdc_clk", 96000000, - adsp_videoenc_verify_cmd, NULL), - QDSP_MODULE(VIDEO_AAC_VOC_TURBO, NULL, 0, NULL, NULL), - QDSP_MODULE(VIDEO_AMR_TURBO, NULL, 0, NULL, NULL), - QDSP_MODULE(WM_TURBO_MODE, NULL, 0, NULL, NULL), - QDSP_MODULE(VDEC_LP_MODE_TURBO, NULL, 0, NULL, NULL), -#if defined(CONFIG_MSM7X27A_AUDIO) - QDSP_MODULE(AUDREC1TASK, NULL, 0, NULL, NULL), -#endif -#else - QDSP_MODULE(AFETASK , NULL, 0, NULL, NULL), - QDSP_MODULE(AUDREC0TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDREC1TASK, NULL, 0, NULL, NULL), -#endif -}; - -int adsp_init_info(struct adsp_info *info) -{ - uint32_t img_num; - - info->send_irq = 0x00c00200; - info->read_ctrl = 0x00400038; - info->write_ctrl = 0x00400034; - - info->max_msg16_size = 193; - info->max_msg32_size = 8; - for (img_num = 0; img_num < IMG_MAX; img_num++) - qdsp_queue_offset_table[img_num] = - &info->init_info_ptr->queue_offsets[img_num][0]; - - for (img_num = 0; img_num < IMG_MAX; img_num++) - qdsp_task_to_module[img_num] = - &info->init_info_ptr->task_to_module_tbl[img_num][0]; - info->max_task_id = 30; - info->max_module_id = QDSP_MODULE_MAX - 1; - info->max_queue_id = QDSP_MAX_NUM_QUEUES; - info->max_image_id = 2; - info->queue_offset = qdsp_queue_offset_table; - info->task_to_module = qdsp_task_to_module; - - info->module_count = ARRAY_SIZE(module_info); - info->module = module_info; - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_jpeg_patch_event.c b/arch/arm/mach-msm/qdsp5/adsp_jpeg_patch_event.c deleted file mode 100644 index 768ac310d775..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_jpeg_patch_event.c +++ /dev/null @@ -1,39 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_jpeg_patch_event.c - * - * Verification code for aDSP JPEG events. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include "adsp.h" - -int adsp_jpeg_patch_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - if (event->msg_id == JPEG_MSG_ENC_OP_PRODUCED) { - jpeg_msg_enc_op_produced *op = (jpeg_msg_enc_op_produced *)event->data.msg16; - return adsp_pmem_paddr_fixup(module, (void **)&op->op_buf_addr); - } - if (event->msg_id == JPEG_MSG_DEC_OP_PRODUCED) { - jpeg_msg_dec_op_produced *op = (jpeg_msg_dec_op_produced *) - event->data.msg16; - return adsp_pmem_paddr_fixup(module, - (void **)&op->luma_op_buf_addr) || - adsp_pmem_paddr_fixup(module, - (void **)&op->chroma_op_buf_addr); - } - - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c b/arch/arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c deleted file mode 100644 index a5dd4ad3e5b4..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c +++ /dev/null @@ -1,201 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_jpeg_verify_cmd.c - * - * Verification code for aDSP JPEG packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include "adsp.h" -#include - -static uint32_t dec_fmt; - -static inline void get_sizes(jpeg_cmd_enc_cfg *cmd, uint32_t *luma_size, - uint32_t *chroma_size) -{ - uint32_t fmt, luma_width, luma_height; - - fmt = cmd->process_cfg & JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_M; - luma_width = (cmd->ip_size_cfg & JPEG_CMD_IP_SIZE_CFG_LUMA_WIDTH_M) - >> 16; - luma_height = cmd->frag_cfg & JPEG_CMD_FRAG_SIZE_LUMA_HEIGHT_M; - *luma_size = luma_width * luma_height; - if (fmt == JPEG_CMD_ENC_PROCESS_CFG_IP_DATA_FORMAT_H2V2) - *chroma_size = *luma_size/2; - else - *chroma_size = *luma_size; -} - -static inline int verify_jpeg_cmd_enc_cfg(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - jpeg_cmd_enc_cfg *cmd = (jpeg_cmd_enc_cfg *)cmd_data; - uint32_t luma_size, chroma_size; - int i, num_frags; - - if (cmd_size != sizeof(jpeg_cmd_enc_cfg)) { - MM_ERR("module %s: JPEG ENC CFG invalid \ - cmd_size %d\n", module->name, cmd_size); - return -1; - } - - get_sizes(cmd, &luma_size, &chroma_size); - num_frags = (cmd->process_cfg >> 10) & 0xf; - num_frags = ((num_frags == 1) ? num_frags : num_frags * 2); - for (i = 0; i < num_frags; i += 2) { - if (adsp_pmem_fixup(module, (void **)(&cmd->frag_cfg_part[i]), luma_size) || - adsp_pmem_fixup(module, (void **)(&cmd->frag_cfg_part[i+1]), chroma_size)) - return -1; - } - - if (adsp_pmem_fixup(module, (void **)&cmd->op_buf_0_cfg_part1, - cmd->op_buf_0_cfg_part2) || - adsp_pmem_fixup(module, (void **)&cmd->op_buf_1_cfg_part1, - cmd->op_buf_1_cfg_part2)) - return -1; - return 0; -} - -static inline int verify_jpeg_cmd_dec_cfg(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - jpeg_cmd_dec_cfg *cmd = (jpeg_cmd_dec_cfg *)cmd_data; - uint32_t div; - - if (cmd_size != sizeof(jpeg_cmd_dec_cfg)) { - MM_ERR("module %s: JPEG DEC CFG invalid \ - cmd_size %d\n", module->name, cmd_size); - return -1; - } - - if (adsp_pmem_fixup(module, (void **)&cmd->ip_stream_buf_cfg_part1, - cmd->ip_stream_buf_cfg_part2) || - adsp_pmem_fixup(module, (void **)&cmd->op_stream_buf_0_cfg_part1, - cmd->op_stream_buf_0_cfg_part2) || - adsp_pmem_fixup(module, (void **)&cmd->op_stream_buf_1_cfg_part1, - cmd->op_stream_buf_1_cfg_part2)) - return -1; - dec_fmt = cmd->op_data_format & - JPEG_CMD_DEC_OP_DATA_FORMAT_M; - div = (dec_fmt == JPEG_CMD_DEC_OP_DATA_FORMAT_H2V2) ? 2 : 1; - if (adsp_pmem_fixup(module, (void **)&cmd->op_stream_buf_0_cfg_part3, - cmd->op_stream_buf_0_cfg_part2 / div) || - adsp_pmem_fixup(module, (void **)&cmd->op_stream_buf_1_cfg_part3, - cmd->op_stream_buf_1_cfg_part2 / div)) - return -1; - return 0; -} - -static int verify_jpeg_cfg_cmd(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; - switch(cmd_id) { - case JPEG_CMD_ENC_CFG: - return verify_jpeg_cmd_enc_cfg(module, cmd_data, cmd_size); - case JPEG_CMD_DEC_CFG: - return verify_jpeg_cmd_dec_cfg(module, cmd_data, cmd_size); - default: - if (cmd_id > 1) { - MM_ERR("module %s: invalid JPEG CFG cmd_id %d\n", - module->name, cmd_id); - return -1; - } - } - return 0; -} - -static int verify_jpeg_action_cmd(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; - switch (cmd_id) { - case JPEG_CMD_ENC_OP_CONSUMED: - { - jpeg_cmd_enc_op_consumed *cmd = - (jpeg_cmd_enc_op_consumed *)cmd_data; - - if (cmd_size != sizeof(jpeg_cmd_enc_op_consumed)) { - MM_ERR("module %s: JPEG_CMD_ENC_OP_CONSUMED \ - invalid size %d\n", module->name, cmd_size); - return -1; - } - - if (adsp_pmem_fixup(module, (void **)&cmd->op_buf_addr, - cmd->op_buf_size)) - return -1; - } - break; - case JPEG_CMD_DEC_OP_CONSUMED: - { - uint32_t div; - jpeg_cmd_dec_op_consumed *cmd = - (jpeg_cmd_dec_op_consumed *)cmd_data; - - if (cmd_size != sizeof(jpeg_cmd_dec_op_consumed)) { - MM_ERR("module %s: JPEG_CMD_DEC_OP_CONSUMED \ - invalid size %d\n", module->name, cmd_size); - return -1; - } - - div = (dec_fmt == JPEG_CMD_DEC_OP_DATA_FORMAT_H2V2) ? 2 : 1; - if (adsp_pmem_fixup(module, (void **)&cmd->luma_op_buf_addr, - cmd->luma_op_buf_size) || - adsp_pmem_fixup(module, (void **)&cmd->chroma_op_buf_addr, - cmd->luma_op_buf_size / div)) - return -1; - } - break; - - case JPEG_CMD_DEC_IP: - { - jpeg_cmd_dec_ip *cmd = - (jpeg_cmd_dec_ip *)cmd_data; - - if (cmd_size != sizeof(jpeg_cmd_dec_ip)) { - MM_ERR("module %s: JPEG_CMD_DEC_IP invalid \ - size %d\n", module->name, cmd_size); - return -1; - } - if (adsp_pmem_fixup(module, (void **)&cmd->ip_buf_addr, - cmd->ip_buf_size)) - return -1; - } - break; - - default: - if (cmd_id > 7) { - MM_ERR("module %s: invalid cmd_id %d\n", - module->name, cmd_id); - return -1; - } - } - return 0; -} - -int adsp_jpeg_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - switch(queue_id) { - case QDSP_uPJpegCfgCmdQueue: - return verify_jpeg_cfg_cmd(module, cmd_data, cmd_size); - case QDSP_uPJpegActionCmdQueue: - return verify_jpeg_action_cmd(module, cmd_data, cmd_size); - default: - return -1; - } -} - diff --git a/arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c b/arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c deleted file mode 100644 index 6424975b2692..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c +++ /dev/null @@ -1,66 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c - * - * Verificion code for aDSP LPM packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include "adsp.h" -#include - -int adsp_lpm_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - uint32_t cmd_id, col_height, input_row_incr, output_row_incr, - input_size, output_size; - uint32_t size_mask = 0x0fff; - lpm_cmd_start *cmd; - - if (queue_id != QDSP_lpmCommandQueue) { - MM_ERR("module %s: wrong queue id %d\n", - module->name, queue_id); - return -1; - } - - cmd = (lpm_cmd_start *)cmd_data; - cmd_id = cmd->cmd_id; - - if (cmd_id == LPM_CMD_START) { - if (cmd_size != sizeof(lpm_cmd_start)) { - MM_ERR("module %s: wrong size %d, \ - expect %d\n", module->name, - cmd_size, sizeof(lpm_cmd_start)); - return -1; - } - col_height = cmd->ip_data_cfg_part1 & size_mask; - input_row_incr = cmd->ip_data_cfg_part2 & size_mask; - output_row_incr = cmd->op_data_cfg_part1 & size_mask; - input_size = col_height * input_row_incr; - output_size = col_height * output_row_incr; - if ((cmd->ip_data_cfg_part4 && adsp_pmem_fixup(module, - (void **)(&cmd->ip_data_cfg_part4), - input_size)) || - (cmd->op_data_cfg_part3 && adsp_pmem_fixup(module, - (void **)(&cmd->op_data_cfg_part3), - output_size))) - return -1; - } else if (cmd_id > 1) { - MM_ERR("module %s: invalid cmd_id %d\n", module->name, cmd_id); - return -1; - } - return 0; -} - diff --git a/arch/arm/mach-msm/qdsp5/adsp_rm.c b/arch/arm/mach-msm/qdsp5/adsp_rm.c deleted file mode 100644 index 95489f846c55..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_rm.c +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "adsp.h" - -#define MAX_CLIENTS 5 -#define MAX_AUDIO_CLIENTS 5 -#define MAX_RM_CLIENTS MAX_AUDIO_CLIENTS - -static char *rm_errs[] = { - "", - "PCM Blocks not Sufficient", - "TASK is already occupied", - "Concurrency not supported", - "MIPS not sufficient", - "DDP invalid/no licence" - }; -static struct client { - wait_queue_head_t wait; - unsigned int wait_state; - struct aud_codec_config_ack cfg_msg; -} rmclient[MAX_RM_CLIENTS]; - -static struct rm { - struct msm_adsp_module *mod; - int cnt; - int state; - - struct aud_codec_config_ack cfg_msg; - struct mutex lock; -} rmtask; - -static void rm_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)); -static struct msm_adsp_ops rm_ops = { - .event = rm_dsp_event, -}; - -int32_t get_adsp_resource(unsigned short client_id, - void *cmd_buf, size_t cmd_size) -{ - int rc = 0; - int client_idx; - - client_idx = ((client_id >> 8) * MAX_CLIENTS) + (client_id & 0xFF); - if (client_idx >= MAX_RM_CLIENTS) - return -EINVAL; - - mutex_lock(&rmtask.lock); - if (rmtask.state != ADSP_STATE_ENABLED) { - rc = msm_adsp_get("RMTASK", &rmtask.mod, &rm_ops, NULL); - if (rc) { - MM_ERR("Failed to get module RMTASK\n"); - mutex_unlock(&rmtask.lock); - return rc; - } - rc = msm_adsp_enable(rmtask.mod); - if (rc) { - MM_ERR("RMTASK enable Failed\n"); - msm_adsp_put(rmtask.mod); - mutex_unlock(&rmtask.lock); - return rc; - } - rmtask.state = ADSP_STATE_ENABLED; - } - rmclient[client_idx].wait_state = -1; - mutex_unlock(&rmtask.lock); - msm_adsp_write(rmtask.mod, QDSP_apuRmtQueue, cmd_buf, cmd_size); - rc = wait_event_interruptible_timeout(rmclient[client_idx].wait, - rmclient[client_idx].wait_state != -1, 5 * HZ); - mutex_lock(&rmtask.lock); - if (unlikely(rc < 0)) { - if (rc == -ERESTARTSYS) - MM_ERR("wait_event_interruptible " - "returned -ERESTARTSYS\n"); - else - MM_ERR("wait_event_interruptible " - "returned error\n"); - if (!rmtask.cnt) - goto disable_rm; - goto unlock; - } else if (rc == 0) { - MM_ERR("RMTASK Msg not received\n"); - rc = -ETIMEDOUT; - if (!rmtask.cnt) - goto disable_rm; - goto unlock; - } - if (!(rmclient[client_idx].cfg_msg.enable)) { - MM_ERR("Reason for failure: %s\n", - rm_errs[rmclient[client_idx].cfg_msg.reason]); - rc = -EBUSY; - if (!rmtask.cnt) - goto disable_rm; - goto unlock; - } - rmtask.cnt++; - mutex_unlock(&rmtask.lock); - return 0; - -disable_rm: - msm_adsp_disable(rmtask.mod); - msm_adsp_put(rmtask.mod); - rmtask.state = ADSP_STATE_DISABLED; -unlock: - mutex_unlock(&rmtask.lock); - return rc; -} -EXPORT_SYMBOL(get_adsp_resource); - -int32_t put_adsp_resource(unsigned short client_id, void *cmd_buf, - size_t cmd_size) -{ - mutex_lock(&rmtask.lock); - if (rmtask.state != ADSP_STATE_ENABLED) { - mutex_unlock(&rmtask.lock); - return 0; - } - - msm_adsp_write(rmtask.mod, QDSP_apuRmtQueue, cmd_buf, cmd_size); - rmtask.cnt--; - if (!rmtask.cnt) { - msm_adsp_disable(rmtask.mod); - msm_adsp_put(rmtask.mod); - rmtask.state = ADSP_STATE_DISABLED; - } - mutex_unlock(&rmtask.lock); - return 0; -} -EXPORT_SYMBOL(put_adsp_resource); - -static void rm_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - unsigned short client_id; - int client_idx; - - MM_DBG("Msg ID = %d\n", id); - - switch (id) { - case RMT_CODEC_CONFIG_ACK: { - getevent(&rmtask.cfg_msg, sizeof(rmtask.cfg_msg)); - client_id = ((rmtask.cfg_msg.client_id << 8) | - rmtask.cfg_msg.task_id); - client_idx = ((client_id >> 8) * MAX_CLIENTS) + - (client_id & 0xFF); - memcpy(&rmclient[client_idx].cfg_msg, &rmtask.cfg_msg, - sizeof(rmtask.cfg_msg)); - rmclient[client_idx].wait_state = 1; - wake_up(&rmclient[client_idx].wait); - break; - } - case RMT_DSP_OUT_OF_MIPS: { - struct rmt_dsp_out_of_mips msg; - getevent(&msg, sizeof(msg)); - MM_ERR("RMT_DSP_OUT_OF_MIPS: Not enough resorces in ADSP \ - to handle all sessions :%hx\n", msg.dec_info); - break; - } - default: - MM_DBG("Unknown Msg Id\n"); - break; - } -} - -void rmtask_init(void) -{ - int i; - - for (i = 0; i < MAX_RM_CLIENTS; i++) - init_waitqueue_head(&rmclient[i].wait); - mutex_init(&rmtask.lock); -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_vfe_patch_event.c b/arch/arm/mach-msm/qdsp5/adsp_vfe_patch_event.c deleted file mode 100644 index c89a37dafa7e..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_vfe_patch_event.c +++ /dev/null @@ -1,54 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_vfe_patch_event.c - * - * Verification code for aDSP VFE packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include "adsp.h" - -static int patch_op_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - vfe_msg_op1 *op = (vfe_msg_op1 *)event->data.msg16; - if (adsp_pmem_paddr_fixup(module, (void **)&op->op1_buf_y_addr) || - adsp_pmem_paddr_fixup(module, (void **)&op->op1_buf_cbcr_addr)) - return -1; - return 0; -} - -static int patch_af_wb_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - vfe_msg_stats_wb_exp *af = (vfe_msg_stats_wb_exp *)event->data.msg16; - return adsp_pmem_paddr_fixup(module, (void **)&af->wb_exp_stats_op_buf); -} - -int adsp_vfe_patch_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - switch(event->msg_id) { - case VFE_MSG_OP1: - case VFE_MSG_OP2: - return patch_op_event(module, event); - case VFE_MSG_STATS_AF: - case VFE_MSG_STATS_WB_EXP: - return patch_af_wb_event(module, event); - default: - break; - } - - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c b/arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c deleted file mode 100644 index dba012e25258..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c +++ /dev/null @@ -1,244 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_vfe_verify_cmd.c - * - * Verification code for aDSP VFE packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include "adsp.h" -#include - -static uint32_t size1_y, size2_y, size1_cbcr, size2_cbcr; -static uint32_t af_size = 4228; -static uint32_t awb_size = 8196; - -static inline int verify_cmd_op_ack(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - vfe_cmd_op1_ack *cmd = (vfe_cmd_op1_ack *)cmd_data; - void **addr_y = (void **)&cmd->op1_buf_y_addr; - void **addr_cbcr = (void **)(&cmd->op1_buf_cbcr_addr); - - if (cmd_size != sizeof(vfe_cmd_op1_ack)) - return -1; - if ((*addr_y && adsp_pmem_fixup(module, addr_y, size1_y)) || - (*addr_cbcr && adsp_pmem_fixup(module, addr_cbcr, size1_cbcr))) - return -1; - return 0; -} - -static inline int verify_cmd_stats_autofocus_cfg(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - int i; - vfe_cmd_stats_autofocus_cfg *cmd = - (vfe_cmd_stats_autofocus_cfg *)cmd_data; - - if (cmd_size != sizeof(vfe_cmd_stats_autofocus_cfg)) - return -1; - - for (i = 0; i < 3; i++) { - void **addr = (void **)(&cmd->af_stats_op_buf[i]); - if (*addr && adsp_pmem_fixup(module, addr, af_size)) - return -1; - } - return 0; -} - -static inline int verify_cmd_stats_wb_exp_cfg(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - vfe_cmd_stats_wb_exp_cfg *cmd = - (vfe_cmd_stats_wb_exp_cfg *)cmd_data; - int i; - - if (cmd_size != sizeof(vfe_cmd_stats_wb_exp_cfg)) - return -1; - - for (i = 0; i < 3; i++) { - void **addr = (void **)(&cmd->wb_exp_stats_op_buf[i]); - if (*addr && adsp_pmem_fixup(module, addr, awb_size)) - return -1; - } - return 0; -} - -static inline int verify_cmd_stats_af_ack(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - vfe_cmd_stats_af_ack *cmd = (vfe_cmd_stats_af_ack *)cmd_data; - void **addr = (void **)&cmd->af_stats_op_buf; - - if (cmd_size != sizeof(vfe_cmd_stats_af_ack)) - return -1; - - if (*addr && adsp_pmem_fixup(module, addr, af_size)) - return -1; - return 0; -} - -static inline int verify_cmd_stats_wb_exp_ack(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - vfe_cmd_stats_wb_exp_ack *cmd = - (vfe_cmd_stats_wb_exp_ack *)cmd_data; - void **addr = (void **)&cmd->wb_exp_stats_op_buf; - - if (cmd_size != sizeof(vfe_cmd_stats_wb_exp_ack)) - return -1; - - if (*addr && adsp_pmem_fixup(module, addr, awb_size)) - return -1; - return 0; -} - -static int verify_vfe_command(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; - switch (cmd_id) { - case VFE_CMD_OP1_ACK: - return verify_cmd_op_ack(module, cmd_data, cmd_size); - case VFE_CMD_OP2_ACK: - return verify_cmd_op_ack(module, cmd_data, cmd_size); - case VFE_CMD_STATS_AUTOFOCUS_CFG: - return verify_cmd_stats_autofocus_cfg(module, cmd_data, - cmd_size); - case VFE_CMD_STATS_WB_EXP_CFG: - return verify_cmd_stats_wb_exp_cfg(module, cmd_data, cmd_size); - case VFE_CMD_STATS_AF_ACK: - return verify_cmd_stats_af_ack(module, cmd_data, cmd_size); - case VFE_CMD_STATS_WB_EXP_ACK: - return verify_cmd_stats_wb_exp_ack(module, cmd_data, cmd_size); - default: - if (cmd_id > 29) { - MM_ERR("module %s: invalid VFE command id %d\n", - module->name, cmd_id); - return -1; - } - } - return 0; -} - -static int verify_vfe_command_scale(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; - // FIXME: check the size - if (cmd_id > 1) { - MM_ERR("module %s: invalid VFE SCALE command id %d\n", - module->name, cmd_id); - return -1; - } - return 0; -} - - -static uint32_t get_size(uint32_t hw) -{ - uint32_t height, width; - uint32_t height_mask = 0x3ffc; - uint32_t width_mask = 0x3ffc000; - - height = (hw & height_mask) >> 2; - width = (hw & width_mask) >> 14 ; - return height * width; -} - -static int verify_vfe_command_table(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; - int i; - - switch (cmd_id) { - case VFE_CMD_AXI_IP_CFG: - { - vfe_cmd_axi_ip_cfg *cmd = (vfe_cmd_axi_ip_cfg *)cmd_data; - uint32_t size; - if (cmd_size != sizeof(vfe_cmd_axi_ip_cfg)) { - MM_ERR("module %s: invalid VFE TABLE \ - (VFE_CMD_AXI_IP_CFG) command size %d\n", - module->name, cmd_size); - return -1; - } - size = get_size(cmd->ip_cfg_part2); - - for (i = 0; i < 8; i++) { - void **addr = (void **) - &cmd->ip_buf_addr[i]; - if (*addr && adsp_pmem_fixup(module, addr, size)) - return -1; - } - } - case VFE_CMD_AXI_OP_CFG: - { - vfe_cmd_axi_op_cfg *cmd = (vfe_cmd_axi_op_cfg *)cmd_data; - void **addr1_y, **addr2_y, **addr1_cbcr, **addr2_cbcr; - - if (cmd_size != sizeof(vfe_cmd_axi_op_cfg)) { - MM_ERR("module %s: invalid VFE TABLE \ - (VFE_CMD_AXI_OP_CFG) command size %d\n", - module->name, cmd_size); - return -1; - } - size1_y = get_size(cmd->op1_y_cfg_part2); - size1_cbcr = get_size(cmd->op1_cbcr_cfg_part2); - size2_y = get_size(cmd->op2_y_cfg_part2); - size2_cbcr = get_size(cmd->op2_cbcr_cfg_part2); - for (i = 0; i < 8; i++) { - addr1_y = (void **)(&cmd->op1_buf1_addr[2*i]); - addr1_cbcr = (void **)(&cmd->op1_buf1_addr[2*i+1]); - addr2_y = (void **)(&cmd->op2_buf1_addr[2*i]); - addr2_cbcr = (void **)(&cmd->op2_buf1_addr[2*i+1]); -/* - printk("module %s: [%d] %p %p %p %p\n", - module->name, i, - *addr1_y, *addr1_cbcr, *addr2_y, *addr2_cbcr); -*/ - if ((*addr1_y && adsp_pmem_fixup(module, addr1_y, size1_y)) || - (*addr1_cbcr && adsp_pmem_fixup(module, addr1_cbcr, size1_cbcr)) || - (*addr2_y && adsp_pmem_fixup(module, addr2_y, size2_y)) || - (*addr2_cbcr && adsp_pmem_fixup(module, addr2_cbcr, size2_cbcr))) - return -1; - } - } - default: - if (cmd_id > 4) { - MM_ERR("module %s: invalid VFE TABLE command \ - id %d\n", module->name, cmd_id); - return -1; - } - } - return 0; -} - -int adsp_vfe_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - switch (queue_id) { - case QDSP_vfeCommandQueue: - return verify_vfe_command(module, cmd_data, cmd_size); - case QDSP_vfeCommandScaleQueue: - return verify_vfe_command_scale(module, cmd_data, cmd_size); - case QDSP_vfeCommandTableQueue: - return verify_vfe_command_table(module, cmd_data, cmd_size); - default: - MM_ERR("module %s: unknown queue id %d\n", - module->name, queue_id); - return -1; - } -} diff --git a/arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c b/arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c deleted file mode 100644 index 62d6d58d1b60..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c +++ /dev/null @@ -1,264 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c - * - * Verificion code for aDSP VDEC packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2010, 2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include - -#include -#include "adsp.h" -#include - -#define MAX_FLUSH_SIZE 160 - -static inline void *high_low_short_to_ptr(unsigned short high, - unsigned short low) -{ - return (void *)((((unsigned long)high) << 16) | ((unsigned long)low)); -} - -static inline void ptr_to_high_low_short(void *ptr, unsigned short *high, - unsigned short *low) -{ - *high = (unsigned short)((((unsigned long)ptr) >> 16) & 0xffff); - *low = (unsigned short)((unsigned long)ptr & 0xffff); -} - -static int pmem_fixup_high_low(unsigned short *high, - unsigned short *low, - unsigned short size_high, - unsigned short size_low, - struct msm_adsp_module *module, - unsigned long *addr, unsigned long *size, - struct file **filp, unsigned long *offset) -{ - void *phys_addr; - unsigned long phys_size; - unsigned long kvaddr; - - phys_addr = high_low_short_to_ptr(*high, *low); - phys_size = (unsigned long)high_low_short_to_ptr(size_high, size_low); - MM_DBG("virt %x %x\n", (unsigned int)phys_addr, - (unsigned int)phys_size); - if (phys_addr) { - if (adsp_ion_fixup_kvaddr(module, &phys_addr, - &kvaddr, phys_size, filp, offset)) { - MM_ERR("ah%x al%x sh%x sl%x addr %x size %x\n", - *high, *low, size_high, - size_low, (unsigned int)phys_addr, - (unsigned int)phys_size); - return -EINVAL; - } - } - ptr_to_high_low_short(phys_addr, high, low); - MM_DBG("phys %x %x\n", (unsigned int)phys_addr, - (unsigned int)phys_size); - if (addr) - *addr = kvaddr; - if (size) - *size = phys_size; - return 0; -} - -static int verify_vdec_pkt_cmd(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - void *phys_addr; - unsigned short cmd_id = ((unsigned short *)cmd_data)[0]; - viddec_cmd_subframe_pkt *pkt; - unsigned long subframe_pkt_addr; - unsigned long subframe_pkt_size; - unsigned short *frame_header_pkt; - int i, num_addr, col_addr = 0, skip; - int start_pos = 0, xdim_pos = 1, ydim_pos = 2; - unsigned short *frame_buffer_high, *frame_buffer_low; - unsigned long frame_buffer_size; - unsigned short frame_buffer_size_high, frame_buffer_size_low; - struct file *filp = NULL; - unsigned long offset = 0; - unsigned long Codec_Id = 0; - - MM_DBG("cmd_size %d cmd_id %d cmd_data %x\n", cmd_size, cmd_id, - (unsigned int)cmd_data); - if (cmd_id != VIDDEC_CMD_SUBFRAME_PKT) { - MM_INFO("adsp_video: unknown video packet %u\n", cmd_id); - return 0; - } - if (cmd_size < sizeof(viddec_cmd_subframe_pkt)) - return -1; - - pkt = (viddec_cmd_subframe_pkt *)cmd_data; - phys_addr = high_low_short_to_ptr(pkt->subframe_packet_high, - pkt->subframe_packet_low); - - if (pmem_fixup_high_low(&(pkt->subframe_packet_high), - &(pkt->subframe_packet_low), - pkt->subframe_packet_size_high, - pkt->subframe_packet_size_low, - module, - &subframe_pkt_addr, - &subframe_pkt_size, - &filp, &offset)) - return -1; - Codec_Id = pkt->codec_selection_word; - /*Invalidate cache before accessing the cached pmem buffer*/ - if (adsp_ion_do_cache_op(module, phys_addr, (void *)subframe_pkt_addr, - subframe_pkt_size*2, offset, ION_IOC_INV_CACHES)){ - MM_ERR("Cache operation failed for" \ - " phys addr high %x addr low %x\n", - pkt->subframe_packet_high, pkt->subframe_packet_low); - return -EINVAL; - } - /* deref those ptrs and check if they are a frame header packet */ - frame_header_pkt = (unsigned short *)subframe_pkt_addr; - switch (frame_header_pkt[0]) { - case 0xB201: /* h.264 vld in dsp */ - if (Codec_Id == 0x8) { - num_addr = 16; - skip = 0; - start_pos = 5; - } else { - num_addr = 16; - skip = 0; - start_pos = 6; - col_addr = 17; - } - break; - case 0x8201: /* h.264 vld in arm */ - num_addr = 16; - skip = 0; - start_pos = 6; - break; - case 0x4D01: /* mpeg-4 and h.263 vld in arm */ - num_addr = 3; - skip = 0; - start_pos = 5; - break; - case 0x9201: /*For Real Decoder*/ - num_addr = 2; - skip = 0; - start_pos = 5; - break; - case 0xBD01: /* mpeg-4 and h.263 vld in dsp */ - num_addr = 3; - skip = 0; - start_pos = 6; - if (((frame_header_pkt[5] & 0x000c) >> 2) == 0x2) /* B-frame */ - start_pos = 8; - break; - case 0x0001: /* wmv */ - num_addr = 2; - skip = 0; - start_pos = 5; - break; - case 0xC201: /*WMV main profile*/ - num_addr = 3; - skip = 0; - start_pos = 6; - break; - case 0xDD01: /* VP6 */ - num_addr = 3; - skip = 0; - start_pos = 10; - break; - case 0xFD01: /* VP8 */ - num_addr = 3; - skip = 0; - start_pos = 24; - break; - default: - return 0; - } - - frame_buffer_high = &frame_header_pkt[start_pos]; - frame_buffer_low = &frame_header_pkt[start_pos + 1]; - frame_buffer_size = (frame_header_pkt[xdim_pos] * - frame_header_pkt[ydim_pos] * 3) / 2; - ptr_to_high_low_short((void *)frame_buffer_size, - &frame_buffer_size_high, - &frame_buffer_size_low); - for (i = 0; i < num_addr; i++) { - if (frame_buffer_high && frame_buffer_low) { - if (pmem_fixup_high_low(frame_buffer_high, - frame_buffer_low, - frame_buffer_size_high, - frame_buffer_size_low, - module, - NULL, NULL, NULL, NULL)) - return -EINVAL; - } - frame_buffer_high += 2; - frame_buffer_low += 2; - } - /* Patch the output buffer. */ - frame_buffer_high += 2*skip; - frame_buffer_low += 2*skip; - if (frame_buffer_high && frame_buffer_low) { - if (pmem_fixup_high_low(frame_buffer_high, - frame_buffer_low, - frame_buffer_size_high, - frame_buffer_size_low, - module, - NULL, NULL, NULL, NULL)) - return -EINVAL; - } - if (col_addr) { - frame_buffer_high += 2; - frame_buffer_low += 2; - /* Patch the Co-located buffers.*/ - frame_buffer_size = (72 * frame_header_pkt[xdim_pos] * - frame_header_pkt[ydim_pos]) >> 16; - ptr_to_high_low_short((void *)frame_buffer_size, - &frame_buffer_size_high, - &frame_buffer_size_low); - for (i = 0; i < col_addr; i++) { - if (frame_buffer_high && frame_buffer_low) { - if (pmem_fixup_high_low(frame_buffer_high, - frame_buffer_low, - frame_buffer_size_high, - frame_buffer_size_low, - module, - NULL, NULL, NULL, NULL)) - return -EINVAL; - } - frame_buffer_high += 2; - frame_buffer_low += 2; - } - } - /*Flush the cached mem subframe packet before sending to DSP*/ - if (adsp_ion_do_cache_op(module, phys_addr, (void *)subframe_pkt_addr, - MAX_FLUSH_SIZE, offset, ION_IOC_CLEAN_CACHES)){ - MM_ERR("Cache operation failed for" \ - " phys addr high %x addr low %x\n", - pkt->subframe_packet_high, pkt->subframe_packet_low); - return -EINVAL; - } - return 0; -} - -int adsp_video_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - switch (queue_id) { - case QDSP_mpuVDecPktQueue: - return verify_vdec_pkt_cmd(module, cmd_data, cmd_size); - default: - MM_INFO("unknown video queue %u\n", queue_id); - return 0; - } -} - diff --git a/arch/arm/mach-msm/qdsp5/adsp_videoenc_verify_cmd.c b/arch/arm/mach-msm/qdsp5/adsp_videoenc_verify_cmd.c deleted file mode 100644 index 1b16628b27d8..000000000000 --- a/arch/arm/mach-msm/qdsp5/adsp_videoenc_verify_cmd.c +++ /dev/null @@ -1,235 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/adsp_video_verify_cmd.c - * - * Verificion code for aDSP VENC packets from userspace. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, 2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include - -#include -#include "adsp.h" -#include - - -static unsigned short x_dimension, y_dimension; - -static inline void *high_low_short_to_ptr(unsigned short high, - unsigned short low) -{ - return (void *)((((unsigned long)high) << 16) | ((unsigned long)low)); -} - -static inline void ptr_to_high_low_short(void *ptr, unsigned short *high, - unsigned short *low) -{ - *high = (unsigned short)((((unsigned long)ptr) >> 16) & 0xffff); - *low = (unsigned short)((unsigned long)ptr & 0xffff); -} - -static int pmem_fixup_high_low(unsigned short *high, - unsigned short *low, - unsigned short size_high, - unsigned short size_low, - struct msm_adsp_module *module, - unsigned long *addr, unsigned long *size) -{ - void *phys_addr; - unsigned long phys_size; - unsigned long kvaddr; - - phys_addr = high_low_short_to_ptr(*high, *low); - phys_size = (unsigned long)high_low_short_to_ptr(size_high, size_low); - MM_DBG("virt %x %x\n", (unsigned int)phys_addr, - (unsigned int)phys_size); - if (adsp_ion_fixup_kvaddr(module, &phys_addr, &kvaddr, phys_size, - NULL, NULL)) { - MM_ERR("ah%x al%x sh%x sl%x addr %x size %x\n", - *high, *low, size_high, - size_low, (unsigned int)phys_addr, - (unsigned int) phys_size); - return -1; - } - ptr_to_high_low_short(phys_addr, high, low); - MM_DBG("phys %x %x\n", (unsigned int)phys_addr, - (unsigned int)phys_size); - if (addr) - *addr = kvaddr; - if (size) - *size = phys_size; - return 0; -} - -static int verify_venc_cmd(struct msm_adsp_module *module, - void *cmd_data, size_t cmd_size) -{ - unsigned short cmd_id = ((unsigned short *)cmd_data)[0]; - unsigned long frame_buf_size, luma_buf_size, chroma_buf_size; - unsigned short frame_buf_size_high, frame_buf_size_low; - unsigned short luma_buf_size_high, luma_buf_size_low; - unsigned short chroma_buf_size_high, chroma_buf_size_low; - videnc_cmd_cfg *config_cmd; - videnc_cmd_frame_start *frame_cmd; - videnc_cmd_dis *dis_cmd; - - MM_DBG("cmd_size %d cmd_id %d cmd_data %x\n", - cmd_size, cmd_id, (unsigned int)cmd_data); - switch (cmd_id) { - case VIDENC_CMD_ACTIVE: - if (cmd_size < sizeof(videnc_cmd_active)) - return -1; - break; - case VIDENC_CMD_IDLE: - if (cmd_size < sizeof(videnc_cmd_idle)) - return -1; - x_dimension = y_dimension = 0; - break; - case VIDENC_CMD_STATUS_QUERY: - if (cmd_size < sizeof(videnc_cmd_status_query)) - return -1; - break; - case VIDENC_CMD_RC_CFG: - if (cmd_size < sizeof(videnc_cmd_rc_cfg)) - return -1; - break; - case VIDENC_CMD_INTRA_REFRESH: - if (cmd_size < sizeof(videnc_cmd_intra_refresh)) - return -1; - break; - case VIDENC_CMD_DIGITAL_ZOOM: - if (cmd_size < sizeof(videnc_cmd_digital_zoom)) - return -1; - break; - case VIDENC_CMD_DIS_CFG: - if (cmd_size < sizeof(videnc_cmd_dis_cfg)) - return -1; - break; - case VIDENC_CMD_VENC_CLOCK: - if (cmd_size < sizeof(struct videnc_cmd_venc_clock)) - return -1; - break; - case VIDENC_CMD_CFG: - if (cmd_size < sizeof(videnc_cmd_cfg)) - return -1; - config_cmd = (videnc_cmd_cfg *)cmd_data; - x_dimension = ((config_cmd->venc_frame_dim) & 0xFF00)>>8; - x_dimension = x_dimension*16; - y_dimension = (config_cmd->venc_frame_dim) & 0xFF; - y_dimension = y_dimension * 16; - break; - case VIDENC_CMD_FRAME_START: - if (cmd_size < sizeof(videnc_cmd_frame_start)) - return -1; - frame_cmd = (videnc_cmd_frame_start *)cmd_data; - luma_buf_size = x_dimension * y_dimension; - chroma_buf_size = luma_buf_size>>1; - frame_buf_size = luma_buf_size + chroma_buf_size; - ptr_to_high_low_short((void *)luma_buf_size, - &luma_buf_size_high, - &luma_buf_size_low); - ptr_to_high_low_short((void *)chroma_buf_size, - &chroma_buf_size_high, - &chroma_buf_size_low); - ptr_to_high_low_short((void *)frame_buf_size, - &frame_buf_size_high, - &frame_buf_size_low); - /* Address of raw Y data. */ - if (pmem_fixup_high_low(&frame_cmd->input_luma_addr_high, - &frame_cmd->input_luma_addr_low, - luma_buf_size_high, - luma_buf_size_low, - module, - NULL, NULL)) - return -1; - /* Address of raw CbCr data */ - if (pmem_fixup_high_low(&frame_cmd->input_chroma_addr_high, - &frame_cmd->input_chroma_addr_low, - chroma_buf_size_high, - chroma_buf_size_low, - module, - NULL, NULL)) - return -1; - /* Reference VOP */ - if (pmem_fixup_high_low(&frame_cmd->ref_vop_buf_ptr_high, - &frame_cmd->ref_vop_buf_ptr_low, - frame_buf_size_high, - frame_buf_size_low, - module, - NULL, NULL)) - return -1; - /* Encoded Packet Address */ - if (pmem_fixup_high_low(&frame_cmd->enc_pkt_buf_ptr_high, - &frame_cmd->enc_pkt_buf_ptr_low, - frame_cmd->enc_pkt_buf_size_high, - frame_cmd->enc_pkt_buf_size_low, - module, - NULL, NULL)) - return -1; - /* Unfiltered VOP Buffer Address */ - if (pmem_fixup_high_low( - &frame_cmd->unfilt_recon_vop_buf_ptr_high, - &frame_cmd->unfilt_recon_vop_buf_ptr_low, - frame_buf_size_high, - frame_buf_size_low, - module, - NULL, NULL)) - return -1; - /* Filtered VOP Buffer Address */ - if (pmem_fixup_high_low(&frame_cmd->filt_recon_vop_buf_ptr_high, - &frame_cmd->filt_recon_vop_buf_ptr_low, - frame_buf_size_high, - frame_buf_size_low, - module, - NULL, NULL)) - return -1; - break; - case VIDENC_CMD_DIS: - if (cmd_size < sizeof(videnc_cmd_dis)) - return -1; - dis_cmd = (videnc_cmd_dis *)cmd_data; - luma_buf_size = x_dimension * y_dimension; - ptr_to_high_low_short((void *)luma_buf_size, - &luma_buf_size_high, - &luma_buf_size_low); - /* Prev VFE Luma Output Address */ - if (pmem_fixup_high_low(&dis_cmd->vfe_out_prev_luma_addr_high, - &dis_cmd->vfe_out_prev_luma_addr_low, - luma_buf_size_high, - luma_buf_size_low, - module, - NULL, NULL)) - return -1; - break; - default: - MM_INFO("adsp_video:unknown encoder video cmd %u\n", cmd_id); - return 0; - } - - return 0; -} - - -int adsp_videoenc_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - switch (queue_id) { - case QDSP_mpuVEncCmdQueue: - return verify_venc_cmd(module, cmd_data, cmd_size); - default: - MM_INFO("unknown video queue %u\n", queue_id); - return 0; - } -} - diff --git a/arch/arm/mach-msm/qdsp5/audio_aac.c b/arch/arm/mach-msm/qdsp5/audio_aac.c deleted file mode 100644 index d23cdcfdec36..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_aac.c +++ /dev/null @@ -1,1972 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_aac.c - * - * aac audio decoder device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2008-2009, 2011-2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define BUFSZ 32768 -#define DMASZ (BUFSZ * 2) -#define BUFSZ_MIN 4096 -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AAC 5 - -#define PCM_BUFSZ_MIN 9600 /* Hold one stereo AAC frame */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAAC_METAFIELD_MASK 0xFFFF0000 -#define AUDAAC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAAC_EOS_FLG_MASK 0x01 -#define AUDAAC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAAC_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAAC_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audaac_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audaac_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - void *map_v_read; - void *map_v_write; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - struct msm_audio_aac_config aac_config; - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int eos_in_progress; - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int rmt_resource_released; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audaac_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - struct msm_audio_bitstream_info stream_info; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audaac_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_AAC; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_AAC; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AAC \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_AAC; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} -static void audaac_update_stream_info(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload e_payload; - - /* get stream info from DSP msg */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->stream_info.codec_type = AUDIO_CODEC_TYPE_AAC; - audio->stream_info.chan_info = (0x0000FFFF & payload[1]); - audio->stream_info.sample_rate = (0x0000FFFF & payload[2]); - audio->stream_info.bit_stream_info = (0x0000FFFF & payload[3]); - audio->stream_info.bit_rate = payload[4]; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("chan_info=%d, sample_rate=%d, bit_stream_info=%d\n", - audio->stream_info.chan_info, - audio->stream_info.sample_rate, - audio->stream_info.bit_stream_info); - - /* send event to ARM to notify steam info coming */ - e_payload.stream_info = audio->stream_info; - audaac_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); -} -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case AUDPLAY_UP_STREAM_INFO: - audaac_update_stream_info(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_aac = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id,\ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AAC; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - audpp_cmd_cfg_adec_params_aac cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_AAC_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.format = audio->aac_config.format; - cmd.audio_object = audio->aac_config.audio_object; - cmd.ep_config = audio->aac_config.ep_config; - cmd.aac_section_data_resilience_flag = - audio->aac_config.aac_section_data_resilience_flag; - cmd.aac_scalefactor_data_resilience_flag = - audio->aac_config.aac_scalefactor_data_resilience_flag; - cmd.aac_spectral_data_resilience_flag = - audio->aac_config.aac_spectral_data_resilience_flag; - cmd.sbr_on_flag = audio->aac_config.sbr_on_flag; - cmd.sbr_ps_on_flag = audio->aac_config.sbr_ps_on_flag; - cmd.channel_configuration = audio->aac_config.channel_configuration; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAAC_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - /* complete all the writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - /* AAC frame size */ - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % 1024) - + (audio->mfield ? 24 : 0); - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } else if ((audio->out[0].used == 0) && - (audio->out[1].used == 0) && - (audio->eos_in_progress)) { - wake_up(&audio->write_wait); - } - - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static int audaac_validate_usr_config(struct msm_audio_aac_config *config) -{ - int ret_val = -1; - - if (config->format != AUDIO_AAC_FORMAT_ADTS && - config->format != AUDIO_AAC_FORMAT_RAW && - config->format != AUDIO_AAC_FORMAT_PSUEDO_RAW && - config->format != AUDIO_AAC_FORMAT_LOAS) - goto done; - - if (config->audio_object != AUDIO_AAC_OBJECT_LC && - config->audio_object != AUDIO_AAC_OBJECT_LTP && - config->audio_object != AUDIO_AAC_OBJECT_BSAC && - config->audio_object != AUDIO_AAC_OBJECT_ERLC) - goto done; - - if (config->audio_object == AUDIO_AAC_OBJECT_ERLC) { - if (config->ep_config > 3) - goto done; - if (config->aac_scalefactor_data_resilience_flag != - AUDIO_AAC_SCA_DATA_RES_OFF && - config->aac_scalefactor_data_resilience_flag != - AUDIO_AAC_SCA_DATA_RES_ON) - goto done; - if (config->aac_section_data_resilience_flag != - AUDIO_AAC_SEC_DATA_RES_OFF && - config->aac_section_data_resilience_flag != - AUDIO_AAC_SEC_DATA_RES_ON) - goto done; - if (config->aac_spectral_data_resilience_flag != - AUDIO_AAC_SPEC_DATA_RES_OFF && - config->aac_spectral_data_resilience_flag != - AUDIO_AAC_SPEC_DATA_RES_ON) - goto done; - } else { - config->aac_section_data_resilience_flag = - AUDIO_AAC_SEC_DATA_RES_OFF; - config->aac_scalefactor_data_resilience_flag = - AUDIO_AAC_SCA_DATA_RES_OFF; - config->aac_spectral_data_resilience_flag = - AUDIO_AAC_SPEC_DATA_RES_OFF; - } - -#ifndef CONFIG_AUDIO_AAC_PLUS - if (AUDIO_AAC_SBR_ON_FLAG_OFF != config->sbr_on_flag) - goto done; -#else - if (config->sbr_on_flag != AUDIO_AAC_SBR_ON_FLAG_OFF && - config->sbr_on_flag != AUDIO_AAC_SBR_ON_FLAG_ON) - goto done; -#endif - -#ifndef CONFIG_AUDIO_ENHANCED_AAC_PLUS - if (AUDIO_AAC_SBR_PS_ON_FLAG_OFF != config->sbr_ps_on_flag) - goto done; -#else - if (config->sbr_ps_on_flag != AUDIO_AAC_SBR_PS_ON_FLAG_OFF && - config->sbr_ps_on_flag != AUDIO_AAC_SBR_PS_ON_FLAG_ON) - goto done; -#endif - - if (config->dual_mono_mode > AUDIO_AAC_DUAL_MONO_PL_SR) - goto done; - - if (config->channel_configuration > 2) - goto done; - - ret_val = 0; - done: - return ret_val; -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audaac_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audaac_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audaac_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audaac_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audaac_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audaac_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audaac_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(struct msm_audio_stats)); - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audaac_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH running=%d\n", audio->running); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - - if (config.channel_count == 1) { - config.channel_count = - AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = - AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == - AUDPP_CMD_PCM_INTF_MONO_V) { - config.channel_count = 1; - } else { - config.channel_count = 2; - } - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_AAC_CONFIG:{ - if (copy_to_user((void *)arg, &audio->aac_config, - sizeof(audio->aac_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_AAC_CONFIG:{ - struct msm_audio_aac_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - if (audaac_validate_usr_config(&usr_config) == 0) { - audio->aac_config = usr_config; - rc = 0; - } else - rc = -EINVAL; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if (config.pcm_feedback) { - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - } - rc = 0; - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_STREAM_INFO:{ - if (audio->stream_info.sample_rate == 0) { - /* haven't received DSP stream event, - the stream info is not updated */ - rc = -EPERM; - break; - } - if (copy_to_user((void *)arg, &audio->stream_info, - sizeof(struct msm_audio_bitstream_info))) - rc = -EFAULT; - else - rc = 0; - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} -/* Only useful in tunnel-mode */ -static int audaac_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("to read %d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next]. - used > 0) || (audio->stopped) - || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("no partial frame done reading\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads to the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* - * Force to exit while loop - * to prevent output thread - * sleep too long if data is not - * ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audaac_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - char *buf_ptr; - int rc = 0; - unsigned long flags = 0; - - MM_DBG("signal input EOS reserved=%d\n", audio->reserved); - if (audio->reserved) { - MM_DBG("Pass reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - audio->reserved = 0; - frame->used = 2; - audplay_send_data(audio, 0); - } - MM_DBG("Now signal input EOS after reserved bytes %d %d %d\n", - audio->out[0].used, audio->out[1].used, audio->out_needed); - frame = audio->out + audio->out_head; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->eos_in_progress = 1; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->eos_in_progress = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAAC_EOS_NONE; - unsigned dsize; - - unsigned short mfield_size = 0; - MM_DBG("cnt=%d\n", count); - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDAAC_EOS_FLG_OFFSET] & - AUDAAC_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAAC_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAAC_EOS_FLG_OFFSET] &= - ~AUDAAC_EOS_FLG_MASK; - } - /* Check EOS to see if */ - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", - audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - MM_DBG("eos_condition %x buf[0x%x] start[0x%x]\n", eos_condition, - (int) buf, (int) start); - if (eos_condition == AUDAAC_EOS_SET) - rc = audaac_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audaac_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -static void audaac_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audaac_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audaac_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audaac_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audaac_suspend(struct early_suspend *h) -{ - struct audaac_suspend_ctl *ctl = - container_of(h, struct audaac_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audaac_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audaac_resume(struct early_suspend *h) -{ - struct audaac_suspend_ctl *ctl = - container_of(h, struct audaac_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audaac_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audaac_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audaac_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audaac_debug_fops = { - .read = audaac_debug_read, - .open = audaac_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, index, offset = 0; - unsigned mem_sz = DMASZ; - struct audaac_event *e_node = NULL; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_aac_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AAC; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_AAC_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", mem_sz); - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - - mem_sz = (PCM_BUFSZ_MIN * PCM_BUF_MAX_COUNT); - MM_DBG("allocating mem sz = %d\n", mem_sz); - handle = ion_alloc(client, mem_sz, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto input_buff_get_phys_error; - } else { - MM_INFO("out Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto input_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->read_data = audio->map_v_read; - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->read_phys, (int)audio->read_data); - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_aac, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AAC session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->pcm_buf_count = PCM_BUF_MAX_COUNT; - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) { - audio->in[index].data = audio->read_data + offset; - audio->in[index].addr = audio->read_phys + offset; - audio->in[index].size = PCM_BUFSZ_MIN; - audio->in[index].used = 0; - offset += PCM_BUFSZ_MIN; - } - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->aac_config.format = AUDIO_AAC_FORMAT_ADTS; - audio->aac_config.audio_object = AUDIO_AAC_OBJECT_LC; - audio->aac_config.ep_config = 0; - audio->aac_config.aac_section_data_resilience_flag = - AUDIO_AAC_SEC_DATA_RES_OFF; - audio->aac_config.aac_scalefactor_data_resilience_flag = - AUDIO_AAC_SCA_DATA_RES_OFF; - audio->aac_config.aac_spectral_data_resilience_flag = - AUDIO_AAC_SPEC_DATA_RES_OFF; -#ifdef CONFIG_AUDIO_AAC_PLUS - audio->aac_config.sbr_on_flag = AUDIO_AAC_SBR_ON_FLAG_ON; -#else - audio->aac_config.sbr_on_flag = AUDIO_AAC_SBR_ON_FLAG_OFF; -#endif -#ifdef CONFIG_AUDIO_ENHANCED_AAC_PLUS - audio->aac_config.sbr_ps_on_flag = AUDIO_AAC_SBR_PS_ON_FLAG_ON; -#else - audio->aac_config.sbr_ps_on_flag = AUDIO_AAC_SBR_PS_ON_FLAG_OFF; -#endif - audio->aac_config.dual_mono_mode = AUDIO_AAC_DUAL_MONO_PL_SR; - audio->aac_config.channel_configuration = 2; - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_aac_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audaac_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audaac_resume; - audio->suspend_ctl.node.suspend = audaac_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (index = 0; index < AUDAAC_EVENT_NUM; index++) { - e_node = kmalloc(sizeof(struct audaac_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - memset(&audio->stream_info, 0, sizeof(struct msm_audio_bitstream_info)); -done: - return rc; -err: - ion_unmap_kernel(client, audio->input_buff_handle); -input_buff_map_error: -input_buff_get_flags_error: -input_buff_get_phys_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audaac_fsync -}; - -struct miscdevice audio_aac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac", - .fops = &audio_aac_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_aac_misc); -} - -static void __exit audio_exit(void) -{ - misc_deregister(&audio_aac_misc); -} - -module_init(audio_init); -module_exit(audio_exit); - -MODULE_DESCRIPTION("MSM AAC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_aac_in.c b/arch/arm/mach-msm/qdsp5/audio_aac_in.c deleted file mode 100644 index 4c13a3c19f74..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_aac_in.c +++ /dev/null @@ -1,1527 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_aac_in.c - * - * aac audio input device - * - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5v2/audio_aac_in.c, - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define FRAME_HEADER_SIZE 8 /* 8 bytes frame header */ -#define NT_FRAME_HEADER_SIZE 24 /* 24 bytes frame header */ -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define AAC_FRAME_SIZE 1536 /* 36 bytes data */ -/*Tunnel mode : 1536 bytes data + 8 byte header*/ -#define FRAME_SIZE (AAC_FRAME_SIZE + FRAME_HEADER_SIZE) -/* 1536 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (AAC_FRAME_SIZE + NT_FRAME_HEADER_SIZE) -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define NT_DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM 2 -#define OUT_BUFFER_SIZE (32 * 1024 + NT_FRAME_HEADER_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -#define AUDPREPROC_AAC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer*/ -#define AUDPREPROC_AAC_EOS_FLG_MASK 0x01 -#define AUDPREPROC_AAC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_AAC_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_aac_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* Frame size (1536 bytes) */ - uint32_t bit_rate; /* bit rate for AAC */ - uint32_t record_quality; /* record quality (bits/sample/channel) */ - uint32_t enc_type; /* 1 for AAC */ - uint32_t mode; /* T or NT Mode*/ - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - unsigned short samp_rate_index; - uint32_t audrec_obj_idx ; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_read; - void *map_v_write; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; - - struct audrec_session_info session_info; /*audrec session info*/ -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; -} __packed; - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __packed; - -struct aac_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audio_send_queue_pre(audio, cmd, len) \ - msm_adsp_write(audio->audpre, QDSP_uPAudPreProcCmdQueue, cmd, len) - -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -static int audaac_in_dsp_enable(struct audio_aac_in *audio, int enable); -static int audaac_in_encparam_config(struct audio_aac_in *audio); -static int audaac_in_encmem_config(struct audio_aac_in *audio); -static int audaac_in_dsp_read_buffer(struct audio_aac_in *audio, - uint32_t read_cnt); -static void audaac_in_flush(struct audio_aac_in *audio); - -static void audaac_in_get_dsp_frames(struct audio_aac_in *audio); -static int audpcm_config(struct audio_aac_in *audio); -static void audaac_out_flush(struct audio_aac_in *audio); -static int audaac_in_routing_mode_config(struct audio_aac_in *audio); -static void audrec_pcm_send_data(struct audio_aac_in *audio, unsigned needed); -static void audaac_nt_in_get_dsp_frames(struct audio_aac_in *audio); -static void audaac_in_flush(struct audio_aac_in *audio); - -static unsigned convert_dsp_samp_index(unsigned index) -{ - switch (index) { - case 48000: return AUDREC_CMD_SAMP_RATE_INDX_48000; - case 44100: return AUDREC_CMD_SAMP_RATE_INDX_44100; - case 32000: return AUDREC_CMD_SAMP_RATE_INDX_32000; - case 24000: return AUDREC_CMD_SAMP_RATE_INDX_24000; - case 22050: return AUDREC_CMD_SAMP_RATE_INDX_22050; - case 16000: return AUDREC_CMD_SAMP_RATE_INDX_16000; - case 12000: return AUDREC_CMD_SAMP_RATE_INDX_12000; - case 11025: return AUDREC_CMD_SAMP_RATE_INDX_11025; - case 8000: return AUDREC_CMD_SAMP_RATE_INDX_8000; - default: return AUDREC_CMD_SAMP_RATE_INDX_11025; - } -} - -static unsigned convert_samp_rate(unsigned hz) -{ - switch (hz) { - case 48000: return RPC_AUD_DEF_SAMPLE_RATE_48000; - case 44100: return RPC_AUD_DEF_SAMPLE_RATE_44100; - case 32000: return RPC_AUD_DEF_SAMPLE_RATE_32000; - case 24000: return RPC_AUD_DEF_SAMPLE_RATE_24000; - case 22050: return RPC_AUD_DEF_SAMPLE_RATE_22050; - case 16000: return RPC_AUD_DEF_SAMPLE_RATE_16000; - case 12000: return RPC_AUD_DEF_SAMPLE_RATE_12000; - case 11025: return RPC_AUD_DEF_SAMPLE_RATE_11025; - case 8000: return RPC_AUD_DEF_SAMPLE_RATE_8000; - default: return RPC_AUD_DEF_SAMPLE_RATE_11025; - } -} - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* Convert Bit Rate to Record Quality field of DSP */ -static unsigned int bitrate_to_record_quality(unsigned int sample_rate, - unsigned int channel, unsigned int bit_rate) { - unsigned int temp; - - temp = sample_rate * channel; - MM_DBG(" sample rate * channel = %d\n", temp); - /* To represent in Q12 fixed format */ - temp = (bit_rate * 4096) / temp; - MM_DBG(" Record Quality = 0x%8x\n", temp); - return temp; -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, void *event_data) -{ - - uint16_t *msg = event_data; - - if (!msg) - return; - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_DBG("type %d, status_flag %d\n",\ - msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -/* must be called with audio->lock held */ -static int audaac_in_enable(struct audio_aac_in *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - cfg.codec = RPC_AUD_DEF_CODEC_AAC; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - if (audpreproc_enable(audio->enc_id, - &audpre_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = - convert_samp_index(audio->samp_rate); - audpreproc_update_audrec_info(&audio->session_info); - } - - if (msm_adsp_enable(audio->audrec)) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - } - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audaac_in_dsp_enable(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audaac_in_disable(struct audio_aac_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - - audaac_in_dsp_enable(audio, 0); - - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - audio->stopped = 1; - wake_up(&audio->wait); - msm_adsp_disable(audio->audrec); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - /*reset the sampling frequency information at - audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audmgr_disable(&audio->audmgr); - } - } - return 0; -} - -static void audaac_in_get_dsp_frames(struct audio_aac_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audaac_in_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audaac_nt_in_get_dsp_frames(struct audio_aac_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - -static int audrec_pcm_buffer_ptr_refresh(struct audio_aac_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == NT_FRAME_HEADER_SIZE) - len = len / 2; - else - len = (len + NT_FRAME_HEADER_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_config(struct audio_aac_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = convert_samp_index(audio->samp_rate); - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audaac_in_routing_mode_config(struct audio_aac_in *audio) -{ - struct audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ROUTING_MODE; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - cmd.routing_mode = 1; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_aac_in *audio = NULL; - if (data) - audio = data; - else { - MM_ERR("invalid data for event %x\n", id); - return; - } - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - struct audrec_msg_cmd_cfg_done_msg cmd_cfg_done_msg; - getevent(&cmd_cfg_done_msg, AUDREC_MSG_CMD_CFG_DONE_MSG_LEN); - if (cmd_cfg_done_msg.audrec_enc_type & \ - AUDREC_MSG_CFG_DONE_ENC_ENA) { - audio->audrec_obj_idx = cmd_cfg_done_msg.audrec_obj_idx; - MM_DBG("CFG ENABLED\n"); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audaac_in_routing_mode_config(audio); - } else { - audaac_in_encmem_config(audio); - } - } else { - MM_DBG("CFG SLEEP\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG: { - struct audrec_msg_cmd_routing_mode_done_msg \ - routing_msg; - getevent(&routing_msg, AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG); - MM_DBG("AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG"); - if (routing_msg.configuration == 0) { - MM_ERR("routing configuration failed\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } else - audaac_in_encmem_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("AREC_MEM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audaac_in_encparam_config(audio); - else - audpcm_config(audio); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_DBG("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audaac_in_encparam_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_DBG("AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG\n"); - audio->running = 1; - wake_up(&audio->wait_enable); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: { - struct audrec_msg_no_ext_pkt_avail_msg err_msg; - getevent(&err_msg, AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG_LEN); - MM_DBG("NO_EXT_PKT_AVAILABLE_MSG %x\n",\ - err_msg.audrec_err_id); - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - struct audrec_msg_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt msw %d \ - write cnt lsw %d read cnt msw %d read cnt lsw %d \n",\ - pkt_ready_msg.pkt_counter_msw, \ - pkt_ready_msg.pkt_counter_lsw, \ - pkt_ready_msg.pkt_read_cnt_msw, \ - pkt_ready_msg.pkt_read_cnt_lsw); - - audaac_in_get_dsp_frames(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audaac_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -static struct msm_adsp_ops audrec_aac_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audaac_in_dsp_enable(struct audio_aac_in *audio, int enable) -{ - struct audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ENC_CFG; - cmd.audrec_enc_type = (audio->enc_type & 0xFF) | - (enable ? AUDREC_CMD_ENC_ENA : AUDREC_CMD_ENC_DIS); - /* Don't care */ - cmd.audrec_obj_idx = audio->audrec_obj_idx; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audaac_in_encmem_config(struct audio_aac_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - int header_len = 0; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.cmd_id = AUDREC_CMD_ARECMEM_CFG; - cmd.audrec_obj_idx = audio->audrec_obj_idx; - /* Rate at which packet complete message comes */ - cmd.audrec_up_pkt_intm_cnt = 1; - cmd.audrec_extpkt_buffer_msw = audio->phys >> 16; - cmd.audrec_extpkt_buffer_lsw = audio->phys; - /* Max Buffer no available for frames */ - cmd.audrec_extpkt_buffer_num = FRAME_NUM; - - /* prepare buffer pointers: - * T:1536 bytes aac packet + 4 halfword header - * NT:1536 bytes aac packet + 12 halfword header - */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - header_len = FRAME_HEADER_SIZE/2; - else - header_len = NT_FRAME_HEADER_SIZE/2; - - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + header_len; - data += (AAC_FRAME_SIZE/2) + header_len; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - header_len*2)); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audaac_in_encparam_config(struct audio_aac_in *audio) -{ - struct audrec_cmd_arecparam_aac_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDREC_CMD_ARECPARAM_CFG; - cmd.common.audrec_obj_idx = audio->audrec_obj_idx; - cmd.samp_rate_idx = audio->samp_rate_index; - cmd.stereo_mode = audio->channel_mode; - cmd.rec_quality = audio->record_quality; - - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audaac_flush_command(struct audio_aac_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audaac_in_dsp_read_buffer(struct audio_aac_in *audio, - uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - cmd.type = audio->audrec_obj_idx; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audaac_ioport_reset(struct audio_aac_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audaac_in_flush(audio); - mutex_unlock(&audio->read_lock); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audaac_out_flush(audio); - mutex_unlock(&audio->write_lock); -} - -static void audaac_in_flush(struct audio_aac_in *audio) -{ - int i; - unsigned long flags; - - audio->dsp_cnt = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = FRAME_NUM-1; i >= 0; i--) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audaac_out_flush(struct audio_aac_in *audio) -{ - int i; - unsigned long flags; - - audio->out_head = 0; - audio->out_count = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out_tail = 0; - for (i = OUT_FRAME_NUM-1; i >= 0; i--) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static long audaac_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_aac_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - rc = audaac_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - rc = audaac_in_disable(audio); - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audaac_ioport_reset(audio); - if (audio->running) { - audaac_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.channel_count = 1; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) - rc = -EINVAL; - break; - } else { - if (cfg.buffer_size != (AAC_FRAME_SIZE + 14)) - rc = -EINVAL; - break; - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - if (audio->channel_mode == AUDREC_CMD_STEREO_MODE_MONO) - cfg.channels = 1; - else - cfg.channels = 2; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.bit_rate = audio->bit_rate; - cfg.stream_format = AUDIO_AAC_FORMAT_RAW; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - unsigned int record_quality; - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.stream_format != AUDIO_AAC_FORMAT_RAW) { - MM_ERR("unsupported AAC format\n"); - rc = -EINVAL; - break; - } - record_quality = bitrate_to_record_quality(cfg.sample_rate, - cfg.channels, cfg.bit_rate); - /* Range of Record Quality Supported by DSP, Q12 format */ - if ((record_quality < 0x800) || (record_quality > 0x4000)) { - MM_ERR("Unsupported bit rate\n"); - rc = -EINVAL; - break; - } - MM_DBG("channels = %d\n", cfg.channels); - if (cfg.channels == 1) { - cfg.channels = AUDREC_CMD_STEREO_MODE_MONO; - } else if (cfg.channels == 2) { - cfg.channels = AUDREC_CMD_STEREO_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - - audio->samp_rate = convert_samp_rate(cfg.sample_rate); - audio->samp_rate_index = - convert_dsp_samp_index(cfg.sample_rate); - audio->channel_mode = cfg.channels; - audio->bit_rate = cfg.bit_rate; - audio->record_quality = record_quality; - MM_DBG(" Record Quality = 0x%8x\n", audio->record_quality); - break; - } - - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audaac_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_aac_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct aac_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG("count = %d\n", count); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct aac_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct aac_encoded_meta_out); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct aac_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_DBG("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct aac_encoded_meta_out); - count -= sizeof(struct aac_encoded_meta_out); - } - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command \ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audaac_in_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audrec_pcm_send_data(struct audio_aac_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audrec_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - - -static int audaac_in_fsync(struct file *file, loff_t a, loff_t b, int datasync) - -{ - struct audio_aac_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - -int audrec_aac_process_eos(struct audio_aac_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audrec_pcm_send_data(audio, 0); -done: - return rc; -} -static ssize_t audaac_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_aac_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_AAC_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = 0; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_AAC_EOS_FLG_OFFSET] & - AUDPREPROC_AAC_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_AAC_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_AAC_EOS_FLG_OFFSET] &= - ~AUDPREPROC_AAC_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audrec_pcm_send_data(audio, 0); - else { - audrec_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_AAC_EOS_SET) - rc = audrec_aac_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audaac_in_release(struct inode *inode, struct file *file) -{ - struct audio_aac_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audaac_in_disable(audio); - audaac_in_flush(audio); - msm_adsp_put(audio->audrec); - - - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) && \ - (audio->out_data)) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->out_data = NULL; - } - - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_aac_in the_audio_aac_in; - -static int audaac_in_open(struct inode *inode, struct file *file) -{ - struct audio_aac_in *audio = &the_audio_aac_in; - int rc; - int encid; - int dma_size = 0; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - dma_size = NT_DMASZ; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - dma_size = DMASZ; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; - - /* For AAC, bit rate hard coded, default settings is - * sample rate (11025) x channel count (1) x recording quality (1.75) - * = 19293 bps */ - audio->bit_rate = 19293; - audio->record_quality = 0x1c00; - - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (AAC_FRAME_SIZE + 14); - else - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_AAC | audio->mode; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - } - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_aac_adsp_ops, audio); - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->dsp_cnt = 0; - audio->stopped = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audaac_in_flush(audio); - audaac_out_flush(audio); - - - client = msm_ion_client_create(UINT_MAX, "Audio_AAC_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", dma_size); - handle = ion_alloc(client, dma_size, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_read; - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_data = NULL; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_get_phys_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->mfield = NT_FRAME_HEADER_SIZE; - audio->out_frame_cnt++; - } - file->private_data = audio; - audio->opened = 1; - -done: - mutex_unlock(&audio->lock); - return rc; -input_buff_map_error: -input_buff_get_flags_error: -input_buff_get_phys_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_aac_in_fops = { - .owner = THIS_MODULE, - .open = audaac_in_open, - .release = audaac_in_release, - .read = audaac_in_read, - .write = audaac_in_write, - .fsync = audaac_in_fsync, - .unlocked_ioctl = audaac_in_ioctl, -}; - -static struct miscdevice audaac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &audio_aac_in_fops, -}; - -static int __init audaac_in_init(void) -{ - mutex_init(&the_audio_aac_in.lock); - mutex_init(&the_audio_aac_in.read_lock); - spin_lock_init(&the_audio_aac_in.dsp_lock); - init_waitqueue_head(&the_audio_aac_in.wait); - init_waitqueue_head(&the_audio_aac_in.wait_enable); - mutex_init(&the_audio_aac_in.write_lock); - init_waitqueue_head(&the_audio_aac_in.write_wait); - return misc_register(&audaac_in_misc); -} -device_initcall(audaac_in_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_ac3.c b/arch/arm/mach-msm/qdsp5/audio_ac3.c deleted file mode 100644 index 199b32228ff5..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_ac3.c +++ /dev/null @@ -1,1760 +0,0 @@ -/* arch/arm/mach-msm/audio_ac3.c - * - * Copyright (c) 2008-2009, 2011-2013 The Linux Foundation. All rights reserved. - * - * This code also borrows from audio_aac.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define BUFSZ 4096 -#define DMASZ (BUFSZ * 2) - -#define AUDDEC_DEC_AC3 23 - -#define PCM_BUFSZ 6168 /* maximum frame size is 512 * 6 samples */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - * but support 2 buffers currently - */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 - -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAC3_METAFIELD_MASK 0xFFFF0000 -#define AUDAC3_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAC3_EOS_FLG_MASK 0x01 -#define AUDAC3_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAC3_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAC3_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /* only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audac3_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audac3_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - struct audmgr audmgr; - struct msm_audio_ac3_config ac3_config; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened; - uint8_t enabled; - uint8_t running; - uint8_t stopped; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback; - uint8_t buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int rmt_resource_released; - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audac3_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audac3_send_data(struct audio *audio, unsigned needed); -static void audac3_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audac3_config_hostpcm(struct audio *audio); -static void audac3_buffer_refresh(struct audio *audio); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audac3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_AC3; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_AC3; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audac3_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AC3"\ - " session 0x%08x on decoder: %d\n Ignoring"\ - " error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_AC3; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audac3_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audac3_disable(struct audio *audio) -{ - int rc = 0; - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ - -static void audac3_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr - == payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audac3_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audac3_send_data(audio, 1); - break; - case AUDPLAY_MSG_BUFFER_UPDATE: - MM_DBG("\n"); /* Macro prints the file name and function */ - audac3_update_pcm_buf_entry(audio, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder\n"); - } -} - -static void audac3_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason =0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - if (audio->pcm_feedback) { - audac3_config_hostpcm(audio); - audac3_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK\n"); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audac3_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_ac3 = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AC3; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} -static int get_frequency_index(unsigned short frequency) -{ - switch (frequency) { - case 48000: return 0; - case 44100: return 1; - case 32000: return 2; - default: return -EINVAL; - } -} -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_ac3 cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - /* dsp needs word size */ - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_AC3_LEN >> 1; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = (audio->ac3_config).fsCod; - - cmd.index[0] = (((audio->ac3_config).numChans << 8) & 0xFF00) | - ((audio->ac3_config).wordSize & 0x00FF); - - cmd.index[1] = (((audio->ac3_config).kCapableMode << 12) & 0xF000) | - (((audio->ac3_config).compMode << 8) & 0x0F00) | - (((audio->ac3_config).outLfeOn << 4) & 0x00F0) | - ((audio->ac3_config).outputMode & 0x000F); - - cmd.index[2] = ((((audio->ac3_config).stereoMode << 12) & 0xF000) | - (((audio->ac3_config).dualMonoMode << 8) & 0x0F00) | - ((get_frequency_index((audio->ac3_config).fsCod) << 4) - & 0x00F0)) & 0xFFF0; /* last 4 bytes are reserved */ - - cmd.index[3] = (audio->ac3_config).pcmScaleFac; - cmd.index[4] = (audio->ac3_config).dynRngScaleHi; - cmd.index[5] = (audio->ac3_config).dynRngScaleLow; - - cmd.index[6] = (((audio->ac3_config).user_downmix_flag << 8) & 0xFF00)| - ((audio->ac3_config).user_karaoke_flag & 0x00FF); - - cmd.index[7] = (audio->ac3_config).dm_address_high; - cmd.index[8] = (audio->ac3_config).dm_address_low; - cmd.index[9] = (audio->ac3_config).ko_address_high; - cmd.index[10] = (audio->ac3_config).ko_address_high; - - cmd.index[11] = (((audio->ac3_config).max_rep_count << 1) & 0xFFFE) | - ((audio->ac3_config).error_concealment & 0x0001); - - cmd.index[12] = (((audio->ac3_config).channel_routing_mode[3] << 12) - & 0xF000) | - (((audio->ac3_config).channel_routing_mode[2] << 8) - & 0x0F00) | - (((audio->ac3_config).channel_routing_mode[1] << 4) - & 0x00F0) | - ((audio->ac3_config).channel_routing_mode[0] & 0x000F); - - cmd.index[13] = ((((audio->ac3_config).channel_routing_mode[5] << 12) - & 0xF000) | - (((audio->ac3_config).channel_routing_mode[4] << 8) - & 0x0F00)) & 0xFF00; /* last 8 bytes are reserved */ - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAC3_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audac3_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audac3_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audac3_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audac3_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audac3_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} -/*check if func to be added to validate user data*/ - -static void audac3_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audac3_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audac3_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audac3_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audac3_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audac3_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audac3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audac3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - - -static long audac3_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audac3_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audac3_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audac3_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audac3_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audac3_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audac3_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audac3_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) { - MM_ERR("In audio->dec_state !=\n"); - rc = -ENODEV; - } else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audac3_disable(audio); - audac3_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audac3_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - rc = 0; - MM_DBG("AUDIO_SET_CONFIG applicable only"\ - " for meta field configuration\n"); - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = (audio->ac3_config).fsCod; - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_AC3_CONFIG:{ - if (copy_to_user((void *)arg, &audio->ac3_config, - sizeof(audio->ac3_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_AC3_CONFIG:{ - struct msm_audio_ac3_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - audio->ac3_config = usr_config; - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - - MM_ERR("Not sufficient permission to"\ - " change the playback mode\n"); - rc = -EACCES; - break; - - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ) - config.buffer_size = PCM_BUFSZ; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("map of read buf failed\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr"\ - " 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audac3_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audac3_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - if (!audio->pcm_feedback) { - MM_ERR("returning from read as tunnel mode\n"); - return 0; - /* PCM feedback is not enabled. Nothing to read */ - } - mutex_lock(&audio->read_lock); - MM_DBG("\n"); /* Macro prints the file name and function */ - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - MM_DBG("wait terminated count%d\n", count); - if (rc < 0) - break; - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", - (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment - */ - - } - } - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audac3_buffer_refresh(audio); - } - mutex_unlock(&audio->read_lock); - if (buf > start) - rc = buf - start; - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audac3_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audac3_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audac3_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - unsigned short mfield_size = 0; - int rc = 0, eos_condition = AUDAC3_EOS_NONE; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, - mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDAC3_EOS_FLG_OFFSET] & - AUDAC3_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAC3_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAC3_EOS_FLG_OFFSET] &= - ~AUDAC3_EOS_FLG_MASK; - } - /* Check EOS to see if */ - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - frame->used = xfer + mfield_size; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - audac3_send_data(audio, 0); - } - if (eos_condition == AUDAC3_EOS_SET) - rc = audac3_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audac3_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audac3_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audac3_flush(audio); - audac3_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audac3_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audac3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audac3_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audac3_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audac3_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audac3_suspend(struct early_suspend *h) -{ - struct audac3_suspend_ctl *ctl = - container_of(h, struct audac3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audac3_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audac3_resume(struct early_suspend *h) -{ - struct audac3_suspend_ctl *ctl = - container_of(h, struct audac3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audac3_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audac3_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audac3_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d\n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d\n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x\n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d\n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d\n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d\n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d\n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d\n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d\n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d\n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d\n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d\n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d\n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d\n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audac3_debug_fops = { - .read = audac3_debug_read, - .open = audac3_debug_open, -}; -#endif - -static int audac3_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audac3_event *e_node = NULL; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_ac3_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AC3; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_AC3_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_ac3, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AC3 session"\ - " 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - /* Initialize all locks of audio instance */ - audio->input_buff_handle = NULL; - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x3FFF; - - (audio->ac3_config).wordSize = AUDAC3_DEF_WORDSIZE; - (audio->ac3_config).user_downmix_flag = AUDAC3_DEF_USER_DOWNMIX_FLAG; - (audio->ac3_config).user_karaoke_flag = AUDAC3_DEF_USER_KARAOKE_FLAG; - (audio->ac3_config).error_concealment = AUDAC3_DEF_ERROR_CONCEALMENT; - (audio->ac3_config).max_rep_count = AUDAC3_DEF_MAX_REPEAT_COUNT; - - audac3_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_ac3_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audac3_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audac3_resume; - audio->suspend_ctl.node.suspend = audac3_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDAC3_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audac3_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_flags_error: -output_buff_get_phys_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_ac3_fops = { - .owner = THIS_MODULE, - .open = audac3_open, - .release = audac3_release, - .read = audac3_read, - .write = audac3_write, - .unlocked_ioctl = audac3_ioctl, - .fsync = audac3_fsync, -}; - -struct miscdevice audio_ac3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_ac3", - .fops = &audio_ac3_fops, -}; - -static int __init audac3_init(void) -{ - return misc_register(&audio_ac3_misc); - -} - -static void __exit audac3_exit(void) -{ - misc_deregister(&audio_ac3_misc); -} - -module_init(audac3_init); -module_exit(audac3_exit); - -MODULE_DESCRIPTION("MSM AC3 driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_acdb.c b/arch/arm/mach-msm/qdsp5/audio_acdb.c deleted file mode 100644 index 608f544e19d7..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_acdb.c +++ /dev/null @@ -1,2704 +0,0 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* this is the ACDB device ID */ -#define DALDEVICEID_ACDB 0x02000069 -#define ACDB_PORT_NAME "DAL00" -#define ACDB_CPU SMD_APPS_MODEM -#define ACDB_BUF_SIZE 4096 -#define FLUENCE_BUF_SIZE 498 - -#define ACDB_VALUES_NOT_FILLED 0 -#define ACDB_VALUES_FILLED 1 -#define MAX_RETRY 10 - -#define COMMON_OBJ_ID 6 - -/*below macro is used to align the session info received from -Devctl driver with the state mentioned as not to alter the -Existing code*/ -#define AUDREC_OFFSET 2 -/* rpc table index */ -enum { - ACDB_DAL_IOCTL = DALDEVICE_FIRST_DEVICE_API_IDX -}; - -enum { - CAL_DATA_READY = 0x1, - AUDPP_READY = 0x2, - AUDREC_READY = 0x4, -}; - -struct acdb_data { - void *handle; - - u32 phys_addr; - u8 *virt_addr; - - struct task_struct *cb_thread_task; - struct device_info_callback dev_cb; - - u32 acdb_state; - struct audpp_event_callback audpp_cb; - struct audpreproc_event_callback audpreproc_cb; - struct dev_evt_msg *device_info; - - audpp_cmd_cfg_object_params_pcm *pp_iir; - audpp_cmd_cfg_object_params_mbadrc *pp_mbadrc; - audpreproc_cmd_cfg_agc_params *preproc_agc; - audpreproc_cmd_cfg_iir_tuning_filter_params *preproc_iir; - audpreproc_cmd_cfg_ns_params *preproc_ns; - struct acdb_mbadrc_block mbadrc_block; - - wait_queue_head_t wait; - struct mutex acdb_mutex; - u32 device_cb_compl; - u32 audpp_cb_compl; - u32 preproc_cb_compl; - u32 audpp_cb_reenable_compl; - u8 preproc_stream_id; - u8 audrec_applied; - u32 multiple_sessions; - u32 cur_tx_session; - struct acdb_result acdb_result; - uint32_t audpp_disabled_features; - - spinlock_t dsp_lock; - int dec_id; - audpp_cmd_cfg_object_params_eqalizer eq; - struct audrec_session_info session_info; - /*pmem info*/ - unsigned long paddr; - unsigned long kvaddr; - unsigned long pmem_len; - struct file *file; - /* pmem for get acdb blk */ - unsigned long get_blk_paddr; - u8 *get_blk_kvaddr; - void *map_v_get_blk; -}; - -static struct acdb_data acdb_data; - -struct acdb_cache_node { - u32 node_status; - s32 stream_id; - u32 phys_addr_acdb_values; - void *map_v_addr; - u8 *virt_addr_acdb_values; - struct dev_evt_msg device_info; -}; - -struct acdb_cache_node acdb_cache_rx; - -/*for TX devices acdb values are applied based on AUDREC session and -the depth of the tx cache is define by number of AUDREC sessions supported*/ -struct acdb_cache_node acdb_cache_tx; - -/*Audrec session info includes Attributes Sampling frequency and enc_id */ -struct audrec_session_info session_info; -#ifdef CONFIG_DEBUG_FS - -#define RTC_MAX_TIMEOUT 500 /* 500 ms */ -#define PMEM_RTC_ACDB_QUERY_MEM 4096 -#define EXTRACT_HIGH_WORD(x) ((x & 0xFFFF0000)>>16) -#define EXTRACT_LOW_WORD(x) (0x0000FFFF & x) -#define ACDB_RTC_TX 0xF1 -#define ACDB_RTC_RX 0x1F - - -static u32 acdb_audpp_entry[][4] = { - - { - ABID_AUDIO_RTC_VOLUME_PAN_RX,\ - IID_AUDIO_RTC_VOLUME_PAN_PARAMETERS,\ - AUDPP_CMD_VOLUME_PAN,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_IIR_RX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPP_CMD_IIR_TUNING_FILTER, - ACDB_RTC_RX - }, - { - ABID_AUDIO_RTC_EQUALIZER_PARAMETERS,\ - IID_AUDIO_RTC_EQUALIZER_PARAMETERS,\ - AUDPP_CMD_EQUALIZER,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_RTC_SPA,\ - IID_AUDIO_RTC_SPA_PARAMETERS,\ - AUDPP_CMD_SPECTROGRAM, - ACDB_RTC_RX - }, - { - ABID_AUDIO_STF_RX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPP_CMD_SIDECHAIN_TUNING_FILTER,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_MBADRC_RX,\ - IID_AUDIO_RTC_MBADRC_PARAMETERS,\ - AUDPP_CMD_MBADRC,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_AGC_TX,\ - IID_AUDIO_AGC_PARAMETERS,\ - AUDPREPROC_CMD_CFG_AGC_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_AGC_TX,\ - IID_AUDIO_RTC_AGC_PARAMETERS,\ - AUDPREPROC_CMD_CFG_AGC_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_NS_TX,\ - IID_NS_PARAMETERS,\ - AUDPREPROC_CMD_CFG_NS_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_IIR_TX,\ - IID_AUDIO_RTC_TX_IIR_COEFF,\ - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_IIR_TX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS,\ - ACDB_RTC_TX - } - /*Any new entries should be added here*/ -}; - -static struct dentry *get_set_abid_dentry; -static struct dentry *get_set_abid_data_dentry; - -struct rtc_acdb_pmem { - u8 *viraddr; - int32_t phys; - void *map_v_rtc; -}; - -struct rtc_acdb_data { - u32 acdb_id; - u32 cmd_id; - u32 set_abid; - u32 set_iid; - u32 abid; - u32 err; - bool valid_abid; - u32 tx_rx_ctl; - struct rtc_acdb_pmem rtc_read; - struct rtc_acdb_pmem rtc_write; - wait_queue_head_t wait; -}; - -struct get_abid { - u32 cmd_id; - u32 acdb_id; - u32 set_abid; - u32 set_iid; -}; - -struct acdb_block_mbadrc_rtc { - u16 enable; - u16 num_bands; - u16 down_samp_level; - u16 adrc_delay; - u16 ext_buf_size; - u16 ext_partition; - u16 ext_buf_msw; - u16 ext_buf_lsw; - struct adrc_config adrc_band[AUDPP_MAX_MBADRC_BANDS]; - signed int ext_buff[196]; -} __packed; - -enum { - ACDB_RTC_SUCCESS, - ACDB_RTC_ERR_INVALID_DEVICE, - ACDB_RTC_ERR_DEVICE_INACTIVE, - ACDB_RTC_ERR_INVALID_ABID, - ACDB_RTC_DSP_FAILURE, - ACDB_RTC_DSP_FEATURE_NOT_AVAILABLE, - ACDB_RTC_ERR_INVALID_LEN, - ACDB_RTC_ERR_UNKNOWN_FAILURE, - ACDB_RTC_PENDING_RESPONSE, - ACDB_RTC_INIT_FAILURE, -}; - -static struct rtc_acdb_data rtc_acdb; - -static int rtc_getsetabid_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_DBG("GET-SET ABID Open debug intf %s\n",\ - (char *) file->private_data); - return 0; -} - -static bool get_feature_id(u32 set_abid, u32 iid, unsigned short *feature_id) -{ - bool ret_value = false; - int i = 0; - - for (; i < (sizeof(acdb_audpp_entry) / sizeof(acdb_audpp_entry[0]));\ - i++) { - if (acdb_audpp_entry[i][0] == set_abid && - acdb_audpp_entry[i][1] == iid) { - *feature_id = acdb_audpp_entry[i][2]; - rtc_acdb.tx_rx_ctl = acdb_audpp_entry[i][3]; - ret_value = true; - break; - } - } - return ret_value; -} -static ssize_t rtc_getsetabid_dbg_write(struct file *filp, - const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - struct get_abid write_abid; - unsigned short feat_id = 0; - rtc_acdb.valid_abid = false; - - if (copy_from_user(&write_abid, \ - (void *)ubuf, sizeof(struct get_abid))) { - MM_ERR("ACDB DATA WRITE - INVALID READ LEN\n"); - rtc_acdb.err = ACDB_RTC_ERR_INVALID_LEN; - return cnt; - } - MM_DBG("SET ABID : Cmd ID: %d Device:%d ABID:%d IID : %d cnt: %d\n",\ - write_abid.cmd_id, write_abid.acdb_id,\ - write_abid.set_abid, write_abid.set_iid, cnt); - if (write_abid.acdb_id > ACDB_ID_MAX || - write_abid.acdb_id < ACDB_ID_HANDSET_SPKR){ - rtc_acdb.err = ACDB_RTC_ERR_INVALID_DEVICE; - return cnt; - } - - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - rtc_acdb.abid = write_abid.set_abid; - if (get_feature_id(write_abid.set_abid, \ - write_abid.set_iid, &feat_id)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - rtc_acdb.cmd_id = write_abid.cmd_id; - rtc_acdb.acdb_id = write_abid.acdb_id; - rtc_acdb.set_abid = feat_id; - rtc_acdb.valid_abid = true; - rtc_acdb.set_iid = write_abid.set_iid; - } - return cnt; -} -static ssize_t rtc_getsetabid_dbg_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - static char buffer[1024]; - int n = 0; - u32 msg = rtc_acdb.err; - memcpy(buffer, &rtc_acdb.cmd_id, sizeof(struct get_abid)); - memcpy(buffer+16, &msg, 4); - n = 20; - MM_INFO("SET ABID : Cmd ID: %x Device:%x ABID:%x IID : %x Err: %d\n",\ - rtc_acdb.cmd_id, rtc_acdb.acdb_id, rtc_acdb.set_abid,\ - rtc_acdb.set_iid, rtc_acdb.err); - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static int rtc_getsetabid_data_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("GET-SET ABID DATA Open debug intf %s\n", - (char *) file->private_data); - return 0; -} - -void acdb_rtc_set_err(u32 err_code) -{ - if (rtc_acdb.err == ACDB_RTC_PENDING_RESPONSE) { - if (err_code == 0xFFFF) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - MM_INFO("RTC READ SUCCESS---\n"); - } else if (err_code == 0) { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_INFO("RTC READ FAIL---\n"); - } else if (err_code == 1) { - rtc_acdb.err = ACDB_RTC_DSP_FEATURE_NOT_AVAILABLE; - MM_INFO("RTC READ FEAT UNAVAILABLE---\n"); - } else { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_INFO("RTC Err CODE---\n"); - } - } else { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_ERR("RTC Err code Invalid State\n"); - } - wake_up(&rtc_acdb.wait); -} - -static ssize_t rtc_getsetabid_data_dbg_read(struct file *file, - char __user *buf, size_t count, - loff_t *ppos) -{ - static char buffer[PMEM_RTC_ACDB_QUERY_MEM]; - int rc, n = 0; - int counter = 0; - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - memset(&buffer, 0, PMEM_RTC_ACDB_QUERY_MEM); - - if (rtc_acdb.valid_abid != true) { - MM_ERR("ACDB DATA READ ---INVALID ABID\n"); - n = 0; - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - } else { - if (PMEM_RTC_ACDB_QUERY_MEM < count) { - MM_ERR("ACDB DATA READ ---"\ - "INVALID READ LEN %x\n", count); - n = 0; - rtc_acdb.err = ACDB_RTC_ERR_INVALID_LEN; - } else { - rtc_acdb.err = ACDB_RTC_PENDING_RESPONSE; - if (rtc_read->viraddr != NULL) { - memset(rtc_read->viraddr, - 0, PMEM_RTC_ACDB_QUERY_MEM); - } - if (rtc_acdb.tx_rx_ctl == ACDB_RTC_RX) { - struct rtc_audpp_read_data rtc_read_cmd; - rtc_read_cmd.cmd_id = - AUDPP_CMD_PP_FEAT_QUERY_PARAMS; - rtc_read_cmd.obj_id = - AUDPP_CMD_COPP_STREAM; - rtc_read_cmd.feature_id = rtc_acdb.set_abid; - rtc_read_cmd.extbufsizemsw = - EXTRACT_HIGH_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_read_cmd.extbufsizelsw = - EXTRACT_LOW_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_read_cmd.extpart = 0x0000; - rtc_read_cmd.extbufstartmsw = - EXTRACT_HIGH_WORD(rtc_read->phys); - rtc_read_cmd.extbufstartlsw = - EXTRACT_LOW_WORD(rtc_read->phys); - rc = audpp_send_queue2(&rtc_read_cmd, - sizeof(rtc_read_cmd)); - } else if (rtc_acdb.tx_rx_ctl == ACDB_RTC_TX) { - struct rtc_audpreproc_read_data rtc_audpreproc; - rtc_audpreproc.cmd_id = - AUDPREPROC_CMD_FEAT_QUERY_PARAMS; - rtc_audpreproc.feature_id = rtc_acdb.set_abid; - /*AUDREC1 is used for pcm recording */ - rtc_audpreproc.stream_id = 1; - rtc_audpreproc.extbufsizemsw = - EXTRACT_HIGH_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_audpreproc.extbufsizelsw = - EXTRACT_LOW_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_audpreproc.extpart = 0x0000; - rtc_audpreproc.extbufstartmsw = - EXTRACT_HIGH_WORD(rtc_read->phys); - rtc_audpreproc.extbufstartlsw = - EXTRACT_LOW_WORD(rtc_read->phys); - rc = audpreproc_send_preproccmdqueue( - &rtc_audpreproc,\ - sizeof(rtc_audpreproc)); - MM_INFO("ACDB READ Command RC --->%x,"\ - "stream_id %x\n", rc, - acdb_data.preproc_stream_id); - } - rc = wait_event_timeout(rtc_acdb.wait, - (rtc_acdb.err != - ACDB_RTC_PENDING_RESPONSE), - msecs_to_jiffies(RTC_MAX_TIMEOUT)); - MM_INFO("ACDB READ ACK Count = %x Err = %x\n", - count, rtc_acdb.err); - { - if (rtc_acdb.err == ACDB_RTC_SUCCESS - && rtc_read->viraddr != NULL) { - memcpy(buffer, rtc_read->viraddr, count); - n = count; - while (counter < count) { - MM_DBG("%x", \ - rtc_read->viraddr[counter]); - counter++; - } - } - } - } - } - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static bool acdb_set_tx_rtc(const char *ubuf, size_t writecount) -{ - audpreproc_cmd_cfg_iir_tuning_filter_params *preproc_iir; - audpreproc_cmd_cfg_agc_params *preproc_agc; - audpreproc_cmd_cfg_ns_params *preproc_ns; - s32 result = 0; - bool retval = false; - unsigned short iircmdsize = - sizeof(audpreproc_cmd_cfg_iir_tuning_filter_params); - unsigned short iircmdid = AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - - switch (rtc_acdb.set_abid) { - - case AUDPREPROC_CMD_CFG_AGC_PARAMS: - { - preproc_agc = kmalloc(sizeof(\ - audpreproc_cmd_cfg_agc_params),\ - GFP_KERNEL); - if ((sizeof(audpreproc_cmd_cfg_agc_params) -\ - (sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --"\ - "AGC TX writecount > DSP struct\n"); - } else { - if (preproc_agc != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_agc; - offset = offsetof(\ - audpreproc_cmd_cfg_agc_params,\ - tx_agc_param_mask); - offset_addr = (unsigned short *)(base + offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_agc->cmd_id = - AUDPREPROC_CMD_CFG_AGC_PARAMS; - - result = audpreproc_dsp_set_agc( - preproc_agc, - sizeof(\ - audpreproc_cmd_cfg_agc_params)); - if (result) { - MM_ERR("ACDB=> Failed to "\ - "send AGC data to "\ - "preproc)\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---"\ - "GC Tx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --"\ - "AGC TX kalloc Failed LEN\n"); - } - } - if (preproc_agc != NULL) - kfree(preproc_agc); - break; - } - case AUDPREPROC_CMD_CFG_NS_PARAMS: - { - - preproc_ns = kmalloc(sizeof(\ - audpreproc_cmd_cfg_ns_params),\ - GFP_KERNEL); - if ((sizeof(audpreproc_cmd_cfg_ns_params) -\ - (sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --"\ - "NS TX writecount > DSP struct\n"); - } else { - if (preproc_ns != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_ns; - offset = offsetof(\ - audpreproc_cmd_cfg_ns_params,\ - ec_mode_new); - offset_addr = (unsigned short *)(base + offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_ns->cmd_id = - AUDPREPROC_CMD_CFG_NS_PARAMS; - result = audpreproc_dsp_set_ns( - preproc_ns, - sizeof(\ - audpreproc_cmd_cfg_ns_params)); - if (result) { - MM_ERR("ACDB=> Failed to send "\ - "NS data to preproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---NS Tx "\ - "copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --NS TX "\ - "kalloc Failed LEN\n"); - } - } - if (preproc_ns != NULL) - kfree(preproc_ns); - break; - } - case AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS: - { - - preproc_iir = kmalloc(sizeof(\ - audpreproc_cmd_cfg_iir_tuning_filter_params),\ - GFP_KERNEL); - if ((sizeof(\ - audpreproc_cmd_cfg_iir_tuning_filter_params)-\ - (sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --IIR TX writecount "\ - "> DSP struct\n"); - } else { - if (preproc_iir != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_iir; - offset = offsetof(\ - audpreproc_cmd_cfg_iir_tuning_filter_params,\ - active_flag); - offset_addr = (unsigned short *)(base + \ - offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_iir->cmd_id = iircmdid; - result = audpreproc_dsp_set_iir(\ - preproc_iir, - iircmdsize); - if (result) { - MM_ERR("ACDB=> Failed to send "\ - "IIR data to preproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---IIR Tx "\ - "copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --IIR TX kalloc "\ - "Failed LEN\n"); - } - } - if (preproc_iir != NULL) - kfree(preproc_iir); - break; - } - } - return retval; -} - -static bool acdb_set_rx_rtc(const char *ubuf, size_t writecount) -{ - - audpp_cmd_cfg_object_params_volume *volpan_config; - audpp_cmd_cfg_object_params_mbadrc *mbadrc_config; - struct acdb_block_mbadrc_rtc *acdb_mbadrc_rtc; - audpp_cmd_cfg_object_params_eqalizer *eq_config; - audpp_cmd_cfg_object_params_pcm *iir_config; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - s32 result = 0; - bool retval = false; - - switch (rtc_acdb.set_abid) { - case AUDPP_CMD_VOLUME_PAN: - { - volpan_config = kmalloc(sizeof(\ - audpp_cmd_cfg_object_params_volume),\ - GFP_KERNEL); - if ((sizeof(audpp_cmd_cfg_object_params_volume) -\ - sizeof(audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE -- "\ - "VolPan writecount > DSP struct\n"); - } else { - if (volpan_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)volpan_config; - offset = offsetof(\ - audpp_cmd_cfg_object_params_volume,\ - volume); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - MM_ERR("ACDB RX WRITE DATA: "\ - "AUDPP_CMD_VOLUME_PAN\n"); - result = audpp_set_volume_and_pan( - COMMON_OBJ_ID, - volpan_config->volume, - volpan_config->pan); - if (result) { - MM_ERR("ACDB=> Failed to "\ - "send VOLPAN data to" - " postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---"\ - "copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --"\ - "Vol Pan kalloc Failed LEN\n"); - } - } - if (volpan_config != NULL) - kfree(volpan_config); - break; - } - - case AUDPP_CMD_IIR_TUNING_FILTER: - { - iir_config = kmalloc(sizeof(\ - audpp_cmd_cfg_object_params_pcm),\ - GFP_KERNEL); - if ((sizeof(audpp_cmd_cfg_object_params_pcm) -\ - sizeof(audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --"\ - "IIR RX writecount > DSP struct\n"); - } else { - if (iir_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)iir_config; - offset = offsetof(\ - audpp_cmd_cfg_object_params_pcm,\ - active_flag); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - MM_ERR("ACDB RX WRITE DATA:"\ - "AUDPP_CMD_IIR_TUNING_FILTER\n"); - result = audpp_dsp_set_rx_iir( - COMMON_OBJ_ID, - iir_config->active_flag,\ - iir_config); - if (result) { - MM_ERR("ACDB=> Failed to send"\ - "IIR data to"\ - "postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---"\ - "IIR Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --"\ - "acdb_iir_block kalloc Failed LEN\n"); - } - } - if (iir_config != NULL) - kfree(iir_config); - break; - } - case AUDPP_CMD_EQUALIZER: - { - eq_config = kmalloc(sizeof(\ - audpp_cmd_cfg_object_params_eqalizer),\ - GFP_KERNEL); - if ((sizeof(audpp_cmd_cfg_object_params_eqalizer) -\ - sizeof(audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --"\ - "EQ RX writecount > DSP struct\n"); - } else { - if (eq_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)eq_config; - offset = offsetof(\ - audpp_cmd_cfg_object_params_eqalizer,\ - eq_flag); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - MM_ERR("ACDB RX WRITE"\ - "DATA:AUDPP_CMD_EQUALIZER\n"); - result = audpp_dsp_set_eq( - COMMON_OBJ_ID, - eq_config->eq_flag,\ - eq_config); - if (result) { - MM_ERR("ACDB=> Failed to "\ - "send EQ data to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---"\ - "EQ Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --"\ - "EQ kalloc Failed LEN\n"); - } - } - if (eq_config != NULL) - kfree(eq_config); - break; - } - - case AUDPP_CMD_MBADRC: - { - acdb_mbadrc_rtc = kmalloc(sizeof(struct \ - acdb_block_mbadrc_rtc),\ - GFP_KERNEL); - mbadrc_config = kmalloc(sizeof(\ - audpp_cmd_cfg_object_params_mbadrc),\ - GFP_KERNEL); - if (mbadrc_config != NULL && acdb_mbadrc_rtc != NULL) { - if ((copy_from_user(acdb_mbadrc_rtc,\ - (void *)ubuf, - sizeof(struct acdb_block_mbadrc_rtc))) - == 0x00) { - - memset(mbadrc_config, 0, - sizeof(\ - audpp_cmd_cfg_object_params_mbadrc)); - - mbadrc_config->enable = - acdb_mbadrc_rtc->enable; - mbadrc_config->num_bands = - acdb_mbadrc_rtc->num_bands; - mbadrc_config->down_samp_level = - acdb_mbadrc_rtc->down_samp_level; - mbadrc_config->adrc_delay = - acdb_mbadrc_rtc->adrc_delay; - memcpy(mbadrc_config->adrc_band,\ - acdb_mbadrc_rtc->adrc_band,\ - AUDPP_MAX_MBADRC_BANDS *\ - sizeof(struct adrc_config)); - if (mbadrc_config->num_bands > 1) { - mbadrc_config->ext_buf_size = - (97 * 2) + (33 * 2 * \ - (mbadrc_config->num_bands - 2)); - } - mbadrc_config->ext_partition = 0; - mbadrc_config->ext_buf_lsw = - (u16) EXTRACT_LOW_WORD(\ - rtc_write->phys); - mbadrc_config->ext_buf_msw = - (u16) EXTRACT_HIGH_WORD(\ - rtc_write->phys); - memcpy(rtc_write->viraddr, - acdb_mbadrc_rtc->ext_buff, - (196*sizeof(signed int))); - result = audpp_dsp_set_mbadrc( - COMMON_OBJ_ID, - mbadrc_config->enable, - mbadrc_config); - if (result) { - MM_ERR("ACDB=> Failed to "\ - "Send MBADRC data "\ - "to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---"\ - "MBADRC Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --MBADRC kalloc Failed LEN\n"); - } - if (mbadrc_config != NULL) - kfree(mbadrc_config); - if (acdb_mbadrc_rtc != NULL) - kfree(acdb_mbadrc_rtc); - break; - } - } - return retval; -} -static ssize_t rtc_getsetabid_data_dbg_write(struct file *filp, - const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - if (rtc_acdb.valid_abid != true) { - MM_INFO("ACDB DATA READ ---INVALID ABID\n"); - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - } else { - if (rtc_acdb.tx_rx_ctl == ACDB_RTC_RX) { - if (acdb_set_rx_rtc(ubuf, cnt)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - } else { - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - cnt = 0; - } - } else if (rtc_acdb.tx_rx_ctl == ACDB_RTC_TX) { - if (acdb_set_tx_rtc(ubuf, cnt)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - } else { - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - cnt = 0; - } - } - } - return cnt; -} - - -static const struct file_operations rtc_acdb_data_debug_fops = { - .open = rtc_getsetabid_data_dbg_open, - .write = rtc_getsetabid_data_dbg_write, - .read = rtc_getsetabid_data_dbg_read -}; - -static const struct file_operations rtc_acdb_debug_fops = { - .open = rtc_getsetabid_dbg_open, - .write = rtc_getsetabid_dbg_write, - .read = rtc_getsetabid_dbg_read -}; - -static void rtc_acdb_deinit(void) -{ - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - if (get_set_abid_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_dentry); - } - - if (get_set_abid_data_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_data_dentry); - } - rtc_acdb.abid = 0; - rtc_acdb.acdb_id = 0; - rtc_acdb.cmd_id = 0; - rtc_acdb.err = 1; - rtc_acdb.set_abid = 0; - rtc_acdb.set_iid = 0; - rtc_acdb.tx_rx_ctl = 0; - rtc_acdb.valid_abid = false; - - if (rtc_read->viraddr != NULL || ((void *)rtc_read->phys) != NULL) { - iounmap(rtc_read->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_read->phys); - } - if (rtc_write->viraddr != NULL || ((void *)rtc_write->phys) != NULL) { - iounmap(rtc_write->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_write->phys); - } -} - -static bool rtc_acdb_init(void) -{ - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - s32 result = 0; - char name[sizeof "get_set_abid"+1]; - char name1[sizeof "get_set_abid_data"+1]; - rtc_acdb.abid = 0; - rtc_acdb.acdb_id = 0; - rtc_acdb.cmd_id = 0; - rtc_acdb.err = 1; - rtc_acdb.set_abid = 0; - rtc_acdb.set_iid = 0; - rtc_acdb.valid_abid = false; - rtc_acdb.tx_rx_ctl = 0; - - snprintf(name, sizeof name, "get_set_abid"); - get_set_abid_dentry = debugfs_create_file(name, - S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, &rtc_acdb_debug_fops); - if (IS_ERR(get_set_abid_dentry)) { - MM_ERR("SET GET ABID debugfs_create_file failed\n"); - return false; - } - - snprintf(name1, sizeof name1, "get_set_abid_data"); - get_set_abid_data_dentry = debugfs_create_file(name1, - S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, - &rtc_acdb_data_debug_fops); - if (IS_ERR(get_set_abid_data_dentry)) { - MM_ERR("SET GET ABID DATA"\ - " debugfs_create_file failed\n"); - return false; - } - - rtc_read->phys = allocate_contiguous_ebi_nomap(PMEM_RTC_ACDB_QUERY_MEM, - SZ_4K); - - if (!rtc_read->phys) { - MM_ERR("ACDB Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - rtc_read->map_v_rtc = ioremap(rtc_read->phys, - PMEM_RTC_ACDB_QUERY_MEM); - - if (IS_ERR(rtc_read->map_v_rtc)) { - MM_ERR("ACDB Could not map physical address\n"); - result = -ENOMEM; - goto error; - } - rtc_read->viraddr = rtc_read->map_v_rtc; - memset(rtc_read->viraddr, 0, PMEM_RTC_ACDB_QUERY_MEM); - - rtc_write->phys = allocate_contiguous_ebi_nomap(PMEM_RTC_ACDB_QUERY_MEM, - SZ_4K); - - if (!rtc_write->phys) { - MM_ERR("ACDB Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - rtc_write->map_v_rtc = ioremap(rtc_write->phys, - PMEM_RTC_ACDB_QUERY_MEM); - - if (IS_ERR(rtc_write->map_v_rtc)) { - MM_ERR("ACDB Could not map physical address\n"); - result = -ENOMEM; - goto error; - } - rtc_write->viraddr = rtc_write->map_v_rtc; - memset(rtc_write->viraddr, 0, PMEM_RTC_ACDB_QUERY_MEM); - init_waitqueue_head(&rtc_acdb.wait); - return true; -error: - MM_DBG("INIT RTC FAILED REMOVING RTC DEBUG FS\n"); - if (get_set_abid_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_dentry); - } - - if (get_set_abid_data_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_data_dentry); - } - if (rtc_read->viraddr != NULL || ((void *)rtc_read->phys) != NULL) { - iounmap(rtc_read->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_read->phys); - } - if (rtc_write->viraddr != NULL || ((void *)rtc_write->phys) != NULL) { - iounmap(rtc_write->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_write->phys); - } - return false; -} -#else -void acdb_rtc_set_err(u32 err_code) -{ - return 0 -} -#endif /*CONFIG_DEBUG_FS*/ -static s32 acdb_set_calibration_blk(unsigned long arg) -{ - struct acdb_cmd_device acdb_cmd; - s32 result = 0; - - MM_DBG("acdb_set_calibration_blk\n"); - if (copy_from_user(&acdb_cmd, (struct acdb_cmd_device *)arg, - sizeof(acdb_cmd))) { - MM_ERR("Failed copy command struct from user in"\ - "acdb_set_calibration_blk\n"); - return -EFAULT; - } - acdb_cmd.phys_buf = (u32 *)acdb_data.paddr; - - MM_DBG("acdb_cmd.phys_buf %x\n", (u32)acdb_cmd.phys_buf); - - result = dalrpc_fcn_8(ACDB_DAL_IOCTL, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Set RPC failure"\ - " result = %d\n", result); - return -EINVAL; - } else { - MM_ERR("ACDB=> Device Set RPC success\n"); - if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) - MM_DBG("ACDB_SET_DEVICE Success\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_SET_DEVICE Failure\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_SET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } - return result; -} - -static s32 acdb_get_calibration_blk(unsigned long arg) -{ - s32 result = 0; - struct acdb_cmd_device acdb_cmd; - - MM_DBG("acdb_get_calibration_blk\n"); - - if (copy_from_user(&acdb_cmd, (struct acdb_cmd_device *)arg, - sizeof(acdb_cmd))) { - MM_ERR("Failed copy command struct from user in"\ - "acdb_get_calibration_blk\n"); - return -EFAULT; - } - acdb_cmd.phys_buf = (u32 *)acdb_data.paddr; - MM_ERR("acdb_cmd.phys_buf %x\n", (u32)acdb_cmd.phys_buf); - - result = dalrpc_fcn_8(ACDB_DAL_IOCTL, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Get RPC failure"\ - " result = %d\n", result); - return -EINVAL; - } else { - MM_ERR("ACDB=> Device Get RPC Success\n"); - if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) - MM_DBG("ACDB_GET_DEVICE Success\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_GET_DEVICE Failure\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_GET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } - return result; -} - -static int audio_acdb_open(struct inode *inode, struct file *file) -{ - MM_DBG("%s\n", __func__); - return 0; -} -static int audio_acdb_release(struct inode *inode, struct file *file) -{ - MM_DBG("%s\n", __func__); - return 0; -} - -static long audio_acdb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - unsigned long flags = 0; - - MM_DBG("%s\n", __func__); - - switch (cmd) { - case AUDIO_SET_EQ: - MM_DBG("IOCTL SET_EQ_CONFIG\n"); - if (copy_from_user(&acdb_data.eq.num_bands, (void *) arg, - sizeof(acdb_data.eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&acdb_data.dsp_lock, flags); - rc = audpp_dsp_set_eq(COMMON_OBJ_ID, 1, - &acdb_data.eq); - if (rc < 0) - MM_ERR("AUDPP returned err =%d\n", rc); - spin_unlock_irqrestore(&acdb_data.dsp_lock, flags); - break; - case AUDIO_SET_ACDB_BLK: - MM_DBG("IOCTL AUDIO_SET_ACDB_BLK\n"); - rc = acdb_set_calibration_blk(arg); - break; - case AUDIO_GET_ACDB_BLK: - MM_DBG("IOiCTL AUDIO_GET_ACDB_BLK\n"); - rc = acdb_get_calibration_blk(arg); - break; - default: - MM_DBG("Unknown IOCTL%d\n", cmd); - rc = -EINVAL; - } - return rc; -} - -static const struct file_operations acdb_fops = { - .owner = THIS_MODULE, - .open = audio_acdb_open, - .release = audio_acdb_release, - .llseek = no_llseek, - .unlocked_ioctl = audio_acdb_ioctl -}; - -struct miscdevice acdb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_acdb", - .fops = &acdb_fops, -}; - -static s32 acdb_get_calibration(void) -{ - struct acdb_cmd_get_device_table acdb_cmd; - s32 result = 0; - u32 iterations = 0; - - MM_DBG("acdb state = %d\n", acdb_data.acdb_state); - - acdb_cmd.command_id = ACDB_GET_DEVICE_TABLE; - acdb_cmd.device_id = acdb_data.device_info->acdb_id; - acdb_cmd.network_id = 0x0108B153; - acdb_cmd.sample_rate_id = acdb_data.device_info->sample_rate; - acdb_cmd.total_bytes = ACDB_BUF_SIZE; - acdb_cmd.phys_buf = (u32 *)acdb_data.phys_addr; - MM_DBG("device_id = %d, sampling_freq = %d\n", - acdb_cmd.device_id, acdb_cmd.sample_rate_id); - - do { - result = dalrpc_fcn_8(ACDB_DAL_IOCTL, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device table RPC failure"\ - " result = %d\n", result); - goto error; - } - /*following check is introduced to handle boot up race - condition between AUDCAL SW peers running on apps - and modem (ACDB_RES_BADSTATE indicates modem AUDCAL SW is - not in initialized sate) we need to retry to get ACDB - values*/ - if (acdb_data.acdb_result.result == ACDB_RES_BADSTATE) { - msleep(500); - iterations++; - } else if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) { - MM_DBG("Modem query for acdb values is successful"\ - " (iterations = %d)\n", iterations); - acdb_data.acdb_state |= CAL_DATA_READY; - return result; - } else { - MM_ERR("ACDB=> modem failed to fill acdb values,"\ - " reuslt = %d, (iterations = %d)\n", - acdb_data.acdb_result.result, - iterations); - goto error; - } - } while (iterations < MAX_RETRY); - MM_ERR("ACDB=> AUDCAL SW on modem is not in intiailized state (%d)\n", - acdb_data.acdb_result.result); -error: - result = -EINVAL; - return result; -} - -s32 acdb_get_calibration_data(struct acdb_get_block *get_block) -{ - s32 result = -EINVAL; - struct acdb_cmd_device acdb_cmd; - struct acdb_result acdb_result; - - MM_DBG("acdb_get_calibration_data\n"); - - acdb_cmd.command_id = ACDB_GET_DEVICE; - acdb_cmd.network_id = 0x0108B153; - acdb_cmd.device_id = get_block->acdb_id; - acdb_cmd.sample_rate_id = get_block->sample_rate_id; - acdb_cmd.interface_id = get_block->interface_id; - acdb_cmd.algorithm_block_id = get_block->algorithm_block_id; - acdb_cmd.total_bytes = get_block->total_bytes; - acdb_cmd.phys_buf = (u32 *)acdb_data.get_blk_paddr; - - result = dalrpc_fcn_8(ACDB_DAL_IOCTL, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_result, - sizeof(acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Get RPC failure"\ - " result = %d\n", result); - goto err_state; - } else { - MM_DBG("ACDB=> Device Get RPC Success\n"); - if (acdb_result.result == ACDB_RES_SUCCESS) { - MM_DBG("ACDB_GET_DEVICE Success\n"); - result = 0; - memcpy(get_block->buf_ptr, acdb_data.get_blk_kvaddr, - get_block->total_bytes); - } else if (acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_GET_DEVICE Failure\n"); - else if (acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_GET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } -err_state: - return result; -} -EXPORT_SYMBOL(acdb_get_calibration_data); - -int is_acdb_enabled() -{ - if (acdb_data.handle != NULL) - return 1; - else - return 0; -} -EXPORT_SYMBOL(is_acdb_enabled); - -static u8 check_device_info_already_present( - struct dev_evt_msg device_info, - struct acdb_cache_node *acdb_cache_free_node) -{ - if ((device_info.sample_rate == - acdb_cache_free_node->device_info.\ - sample_rate) && - (device_info.acdb_id == - acdb_cache_free_node->device_info.acdb_id)) { - MM_DBG("acdb values are already present\n"); - /*if acdb state is not set for CAL_DATA_READY and node status - is filled, acdb state should be updated with CAL_DATA_READY - state*/ - acdb_data.acdb_state |= CAL_DATA_READY; - return 1; /*node is present but status as filled*/ - } - MM_DBG("copying device info into node\n"); - /*as device information is not present in cache copy - the current device information into the node*/ - memcpy(&acdb_cache_free_node->device_info, - &device_info, sizeof(device_info)); - return 0; /*cant find the node*/ -} - -static struct acdb_iir_block *get_audpp_irr_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_IIR_RX) { - if (prs_hdr->iid == IID_AUDIO_IIR_COEFF) - return (struct acdb_iir_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - - -static s32 acdb_fill_audpp_iir(void) -{ - struct acdb_iir_block *acdb_iir; - s32 i = 0; - - acdb_iir = get_audpp_irr_block(); - if (acdb_iir == NULL) { - MM_ERR("unable to find audpp iir block returning\n"); - return -EINVAL; - } - memset(acdb_data.pp_iir, 0, sizeof(*acdb_data.pp_iir)); - - acdb_data.pp_iir->active_flag = acdb_iir->enable_flag; - acdb_data.pp_iir->num_bands = acdb_iir->stage_count; - for (; i < acdb_iir->stage_count; i++) { - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b0_filter_lsw = - acdb_iir->stages[i].b0_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b0_filter_msw = - acdb_iir->stages[i].b0_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b1_filter_lsw = - acdb_iir->stages[i].b1_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b1_filter_msw = - acdb_iir->stages[i].b1_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b2_filter_lsw = - acdb_iir->stages[i].b2_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b2_filter_msw = - acdb_iir->stages[i].b2_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a0_filter_lsw = - acdb_iir->stages_a[i].a1_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a0_filter_msw = - acdb_iir->stages_a[i].a1_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a1_filter_lsw = - acdb_iir->stages_a[i].a2_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a1_filter_msw = - acdb_iir->stages_a[i].a2_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - shift_factor_filter[i].shift_factor_0 = - acdb_iir->shift_factor[i]; - acdb_data.pp_iir->params_filter.filter_4_params.pan_filter[i]. - pan_filter_0 = acdb_iir->pan[i]; - } - return 0; -} - -static void extract_mbadrc(u32 *phy_addr, struct header *prs_hdr, u32 *index) -{ - if (prs_hdr->iid == IID_MBADRC_EXT_BUFF) { - MM_DBG("Got IID = IID_MBADRC_EXT_BUFF\n"); - *phy_addr = acdb_data.phys_addr + *index + - sizeof(struct header); - memcpy(acdb_data.mbadrc_block.ext_buf, - (acdb_data.virt_addr + *index + - sizeof(struct header)), 196*2); - MM_DBG("phy_addr = %x\n", *phy_addr); - *index += prs_hdr->data_len + sizeof(struct header); - } else if (prs_hdr->iid == IID_MBADRC_BAND_CONFIG) { - MM_DBG("Got IID == IID_MBADRC_BAND_CONFIG\n"); - memcpy(acdb_data.mbadrc_block.band_config, (acdb_data.virt_addr - + *index + sizeof(struct header)), - sizeof(struct mbadrc_band_config_type) * - acdb_data.mbadrc_block.parameters.\ - mbadrc_num_bands); - *index += prs_hdr->data_len + sizeof(struct header); - } else if (prs_hdr->iid == IID_MBADRC_PARAMETERS) { - struct mbadrc_parameter *tmp; - tmp = (struct mbadrc_parameter *)(acdb_data.virt_addr + *index - + sizeof(struct header)); - MM_DBG("Got IID == IID_MBADRC_PARAMETERS"); - acdb_data.mbadrc_block.parameters.mbadrc_enable = - tmp->mbadrc_enable; - acdb_data.mbadrc_block.parameters.mbadrc_num_bands = - tmp->mbadrc_num_bands; - acdb_data.mbadrc_block.parameters.mbadrc_down_sample_level = - tmp->mbadrc_down_sample_level; - acdb_data.mbadrc_block.parameters.mbadrc_delay = - tmp->mbadrc_delay; - *index += prs_hdr->data_len + sizeof(struct header); - } -} - -static void get_audpp_mbadrc_block(u32 *phy_addr) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_MBADRC_RX) { - if ((prs_hdr->iid == IID_MBADRC_EXT_BUFF) - || (prs_hdr->iid == - IID_MBADRC_BAND_CONFIG) - || (prs_hdr->iid == - IID_MBADRC_PARAMETERS)) { - extract_mbadrc(phy_addr, prs_hdr, - &index); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } -} - -static s32 acdb_fill_audpp_mbadrc(void) -{ - u32 mbadrc_phys_addr = -1; - get_audpp_mbadrc_block(&mbadrc_phys_addr); - if (IS_ERR_VALUE(mbadrc_phys_addr)) { - MM_ERR("failed to get mbadrc block\n"); - return -EINVAL; - } - - memset(acdb_data.pp_mbadrc, 0, sizeof(*acdb_data.pp_mbadrc)); - - acdb_data.pp_mbadrc->enable = acdb_data.mbadrc_block.\ - parameters.mbadrc_enable; - acdb_data.pp_mbadrc->num_bands = - acdb_data.mbadrc_block.\ - parameters.mbadrc_num_bands; - acdb_data.pp_mbadrc->down_samp_level = - acdb_data.mbadrc_block.parameters.\ - mbadrc_down_sample_level; - acdb_data.pp_mbadrc->adrc_delay = - acdb_data.mbadrc_block.parameters.\ - mbadrc_delay; - - if (acdb_data.mbadrc_block.parameters.mbadrc_num_bands > 1) - acdb_data.pp_mbadrc->ext_buf_size = (97 * 2) + - (33 * 2 * (acdb_data.mbadrc_block.parameters.\ - mbadrc_num_bands - 2)); - - acdb_data.pp_mbadrc->ext_partition = 0; - acdb_data.pp_mbadrc->ext_buf_lsw = (u16)(mbadrc_phys_addr\ - & 0xFFFF); - acdb_data.pp_mbadrc->ext_buf_msw = (u16)((mbadrc_phys_addr\ - & 0xFFFF0000) >> 16); - memcpy(acdb_data.pp_mbadrc->adrc_band, acdb_data.mbadrc_block.\ - band_config, - sizeof(struct mbadrc_band_config_type) * - acdb_data.mbadrc_block.parameters.mbadrc_num_bands); - return 0; -} - -static s32 acdb_calibrate_audpp(void) -{ - s32 result = 0; - - result = acdb_fill_audpp_iir(); - if (!IS_ERR_VALUE(result)) { - result = audpp_dsp_set_rx_iir(COMMON_OBJ_ID, - acdb_data.pp_iir->active_flag, - acdb_data.pp_iir); - if (result) { - MM_ERR("ACDB=> Failed to send IIR data to postproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPP is calibrated with IIR parameters\n"); - } - result = acdb_fill_audpp_mbadrc(); - if (!IS_ERR_VALUE(result)) { - result = audpp_dsp_set_mbadrc(COMMON_OBJ_ID, - acdb_data.pp_mbadrc->enable, - acdb_data.pp_mbadrc); - if (result) { - MM_ERR("ACDB=> Failed to send MBADRC data to"\ - " postproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPP is calibrated with MBADRC parameters"); - } -done: - return result; -} - -static s32 acdb_re_enable_audpp(void) -{ - s32 result = 0; - - if ((acdb_data.audpp_disabled_features & - (1 << AUDPP_CMD_IIR_TUNING_FILTER)) - == (1 << AUDPP_CMD_IIR_TUNING_FILTER)) { - result = audpp_dsp_set_rx_iir(COMMON_OBJ_ID, - acdb_data.pp_iir->active_flag, - acdb_data.pp_iir); - if (result) { - MM_ERR("ACDB=> Failed to send IIR data to postproc\n"); - result = -EINVAL; - } else { - MM_DBG("Re-enable IIR parameters"); - } - } - if ((acdb_data.audpp_disabled_features & (1 << AUDPP_CMD_MBADRC)) - == (1 << AUDPP_CMD_MBADRC)) { - result = audpp_dsp_set_mbadrc(COMMON_OBJ_ID, - acdb_data.pp_mbadrc->enable, - acdb_data.pp_mbadrc); - if (result) { - MM_ERR("ACDB=> Failed to send MBADRC data to"\ - " postproc\n"); - result = -EINVAL; - } else { - MM_DBG("Re-enable MBADRC parameters"); - } - } - acdb_data.audpp_disabled_features = 0; - return result; -} - -static struct acdb_agc_block *get_audpreproc_agc_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_AGC_TX) { - if (prs_hdr->iid == IID_AUDIO_AGC_PARAMETERS) { - MM_DBG("GOT ABID_AUDIO_AGC_TX\n"); - return (struct acdb_agc_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpreproc_agc(void) -{ - struct acdb_agc_block *acdb_agc; - - acdb_agc = get_audpreproc_agc_block(); - if (!acdb_agc) { - MM_DBG("unable to find preproc agc parameters winding up\n"); - return -EINVAL; - } - memset(acdb_data.preproc_agc, 0, sizeof(*acdb_data.preproc_agc)); - acdb_data.preproc_agc->cmd_id = AUDPREPROC_CMD_CFG_AGC_PARAMS; - /* 0xFE00 to configure all parameters */ - acdb_data.preproc_agc->tx_agc_param_mask = 0xFFFF; - if (acdb_agc->enable_status) - acdb_data.preproc_agc->tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_ENA; - else - acdb_data.preproc_agc->tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_DIS; - - acdb_data.preproc_agc->comp_rlink_static_gain = - acdb_agc->comp_rlink_static_gain; - acdb_data.preproc_agc->comp_rlink_aig_flag = - acdb_agc->comp_rlink_aig_flag; - acdb_data.preproc_agc->expander_rlink_th = - acdb_agc->exp_rlink_threshold; - acdb_data.preproc_agc->expander_rlink_slope = - acdb_agc->exp_rlink_slope; - acdb_data.preproc_agc->compressor_rlink_th = - acdb_agc->comp_rlink_threshold; - acdb_data.preproc_agc->compressor_rlink_slope = - acdb_agc->comp_rlink_slope; - - /* 0xFFF0 to configure all parameters */ - acdb_data.preproc_agc->tx_adc_agc_param_mask = 0xFFFF; - - acdb_data.preproc_agc->comp_rlink_aig_attackk = - acdb_agc->comp_rlink_aig_attack_k; - acdb_data.preproc_agc->comp_rlink_aig_leak_down = - acdb_agc->comp_rlink_aig_leak_down; - acdb_data.preproc_agc->comp_rlink_aig_leak_up = - acdb_agc->comp_rlink_aig_leak_up; - acdb_data.preproc_agc->comp_rlink_aig_max = - acdb_agc->comp_rlink_aig_max; - acdb_data.preproc_agc->comp_rlink_aig_min = - acdb_agc->comp_rlink_aig_min; - acdb_data.preproc_agc->comp_rlink_aig_releasek = - acdb_agc->comp_rlink_aig_release_k; - acdb_data.preproc_agc->comp_rlink_aig_leakrate_fast = - acdb_agc->comp_rlink_aig_sm_leak_rate_fast; - acdb_data.preproc_agc->comp_rlink_aig_leakrate_slow = - acdb_agc->comp_rlink_aig_sm_leak_rate_slow; - acdb_data.preproc_agc->comp_rlink_attackk_msw = - acdb_agc->comp_rlink_attack_k_msw; - acdb_data.preproc_agc->comp_rlink_attackk_lsw = - acdb_agc->comp_rlink_attack_k_lsw; - acdb_data.preproc_agc->comp_rlink_delay = - acdb_agc->comp_rlink_delay; - acdb_data.preproc_agc->comp_rlink_releasek_msw = - acdb_agc->comp_rlink_release_k_msw; - acdb_data.preproc_agc->comp_rlink_releasek_lsw = - acdb_agc->comp_rlink_release_k_lsw; - acdb_data.preproc_agc->comp_rlink_rms_tav = - acdb_agc->comp_rlink_rms_trav; - return 0; -} - -static struct acdb_iir_block *get_audpreproc_irr_block(void) -{ - - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_IIR_TX) { - if (prs_hdr->iid == IID_AUDIO_IIR_COEFF) - return (struct acdb_iir_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - - -static s32 acdb_fill_audpreproc_iir(void) -{ - struct acdb_iir_block *acdb_iir; - - - acdb_iir = get_audpreproc_irr_block(); - if (!acdb_iir) { - MM_DBG("unable to find preproc iir parameters winding up\n"); - return -EINVAL; - } - memset(acdb_data.preproc_iir, 0, sizeof(*acdb_data.preproc_iir)); - - acdb_data.preproc_iir->cmd_id = - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - acdb_data.preproc_iir->active_flag = acdb_iir->enable_flag; - acdb_data.preproc_iir->num_bands = acdb_iir->stage_count; - - acdb_data.preproc_iir->numerator_coeff_b0_filter0_lsw = - acdb_iir->stages[0].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter0_msw = - acdb_iir->stages[0].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter0_lsw = - acdb_iir->stages[0].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter0_msw = - acdb_iir->stages[0].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter0_lsw = - acdb_iir->stages[0].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter0_msw = - acdb_iir->stages[0].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter1_lsw = - acdb_iir->stages[1].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter1_msw = - acdb_iir->stages[1].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter1_lsw = - acdb_iir->stages[1].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter1_msw = - acdb_iir->stages[1].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter1_lsw = - acdb_iir->stages[1].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter1_msw = - acdb_iir->stages[1].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter2_lsw = - acdb_iir->stages[2].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter2_msw = - acdb_iir->stages[2].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter2_lsw = - acdb_iir->stages[2].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter2_msw = - acdb_iir->stages[2].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter2_lsw = - acdb_iir->stages[2].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter2_msw = - acdb_iir->stages[2].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter3_lsw = - acdb_iir->stages[3].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter3_msw = - acdb_iir->stages[3].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter3_lsw = - acdb_iir->stages[3].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter3_msw = - acdb_iir->stages[3].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter3_lsw = - acdb_iir->stages[3].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter3_msw = - acdb_iir->stages[3].b2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter0_lsw = - acdb_iir->stages_a[0].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter0_msw = - acdb_iir->stages_a[0].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter0_lsw = - acdb_iir->stages_a[0].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter0_msw = - acdb_iir->stages_a[0].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter1_lsw = - acdb_iir->stages_a[1].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter1_msw = - acdb_iir->stages_a[1].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter1_lsw = - acdb_iir->stages_a[1].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter1_msw = - acdb_iir->stages_a[1].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter2_lsw = - acdb_iir->stages_a[2].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter2_msw = - acdb_iir->stages_a[2].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter2_lsw = - acdb_iir->stages_a[2].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter2_msw = - acdb_iir->stages_a[2].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter3_lsw = - acdb_iir->stages_a[3].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter3_msw = - acdb_iir->stages_a[3].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter3_lsw = - acdb_iir->stages_a[3].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter3_msw = - acdb_iir->stages_a[3].a2_hi; - - acdb_data.preproc_iir->shift_factor_filter0 = - acdb_iir->shift_factor[0]; - acdb_data.preproc_iir->shift_factor_filter1 = - acdb_iir->shift_factor[1]; - acdb_data.preproc_iir->shift_factor_filter2 = - acdb_iir->shift_factor[2]; - acdb_data.preproc_iir->shift_factor_filter3 = - acdb_iir->shift_factor[3]; - - acdb_data.preproc_iir->channel_selected0 = - acdb_iir->pan[0]; - acdb_data.preproc_iir->channel_selected1 = - acdb_iir->pan[1]; - acdb_data.preproc_iir->channel_selected2 = - acdb_iir->pan[2]; - acdb_data.preproc_iir->channel_selected3 = - acdb_iir->pan[3]; - return 0; -} - -static struct acdb_ns_tx_block *get_audpreproc_ns_block(void) -{ - - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_NS_TX) { - if (prs_hdr->iid == IID_NS_PARAMETERS) - return (struct acdb_ns_tx_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpreproc_ns(void) -{ - struct acdb_ns_tx_block *acdb_ns; - /* TO DO: do we enable_status_filled */ - acdb_ns = get_audpreproc_ns_block(); - if (!acdb_ns) { - MM_DBG("unable to find preproc ns parameters winding up\n"); - return -EINVAL; - } - memset(acdb_data.preproc_ns, 0, sizeof(*acdb_data.preproc_ns)); - acdb_data.preproc_ns->cmd_id = AUDPREPROC_CMD_CFG_NS_PARAMS; - - acdb_data.preproc_ns->ec_mode_new = acdb_ns->ec_mode_new; - acdb_data.preproc_ns->dens_gamma_n = acdb_ns->dens_gamma_n; - acdb_data.preproc_ns->dens_nfe_block_size = - acdb_ns->dens_nfe_block_size; - acdb_data.preproc_ns->dens_limit_ns = acdb_ns->dens_limit_ns; - acdb_data.preproc_ns->dens_limit_ns_d = acdb_ns->dens_limit_ns_d; - acdb_data.preproc_ns->wb_gamma_e = acdb_ns->wb_gamma_e; - acdb_data.preproc_ns->wb_gamma_n = acdb_ns->wb_gamma_n; - - return 0; -} - -s32 acdb_calibrate_audpreproc(void) -{ - s32 result = 0; - - result = acdb_fill_audpreproc_agc(); - if (!IS_ERR_VALUE(result)) { - result = audpreproc_dsp_set_agc(acdb_data.preproc_agc, sizeof( - audpreproc_cmd_cfg_agc_params)); - if (result) { - MM_ERR("ACDB=> Failed to send AGC data to preproc)\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPREC is calibrated with AGC parameters"); - } - result = acdb_fill_audpreproc_iir(); - if (!IS_ERR_VALUE(result)) { - result = audpreproc_dsp_set_iir(acdb_data.preproc_iir, - sizeof(\ - audpreproc_cmd_cfg_iir_tuning_filter_params)); - if (result) { - MM_ERR("ACDB=> Failed to send IIR data to preproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("audpreproc is calibrated with iir parameters"); - } - - result = acdb_fill_audpreproc_ns(); - if (!IS_ERR_VALUE(result)) { - result = audpreproc_dsp_set_ns(acdb_data.preproc_ns, - sizeof(\ - audpreproc_cmd_cfg_ns_params)); - if (result) { - MM_ERR("ACDB=> Failed to send NS data to preproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("audpreproc is calibrated with NS parameters"); - } -done: - return result; -} - -static s32 acdb_send_calibration(void) -{ - s32 result = 0; - - if (acdb_data.device_info->dev_type.rx_device) { - result = acdb_calibrate_audpp(); - if (result) - goto done; - } else if (acdb_data.device_info->dev_type.tx_device) { - result = acdb_calibrate_audpreproc(); - if (result) - goto done; - acdb_data.audrec_applied |= AUDREC_READY; - MM_DBG("acdb_data.audrec_applied = %x\n", - acdb_data.audrec_applied); - } -done: - return result; -} - -static u8 check_tx_acdb_values_cached(void) -{ - if ((acdb_data.device_info->sample_rate == - acdb_cache_tx.device_info.sample_rate) && - (acdb_data.device_info->acdb_id == - acdb_cache_tx.device_info.acdb_id) && - (acdb_cache_tx.node_status == - ACDB_VALUES_FILLED)) - return 0; - else - return 1; -} - -static void handle_tx_device_ready_callback(void) -{ - u8 acdb_value_apply = 0; - u8 result = 0; - - /*check wheather AUDREC enabled before device call backs*/ - if ((acdb_data.acdb_state & AUDREC_READY) && - !(acdb_data.audrec_applied & AUDREC_READY)) { - MM_DBG("AUDREC already enabled apply acdb values\n"); - acdb_value_apply |= AUDREC_READY; - } - if (acdb_value_apply) { - if (session_info.sampling_freq) - acdb_data.device_info->sample_rate = - session_info.sampling_freq; - result = check_tx_acdb_values_cached(); - if (result) { - result = acdb_get_calibration(); - if (result < 0) { - MM_ERR("Not able to get calibration"\ - " data continue\n"); - return; - } - } - acdb_cache_tx.node_status = ACDB_VALUES_FILLED; - acdb_send_calibration(); - } -} - -static struct acdb_cache_node *get_acdb_values_from_cache_tx(u32 stream_id) -{ - MM_DBG("searching node with stream_id"); - if ((acdb_cache_tx.stream_id == stream_id) && - (acdb_cache_tx.node_status == - ACDB_VALUES_NOT_FILLED)) { - return &acdb_cache_tx; - } - MM_DBG("Error! in finding node\n"); - return NULL; -} - -static void update_acdb_data_struct(struct acdb_cache_node *cur_node) -{ - if (cur_node) { - acdb_data.device_info = &cur_node->device_info; - acdb_data.virt_addr = cur_node->virt_addr_acdb_values; - acdb_data.phys_addr = cur_node->phys_addr_acdb_values; - } else - MM_ERR("error in curent node\n"); -} - -static void send_acdb_values_for_active_devices(void) -{ - if (acdb_cache_rx.node_status == - ACDB_VALUES_FILLED) { - update_acdb_data_struct(&acdb_cache_rx); - if (acdb_data.acdb_state & CAL_DATA_READY) - acdb_send_calibration(); - } -} - -static s32 initialize_rpc(void) -{ - s32 result = 0; - - result = daldevice_attach(DALDEVICEID_ACDB, ACDB_PORT_NAME, - ACDB_CPU, &acdb_data.handle); - - if (result) { - MM_ERR("ACDB=> Device Attach failed\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static u32 allocate_memory_acdb_cache_tx(void) -{ - u32 result = 0; - /*initialize local cache */ - acdb_cache_tx.phys_addr_acdb_values = - allocate_contiguous_ebi_nomap(ACDB_BUF_SIZE, - SZ_4K); - - if (!acdb_cache_tx.phys_addr_acdb_values) { - MM_ERR("ACDB=> Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_cache_tx.map_v_addr = ioremap( - acdb_cache_tx.phys_addr_acdb_values, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_cache_tx.map_v_addr)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_cache_tx.phys_addr_acdb_values); - goto error; - } - acdb_cache_tx.virt_addr_acdb_values = - acdb_cache_tx.map_v_addr; - memset(acdb_cache_tx.virt_addr_acdb_values, 0, - ACDB_BUF_SIZE); - return result; -error: - iounmap(acdb_cache_tx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx.phys_addr_acdb_values); - return result; -} - -static u32 allocate_memory_acdb_cache_rx(void) -{ - u32 result = 0; - - /*initialize local cache */ - acdb_cache_rx.phys_addr_acdb_values = - allocate_contiguous_ebi_nomap( - ACDB_BUF_SIZE, SZ_4K); - - if (!acdb_cache_rx.phys_addr_acdb_values) { - MM_ERR("ACDB=> Can not allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_cache_rx.map_v_addr = - ioremap(acdb_cache_rx.phys_addr_acdb_values, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_cache_rx.map_v_addr)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_cache_rx.phys_addr_acdb_values); - goto error; - } - acdb_cache_rx.virt_addr_acdb_values = - acdb_cache_rx.map_v_addr; - memset(acdb_cache_rx.virt_addr_acdb_values, 0, - ACDB_BUF_SIZE); - return result; -error: - iounmap(acdb_cache_rx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx.phys_addr_acdb_values); - return result; -} - -static u32 allocate_memory_acdb_get_blk(void) -{ - u32 result = 0; - acdb_data.get_blk_paddr = allocate_contiguous_ebi_nomap( - ACDB_BUF_SIZE, SZ_4K); - if (!acdb_data.get_blk_paddr) { - MM_ERR("ACDB=> Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_data.map_v_get_blk = ioremap(acdb_data.get_blk_paddr, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_data.map_v_get_blk)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_data.get_blk_paddr); - goto error; - } - acdb_data.get_blk_kvaddr = acdb_data.map_v_get_blk; - memset(acdb_data.get_blk_kvaddr, 0, ACDB_BUF_SIZE); -error: - return result; -} - -static void free_memory_acdb_cache_rx(void) -{ - iounmap(acdb_cache_rx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx.phys_addr_acdb_values); -} - -static void free_memory_acdb_cache_tx(void) -{ - - iounmap(acdb_cache_tx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx.phys_addr_acdb_values); -} - -static void free_memory_acdb_get_blk(void) -{ - iounmap(acdb_data.map_v_get_blk); - free_contiguous_memory_by_paddr(acdb_data.get_blk_paddr); -} - -static s32 initialize_memory(void) -{ - s32 result = 0; - - result = allocate_memory_acdb_get_blk(); - if (result < 0) { - MM_ERR("memory allocation for get blk failed\n"); - goto done; - } - - result = allocate_memory_acdb_cache_rx(); - if (result < 0) { - MM_ERR("memory allocation for rx cache is failed\n"); - free_memory_acdb_get_blk(); - goto done; - } - result = allocate_memory_acdb_cache_tx(); - if (result < 0) { - MM_ERR("memory allocation for tx cache is failed\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - goto done; - } - acdb_data.pp_iir = kmalloc(sizeof(*acdb_data.pp_iir), - GFP_KERNEL); - if (acdb_data.pp_iir == NULL) { - MM_ERR("ACDB=> Could not allocate postproc iir memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - result = -ENOMEM; - goto done; - } - - acdb_data.pp_mbadrc = kmalloc(sizeof(*acdb_data.pp_mbadrc), GFP_KERNEL); - if (acdb_data.pp_mbadrc == NULL) { - MM_ERR("ACDB=> Could not allocate postproc mbadrc memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - result = -ENOMEM; - goto done; - } - - acdb_data.preproc_agc = kmalloc(sizeof(*acdb_data.preproc_agc), - GFP_KERNEL); - if (acdb_data.preproc_agc == NULL) { - MM_ERR("ACDB=> Could not allocate preproc agc memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - result = -ENOMEM; - goto done; - } - - acdb_data.preproc_iir = kmalloc(sizeof(*acdb_data.preproc_iir), - GFP_KERNEL); - if (acdb_data.preproc_iir == NULL) { - MM_ERR("ACDB=> Could not allocate preproc iir memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.preproc_agc); - result = -ENOMEM; - goto done; - } - - acdb_data.preproc_ns = kmalloc(sizeof(*acdb_data.preproc_ns), - GFP_KERNEL); - if (acdb_data.preproc_ns == NULL) { - MM_ERR("ACDB=> Could not allocate preproc ns memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - result = -ENOMEM; - goto done; - } -done: - return result; -} - -static u8 check_device_change(struct dev_evt_msg device_info) -{ - if (!acdb_data.device_info) { - MM_ERR("not pointing to previous valid device detail\n"); - return 1; /*device info will not be pointing to*/ - /* valid device when acdb driver comes up*/ - } - if ((device_info.sample_rate == - acdb_data.device_info->sample_rate) && - (device_info.acdb_id == acdb_data.device_info->acdb_id)) { - return 0; - } - return 1; -} - -static void device_cb(struct dev_evt_msg *evt, void *private) -{ - struct cad_device_info_type dev_type; - struct acdb_cache_node *acdb_cache_free_node = NULL; - u32 session_id = 0; - u8 ret = 0; - u8 device_change = 0; - - /*if session value is zero it indicates that device call back is for - voice call we will drop the request as acdb values for voice call is - not applied from acdb driver*/ - if (!evt->session_info) { - MM_DBG("no active sessions and call back is for"\ - " voice call\n"); - goto done; - } - - if ((evt->dev_type.rx_device) && - (evt->acdb_id == PSEUDO_ACDB_ID)) { - MM_INFO("device cb is for rx device with pseudo acdb id\n"); - goto done; - } - dev_type = evt->dev_type; - MM_DBG("sample_rate = %d\n", evt->sample_rate); - MM_DBG("acdb_id = %d\n", evt->acdb_id); - MM_DBG("sessions = %d\n", evt->session_info); - MM_DBG("acdb_state = %x\n", acdb_data.acdb_state); - mutex_lock(&acdb_data.acdb_mutex); - device_change = check_device_change(*evt); - if (!device_change) { - if (dev_type.tx_device) { - if (!(acdb_data.acdb_state & AUDREC_READY)) - acdb_data.audrec_applied &= ~AUDREC_READY; - - acdb_data.acdb_state &= ~CAL_DATA_READY; - goto update_cache; - } - } else - /* state is updated to query the modem for values */ - acdb_data.acdb_state &= ~CAL_DATA_READY; - -update_cache: - if (dev_type.tx_device) { - /*Only one recording session possible*/ - session_id = 0; - acdb_cache_free_node = &acdb_cache_tx; - ret = check_device_info_already_present( - *evt, - acdb_cache_free_node); - acdb_cache_free_node->stream_id = session_id; - acdb_data.cur_tx_session = session_id; - } else { - acdb_cache_free_node = &acdb_cache_rx; - ret = check_device_info_already_present(*evt, - acdb_cache_free_node); - if (ret == 1) { - MM_DBG("got device ready call back for another "\ - "audplay task sessions on same COPP\n"); - mutex_unlock(&acdb_data.acdb_mutex); - goto done; - } - } - update_acdb_data_struct(acdb_cache_free_node); - acdb_data.device_cb_compl = 1; - mutex_unlock(&acdb_data.acdb_mutex); - wake_up(&acdb_data.wait); -done: - return; -} - -static s32 register_device_cb(void) -{ - s32 result = 0; - acdb_data.dev_cb.func = device_cb; - acdb_data.dev_cb.private = (void *)&acdb_data; - - result = audmgr_register_device_info_callback(&acdb_data.dev_cb); - - if (result) { - MM_ERR("ACDB=> Could not register device callback\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static void audpp_cb(void *private, u32 id, u16 *msg) -{ - MM_DBG("\n"); - - if (id == AUDPP_MSG_PP_DISABLE_FEEDBACK) { - acdb_data.audpp_disabled_features |= - ((uint32_t)(msg[AUDPP_DISABLE_FEATS_MSW] << 16) | - msg[AUDPP_DISABLE_FEATS_LSW]); - MM_INFO("AUDPP disable feedback: %x", - acdb_data.audpp_disabled_features); - goto done; - } else if (id == AUDPP_MSG_PP_FEATS_RE_ENABLE) { - MM_INFO("AUDPP re-enable messaage: %x", - acdb_data.audpp_disabled_features); - acdb_data.audpp_cb_reenable_compl = 1; - wake_up(&acdb_data.wait); - return; - } - - if (id != AUDPP_MSG_CFG_MSG) - goto done; - - if (msg[0] == AUDPP_MSG_ENA_DIS) { - if (--acdb_cache_rx.stream_id <= 0) { - acdb_data.acdb_state &= ~AUDPP_READY; - acdb_cache_rx.stream_id = 0; - MM_DBG("AUDPP_MSG_ENA_DIS\n"); - } - goto done; - } - /*stream_id is used to keep track of number of active*/ - /*sessions active on this device*/ - acdb_cache_rx.stream_id++; - - acdb_data.acdb_state |= AUDPP_READY; - acdb_data.audpp_cb_compl = 1; - wake_up(&acdb_data.wait); -done: - return; -} - -static s8 handle_audpreproc_cb(void) -{ - struct acdb_cache_node *acdb_cached_values; - s8 result = 0; - u8 stream_id = acdb_data.preproc_stream_id; - acdb_data.preproc_cb_compl = 0; - acdb_cached_values = get_acdb_values_from_cache_tx(stream_id); - if (acdb_cached_values == NULL) { - MM_DBG("ERROR: to get chached acdb values\n"); - return -EPERM; - } - update_acdb_data_struct(acdb_cached_values); - - if (session_info.sampling_freq) - acdb_data.device_info->sample_rate = - session_info.sampling_freq; - - if (!(acdb_data.acdb_state & CAL_DATA_READY)) { - result = check_tx_acdb_values_cached(); - if (result) { - result = acdb_get_calibration(); - if (result < 0) { - MM_ERR("failed to get calibration data\n"); - return result; - } - } - acdb_cached_values->node_status = ACDB_VALUES_FILLED; - } - return result; -} - -static void audpreproc_cb(void *private, u32 id, void *event_data) -{ - u8 result = 0; - uint16_t *msg = event_data; - int stream_id = 0; /* Only single tunnel mode recording supported */ - if (id != AUDPREPROC_MSG_CMD_CFG_DONE_MSG) - goto done; - - acdb_data.preproc_stream_id = stream_id; - get_audrec_session_info(&session_info); - MM_DBG("status_flag = %x\n", msg[0]); - if (msg[0] == AUDPREPROC_MSG_STATUS_FLAG_DIS) { - acdb_data.acdb_state &= ~AUDREC_READY; - acdb_cache_tx.node_status =\ - ACDB_VALUES_NOT_FILLED; - acdb_data.acdb_state &= ~CAL_DATA_READY; - goto done; - } - /*Following check is added to make sure that device info - is updated. audpre proc layer enabled without device - callback at this scenario we should not access - device information - */ - if (acdb_data.device_info && - session_info.sampling_freq) { - acdb_data.device_info->sample_rate = - session_info.sampling_freq; - result = check_tx_acdb_values_cached(); - if (!result) { - MM_INFO("acdb values for the stream is" \ - " querried from modem"); - acdb_data.acdb_state |= CAL_DATA_READY; - } else { - acdb_data.acdb_state &= ~CAL_DATA_READY; - } - } - acdb_data.acdb_state |= AUDREC_READY; - - acdb_data.preproc_cb_compl = 1; - MM_DBG("acdb_data.acdb_state = %x\n", acdb_data.acdb_state); - wake_up(&acdb_data.wait); -done: - return; -} - -static s32 register_audpp_cb(void) -{ - s32 result = 0; - - acdb_data.audpp_cb.fn = audpp_cb; - acdb_data.audpp_cb.private = NULL; - result = audpp_register_event_callback(&acdb_data.audpp_cb); - if (result) { - MM_ERR("ACDB=> Could not register audpp callback\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static s32 register_audpreproc_cb(void) -{ - s32 result = 0; - - acdb_data.audpreproc_cb.fn = audpreproc_cb; - acdb_data.audpreproc_cb.private = NULL; - result = audpreproc_register_event_callback(&acdb_data.audpreproc_cb); - if (result) { - MM_ERR("ACDB=> Could not register audpreproc callback\n"); - result = -ENODEV; - goto done; - } - -done: - return result; -} - -static s32 acdb_initialize_data(void) -{ - s32 result = 0; - - mutex_init(&acdb_data.acdb_mutex); - - result = initialize_rpc(); - if (result) - goto err; - - result = initialize_memory(); - if (result) - goto err1; - - result = register_device_cb(); - if (result) - goto err2; - - result = register_audpp_cb(); - if (result) - goto err3; - - result = register_audpreproc_cb(); - if (result) - goto err4; - - - return result; - -err4: - result = audpreproc_unregister_event_callback(&acdb_data.audpreproc_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpreproc callback\n"); -err3: - result = audpp_unregister_event_callback(&acdb_data.audpp_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpp callback\n"); -err2: - result = audmgr_deregister_device_info_callback(&acdb_data.dev_cb); - if (result) - MM_ERR("ACDB=> Could not unregister device callback\n"); -err1: - daldevice_detach(acdb_data.handle); - acdb_data.handle = NULL; -err: - return result; -} - -static s32 acdb_calibrate_device(void *data) -{ - s32 result = 0; - - /* initialize driver */ - result = acdb_initialize_data(); - if (result) - goto done; - - while (!kthread_should_stop()) { - MM_DBG("Waiting for call back events\n"); - wait_event_interruptible(acdb_data.wait, - (acdb_data.device_cb_compl - | acdb_data.audpp_cb_compl - | acdb_data.audpp_cb_reenable_compl - | acdb_data.preproc_cb_compl)); - mutex_lock(&acdb_data.acdb_mutex); - if (acdb_data.device_cb_compl) { - acdb_data.device_cb_compl = 0; - if (!(acdb_data.acdb_state & CAL_DATA_READY)) { - if (acdb_data.device_info->dev_type.rx_device) { - /*we need to get calibration values - only for RX device as resampler - moved to start of the pre - proc chain - tx calibration value will be based on - sampling frequency what audrec is - configured, calibration values for tx - device are fetch in audpreproc - callback*/ - result = acdb_get_calibration(); - if (result < 0) { - mutex_unlock( - &acdb_data.acdb_mutex); - MM_ERR("Not able to get "\ - "calibration "\ - "data continue\n"); - continue; - } - } - } - MM_DBG("acdb state = %d\n", - acdb_data.acdb_state); - if (acdb_data.device_info->dev_type.tx_device) - handle_tx_device_ready_callback(); - else { - if (acdb_data.audpp_cb_reenable_compl) { - MM_INFO("Reset disabled feature flag"); - acdb_data.audpp_disabled_features = 0; - acdb_data.audpp_cb_reenable_compl = 0; - } - acdb_cache_rx.node_status =\ - ACDB_VALUES_FILLED; - if (acdb_data.acdb_state & - AUDPP_READY) { - MM_DBG("AUDPP already enabled "\ - "apply acdb values\n"); - goto apply; - } - } - } - - if (!(acdb_data.audpp_cb_compl || - acdb_data.audpp_cb_reenable_compl || - acdb_data.preproc_cb_compl)) { - MM_DBG("need to wait for either AUDPP / AUDPREPROC "\ - "Event\n"); - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } else { - MM_DBG("got audpp / preproc call back\n"); - if (acdb_data.audpp_cb_compl) { - if (acdb_data.audpp_cb_reenable_compl) { - MM_INFO("Reset disabled feature flag"); - acdb_data.audpp_disabled_features = 0; - acdb_data.audpp_cb_reenable_compl = 0; - } - send_acdb_values_for_active_devices(); - acdb_data.audpp_cb_compl = 0; - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } else if (acdb_data.audpp_cb_reenable_compl) { - acdb_re_enable_audpp(); - acdb_data.audpp_disabled_features = 0; - acdb_data.audpp_cb_reenable_compl = 0; - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } else { - result = handle_audpreproc_cb(); - if (result < 0) { - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } - } - } -apply: - if (acdb_data.acdb_state & CAL_DATA_READY) - result = acdb_send_calibration(); - - mutex_unlock(&acdb_data.acdb_mutex); - } -done: - return 0; -} - -static int __init acdb_init(void) -{ - - s32 result = 0; - - memset(&acdb_data, 0, sizeof(acdb_data)); - spin_lock_init(&acdb_data.dsp_lock); - init_waitqueue_head(&acdb_data.wait); - acdb_data.cb_thread_task = kthread_run(acdb_calibrate_device, - NULL, "acdb_cb_thread"); - - if (IS_ERR(acdb_data.cb_thread_task)) { - MM_ERR("ACDB=> Could not register cb thread\n"); - result = -ENODEV; - goto err; - } - -#ifdef CONFIG_DEBUG_FS - /*This is RTC specific INIT used only with debugfs*/ - if (!rtc_acdb_init()) - MM_ERR("RTC ACDB=>INIT Failure\n"); - -#endif - - return misc_register(&acdb_misc); -err: - return result; -} - -static void __exit acdb_exit(void) -{ - s32 result = 0; - - result = audmgr_deregister_device_info_callback(&acdb_data.dev_cb); - if (result) - MM_ERR("ACDB=> Could not unregister device callback\n"); - - result = audpp_unregister_event_callback(&acdb_data.audpp_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpp callback\n"); - - result = audpreproc_unregister_event_callback(&acdb_data.\ - audpreproc_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpreproc callback\n"); - - result = kthread_stop(acdb_data.cb_thread_task); - if (result) - MM_ERR("ACDB=> Could not stop kthread\n"); - - free_memory_acdb_get_blk(); - - iounmap(acdb_cache_tx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx.phys_addr_acdb_values); - iounmap(acdb_cache_rx.map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx.phys_addr_acdb_values); - kfree(acdb_data.device_info); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - kfree(acdb_data.preproc_ns); - mutex_destroy(&acdb_data.acdb_mutex); - memset(&acdb_data, 0, sizeof(acdb_data)); - #ifdef CONFIG_DEBUG_FS - rtc_acdb_deinit(); - #endif -} - -late_initcall(acdb_init); -module_exit(acdb_exit); - -MODULE_DESCRIPTION("MSM 8x25 Audio ACDB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_amrnb.c b/arch/arm/mach-msm/qdsp5/audio_amrnb.c deleted file mode 100644 index 5666bcbd8588..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_amrnb.c +++ /dev/null @@ -1,1708 +0,0 @@ -/* linux/arch/arm/mach-msm/qdsp5/audio_amrnb.c - * - * amrnb audio decoder device - * - * Copyright (c) 2008-2009, 2011-2013 The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define BUFSZ 1024 /* Hold minimum 700ms voice data and 14 bytes of meta in*/ -#define DMASZ (BUFSZ * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AMRNB 10 - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and 24 bytes of meta out*/ -#define AMRNB_DECODED_FRSZ 320 /* AMR-NB 20ms 8KHz mono PCM size */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAMRNB_METAFIELD_MASK 0xFFFF0000 -#define AUDAMRNB_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAMRNB_EOS_FLG_MASK 0x01 -#define AUDAMRNB_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAMRNB_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAMRNB_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audamrnb_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audamrnb_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int rmt_resource_released; - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audamrnb_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -struct audpp_cmd_cfg_adec_params_amrnb { - audpp_cmd_cfg_adec_params_common common; - unsigned short stereo_cfg; -} __attribute__((packed)) ; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audamrnb_send_data(struct audio *audio, unsigned needed); -static void audamrnb_config_hostpcm(struct audio *audio); -static void audamrnb_buffer_refresh(struct audio *audio); -static void audamrnb_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrnb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_AMRNB; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_AMRNB; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audamrnb_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AMRNB \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_AMR_NB; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audamrnb_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audamrnb_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audamrnb_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audamrnb_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audamrnb_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audamrnb_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder\n"); - } -} - -static void audamrnb_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - if (audio->pcm_feedback) { - audamrnb_config_hostpcm(audio); - audamrnb_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audamrnb_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_amrnb = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AMRNB; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_amrnb cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_V13K_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAMRNB_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audamrnb_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % AMRNB_DECODED_FRSZ) + - (audio->mfield ? 24 : 0); - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audamrnb_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audamrnb_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audamrnb_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audamrnb_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audamrnb_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audamrnb_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audamrnb_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audamrnb_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audamrnb_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audamrnb_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audamrnb_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audamrnb_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audamrnb_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audamrnb_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audamrnb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(struct msm_audio_stats)); - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audamrnb_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audamrnb_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audamrnb_disable(audio); - audamrnb_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audamrnb_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read buf\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x kernel \ - addr 0x%08x\n", audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audamrnb_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audamrnb_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audamrnb_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audamrnb_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audamrnb_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audamrnb_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAMRNB_EOS_NONE; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer - * contains just meta field - */ - if (cpy_ptr[AUDAMRNB_EOS_FLG_OFFSET] & - AUDAMRNB_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAMRNB_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAMRNB_EOS_FLG_OFFSET] &= - ~AUDAMRNB_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = (xfer + mfield_size); - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - - audamrnb_send_data(audio, 0); - - } - if (eos_condition == AUDAMRNB_EOS_SET) - rc = audamrnb_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audamrnb_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audamrnb_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audamrnb_flush(audio); - audamrnb_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audamrnb_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrnb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audamrnb_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audamrnb_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audamrnb_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audamrnb_suspend(struct early_suspend *h) -{ - struct audamrnb_suspend_ctl *ctl = - container_of(h, struct audamrnb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrnb_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audamrnb_resume(struct early_suspend *h) -{ - struct audamrnb_suspend_ctl *ctl = - container_of(h, struct audamrnb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrnb_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audamrnb_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audamrnb_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audamrnb_debug_fops = { - .read = audamrnb_debug_read, - .open = audamrnb_debug_open, -}; -#endif - -static int audamrnb_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audamrnb_event *e_node = NULL; - unsigned mem_sz = DMASZ; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrnb_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AMRNB; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_AMR_NB_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_amrnb, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AMRNB session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - - audamrnb_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_amrnb_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audamrnb_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audamrnb_resume; - audio->suspend_ctl.node.suspend = audamrnb_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDAMRNB_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audamrnb_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrnb_fops = { - .owner = THIS_MODULE, - .open = audamrnb_open, - .release = audamrnb_release, - .read = audamrnb_read, - .write = audamrnb_write, - .unlocked_ioctl = audamrnb_ioctl, - .fsync = audamrnb_fsync, -}; - -struct miscdevice audio_amrnb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb", - .fops = &audio_amrnb_fops, -}; - -static int __init audamrnb_init(void) -{ - return misc_register(&audio_amrnb_misc); -} - -static void __exit audamrnb_exit(void) -{ - misc_deregister(&audio_amrnb_misc); -} - -module_init(audamrnb_init); -module_exit(audamrnb_exit); - -MODULE_DESCRIPTION("MSM AMR-NB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_amrnb_in.c b/arch/arm/mach-msm/qdsp5/audio_amrnb_in.c deleted file mode 100644 index dbadb466f828..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_amrnb_in.c +++ /dev/null @@ -1,1521 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_amrnb_in.c - * - * amrnb encoder device - * - * Copyright (c) 2009, 2011-2013 The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5/audio_in.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - * - */ - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define FRAME_HEADER_SIZE 8 /* 8 bytes frame header */ -#define NT_FRAME_HEADER_SIZE 24 /* 24 bytes frame header */ -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define AMRNB_FRAME_SIZE 36 /* 36 bytes data */ -/*Tunnel mode : 1536 bytes data + 8 byte header*/ -#define FRAME_SIZE (AMRNB_FRAME_SIZE + FRAME_HEADER_SIZE) -/* 1536 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (AMRNB_FRAME_SIZE + NT_FRAME_HEADER_SIZE) -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define NT_DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM 2 -#define OUT_BUFFER_SIZE (4 * 1024 + NT_FRAME_HEADER_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -/* Offset from beginning of buffer*/ -#define AUDPREPROC_AMRNB_EOS_FLG_OFFSET 0x0A -#define AUDPREPROC_AMRNB_EOS_FLG_MASK 0x01 -#define AUDPREPROC_AMRNB_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_AMRNB_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_amrnb_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - uint8_t mfield; /* meta field embedded in data */ - uint8_t wflush; /*write flush */ - uint8_t rflush; /*read flush*/ - uint32_t out_frame_cnt; - - struct msm_adsp_module *audrec; - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; - uint32_t enc_type; /* 0 for WAV ,1 for AAC,10 for AMRNB */ - uint32_t mode; /* T or NT Mode*/ - struct msm_audio_amrnb_enc_config amrnb_enc_cfg; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - unsigned short samp_rate_index; - uint32_t audrec_obj_idx ; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_write; - - uint8_t opened; - uint8_t enabled; - uint8_t running; - uint8_t stopped; /* set when stopped, cleared on flush */ - struct ion_client *client; - struct ion_handle *input_buff_handle; - - struct audrec_session_info session_info; /*audrec session info*/ -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; -} __packed; - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __packed; - -struct amrnb_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audio_send_queue_pre(audio, cmd, len) \ - msm_adsp_write(audio->audpre, QDSP_uPAudPreProcCmdQueue, cmd, len) - -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -static int audamrnb_in_dsp_enable(struct audio_amrnb_in *audio, int enable); -static int audamrnb_in_encparam_config(struct audio_amrnb_in *audio); -static int audamrnb_in_encmem_config(struct audio_amrnb_in *audio); -static int audamrnb_in_dsp_read_buffer(struct audio_amrnb_in *audio, - uint32_t read_cnt); -static void audamrnb_in_flush(struct audio_amrnb_in *audio); - -static void audamrnb_in_get_dsp_frames(struct audio_amrnb_in *audio); -static int audpcm_config(struct audio_amrnb_in *audio); -static void audamrnb_out_flush(struct audio_amrnb_in *audio); -static int audamrnb_in_routing_mode_config(struct audio_amrnb_in *audio); -static void audrec_pcm_send_data(struct audio_amrnb_in *audio, unsigned needed); -static void audamrnb_nt_in_get_dsp_frames(struct audio_amrnb_in *audio); -static void audamrnb_in_flush(struct audio_amrnb_in *audio); - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, void *event_data) -{ - - uint16_t *msg = event_data; - - if (!msg) - return; - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_DBG("type %d, status_flag %d\n",\ - msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} -/* must be called with audio->lock held */ -static int audamrnb_in_enable(struct audio_amrnb_in *audio) -{ - struct audmgr_config cfg; - int32_t rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - cfg.codec = RPC_AUD_DEF_CODEC_AMR_NB; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - if (audpreproc_enable(audio->enc_id, - &audpre_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = - convert_samp_index(audio->samp_rate); - audpreproc_update_audrec_info(&audio->session_info); - } - - if (msm_adsp_enable(audio->audrec)) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - } - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audamrnb_in_dsp_enable(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audamrnb_in_disable(struct audio_amrnb_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - - audamrnb_in_dsp_enable(audio, 0); - - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - /*reset the sampling frequency information at - audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - } - } - return 0; -} - -static void audamrnb_in_get_dsp_frames(struct audio_amrnb_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - - /* Send Complete Transcoded Data, not actual frame part */ - audio->in[index].size = FRAME_SIZE - (sizeof(*frame)); - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audamrnb_in_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audamrnb_nt_in_get_dsp_frames(struct audio_amrnb_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - -static int audrec_pcm_buffer_ptr_refresh(struct audio_amrnb_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == NT_FRAME_HEADER_SIZE) - len = len / 2; - else - len = (len + NT_FRAME_HEADER_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_config(struct audio_amrnb_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = convert_samp_index(audio->samp_rate); - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - - -static int audamrnb_in_routing_mode_config(struct audio_amrnb_in *audio) -{ - struct audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ROUTING_MODE; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - cmd.routing_mode = 1; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_amrnb_in *audio = data; - if (data) - audio = data; - else { - MM_ERR("invalid data for event %x\n", id); - return; - } - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - struct audrec_msg_cmd_cfg_done_msg cmd_cfg_done_msg; - getevent(&cmd_cfg_done_msg, AUDREC_MSG_CMD_CFG_DONE_MSG_LEN); - if (cmd_cfg_done_msg.audrec_enc_type & \ - AUDREC_MSG_CFG_DONE_ENC_ENA) { - audio->audrec_obj_idx = cmd_cfg_done_msg.audrec_obj_idx; - MM_DBG("CFG ENABLED\n"); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audamrnb_in_routing_mode_config(audio); - } else { - audamrnb_in_encmem_config(audio); - } - } else { - MM_DBG("CFG SLEEP\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG: { - struct audrec_msg_cmd_routing_mode_done_msg \ - routing_msg; - getevent(&routing_msg, AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG); - MM_DBG("AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG"); - if (routing_msg.configuration == 0) { - MM_ERR("routing configuration failed\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } else - audamrnb_in_encmem_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("AREC_MEM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audamrnb_in_encparam_config(audio); - else - audpcm_config(audio); - break; - } - - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_DBG("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audamrnb_in_encparam_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_DBG("AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG\n"); - audio->running = 1; - wake_up(&audio->wait_enable); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: { - struct audrec_msg_no_ext_pkt_avail_msg err_msg; - getevent(&err_msg, AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG_LEN); - MM_DBG("NO_EXT_PKT_AVAILABLE_MSG %x\n",\ - err_msg.audrec_err_id); - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - struct audrec_msg_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt msw %d \ - write cnt lsw %d read cnt msw %d read cnt lsw %d \n",\ - pkt_ready_msg.pkt_counter_msw, \ - pkt_ready_msg.pkt_counter_lsw, \ - pkt_ready_msg.pkt_read_cnt_msw, \ - pkt_ready_msg.pkt_read_cnt_lsw); - - audamrnb_in_get_dsp_frames(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audamrnb_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -struct msm_adsp_ops audrec_amrnb_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audamrnb_in_dsp_enable(struct audio_amrnb_in *audio, int enable) -{ - struct audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ENC_CFG; - cmd.audrec_enc_type = (audio->enc_type & 0xFF) | - (enable ? AUDREC_CMD_ENC_ENA : AUDREC_CMD_ENC_DIS); - /* Don't care on enable, required on disable */ - cmd.audrec_obj_idx = audio->audrec_obj_idx; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audamrnb_in_encmem_config(struct audio_amrnb_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - uint8_t n; - uint16_t header_len = 0; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.cmd_id = AUDREC_CMD_ARECMEM_CFG; - cmd.audrec_obj_idx = audio->audrec_obj_idx; - /* Rate at which packet complete message comes */ - cmd.audrec_up_pkt_intm_cnt = 1; - cmd.audrec_extpkt_buffer_msw = audio->phys >> 16; - cmd.audrec_extpkt_buffer_lsw = audio->phys; - /* Max Buffer no available for frames */ - cmd.audrec_extpkt_buffer_num = FRAME_NUM; - - /* prepare buffer pointers: - * T:36 bytes amrnb packet + 4 halfword header - * NT:36 bytes amrnb packet + 12 halfword header - */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - header_len = FRAME_HEADER_SIZE/2; - else - header_len = NT_FRAME_HEADER_SIZE/2; - - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + header_len; - data += (AMRNB_FRAME_SIZE/2) + header_len; - MM_DBG("0x%8x\n", (uint32_t)(audio->in[n].data - header_len*2)); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audamrnb_in_encparam_config(struct audio_amrnb_in *audio) -{ - struct audrec_cmd_arecparam_amrnb_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.common.cmd_id = AUDREC_CMD_ARECPARAM_CFG; - cmd.common.audrec_obj_idx = audio->audrec_obj_idx; - cmd.samp_rate_idx = audio->samp_rate_index; /* 8k Sampling rate */ - cmd.voicememoencweight1 = audio->amrnb_enc_cfg.voicememoencweight1; - cmd.voicememoencweight2 = audio->amrnb_enc_cfg.voicememoencweight2; - cmd.voicememoencweight3 = audio->amrnb_enc_cfg.voicememoencweight3; - cmd.voicememoencweight4 = audio->amrnb_enc_cfg.voicememoencweight4; - cmd.update_mode = 0x8000 | 0x0000; - cmd.dtx_mode = audio->amrnb_enc_cfg.dtx_mode_enable; - cmd.test_mode = audio->amrnb_enc_cfg.test_mode_enable; - cmd.used_mode = audio->amrnb_enc_cfg.enc_mode; - - MM_DBG("cmd.common.cmd_id = 0x%4x\n", cmd.common.cmd_id); - MM_DBG("cmd.common.audrec_obj_idx = 0x%4x\n", - cmd.common.audrec_obj_idx); - MM_DBG("cmd.samp_rate_idx = 0x%4x\n", cmd.samp_rate_idx); - MM_DBG("cmd.voicememoencweight1 = 0x%4x\n", - cmd.voicememoencweight1); - MM_DBG("cmd.voicememoencweight2 = 0x%4x\n", - cmd.voicememoencweight2); - MM_DBG("cmd.voicememoencweight3 = 0x%4x\n", - cmd.voicememoencweight3); - MM_DBG("cmd.voicememoencweight4 = 0x%4x\n", - cmd.voicememoencweight4); - MM_DBG("cmd.update_mode = 0x%4x\n", cmd.update_mode); - MM_DBG("cmd.dtx_mode = 0x%4x\n", cmd.dtx_mode); - MM_DBG("cmd.test_mode = 0x%4x\n", cmd.test_mode); - MM_DBG("cmd.used_mode = 0x%4x\n", cmd.used_mode); - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audamrnb_flush_command(struct audio_amrnb_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} -static int audamrnb_in_dsp_read_buffer(struct audio_amrnb_in *audio, - uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - cmd.type = audio->audrec_obj_idx; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audamrnb_ioport_reset(struct audio_amrnb_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audamrnb_in_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audamrnb_out_flush(audio); - mutex_unlock(&audio->read_lock); -} - -static void audamrnb_in_flush(struct audio_amrnb_in *audio) -{ - uint8_t i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = FRAME_NUM-1; i >= 0; i--) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audamrnb_out_flush(struct audio_amrnb_in *audio) -{ - uint8_t i; - - audio->out_head = 0; - audio->out_tail = 0; - audio->out_count = 0; - for (i = OUT_FRAME_NUM-1; i >= 0; i--) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } -} - -/* ------------------- device --------------------- */ -static long audamrnb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_amrnb_in *audio = file->private_data; - int32_t rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - rc = audamrnb_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_INFO("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - rc = audamrnb_in_disable(audio); - audio->stopped = 1; - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audamrnb_ioport_reset(audio); - if (audio->running) { - audamrnb_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - } else { - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - } - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.channel_count = 1; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (AMRNB_FRAME_SIZE + 14)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - - case AUDIO_GET_AMRNB_ENC_CONFIG: { - if (copy_to_user((void *)arg, &audio->amrnb_enc_cfg, - sizeof(audio->amrnb_enc_cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG: { - struct msm_audio_amrnb_enc_config cfg; - if (copy_from_user - (&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - } else - rc = 0; - audio->amrnb_enc_cfg.voicememoencweight1 = - cfg.voicememoencweight1; - audio->amrnb_enc_cfg.voicememoencweight2 = - cfg.voicememoencweight2; - audio->amrnb_enc_cfg.voicememoencweight3 = - cfg.voicememoencweight3; - audio->amrnb_enc_cfg.voicememoencweight4 = - cfg.voicememoencweight4; - audio->amrnb_enc_cfg.dtx_mode_enable = cfg.dtx_mode_enable; - audio->amrnb_enc_cfg.test_mode_enable = cfg.test_mode_enable; - audio->amrnb_enc_cfg.enc_mode = cfg.enc_mode; - /* Run time change of Param */ - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audamrnb_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_amrnb_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int32_t rc = 0; - struct amrnb_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG("count = %d\n", count); - memset(&meta_field, 0, sizeof(meta_field)); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct amrnb_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct amrnb_encoded_meta_out); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct amrnb_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct amrnb_encoded_meta_out); - count -= sizeof(struct amrnb_encoded_meta_out); - } - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command \ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audamrnb_in_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audrec_pcm_send_data(struct audio_amrnb_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audrec_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static int audamrnb_in_fsync(struct file *file, loff_t a, loff_t b, int datasync) - -{ - struct audio_amrnb_in *audio = file->private_data; - int32_t rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - -int audrec_amrnb_process_eos(struct audio_amrnb_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int32_t rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audrec_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audamrnb_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_amrnb_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int32_t rc = 0, eos_condition = AUDPREPROC_AMRNB_EOS_NONE; - unsigned short mfield_size = 0; - int32_t write_count = 0; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_AMRNB_EOS_FLG_OFFSET] & - AUDPREPROC_AMRNB_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_AMRNB_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_AMRNB_EOS_FLG_OFFSET] &= - ~AUDPREPROC_AMRNB_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audrec_pcm_send_data(audio, 0); - else { - audrec_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_AMRNB_EOS_SET) - rc = audrec_amrnb_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audamrnb_in_release(struct inode *inode, struct file *file) -{ - struct audio_amrnb_in *audio = file->private_data; - int32_t dma_size = 0; - mutex_lock(&audio->lock); - audamrnb_in_disable(audio); - audamrnb_in_flush(audio); - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) && \ - (audio->out_data)) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->out_data = NULL; - } - if (audio->data) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - dma_size = DMASZ; - else - dma_size = NT_DMASZ; - - dma_free_coherent(NULL, - dma_size, audio->data, audio->phys); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_amrnb_in the_audio_amrnb_in; - -static int audamrnb_in_open(struct inode *inode, struct file *file) -{ - struct audio_amrnb_in *audio = &the_audio_amrnb_in; - int32_t rc; - int encid; - int32_t dma_size = 0; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - dma_size = NT_DMASZ; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - dma_size = DMASZ; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_8000, - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_8000; - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (AMRNB_FRAME_SIZE + 14); - else - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_AMRNB | audio->mode; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - } - audio->amrnb_enc_cfg.voicememoencweight1 = 0x0000; - audio->amrnb_enc_cfg.voicememoencweight2 = 0x0000; - audio->amrnb_enc_cfg.voicememoencweight3 = 0x4000; - audio->amrnb_enc_cfg.voicememoencweight4 = 0x0000; - audio->amrnb_enc_cfg.dtx_mode_enable = 0; - audio->amrnb_enc_cfg.test_mode_enable = 0; - audio->amrnb_enc_cfg.enc_mode = 7; - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_amrnb_adsp_ops, audio); - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->dsp_cnt = 0; - audio->stopped = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audamrnb_in_flush(audio); - audamrnb_out_flush(audio); - /* used dma_allco_coherent for backward compatibility with 7x27 */ - audio->data = dma_alloc_coherent(NULL, dma_size, - &audio->phys, GFP_KERNEL); - if (!audio->data) { - MM_ERR("Unable to allocate DMA buffer\n"); - goto evt_error; - } - - client = msm_ion_client_create(UINT_MAX, "Audio_AMRNB_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - audio->out_data = NULL; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate write buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_get_phys_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (uint32_t)audio->out[0].data, - (uint32_t)audio->out[1].data); - audio->mfield = NT_FRAME_HEADER_SIZE; - audio->out_frame_cnt++; - } - file->private_data = audio; - audio->opened = 1; - -done: - mutex_unlock(&audio->lock); - return rc; -input_buff_map_error: -input_buff_get_phys_error: -input_buff_get_flags_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - dma_free_coherent(NULL, dma_size, audio->data, audio->phys); -evt_error: - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audamrnb_in_open, - .release = audamrnb_in_release, - .read = audamrnb_in_read, - .write = audamrnb_in_write, - .fsync = audamrnb_in_fsync, - .unlocked_ioctl = audamrnb_in_ioctl, -}; - -struct miscdevice audamrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb_in", - .fops = &audio_fops, -}; - -#ifdef CONFIG_DEBUG_FS -static ssize_t audamrnb_in_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audamrnb_in_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int32_t debug_bufmax = 1024; - static char buffer[1024]; - int32_t n = 0, i; - struct audio_amrnb_in *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "audrec_obj_idx %d\n", audio->audrec_obj_idx); - n += scnprintf(buffer + n, debug_bufmax - n, - "dsp_cnt %d \n", audio->dsp_cnt); - n += scnprintf(buffer + n, debug_bufmax - n, - "in_count %d \n", audio->in_count); - for (i = 0; i < FRAME_NUM; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "audio->in[%d].size %d \n", i, audio->in[i].size); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when record halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_size %d \n", audio->buffer_size); - n += scnprintf(buffer + n, debug_bufmax - n, - "in_head %d \n", audio->in_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "in_tail %d \n", audio->in_tail); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audamrnb_in_debug_fops = { - .read = audamrnb_in_debug_read, - .open = audamrnb_in_debug_open, -}; -#endif - -static int __init audamrnb_in_init(void) -{ -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - mutex_init(&the_audio_amrnb_in.lock); - mutex_init(&the_audio_amrnb_in.read_lock); - spin_lock_init(&the_audio_amrnb_in.dsp_lock); - init_waitqueue_head(&the_audio_amrnb_in.wait); - init_waitqueue_head(&the_audio_amrnb_in.wait_enable); - mutex_init(&the_audio_amrnb_in.write_lock); - init_waitqueue_head(&the_audio_amrnb_in.write_wait); - -#ifdef CONFIG_DEBUG_FS - dentry = debugfs_create_file("msm_amrnb_in", S_IFREG | S_IRUGO, NULL, - (void *) &the_audio_amrnb_in, &audamrnb_in_debug_fops); - - if (IS_ERR(dentry)) - MM_ERR("debugfs_create_file failed\n"); -#endif - return misc_register(&audamrnb_in_misc); -} - -static void __exit audamrnb_in_exit(void) -{ - misc_deregister(&audamrnb_in_misc); -} - -module_init(audamrnb_in_init); -module_exit(audamrnb_in_exit); - -MODULE_DESCRIPTION("MSM AMRNB Encoder driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_amrwb.c b/arch/arm/mach-msm/qdsp5/audio_amrwb.c deleted file mode 100644 index db3a1abaeccb..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_amrwb.c +++ /dev/null @@ -1,1774 +0,0 @@ -/* linux/arch/arm/mach-msm/qdsp5/audio_amrwb.c - * - * amrwb audio decoder device - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009, 2011-2012 The Linux Foundation. All rights reserved. - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define BUFSZ 4110 /* Hold minimum 700ms voice data and 14 bytes of meta in*/ -#define DMASZ (BUFSZ * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AMRWB 11 - -#define PCM_BUFSZ_MIN 8216 /* 100ms worth of data and 24 bytes of meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAMRWB_METAFIELD_MASK 0xFFFF0000 -#define AUDAMRWB_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAMRWB_EOS_FLG_MASK 0x01 -#define AUDAMRWB_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAMRWB_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAMRWB_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audamrwb_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audamrwb_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - struct audmgr audmgr; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int rmt_resource_released; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audamrwb_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audamrwb_send_data(struct audio *audio, unsigned needed); -static void audamrwb_config_hostpcm(struct audio *audio); -static void audamrwb_buffer_refresh(struct audio *audio); -static void audamrwb_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrwb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_AMRWB; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_AMRWB; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audamrwb_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AMRWB \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_AMR_WB; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audamrwb_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audamrwb_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audamrwb_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audamrwb_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audamrwb_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audamrwb_update_pcm_buf_entry(audio, msg); - break; - - default: - MM_ERR("unexpected message from decoder\n"); - } -} - -static void audamrwb_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - if (audio->pcm_feedback) { - audamrwb_config_hostpcm(audio); - audamrwb_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_DBG("unknown decoder status\n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audamrwb_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_DBG("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_amrwb = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AMRWB; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_amrwb cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_AMRWB_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAMRWB_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audamrwb_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audamrwb_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audamrwb_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audamrwb_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audamrwb_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audamrwb_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audamrwb_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audamrwb_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audamrwb_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audamrwb_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audamrwb_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audamrwb_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audamrwb_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audamrwb_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audamrwb_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audamrwb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audamrwb_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audamrwb_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audamrwb_disable(audio); - audamrwb_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG(" AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audamrwb_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) - config.channel_count = - AUDPP_CMD_PCM_INTF_MONO_V; - else if (config.channel_count == 2) - config.channel_count = - AUDPP_CMD_PCM_INTF_STEREO_V; - else - rc = -EINVAL; - audio->out_channel_mode = config.channel_count; - audio->out_sample_rate = config.sample_rate; - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == - AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = 0; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map mem for read buf\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = audio->map_v_read; - audio->pcm_feedback = 1; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x \ - kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audamrwb_fsync(struct file *file, loff_t a, loff_t b, - int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audamrwb_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audamrwb_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("count %d\n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", - audio->read_next); - - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_ERR("kick start pcm feedback again\n"); - audamrwb_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audamrwb_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - char *buf_ptr; - int rc = 0; - - MM_DBG("signal input EOS reserved=%d\n", audio->reserved); - if (audio->reserved) { - MM_DBG("Pass reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - audio->reserved = 0; - frame->used = 2; - audamrwb_send_data(audio, 0); - } - - MM_DBG("Now signal input EOS after reserved bytes %d %d %d\n", - audio->out[0].used, audio->out[1].used, audio->out_needed); - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audamrwb_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audamrwb_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAMRWB_EOS_NONE; - unsigned short mfield_size = 0; - unsigned dsize; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer - * contains just meta field - */ - if (cpy_ptr[AUDAMRWB_EOS_FLG_OFFSET] & - AUDAMRWB_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAMRWB_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAMRWB_EOS_FLG_OFFSET] &= - ~AUDAMRWB_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - ((frame->size - mfield_size) - 1) : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audamrwb_send_data(audio, 0); - } - } - MM_DBG("eos_condition %x buf[0x%x] start[0x%x]\n", eos_condition, - (int) buf, (int) start); - if (eos_condition == AUDAMRWB_EOS_SET) - rc = audamrwb_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audamrwb_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audamrwb_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audamrwb_flush(audio); - audamrwb_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audamrwb_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrwb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audamrwb_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audamrwb_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audamrwb_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audamrwb_suspend(struct early_suspend *h) -{ - struct audamrwb_suspend_ctl *ctl = - container_of(h, struct audamrwb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrwb_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audamrwb_resume(struct early_suspend *h) -{ - struct audamrwb_suspend_ctl *ctl = - container_of(h, struct audamrwb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrwb_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audamrwb_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audamrwb_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audamrwb_debug_fops = { - .read = audamrwb_debug_read, - .open = audamrwb_debug_open, -}; -#endif - -static int audamrwb_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc = 0, dec_attrb, decid, i; - struct audamrwb_event *e_node = NULL; - unsigned mem_sz = DMASZ; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrwb_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("No memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AMRWB; - if (file->f_mode & FMODE_READ) - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - else - dec_attrb |= MSM_AUD_MODE_TUNNEL; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_AMR_WB_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_amrwb, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for AMRWB session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - audio->vol_pan.pan = 0x0; - audio->eq_enable = 0; - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audamrwb_flush(audio); - - file->private_data = audio; - audio->opened = 1; - audio->event_abort = 0; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_amrwb_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audamrwb_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audamrwb_resume; - audio->suspend_ctl.node.suspend = audamrwb_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDAMRWB_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audamrwb_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwb_fops = { - .owner = THIS_MODULE, - .open = audamrwb_open, - .release = audamrwb_release, - .read = audamrwb_read, - .write = audamrwb_write, - .unlocked_ioctl = audamrwb_ioctl, - .fsync = audamrwb_fsync, -}; - -struct miscdevice audio_amrwb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb", - .fops = &audio_amrwb_fops, -}; - -static int __init audamrwb_init(void) -{ - return misc_register(&audio_amrwb_misc); -} - -static void __exit audamrwb_exit(void) -{ - misc_deregister(&audio_amrwb_misc); -} - -module_init(audamrwb_init); -module_exit(audamrwb_exit); - -MODULE_DESCRIPTION("MSM AMR-WB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_evrc.c b/arch/arm/mach-msm/qdsp5/audio_evrc.c deleted file mode 100644 index 15612a345b0c..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_evrc.c +++ /dev/null @@ -1,1701 +0,0 @@ -/* arch/arm/mach-msm/audio_evrc.c - * - * Copyright (c) 2008-2009, 2011-2012 The Linux Foundation. All rights reserved. - * - * This code also borrows from audio_aac.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* Hold 30 packets of 24 bytes each and 14 bytes of meta in */ -#define BUFSZ 734 -#define DMASZ (BUFSZ * 2) - -#define AUDDEC_DEC_EVRC 12 - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and - and 24 bytes of meta out */ -#define PCM_BUF_MAX_COUNT 5 -/* DSP only accepts 5 buffers at most - * but support 2 buffers currently - */ -#define EVRC_DECODED_FRSZ 320 /* EVRC 20ms 8KHz mono PCM size */ - -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDEVRC_METAFIELD_MASK 0xFFFF0000 -#define AUDEVRC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDEVRC_EOS_FLG_MASK 0x01 -#define AUDEVRC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDEVRC_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDEVRC_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audevrc_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audevrc_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int rmt_resource_released; - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audevrc_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audevrc_send_data(struct audio *audio, unsigned needed); -static void audevrc_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audevrc_config_hostpcm(struct audio *audio); -static void audevrc_buffer_refresh(struct audio *audio); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audevrc_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_EVRC; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_EVRC; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audevrc_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for EVRC \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_EVRC; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audevrc_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audevrc_disable(struct audio *audio) -{ - int rc = 0; - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ - -static void audevrc_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr - == payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audevrc_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audevrc_send_data(audio, 1); - break; - case AUDPLAY_MSG_BUFFER_UPDATE: - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_update_pcm_buf_entry(audio, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audevrc_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - if (audio->pcm_feedback) { - audevrc_config_hostpcm(audio); - audevrc_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK\n"); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audevrc_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_evrc = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_EVRC; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_evrc cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = sizeof(cmd); - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDEVRC_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audevrc_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audevrc_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audevrc_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audevrc_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audevrc_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audevrc_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audevrc_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audevrc_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audevrc_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audevrc_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audevrc_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - - -static long audevrc_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audevrc_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audevrc_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audevrc_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audevrc_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audevrc_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audevrc_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audevrc_disable(audio); - audevrc_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audevrc_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - rc = 0; - MM_DBG("AUDIO_SET_CONFIG applicable only \ - for meta field configuration\n"); - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map mem" - " for read buf\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audevrc_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audevrc_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - if (!audio->pcm_feedback) { - return 0; - /* PCM feedback is not enabled. Nothing to read */ - } - mutex_lock(&audio->read_lock); - MM_DBG("\n"); /* Macro prints the file name and function */ - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - MM_DBG("wait terminated \n"); - if (rc < 0) - break; - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", - (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment - */ - - } - } - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audevrc_buffer_refresh(audio); - } - mutex_unlock(&audio->read_lock); - if (buf > start) - rc = buf - start; - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audevrc_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audevrc_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audevrc_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - unsigned short mfield_size = 0; - int rc = 0, eos_condition = AUDEVRC_EOS_NONE; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, - mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDEVRC_EOS_FLG_OFFSET] & - AUDEVRC_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDEVRC_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDEVRC_EOS_FLG_OFFSET] &= - ~AUDEVRC_EOS_FLG_MASK; - } - /* Check EOS to see if */ - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = xfer + mfield_size; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - audevrc_send_data(audio, 0); - } - if (eos_condition == AUDEVRC_EOS_SET) - rc = audevrc_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audevrc_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audevrc_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audevrc_flush(audio); - audevrc_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audevrc_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audevrc_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audevrc_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audevrc_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audevrc_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audevrc_suspend(struct early_suspend *h) -{ - struct audevrc_suspend_ctl *ctl = - container_of(h, struct audevrc_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audevrc_resume(struct early_suspend *h) -{ - struct audevrc_suspend_ctl *ctl = - container_of(h, struct audevrc_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audevrc_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audevrc_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audevrc_debug_fops = { - .read = audevrc_debug_read, - .open = audevrc_debug_open, -}; -#endif - -static int audevrc_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audevrc_event *e_node = NULL; - unsigned mem_sz = DMASZ; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_evrc_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_EVRC; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_evrc, audio); - - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for EVRC session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x3FFF; - - audevrc_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_evrc_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audevrc_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audevrc_resume; - audio->suspend_ctl.node.suspend = audevrc_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDEVRC_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audevrc_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_evrc_fops = { - .owner = THIS_MODULE, - .open = audevrc_open, - .release = audevrc_release, - .read = audevrc_read, - .write = audevrc_write, - .unlocked_ioctl = audevrc_ioctl, - .fsync = audevrc_fsync, -}; - -struct miscdevice audio_evrc_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc", - .fops = &audio_evrc_fops, -}; - -static int __init audevrc_init(void) -{ - return misc_register(&audio_evrc_misc); - -} - -static void __exit audevrc_exit(void) -{ - misc_deregister(&audio_evrc_misc); -} - -module_init(audevrc_init); -module_exit(audevrc_exit); - -MODULE_DESCRIPTION("MSM EVRC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_evrc_in.c b/arch/arm/mach-msm/qdsp5/audio_evrc_in.c deleted file mode 100644 index 7a8c3e4a7e69..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_evrc_in.c +++ /dev/null @@ -1,1463 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_evrc_in.c - * - * evrc audio input device - * - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c, - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include -#include -#include - -#define FRAME_HEADER_SIZE 8 /* 8 bytes frame header */ -#define NT_FRAME_HEADER_SIZE 24 /* 24 bytes frame header */ -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define EVRC_FRAME_SIZE 36 /* 36 bytes data */ -/*Tunnel mode : 36 bytes data + 8 byte header*/ -#define FRAME_SIZE (EVRC_FRAME_SIZE + FRAME_HEADER_SIZE) - /* 36 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (EVRC_FRAME_SIZE + NT_FRAME_HEADER_SIZE) -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define NT_DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM 2 -#define OUT_BUFFER_SIZE (4 * 1024 + NT_FRAME_HEADER_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -#define AUDPREPROC_EVRC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer*/ -#define AUDPREPROC_EVRC_EOS_FLG_MASK 0x01 -#define AUDPREPROC_EVRC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_EVRC_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_evrc_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t enc_type; /* 11 for EVRC */ - uint32_t mode; /* T or NT Mode*/ - - struct msm_audio_evrc_enc_config cfg; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - unsigned short samp_rate_index; - uint32_t audrec_obj_idx ; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - void *map_v_read; - void *map_v_write; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; - - struct audrec_session_info session_info; /*audrec session info*/ -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; -} __packed; - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __packed; - -struct evrc_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audio_send_queue_pre(audio, cmd, len) \ - msm_adsp_write(audio->audpre, QDSP_uPAudPreProcCmdQueue, cmd, len) - -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -static int audevrc_in_dsp_enable(struct audio_evrc_in *audio, int enable); -static int audevrc_in_encparam_config(struct audio_evrc_in *audio); -static int audevrc_in_encmem_config(struct audio_evrc_in *audio); -static int audevrc_in_dsp_read_buffer(struct audio_evrc_in *audio, - uint32_t read_cnt); -static void audevrc_in_flush(struct audio_evrc_in *audio); - -static void audevrc_in_get_dsp_frames(struct audio_evrc_in *audio); -static int audpcm_config(struct audio_evrc_in *audio); -static void audevrc_out_flush(struct audio_evrc_in *audio); -static int audevrc_in_routing_mode_config(struct audio_evrc_in *audio); -static void audrec_pcm_send_data(struct audio_evrc_in *audio, unsigned needed); -static void audevrc_nt_in_get_dsp_frames(struct audio_evrc_in *audio); -static void audevrc_in_flush(struct audio_evrc_in *audio); - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, void *event_data) -{ - - uint16_t *msg = event_data; - - if (!msg) - return; - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_DBG("type %d, status_flag %d\n",\ - msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - - -/* must be called with audio->lock held */ -static int audevrc_in_enable(struct audio_evrc_in *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - cfg.codec = RPC_AUD_DEF_CODEC_EVRC; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - if (audpreproc_enable(audio->enc_id, - &audpre_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = - convert_samp_index(audio->samp_rate); - audpreproc_update_audrec_info(&audio->session_info); - } - - if (msm_adsp_enable(audio->audrec)) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - } - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audevrc_in_dsp_enable(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audevrc_in_disable(struct audio_evrc_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - - audevrc_in_dsp_enable(audio, 0); - - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - audio->stopped = 1; - wake_up(&audio->wait); - msm_adsp_disable(audio->audrec); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - /*reset the sampling frequency information at - audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audmgr_disable(&audio->audmgr); - } - } - return 0; -} - -static void audevrc_in_get_dsp_frames(struct audio_evrc_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audevrc_in_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audevrc_nt_in_get_dsp_frames(struct audio_evrc_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - -static int audrec_pcm_buffer_ptr_refresh(struct audio_evrc_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == NT_FRAME_HEADER_SIZE) - len = len / 2; - else - len = (len + NT_FRAME_HEADER_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_config(struct audio_evrc_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = convert_samp_index(audio->samp_rate); - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - - -static int audevrc_in_routing_mode_config(struct audio_evrc_in *audio) -{ - struct audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ROUTING_MODE; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - cmd.routing_mode = 1; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_evrc_in *audio = NULL; - - if (data) - audio = data; - else { - MM_ERR("invalid data for event %x\n", id); - return; - } - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - struct audrec_msg_cmd_cfg_done_msg cmd_cfg_done_msg; - getevent(&cmd_cfg_done_msg, AUDREC_MSG_CMD_CFG_DONE_MSG_LEN); - if (cmd_cfg_done_msg.audrec_enc_type & \ - AUDREC_MSG_CFG_DONE_ENC_ENA) { - audio->audrec_obj_idx = cmd_cfg_done_msg.audrec_obj_idx; - MM_DBG("CFG ENABLED\n"); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audevrc_in_routing_mode_config(audio); - } else { - audevrc_in_encmem_config(audio); - } - } else { - MM_DBG("CFG SLEEP\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG: { - struct audrec_msg_cmd_routing_mode_done_msg \ - routing_msg; - getevent(&routing_msg, AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG); - MM_DBG("AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG"); - if (routing_msg.configuration == 0) { - MM_ERR("routing configuration failed\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } else - audevrc_in_encmem_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("AREC_MEM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audevrc_in_encparam_config(audio); - else - audpcm_config(audio); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_DBG("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audevrc_in_encparam_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_DBG("AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG\n"); - audio->running = 1; - wake_up(&audio->wait_enable); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: { - struct audrec_msg_no_ext_pkt_avail_msg err_msg; - getevent(&err_msg, AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG_LEN); - MM_DBG("NO_EXT_PKT_AVAILABLE_MSG %x\n",\ - err_msg.audrec_err_id); - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - struct audrec_msg_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt msw %d \ - write cnt lsw %d read cnt msw %d read cnt lsw %d \n",\ - pkt_ready_msg.pkt_counter_msw, \ - pkt_ready_msg.pkt_counter_lsw, \ - pkt_ready_msg.pkt_read_cnt_msw, \ - pkt_ready_msg.pkt_read_cnt_lsw); - - audevrc_in_get_dsp_frames(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audevrc_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -static struct msm_adsp_ops audrec_evrc_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audevrc_in_dsp_enable(struct audio_evrc_in *audio, int enable) -{ - struct audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ENC_CFG; - cmd.audrec_enc_type = (audio->enc_type & 0xFF) | - (enable ? AUDREC_CMD_ENC_ENA : AUDREC_CMD_ENC_DIS); - /* Don't care */ - cmd.audrec_obj_idx = audio->audrec_obj_idx; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audevrc_in_encmem_config(struct audio_evrc_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - int header_len = 0; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.cmd_id = AUDREC_CMD_ARECMEM_CFG; - cmd.audrec_obj_idx = audio->audrec_obj_idx; - /* Rate at which packet complete message comes */ - cmd.audrec_up_pkt_intm_cnt = 1; - cmd.audrec_extpkt_buffer_msw = audio->phys >> 16; - cmd.audrec_extpkt_buffer_lsw = audio->phys; - /* Max Buffer no available for frames */ - cmd.audrec_extpkt_buffer_num = FRAME_NUM; - - /* prepare buffer pointers: - * T:36 bytes evrc packet + 4 halfword header - * NT:36 bytes evrc packet + 12 halfword header - */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - header_len = FRAME_HEADER_SIZE/2; - else - header_len = NT_FRAME_HEADER_SIZE/2; - - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + header_len; - data += (EVRC_FRAME_SIZE/2) + header_len; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - header_len*2)); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audevrc_in_encparam_config(struct audio_evrc_in *audio) -{ - struct audrec_cmd_arecparam_evrc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDREC_CMD_ARECPARAM_CFG; - cmd.common.audrec_obj_idx = audio->audrec_obj_idx; - cmd.enc_min_rate = audio->cfg.min_bit_rate; - cmd.enc_max_rate = audio->cfg.max_bit_rate; - cmd.rate_modulation_cmd = 0; /* Default set to 0 */ - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audevrc_flush_command(struct audio_evrc_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audevrc_in_dsp_read_buffer(struct audio_evrc_in *audio, - uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - cmd.type = audio->audrec_obj_idx; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audevrc_ioport_reset(struct audio_evrc_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audevrc_in_flush(audio); - mutex_unlock(&audio->read_lock); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audevrc_out_flush(audio); - mutex_unlock(&audio->write_lock); -} - -static void audevrc_in_flush(struct audio_evrc_in *audio) -{ - int i; - unsigned long flags; - - audio->dsp_cnt = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = FRAME_NUM-1; i >= 0; i--) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audevrc_out_flush(struct audio_evrc_in *audio) -{ - int i; - unsigned long flags; - - audio->out_head = 0; - audio->out_count = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out_tail = 0; - for (i = OUT_FRAME_NUM-1; i >= 0; i--) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static long audevrc_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_evrc_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - rc = audevrc_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - rc = audevrc_in_disable(audio); - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audevrc_ioport_reset(audio); - if (audio->running) { - audevrc_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.channel_count = 1; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (EVRC_FRAME_SIZE + 14)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG: { - if (copy_to_user((void *) arg, &audio->cfg, sizeof(audio->cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - MM_DBG("0X%8x, 0x%8x, 0x%8x\n", cfg.min_bit_rate, - cfg.max_bit_rate, cfg.cdma_rate); - if (cfg.min_bit_rate > CDMA_RATE_FULL || \ - cfg.min_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid min bitrate\n"); - rc = -EFAULT; - break; - } - if (cfg.max_bit_rate > CDMA_RATE_FULL || \ - cfg.max_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid max bitrate\n"); - rc = -EFAULT; - break; - } - /* Recording Does not support Erase and Blank */ - if (cfg.cdma_rate > CDMA_RATE_FULL || - cfg.cdma_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid qcelp cdma rate\n"); - rc = -EFAULT; - break; - } - memcpy(&audio->cfg, &cfg, sizeof(cfg)); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audevrc_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_evrc_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct evrc_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG("count = %d\n", count); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct evrc_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct evrc_encoded_meta_out); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct evrc_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct evrc_encoded_meta_out); - count -= sizeof(struct evrc_encoded_meta_out); - } - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command \ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audevrc_in_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audrec_pcm_send_data(struct audio_evrc_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audrec_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static int audevrc_in_fsync(struct file *file, loff_t a, loff_t b, - int datasync) - -{ - struct audio_evrc_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - -int audrec_evrc_process_eos(struct audio_evrc_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audrec_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audevrc_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_evrc_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_EVRC_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = 0; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_EVRC_EOS_FLG_OFFSET] & - AUDPREPROC_EVRC_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_EVRC_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_EVRC_EOS_FLG_OFFSET] &= - ~AUDPREPROC_EVRC_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audrec_pcm_send_data(audio, 0); - else { - audrec_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_EVRC_EOS_SET) - rc = audrec_evrc_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audevrc_in_release(struct inode *inode, struct file *file) -{ - struct audio_evrc_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audevrc_in_disable(audio); - audevrc_in_flush(audio); - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) && \ - (audio->out_data)) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->out_data = NULL; - } - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -static struct audio_evrc_in the_audio_evrc_in; - -static int audevrc_in_open(struct inode *inode, struct file *file) -{ - struct audio_evrc_in *audio = &the_audio_evrc_in; - int rc; - int encid; - int dma_size = 0; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - dma_size = NT_DMASZ; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - dma_size = DMASZ; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_8000, - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_8000; - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (EVRC_FRAME_SIZE + 14); - else - audio->buffer_size = EVRC_FRAME_SIZE; - audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_EVRC | audio->mode; - - audio->cfg.cdma_rate = CDMA_RATE_FULL; - audio->cfg.min_bit_rate = CDMA_RATE_FULL; - audio->cfg.max_bit_rate = CDMA_RATE_FULL; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - } - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_evrc_adsp_ops, audio); - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->dsp_cnt = 0; - audio->stopped = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audevrc_in_flush(audio); - audevrc_out_flush(audio); - - client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", dma_size); - handle = ion_alloc(client, dma_size, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_read; - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_data = NULL; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_alloc_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->mfield = NT_FRAME_HEADER_SIZE; - audio->out_frame_cnt++; - } - file->private_data = audio; - audio->opened = 1; - -done: - mutex_unlock(&audio->lock); - return rc; -input_buff_map_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_evrc_in_fops = { - .owner = THIS_MODULE, - .open = audevrc_in_open, - .release = audevrc_in_release, - .read = audevrc_in_read, - .write = audevrc_in_write, - .fsync = audevrc_in_fsync, - .unlocked_ioctl = audevrc_in_ioctl, -}; - -static struct miscdevice audevrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &audio_evrc_in_fops, -}; - -static int __init audevrc_in_init(void) -{ - mutex_init(&the_audio_evrc_in.lock); - mutex_init(&the_audio_evrc_in.read_lock); - spin_lock_init(&the_audio_evrc_in.dsp_lock); - init_waitqueue_head(&the_audio_evrc_in.wait); - init_waitqueue_head(&the_audio_evrc_in.wait_enable); - mutex_init(&the_audio_evrc_in.write_lock); - init_waitqueue_head(&the_audio_evrc_in.write_wait); - return misc_register(&audevrc_in_misc); -} -device_initcall(audevrc_in_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_fm.c b/arch/arm/mach-msm/qdsp5/audio_fm.c deleted file mode 100644 index 957a407462b8..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_fm.c +++ /dev/null @@ -1,169 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_fm.c - * - * pcm audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include "audmgr.h" - -struct audio { - struct mutex lock; - int opened; - int enabled; - int running; - struct audmgr audmgr; - uint16_t volume; -}; - -static struct audio fm_audio; - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_HOST_PCM; - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - cfg.snd_method = RPC_SND_METHOD_VOICE; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - audio->enabled = 1; - return rc; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audmgr_disable(&audio->audmgr); - } - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - - MM_DBG("cmd %d", cmd); - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->running = 0; - audio->enabled = 0; - break; - - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - audio->running = 0; - audio->enabled = 0; - audio->opened = 0; - mutex_unlock(&audio->lock); - return 0; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = &fm_audio; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - mutex_lock(&audio->lock); - - if (audio->opened) { - MM_ERR("busy\n"); - rc = -EBUSY; - goto done; - } - - rc = audmgr_open(&audio->audmgr); - - if (rc) { - MM_ERR("%s: failed to register listnet\n", __func__); - goto done; - } - - file->private_data = audio; - audio->opened = 1; - -done: - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_fm_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .unlocked_ioctl = audio_ioctl, -}; - -struct miscdevice audio_fm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_fm", - .fops = &audio_fm_fops, -}; - -static int __init audio_init(void) -{ - struct audio *audio = &fm_audio; - - mutex_init(&audio->lock); - return misc_register(&audio_fm_misc); -} - -device_initcall(audio_init); - -MODULE_DESCRIPTION("MSM FM driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_in.c b/arch/arm/mach-msm/qdsp5/audio_in.c deleted file mode 100644 index 264749265301..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_in.c +++ /dev/null @@ -1,997 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_in.c - * - * pcm audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009,2013 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_SIZE (2052 * 2) -#define MONO_DATA_SIZE (2048) -#define STEREO_DATA_SIZE (MONO_DATA_SIZE * 2) -#define DMASZ (FRAME_SIZE * FRAME_NUM) - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - - struct msm_adsp_module *audpre; - struct msm_adsp_module *audrec; - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* 2048 for mono, 4096 for stereo */ - uint32_t type; /* 0 for PCM ,1 for AAC */ - uint32_t bit_rate; /* bit rate for AAC */ - uint32_t record_quality; /* record quality (bits/sample/channel) - for AAC*/ - uint32_t buffer_cfg_ioctl; /* to allow any one of buffer set ioctl */ - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - unsigned short samp_rate_index; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - - /* audpre settings */ - int tx_agc_enable; - audpreproc_cmd_cfg_agc_params tx_agc_cfg; - int ns_enable; - audpreproc_cmd_cfg_ns_params ns_cfg; - /* For different sample rate, the coeff might be different. * - * All the coeff should be passed from user space */ - int iir_enable; - audpreproc_cmd_cfg_iir_tuning_filter_params iir_cfg; -}; - -static int audio_in_dsp_enable(struct audio_in *audio, int enable); -static int audio_in_encoder_config(struct audio_in *audio); -static int audio_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); -static void audio_flush(struct audio_in *audio); -static int audio_dsp_set_tx_agc(struct audio_in *audio); -static int audio_dsp_set_ns(struct audio_in *audio); -static int audio_dsp_set_iir(struct audio_in *audio); - -static unsigned convert_dsp_samp_index(unsigned index) -{ - switch (index) { - case 48000: return AUDREC_CMD_SAMP_RATE_INDX_48000; - case 44100: return AUDREC_CMD_SAMP_RATE_INDX_44100; - case 32000: return AUDREC_CMD_SAMP_RATE_INDX_32000; - case 24000: return AUDREC_CMD_SAMP_RATE_INDX_24000; - case 22050: return AUDREC_CMD_SAMP_RATE_INDX_22050; - case 16000: return AUDREC_CMD_SAMP_RATE_INDX_16000; - case 12000: return AUDREC_CMD_SAMP_RATE_INDX_12000; - case 11025: return AUDREC_CMD_SAMP_RATE_INDX_11025; - case 8000: return AUDREC_CMD_SAMP_RATE_INDX_8000; - default: return AUDREC_CMD_SAMP_RATE_INDX_11025; - } -} - -static unsigned convert_samp_rate(unsigned hz) -{ - switch (hz) { - case 48000: return RPC_AUD_DEF_SAMPLE_RATE_48000; - case 44100: return RPC_AUD_DEF_SAMPLE_RATE_44100; - case 32000: return RPC_AUD_DEF_SAMPLE_RATE_32000; - case 24000: return RPC_AUD_DEF_SAMPLE_RATE_24000; - case 22050: return RPC_AUD_DEF_SAMPLE_RATE_22050; - case 16000: return RPC_AUD_DEF_SAMPLE_RATE_16000; - case 12000: return RPC_AUD_DEF_SAMPLE_RATE_12000; - case 11025: return RPC_AUD_DEF_SAMPLE_RATE_11025; - case 8000: return RPC_AUD_DEF_SAMPLE_RATE_8000; - default: return RPC_AUD_DEF_SAMPLE_RATE_11025; - } -} - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* must be called with audio->lock held */ -static int audio_in_enable(struct audio_in *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - if (audio->type == AUDREC_CMD_TYPE_0_INDEX_WAV) - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - else - cfg.codec = RPC_AUD_DEF_CODEC_AAC; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - if (msm_adsp_enable(audio->audpre)) { - MM_ERR("msm_adsp_enable(audpre) failed\n"); - return -ENODEV; - } - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audio_in_dsp_enable(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audio_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - - audio_in_dsp_enable(audio, 0); - - wake_up(&audio->wait); - - msm_adsp_disable(audio->audrec); - msm_adsp_disable(audio->audpre); - audmgr_disable(&audio->audmgr); - } - return 0; -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - uint16_t msg[2]; - getevent(msg, sizeof(msg)); - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_INFO("type %d, status_flag %d\n", msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -struct audio_frame { - uint16_t count_low; - uint16_t count_high; - uint16_t bytes; - uint16_t unknown; - unsigned char samples[]; -} __attribute__((packed)); - -static void audio_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - /* XXX check for bogus frame size? */ - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->bytes; - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - else - audio->in_count++; - - audio_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - uint16_t msg[3]; - getevent(msg, sizeof(msg)); - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: - if (msg[0] & AUDREC_MSG_CFG_DONE_TYPE_0_UPDATE) { - if (msg[0] & AUDREC_MSG_CFG_DONE_TYPE_0_ENA) { - MM_INFO("CFG ENABLED\n"); - audio_in_encoder_config(audio); - } else { - MM_INFO("CFG SLEEP\n"); - audio->running = 0; - audio->tx_agc_enable = 0; - audio->ns_enable = 0; - audio->iir_enable = 0; - } - } else { - MM_INFO("CMD_CFG_DONE %x\n", msg[0]); - } - break; - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_INFO("PARAM CFG DONE\n"); - audio->running = 1; - audio_dsp_set_tx_agc(audio); - audio_dsp_set_ns(audio); - audio_dsp_set_iir(audio); - break; - } - case AUDREC_MSG_FATAL_ERR_MSG: - MM_ERR("ERROR %x\n", msg[0]); - break; - case AUDREC_MSG_PACKET_READY_MSG: -/* REC_DBG("type %x, count %d", msg[0], (msg[1] | (msg[2] << 16))); */ - audio_in_get_dsp_frames(audio); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -struct msm_adsp_ops audpre_adsp_ops = { - .event = audpre_dsp_event, -}; - -struct msm_adsp_ops audrec_adsp_ops = { - .event = audrec_dsp_event, -}; - - -#define audio_send_queue_pre(audio, cmd, len) \ - msm_adsp_write(audio->audpre, QDSP_uPAudPreProcCmdQueue, cmd, len) -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, QDSP_uPAudRecBitStreamQueue, cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, \ - QDSP_uPAudRecCmdQueue, cmd, len) - -/* Convert Bit Rate to Record Quality field of DSP */ -static unsigned int bitrate_to_record_quality(unsigned int sample_rate, - unsigned int channel, unsigned int bit_rate) { - unsigned int temp; - - temp = sample_rate * channel; - MM_DBG(" sample rate * channel = %d \n", temp); - /* To represent in Q12 fixed format */ - temp = (bit_rate * 4096) / temp; - MM_DBG(" Record Quality = 0x%8x \n", temp); - return temp; -} - -static int audio_dsp_set_tx_agc(struct audio_in *audio) -{ - audpreproc_cmd_cfg_agc_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->tx_agc_cfg.cmd_id = AUDPREPROC_CMD_CFG_AGC_PARAMS; - if (audio->tx_agc_enable) { - /* cmd.tx_agc_param_mask = 0xFE00 from sample code */ - audio->tx_agc_cfg.tx_agc_param_mask = - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_SLOPE) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_TH) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_EXP_SLOPE) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_EXP_TH) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_AIG_FLAG) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_STATIC_GAIN) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_TX_AGC_ENA_FLAG); - audio->tx_agc_cfg.tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_ENA; - /* cmd.param_mask = 0xFFF0 from sample code */ - audio->tx_agc_cfg.param_mask = - (1 << AUDPREPROC_CMD_PARAM_MASK_RMS_TAY) | - (1 << AUDPREPROC_CMD_PARAM_MASK_RELEASEK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_DELAY) | - (1 << AUDPREPROC_CMD_PARAM_MASK_ATTACKK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAKRATE_SLOW) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAKRATE_FAST) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_RELEASEK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_MIN) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_MAX) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAK_UP) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAK_DOWN) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_ATTACKK); - } else { - audio->tx_agc_cfg.tx_agc_param_mask = - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_TX_AGC_ENA_FLAG); - audio->tx_agc_cfg.tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_DIS; - } - cmd = audio->tx_agc_cfg; - - return audio_send_queue_pre(audio, &cmd, sizeof(cmd)); -} - -static int audio_enable_tx_agc(struct audio_in *audio, int enable) -{ - if (audio->tx_agc_enable != enable) { - audio->tx_agc_enable = enable; - if (audio->running) - audio_dsp_set_tx_agc(audio); - } - return 0; -} - -static int audio_dsp_set_ns(struct audio_in *audio) -{ - audpreproc_cmd_cfg_ns_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->ns_cfg.cmd_id = AUDPREPROC_CMD_CFG_NS_PARAMS; - - if (audio->ns_enable) { - /* cmd.ec_mode_new is fixed as 0x0064 when enable - * from sample code */ - audio->ns_cfg.ec_mode_new = - AUDPREPROC_CMD_EC_MODE_NEW_NS_ENA | - AUDPREPROC_CMD_EC_MODE_NEW_HB_ENA | - AUDPREPROC_CMD_EC_MODE_NEW_VA_ENA; - } else { - audio->ns_cfg.ec_mode_new = - AUDPREPROC_CMD_EC_MODE_NEW_NLMS_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_DES_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NS_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_CNI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NLES_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_HB_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_VA_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_PCD_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_FEHI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NEHI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NLPP_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_FNE_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_PRENLMS_DIS; - } - cmd = audio->ns_cfg; - - return audio_send_queue_pre(audio, &cmd, sizeof(cmd)); -} - -static int audio_enable_ns(struct audio_in *audio, int enable) -{ - if (audio->ns_enable != enable) { - audio->ns_enable = enable; - if (audio->running) - audio_dsp_set_ns(audio); - } - return 0; -} - -static int audio_dsp_set_iir(struct audio_in *audio) -{ - audpreproc_cmd_cfg_iir_tuning_filter_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->iir_cfg.cmd_id = AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - - if (audio->iir_enable) - /* cmd.active_flag is 0xFFFF from sample code but 0x0001 here */ - audio->iir_cfg.active_flag = AUDPREPROC_CMD_IIR_ACTIVE_FLAG_ENA; - else - audio->iir_cfg.active_flag = AUDPREPROC_CMD_IIR_ACTIVE_FLAG_DIS; - - cmd = audio->iir_cfg; - - return audio_send_queue_pre(audio, &cmd, sizeof(cmd)); -} - -static int audio_enable_iir(struct audio_in *audio, int enable) -{ - if (audio->iir_enable != enable) { - audio->iir_enable = enable; - if (audio->running) - audio_dsp_set_iir(audio); - } - return 0; -} - -static int audio_in_dsp_enable(struct audio_in *audio, int enable) -{ - audrec_cmd_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_CFG; - cmd.type_0 = enable ? AUDREC_CMD_TYPE_0_ENA : AUDREC_CMD_TYPE_0_DIS; - cmd.type_0 |= (AUDREC_CMD_TYPE_0_UPDATE | audio->type); - cmd.type_1 = 0; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audio_in_encoder_config(struct audio_in *audio) -{ - audrec_cmd_arec0param_cfg cmd; - uint16_t *data = (void *) audio->data; - unsigned n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_AREC0PARAM_CFG; - cmd.ptr_to_extpkt_buffer_msw = audio->phys >> 16; - cmd.ptr_to_extpkt_buffer_lsw = audio->phys; - cmd.buf_len = FRAME_NUM; /* Both WAV and AAC use 8 frames */ - cmd.samp_rate_index = audio->samp_rate_index; - cmd.stereo_mode = audio->channel_mode; /* 0 for mono, 1 for stereo */ - - /* cmd.rec_quality is based on user set bit rate / sample rate / - * channel - */ - cmd.rec_quality = audio->record_quality; - - /* prepare buffer pointers: - * Mono: 1024 samples + 4 halfword header - * Stereo: 2048 samples + 4 halfword header - * AAC - * Mono/Stere: 768 + 4 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + 4; - if (audio->type == AUDREC_CMD_TYPE_0_INDEX_WAV) - data += (4 + (audio->channel_mode ? 2048 : 1024)); - else if (audio->type == AUDREC_CMD_TYPE_0_INDEX_AAC) - data += (4 + 768); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audio_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - /* Both WAV and AAC use AUDREC_CMD_TYPE_0 */ - cmd.type = AUDREC_CMD_TYPE_0; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } -} - -static long audio_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - rc = audio_in_enable(audio); - break; - case AUDIO_STOP: - rc = audio_in_disable(audio); - audio->stopped = 1; - break; - case AUDIO_FLUSH: - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audio_flush(audio); - mutex_unlock(&audio->read_lock); - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - /* The below code is to make mutual exclusive between - * AUDIO_SET_CONFIG and AUDIO_SET_STREAM_CONFIG. - * Allow any one IOCTL. - */ - if (audio->buffer_cfg_ioctl == AUDIO_SET_STREAM_CONFIG) { - rc = -EINVAL; - break; - } - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.channel_count == 1) { - cfg.channel_count = AUDREC_CMD_STEREO_MODE_MONO; - } else if (cfg.channel_count == 2) { - cfg.channel_count = AUDREC_CMD_STEREO_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - - if (cfg.type == 0) { - cfg.type = AUDREC_CMD_TYPE_0_INDEX_WAV; - } else if (cfg.type == 1) { - cfg.type = AUDREC_CMD_TYPE_0_INDEX_AAC; - } else { - rc = -EINVAL; - break; - } - audio->samp_rate = convert_samp_rate(cfg.sample_rate); - audio->samp_rate_index = - convert_dsp_samp_index(cfg.sample_rate); - audio->channel_mode = cfg.channel_count; - audio->buffer_size = - audio->channel_mode ? STEREO_DATA_SIZE - : MONO_DATA_SIZE; - audio->type = cfg.type; - audio->buffer_cfg_ioctl = AUDIO_SET_CONFIG; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - if (audio->channel_mode == AUDREC_CMD_STEREO_MODE_MONO) - cfg.channel_count = 1; - else - cfg.channel_count = 2; - if (audio->type == AUDREC_CMD_TYPE_0_INDEX_WAV) - cfg.type = 0; - else - cfg.type = 1; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - /* The below code is to make mutual exclusive between - * AUDIO_SET_CONFIG and AUDIO_SET_STREAM_CONFIG. - * Allow any one IOCTL. - */ - if (audio->buffer_cfg_ioctl == AUDIO_SET_CONFIG) { - rc = -EINVAL; - break; - } - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } else - rc = 0; - audio->buffer_size = cfg.buffer_size; - /* The IOCTL is only of AAC, set the encoder as AAC */ - audio->type = 1; - audio->buffer_cfg_ioctl = AUDIO_SET_STREAM_CONFIG; - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - if (audio->channel_mode == AUDREC_CMD_STEREO_MODE_MONO) - cfg.channels = 1; - else - cfg.channels = 2; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.bit_rate = audio->bit_rate; - cfg.stream_format = AUDIO_AAC_FORMAT_RAW; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - unsigned int record_quality; - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.stream_format != AUDIO_AAC_FORMAT_RAW) { - MM_ERR("unsupported AAC format\n"); - rc = -EINVAL; - break; - } - record_quality = bitrate_to_record_quality(cfg.sample_rate, - cfg.channels, cfg.bit_rate); - /* Range of Record Quality Supported by DSP, Q12 format */ - if ((record_quality < 0x800) || (record_quality > 0x4000)) { - MM_ERR("Unsupported bit rate \n"); - rc = -EINVAL; - break; - } - if (cfg.channels == 1) { - cfg.channels = AUDREC_CMD_STEREO_MODE_MONO; - } else if (cfg.channels == 2) { - cfg.channels = AUDREC_CMD_STEREO_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - audio->samp_rate = convert_samp_rate(cfg.sample_rate); - audio->samp_rate_index = - convert_dsp_samp_index(cfg.sample_rate); - audio->channel_mode = cfg.channels; - audio->bit_rate = cfg.bit_rate; - audio->record_quality = record_quality; - MM_DBG(" Record Quality = 0x%8x \n", audio->record_quality); - rc = 0; - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audio_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped); - if (rc < 0) - break; - - if (audio->stopped && !audio->in_count) { - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - } else { - MM_ERR("short read\n"); - break; - } - if (audio->type == AUDREC_CMD_TYPE_0_INDEX_AAC) - break; /* AAC only read one frame */ - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static ssize_t audio_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int audio_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audio_in_disable(audio); - audio_flush(audio); - msm_adsp_put(audio->audrec); - msm_adsp_put(audio->audpre); - audio->audrec = NULL; - audio->audpre = NULL; - audio->opened = 0; - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_in the_audio_in; - -static int audio_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_in; - int rc; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - audio->buffer_size = MONO_DATA_SIZE; - audio->type = AUDREC_CMD_TYPE_0_INDEX_WAV; - - /* For AAC, bit rate hard coded, default settings is - * sample rate (11025) x channel count (1) x recording quality (1.75) - * = 19293 bps */ - audio->bit_rate = 19293; - audio->record_quality = 0x1c00; - - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - rc = msm_adsp_get("AUDPREPROCTASK", &audio->audpre, - &audpre_adsp_ops, audio); - if (rc) - goto done; - rc = msm_adsp_get("AUDRECTASK", &audio->audrec, - &audrec_adsp_ops, audio); - if (rc) - goto done; - - audio->dsp_cnt = 0; - audio->stopped = 0; - audio->buffer_cfg_ioctl = 0; /* No valid ioctl set */ - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -} - -static long audpre_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0, enable; - uint16_t enable_mask; - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_ENABLE_AUDPRE: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - enable = (enable_mask & AGC_ENABLE) ? 1 : 0; - audio_enable_tx_agc(audio, enable); - enable = (enable_mask & NS_ENABLE) ? 1 : 0; - audio_enable_ns(audio, enable); - enable = (enable_mask & TX_IIR_ENABLE) ? 1 : 0; - audio_enable_iir(audio, enable); - break; - - case AUDIO_SET_AGC: - if (copy_from_user(&audio->tx_agc_cfg, (void *) arg, - sizeof(audio->tx_agc_cfg))) - rc = -EFAULT; - break; - - case AUDIO_SET_NS: - if (copy_from_user(&audio->ns_cfg, (void *) arg, - sizeof(audio->ns_cfg))) - rc = -EFAULT; - break; - - case AUDIO_SET_TX_IIR: - if (copy_from_user(&audio->iir_cfg, (void *) arg, - sizeof(audio->iir_cfg))) - rc = -EFAULT; - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&audio->lock); - return rc; -} - -static int audpre_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_in; - - file->private_data = audio; - - return 0; -} - -static struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audio_in_open, - .release = audio_in_release, - .read = audio_in_read, - .write = audio_in_write, - .unlocked_ioctl = audio_in_ioctl, -}; - -struct miscdevice audio_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_in", - .fops = &audio_fops, -}; - -static const struct file_operations audpre_fops = { - .owner = THIS_MODULE, - .open = audpre_open, - .unlocked_ioctl = audpre_ioctl, -}; - -struct miscdevice audpre_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_preproc_ctl", - .fops = &audpre_fops, -}; - -static int __init audio_in_init(void) -{ - the_audio_in.data = dma_alloc_coherent(NULL, DMASZ, - &the_audio_in.phys, GFP_KERNEL); - if (!the_audio_in.data) { - MM_ERR("Unable to allocate DMA buffer\n"); - return -ENOMEM; - } - - mutex_init(&the_audio_in.lock); - mutex_init(&the_audio_in.read_lock); - spin_lock_init(&the_audio_in.dsp_lock); - init_waitqueue_head(&the_audio_in.wait); - return misc_register(&audio_in_misc) || misc_register(&audpre_misc); -} - -device_initcall(audio_in_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_lpa.c b/arch/arm/mach-msm/qdsp5/audio_lpa.c deleted file mode 100644 index 7f0d68afc849..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_lpa.c +++ /dev/null @@ -1,1520 +0,0 @@ - -/* audio_lpa.c - low power audio driver - * - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * Based on the PCM decoder driver in arch/arm/mach-msm/qdsp5/audio_pcm.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* for queue ids - should be relative to module number*/ -#include "adsp.h" - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -#define MSM_MAX_VOLUME 0x2000 -/* 17 added to avoid more deviation */ -#define MSM_VOLUME_STEP (MSM_MAX_VOLUME+17) -#define MSM_VOLUME_FACTOR (10000) - -/* Size must be power of 2 */ -#define MAX_BUF 2 -#define BUFSZ (524288) - -#define AUDDEC_DEC_PCM 0 - -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDPCM_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct audio; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audpcm_suspend_ctl { -struct early_suspend node; -struct audio *audio; -}; -#endif - -struct audpcm_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audlpa_ion_region { - struct list_head list; - struct ion_handle *handle; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audpcm_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_bits; /* bits per sample */ - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; - struct msm_mapped_buffer *map_v_write; - - uint32_t drv_status; - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int teos; /* valid only if tunnel mode & no data left for decoder */ - int rmt_resource_released; - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - - unsigned long volume; - - uint16_t dec_id; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audpcm_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - struct list_head ion_region_queue; - int buffer_count; - int buffer_size; - struct ion_client *client; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); -static void audpcm_async_send_data(struct audio *audio, - unsigned needed); - - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_PCM; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_PCM; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) - MM_ERR("ADSP resources are not available"); - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audpcm_async_send_data(audio, 1); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder\n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason =0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_set_volume_and_pan(audio->dec_id, audio->volume, - 0); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_ERR("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - - -struct msm_adsp_ops audlpadec_adsp_ops = { - .event = audplay_dsp_event, -}; - - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_PCM | - AUDPP_CMD_LPA_MODE; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - audpp_cmd_cfg_adec_params_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WAV_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - cmd.pcm_width = audio->out_bits; - cmd.sign = 0; - audpp_send_queue2(&cmd, sizeof(cmd)); -} -static void audpcm_async_send_data(struct audio *audio, unsigned needed) -{ - unsigned long flags; - - if (!audio->running) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - /* pop one node out of queue */ - union msm_audio_event_payload payload; - struct audpcm_buffer_node *used_buf; - - MM_DBG("consumed\n"); - - BUG_ON(list_empty(&audio->out_queue)); - used_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - list_del(&used_buf->list); - payload.aio_buf = used_buf->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - } - if (audio->out_needed) { - struct audpcm_buffer_node *next_buf; - audplay_cmd_bitstream_data_avail cmd; - if (!list_empty(&audio->out_queue)) { - next_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - MM_DBG("next_buf %p\n", next_buf); - if (next_buf) { - MM_DBG("next buf phy %lx len %d\n", - next_buf->paddr, next_buf->buf.data_len); - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - if (next_buf->buf.data_len) - cmd.decoder_id = audio->dec_id; - else { - cmd.decoder_id = -1; - MM_DBG("input EOS signaled\n"); - } - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audpcm_async_flush(struct audio *audio) -{ - struct audpcm_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audpcm_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} -static void audio_ioport_reset(struct audio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audpcm_async_flush(audio); - mutex_unlock(&audio->write_lock); - } else - audpcm_async_flush(audio); - } else { - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audpcm_async_flush(audio); - mutex_unlock(&audio->write_lock); - } -} - -static int audpcm_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audpcm_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audpcm_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audpcm_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audpcm_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audpcm_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audpcm_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt && drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - mutex_lock(&audio->lock); - audlpa_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audlpa_ion_check(struct audio *audio, - void *vaddr, unsigned long len) -{ - struct audlpa_ion_region *region_elt; - struct audlpa_ion_region t = {.vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - MM_ERR("[%p]:region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", - audio, vaddr, len, - region_elt->vaddr, - (void *)region_elt->paddr, region_elt->len); - return -EINVAL; - } - } - - return 0; -} -static int audlpa_ion_add(struct audio *audio, - struct msm_audio_ion_info *info) -{ - ion_phys_addr_t paddr; - size_t len; - unsigned long kvaddr; - struct audlpa_ion_region *region; - int rc = -EINVAL; - struct ion_handle *handle; - unsigned long ionflag; - - MM_ERR("\n"); /* Macro prints the file name and function */ - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - handle = ion_import_dma_buf(audio->client, info->fd); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: could not get handle of the given fd\n", __func__); - goto import_error; - } - rc = ion_handle_get_flags(audio->client, handle, &ionflag); - if (rc) { - pr_err("%s: could not get flags for the handle\n", __func__); - goto flag_error; - } - kvaddr = (unsigned long)ion_map_kernel(audio->client, handle); - if (IS_ERR_OR_NULL((void *)kvaddr)) { - pr_err("%s: could not get virtual address\n", __func__); - goto map_error; - } - rc = ion_phys(audio->client, handle, &paddr, &len); - if (rc) { - pr_err("%s: could not get physical address\n", __func__); - goto ion_error; - } - rc = audlpa_ion_check(audio, info->vaddr, len); - if (rc < 0) { - MM_ERR("audpcm_ion_check failed\n"); - goto ion_error; - } - region->handle = handle; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - MM_DBG("[%p]:add region paddr %lx vaddr %p, len %lu kvaddr %lx\n", - audio, region->paddr, region->vaddr, - region->len, region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - - return rc; - -ion_error: - ion_unmap_kernel(audio->client, handle); -map_error: -flag_error: - ion_free(audio->client, handle); -import_error: - kfree(region); -end: - return rc; -} - -static int audlpa_ion_remove(struct audio *audio, - struct msm_audio_ion_info *info) -{ - struct audlpa_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audlpa_ion_region, list); - - if (region != NULL && (region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - MM_DBG("%s[%p]:region %p in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - MM_DBG("remove region fd %d vaddr %p\n", - info->fd, info->vaddr); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audlpa_ion_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audlpa_ion_region **region) -{ - struct audlpa_ion_region *region_elt; - int match_count = 0; - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("%s[%p]:multiple hits for vaddr %p, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%s[%p]:%p, %ld --> %p\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - return *region ? 0 : -1; -} -static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audlpa_ion_region *region; - unsigned long paddr; - int ret; - - ret = audlpa_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("%s[%p]:lookup (%p, %ld) failed\n", - __func__, audio, addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audlpa_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audpcm_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len" - "%d\n", buf_node, dir, - buf_node->buf.buf_addr, buf_node->buf.buf_len, - buf_node->buf.data_len); - - buf_node->paddr = audlpa_ion_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audpcm_async_send_data(audio, 0); - } - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - if (cmd == AUDIO_SET_VOLUME) { - unsigned long flags; - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->volume = MSM_VOLUME_STEP * arg; - audio->volume /= MSM_VOLUME_FACTOR; - - if (audio->volume > MSM_MAX_VOLUME) - audio->volume = MSM_MAX_VOLUME; - - if (audio->running) - audpp_set_volume_and_pan(audio->dec_id, - audio->volume, 0); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - } - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audpcm_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - if (config.bits == 8) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_8; - else if (config.bits == 16) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - else { - rc = -EINVAL; - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->out_bits = config.bits; - audio->buffer_count = config.buffer_count; - audio->buffer_size = config.buffer_size; - MM_DBG("AUDIO_SET_CONFIG\n"); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_count = audio->buffer_count; - config.buffer_size = audio->buffer_size; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_8) - config.bits = 8; - else if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_16) - config.bits = 16; - else - config.bits = 16; - config.unused[0] = 0; - config.unused[1] = 0; - - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - MM_DBG("AUDIO_GET_CONFIG\n"); - break; - } - - - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - MM_ERR("AUDIO_REGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audlpa_ion_add(audio, &info); - break; - } - - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - MM_ERR("AUDIO_DEREGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audlpa_ion_remove(audio, &info); - break; - } - - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audlpa_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_ASYNC_READ: - MM_ERR("AUDIO_ASYNC_READ not supported\n"); - rc = -EPERM; - break; - - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audlpa_async_fsync(struct audio *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - (audio->teos && audio->out_needed && - list_empty(&audio->out_queue)) - || audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audlpa_sync_fsync(struct audio *audio) -{ - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audpcm_async_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -int audlpa_fsync(struct file *file, loff_t a, loff_t b, - int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running) - return -EINVAL; - - return audlpa_async_fsync(audio); -} - -static void audpcm_reset_ion_region(struct audio *audio) -{ - struct audlpa_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audlpa_ion_region, list); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - } - - return; -} -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audpcm_async_flush(audio); - audpcm_reset_ion_region(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audpcm_reset_event_queue(audio); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - ion_client_destroy(audio->client); - kfree(audio); - return 0; -} - -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audpcm_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audpcm_suspend(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audpcm_resume(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audpcm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audpcm_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %lx\n", audio->volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d\n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d\n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d\n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d\n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d\n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d\n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d\n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d\n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d\n", audio->out[1].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audpcm_debug_fops = { - .read = audpcm_debug_read, - .open = audpcm_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, i, dec_attrb, decid; - struct audpcm_event *e_node = NULL; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_lpa_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_DBG("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_PCM; - if (file->f_mode & FMODE_READ) { - MM_ERR("Non-Tunneled mode not supported\n"); - rc = -EPERM; - kfree(audio); - goto done; - } else - dec_attrb |= MSM_AUD_MODE_TUNNEL; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available\n"); - rc = -ENODEV; - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - audio->buffer_size = BUFSZ; - audio->buffer_count = MAX_BUF; - rc = audmgr_open(&audio->audmgr); - if (rc) - goto err; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audlpadec_adsp_ops, audio); - if (rc) { - MM_ERR("failed to get %s module\n", audio->module_name); - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for PCM session"); - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - audio->volume = 0x2000; - audpcm_async_flush(audio); - - file->private_data = audio; - audio->opened = 1; - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_pcm_lp_dec_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audpcm_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audpcm_resume; - audio->suspend_ctl.node.suspend = audpcm_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDPCM_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - - audio->client = msm_ion_client_create(UINT_MAX, "Audio_LPA_Client"); - if (IS_ERR_OR_NULL(audio->client)) { - pr_err("Unable to create ION client\n"); - goto err; - } - MM_DBG("Ion client created\n"); - -done: - return rc; -err: - audpp_adec_free(audio->dec_id); - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - return rc; -} - -static const struct file_operations audio_pcm_lp_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audlpa_fsync, -}; - -struct miscdevice audio_lpa_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_lp_dec", - .fops = &audio_pcm_lp_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_lpa_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_mp3.c b/arch/arm/mach-msm/qdsp5/audio_mp3.c deleted file mode 100644 index e748285a96de..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_mp3.c +++ /dev/null @@ -1,2463 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * mp3 audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -/* Size must be power of 2 */ -#define BUFSZ_MAX 32768 -#define BUFSZ_MIN 4096 -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_MP3 2 - -#define PCM_BUFSZ_MIN 4800 /* Hold one stereo MP3 frame */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDMP3_METAFIELD_MASK 0xFFFF0000 -#define AUDMP3_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDMP3_EOS_FLG_MASK 0x01 -#define AUDMP3_EOS_NONE 0x0 /* No EOS detected */ -#define AUDMP3_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDMP3_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct audio; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audmp3_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audmp3_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audmp3_ion_region { - struct list_head list; - struct ion_handle *handle; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audmp3_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audmp3_drv_operations { - void (*pcm_buf_update)(struct audio *, uint32_t *); - void (*buffer_refresh)(struct audio *); - void (*send_data)(struct audio *, unsigned); - void (*out_flush)(struct audio *); - void (*in_flush)(struct audio *); - int (*fsync)(struct audio *); -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - struct list_head in_queue; /* queue to retain input buffers */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - uint32_t drv_status; - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int rmt_resource_released; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audmp3_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - struct list_head ion_region_queue; /* protected by lock */ - struct audmp3_drv_operations drv_ops; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audmp3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audmp3_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_MP3; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_MP3; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for MP3 \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_MP3; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audmp3_async_pcm_buf_update(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audmp3_buffer_node *filled_buf; - uint8_t index; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - BUG_ON(list_empty(&audio->in_queue)); - filled_buf = list_first_entry(&audio->in_queue, - struct audmp3_buffer_node, list); - if (filled_buf->paddr == payload[2 + index * 2]) { - list_del(&filled_buf->list); - event_payload.aio_buf = filled_buf->buf; - event_payload.aio_buf.data_len = - payload[3 + index * 2]; - MM_DBG("pcm buf %p data_len %d\n", filled_buf, - event_payload.aio_buf.data_len); - audmp3_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - MM_ERR("expected=%lx ret=%x\n", filled_buf->paddr, - payload[2 + index * 2]); - break; - } - } - - audio->drv_status &= ~ADRV_STATUS_IBUF_GIVEN; - audio->drv_ops.buffer_refresh(audio); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} - -static void audio_update_pcm_buf_entry(struct audio *audio, uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[2 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audio->drv_ops.buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audio->drv_ops.send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio->drv_ops.pcm_buf_update(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audio->drv_ops.buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audio->drv_ops.buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - - -struct msm_adsp_ops audplay_adsp_ops = { - .event = audplay_dsp_event, -}; - - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_MP3; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - audpp_cmd_cfg_adec_params_mp3 cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_MP3_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDMP3_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - /* complete all the writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -/* Caller holds irq_lock */ -static void audmp3_async_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - struct audmp3_buffer_node *next_buf; - - if (!audio->running || - audio->drv_status & ADRV_STATUS_IBUF_GIVEN) - return; - - if (!list_empty(&audio->in_queue)) { - next_buf = list_first_entry(&audio->in_queue, - struct audmp3_buffer_node, list); - if (!next_buf) - return; - MM_DBG("next buf %p phy %lx len %d\n", next_buf, - next_buf->paddr, next_buf->buf.buf_len); - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = next_buf->paddr; - refresh_cmd.buf0_length = next_buf->buf.buf_len - - (next_buf->buf.buf_len % 576) + - (audio->mfield ? 24 : 0); /* Mp3 frame size */ - refresh_cmd.buf_read_count = 0; - audio->drv_status |= ADRV_STATUS_IBUF_GIVEN; - (void) audplay_send_queue0(audio, &refresh_cmd, - sizeof(refresh_cmd)); - } - -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % 576) + - (audio->mfield ? 24 : 0); /* Mp3 frame size */ - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audmp3_async_send_data(struct audio *audio, unsigned needed) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - /* pop one node out of queue */ - union msm_audio_event_payload payload; - struct audmp3_buffer_node *used_buf; - - MM_DBG("consumed\n"); - BUG_ON(list_empty(&audio->out_queue)); - used_buf = list_first_entry(&audio->out_queue, - struct audmp3_buffer_node, list); - list_del(&used_buf->list); - payload.aio_buf = used_buf->buf; - audmp3_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - - } - - if (audio->out_needed) { - struct audmp3_buffer_node *next_buf; - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - if (!list_empty(&audio->out_queue)) { - next_buf = list_first_entry(&audio->out_queue, - struct audmp3_buffer_node, list); - MM_DBG("next_buf %p\n", next_buf); - if (next_buf) { - MM_DBG("next buf phy %lx len %d\n", - next_buf->paddr, - next_buf->buf.data_len); - - cmd.cmd_id = - AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDMP3_METAFIELD_MASK | - (next_buf->buf.mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - /* complete the writes to the input buffer */ - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } - -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audmp3_async_flush(struct audio *audio) -{ - struct audmp3_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audmp3_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audmp3_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audio_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audmp3_async_flush_pcm_buf(struct audio *audio) -{ - struct audmp3_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audmp3_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = 0; - audmp3_post_event(audio, AUDIO_EVENT_READ_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_IBUF_GIVEN; - -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audio_ioport_reset(struct audio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } else - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - } else { - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio->drv_ops.in_flush(audio); - mutex_unlock(&audio->read_lock); - } -} - -static int audmp3_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audmp3_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audmp3_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audmp3_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audmp3_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audmp3_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audmp3_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE || - drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - mutex_lock(&audio->lock); - audmp3_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - - /* order reads from the output buffer */ - if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) - rmb(); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audmp3_ion_check(struct audio *audio, - void *vaddr, unsigned long len) -{ - struct audmp3_ion_region *region_elt; - struct audmp3_ion_region t = { .vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - MM_ERR("region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", - vaddr, len, - region_elt->vaddr, - (void *)region_elt->paddr, - region_elt->len); - return -EINVAL; - } - } - - return 0; -} - -static int audmp3_ion_add(struct audio *audio, - struct msm_audio_ion_info *info) -{ - ion_phys_addr_t paddr; - size_t len; - unsigned long kvaddr; - struct audmp3_ion_region *region; - int rc = -EINVAL; - struct ion_handle *handle; - unsigned long ionflag; - void *temp_ptr; - - MM_DBG("\n"); /* Macro prints the file name and function */ - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - - handle = ion_import_dma_buf(audio->client, info->fd); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: could not get handle of the given fd\n", __func__); - goto import_error; - } - - rc = ion_handle_get_flags(audio->client, handle, &ionflag); - if (rc) { - pr_err("%s: could not get flags for the handle\n", __func__); - goto flag_error; - } - - temp_ptr = ion_map_kernel(audio->client, handle); - if (IS_ERR_OR_NULL(temp_ptr)) { - pr_err("%s: could not get virtual address\n", __func__); - goto map_error; - } - kvaddr = (unsigned long) temp_ptr; - - rc = ion_phys(audio->client, handle, &paddr, &len); - if (rc) { - pr_err("%s: could not get physical address\n", __func__); - goto ion_error; - } - - rc = audmp3_ion_check(audio, info->vaddr, len); - if (rc < 0) { - MM_ERR("audpcm_ion_check failed\n"); - goto ion_error; - } - - region->handle = handle; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - MM_DBG("[%p]:add region paddr %lx vaddr %p, len %lu kvaddr %lx\n", - audio, region->paddr, region->vaddr, - region->len, region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - return rc; - -ion_error: - ion_unmap_kernel(audio->client, handle); -map_error: -flag_error: - ion_free(audio->client, handle); -import_error: - kfree(region); -end: - return rc; -} - -static int audmp3_ion_remove(struct audio *audio, - struct msm_audio_ion_info *info) -{ - struct audmp3_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audmp3_ion_region, list); - - if (region != NULL && (region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - MM_DBG("%s[%p]:region %p in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - MM_DBG("remove region fd %d vaddr %p\n", - info->fd, info->vaddr); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audmp3_ion_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audmp3_ion_region **region) -{ - struct audmp3_ion_region *region_elt; - int match_count = 0; - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("%s[%p]:multiple hits for vaddr %p, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%s[%p]:%p, %ld --> %p\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - return *region ? 0 : -1; -} - -unsigned long audmp3_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audmp3_ion_region *region; - unsigned long paddr; - int ret; - - ret = audmp3_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("lookup (%p, %ld) failed\n", addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audmp3_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audmp3_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len \ - %d\n", buf_node, dir, - buf_node->buf.buf_addr, buf_node->buf.buf_len, - buf_node->buf.data_len); - - buf_node->paddr = audmp3_ion_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1) || - (!audio->pcm_feedback && - !buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audio->drv_ops.send_data(audio, 0); - } else { - /* read */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.buf_len < PCM_BUFSZ_MIN)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->in_queue); - audio->drv_ops.buffer_refresh(audio); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG(" AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audmp3_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) { - config.channel_count = 1; - } else { - config.channel_count = 2; - } - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) { - rc = -EFAULT; - } else { - rc = 0; - } - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - rc = 0; - break; - } - - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - rc = -ENOMEM; - break; - } - - audio->map_v_read = ion_map_kernel( - audio->client, handle); - - if (IS_ERR(audio->map_v_read)) { - MM_ERR("map of read buf failed\n"); - rc = -ENOMEM; - ion_free(audio->client, handle); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - rc = 0; - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - MM_DBG("AUDIO_REGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audmp3_ion_add(audio, &info); - break; - } - - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - MM_DBG("AUDIO_DEREGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audmp3_ion_remove(audio, &info); - break; - } - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audmp3_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_ASYNC_READ: - if (audio->pcm_feedback) - rc = audmp3_aio_buf_add(audio, 0, (void __user *) arg); - else - rc = -EPERM; - break; - - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audmp3_async_fsync(struct audio *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - (audio->teos && audio->out_needed && - list_empty(&audio->out_queue)) - || audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audmp3_sync_fsync(struct audio *audio) -{ - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audio->drv_ops.send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -int audmp3_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running || audio->pcm_feedback) - return -EINVAL; - - return audio->drv_ops.fsync(audio); -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - else if (!audio->pcm_feedback) - return 0; /* PCM feedback disabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible( - audio->read_wait, - (audio->in[audio->read_next]. - used > 0) || (audio->stopped) - || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since - * driver does not know frame size, read count - * must be greater or equal - * to size of PCM samples - */ - MM_DBG("no partial frame done reading\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audio->drv_ops.buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audmp3_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audio->drv_ops.send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audio->drv_ops.send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDMP3_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDMP3_EOS_FLG_OFFSET] & - AUDMP3_EOS_FLG_MASK) { - MM_DBG("EOS SET\n"); - eos_condition = AUDMP3_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDMP3_EOS_FLG_OFFSET] - &= ~AUDMP3_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audio->drv_ops.send_data(audio, 0); - } - } - if (eos_condition == AUDMP3_EOS_SET) - rc = audmp3_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} -static void audmp3_reset_ion_region(struct audio *audio) -{ - struct audmp3_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audmp3_ion_region, list); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - } - - return; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - audmp3_reset_ion_region(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audmp3_reset_event_queue(audio); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - if (!(audio->drv_status & ADRV_STATUS_AIO_INTF)) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - kfree(audio); - return 0; -} - -static void audmp3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audmp3_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audmp3_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audmp3_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audmp3_suspend(struct early_suspend *h) -{ - struct audmp3_suspend_ctl *ctl = - container_of(h, struct audmp3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audmp3_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audmp3_resume(struct early_suspend *h) -{ - struct audmp3_suspend_ctl *ctl = - container_of(h, struct audmp3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audmp3_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audmp3_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audmp3_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audmp3_debug_fops = { - .read = audmp3_debug_read, - .open = audmp3_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - - struct audio *audio = NULL; - int rc, i, dec_attrb, decid; - struct audmp3_event *e_node = NULL; - unsigned mem_sz = DMASZ_MAX; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_mp3_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_MP3; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_MP3_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - /* Non AIO interface */ - if (!(file->f_flags & O_NONBLOCK)) { - - MM_DBG("memsz = %d\n", mem_sz); - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - } - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - if (!(file->f_flags & O_NONBLOCK)) - goto err; - else - goto resource_err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops, audio); - - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - if (!(file->f_flags & O_NONBLOCK)) - goto err; - else - goto resource_err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for MP3 session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - if (!(file->f_flags & O_NONBLOCK)) - goto err; - else - goto resource_err; - } - - if (file->f_flags & O_NONBLOCK) { - MM_DBG("set to aio interface\n"); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.pcm_buf_update = audmp3_async_pcm_buf_update; - audio->drv_ops.buffer_refresh = audmp3_async_buffer_refresh; - audio->drv_ops.send_data = audmp3_async_send_data; - audio->drv_ops.out_flush = audmp3_async_flush; - audio->drv_ops.in_flush = audmp3_async_flush_pcm_buf; - audio->drv_ops.fsync = audmp3_async_fsync; - } else { - MM_DBG("set to std io interface\n"); - audio->drv_ops.pcm_buf_update = audio_update_pcm_buf_entry; - audio->drv_ops.buffer_refresh = audplay_buffer_refresh; - audio->drv_ops.send_data = audplay_send_data; - audio->drv_ops.out_flush = audio_flush; - audio->drv_ops.in_flush = audio_flush_pcm_buf; - audio->drv_ops.fsync = audmp3_sync_fsync; - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = (audio->out_dma_sz >> 1); - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->in_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->vol_pan.volume = 0x2000; - - audio->drv_ops.out_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_mp3_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audmp3_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audmp3_resume; - audio->suspend_ctl.node.suspend = audmp3_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDMP3_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audmp3_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_flags_error: -output_buff_get_phys_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: -resource_err: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_mp3_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audmp3_fsync, -}; - -struct miscdevice audio_mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &audio_mp3_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_mp3_misc); -} - -static void __exit audio_exit(void) -{ - misc_deregister(&audio_mp3_misc); -} - -module_init(audio_init); -module_exit(audio_exit); - -MODULE_DESCRIPTION("MSM MP3 driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_mvs.c b/arch/arm/mach-msm/qdsp5/audio_mvs.c deleted file mode 100644 index d1aba8216836..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_mvs.c +++ /dev/null @@ -1,1746 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define MVS_PROG 0x30000014 -#define MVS_VERS 0x00030001 -#define MVS_VERS_COMP_VER2 0x00060001 -#define MVS_VERS_COMP_VER3 0x00030001 - - -#define MVS_CLIENT_ID_VOIP 0x00000003 - -#define MVS_ACQUIRE_PROC 4 -#define MVS_ENABLE_PROC 5 -#define MVS_RELEASE_PROC 6 -#define MVS_AMR_SET_AMR_MODE_PROC 7 -#define MVS_AMR_SET_AWB_MODE_PROC 8 -#define MVS_VOC_SET_FRAME_RATE_PROC 10 -#define MVS_GSM_SET_DTX_MODE_PROC 11 -#define MVS_G729A_SET_MODE_PROC 12 -#define MVS_G711_GET_MODE_PROC 14 -#define MVS_G711_SET_MODE_PROC 15 -#define MVS_G711A_GET_MODE_PROC 16 -#define MVS_G711A_SET_MODE_PROC 17 -#define MVS_G722_SET_MODE_PROC 20 -#define MVS_G722_GET_MODE_PROC 21 -#define MVS_SET_DTX_MODE_PROC 22 - -#define MVS_EVENT_CB_TYPE_PROC 1 -#define MVS_PACKET_UL_FN_TYPE_PROC 2 -#define MVS_PACKET_DL_FN_TYPE_PROC 3 - -#define MVS_CB_FUNC_ID 0xAAAABBBB -#define MVS_UL_CB_FUNC_ID 0xBBBBCCCC -#define MVS_DL_CB_FUNC_ID 0xCCCCDDDD - -#define MVS_FRAME_MODE_VOC_TX 1 -#define MVS_FRAME_MODE_VOC_RX 2 -#define MVS_FRAME_MODE_AMR_UL 3 -#define MVS_FRAME_MODE_AMR_DL 4 -#define MVS_FRAME_MODE_GSM_UL 5 -#define MVS_FRAME_MODE_GSM_DL 6 -#define MVS_FRAME_MODE_HR_UL 7 -#define MVS_FRAME_MODE_HR_DL 8 -#define MVS_FRAME_MODE_G711_UL 9 -#define MVS_FRAME_MODE_G711_DL 10 -#define MVS_FRAME_MODE_PCM_UL 13 -#define MVS_FRAME_MODE_PCM_DL 14 -#define MVS_FRAME_MODE_PCM_WB_UL 23 -#define MVS_FRAME_MODE_PCM_WB_DL 24 -#define MVS_FRAME_MODE_G729A_UL 17 -#define MVS_FRAME_MODE_G729A_DL 18 -#define MVS_FRAME_MODE_G711A_UL 19 -#define MVS_FRAME_MODE_G711A_DL 20 -#define MVS_FRAME_MODE_G722_UL 21 -#define MVS_FRAME_MODE_G722_DL 22 - - - -#define MVS_PKT_CONTEXT_ISR 0x00000001 - -#define RPC_TYPE_REQUEST 0 -#define RPC_TYPE_REPLY 1 - -#define RPC_STATUS_FAILURE 0 -#define RPC_STATUS_SUCCESS 1 -#define RPC_STATUS_REJECT 1 - -#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2) -#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr)) -#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3) - -enum audio_mvs_state_type { - AUDIO_MVS_CLOSED, - AUDIO_MVS_OPENED, - AUDIO_MVS_STARTED, - AUDIO_MVS_STOPPED -}; - -enum audio_mvs_event_type { - AUDIO_MVS_COMMAND, - AUDIO_MVS_MODE, - AUDIO_MVS_NOTIFY -}; - -enum audio_mvs_cmd_status_type { - AUDIO_MVS_CMD_FAILURE, - AUDIO_MVS_CMD_BUSY, - AUDIO_MVS_CMD_SUCCESS -}; - -enum audio_mvs_mode_status_type { - AUDIO_MVS_MODE_NOT_AVAIL, - AUDIO_MVS_MODE_INIT, - AUDIO_MVS_MODE_READY -}; - -enum audio_mvs_pkt_status_type { - AUDIO_MVS_PKT_NORMAL, - AUDIO_MVS_PKT_FAST, - AUDIO_MVS_PKT_SLOW -}; - -/* Parameters required for MVS acquire. */ -struct rpc_audio_mvs_acquire_args { - uint32_t client_id; - uint32_t cb_func_id; -}; - -struct audio_mvs_acquire_msg { - struct rpc_request_hdr rpc_hdr; - struct rpc_audio_mvs_acquire_args acquire_args; -}; - -/* Parameters required for MVS enable. */ -struct rpc_audio_mvs_enable_args { - uint32_t client_id; - uint32_t mode; - uint32_t ul_cb_func_id; - uint32_t dl_cb_func_id; - uint32_t context; -}; - -struct audio_mvs_enable_msg { - struct rpc_request_hdr rpc_hdr; - struct rpc_audio_mvs_enable_args enable_args; -}; - -/* Parameters required for MVS release. */ -struct audio_mvs_release_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t client_id; -}; - -/* Parameters required for setting AMR mode. */ -struct audio_mvs_set_amr_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t amr_mode; -}; - -/* Parameters required for setting DTX. */ -struct audio_mvs_set_dtx_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t dtx_mode; -}; - -/* Parameters required for setting EVRC mode. */ -struct audio_mvs_set_voc_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t max_rate; - uint32_t min_rate; -}; - -/* Parameters for G711 mode */ -struct audio_mvs_set_g711_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g711_mode; -}; - -/* Parameters for G729 mode */ -struct audio_mvs_set_g729_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g729_mode; -}; - -/* Parameters for G722 mode */ -struct audio_mvs_set_g722_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g722_mode; -}; - - -/* Parameters for G711A mode */ -struct audio_mvs_set_g711A_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g711A_mode; -}; - -/* Parameters for EFR FR and HR mode */ -struct audio_mvs_set_efr_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t efr_mode; -}; - -union audio_mvs_event_data { - struct mvs_ev_command_type { - uint32_t event; - uint32_t client_id; - uint32_t cmd_status; - } mvs_ev_command_type; - - struct mvs_ev_mode_type { - uint32_t event; - uint32_t client_id; - uint32_t mode_status; - uint32_t mode; - } mvs_ev_mode_type; - - struct mvs_ev_notify_type { - uint32_t event; - uint32_t client_id; - uint32_t buf_dir; - uint32_t max_frames; - } mvs_ev_notify_type; -}; - -struct audio_mvs_cb_func_args { - uint32_t cb_func_id; - uint32_t valid_ptr; - uint32_t event; - union audio_mvs_event_data event_data; -}; - -struct audio_mvs_frame_info_hdr { - uint32_t frame_mode; - uint32_t mvs_mode; - uint16_t buf_free_cnt; -}; - -struct audio_mvs_ul_reply { - struct rpc_reply_hdr reply_hdr; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; - -struct audio_mvs_dl_cb_func_args { - uint32_t cb_func_id; - - uint32_t valid_ptr; - uint32_t frame_mode; - uint32_t frame_mode_ignore; - - struct audio_mvs_frame_info_hdr frame_info_hdr; - - uint32_t amr_frame; - uint32_t amr_mode; -}; -/*general codec parameters includes AMR, G711A, PCM -G729, VOC and HR vocoders -*/ -struct gnr_cdc_param { - uint32_t param1; - uint32_t param2; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; -/*G711 codec parameter*/ -struct g711_param { - uint32_t param1; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; - -union codec_param { - struct gnr_cdc_param gnr_arg; - struct g711_param g711_arg; -}; - -struct audio_mvs_dl_reply { - struct rpc_reply_hdr reply_hdr; - - uint32_t voc_pkt[MVS_MAX_VOC_PKT_SIZE/4]; - - uint32_t valid_frame_info_ptr; - uint32_t frame_mode; - uint32_t frame_mode_again; - - struct audio_mvs_frame_info_hdr frame_info_hdr; - union codec_param cdc_param; -}; - -struct audio_mvs_buf_node { - struct list_head list; - struct msm_audio_mvs_frame frame; -}; - -/* Each buffer is 20 ms, queue holds 200 ms of data. */ -#define MVS_MAX_Q_LEN 10 - -struct audio_mvs_info_type { - enum audio_mvs_state_type state; - uint32_t frame_mode; - uint32_t mvs_mode; - uint32_t buf_free_cnt; - uint32_t rate_type; - uint32_t dtx_mode; - - struct msm_rpc_endpoint *rpc_endpt; - uint32_t rpc_prog; - uint32_t rpc_ver; - uint32_t rpc_status; - - uint8_t *mem_chunk; - - struct list_head in_queue; - struct list_head free_in_queue; - - struct list_head out_queue; - struct list_head free_out_queue; - - struct task_struct *task; - - wait_queue_head_t wait; - wait_queue_head_t mode_wait; - wait_queue_head_t in_wait; - wait_queue_head_t out_wait; - - struct mutex lock; - struct mutex in_lock; - struct mutex out_lock; - - struct wake_lock suspend_lock; - struct pm_qos_request pm_qos_req; - - struct completion complete; -}; - -static struct audio_mvs_info_type audio_mvs_info; - -static int audio_mvs_setup_mode(struct audio_mvs_info_type *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - switch (audio->mvs_mode) { - case MVS_MODE_AMR: - case MVS_MODE_AMR_WB: { - struct audio_mvs_set_amr_mode_msg set_amr_mode_msg; - struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg; - - /* Set AMR mode. */ - memset(&set_amr_mode_msg, 0, sizeof(set_amr_mode_msg)); - set_amr_mode_msg.amr_mode = cpu_to_be32(audio->rate_type); - - if (audio->mvs_mode == MVS_MODE_AMR) { - msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_AMR_SET_AMR_MODE_PROC); - } else { - msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_AMR_SET_AWB_MODE_PROC); - } - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_amr_mode_msg, - sizeof(set_amr_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set amr mode done\n"); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_AMR_DL; - - /* Disable DTX. */ - memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg)); - set_dtx_mode_msg.dtx_mode = cpu_to_be32(0); - - msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_dtx_mode_msg, - sizeof(set_dtx_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set dtx done\n"); - - rc = 0; - } - } else { - MM_ERR("RPC write for set amr mode failed %d\n", rc); - } - break; - } - case MVS_MODE_PCM: - case MVS_MODE_LINEAR_PCM: { - /* PCM does not have any params to be set. - Save the MVS configuration information. */ - audio->rate_type = MVS_AMR_MODE_UNDEF; - audio->frame_mode = MVS_FRAME_MODE_PCM_DL; - break; - } - case MVS_MODE_PCM_WB: { - audio->rate_type = MVS_AMR_MODE_UNDEF; - audio->frame_mode = MVS_FRAME_MODE_PCM_WB_DL; - break; - } - case MVS_MODE_IS127: - case MVS_MODE_IS733: - case MVS_MODE_4GV_NB: - case MVS_MODE_4GV_WB: { - struct audio_mvs_set_voc_mode_msg set_voc_mode_msg; - - /* Set EVRC mode. */ - memset(&set_voc_mode_msg, 0, sizeof(set_voc_mode_msg)); - set_voc_mode_msg.min_rate = cpu_to_be32(audio->rate_type); - set_voc_mode_msg.max_rate = cpu_to_be32(audio->rate_type); - - MM_DBG("audio->mvs_mode %d audio->rate_type %d\n", - audio->mvs_mode, audio->rate_type); - msm_rpc_setup_req(&set_voc_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_VOC_SET_FRAME_RATE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_voc_mode_msg, - sizeof(set_voc_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set voc mode done\n"); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_VOC_RX; - - rc = 0; - } else { - MM_ERR("RPC write for set voc mode failed %d\n", rc); - } - break; - } - case MVS_MODE_G711: { - struct audio_mvs_set_g711_mode_msg set_g711_mode_msg; - - /* Set G711 mode. */ - memset(&set_g711_mode_msg, 0, sizeof(set_g711_mode_msg)); - set_g711_mode_msg.g711_mode = cpu_to_be32(audio->rate_type); - - MM_DBG("mode of g711:%d\n", set_g711_mode_msg.g711_mode); - - msm_rpc_setup_req(&set_g711_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G711_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g711_mode_msg, - sizeof(set_g711_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set g711 mode done\n"); - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G711_DL; - - rc = 0; - } else { - MM_ERR("RPC write for set g711 mode failed %d\n", rc); - } - break; - } - case MVS_MODE_G729A: { - struct audio_mvs_set_g729_mode_msg set_g729_mode_msg; - - /* Set G729 mode. */ - memset(&set_g729_mode_msg, 0, sizeof(set_g729_mode_msg)); - set_g729_mode_msg.g729_mode = cpu_to_be32(audio->dtx_mode); - - MM_DBG("mode of g729:%d\n", - set_g729_mode_msg.g729_mode); - - msm_rpc_setup_req(&set_g729_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G729A_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g729_mode_msg, - sizeof(set_g729_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set g729 mode done\n"); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G729A_DL; - - rc = 0; - } else { - MM_ERR("RPC write for set g729 mode failed %d\n", rc); - } - break; - } - case MVS_MODE_G722: { - struct audio_mvs_set_g722_mode_msg set_g722_mode_msg; - - /* Set G722 mode. */ - memset(&set_g722_mode_msg, 0, sizeof(set_g722_mode_msg)); - set_g722_mode_msg.g722_mode = cpu_to_be32(audio->rate_type); - - MM_DBG("mode of g722:%d\n", - set_g722_mode_msg.g722_mode); - - msm_rpc_setup_req(&set_g722_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G722_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g722_mode_msg, - sizeof(set_g722_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set g722 mode done\n"); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G722_DL; - - rc = 0; - } - break; - } - case MVS_MODE_G711A: { - struct audio_mvs_set_g711A_mode_msg set_g711A_mode_msg; - struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg; - - /* Set G711A mode. */ - memset(&set_g711A_mode_msg, 0, sizeof(set_g711A_mode_msg)); - set_g711A_mode_msg.g711A_mode = cpu_to_be32(audio->rate_type); - - MM_DBG("mode of g711A:%d\n", - set_g711A_mode_msg.g711A_mode); - - msm_rpc_setup_req(&set_g711A_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G711A_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g711A_mode_msg, - sizeof(set_g711A_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set g711A mode done\n"); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G711A_DL; - /* Set DTX MODE. */ - memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg)); - set_dtx_mode_msg.dtx_mode = - cpu_to_be32((audio->dtx_mode)); - - msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_dtx_mode_msg, - sizeof(set_dtx_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set dtx done\n"); - - rc = 0; - } - rc = 0; - } else { - MM_ERR("RPC write for set g711A mode failed %d\n", rc); - } - break; - } - case MVS_MODE_EFR: - case MVS_MODE_FR: - case MVS_MODE_HR: { - struct audio_mvs_set_efr_mode_msg set_efr_mode_msg; - - /* Set G729 mode. */ - memset(&set_efr_mode_msg, 0, sizeof(set_efr_mode_msg)); - set_efr_mode_msg.efr_mode = cpu_to_be32(audio->dtx_mode); - - MM_DBG("mode of EFR, FR and HR:%d\n", - set_efr_mode_msg.efr_mode); - - msm_rpc_setup_req(&set_efr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_GSM_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_efr_mode_msg, - sizeof(set_efr_mode_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for set EFR, FR and HR mode done\n"); - - /* Save the MVS configuration information. */ - if ((audio->mvs_mode == MVS_MODE_EFR) || - (audio->mvs_mode == MVS_MODE_FR)) - audio->frame_mode = MVS_FRAME_MODE_GSM_DL; - if (audio->mvs_mode == MVS_MODE_HR) - audio->frame_mode = MVS_FRAME_MODE_HR_DL; - - rc = 0; - } else { - MM_ERR("RPC write for set EFR, FR" - "and HR mode failed %d\n", rc); - } - break; - } - default: - rc = -EINVAL; - MM_ERR("Default case\n"); - } - return rc; -} - -static int audio_mvs_setup(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_enable_msg enable_msg; - - MM_DBG("\n"); - - /* Enable MVS. */ - memset(&enable_msg, 0, sizeof(enable_msg)); - enable_msg.enable_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - enable_msg.enable_args.mode = cpu_to_be32(audio->mvs_mode); - enable_msg.enable_args.ul_cb_func_id = cpu_to_be32(MVS_UL_CB_FUNC_ID); - enable_msg.enable_args.dl_cb_func_id = cpu_to_be32(MVS_DL_CB_FUNC_ID); - enable_msg.enable_args.context = cpu_to_be32(MVS_PKT_CONTEXT_ISR); - - msm_rpc_setup_req(&enable_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_ENABLE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, &enable_msg, sizeof(enable_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for enable done\n"); - - rc = wait_event_timeout(audio->mode_wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 10 * HZ); - - if (rc > 0) { - MM_DBG("Wait event for enable succeeded\n"); - rc = audio_mvs_setup_mode(audio); - if (rc < 0) { - MM_ERR("Unknown MVS mode %d\n", - audio->mvs_mode); - } - MM_ERR("rc value after mode setup: %d\n", rc); - } else { - MM_ERR("Wait event for enable failed %d\n", rc); - } - } else { - MM_ERR("RPC write for enable failed %d\n", rc); - } - - return rc; -} - -static int audio_mvs_start(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_acquire_msg acquire_msg; - - MM_DBG("\n"); - - /* Prevent sleep. */ - wake_lock(&audio->suspend_lock); - pm_qos_update_request(&audio->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - /* Acquire MVS. */ - memset(&acquire_msg, 0, sizeof(acquire_msg)); - acquire_msg.acquire_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - acquire_msg.acquire_args.cb_func_id = cpu_to_be32(MVS_CB_FUNC_ID); - - msm_rpc_setup_req(&acquire_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_ACQUIRE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &acquire_msg, - sizeof(acquire_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for acquire done\n"); - - rc = wait_event_timeout(audio->wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - - if (rc > 0) { - - rc = audio_mvs_setup(audio); - - if (rc == 0) - audio->state = AUDIO_MVS_STARTED; - - } else { - MM_ERR("Wait event for acquire failed %d\n", rc); - - rc = -EBUSY; - } - } else { - MM_ERR("RPC write for acquire failed %d\n", rc); - - rc = -EBUSY; - } - - return rc; -} - -static int audio_mvs_stop(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_release_msg release_msg; - - MM_DBG("\n"); - - /* Release MVS. */ - memset(&release_msg, 0, sizeof(release_msg)); - release_msg.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - - msm_rpc_setup_req(&release_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_RELEASE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, &release_msg, sizeof(release_msg)); - - if (rc >= 0) { - MM_DBG("RPC write for release done\n"); - - rc = wait_event_timeout(audio->mode_wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - - if (rc > 0) { - MM_DBG("Wait event for release succeeded\n"); - - audio->state = AUDIO_MVS_STOPPED; - - /* Un-block read in case it is waiting for data. */ - wake_up(&audio->out_wait); - rc = 0; - } else { - MM_ERR("Wait event for release failed %d\n", rc); - } - } else { - MM_ERR("RPC write for release failed %d\n", rc); - } - - /* Allow sleep. */ - pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&audio->suspend_lock); - - return rc; -} - -static void audio_mvs_process_rpc_request(uint32_t procedure, - uint32_t xid, - void *data, - uint32_t length, - struct audio_mvs_info_type *audio) -{ - int rc = 0; - - MM_DBG("\n"); - - switch (procedure) { - case MVS_EVENT_CB_TYPE_PROC: { - struct audio_mvs_cb_func_args *args = data; - struct rpc_reply_hdr reply_hdr; - - MM_DBG("MVS CB CB_FUNC_ID 0x%x\n", - be32_to_cpu(args->cb_func_id)); - - if (be32_to_cpu(args->valid_ptr)) { - uint32_t event_type = be32_to_cpu(args->event); - - MM_DBG("MVS CB event type %d\n", - be32_to_cpu(args->event)); - - if (event_type == AUDIO_MVS_COMMAND) { - uint32_t cmd_status = be32_to_cpu( - args->event_data.mvs_ev_command_type.cmd_status); - - MM_DBG("MVS CB command status %d\n", - cmd_status); - - if (cmd_status == AUDIO_MVS_CMD_SUCCESS) { - audio->rpc_status = RPC_STATUS_SUCCESS; - wake_up(&audio->wait); - } - - } else if (event_type == AUDIO_MVS_MODE) { - uint32_t mode_status = be32_to_cpu( - args->event_data.mvs_ev_mode_type.mode_status); - - MM_DBG("MVS CB mode status %d\n", mode_status); - - if (mode_status == AUDIO_MVS_MODE_READY) { - audio->rpc_status = RPC_STATUS_SUCCESS; - wake_up(&audio->mode_wait); - } - } else { - MM_ERR("MVS CB unknown event type %d\n", - event_type); - } - } else { - MM_ERR("MVS CB event pointer not valid\n"); - } - - /* Send ack to modem. */ - memset(&reply_hdr, 0, sizeof(reply_hdr)); - reply_hdr.xid = cpu_to_be32(xid); - reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - reply_hdr.reply_stat = cpu_to_be32(RPCMSG_REPLYSTAT_ACCEPTED); - - reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - reply_hdr.data.acc_hdr.verf_flavor = 0; - reply_hdr.data.acc_hdr.verf_length = 0; - - rc = msm_rpc_write(audio->rpc_endpt, - &reply_hdr, - sizeof(reply_hdr)); - - if (rc < 0) - MM_ERR("RPC write for response failed %d\n", rc); - - break; - } - - case MVS_PACKET_UL_FN_TYPE_PROC: { - uint32_t *args = data; - uint32_t pkt_len; - uint32_t frame_mode; - struct audio_mvs_ul_reply ul_reply; - struct audio_mvs_buf_node *buf_node = NULL; - - MM_DBG("MVS UL CB_FUNC_ID 0x%x\n", - be32_to_cpu(*args)); - args++; - - pkt_len = be32_to_cpu(*args); - MM_DBG("UL pkt_len %d\n", pkt_len); - args++; - - /* Copy the vocoder packets. */ - mutex_lock(&audio->out_lock); - - if (!list_empty(&audio->free_out_queue)) { - buf_node = list_first_entry(&audio->free_out_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - memcpy(&buf_node->frame.voc_pkt[0], args, pkt_len); - buf_node->frame.len = pkt_len; - pkt_len = ALIGN(pkt_len, 4); - args = args + pkt_len/4; - - MM_DBG("UL valid_ptr 0x%x\n", - be32_to_cpu(*args)); - args++; - - frame_mode = be32_to_cpu(*args); - MM_DBG("UL frame_mode %d\n", - frame_mode); - args++; - - MM_DBG("UL frame_mode %d\n", - be32_to_cpu(*args)); - args++; - - MM_DBG("UL frame_mode %d\n", - be32_to_cpu(*args)); - args++; - - MM_DBG("UL mvs_mode %d\n", - be32_to_cpu(*args)); - args++; - - MM_DBG("UL buf_free_cnt %d\n", - be32_to_cpu(*args)); - args++; - - if (frame_mode == MVS_FRAME_MODE_AMR_UL) { - /* Extract AMR frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL AMR frame_type %d\n", - be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_PCM_UL) { - /* PCM doesn't have frame_type */ - buf_node->frame.frame_type = 0; - } else if (frame_mode == MVS_FRAME_MODE_VOC_TX) { - /* Extracting EVRC current buffer frame rate*/ - buf_node->frame.frame_type = be32_to_cpu(*args); - pr_debug("%s: UL EVRC frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G711_UL) { - /* Extract G711 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL G711 frame_type %d\n", - be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G729A_UL) { - /* Extract G729 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL G729 frame_type %d\n", - be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G722_UL) { - /* Extract G722 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL G722 frame_type %d\n", - be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G711A_UL) { - /* Extract G711A frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL G711A frame_type %d\n", - be32_to_cpu(*args)); - } else if ((frame_mode == MVS_FRAME_MODE_GSM_UL) || - (frame_mode == MVS_FRAME_MODE_HR_UL)) { - /* Extract EFR, FR and HR frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - MM_DBG("UL EFR,FR,HR frame_type %d\n", - be32_to_cpu(*args)); - } else { - MM_DBG("UL Unknown frame mode %d\n", - frame_mode); - } - - list_add_tail(&buf_node->list, &audio->out_queue); - } else { - MM_ERR("UL data dropped, read is slow\n"); - } - - mutex_unlock(&audio->out_lock); - - wake_up(&audio->out_wait); - - /* Send UL message accept to modem. */ - memset(&ul_reply, 0, sizeof(ul_reply)); - ul_reply.reply_hdr.xid = cpu_to_be32(xid); - ul_reply.reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - ul_reply.reply_hdr.reply_stat = cpu_to_be32( - RPCMSG_REPLYSTAT_ACCEPTED); - - ul_reply.reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - ul_reply.reply_hdr.data.acc_hdr.verf_flavor = 0; - ul_reply.reply_hdr.data.acc_hdr.verf_length = 0; - - ul_reply.valid_pkt_status_ptr = cpu_to_be32(0x00000001); - ul_reply.pkt_status = cpu_to_be32(0x00000000); - - rc = msm_rpc_write(audio->rpc_endpt, - &ul_reply, - sizeof(ul_reply)); - - if (rc < 0) - MM_ERR("RPC write for UL response failed %d\n", - rc); - - break; - } - - case MVS_PACKET_DL_FN_TYPE_PROC: { - struct audio_mvs_dl_cb_func_args *args = data; - struct audio_mvs_dl_reply dl_reply; - uint32_t frame_mode; - struct audio_mvs_buf_node *buf_node = NULL; - - MM_DBG("MVS DL CB CB_FUNC_ID 0x%x\n", - be32_to_cpu(args->cb_func_id)); - - frame_mode = be32_to_cpu(args->frame_mode); - MM_DBG("DL frame_mode %d\n", frame_mode); - - /* Prepare and send the DL packets to modem. */ - memset(&dl_reply, 0, sizeof(dl_reply)); - dl_reply.reply_hdr.xid = cpu_to_be32(xid); - dl_reply.reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - dl_reply.reply_hdr.reply_stat = cpu_to_be32( - RPCMSG_REPLYSTAT_ACCEPTED); - - dl_reply.reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - dl_reply.reply_hdr.data.acc_hdr.verf_flavor = 0; - dl_reply.reply_hdr.data.acc_hdr.verf_length = 0; - - mutex_lock(&audio->in_lock); - - if (!list_empty(&audio->in_queue)) { - buf_node = list_first_entry(&audio->in_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - memcpy(&dl_reply.voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.len); - - MM_DBG("frame mode %d buf_node->frame.len %d\n", - frame_mode, buf_node->frame.len); - if (frame_mode == MVS_FRAME_MODE_AMR_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_PCM_DL) { - dl_reply.cdc_param.gnr_arg.param1 = 0; - dl_reply.cdc_param.gnr_arg.param2 = 0; - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_VOC_RX) { - dl_reply.cdc_param.gnr_arg.param1 = - cpu_to_be32(buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = 0; - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G711_DL) { - dl_reply.cdc_param.g711_arg.param1 = - cpu_to_be32(buf_node->frame.frame_type); - dl_reply.cdc_param.\ - g711_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.g711_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G729A_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G722_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G711A_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if ((frame_mode == MVS_FRAME_MODE_GSM_DL) || - (frame_mode == MVS_FRAME_MODE_HR_DL)) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else { - MM_ERR("DL Unknown frame mode %d\n", - frame_mode); - } - list_add_tail(&buf_node->list, &audio->free_in_queue); - } else { - MM_DBG("No DL data available to send to MVS\n"); - if (frame_mode == MVS_FRAME_MODE_G711_DL) { - dl_reply.cdc_param.\ - g711_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.g711_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_SLOW); - } else { - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_SLOW); - } - } - - mutex_unlock(&audio->in_lock); - - wake_up(&audio->in_wait); - dl_reply.valid_frame_info_ptr = cpu_to_be32(0x00000001); - - dl_reply.frame_mode = cpu_to_be32(audio->frame_mode); - dl_reply.frame_mode_again = cpu_to_be32(audio->frame_mode); - - dl_reply.frame_info_hdr.frame_mode = - cpu_to_be32(audio->frame_mode); - dl_reply.frame_info_hdr.mvs_mode = cpu_to_be32(audio->mvs_mode); - dl_reply.frame_info_hdr.buf_free_cnt = 0; - - rc = msm_rpc_write(audio->rpc_endpt, - &dl_reply, - sizeof(dl_reply)); - - if (rc < 0) - MM_ERR("RPC write for DL response failed %d\n", - rc); - - break; - } - - default: - MM_ERR("Unknown CB type %d\n", procedure); - } -} - -static int audio_mvs_thread(void *data) -{ - struct audio_mvs_info_type *audio = data; - struct rpc_request_hdr *rpc_hdr = NULL; - - MM_DBG("\n"); - - while (!kthread_should_stop()) { - - int rpc_hdr_len = msm_rpc_read(audio->rpc_endpt, - (void **) &rpc_hdr, - -1, - -1); - - if (rpc_hdr_len < 0) { - MM_ERR("RPC read failed %d\n", - rpc_hdr_len); - - break; - } else if ((rpc_hdr_len == 0) && - (audio->state == AUDIO_MVS_CLOSED)) { - break; - } else if (rpc_hdr_len < RPC_COMMON_HDR_SZ) { - continue; - } else { - uint32_t rpc_type = be32_to_cpu(rpc_hdr->type); - if (rpc_type == RPC_TYPE_REPLY) { - struct rpc_reply_hdr *rpc_reply = - (void *) rpc_hdr; - uint32_t reply_status; - - if (rpc_hdr_len < RPC_REPLY_HDR_SZ) - continue; - - reply_status = - be32_to_cpu(rpc_reply->reply_stat); - - if (reply_status != RPCMSG_REPLYSTAT_ACCEPTED) { - /* If the command is not accepted, there - * will be no response callback. Wake - * the caller and report error. */ - audio->rpc_status = RPC_STATUS_REJECT; - - wake_up(&audio->wait); - - MM_ERR("RPC reply status denied\n"); - } - } else if (rpc_type == RPC_TYPE_REQUEST) { - if (rpc_hdr_len < RPC_REQUEST_HDR_SZ) - continue; - - audio_mvs_process_rpc_request( - be32_to_cpu(rpc_hdr->procedure), - be32_to_cpu(rpc_hdr->xid), - (void *) (rpc_hdr + 1), - (rpc_hdr_len - sizeof(*rpc_hdr)), - audio); - } else { - MM_ERR("Unexpected RPC type %d\n", rpc_type); - } - } - - kfree(rpc_hdr); - rpc_hdr = NULL; - } - complete_and_exit(&audio->complete, 0); - MM_DBG("MVS thread stopped\n"); - - return 0; -} - -static int audio_mvs_alloc_buf(struct audio_mvs_info_type *audio) -{ - int i = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - - MM_DBG("\n"); - - /* Allocate input buffers. */ - for (i = 0; i < MVS_MAX_Q_LEN; i++) { - buf_node = kmalloc(sizeof(struct audio_mvs_buf_node), - GFP_KERNEL); - - if (buf_node != NULL) { - list_add_tail(&buf_node->list, - &audio->free_in_queue); - } else { - MM_ERR("No memory for IO buffers\n"); - goto err; - } - buf_node = NULL; - } - - /* Allocate output buffers. */ - for (i = 0; i < MVS_MAX_Q_LEN; i++) { - buf_node = kmalloc(sizeof(struct audio_mvs_buf_node), - GFP_KERNEL); - - if (buf_node != NULL) { - list_add_tail(&buf_node->list, - &audio->free_out_queue); - } else { - MM_ERR("No memory for IO buffers\n"); - goto err; - } - buf_node = NULL; - } - - return 0; - -err: - list_for_each_safe(ptr, next, &audio->free_in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - ptr = next = NULL; - list_for_each_safe(ptr, next, &audio->free_out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - return -ENOMEM; -} - -static void audio_mvs_free_buf(struct audio_mvs_info_type *audio) -{ - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct audio_mvs_buf_node *buf_node = NULL; - - MM_DBG("\n"); - - mutex_lock(&audio->in_lock); - /* Free input buffers. */ - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - ptr = next = NULL; - /* Free free_input buffers. */ - list_for_each_safe(ptr, next, &audio->free_in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - mutex_unlock(&audio->in_lock); - - mutex_lock(&audio->out_lock); - ptr = next = NULL; - /* Free output buffers. */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - /* Free free_ioutput buffers. */ - ptr = next = NULL; - list_for_each_safe(ptr, next, &audio->free_out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - mutex_unlock(&audio->out_lock); -} -static int audio_mvs_release(struct inode *inode, struct file *file) -{ - - struct audio_mvs_info_type *audio = file->private_data; - - MM_DBG("\n"); - - mutex_lock(&audio->lock); - if (audio->state == AUDIO_MVS_STARTED) - audio_mvs_stop(audio); - audio->state = AUDIO_MVS_CLOSED; - msm_rpc_read_wakeup(audio->rpc_endpt); - wait_for_completion(&audio->complete); - msm_rpc_close(audio->rpc_endpt); - audio->task = NULL; - audio_mvs_free_buf(audio); - mutex_unlock(&audio->lock); - - MM_DBG("Release done\n"); - return 0; -} - -static ssize_t audio_mvs_read(struct file *file, - char __user *buf, - size_t count, - loff_t *pos) -{ - int rc = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct audio_mvs_info_type *audio = file->private_data; - - MM_DBG("\n"); - - rc = wait_event_interruptible_timeout(audio->out_wait, - (!list_empty(&audio->out_queue) || - audio->state == AUDIO_MVS_STOPPED), - 1 * HZ); - - if (rc > 0) { - mutex_lock(&audio->out_lock); - if ((audio->state == AUDIO_MVS_STARTED) && - (!list_empty(&audio->out_queue))) { - - if (count >= sizeof(struct msm_audio_mvs_frame)) { - buf_node = list_first_entry(&audio->out_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - rc = copy_to_user(buf, - &buf_node->frame, - sizeof(struct msm_audio_mvs_frame)); - - if (rc == 0) { - rc = buf_node->frame.len + - sizeof(buf_node->frame.frame_type) + - sizeof(buf_node->frame.len); - } else { - MM_ERR("Copy to user retuned %d", rc); - - rc = -EFAULT; - } - - list_add_tail(&buf_node->list, - &audio->free_out_queue); - } else { - MM_ERR("Read count %d < sizeof(frame) %d", - count, - sizeof(struct msm_audio_mvs_frame)); - - rc = -ENOMEM; - } - } else { - MM_ERR("Read performed in state %d\n", - audio->state); - - rc = -EPERM; - } - mutex_unlock(&audio->out_lock); - - } else if (rc == 0) { - MM_ERR("No UL data available\n"); - - rc = -ETIMEDOUT; - } else { - MM_ERR("Read was interrupted\n"); - - rc = -ERESTARTSYS; - } - - return rc; -} - -static ssize_t audio_mvs_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *pos) -{ - int rc = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct audio_mvs_info_type *audio = file->private_data; - - MM_DBG("\n"); - - rc = wait_event_interruptible_timeout(audio->in_wait, - (!list_empty(&audio->free_in_queue) || - audio->state == AUDIO_MVS_STOPPED), 1 * HZ); - if (rc > 0) { - mutex_lock(&audio->in_lock); - if (audio->state == AUDIO_MVS_STARTED) { - if (count <= sizeof(struct msm_audio_mvs_frame)) { - if (!list_empty(&audio->free_in_queue)) { - buf_node = list_first_entry( - &audio->free_in_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - rc = copy_from_user(&buf_node->frame, - buf, - count); - - list_add_tail(&buf_node->list, - &audio->in_queue); - } else { - MM_ERR("No free DL buffs\n"); - } - } else { - MM_ERR("Write count %d > sizeof(frame) %d", - count, - sizeof(struct msm_audio_mvs_frame)); - - rc = -ENOMEM; - } - } else { - MM_ERR("Write performed in invalid state %d\n", - audio->state); - - rc = -EPERM; - } - mutex_unlock(&audio->in_lock); - } else if (rc == 0) { - MM_ERR("%s: No free DL buffs\n", __func__); - - rc = -ETIMEDOUT; - } else { - MM_ERR("%s: write was interrupted\n", __func__); - - rc = -ERESTARTSYS; - } - return rc; -} - -static long audio_mvs_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - - struct audio_mvs_info_type *audio = file->private_data; - - MM_DBG("\n"); - - switch (cmd) { - case AUDIO_GET_MVS_CONFIG: { - struct msm_audio_mvs_config config; - - MM_DBG("GET_MVS_CONFIG mvs_mode %d rate_type %d\n", - config.mvs_mode, config.rate_type); - - mutex_lock(&audio->lock); - config.mvs_mode = audio->mvs_mode; - config.rate_type = audio->rate_type; - mutex_unlock(&audio->lock); - - rc = copy_to_user((void *)arg, &config, sizeof(config)); - if (rc == 0) - rc = sizeof(config); - else - MM_ERR("Config copy failed %d\n", rc); - - break; - } - - case AUDIO_SET_MVS_CONFIG: { - struct msm_audio_mvs_config config; - - MM_DBG("IOCTL SET_MVS_CONFIG\n"); - - rc = copy_from_user(&config, (void *)arg, sizeof(config)); - if (rc == 0) { - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_OPENED) { - audio->mvs_mode = config.mvs_mode; - audio->rate_type = config.rate_type; - audio->dtx_mode = config.dtx_mode; - } else { - MM_ERR("Set confg called in state %d\n", - audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - } else { - MM_ERR("Config copy failed %d\n", rc); - } - - break; - } - - case AUDIO_START: { - MM_DBG("IOCTL START\n"); - - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_OPENED || - audio->state == AUDIO_MVS_STOPPED) { - rc = audio_mvs_start(audio); - if (rc != 0) - audio_mvs_stop(audio); - } else { - MM_ERR("Start called in invalid state %d\n", - audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - - break; - } - - case AUDIO_STOP: { - MM_DBG("IOCTL STOP\n"); - - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_STARTED) { - rc = audio_mvs_stop(audio); - } else { - MM_ERR("Stop called in invalid state %d\n", - audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - break; - } - - default: { - MM_ERR("Unknown IOCTL %d\n", cmd); - } - } - - return rc; -} - -static int audio_mvs_open(struct inode *inode, struct file *file) -{ - int rc = 0; - - MM_DBG("\n"); - - mutex_lock(&audio_mvs_info.lock); - - if (audio_mvs_info.state != AUDIO_MVS_CLOSED) { - MM_ERR("MVS driver exists, state %d\n", - audio_mvs_info.state); - - rc = -EBUSY; - mutex_unlock(&audio_mvs_info.lock); - goto done; - } - - mutex_unlock(&audio_mvs_info.lock); - - audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG, - MVS_VERS_COMP_VER2, - MSM_RPC_UNINTERRUPTIBLE); - - if (IS_ERR(audio_mvs_info.rpc_endpt)) { - MM_ERR("MVS RPC connect failed ver 0x%x\n", - MVS_VERS_COMP_VER2); - audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG, - MVS_VERS_COMP_VER3, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(audio_mvs_info.rpc_endpt)) { - MM_ERR("MVS RPC connect failed ver 0x%x\n", - MVS_VERS_COMP_VER3); - } else { - MM_DBG("MVS RPC connect succeeded ver 0x%x\n", - MVS_VERS_COMP_VER3); - audio_mvs_info.rpc_prog = MVS_PROG; - audio_mvs_info.rpc_ver = MVS_VERS_COMP_VER3; - } - } else { - MM_DBG("MVS RPC connect succeeded ver 0x%x\n", - MVS_VERS_COMP_VER2); - audio_mvs_info.rpc_prog = MVS_PROG; - audio_mvs_info.rpc_ver = MVS_VERS_COMP_VER2; - } - audio_mvs_info.task = kthread_run(audio_mvs_thread, - &audio_mvs_info, - "audio_mvs"); - if (IS_ERR(audio_mvs_info.task)) { - MM_ERR("MVS thread create failed\n"); - rc = PTR_ERR(audio_mvs_info.task); - audio_mvs_info.task = NULL; - msm_rpc_close(audio_mvs_info.rpc_endpt); - audio_mvs_info.rpc_endpt = NULL; - goto done; - } - - mutex_lock(&audio_mvs_info.lock); - - if (audio_mvs_info.task != NULL || - audio_mvs_info.rpc_endpt != NULL) { - rc = audio_mvs_alloc_buf(&audio_mvs_info); - - if (rc == 0) { - audio_mvs_info.state = AUDIO_MVS_OPENED; - file->private_data = &audio_mvs_info; - } - } else { - MM_ERR("MVS thread and RPC end point do not exist\n"); - - rc = -ENODEV; - } - - mutex_unlock(&audio_mvs_info.lock); - -done: - return rc; -} - -static const struct file_operations audio_mvs_fops = { - .owner = THIS_MODULE, - .open = audio_mvs_open, - .release = audio_mvs_release, - .read = audio_mvs_read, - .write = audio_mvs_write, - .unlocked_ioctl = audio_mvs_ioctl -}; - -struct miscdevice audio_mvs_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mvs", - .fops = &audio_mvs_fops -}; -static int __init audio_mvs_init(void) -{ - memset(&audio_mvs_info, 0, sizeof(audio_mvs_info)); - mutex_init(&audio_mvs_info.lock); - mutex_init(&audio_mvs_info.in_lock); - mutex_init(&audio_mvs_info.out_lock); - - init_waitqueue_head(&audio_mvs_info.wait); - init_waitqueue_head(&audio_mvs_info.mode_wait); - init_waitqueue_head(&audio_mvs_info.in_wait); - init_waitqueue_head(&audio_mvs_info.out_wait); - - INIT_LIST_HEAD(&audio_mvs_info.in_queue); - INIT_LIST_HEAD(&audio_mvs_info.free_in_queue); - INIT_LIST_HEAD(&audio_mvs_info.out_queue); - INIT_LIST_HEAD(&audio_mvs_info.free_out_queue); - - init_completion(&audio_mvs_info.complete); - - wake_lock_init(&audio_mvs_info.suspend_lock, - WAKE_LOCK_SUSPEND, - "audio_mvs_suspend"); - pm_qos_add_request(&audio_mvs_info.pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - return misc_register(&audio_mvs_misc); -} - -static void __exit audio_mvs_exit(void) -{ - MM_DBG("\n"); - - wake_lock_destroy(&audio_mvs_info.suspend_lock); - misc_deregister(&audio_mvs_misc); -} - -module_init(audio_mvs_init); -module_exit(audio_mvs_exit); - -MODULE_DESCRIPTION("MSM MVS driver"); -MODULE_LICENSE("GPL v2"); - diff --git a/arch/arm/mach-msm/qdsp5/audio_out.c b/arch/arm/mach-msm/qdsp5/audio_out.c deleted file mode 100644 index a39927ba49f0..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_out.c +++ /dev/null @@ -1,1234 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_out.c - * - * pcm audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include - -#include -#include - -#include "evlog.h" - -#define LOG_AUDIO_EVENTS 1 -#define LOG_AUDIO_FAULTS 0 - -#define SRS_ID_GLOBAL 0x00000001 -#define SRS_ID_WOWHD 0x00000002 -#define SRS_ID_CSHP 0x00000003 -#define SRS_ID_HPF 0x00000004 -#define SRS_ID_PEQ 0x00000005 -#define SRS_ID_HL 0x00000006 - -#define SRS_MASK_G 1 -#define SRS_MASK_W 2 -#define SRS_MASK_C 4 -#define SRS_MASK_HP 8 -#define SRS_MASK_P 16 -#define SRS_MASK_HL 32 - - -enum { - EV_NULL, - EV_OPEN, - EV_WRITE, - EV_RETURN, - EV_IOCTL, - EV_WRITE_WAIT, - EV_WAIT_EVENT, - EV_FILL_BUFFER, - EV_SEND_BUFFER, - EV_DSP_EVENT, - EV_ENABLE, -}; - -#if (LOG_AUDIO_EVENTS != 1) -static inline void LOG(unsigned id, unsigned arg) {} -#else -static const char *pcm_log_strings[] = { - "NULL", - "OPEN", - "WRITE", - "RETURN", - "IOCTL", - "WRITE_WAIT", - "WAIT_EVENT", - "FILL_BUFFER", - "SEND_BUFFER", - "DSP_EVENT", - "ENABLE", -}; - -DECLARE_LOG(pcm_log, 64, pcm_log_strings); - -static int __init _pcm_log_init(void) -{ - return ev_log_init(&pcm_log); -} -module_init(_pcm_log_init); - -#define LOG(id,arg) ev_log_write(&pcm_log, id, arg) -#endif - - - - - -#define BUFSZ (5248) -#define DMASZ (BUFSZ * 2) - -#define COMMON_OBJ_ID 6 - -struct buffer { - void *data; - unsigned size; - unsigned used; - unsigned addr; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t wait; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_weight; - uint32_t out_buffer_size; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - int teos; /* valid only if tunnel mode & no data left for decoder */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - - struct wake_lock wakelock; - struct pm_qos_request pm_qos_req; - - audpp_cmd_cfg_object_params_volume vol_pan; -}; - -struct audio_copp { - int mbadrc_enable; - int mbadrc_needs_commit; - char *mbadrc_data; - dma_addr_t mbadrc_phys; - - audpp_cmd_cfg_object_params_mbadrc mbadrc; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - - int rx_iir_enable; - int rx_iir_needs_commit; - audpp_cmd_cfg_object_params_pcm iir; - - audpp_cmd_cfg_object_params_volume vol_pan; - - int qconcert_plus_enable; - int qconcert_plus_needs_commit; - - int srs_enable; - int srs_needs_commit; - int srs_feature_mask; - audpp_cmd_cfg_object_params_qconcert qconcert_plus; - int srs_current_feature_mask; - uint32_t audpp_disabled_features; - - int status; - int opened; - struct mutex lock; - - struct audpp_event_callback ecb; - - struct audpp_cmd_cfg_object_params_srstm_g g; - struct audpp_cmd_cfg_object_params_srstm_w w; - struct audpp_cmd_cfg_object_params_srstm_c c; - struct audpp_cmd_cfg_object_params_srstm_h h; - struct audpp_cmd_cfg_object_params_srstm_p p; - struct audpp_cmd_cfg_object_params_srstm_l l; -} the_audio_copp; - -static void audio_prevent_sleep(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - wake_lock(&audio->wakelock); - pm_qos_update_request(&audio->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); -} - -static void audio_allow_sleep(struct audio *audio) -{ - pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&audio->wakelock); - MM_DBG("\n"); /* Macro prints the file name and function */ -} - -static int audio_dsp_out_enable(struct audio *audio, int yes); -static int audio_dsp_send_buffer(struct audio *audio, unsigned id, unsigned len); - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static int audio_enable_srs_trumedia(struct audio_copp *audio_copp, int enable); -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - /* refuse to start if we're not ready */ - if (!audio->out[0].used || !audio->out[1].used) - return -EIO; - - /* we start buffers 0 and 1, so buffer 0 will be the - * next one the dsp will want - */ - audio->out_tail = 0; - audio->out_needed = 0; - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_HOST_PCM; - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - audio_prevent_sleep(audio); - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - audio_allow_sleep(audio); - return rc; - } - - if (audpp_enable(-1, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - audmgr_disable(&audio->audmgr); - audio_allow_sleep(audio); - return -ENODEV; - } - - audio->enabled = 1; - htc_pwrsink_set(PWRSINK_AUDIO, 100); - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio_dsp_out_enable(audio, 0); - - audpp_disable(-1, audio); - - audio->stopped = 1; - wake_up(&audio->wait); - audmgr_disable(&audio->audmgr); - audio->out_needed = 0; - audio_allow_sleep(audio); - } - return 0; -} - -void audio_commit_pending_pp_params(void *priv, unsigned id, uint16_t *msg) -{ - struct audio_copp *audio_copp = priv; - - if (audio_copp == NULL) { - MM_ERR("NULL audio copp pointer\n"); - return; - } - - if (AUDPP_MSG_CFG_MSG == id && msg[0] == AUDPP_MSG_ENA_DIS) { - audio_copp->audpp_disabled_features = 0; - return; - } - if (AUDPP_MSG_CFG_MSG == id && msg[0] == AUDPP_MSG_ENA_ENA) - audio_copp->audpp_disabled_features = 0; - - if (!audio_copp->status) - return; - - if (id == AUDPP_MSG_PP_DISABLE_FEEDBACK) { - audio_copp->audpp_disabled_features |= - ((uint32_t)(msg[AUDPP_DISABLE_FEATS_MSW] << 16) | - msg[AUDPP_DISABLE_FEATS_LSW]); - MM_DBG("AUDPP disable feedback: %x", - audio_copp->audpp_disabled_features); - return; - } else if (id == AUDPP_MSG_PP_FEATS_RE_ENABLE) { - MM_DBG("AUDPP re-enable messaage: %x, acdb_enabled %d", - audio_copp->audpp_disabled_features, is_acdb_enabled()); - if (!is_acdb_enabled()) { - if ((audio_copp->audpp_disabled_features & - (1 << AUDPP_CMD_MBADRC)) == - (1 << AUDPP_CMD_MBADRC)) { - audpp_dsp_set_mbadrc(COMMON_OBJ_ID, - audio_copp->mbadrc_enable, - &audio_copp->mbadrc); - } - if ((audio_copp->audpp_disabled_features & - (1 << AUDPP_CMD_EQUALIZER)) == - (1 << AUDPP_CMD_EQUALIZER)) { - audpp_dsp_set_eq(COMMON_OBJ_ID, - audio_copp->eq_enable, - &audio_copp->eq); - } - if ((audio_copp->audpp_disabled_features & - (1 << AUDPP_CMD_IIR_TUNING_FILTER)) == - (1 << AUDPP_CMD_IIR_TUNING_FILTER)) { - audpp_dsp_set_rx_iir(COMMON_OBJ_ID, - audio_copp->rx_iir_enable, - &audio_copp->iir); - } - if ((audio_copp->audpp_disabled_features & - (1 << AUDPP_CMD_QCONCERT)) == - (1 << AUDPP_CMD_QCONCERT)) { - audpp_dsp_set_qconcert_plus(COMMON_OBJ_ID, - audio_copp->qconcert_plus_enable, - &audio_copp->qconcert_plus); - } - } - if ((audio_copp->audpp_disabled_features & (1 << AUDPP_CMD_SRS)) - == (1 << AUDPP_CMD_SRS)) { - if (audio_copp->srs_current_feature_mask & SRS_MASK_W) - audpp_dsp_set_rx_srs_trumedia_w(&audio_copp->w); - if (audio_copp->srs_current_feature_mask & SRS_MASK_C) - audpp_dsp_set_rx_srs_trumedia_c(&audio_copp->c); - if (audio_copp->srs_current_feature_mask & SRS_MASK_HP) - audpp_dsp_set_rx_srs_trumedia_h(&audio_copp->h); - if (audio_copp->srs_current_feature_mask & SRS_MASK_P) - audpp_dsp_set_rx_srs_trumedia_p(&audio_copp->p); - if (audio_copp->srs_current_feature_mask & SRS_MASK_HL) - audpp_dsp_set_rx_srs_trumedia_l(&audio_copp->l); - if (audio_copp->srs_current_feature_mask & SRS_MASK_G) - audpp_dsp_set_rx_srs_trumedia_g(&audio_copp->g); - } - audio_copp->audpp_disabled_features = 0; - return; - } - - if (!is_acdb_enabled()) { - audpp_dsp_set_mbadrc(COMMON_OBJ_ID, audio_copp->mbadrc_enable, - &audio_copp->mbadrc); - - audpp_dsp_set_eq(COMMON_OBJ_ID, audio_copp->eq_enable, - &audio_copp->eq); - audpp_dsp_set_rx_iir(COMMON_OBJ_ID, audio_copp->rx_iir_enable, - &audio_copp->iir); - audpp_dsp_set_vol_pan(COMMON_OBJ_ID, &audio_copp->vol_pan); - - audpp_dsp_set_qconcert_plus(COMMON_OBJ_ID, - audio_copp->qconcert_plus_enable, - &audio_copp->qconcert_plus); - } - audio_enable_srs_trumedia(audio_copp, true); -} -EXPORT_SYMBOL(audio_commit_pending_pp_params); - -/* ------------------- dsp --------------------- */ -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - struct buffer *frame; - unsigned long flags; - - LOG(EV_DSP_EVENT, id); - switch (id) { - case AUDPP_MSG_HOST_PCM_INTF_MSG: { - unsigned id = msg[2]; - unsigned idx = msg[3] - 1; - - /* MM_INFO("HOST_PCM id %d idx %d\n", id, idx); */ - if (id != AUDPP_MSG_HOSTPCM_ID_ARM_RX) { - MM_ERR("bogus id\n"); - break; - } - if (idx > 1) { - MM_ERR("bogus buffer idx\n"); - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (audio->running) { - atomic_add(audio->out[idx].used, &audio->out_bytes); - audio->out[idx].used = 0; - - frame = audio->out + audio->out_tail; - if (frame->used) { - audio_dsp_send_buffer( - audio, audio->out_tail, frame->used); - audio->out_tail ^= 1; - } else { - audio->out_needed++; - } - wake_up(&audio->wait); - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - break; - } - case AUDPP_MSG_PCMDMAMISSED: - MM_INFO("PCMDMAMISSED %d\n", msg[0]); - audio->teos = 1; - wake_up(&audio->wait); - break; - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - LOG(EV_ENABLE, 1); - MM_DBG("CFG_MSG ENABLE\n"); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(5, &audio->vol_pan); - audio_dsp_out_enable(audio, 1); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - LOG(EV_ENABLE, 0); - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_ERR("CFG_MSG %d?\n", msg[0]); - } - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } -} - -static int audio_dsp_out_enable(struct audio *audio, int yes) -{ - audpp_cmd_pcm_intf cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_PCM_INTF_2; - cmd.object_num = AUDPP_CMD_PCM_INTF_OBJECT_NUM; - cmd.config = AUDPP_CMD_PCM_INTF_CONFIG_CMD_V; - cmd.intf_type = AUDPP_CMD_PCM_INTF_RX_ENA_ARMTODSP_V; - - if (yes) { - cmd.write_buf1LSW = audio->out[0].addr; - cmd.write_buf1MSW = audio->out[0].addr >> 16; - if (audio->out[0].used) - cmd.write_buf1_len = audio->out[0].used; - else - cmd.write_buf1_len = audio->out[0].size; - cmd.write_buf2LSW = audio->out[1].addr; - cmd.write_buf2MSW = audio->out[1].addr >> 16; - if (audio->out[1].used) - cmd.write_buf2_len = audio->out[1].used; - else - cmd.write_buf2_len = audio->out[1].size; - cmd.arm_to_rx_flag = AUDPP_CMD_PCM_INTF_ENA_V; - cmd.weight_decoder_to_rx = audio->out_weight; - cmd.weight_arm_to_rx = 1; - cmd.partition_number_arm_to_dsp = 0; - cmd.sample_rate = audio->out_sample_rate; - cmd.channel_mode = audio->out_channel_mode; - } - - return audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static int audio_dsp_send_buffer(struct audio *audio, unsigned idx, unsigned len) -{ - audpp_cmd_pcm_intf_send_buffer cmd; - - cmd.cmd_id = AUDPP_CMD_PCM_INTF_2; - cmd.host_pcm_object = AUDPP_CMD_PCM_INTF_OBJECT_NUM; - cmd.config = AUDPP_CMD_PCM_INTF_BUFFER_CMD_V; - cmd.intf_type = AUDPP_CMD_PCM_INTF_RX_ENA_ARMTODSP_V; - cmd.dsp_to_arm_buf_id = 0; - cmd.arm_to_dsp_buf_id = idx + 1; - cmd.arm_to_dsp_buf_len = len; - - LOG(EV_SEND_BUFFER, idx); - dma_coherent_pre_ops(); - return audpp_send_queue2(&cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static int audio_enable_mbadrc(struct audio_copp *audio_copp, int enable) -{ - if (audio_copp->mbadrc_enable == enable && - !audio_copp->mbadrc_needs_commit) - return 0; - - audio_copp->mbadrc_enable = enable; - if (is_audpp_enable()) { - audpp_dsp_set_mbadrc(COMMON_OBJ_ID, enable, - &audio_copp->mbadrc); - audio_copp->mbadrc_needs_commit = 0; - } - - return 0; -} - -static int audio_enable_eq(struct audio_copp *audio_copp, int enable) -{ - if (audio_copp->eq_enable == enable && - !audio_copp->eq_needs_commit) - return 0; - - audio_copp->eq_enable = enable; - - if (is_audpp_enable()) { - audpp_dsp_set_eq(COMMON_OBJ_ID, enable, &audio_copp->eq); - audio_copp->eq_needs_commit = 0; - } - return 0; -} - -static int audio_enable_rx_iir(struct audio_copp *audio_copp, int enable) -{ - if (audio_copp->rx_iir_enable == enable && - !audio_copp->rx_iir_needs_commit) - return 0; - - audio_copp->rx_iir_enable = enable; - - if (is_audpp_enable()) { - audpp_dsp_set_rx_iir(COMMON_OBJ_ID, enable, &audio_copp->iir); - audio_copp->rx_iir_needs_commit = 0; - } - return 0; -} - -static int audio_enable_srs_trumedia(struct audio_copp *audio_copp, int enable) -{ - - if (!audio_copp->srs_needs_commit) - return 0; - - audio_copp->srs_enable = enable; - - MM_DBG("Enable SRS flags 0x%x enable %d\n", - audio_copp->srs_feature_mask, enable); - if (is_audpp_enable()) { - MM_DBG("Updating audpp for srs\n"); - if (audio_copp->srs_feature_mask & SRS_MASK_W) - audpp_dsp_set_rx_srs_trumedia_w(&audio_copp->w); - if (audio_copp->srs_feature_mask & SRS_MASK_C) - audpp_dsp_set_rx_srs_trumedia_c(&audio_copp->c); - if (audio_copp->srs_feature_mask & SRS_MASK_HP) - audpp_dsp_set_rx_srs_trumedia_h(&audio_copp->h); - if (audio_copp->srs_feature_mask & SRS_MASK_P) - audpp_dsp_set_rx_srs_trumedia_p(&audio_copp->p); - if (audio_copp->srs_feature_mask & SRS_MASK_HL) - audpp_dsp_set_rx_srs_trumedia_l(&audio_copp->l); - if (audio_copp->srs_feature_mask & SRS_MASK_G) - audpp_dsp_set_rx_srs_trumedia_g(&audio_copp->g); - - audio_copp->srs_current_feature_mask = - audio_copp->srs_feature_mask; - audio_copp->srs_needs_commit = 0; - audio_copp->srs_feature_mask = 0; - } - return 0; -} - -static int audio_enable_vol_pan(struct audio_copp *audio_copp) -{ - if (is_audpp_enable()) - audpp_dsp_set_vol_pan(COMMON_OBJ_ID, &audio_copp->vol_pan); - return 0; -} - -static int audio_enable_qconcert_plus(struct audio_copp *audio_copp, int enable) -{ - if (audio_copp->qconcert_plus_enable == enable && - !audio_copp->qconcert_plus_needs_commit) - return 0; - - audio_copp->qconcert_plus_enable = enable; - - if (is_audpp_enable()) { - audpp_dsp_set_qconcert_plus(COMMON_OBJ_ID, enable, - &audio_copp->qconcert_plus); - audio_copp->qconcert_plus_needs_commit = 0; - } - return 0; -} - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->stopped = 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->out_bytes); - if (copy_to_user((void*) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(5, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(5, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - } - - LOG(EV_IOCTL, cmd); - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - rc = audio_enable(audio); - break; - case AUDIO_STOP: - rc = audio_disable(audio); - break; - case AUDIO_FLUSH: - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the write_lock. - * While audio->stopped write threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void*) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count= AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) { - config.channel_count = 1; - } else { - config.channel_count = 2; - } - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void*) arg, &config, sizeof(config))) { - rc = -EFAULT; - } else { - rc = 0; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - if (!audio->running) - return -EINVAL; - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->wait, - (!audio->out[0].used && - !audio->out[1].used)); - - if (rc < 0) - goto done; - - /* pcm dmamiss message is sent continously when - * decoder is starved so no race condition concern - */ - - audio->teos = 0; - - rc = wait_event_interruptible(audio->wait, - audio->teos); - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static inline int rt_policy(int policy) -{ - if (unlikely(policy == SCHED_FIFO) || unlikely(policy == SCHED_RR)) - return 1; - return 0; -} - -static inline int task_has_rt_policy(struct task_struct *p) -{ - return rt_policy(p->policy); -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct sched_param s = { .sched_priority = 1 }; - struct audio *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - int old_prio = current->rt_priority; - int old_policy = current->policy; - int cap_nice = cap_raised(current_cap(), CAP_SYS_NICE); - int rc = 0; - - LOG(EV_WRITE, count | (audio->running << 28) | (audio->stopped << 24)); - - /* just for this write, set us real-time */ - if (!task_has_rt_policy(current)) { - struct cred *new = prepare_creds(); - cap_raise(new->cap_effective, CAP_SYS_NICE); - commit_creds(new); - if ((sched_setscheduler(current, SCHED_RR, &s)) < 0) - MM_ERR("sched_setscheduler failed\n"); - } - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - - LOG(EV_WAIT_EVENT, 0); - rc = wait_event_interruptible(audio->wait, - (frame->used == 0) || (audio->stopped)); - LOG(EV_WAIT_EVENT, 1); - - if (rc < 0) - break; - if (audio->stopped) { - rc = -EBUSY; - break; - } - xfer = count > frame->size ? frame->size : count; - if (copy_from_user(frame->data, buf, xfer)) { - rc = -EFAULT; - break; - } - frame->used = xfer; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - - spin_lock_irqsave(&audio->dsp_lock, flags); - LOG(EV_FILL_BUFFER, audio->out_head ^ 1); - frame = audio->out + audio->out_tail; - if (frame->used && audio->out_needed) { - audio_dsp_send_buffer(audio, audio->out_tail, frame->used); - audio->out_tail ^= 1; - audio->out_needed--; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - - mutex_unlock(&audio->write_lock); - - /* restore scheduling policy and priority */ - if (!rt_policy(old_policy)) { - struct sched_param v = { .sched_priority = old_prio }; - if ((sched_setscheduler(current, old_policy, &v)) < 0) - MM_ERR("sched_setscheduler failed\n"); - if (likely(!cap_nice)) { - struct cred *new = prepare_creds(); - cap_lower(new->cap_effective, CAP_SYS_NICE); - commit_creds(new); - } - } - - LOG(EV_RETURN,(buf > start) ? (buf - start) : rc); - if (buf > start) - return buf - start; - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - LOG(EV_OPEN, 0); - mutex_lock(&audio->lock); - audio_disable(audio); - audio_flush(audio); - audio->opened = 0; - mutex_unlock(&audio->lock); - htc_pwrsink_set(PWRSINK_AUDIO, 0); - return 0; -} - -struct audio the_audio; - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = &the_audio; - int rc; - - mutex_lock(&audio->lock); - - if (audio->opened) { - MM_ERR("busy\n"); - rc = -EBUSY; - goto done; - } - - if (!audio->data) { - audio->data = dma_alloc_coherent(NULL, DMASZ, - &audio->phys, GFP_KERNEL); - if (!audio->data) { - MM_ERR("could not allocate DMA buffers\n"); - rc = -ENOMEM; - goto done; - } - } - - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - - audio->out_buffer_size = BUFSZ; - audio->out_sample_rate = 48000; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_weight = 100; - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - audio->vol_pan.pan = 0x0; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - rc = 0; - LOG(EV_OPEN, 1); -done: - mutex_unlock(&audio->lock); - return rc; -} - -static long audpp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio_copp *audio_copp = file->private_data; - int rc = 0, enable; - uint16_t enable_mask; - int prev_state; - uint32_t to_set, size = 0; - void *tmpbuf, *srs_params = NULL; - - mutex_lock(&audio_copp->lock); - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - enable = ((enable_mask & ADRC_ENABLE) || - (enable_mask & MBADRC_ENABLE)) ? 1 : 0; - audio_enable_mbadrc(audio_copp, enable); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio_copp, enable); - enable = (enable_mask & IIR_ENABLE) ? 1 : 0; - audio_enable_rx_iir(audio_copp, enable); - enable = (enable_mask & QCONCERT_PLUS_ENABLE) ? 1 : 0; - audio_enable_qconcert_plus(audio_copp, enable); - enable = (enable_mask & SRS_ENABLE) ? 1 : 0; - audio_enable_srs_trumedia(audio_copp, enable); - break; - - case AUDIO_SET_MBADRC: { - uint32_t mbadrc_coeff_buf; - prev_state = audio_copp->mbadrc_enable; - audio_copp->mbadrc_enable = 0; - if (copy_from_user(&audio_copp->mbadrc.num_bands, (void *) arg, - sizeof(audio_copp->mbadrc) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) - rc = -EFAULT; - else if (audio_copp->mbadrc.ext_buf_size) { - mbadrc_coeff_buf = (uint32_t) ((char *) arg + - sizeof(audio_copp->mbadrc) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2)); - if ((copy_from_user(audio_copp->mbadrc_data, - (void *) mbadrc_coeff_buf, - AUDPP_MBADRC_EXTERNAL_BUF_SIZE * 2))) { - rc = -EFAULT; - break; - } - audio_copp->mbadrc.ext_buf_lsw = - audio_copp->mbadrc_phys & 0xFFFF; - audio_copp->mbadrc.ext_buf_msw = - ((audio_copp->mbadrc_phys & 0xFFFF0000) >> 16); - } - audio_copp->mbadrc_enable = prev_state; - if (!rc) - audio_copp->mbadrc_needs_commit = 1; - break; - } - - case AUDIO_SET_ADRC: { - struct audpp_cmd_cfg_object_params_adrc adrc; - prev_state = audio_copp->mbadrc_enable; - audio_copp->mbadrc_enable = 0; - if (copy_from_user(&adrc.compression_th, (void *) arg, - sizeof(adrc) - 2)) { - rc = -EFAULT; - audio_copp->mbadrc_enable = prev_state; - break; - } - audio_copp->mbadrc.num_bands = 1; - audio_copp->mbadrc.down_samp_level = 8; - audio_copp->mbadrc.adrc_delay = adrc.adrc_delay; - audio_copp->mbadrc.ext_buf_size = 0; - audio_copp->mbadrc.ext_partition = 0; - audio_copp->mbadrc.adrc_band[0].subband_enable = 1; - audio_copp->mbadrc.adrc_band[0].adrc_sub_mute = 0; - audio_copp->mbadrc.adrc_band[0].rms_time = - adrc.rms_time; - audio_copp->mbadrc.adrc_band[0].compression_th = - adrc.compression_th; - audio_copp->mbadrc.adrc_band[0].compression_slope = - adrc.compression_slope; - audio_copp->mbadrc.adrc_band[0].attack_const_lsw = - adrc.attack_const_lsw; - audio_copp->mbadrc.adrc_band[0].attack_const_msw = - adrc.attack_const_msw; - audio_copp->mbadrc.adrc_band[0].release_const_lsw = - adrc.release_const_lsw; - audio_copp->mbadrc.adrc_band[0].release_const_msw = - adrc.release_const_msw; - audio_copp->mbadrc.adrc_band[0].makeup_gain = 0x2000; - audio_copp->mbadrc_enable = prev_state; - audio_copp->mbadrc_needs_commit = 1; - break; - } - - case AUDIO_SET_EQ: - prev_state = audio_copp->eq_enable; - audio_copp->eq_enable = 0; - if (copy_from_user(&audio_copp->eq.num_bands, (void *) arg, - sizeof(audio_copp->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) - rc = -EFAULT; - audio_copp->eq_enable = prev_state; - audio_copp->eq_needs_commit = 1; - break; - - case AUDIO_SET_RX_IIR: - prev_state = audio_copp->rx_iir_enable; - audio_copp->rx_iir_enable = 0; - if (copy_from_user(&audio_copp->iir.num_bands, (void *) arg, - sizeof(audio_copp->iir) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) - rc = -EFAULT; - audio_copp->rx_iir_enable = prev_state; - audio_copp->rx_iir_needs_commit = 1; - break; - - case AUDIO_SET_VOLUME: - audio_copp->vol_pan.volume = arg; - audio_enable_vol_pan(audio_copp); - break; - - case AUDIO_SET_PAN: - audio_copp->vol_pan.pan = arg; - audio_enable_vol_pan(audio_copp); - break; - - case AUDIO_SET_QCONCERT_PLUS: - prev_state = audio_copp->qconcert_plus_enable; - audio_copp->qconcert_plus_enable = 0; - if (copy_from_user(&audio_copp->qconcert_plus.op_mode, - (void *) arg, - sizeof(audio_copp->qconcert_plus) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) - rc = -EFAULT; - audio_copp->qconcert_plus_enable = prev_state; - audio_copp->qconcert_plus_needs_commit = 1; - break; - - case AUDIO_SET_SRS_TRUMEDIA_PARAM: { - prev_state = audio_copp->srs_enable; - audio_copp->srs_enable = 0; - - if (copy_from_user(&to_set, (void *)arg, sizeof(uint32_t))) { - rc = -EFAULT; - break; - } - switch (to_set) { - case SRS_ID_GLOBAL: - srs_params = (void *)audio_copp->g.v; - size = sizeof(audio_copp->g.v); - audio_copp->srs_feature_mask |= SRS_MASK_G; - break; - case SRS_ID_WOWHD: - srs_params = (void *)audio_copp->w.v; - size = sizeof(audio_copp->w.v); - audio_copp->srs_feature_mask |= SRS_MASK_W; - break; - case SRS_ID_CSHP: - srs_params = (void *)audio_copp->c.v; - size = sizeof(audio_copp->c.v); - audio_copp->srs_feature_mask |= SRS_MASK_C; - break; - case SRS_ID_HPF: - srs_params = (void *)audio_copp->h.v; - size = sizeof(audio_copp->h.v); - audio_copp->srs_feature_mask |= SRS_MASK_HP; - break; - case SRS_ID_PEQ: - srs_params = (void *)audio_copp->p.v; - size = sizeof(audio_copp->p.v); - audio_copp->srs_feature_mask |= SRS_MASK_P; - break; - case SRS_ID_HL: - srs_params = (void *)audio_copp->l.v; - size = sizeof(audio_copp->l.v); - audio_copp->srs_feature_mask |= SRS_MASK_HL; - break; - default: - MM_ERR("SRS TruMedia error: invalid ioctl\n"); - rc = -EINVAL; - } - - if (rc >= 0) { - tmpbuf = kzalloc(sizeof(uint32_t) + size , GFP_KERNEL); - if (!tmpbuf) { - MM_ERR("SRS TruMedia error: no kernel mem\n"); - rc = -ENOMEM; - } else { - if (copy_from_user(tmpbuf, (void *)arg, - sizeof(uint32_t) + size)) - rc = -EFAULT; - memcpy(srs_params, - &(((uint32_t *)tmpbuf)[1]), size); - kfree(tmpbuf); - } - } - - MM_DBG("Ioctl SRS flags=0x%x\n", audio_copp->srs_feature_mask); - if (rc < 0) - MM_ERR("SRS TruMedia error setting params failed.\n"); - else{ - audio_copp->srs_needs_commit = 1; - audio_copp->srs_enable = prev_state; - } - break; - } - - default: - rc = -EINVAL; - } - - mutex_unlock(&audio_copp->lock); - return rc; -} - -static int audpp_open(struct inode *inode, struct file *file) -{ - struct audio_copp *audio_copp = &the_audio_copp; - int rc; - - mutex_lock(&audio_copp->lock); - if (audio_copp->opened) { - mutex_unlock(&audio_copp->lock); - return -EBUSY; - } - - audio_copp->opened = 1; - - if (!audio_copp->status) { - audio_copp->ecb.fn = audio_commit_pending_pp_params; - audio_copp->ecb.private = audio_copp; - rc = audpp_register_event_callback(&audio_copp->ecb); - if (rc) { - audio_copp->opened = 0; - mutex_unlock(&audio_copp->lock); - return rc; - } - audio_copp->mbadrc_data = dma_alloc_coherent(NULL, - AUDPP_MBADRC_EXTERNAL_BUF_SIZE * 2, - &audio_copp->mbadrc_phys, GFP_KERNEL); - if (!audio_copp->mbadrc_data) { - MM_ERR("could not allocate DMA buffers\n"); - audio_copp->opened = 0; - audpp_unregister_event_callback(&audio_copp->ecb); - mutex_unlock(&audio_copp->lock); - return -ENOMEM; - } - audio_copp->vol_pan.volume = 0x2000; - audio_copp->vol_pan.pan = 0x0; - audio_copp->status = 1; - } - - file->private_data = audio_copp; - mutex_unlock(&audio_copp->lock); - - return 0; -} - -static int audpp_release(struct inode *inode, struct file *file) -{ - struct audio_copp *audio_copp = &the_audio_copp; - - audio_copp->opened = 0; - - return 0; -} - -static struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -static struct file_operations audpp_fops = { - .owner = THIS_MODULE, - .open = audpp_open, - .release = audpp_release, - .unlocked_ioctl = audpp_ioctl, -}; - -struct miscdevice audio_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_out", - .fops = &audio_fops, -}; - -struct miscdevice audpp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_ctl", - .fops = &audpp_fops, -}; - -static int __init audio_init(void) -{ - mutex_init(&the_audio.lock); - mutex_init(&the_audio.write_lock); - mutex_init(&the_audio_copp.lock); - spin_lock_init(&the_audio.dsp_lock); - init_waitqueue_head(&the_audio.wait); - wake_lock_init(&the_audio.wakelock, WAKE_LOCK_SUSPEND, "audio_pcm"); - pm_qos_add_request(&the_audio.pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - return (misc_register(&audio_misc) || misc_register(&audpp_misc)); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_pcm.c b/arch/arm/mach-msm/qdsp5/audio_pcm.c deleted file mode 100644 index 4ffc2beea87e..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_pcm.c +++ /dev/null @@ -1,1746 +0,0 @@ - -/* audio_pcm.c - pcm audio decoder driver - * - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 decoder driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* for queue ids - should be relative to module number*/ -#include "adsp.h" - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -/* Size must be power of 2 */ -#define BUFSZ_MAX 32768 -#define BUFSZ_MIN 4096 -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDDEC_DEC_PCM 0 - -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDPCM_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct audio; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audpcm_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audpcm_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audpcm_ion_region { - struct list_head list; - struct ion_handle *handle; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audpcm_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audpcm_drv_operations { - void (*send_data)(struct audio *, unsigned); - void (*out_flush)(struct audio *); - int (*fsync)(struct audio *); -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_bits; /* bits per sample */ - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; - void *map_v_write; - - uint32_t drv_status; - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int teos; /* valid only if tunnel mode & no data left for decoder */ - int rmt_resource_released; - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - - unsigned volume; - - uint16_t dec_id; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audpcm_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - struct list_head ion_region_queue; - struct audpcm_drv_operations drv_ops; - struct ion_client *client; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audpcm_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_PCM; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_PCM; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for PCM \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audio->drv_ops.send_data(audio, 1); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_set_volume_and_pan(audio->dec_id, audio->volume, - 0); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_ERR("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - - -struct msm_adsp_ops audpcmdec_adsp_ops = { - .event = audplay_dsp_event, -}; - - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_PCM; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - audpp_cmd_cfg_adec_params_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WAV_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - cmd.pcm_width = audio->out_bits; - cmd.sign = 0; - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - audplay_cmd_bitstream_data_avail cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audpcm_async_send_data(struct audio *audio, unsigned needed) -{ - unsigned long flags; - - if (!audio->running) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - /* pop one node out of queue */ - union msm_audio_event_payload payload; - struct audpcm_buffer_node *used_buf; - - MM_DBG("consumed\n"); - - BUG_ON(list_empty(&audio->out_queue)); - used_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - list_del(&used_buf->list); - payload.aio_buf = used_buf->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - } - if (audio->out_needed) { - struct audpcm_buffer_node *next_buf; - audplay_cmd_bitstream_data_avail cmd; - if (!list_empty(&audio->out_queue)) { - next_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - MM_DBG("next_buf %p\n", next_buf); - if (next_buf) { - MM_DBG("next buf phy %lx len %d\n", - next_buf->paddr, next_buf->buf.data_len); - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - if (next_buf->buf.data_len) - cmd.decoder_id = audio->dec_id; - else { - cmd.decoder_id = -1; - MM_DBG("input EOS signaled\n"); - } - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - if (!audio->running) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audpcm_async_flush(struct audio *audio) -{ - struct audpcm_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audpcm_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audio_ioport_reset(struct audio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } else - audio->drv_ops.out_flush(audio); - } else { - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } -} - -static int audpcm_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audpcm_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audpcm_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audpcm_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audpcm_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audpcm_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audpcm_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt && drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - mutex_lock(&audio->lock); - audpcm_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audpcm_ion_check(struct audio *audio, - void *vaddr, unsigned long len) -{ - struct audpcm_ion_region *region_elt; - struct audpcm_ion_region t = {.vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - MM_ERR("[%p]:region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", - audio, vaddr, len, - region_elt->vaddr, - (void *)region_elt->paddr, region_elt->len); - return -EINVAL; - } - } - - return 0; -} -static int audpcm_ion_add(struct audio *audio, - struct msm_audio_ion_info *info) -{ - ion_phys_addr_t paddr; - size_t len; - unsigned long kvaddr; - struct audpcm_ion_region *region; - int rc = -EINVAL; - struct ion_handle *handle; - unsigned long ionflag; - - MM_ERR("\n"); /* Macro prints the file name and function */ - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - handle = ion_import_dma_buf(audio->client, info->fd); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: could not get handle of the given fd\n", __func__); - goto import_error; - } - rc = ion_handle_get_flags(audio->client, handle, &ionflag); - if (rc) { - pr_err("%s: could not get flags for the handle\n", __func__); - goto flag_error; - } - kvaddr = (unsigned long)ion_map_kernel(audio->client, handle); - if (IS_ERR_OR_NULL((void *)kvaddr)) { - pr_err("%s: could not get virtual address\n", __func__); - goto map_error; - } - rc = ion_phys(audio->client, handle, &paddr, &len); - if (rc) { - pr_err("%s: could not get physical address\n", __func__); - goto ion_error; - } - rc = audpcm_ion_check(audio, info->vaddr, len); - if (rc < 0) { - MM_ERR("audpcm_ion_check failed\n"); - goto ion_error; - } - region->handle = handle; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - MM_DBG("[%p]:add region paddr %lx vaddr %p, len %lu kvaddr %lx\n", - audio, region->paddr, region->vaddr, - region->len, region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - - return rc; - -ion_error: - ion_unmap_kernel(audio->client, handle); -map_error: -flag_error: - ion_free(audio->client, handle); -import_error: - kfree(region); -end: - return rc; -} - -static int audpcm_ion_remove(struct audio *audio, - struct msm_audio_ion_info *info) -{ - struct audpcm_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audpcm_ion_region, list); - - if (region != NULL && (region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - MM_DBG("%s[%p]:region %p in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - MM_DBG("remove region fd %d vaddr %p\n", - info->fd, info->vaddr); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audpcm_ion_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audpcm_ion_region **region) -{ - struct audpcm_ion_region *region_elt; - int match_count = 0; - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("%s[%p]:multiple hits for vaddr %p, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%s[%p]:%p, %ld --> %p\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - return *region ? 0 : -1; -} -static unsigned long audpcm_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audpcm_ion_region *region; - unsigned long paddr; - int ret; - - ret = audpcm_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("%s[%p]:lookup (%p, %ld) failed\n", - __func__, audio, addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audpcm_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audpcm_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len %d\n", - buf_node, dir, buf_node->buf.buf_addr, - buf_node->buf.buf_len, buf_node->buf.data_len); - - buf_node->paddr = audpcm_ion_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1) || - (!buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audio->drv_ops.send_data(audio, 0); - } - - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - if (cmd == AUDIO_SET_VOLUME) { - unsigned long flags; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->volume = arg; - if (audio->running) - audpp_set_volume_and_pan(audio->dec_id, arg, 0); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - } - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audpcm_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - if (config.bits == 8) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_8; - else if (config.bits == 16) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - else if (config.bits == 24) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_24; - else { - rc = -EINVAL; - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->out_bits = config.bits; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_8) - config.bits = 8; - else if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_24) - config.bits = 24; - else - config.bits = 16; - config.unused[0] = 0; - config.unused[1] = 0; - - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - - - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - MM_ERR("AUDIO_REGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audpcm_ion_add(audio, &info); - break; - } - - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - MM_ERR("AUDIO_DEREGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audpcm_ion_remove(audio, &info); - break; - } - - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audpcm_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_ASYNC_READ: - MM_ERR("AUDIO_ASYNC_READ not supported\n"); - rc = -EPERM; - break; - - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audpcm_async_fsync(struct audio *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - (audio->teos && audio->out_needed && - list_empty(&audio->out_queue)) - || audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audpcm_sync_fsync(struct audio *audio) -{ - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audio->drv_ops.send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -int audpcm_fsync(struct file *file, loff_t a, loff_t b, int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running) - return -EINVAL; - - return audio->drv_ops.fsync(audio); -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0; - unsigned dsize; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > (frame->size - 1)) ? - frame->size - 1 : count; - cpy_ptr++; - dsize = 1; - audio->reserved = 0; - } else - xfer = (count > frame->size) ? frame->size : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audio->drv_ops.send_data(audio, 0); - } - } - mutex_unlock(&audio->write_lock); - if (buf > start) - return buf - start; - - return rc; -} - -static void audpcm_reset_ion_region(struct audio *audio) -{ - struct audpcm_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audpcm_ion_region, list); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - } - - return; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audio->drv_ops.out_flush(audio); - audpcm_reset_ion_region(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audpcm_reset_event_queue(audio); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - ion_client_destroy(audio->client); - kfree(audio); - return 0; -} - -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audpcm_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audpcm_suspend(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audpcm_resume(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audpcm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audpcm_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audpcm_debug_fops = { - .read = audpcm_debug_read, - .open = audpcm_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, i, dec_attrb, decid; - struct audpcm_event *e_node = NULL; - unsigned mem_sz = DMASZ_MAX; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; - - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_pcm_dec_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_DBG("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_PCM; - if (file->f_mode & FMODE_READ) { - MM_ERR("Non-Tunneled mode not supported\n"); - rc = -EPERM; - kfree(audio); - goto done; - } else - dec_attrb |= MSM_AUD_MODE_TUNNEL; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available\n"); - rc = -ENODEV; - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_PCM_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - /* Non AIO interface */ - if (!(file->f_flags & O_NONBLOCK)) { - - MM_DBG("memsz = %d\n", mem_sz); - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - } - - rc = audmgr_open(&audio->audmgr); - if (rc) - goto err; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audpcmdec_adsp_ops, audio); - if (rc) { - MM_ERR("failed to get %s module\n", audio->module_name); - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for PCM session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - if (file->f_flags & O_NONBLOCK) { - MM_DBG("set to aio interface\n"); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.send_data = audpcm_async_send_data; - audio->drv_ops.out_flush = audpcm_async_flush; - audio->drv_ops.fsync = audpcm_async_fsync; - } else { - MM_DBG("set to std io interface\n"); - audio->drv_ops.send_data = audplay_send_data; - audio->drv_ops.out_flush = audio_flush; - audio->drv_ops.fsync = audpcm_sync_fsync; - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = (audio->out_dma_sz >> 1); - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - audio->volume = 0x2000; - audio->drv_ops.out_flush(audio); - - file->private_data = audio; - audio->opened = 1; - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_pcm_dec_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audpcm_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audpcm_resume; - audio->suspend_ctl.node.suspend = audpcm_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDPCM_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_flags_error: -output_buff_get_phys_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - return rc; -} - -static const struct file_operations audio_pcm_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audpcm_fsync, -}; - -struct miscdevice audio_pcm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_dec", - .fops = &audio_pcm_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_pcm_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_pcm_in.c b/arch/arm/mach-msm/qdsp5/audio_pcm_in.c deleted file mode 100644 index c5787fd6a5d4..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_pcm_in.c +++ /dev/null @@ -1,1011 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_pcm_in.c - * - * pcm audio input device - * - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c, - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_SIZE (2052 * 2) -#define MONO_DATA_SIZE (2048) -#define STEREO_DATA_SIZE (MONO_DATA_SIZE * 2) -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define MSM_AUD_BUFFER_UPDATE_WAIT_MS 2000 - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - - struct msm_adsp_module *audrec; - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* 2048 for mono, 4096 for stereo */ - uint32_t enc_type; /* 0 for PCM */ - uint32_t mode; /* Tunnel for PCM */ - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - unsigned short samp_rate_index; - uint32_t audrec_obj_idx ; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - struct audrec_session_info session_info; /*audrec session info*/ - - /* audpre settings */ - int tx_agc_enable; - audpreproc_cmd_cfg_agc_params tx_agc_cfg; - int ns_enable; - audpreproc_cmd_cfg_ns_params ns_cfg; - /* For different sample rate, the coeff might be different. * - * All the coeff should be passed from user space */ - int iir_enable; - audpreproc_cmd_cfg_iir_tuning_filter_params iir_cfg; - struct ion_client *client; - struct ion_handle *output_buff_handle; -}; - -static int audpcm_in_dsp_enable(struct audio_in *audio, int enable); -static int audpcm_in_encmem_config(struct audio_in *audio); -static int audpcm_in_encparam_config(struct audio_in *audio); -static int audpcm_in_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); -static void audpcm_in_flush(struct audio_in *audio); -static int audio_dsp_set_tx_agc(struct audio_in *audio); -static int audio_dsp_set_ns(struct audio_in *audio); -static int audio_dsp_set_iir(struct audio_in *audio); - -static unsigned convert_dsp_samp_index(unsigned index) -{ - switch (index) { - case 48000: return AUDREC_CMD_SAMP_RATE_INDX_48000; - case 44100: return AUDREC_CMD_SAMP_RATE_INDX_44100; - case 32000: return AUDREC_CMD_SAMP_RATE_INDX_32000; - case 24000: return AUDREC_CMD_SAMP_RATE_INDX_24000; - case 22050: return AUDREC_CMD_SAMP_RATE_INDX_22050; - case 16000: return AUDREC_CMD_SAMP_RATE_INDX_16000; - case 12000: return AUDREC_CMD_SAMP_RATE_INDX_12000; - case 11025: return AUDREC_CMD_SAMP_RATE_INDX_11025; - case 8000: return AUDREC_CMD_SAMP_RATE_INDX_8000; - default: return AUDREC_CMD_SAMP_RATE_INDX_11025; - } -} - -static unsigned convert_samp_rate(unsigned hz) -{ - switch (hz) { - case 48000: return RPC_AUD_DEF_SAMPLE_RATE_48000; - case 44100: return RPC_AUD_DEF_SAMPLE_RATE_44100; - case 32000: return RPC_AUD_DEF_SAMPLE_RATE_32000; - case 24000: return RPC_AUD_DEF_SAMPLE_RATE_24000; - case 22050: return RPC_AUD_DEF_SAMPLE_RATE_22050; - case 16000: return RPC_AUD_DEF_SAMPLE_RATE_16000; - case 12000: return RPC_AUD_DEF_SAMPLE_RATE_12000; - case 11025: return RPC_AUD_DEF_SAMPLE_RATE_11025; - case 8000: return RPC_AUD_DEF_SAMPLE_RATE_8000; - default: return RPC_AUD_DEF_SAMPLE_RATE_11025; - } -} - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, void *event_data) -{ - - uint16_t *msg = event_data; - - if (!msg) - return; - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_DBG("type %d, status_flag %d\n",\ - msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - - -/* must be called with audio->lock held */ -static int audpcm_in_enable(struct audio_in *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - cfg.codec = RPC_AUD_DEF_CODEC_PCM; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audrec); - return rc; - } - if (audpreproc_enable(audio->enc_id, &audpre_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audpcm_in_dsp_enable(audio, 1); - - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = - convert_samp_index(audio->samp_rate); - audpreproc_update_audrec_info(&audio->session_info); - - return 0; -} - -/* must be called with audio->lock held */ -static int audpcm_in_disable(struct audio_in *audio) -{ - int rc; - - if (audio->enabled) { - audio->enabled = 0; - - audpcm_in_dsp_enable(audio, 0); - - audio->stopped = 1; - wake_up(&audio->wait); - - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audrec); - } - return 0; -} - -struct audio_frame { - uint16_t count_low; - uint16_t count_high; - uint16_t bytes; - uint16_t unknown; - unsigned char samples[]; -} __packed; - -static void audpcm_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->bytes; - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("Error! not able to keep up the read\n"); - } else - audio->in_count++; - - audpcm_in_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = NULL; - uint16_t msg[3]; - - if (data) - audio = data; - else { - MM_ERR("invalid data for event %x\n", id); - return; - } - - getevent(msg, sizeof(msg)); - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - if (msg[0] & AUDREC_MSG_CFG_DONE_ENC_ENA) { - audio->audrec_obj_idx = msg[1]; - MM_INFO("CFG ENABLED\n"); - audpcm_in_encmem_config(audio); - } else { - MM_INFO("CFG SLEEP\n"); - audio->running = 0; - audio->tx_agc_enable = 0; - audio->ns_enable = 0; - audio->iir_enable = 0; - } - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("AREC_MEM_CFG_DONE_MSG\n"); - audpcm_in_encparam_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_INFO("PARAM CFG DONE\n"); - audio->running = 1; - if (is_acdb_enabled()) - break; - audio_dsp_set_tx_agc(audio); - audio_dsp_set_ns(audio); - audio_dsp_set_iir(audio); - break; - } - case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: { - MM_DBG("ERROR %x\n", msg[0]); - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - struct audrec_msg_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt msw %d \ - write cnt lsw %d read cnt msw %d read cnt lsw %d \n",\ - pkt_ready_msg.pkt_counter_msw, \ - pkt_ready_msg.pkt_counter_lsw, \ - pkt_ready_msg.pkt_read_cnt_msw, \ - pkt_ready_msg.pkt_read_cnt_lsw); - - audpcm_in_get_dsp_frames(audio); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - } - default: - MM_ERR("unknown event %d\n", id); - } -} - -static struct msm_adsp_ops audrec_adsp_ops = { - .event = audrec_dsp_event, -}; - -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -static int audio_dsp_set_tx_agc(struct audio_in *audio) -{ - audpreproc_cmd_cfg_agc_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->tx_agc_cfg.cmd_id = AUDPREPROC_CMD_CFG_AGC_PARAMS; - if (audio->tx_agc_enable) { - /* cmd.tx_agc_param_mask = 0xFE00 from sample code */ - audio->tx_agc_cfg.tx_agc_param_mask = - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_SLOPE) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_TH) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_EXP_SLOPE) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_EXP_TH) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_AIG_FLAG) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_COMP_STATIC_GAIN) | - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_TX_AGC_ENA_FLAG); - audio->tx_agc_cfg.tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_ENA; - /* cmd.param_mask = 0xFFF0 from sample code */ - audio->tx_agc_cfg.tx_agc_param_mask = - (1 << AUDPREPROC_CMD_PARAM_MASK_RMS_TAY) | - (1 << AUDPREPROC_CMD_PARAM_MASK_RELEASEK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_DELAY) | - (1 << AUDPREPROC_CMD_PARAM_MASK_ATTACKK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAKRATE_SLOW) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAKRATE_FAST) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_RELEASEK) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_MIN) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_MAX) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAK_UP) | - (1 << AUDPREPROC_CMD_PARAM_MASK_LEAK_DOWN) | - (1 << AUDPREPROC_CMD_PARAM_MASK_AIG_ATTACKK); - } else { - audio->tx_agc_cfg.tx_agc_param_mask = - (1 << AUDPREPROC_CMD_TX_AGC_PARAM_MASK_TX_AGC_ENA_FLAG); - audio->tx_agc_cfg.tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_DIS; - } - cmd = audio->tx_agc_cfg; - - return audpreproc_dsp_set_agc(&cmd, sizeof(cmd)); -} - -static int audio_enable_tx_agc(struct audio_in *audio, int enable) -{ - if (audio->tx_agc_enable != enable) { - audio->tx_agc_enable = enable; - if (audio->running) - audio_dsp_set_tx_agc(audio); - } - return 0; -} - -static int audio_dsp_set_ns(struct audio_in *audio) -{ - audpreproc_cmd_cfg_ns_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->ns_cfg.cmd_id = AUDPREPROC_CMD_CFG_NS_PARAMS; - - if (audio->ns_enable) { - /* cmd.ec_mode_new is fixed as 0x0064 when enable - * from sample code */ - audio->ns_cfg.ec_mode_new = - AUDPREPROC_CMD_EC_MODE_NEW_NS_ENA | - AUDPREPROC_CMD_EC_MODE_NEW_HB_ENA | - AUDPREPROC_CMD_EC_MODE_NEW_VA_ENA; - } else { - audio->ns_cfg.ec_mode_new = - AUDPREPROC_CMD_EC_MODE_NEW_NLMS_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_DES_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NS_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_CNI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NLES_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_HB_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_VA_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_PCD_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_FEHI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NEHI_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_NLPP_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_FNE_DIS | - AUDPREPROC_CMD_EC_MODE_NEW_PRENLMS_DIS; - } - cmd = audio->ns_cfg; - - return audpreproc_dsp_set_ns(&cmd, sizeof(cmd)); -} - -static int audio_enable_ns(struct audio_in *audio, int enable) -{ - if (audio->ns_enable != enable) { - audio->ns_enable = enable; - if (audio->running) - audio_dsp_set_ns(audio); - } - return 0; -} - -static int audio_dsp_set_iir(struct audio_in *audio) -{ - audpreproc_cmd_cfg_iir_tuning_filter_params cmd; - - memset(&cmd, 0, sizeof(cmd)); - - audio->iir_cfg.cmd_id = AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - - if (audio->iir_enable) - /* cmd.active_flag is 0xFFFF from sample code but 0x0001 here */ - audio->iir_cfg.active_flag = AUDPREPROC_CMD_IIR_ACTIVE_FLAG_ENA; - else - audio->iir_cfg.active_flag = AUDPREPROC_CMD_IIR_ACTIVE_FLAG_DIS; - - cmd = audio->iir_cfg; - - return audpreproc_dsp_set_iir(&cmd, sizeof(cmd)); -} - -static int audio_enable_iir(struct audio_in *audio, int enable) -{ - if (audio->iir_enable != enable) { - audio->iir_enable = enable; - if (audio->running) - audio_dsp_set_iir(audio); - } - return 0; -} - -static int audpcm_in_dsp_enable(struct audio_in *audio, int enable) -{ - struct audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ENC_CFG; - - cmd.audrec_enc_type = (audio->enc_type & 0xFF) | - (enable ? AUDREC_CMD_ENC_ENA : AUDREC_CMD_ENC_DIS); - /* Don't care */ - cmd.audrec_obj_idx = audio->audrec_obj_idx; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_in_encmem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t cnt = 0; - uint16_t *data = (void *) audio->data; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.cmd_id = AUDREC_CMD_ARECMEM_CFG; - cmd.audrec_obj_idx = audio->audrec_obj_idx; - /* Rate at which packet complete message comes */ - cmd.audrec_up_pkt_intm_cnt = 1; - cmd.audrec_extpkt_buffer_msw = audio->phys >> 16; - cmd.audrec_extpkt_buffer_lsw = audio->phys; - /* Max Buffer no available for frames */ - cmd.audrec_extpkt_buffer_num = FRAME_NUM; - - /* prepare buffer pointers: - * Mono: 1024 samples + 4 halfword header - * Stereo: 2048 samples + 4 halfword header - */ - for (cnt = 0; cnt < FRAME_NUM; cnt++) { - audio->in[cnt].data = data + 4; - data += (4 + (audio->channel_mode ? 2048 : 1024)); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_in_encparam_config(struct audio_in *audio) -{ - struct audrec_cmd_arecparam_wav_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDREC_CMD_ARECPARAM_CFG; - cmd.common.audrec_obj_idx = audio->audrec_obj_idx; - cmd.samp_rate_idx = audio->samp_rate_index; - cmd.stereo_mode = audio->channel_mode; /* 0 for mono, 1 for stereo */ - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_in_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - cmd.type = audio->audrec_obj_idx; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audpcm_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = FRAME_NUM-1; i >= 0; i--) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } -} - -static long audpcm_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = atomic_read(&audio->in_bytes); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - rc = audpcm_in_enable(audio); - audio->stopped = 0; - break; - } - case AUDIO_STOP: - rc = audpcm_in_disable(audio); - break; - case AUDIO_FLUSH: - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audpcm_in_flush(audio); - mutex_unlock(&audio->read_lock); - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.channel_count == 1) { - cfg.channel_count = AUDREC_CMD_STEREO_MODE_MONO; - } else if (cfg.channel_count == 2) { - cfg.channel_count = AUDREC_CMD_STEREO_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - - audio->samp_rate = convert_samp_rate(cfg.sample_rate); - audio->samp_rate_index = - convert_dsp_samp_index(cfg.sample_rate); - audio->channel_mode = cfg.channel_count; - audio->buffer_size = - audio->channel_mode ? STEREO_DATA_SIZE - : MONO_DATA_SIZE; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - if (audio->channel_mode == AUDREC_CMD_STEREO_MODE_MONO) - cfg.channel_count = 1; - else - cfg.channel_count = 2; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audpcm_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible_timeout( - audio->wait, (audio->in_count > 0) || audio->stopped, - msecs_to_jiffies(MSM_AUD_BUFFER_UPDATE_WAIT_MS)); - if (rc == 0) { - rc = -ETIMEDOUT; - break; - } else if (rc < 0) { - break; - } - - if (audio->stopped && !audio->in_count) { - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is invalid and we need to - * retry - */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - } else { - MM_ERR("short read\n"); - break; - } - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static ssize_t audpcm_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int audpcm_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audpcm_in_disable(audio); - audpcm_in_flush(audio); - audpreproc_aenc_free(audio->enc_id); - msm_adsp_put(audio->audrec); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -static struct audio_in the_audio_in; - -static int audpcm_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_in; - int rc; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - int encid; - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - audio->buffer_size = MONO_DATA_SIZE; - audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_WAV | audio->mode; - - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_adsp_ops, audio); - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->dsp_cnt = 0; - audio->stopped = 0; - - audpcm_in_flush(audio); - - client = msm_ion_client_create(UINT_MAX, "Audio_PCM_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", DMASZ); - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->data = ion_map_kernel(client, handle); - if (IS_ERR(audio->data)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - file->private_data = audio; - audio->opened = 1; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static long audpre_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0, enable; - uint16_t enable_mask; - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_ENABLE_AUDPRE: - - if (is_acdb_enabled()) { - MM_INFO("Audpp is supported via acdb\n"); - rc = -EFAULT; - break; - } - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - enable = (enable_mask & AGC_ENABLE) ? 1 : 0; - audio_enable_tx_agc(audio, enable); - enable = (enable_mask & NS_ENABLE) ? 1 : 0; - audio_enable_ns(audio, enable); - enable = (enable_mask & TX_IIR_ENABLE) ? 1 : 0; - audio_enable_iir(audio, enable); - break; - - case AUDIO_SET_AGC: - if (copy_from_user(&audio->tx_agc_cfg, (void *) arg, - sizeof(audio->tx_agc_cfg))) - rc = -EFAULT; - break; - - case AUDIO_SET_NS: - if (copy_from_user(&audio->ns_cfg, (void *) arg, - sizeof(audio->ns_cfg))) - rc = -EFAULT; - break; - - case AUDIO_SET_TX_IIR: - if (copy_from_user(&audio->iir_cfg, (void *) arg, - sizeof(audio->iir_cfg))) - rc = -EFAULT; - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&audio->lock); - return rc; -} - -static int audpre_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_in; - - file->private_data = audio; - - return 0; -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audpcm_in_open, - .release = audpcm_in_release, - .read = audpcm_in_read, - .write = audpcm_in_write, - .unlocked_ioctl = audpcm_in_ioctl, -}; - -static struct miscdevice audpcm_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_in", - .fops = &audio_fops, -}; - -static const struct file_operations audpre_fops = { - .owner = THIS_MODULE, - .open = audpre_open, - .unlocked_ioctl = audpre_ioctl, -}; - -static struct miscdevice audpre_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_preproc_ctl", - .fops = &audpre_fops, -}; - -static int __init audpcm_in_init(void) -{ - - mutex_init(&the_audio_in.lock); - mutex_init(&the_audio_in.read_lock); - spin_lock_init(&the_audio_in.dsp_lock); - init_waitqueue_head(&the_audio_in.wait); - return misc_register(&audpcm_in_misc) || misc_register(&audpre_misc); -} -device_initcall(audpcm_in_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_qcelp.c b/arch/arm/mach-msm/qdsp5/audio_qcelp.c deleted file mode 100644 index 50bde91752c2..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_qcelp.c +++ /dev/null @@ -1,1698 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_qcelp.c - * - * qcelp 13k audio decoder device - * - * Copyright (c) 2008-2009, 2011-2012 The Linux Foundation. All rights reserved. - * - * This code is based in part on audio_mp3.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -#define BUFSZ 1094 /* QCELP 13K Hold 600ms packet data = 36 * 30 and - 14 bytes of meta in */ -#define BUF_COUNT 2 -#define DMASZ (BUFSZ * BUF_COUNT) - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and - 24 bytes of meta out */ -#define PCM_BUF_MAX_COUNT 5 - -#define AUDDEC_DEC_QCELP 9 - -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDQCELP_METAFIELD_MASK 0xFFFF0000 -#define AUDQCELP_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDQCELP_EOS_FLG_MASK 0x01 -#define AUDQCELP_EOS_NONE 0x0 /* No EOS detected */ -#define AUDQCELP_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDQCELP_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audqcelp_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audqcelp_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[BUF_COUNT]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section - START */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* Host PCM section - END */ - - struct msm_adsp_module *audplay; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; /* set when non-tunnel mode */ - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int rmt_resource_released; - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audqcelp_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audqcelp_send_data(struct audio *audio, unsigned needed); -static void audqcelp_config_hostpcm(struct audio *audio); -static void audqcelp_buffer_refresh(struct audio *audio); -static void audqcelp_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audqcelp_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_QCELP; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_QCELP; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audqcelp_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for QCELP \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_13K; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audqcelp_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audqcelp_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audqcelp_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audqcelp_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audqcelp_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audqcelp_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audqcelp_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - if (audio->pcm_feedback) { - audqcelp_config_hostpcm(audio); - audqcelp_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audqcelp_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_qcelp = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_QCELP; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_v13k cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_V13K_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDQCELP_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audqcelp_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audqcelp_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - -static void audqcelp_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audqcelp_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audqcelp_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audqcelp_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audqcelp_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audqcelp_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audqcelp_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audqcelp_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audqcelp_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - - -static long audqcelp_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audqcelp_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audqcelp_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audqcelp_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audqcelp_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audqcelp_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audqcelp_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audqcelp_disable(audio); - audqcelp_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audqcelp_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user(&config, (void *)arg, - sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - MM_DBG("AUDIO_SET_CONFIG applicable \ - for metafield configuration\n"); - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = BUF_COUNT; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - - if (copy_from_user(&config, (void *)arg, - sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read buf\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x \ - kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audqcelp_fsync(struct file *file, loff_t a, loff_t b, - int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audqcelp_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d\n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - not know frame size, read count must be greater or equal - to size of PCM samples */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user(buf, - audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audqcelp_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audqcelp_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audqcelp_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audqcelp_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDQCELP_EOS_NONE; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDQCELP_EOS_FLG_OFFSET] & - AUDQCELP_EOS_FLG_MASK) { - MM_DBG("EOS SET\n"); - eos_condition = AUDQCELP_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDQCELP_EOS_FLG_OFFSET] &= - ~AUDQCELP_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = xfer + mfield_size; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - audqcelp_send_data(audio, 0); - } - if (eos_condition == AUDQCELP_EOS_SET) - rc = audqcelp_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audqcelp_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int) audio); - mutex_lock(&audio->lock); - audqcelp_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audqcelp_flush(audio); - audqcelp_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audqcelp_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audqcelp_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audqcelp_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audqcelp_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audqcelp_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audqcelp_suspend(struct early_suspend *h) -{ - struct audqcelp_suspend_ctl *ctl = - container_of(h, struct audqcelp_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audqcelp_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audqcelp_resume(struct early_suspend *h) -{ - struct audqcelp_suspend_ctl *ctl = - container_of(h, struct audqcelp_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audqcelp_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audqcelp_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audqcelp_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audqcelp_debug_fops = { - .read = audqcelp_debug_read, - .open = audqcelp_debug_open, -}; -#endif - -static int audqcelp_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audqcelp_event *e_node = NULL; - unsigned mem_sz = DMASZ; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_qcelp_" + 5]; -#endif - - /* Create audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_QCELP; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_QCELP_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_qcelp, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for QCELP session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - /* Initialize buffer */ - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - - audqcelp_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_qcelp_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audqcelp_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audqcelp_resume; - audio->suspend_ctl.node.suspend = audqcelp_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDQCELP_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audqcelp_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_qcelp_fops = { - .owner = THIS_MODULE, - .open = audqcelp_open, - .release = audqcelp_release, - .read = audqcelp_read, - .write = audqcelp_write, - .unlocked_ioctl = audqcelp_ioctl, - .fsync = audqcelp_fsync, -}; - -struct miscdevice audio_qcelp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp", - .fops = &audio_qcelp_fops, -}; - -static int __init audqcelp_init(void) -{ - return misc_register(&audio_qcelp_misc); -} - -static void __exit audqcelp_exit(void) -{ - misc_deregister(&audio_qcelp_misc); -} - -module_init(audqcelp_init); -module_exit(audqcelp_exit); - -MODULE_DESCRIPTION("MSM QCELP 13K driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/audio_qcelp_in.c b/arch/arm/mach-msm/qdsp5/audio_qcelp_in.c deleted file mode 100644 index cfda4b93e54c..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_qcelp_in.c +++ /dev/null @@ -1,1468 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_qcelp_in.c - * - * qcelp audio input device - * - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c, - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include "audmgr.h" - -#include -#include -#include -#include -#include -#include - -#define FRAME_HEADER_SIZE 8 /* 8 bytes frame header */ -#define NT_FRAME_HEADER_SIZE 24 /* 24 bytes frame header */ -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define QCELP_FRAME_SIZE 36 /* 36 bytes data */ -/*Tunnel mode : 36 bytes data + 8 byte header*/ -#define FRAME_SIZE (QCELP_FRAME_SIZE + FRAME_HEADER_SIZE) - /* 36 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (QCELP_FRAME_SIZE + NT_FRAME_HEADER_SIZE) -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define NT_DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM 2 -#define OUT_BUFFER_SIZE (4 * 1024 + NT_FRAME_HEADER_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -/* Offset from beginning of buffer*/ -#define AUDPREPROC_QCELP_EOS_FLG_OFFSET 0x0A -#define AUDPREPROC_QCELP_EOS_FLG_MASK 0x01 -#define AUDPREPROC_QCELP_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_QCELP_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_qcelp_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t enc_type; /* 11 for QCELP */ - uint32_t mode; /* T or NT Mode*/ - - struct msm_audio_qcelp_enc_config cfg; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - unsigned short samp_rate_index; - uint32_t audrec_obj_idx ; - - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - void *map_v_read; - void *map_v_write; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; - - struct audrec_session_info session_info; /*audrec session info*/ -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; -} __packed; - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __packed; - -struct qcelp_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audio_send_queue_pre(audio, cmd, len) \ - msm_adsp_write(audio->audpre, QDSP_uPAudPreProcCmdQueue, cmd, len) - -#define audio_send_queue_recbs(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) -#define audio_send_queue_rec(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -static int audqcelp_in_dsp_enable(struct audio_qcelp_in *audio, int enable); -static int audqcelp_in_encparam_config(struct audio_qcelp_in *audio); -static int audqcelp_in_encmem_config(struct audio_qcelp_in *audio); -static int audqcelp_in_dsp_read_buffer(struct audio_qcelp_in *audio, - uint32_t read_cnt); -static void audqcelp_in_flush(struct audio_qcelp_in *audio); - -static void audqcelp_in_get_dsp_frames(struct audio_qcelp_in *audio); -static int audpcm_config(struct audio_qcelp_in *audio); -static void audqcelp_out_flush(struct audio_qcelp_in *audio); -static int audqcelp_in_routing_mode_config(struct audio_qcelp_in *audio); -static void audrec_pcm_send_data(struct audio_qcelp_in *audio, unsigned needed); -static void audqcelp_nt_in_get_dsp_frames(struct audio_qcelp_in *audio); -static void audqcelp_in_flush(struct audio_qcelp_in *audio); - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -/* ------------------- dsp --------------------- */ -static void audpre_dsp_event(void *data, unsigned id, void *event_data) -{ - - uint16_t *msg = event_data; - - if (!msg) - return; - - switch (id) { - case AUDPREPROC_MSG_CMD_CFG_DONE_MSG: - MM_DBG("type %d, status_flag %d\n",\ - msg[0], msg[1]); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - - -/* must be called with audio->lock held */ -static int audqcelp_in_enable(struct audio_qcelp_in *audio) -{ - struct audmgr_config cfg; - int rc; - - if (audio->enabled) - return 0; - - cfg.tx_rate = audio->samp_rate; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - cfg.codec = RPC_AUD_DEF_CODEC_13K; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) - return rc; - - if (audpreproc_enable(audio->enc_id, - &audpre_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = - convert_samp_index(audio->samp_rate); - audpreproc_update_audrec_info(&audio->session_info); - } - if (msm_adsp_enable(audio->audrec)) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - } - MM_ERR("msm_adsp_enable(audrec) failed\n"); - return -ENODEV; - } - - audio->enabled = 1; - audqcelp_in_dsp_enable(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audqcelp_in_disable(struct audio_qcelp_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - - audqcelp_in_dsp_enable(audio, 0); - - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - audio->stopped = 1; - wake_up(&audio->wait); - msm_adsp_disable(audio->audrec); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audpreproc_disable(audio->enc_id, audio); - audmgr_disable(&audio->audmgr); - /*reset the sampling frequency information at - audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - } - } - return 0; -} - -static void audqcelp_in_get_dsp_frames(struct audio_qcelp_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - - sizeof(*frame)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audqcelp_in_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audqcelp_nt_in_get_dsp_frames(struct audio_qcelp_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - -static int audrec_pcm_buffer_ptr_refresh(struct audio_qcelp_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == NT_FRAME_HEADER_SIZE) - len = len / 2; - else - len = (len + NT_FRAME_HEADER_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_config(struct audio_qcelp_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = convert_samp_index(audio->samp_rate); - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - - -static int audqcelp_in_routing_mode_config(struct audio_qcelp_in *audio) -{ - struct audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ROUTING_MODE; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - cmd.routing_mode = 1; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_qcelp_in *audio = NULL; - - if (data) - audio = data; - else { - MM_ERR("invalid data for event %x\n", id); - return; - } - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - struct audrec_msg_cmd_cfg_done_msg cmd_cfg_done_msg; - getevent(&cmd_cfg_done_msg, AUDREC_MSG_CMD_CFG_DONE_MSG_LEN); - if (cmd_cfg_done_msg.audrec_enc_type & \ - AUDREC_MSG_CFG_DONE_ENC_ENA) { - audio->audrec_obj_idx = cmd_cfg_done_msg.audrec_obj_idx; - MM_DBG("CFG ENABLED\n"); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audqcelp_in_routing_mode_config(audio); - } else { - audqcelp_in_encmem_config(audio); - } - } else { - MM_DBG("CFG SLEEP\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG: { - struct audrec_msg_cmd_routing_mode_done_msg \ - routing_msg; - getevent(&routing_msg, AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG); - MM_DBG("AUDREC_MSG_CMD_ROUTING_MODE_DONE_MSG"); - if (routing_msg.configuration == 0) { - MM_ERR("routing configuration failed\n"); - audio->running = 0; - wake_up(&audio->wait_enable); - } else - audqcelp_in_encmem_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("AREC_MEM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audqcelp_in_encparam_config(audio); - else - audpcm_config(audio); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_DBG("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audqcelp_in_encparam_config(audio); - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_DBG("AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG\n"); - audio->running = 1; - wake_up(&audio->wait_enable); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audrec_pcm_send_data(audio, 1); - break; - } - case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: { - struct audrec_msg_no_ext_pkt_avail_msg err_msg; - getevent(&err_msg, AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG_LEN); - MM_DBG("NO_EXT_PKT_AVAILABLE_MSG %x\n",\ - err_msg.audrec_err_id); - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - struct audrec_msg_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt msw %d \ - write cnt lsw %d read cnt msw %d read cnt lsw %d \n",\ - pkt_ready_msg.pkt_counter_msw, \ - pkt_ready_msg.pkt_counter_lsw, \ - pkt_ready_msg.pkt_read_cnt_msw, \ - pkt_ready_msg.pkt_read_cnt_lsw); - - audqcelp_in_get_dsp_frames(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audqcelp_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -static struct msm_adsp_ops audrec_qcelp_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audqcelp_in_dsp_enable(struct audio_qcelp_in *audio, int enable) -{ - struct audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_ENC_CFG; - cmd.audrec_enc_type = (audio->enc_type & 0xFF) | - (enable ? AUDREC_CMD_ENC_ENA : AUDREC_CMD_ENC_DIS); - /* Don't care */ - cmd.audrec_obj_idx = audio->audrec_obj_idx; - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audqcelp_in_encmem_config(struct audio_qcelp_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - int header_len = 0; - - memset(&cmd, 0, sizeof(cmd)); - - cmd.cmd_id = AUDREC_CMD_ARECMEM_CFG; - cmd.audrec_obj_idx = audio->audrec_obj_idx; - /* Rate at which packet complete message comes */ - cmd.audrec_up_pkt_intm_cnt = 1; - cmd.audrec_extpkt_buffer_msw = audio->phys >> 16; - cmd.audrec_extpkt_buffer_lsw = audio->phys; - /* Max Buffer no available for frames */ - cmd.audrec_extpkt_buffer_num = FRAME_NUM; - - /* prepare buffer pointers: - * T:36 bytes qcelp packet + 4 halfword header - * NT:36 bytes qcelp packet + 12 halfword header - */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - header_len = FRAME_HEADER_SIZE/2; - else - header_len = NT_FRAME_HEADER_SIZE/2; - - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + header_len; - data += (QCELP_FRAME_SIZE/2) + header_len; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - header_len*2)); - } - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audqcelp_in_encparam_config(struct audio_qcelp_in *audio) -{ - struct audrec_cmd_arecparam_qcelp_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDREC_CMD_ARECPARAM_CFG; - cmd.common.audrec_obj_idx = audio->audrec_obj_idx; - cmd.enc_min_rate = audio->cfg.min_bit_rate; - cmd.enc_max_rate = audio->cfg.max_bit_rate; - cmd.rate_modulation_cmd = 0; /* Default set to 0 */ - cmd.reduced_rate_level = 0; /* Default set to 0 */ - - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audqcelp_flush_command(struct audio_qcelp_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audio_send_queue_rec(audio, &cmd, sizeof(cmd)); -} - -static int audqcelp_in_dsp_read_buffer(struct audio_qcelp_in *audio, - uint32_t read_cnt) -{ - audrec_cmd_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PACKET_EXT_PTR; - cmd.type = audio->audrec_obj_idx; - cmd.curr_rec_count_msw = read_cnt >> 16; - cmd.curr_rec_count_lsw = read_cnt; - - return audio_send_queue_recbs(audio, &cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ - -static void audqcelp_ioport_reset(struct audio_qcelp_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audqcelp_in_flush(audio); - mutex_unlock(&audio->read_lock); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audqcelp_out_flush(audio); - mutex_unlock(&audio->write_lock); -} - -static void audqcelp_in_flush(struct audio_qcelp_in *audio) -{ - int i; - unsigned long flags; - - audio->eos_ack = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = FRAME_NUM-1; i >= 0; i--) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audqcelp_out_flush(struct audio_qcelp_in *audio) -{ - int i; - unsigned long flags; - - audio->out_head = 0; - audio->out_count = 0; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out_tail = 0; - for (i = OUT_FRAME_NUM-1; i >= 0; i--) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static long audqcelp_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_qcelp_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - rc = audqcelp_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - rc = audqcelp_in_disable(audio); - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audqcelp_ioport_reset(audio); - if (audio->running) { - audqcelp_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - cfg.sample_rate = convert_samp_index(audio->samp_rate); - cfg.channel_count = 1; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (QCELP_FRAME_SIZE + 14)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG: { - if (copy_to_user((void *) arg, &audio->cfg, sizeof(audio->cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - MM_DBG("0X%8x, 0x%8x, 0x%8x\n", cfg.min_bit_rate, - cfg.max_bit_rate, cfg.cdma_rate); - if (cfg.min_bit_rate > CDMA_RATE_FULL || \ - cfg.min_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid min bitrate\n"); - rc = -EFAULT; - break; - } - if (cfg.max_bit_rate > CDMA_RATE_FULL || \ - cfg.max_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid max bitrate\n"); - rc = -EFAULT; - break; - } - /* Recording Does not support Erase and Blank */ - if (cfg.cdma_rate > CDMA_RATE_FULL || - cfg.cdma_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid qcelp cdma rate\n"); - rc = -EFAULT; - break; - } - memcpy(&audio->cfg, &cfg, sizeof(cfg)); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audqcelp_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_qcelp_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct qcelp_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG("count = %d\n", count); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct qcelp_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct qcelp_encoded_meta_out); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct qcelp_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct qcelp_encoded_meta_out); - count -= sizeof(struct qcelp_encoded_meta_out); - } - if (count >= size) { - /* order the reads on the buffer */ - dma_coherent_post_ops(); - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command \ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audqcelp_in_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audrec_pcm_send_data(struct audio_qcelp_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audrec_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static int audqcelp_in_fsync(struct file *file, loff_t a, loff_t b, - int datasync) - -{ - struct audio_qcelp_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - -int audrec_qcelp_process_eos(struct audio_qcelp_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audrec_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audqcelp_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_qcelp_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_QCELP_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = 0; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_QCELP_EOS_FLG_OFFSET] & - AUDPREPROC_QCELP_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_QCELP_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_QCELP_EOS_FLG_OFFSET] &= - ~AUDPREPROC_QCELP_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audrec_pcm_send_data(audio, 0); - else { - audrec_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_QCELP_EOS_SET) - rc = audrec_qcelp_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audqcelp_in_release(struct inode *inode, struct file *file) -{ - struct audio_qcelp_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audqcelp_in_disable(audio); - audqcelp_in_flush(audio); - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) && \ - (audio->out_data)) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->out_data = NULL; - } - - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -static struct audio_qcelp_in the_audio_qcelp_in; - -static int audqcelp_in_open(struct inode *inode, struct file *file) -{ - struct audio_qcelp_in *audio = &the_audio_qcelp_in; - int rc; - int encid; - int dma_size = 0; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - dma_size = NT_DMASZ; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - dma_size = DMASZ; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_8000, - audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_8000; - audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (QCELP_FRAME_SIZE + 14); - else - audio->buffer_size = QCELP_FRAME_SIZE; - audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_QCELP | audio->mode; - - audio->cfg.cdma_rate = CDMA_RATE_FULL; - audio->cfg.min_bit_rate = CDMA_RATE_FULL; - audio->cfg.max_bit_rate = CDMA_RATE_FULL; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - rc = audmgr_open(&audio->audmgr); - if (rc) - goto done; - } - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_qcelp_adsp_ops, audio); - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->dsp_cnt = 0; - audio->stopped = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audqcelp_in_flush(audio); - audqcelp_out_flush(audio); - - client = msm_ion_client_create(UINT_MAX, "Audio_QCELP_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", dma_size); - handle = ion_alloc(client, dma_size, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_read; - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_data = NULL; - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_get_phys_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->mfield = NT_FRAME_HEADER_SIZE; - audio->out_frame_cnt++; - } - file->private_data = audio; - audio->opened = 1; - -done: - mutex_unlock(&audio->lock); - return rc; -input_buff_map_error: -input_buff_get_flags_error: -input_buff_get_phys_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_qcelp_in_fops = { - .owner = THIS_MODULE, - .open = audqcelp_in_open, - .release = audqcelp_in_release, - .read = audqcelp_in_read, - .write = audqcelp_in_write, - .fsync = audqcelp_in_fsync, - .unlocked_ioctl = audqcelp_in_ioctl, -}; - -static struct miscdevice audqcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &audio_qcelp_in_fops, -}; - -static int __init audqcelp_in_init(void) -{ - mutex_init(&the_audio_qcelp_in.lock); - mutex_init(&the_audio_qcelp_in.read_lock); - spin_lock_init(&the_audio_qcelp_in.dsp_lock); - init_waitqueue_head(&the_audio_qcelp_in.wait); - init_waitqueue_head(&the_audio_qcelp_in.wait_enable); - mutex_init(&the_audio_qcelp_in.write_lock); - init_waitqueue_head(&the_audio_qcelp_in.write_wait); - return misc_register(&audqcelp_in_misc); -} -device_initcall(audqcelp_in_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_voice_lb.c b/arch/arm/mach-msm/qdsp5/audio_voice_lb.c deleted file mode 100644 index a73defd988f7..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_voice_lb.c +++ /dev/null @@ -1,369 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "audmgr_new.h" - -#define VOICELOOPBACK_PROG 0x300000B8 -#define VOICELOOP_VERS 0x00010001 - -#define VOICELOOPBACK_START_PROC 2 -#define VOICELOOPBACK_STOP_PROC 3 - -#define RPC_TYPE_REQUEST 0 -#define RPC_TYPE_REPLY 1 - -#define RPC_STATUS_FAILURE 0 -#define RPC_STATUS_SUCCESS 1 -#define RPC_STATUS_REJECT 1 - -#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2) -#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr)) -#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3) - -#define MAX_LEN 32 - -struct audio { - struct msm_rpc_endpoint *rpc_endpt; - uint32_t rpc_prog; - uint32_t rpc_ver; - uint32_t rpc_status; - struct audmgr audmgr; - - struct dentry *dentry; - - struct mutex lock; - - struct task_struct *task; - - wait_queue_head_t wait; - int enabled; - int thread_exit; -}; - -static struct audio the_audio; - -static int audio_voice_loopback_thread(void *data) -{ - struct audio *audio = data; - struct rpc_request_hdr *rpc_hdr = NULL; - int rpc_hdr_len; - - MM_DBG("\n"); - - while (!kthread_should_stop()) { - if (rpc_hdr != NULL) { - kfree(rpc_hdr); - rpc_hdr = NULL; - } - - if (audio->thread_exit) - break; - - rpc_hdr_len = msm_rpc_read(audio->rpc_endpt, - (void **) &rpc_hdr, - -1, - -1); - if (rpc_hdr_len < 0) { - MM_ERR("RPC read failed %d\n", rpc_hdr_len); - break; - } else if (rpc_hdr_len < RPC_COMMON_HDR_SZ) { - continue; - } else { - uint32_t rpc_type = be32_to_cpu(rpc_hdr->type); - if (rpc_type == RPC_TYPE_REPLY) { - struct rpc_reply_hdr *rpc_reply = - (void *) rpc_hdr; - uint32_t reply_status; - - reply_status = - be32_to_cpu(rpc_reply->reply_stat); - - if (reply_status == RPC_ACCEPTSTAT_SUCCESS) - audio->rpc_status = \ - RPC_STATUS_SUCCESS; - else { - audio->rpc_status = \ - RPC_STATUS_REJECT; - MM_ERR("RPC reply status denied\n"); - } - wake_up(&audio->wait); - } else { - MM_ERR("Unexpected RPC type %d\n", rpc_type); - } - } - } - kfree(rpc_hdr); - rpc_hdr = NULL; - - MM_DBG("Audio Voice Looopback thread stopped\n"); - - return 0; -} - -static int audio_voice_loopback_start(struct audio *audio) -{ - int rc = 0; - struct audmgr_config cfg; - struct rpc_request_hdr rpc_hdr; - - MM_DBG("\n"); - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_8000; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_8000; - cfg.def_method = RPC_AUD_DEF_METHOD_VOICE; - cfg.codec = RPC_AUD_DEF_CODEC_VOC_CDMA; - cfg.snd_method = RPC_SND_METHOD_VOICE; - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - MM_ERR("audmgr open failed, freeing instance\n"); - rc = -EINVAL; - goto done; - } - - memset(&rpc_hdr, 0, sizeof(rpc_hdr)); - - msm_rpc_setup_req(&rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - VOICELOOPBACK_START_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &rpc_hdr, - sizeof(rpc_hdr)); - if (rc >= 0) { - rc = wait_event_timeout(audio->wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - if (rc > 0) { - if (audio->rpc_status != RPC_STATUS_SUCCESS) { - MM_ERR("Start loopback failed %d\n", rc); - rc = -EBUSY; - } else { - rc = 0; - } - } else { - MM_ERR("Wait event for acquire failed %d\n", rc); - rc = -EBUSY; - } - } else { - audmgr_disable(&audio->audmgr); - MM_ERR("RPC write for start loopback failed %d\n", rc); - rc = -EBUSY; - } -done: - return rc; -} - -static int audio_voice_loopback_stop(struct audio *audio) -{ - int rc = 0; - struct rpc_request_hdr rpc_hdr; - - MM_DBG("\n"); - - memset(&rpc_hdr, 0, sizeof(rpc_hdr)); - - msm_rpc_setup_req(&rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - VOICELOOPBACK_STOP_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - audio->thread_exit = 1; - rc = msm_rpc_write(audio->rpc_endpt, - &rpc_hdr, - sizeof(rpc_hdr)); - if (rc >= 0) { - - rc = wait_event_timeout(audio->wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - if (rc > 0) { - MM_DBG("Wait event for release succeeded\n"); - rc = 0; - } else { - MM_ERR("Wait event for release failed %d\n", rc); - } - } else { - MM_ERR("RPC write for release failed %d\n", rc); - } - - audmgr_disable(&audio->audmgr); - - return rc; -} - -static int audio_voice_loopback_open(struct audio *audio_info) -{ - int rc = 0; - - MM_DBG("\n"); - - rc = audmgr_open(&audio_info->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance\n"); - rc = -EINVAL; - goto done; - } - - audio_info->rpc_endpt = msm_rpc_connect_compatible(VOICELOOPBACK_PROG, - VOICELOOP_VERS, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(audio_info->rpc_endpt)) { - MM_ERR("VOICE LOOPBACK RPC connect\ - failed ver 0x%x\n", - VOICELOOP_VERS); - rc = PTR_ERR(audio_info->rpc_endpt); - audio_info->rpc_endpt = NULL; - rc = -EINVAL; - } else { - MM_DBG("VOICE LOOPBACK connect succeeded ver 0x%x\n", - VOICELOOP_VERS); - audio_info->thread_exit = 0; - audio_info->task = kthread_run(audio_voice_loopback_thread, - audio_info, - "audio_voice_loopback"); - if (IS_ERR(audio_info->task)) { - MM_ERR("voice loopback thread create failed\n"); - rc = PTR_ERR(audio_info->task); - audio_info->task = NULL; - msm_rpc_close(audio_info->rpc_endpt); - audio_info->rpc_endpt = NULL; - rc = -EINVAL; - } - audio_info->rpc_prog = VOICELOOPBACK_PROG; - audio_info->rpc_ver = VOICELOOP_VERS; - } -done: - return rc; -} - -static int audio_voice_loopback_close(struct audio *audio_info) -{ - MM_DBG("\n"); - msm_rpc_close(audio_info->rpc_endpt); - audio_info->rpc_endpt = NULL; - audmgr_close(&audio_info->audmgr); - audio_info->task = NULL; - return 0; -} - -static ssize_t audio_voice_loopback_debug_write(struct file *file, - const char __user *buf, - size_t cnt, loff_t *ppos) -{ - char lbuf[MAX_LEN]; - int rc = 0; - - if (cnt > (MAX_LEN - 1)) - return -EINVAL; - - memset(&lbuf[0], 0, sizeof(lbuf)); - - rc = copy_from_user(lbuf, buf, cnt); - if (rc) { - MM_ERR("Unable to copy data from user space\n"); - return -EFAULT; - } - - lbuf[cnt] = '\0'; - - if (!strncmp(&lbuf[0], "1", cnt-1)) { - mutex_lock(&the_audio.lock); - if (!the_audio.enabled) { - rc = audio_voice_loopback_open(&the_audio); - if (!rc) { - rc = audio_voice_loopback_start(&the_audio); - if (rc < 0) { - the_audio.enabled = 0; - audio_voice_loopback_close(&the_audio); - } else { - the_audio.enabled = 1; - } - } - } - mutex_unlock(&the_audio.lock); - } else if (!strncmp(lbuf, "0", cnt-1)) { - mutex_lock(&the_audio.lock); - if (the_audio.enabled) { - audio_voice_loopback_stop(&the_audio); - audio_voice_loopback_close(&the_audio); - the_audio.enabled = 0; - } - mutex_unlock(&the_audio.lock); - } else { - rc = -EINVAL; - } - - if (rc == 0) { - rc = cnt; - } else { - MM_INFO("rc = %d\n", rc); - MM_INFO("\nWrong command: Use =>\n"); - MM_INFO("-------------------------\n"); - MM_INFO("To Start Loopback:: echo \"1\">/sys/kernel/debug/\ - voice_loopback\n"); - MM_INFO("To Stop Loopback:: echo \"0\">/sys/kernel/debug/\ - voice_loopback\n"); - MM_INFO("------------------------\n"); - } - - return rc; -} - -static ssize_t audio_voice_loopback_debug_open(struct inode *inode, - struct file *file) -{ - file->private_data = inode->i_private; - MM_DBG("Audio Voiceloop debugfs opened\n"); - return 0; -} - -static const struct file_operations voice_loopback_debug_fops = { - .write = audio_voice_loopback_debug_write, - .open = audio_voice_loopback_debug_open, -}; - -static int __init audio_init(void) -{ - int rc = 0; - memset(&the_audio, 0, sizeof(the_audio)); - - mutex_init(&the_audio.lock); - - init_waitqueue_head(&the_audio.wait); - - the_audio.dentry = debugfs_create_file("voice_loopback", - S_IFREG | S_IRUGO, - NULL, - NULL, &voice_loopback_debug_fops); - if (IS_ERR(the_audio.dentry)) - MM_ERR("debugfs_create_file failed\n"); - - return rc; -} -late_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_voicememo.c b/arch/arm/mach-msm/qdsp5/audio_voicememo.c deleted file mode 100644 index f7295b77e004..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_voicememo.c +++ /dev/null @@ -1,982 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audio_voicememo.c - * - * Voice Memo device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This code is based in part on arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "audmgr.h" - -#define SND_PROG_VERS "rs30000002:0x00020001" -#define SND_PROG 0x30000002 -#define SND_VERS_COMP 0x00020001 -#define SND_VERS2_COMP 0x00030001 - -#define SND_VOC_REC_START_PROC 19 -#define SND_VOC_REC_STOP_PROC 20 -#define SND_VOC_REC_PAUSE_PROC 21 -#define SND_VOC_REC_RESUME_PROC 22 -#define SND_VOC_REC_PUT_BUF_PROC 23 - -#define SND_VOC_REC_AV_SYNC_CB_PTR_PROC 9 -#define SND_VOC_REC_CB_FUNC_TYPE_PROC 10 - -#define REC_CLIENT_DATA 0x11223344 -#define DATA_CB_FUNC_ID 0x12345678 -#define AV_SYNC_CB_FUNC_ID 0x87654321 -#define CLIENT_DATA 0xaabbccdd - -#define RPC_TYPE_REQUEST 0 -#define RPC_TYPE_REPLY 1 - -#define RPC_STATUS_FAILURE 0 -#define RPC_STATUS_SUCCESS 1 - -#define RPC_VERSION 2 - -#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2) -#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr)) -#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3) -#define RPC_REPLY_SZ (sizeof(uint32_t) * 6) - -#define MAX_FRAME_SIZE 36 /* QCELP - 36, AMRNB - 32, EVRC - 24 */ -#define MAX_REC_BUF_COUNT 5 /* Maximum supported voc rec buffers */ -#define MAX_REC_BUF_SIZE (MAX_FRAME_SIZE * 10) -#define MAX_VOICEMEMO_BUF_SIZE \ - ((MAX_REC_BUF_SIZE)*MAX_REC_BUF_COUNT) /* 5 buffers for 200ms frame */ -#define MSM_AUD_BUFFER_UPDATE_WAIT_MS 2000 - -enum rpc_voc_rec_status_type { - RPC_VOC_REC_STAT_SUCCESS = 1, - RPC_VOC_REC_STAT_DONE = 2, - RPC_VOC_REC_STAT_AUTO_STOP = 4, - RPC_VOC_REC_STAT_PAUSED = 8, - RPC_VOC_REC_STAT_RESUMED = 16, - RPC_VOC_REC_STAT_ERROR = 32, - RPC_VOC_REC_STAT_BUFFER_ERROR = 64, - RPC_VOC_REC_STAT_INVALID_PARAM = 128, - RPC_VOC_REC_STAT_INT_TIME = 256, - RPC_VOC_REC_STAT_DATA = 512, - RPC_VOC_REC_STAT_NOT_READY = 1024, - RPC_VOC_REC_STAT_INFORM_EVRC = 2048, - RPC_VOC_REC_STAT_INFORM_13K = 4096, - RPC_VOC_REC_STAT_INFORM_AMR = 8192, - RPC_VOC_REC_STAT_INFORM_MAX = 65535 -}; - -struct rpc_snd_voc_rec_start_args { - uint32_t param_status; /* 1 = valid, 0 = not valid */ - uint32_t rec_type; - uint32_t rec_interval_ms; - uint32_t auto_stop_ms; - uint32_t capability; - uint32_t max_rate; - uint32_t min_rate; - uint32_t frame_format; - uint32_t dtx_enable; - uint32_t data_req_ms; - uint32_t rec_client_data; - - uint32_t cb_func_id; - uint32_t sync_cb_func_id; - uint32_t client_data; -}; - -struct rpc_snd_voc_rec_put_buf_args { - uint32_t buf; - uint32_t num_bytes; -}; - -struct snd_voc_rec_start_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_voc_rec_start_args args; -}; - -struct snd_voc_rec_put_buf_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_voc_rec_put_buf_args args; -}; - -struct snd_voc_rec_av_sync_cb_func_data { - uint32_t sync_cb_func_id; - uint32_t status; /* Pointer status (1 = valid, 0 = invalid) */ - uint32_t num_samples; - uint32_t time_stamp[2]; - uint32_t lost_samples; - uint32_t frame_index; - uint32_t client_data; -}; - -struct snd_voc_rec_cb_func_fw_data { - uint32_t fw_ptr_status; /* FW Pointer status (1=valid,0=invalid) */ - uint32_t rec_buffer_size; - uint32_t data[MAX_REC_BUF_SIZE/4]; - uint32_t rec_buffer_size_copy; - uint32_t rec_num_frames; /* Number of voice frames */ - uint32_t rec_length; /* Valid data in record buffer = - * data_req_ms amount of data */ - uint32_t client_data; /* A11 rec buffer pointer */ - uint32_t rw_ptr_status; /* RW Pointer status (1=valid,0=invalid) */ -}; - -struct snd_voc_rec_cb_func_rw_data { - uint32_t fw_ptr_status; /* FW Pointer status (1=valid,0=invalid) */ - uint32_t rw_ptr_status; /* RW Pointer status (1=valid,0=invalid) */ - uint32_t rec_buffer_size; - uint32_t data[MAX_REC_BUF_SIZE/4]; - uint32_t rec_buffer_size_copy; - uint32_t rec_num_frames; /* Number of voice frames */ - uint32_t rec_length; /* Valid data in record buffer = - * data_req_ms amount of data */ - uint32_t client_data; /* A11 rec buffer pointer */ -}; - -struct snd_voc_rec_data_cb_func_data { - uint32_t cb_func_id; - uint32_t status; /* Pointer status (1 = valid, 0 = invalid) */ - uint32_t rec_status; - - union { - struct snd_voc_rec_cb_func_fw_data fw_data; - struct snd_voc_rec_cb_func_rw_data rw_data; - } pkt; -}; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Usage actual recorded data */ - unsigned addr; - unsigned numframes; -}; - -struct audio_voicememo { - uint32_t byte_count; /* Pass statistics to user space for - * time stamping */ - uint32_t frame_count; - - int opened; - int enabled; - int running; - int stopped; - int pause_resume; - - uint32_t rpc_prog; - uint32_t rpc_ver; - uint32_t rpc_xid; - uint32_t rpc_status; - - struct mutex lock; - struct mutex read_lock; - struct mutex dsp_lock; - wait_queue_head_t read_wait; - wait_queue_head_t wait; - - struct buffer in[MAX_REC_BUF_COUNT]; - char *rec_buf_ptr; - dma_addr_t phys; - uint32_t rec_buf_size; - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that should be filled as - * data comes from A9 */ - - struct audmgr audmgr; - - struct msm_audio_voicememo_config voicememo_cfg; - - struct msm_rpc_endpoint *sndept; - struct task_struct *task; -}; - -static struct audio_voicememo the_audio_voicememo; - -static int audvoicememo_validate_usr_config( - struct msm_audio_voicememo_config *config) -{ - int rc = -1; /* error */ - - if (config->rec_type != RPC_VOC_REC_FORWARD && - config->rec_type != RPC_VOC_REC_REVERSE && - config->rec_type != RPC_VOC_REC_BOTH) - goto done; - - /* QCELP, EVRC, AMR-NB only */ - if (config->capability != RPC_VOC_CAP_IS733 && - config->capability != RPC_VOC_CAP_IS127 && - config->capability != RPC_VOC_CAP_AMR) - goto done; - - /* QCP, AMR format supported */ - if ((config->frame_format != RPC_VOC_PB_NATIVE_QCP) && - (config->frame_format != RPC_VOC_PB_AMR)) - goto done; - - if ((config->frame_format == RPC_VOC_PB_AMR) && - (config->capability != RPC_VOC_CAP_AMR)) - goto done; - - /* To make sure, max kernel buf size matches - * with max data request time */ - if (config->data_req_ms > ((MAX_REC_BUF_SIZE/MAX_FRAME_SIZE)*20)) - goto done; - - rc = 0; -done: - return rc; -} - -static void audvoicememo_flush_buf(struct audio_voicememo *audio) -{ - uint8_t index; - - for (index = 0; index < MAX_REC_BUF_COUNT; index++) - audio->in[index].used = 0; - - audio->read_next = 0; - mutex_lock(&audio->dsp_lock); - audio->fill_next = 0; - mutex_unlock(&audio->dsp_lock); -} - -static void audvoicememo_ioport_reset(struct audio_voicememo *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audvoicememo_flush_buf(audio); - mutex_unlock(&audio->read_lock); -} - -/* must be called with audio->lock held */ -static int audvoicememo_enable(struct audio_voicememo *audio) -{ - struct audmgr_config cfg; - struct snd_voc_rec_put_buf_msg bmsg; - struct snd_voc_rec_start_msg msg; - uint8_t index; - uint32_t offset = 0; - int rc; - - if (audio->enabled) - return 0; - - /* Codec / method configure to audmgr client */ - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_8000; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.def_method = RPC_AUD_DEF_METHOD_RECORD; - - if (audio->voicememo_cfg.capability == RPC_VOC_CAP_IS733) - cfg.codec = RPC_AUD_DEF_CODEC_VOC_13K; - else if (audio->voicememo_cfg.capability == RPC_VOC_CAP_IS127) - cfg.codec = RPC_AUD_DEF_CODEC_VOC_EVRC; - else - cfg.codec = RPC_AUD_DEF_CODEC_VOC_AMR; /* RPC_VOC_CAP_AMR */ - - cfg.snd_method = RPC_SND_METHOD_VOICE; - rc = audmgr_enable(&audio->audmgr, &cfg); - - if (rc < 0) - return rc; - - /* Configure VOC Rec buffer */ - for (index = 0; index < MAX_REC_BUF_COUNT; index++) { - audio->in[index].data = audio->rec_buf_ptr + offset; - audio->in[index].addr = audio->phys + offset; - audio->in[index].size = audio->rec_buf_size; - audio->in[index].used = 0; - audio->in[index].numframes = 0; - offset += audio->rec_buf_size; - bmsg.args.buf = (uint32_t) audio->in[index].data; - bmsg.args.num_bytes = cpu_to_be32(audio->in[index].size); - MM_DBG("rec_buf_ptr=0x%8x, rec_buf_size = 0x%8x\n", - bmsg.args.buf, bmsg.args.num_bytes); - - msm_rpc_setup_req(&bmsg.hdr, audio->rpc_prog, audio->rpc_ver, - SND_VOC_REC_PUT_BUF_PROC); - audio->rpc_xid = bmsg.hdr.xid; - audio->rpc_status = RPC_STATUS_FAILURE; - msm_rpc_write(audio->sndept, &bmsg, sizeof(bmsg)); - rc = wait_event_timeout(audio->wait, - audio->rpc_status != RPC_STATUS_FAILURE, 1 * HZ); - if (rc == 0) - goto err; - } - - - /* Start Recording */ - msg.args.param_status = cpu_to_be32(0x00000001); - msg.args.rec_type = cpu_to_be32(audio->voicememo_cfg.rec_type); - msg.args.rec_interval_ms = - cpu_to_be32(audio->voicememo_cfg.rec_interval_ms); - msg.args.auto_stop_ms = cpu_to_be32(audio->voicememo_cfg.auto_stop_ms); - msg.args.capability = cpu_to_be32(audio->voicememo_cfg.capability); - msg.args.max_rate = cpu_to_be32(audio->voicememo_cfg.max_rate); - msg.args.min_rate = cpu_to_be32(audio->voicememo_cfg.min_rate); - msg.args.frame_format = cpu_to_be32(audio->voicememo_cfg.frame_format); - msg.args.dtx_enable = cpu_to_be32(audio->voicememo_cfg.dtx_enable); - msg.args.data_req_ms = cpu_to_be32(audio->voicememo_cfg.data_req_ms); - msg.args.rec_client_data = cpu_to_be32(REC_CLIENT_DATA); - msg.args.cb_func_id = cpu_to_be32(DATA_CB_FUNC_ID); - msg.args.sync_cb_func_id = cpu_to_be32(AV_SYNC_CB_FUNC_ID); - msg.args.client_data = cpu_to_be32(CLIENT_DATA); - - msm_rpc_setup_req(&msg.hdr, audio->rpc_prog, audio->rpc_ver, - SND_VOC_REC_START_PROC); - - audio->rpc_xid = msg.hdr.xid; - audio->rpc_status = RPC_STATUS_FAILURE; - msm_rpc_write(audio->sndept, &msg, sizeof(msg)); - rc = wait_event_timeout(audio->wait, - audio->rpc_status != RPC_STATUS_FAILURE, 1 * HZ); - if (rc == 0) - goto err; - - audio->rpc_xid = 0; - audio->enabled = 1; - return 0; - -err: - audio->rpc_xid = 0; - audmgr_disable(&audio->audmgr); - MM_ERR("Fail\n"); - return -1; -} - -/* must be called with audio->lock held */ -static int audvoicememo_disable(struct audio_voicememo *audio) -{ - struct rpc_request_hdr rhdr; - int rc = 0; - if (audio->enabled) { - msm_rpc_setup_req(&rhdr, audio->rpc_prog, audio->rpc_ver, - SND_VOC_REC_STOP_PROC); - rc = msm_rpc_write(audio->sndept, &rhdr, sizeof(rhdr)); - rc = wait_event_timeout(audio->wait, audio->stopped == 1, - 1 * HZ); - if (rc == 0) - audio->stopped = 1; - wake_up(&audio->read_wait); - audmgr_disable(&audio->audmgr); - audio->enabled = 0; - } - return 0; -} - -/* RPC Reply Generator */ -static void rpc_reply(struct msm_rpc_endpoint *ept, uint32_t xid) -{ - int rc = 0; - uint8_t reply_buf[sizeof(struct rpc_reply_hdr)]; - struct rpc_reply_hdr *reply = (struct rpc_reply_hdr *)reply_buf; - - MM_DBG("inside\n"); - reply->xid = cpu_to_be32(xid); - reply->type = cpu_to_be32(RPC_TYPE_REPLY); /* reply */ - reply->reply_stat = cpu_to_be32(RPCMSG_REPLYSTAT_ACCEPTED); - - reply->data.acc_hdr.accept_stat = cpu_to_be32(RPC_ACCEPTSTAT_SUCCESS); - reply->data.acc_hdr.verf_flavor = 0; - reply->data.acc_hdr.verf_length = 0; - - rc = msm_rpc_write(ept, reply_buf, sizeof(reply_buf)); - if (rc < 0) - MM_ERR("could not write RPC response: %d\n", rc); -} - -static void process_rpc_request(uint32_t proc, uint32_t xid, - void *data, int len, void *private) -{ - struct audio_voicememo *audio = private; - - MM_DBG("inside\n"); - /* Sending Ack before processing the request - * to make sure A9 get response immediate - * However, if there is validation of request planned - * may be move this reply Ack at the end */ - rpc_reply(audio->sndept, xid); - switch (proc) { - case SND_VOC_REC_AV_SYNC_CB_PTR_PROC: { - MM_DBG("AV Sync CB:func_id=0x%8x,status=0x%x\n", - be32_to_cpu(( \ - (struct snd_voc_rec_av_sync_cb_func_data *)\ - data)->sync_cb_func_id),\ - be32_to_cpu(( \ - (struct snd_voc_rec_av_sync_cb_func_data *)\ - data)->status)); - break; - } - case SND_VOC_REC_CB_FUNC_TYPE_PROC: { - struct snd_voc_rec_data_cb_func_data *datacb_data - = (void *)(data); - struct snd_voc_rec_put_buf_msg bmsg; - uint32_t rec_status = be32_to_cpu(datacb_data->rec_status); - - MM_DBG("Data CB:func_id=0x%8x,status=0x%x,\ - rec_status=0x%x\n", - be32_to_cpu(datacb_data->cb_func_id),\ - be32_to_cpu(datacb_data->status),\ - be32_to_cpu(datacb_data->rec_status)); - - /* Data recorded */ - if ((rec_status == RPC_VOC_REC_STAT_DATA) || - (rec_status == RPC_VOC_REC_STAT_DONE)) { - if (datacb_data->pkt.fw_data.fw_ptr_status && - be32_to_cpu(datacb_data->pkt.fw_data.rec_length) && - be32_to_cpu(datacb_data->pkt.fw_data.rec_length) - <= MAX_REC_BUF_SIZE) { - - MM_DBG("Copy FW link:rec_buf_size \ - = 0x%08x, rec_length=0x%08x\n", - be32_to_cpu( \ - datacb_data->pkt.fw_data. \ - rec_buffer_size_copy),\ - be32_to_cpu(datacb_data->pkt.fw_data. \ - rec_length)); - - mutex_lock(&audio->dsp_lock); - memcpy(audio->in[audio->fill_next].data, \ - &(datacb_data->pkt.fw_data.data[0]), \ - be32_to_cpu( - datacb_data->pkt.fw_data.rec_length)); - audio->in[audio->fill_next].used = - be32_to_cpu( - datacb_data->pkt.fw_data.rec_length); - audio->in[audio->fill_next].numframes = - be32_to_cpu( - datacb_data->pkt.fw_data.rec_num_frames); - mutex_unlock(&audio->dsp_lock); - } else if (datacb_data->pkt.rw_data.rw_ptr_status && - be32_to_cpu(datacb_data->pkt.rw_data.rec_length) && - be32_to_cpu(datacb_data->pkt.rw_data.rec_length) - <= MAX_REC_BUF_SIZE) { - - MM_DBG("Copy RW link:rec_buf_size \ - =0x%08x, rec_length=0x%08x\n", - be32_to_cpu( \ - datacb_data->pkt.rw_data. \ - rec_buffer_size_copy),\ - be32_to_cpu(datacb_data->pkt.rw_data. \ - rec_length)); - - mutex_lock(&audio->dsp_lock); - memcpy(audio->in[audio->fill_next].data, \ - &(datacb_data->pkt.rw_data.data[0]), \ - be32_to_cpu( - datacb_data->pkt.rw_data.rec_length)); - audio->in[audio->fill_next].used = - be32_to_cpu( - datacb_data->pkt.rw_data.rec_length); - audio->in[audio->fill_next].numframes = - be32_to_cpu( - datacb_data->pkt.rw_data.rec_num_frames); - mutex_unlock(&audio->dsp_lock); - } else { - MM_ERR("FW: ptr_status %d, rec_length=0x%08x," - "RW: ptr_status %d, rec_length=0x%08x\n", - datacb_data->pkt.fw_data.fw_ptr_status, \ - be32_to_cpu( \ - datacb_data->pkt.fw_data.rec_length), \ - datacb_data->pkt.rw_data.rw_ptr_status, \ - be32_to_cpu( \ - datacb_data->pkt.rw_data.rec_length)); - } - if (rec_status != RPC_VOC_REC_STAT_DONE) { - /* Not end of record */ - bmsg.args.buf = \ - (uint32_t) audio->in[audio->fill_next].data; - bmsg.args.num_bytes = \ - be32_to_cpu(audio->in[audio->fill_next].size); - - if (++audio->fill_next == MAX_REC_BUF_COUNT) - audio->fill_next = 0; - - msm_rpc_setup_req(&bmsg.hdr, audio->rpc_prog, - audio->rpc_ver, SND_VOC_REC_PUT_BUF_PROC); - - msm_rpc_write(audio->sndept, &bmsg, - sizeof(bmsg)); - - wake_up(&audio->read_wait); - } else { - /* Indication record stopped gracefully */ - MM_DBG("End Of Voice Record\n"); - audio->stopped = 1; - wake_up(&audio->wait); - } - } else if (rec_status == RPC_VOC_REC_STAT_PAUSED) { - MM_DBG(" Voice Record PAUSED\n"); - audio->pause_resume = 1; - } else if (rec_status == RPC_VOC_REC_STAT_RESUMED) { - MM_DBG(" Voice Record RESUMED\n"); - audio->pause_resume = 0; - } else if ((rec_status == RPC_VOC_REC_STAT_ERROR) || - (rec_status == RPC_VOC_REC_STAT_INVALID_PARAM) || - (rec_status == RPC_VOC_REC_STAT_BUFFER_ERROR)) - MM_ERR("error recording =0x%8x\n", - rec_status); - else if (rec_status == RPC_VOC_REC_STAT_INT_TIME) - MM_DBG("Frames recorded matches interval \ - callback time\n"); - else if (rec_status == RPC_VOC_REC_STAT_AUTO_STOP) { - MM_DBG(" Voice Record AUTO STOP\n"); - mutex_lock(&audio->lock); - audio->stopped = 1; - wake_up(&audio->read_wait); - audmgr_disable(&audio->audmgr); - audvoicememo_ioport_reset(audio); - audio->stopped = 0; - audio->enabled = 0; - mutex_unlock(&audio->lock); - } - break; - } - default: - MM_ERR("UNKNOWN PROC , proc = 0x%8x \n", proc); - } -} - -static int voicememo_rpc_thread(void *data) -{ - struct audio_voicememo *audio = data; - struct rpc_request_hdr *hdr = NULL; - uint32_t type; - int len; - - MM_DBG("start\n"); - - while (!kthread_should_stop()) { - kfree(hdr); - hdr = NULL; - - len = msm_rpc_read(audio->sndept, (void **) &hdr, -1, -1); - MM_DBG("rpc_read len = 0x%x\n", len); - if (len < 0) { - MM_ERR("rpc read failed (%d)\n", len); - break; - } - if (len < RPC_COMMON_HDR_SZ) - continue; - type = be32_to_cpu(hdr->type); - if (type == RPC_TYPE_REPLY) { - struct rpc_reply_hdr *rep = (void *) hdr; - uint32_t status; - if (len < RPC_REPLY_HDR_SZ) - continue; - status = be32_to_cpu(rep->reply_stat); - if (status == RPCMSG_REPLYSTAT_ACCEPTED) { - status = - be32_to_cpu(rep->data.acc_hdr.accept_stat); - - /* Confirm major RPC success during open*/ - if ((audio->enabled == 0) && - (status == RPC_ACCEPTSTAT_SUCCESS) && - (audio->rpc_xid == rep->xid)) { - audio->rpc_status = \ - RPC_STATUS_SUCCESS; - wake_up(&audio->wait); - } - MM_DBG("rpc_reply status 0x%8x\n", status); - } else { - MM_ERR("rpc_reply denied!\n"); - } - /* process reply */ - continue; - } else if (type == RPC_TYPE_REQUEST) { - if (len < RPC_REQUEST_HDR_SZ) - continue; - process_rpc_request(be32_to_cpu(hdr->procedure), - be32_to_cpu(hdr->xid), - (void *) (hdr + 1), - len - sizeof(*hdr), - audio); - } else - MM_ERR("Unexpected type (%d)\n", type); - } - MM_DBG("stop\n"); - kfree(hdr); - hdr = NULL; - - return 0; -} - -/* ------------------- device --------------------- */ -static long audio_voicememo_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_voicememo *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - mutex_lock(&audio->dsp_lock); - stats.byte_count = audio->byte_count; - stats.sample_count = audio->frame_count; - mutex_unlock(&audio->dsp_lock); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - MM_DBG("AUDIO_START\n"); - audio->byte_count = 0; - audio->frame_count = 0; - if (audio->voicememo_cfg.rec_type != RPC_VOC_REC_NONE) - rc = audvoicememo_enable(audio); - else - rc = -EINVAL; - MM_DBG("AUDIO_START rc %d\n", rc); - break; - } - case AUDIO_STOP: { - MM_DBG("AUDIO_STOP\n"); - rc = audvoicememo_disable(audio); - audvoicememo_ioport_reset(audio); - audio->stopped = 0; - MM_DBG("AUDIO_STOP rc %d\n", rc); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - MM_DBG("AUDIO_GET_CONFIG\n"); - cfg.buffer_size = audio->rec_buf_size; - cfg.buffer_count = MAX_REC_BUF_COUNT; - cfg.sample_rate = 8000; /* Voice Encoder works on 8k, - * Mono */ - cfg.channel_count = 1; - cfg.type = 0; - cfg.unused[0] = 0; - cfg.unused[1] = 0; - cfg.unused[2] = 0; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - else - rc = 0; - MM_DBG("AUDIO_GET_CONFIG rc %d\n", rc); - break; - } - case AUDIO_GET_VOICEMEMO_CONFIG: { - MM_DBG("AUDIO_GET_VOICEMEMO_CONFIG\n"); - if (copy_to_user((void *)arg, &audio->voicememo_cfg, - sizeof(audio->voicememo_cfg))) - rc = -EFAULT; - else - rc = 0; - MM_DBG("AUDIO_GET_VOICEMEMO_CONFIG rc %d\n", rc); - break; - } - case AUDIO_SET_VOICEMEMO_CONFIG: { - struct msm_audio_voicememo_config usr_config; - MM_DBG("AUDIO_SET_VOICEMEMO_CONFIG\n"); - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - if (audvoicememo_validate_usr_config(&usr_config) - == 0) { - audio->voicememo_cfg = usr_config; - rc = 0; - } else - rc = -EINVAL; - MM_DBG("AUDIO_SET_VOICEMEMO_CONFIG rc %d\n", rc); - break; - } - case AUDIO_PAUSE: { - struct rpc_request_hdr rhdr; - MM_DBG("AUDIO_PAUSE\n"); - if (arg == 1) - msm_rpc_setup_req(&rhdr, audio->rpc_prog, - audio->rpc_ver, SND_VOC_REC_PAUSE_PROC); - else - msm_rpc_setup_req(&rhdr, audio->rpc_prog, - audio->rpc_ver, SND_VOC_REC_RESUME_PROC); - - rc = msm_rpc_write(audio->sndept, &rhdr, sizeof(rhdr)); - MM_DBG("AUDIO_PAUSE exit %d\n", rc); - break; - } - default: - MM_ERR("IOCTL %d not supported\n", cmd); - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audio_voicememo_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_voicememo *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - mutex_lock(&audio->read_lock); - - MM_DBG("buff read =0x%8x \n", count); - - while (count > 0) { - rc = wait_event_interruptible_timeout(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped), - msecs_to_jiffies(MSM_AUD_BUFFER_UPDATE_WAIT_MS)); - - if (rc == 0) { - rc = -ETIMEDOUT; - break; - } else if (rc < 0) - break; - - if (audio->stopped) { - rc = -EBUSY; - break; - } - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not split frames, read count must be greater or - * equal to size of existing frames to copy - */ - MM_DBG("read not in frame boundary\n"); - break; - } else { - mutex_lock(&audio->dsp_lock); - dma_coherent_post_ops(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - mutex_unlock(&audio->dsp_lock); - break; - } - count -= audio->in[audio->read_next].used; - audio->byte_count += audio->in[audio->read_next].used; - audio->frame_count += - audio->in[audio->read_next].numframes; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - mutex_unlock(&audio->dsp_lock); - if ((++audio->read_next) == MAX_REC_BUF_COUNT) - audio->read_next = 0; - if (audio->in[audio->read_next].used == 0) - break; /* No data ready at this moment - * Exit while loop to prevent - * output thread sleep too long - */ - } - } - mutex_unlock(&audio->read_lock); - if (buf > start) - rc = buf - start; - MM_DBG("exit return =0x%8x\n", rc); - return rc; -} - -static ssize_t audio_voicememo_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int audio_voicememo_release(struct inode *inode, struct file *file) -{ - struct audio_voicememo *audio = file->private_data; - - mutex_lock(&audio->lock); - audvoicememo_disable(audio); - audvoicememo_flush_buf(audio); - audio->opened = 0; - mutex_unlock(&audio->lock); - return 0; -} - -static int audio_voicememo_open(struct inode *inode, struct file *file) -{ - struct audio_voicememo *audio = &the_audio_voicememo; - int rc; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - rc = audmgr_open(&audio->audmgr); - - if (rc) - goto done; - - /*Set default param to None*/ - memset(&audio->voicememo_cfg, 0, sizeof(audio->voicememo_cfg)); - - file->private_data = audio; - audio->opened = 1; - audio->stopped = 0; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audio_voicememo_open, - .release = audio_voicememo_release, - .read = audio_voicememo_read, - .write = audio_voicememo_write, - .unlocked_ioctl = audio_voicememo_ioctl, -}; - -struct miscdevice audio_voicememo_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_voicememo", - .fops = &audio_fops, -}; - -static int audio_voicememo_probe(struct platform_device *pdev) -{ - int rc; - - if ((pdev->id != (SND_VERS_COMP & RPC_VERSION_MAJOR_MASK)) && - (pdev->id != (SND_VERS2_COMP & RPC_VERSION_MAJOR_MASK))) - return -EINVAL; - - mutex_init(&the_audio_voicememo.lock); - mutex_init(&the_audio_voicememo.read_lock); - mutex_init(&the_audio_voicememo.dsp_lock); - init_waitqueue_head(&the_audio_voicememo.read_wait); - init_waitqueue_head(&the_audio_voicememo.wait); - - the_audio_voicememo.rec_buf_ptr = dma_alloc_coherent(NULL, - MAX_VOICEMEMO_BUF_SIZE, - &the_audio_voicememo.phys, GFP_KERNEL); - if (the_audio_voicememo.rec_buf_ptr == NULL) { - MM_ERR("error allocating memory\n"); - rc = -ENOMEM; - return rc; - } - the_audio_voicememo.rec_buf_size = MAX_REC_BUF_SIZE; - MM_DBG("rec_buf_ptr = 0x%8x, phys = 0x%8x \n", - (uint32_t) the_audio_voicememo.rec_buf_ptr, \ - the_audio_voicememo.phys); - - the_audio_voicememo.sndept = msm_rpc_connect_compatible(SND_PROG, - SND_VERS_COMP, MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(the_audio_voicememo.sndept)) { - MM_DBG("connect failed with VERS \ - = %x, trying again with another API\n", - SND_VERS_COMP); - the_audio_voicememo.sndept = msm_rpc_connect_compatible( - SND_PROG, SND_VERS2_COMP, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(the_audio_voicememo.sndept)) { - rc = PTR_ERR(the_audio_voicememo.sndept); - the_audio_voicememo.sndept = NULL; - MM_ERR("Failed to connect to snd svc\n"); - goto err; - } - the_audio_voicememo.rpc_ver = SND_VERS2_COMP; - } else - the_audio_voicememo.rpc_ver = SND_VERS_COMP; - - the_audio_voicememo.task = kthread_run(voicememo_rpc_thread, - &the_audio_voicememo, "voicememo_rpc"); - if (IS_ERR(the_audio_voicememo.task)) { - rc = PTR_ERR(the_audio_voicememo.task); - the_audio_voicememo.task = NULL; - msm_rpc_close(the_audio_voicememo.sndept); - the_audio_voicememo.sndept = NULL; - MM_ERR("Failed to create voicememo_rpc task\n"); - goto err; - } - the_audio_voicememo.rpc_prog = SND_PROG; - - return misc_register(&audio_voicememo_misc); -err: - dma_free_coherent(NULL, MAX_VOICEMEMO_BUF_SIZE, - the_audio_voicememo.rec_buf_ptr, - the_audio_voicememo.phys); - the_audio_voicememo.rec_buf_ptr = NULL; - return rc; -} - -static void __exit audio_voicememo_exit(void) -{ - /* Close the RPC connection to make thread to comeout */ - msm_rpc_close(the_audio_voicememo.sndept); - the_audio_voicememo.sndept = NULL; - kthread_stop(the_audio_voicememo.task); - the_audio_voicememo.task = NULL; - if (the_audio_voicememo.rec_buf_ptr) - dma_free_coherent(NULL, MAX_VOICEMEMO_BUF_SIZE, - the_audio_voicememo.rec_buf_ptr, - the_audio_voicememo.phys); - the_audio_voicememo.rec_buf_ptr = NULL; - misc_deregister(&audio_voicememo_misc); -} - -static char audio_voicememo_rpc_name[] = "rs00000000"; - -static struct platform_driver audio_voicememo_driver = { - .probe = audio_voicememo_probe, - .driver = { - .owner = THIS_MODULE, - }, - }; - -static int __init audio_voicememo_init(void) -{ - snprintf(audio_voicememo_rpc_name, sizeof(audio_voicememo_rpc_name), - "rs%08x", SND_PROG); - audio_voicememo_driver.driver.name = audio_voicememo_rpc_name; - return platform_driver_register(&audio_voicememo_driver); -} - -module_init(audio_voicememo_init); -module_exit(audio_voicememo_exit); - -MODULE_DESCRIPTION("MSM Voice Memo driver"); -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("QUALCOMM"); diff --git a/arch/arm/mach-msm/qdsp5/audio_wma.c b/arch/arm/mach-msm/qdsp5/audio_wma.c deleted file mode 100644 index 839739f6102f..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_wma.c +++ /dev/null @@ -1,1851 +0,0 @@ -/* audio_wma.c - wma audio decoder driver - * - * Copyright (c) 2009, 2011-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* Size must be power of 2 */ -#define BUFSZ_MAX 2062 /* Includes meta in size */ -#define BUFSZ_MIN 1038 /* Includes meta in size */ -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_WMA 4 - -#define PCM_BUFSZ_MIN 8216 /* Hold one stereo WMA frame and meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDWMA_METAFIELD_MASK 0xFFFF0000 -#define AUDWMA_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDWMA_EOS_FLG_MASK 0x01 -#define AUDWMA_EOS_NONE 0x0 /* No EOS detected */ -#define AUDWMA_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDWMA_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audwma_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audwma_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - struct msm_audio_wma_config wma_config; - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int rmt_resource_released; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audwma_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwma_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_WMA; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_WMA; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for WMA \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_WMA; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - } - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audio_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("audio_update_pcm_buf_entry: \ - expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -static struct msm_adsp_ops audplay_adsp_ops_wma = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_WMA; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wma cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WMA_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - /* - * Test done for sample with the following configuration - * armdatareqthr = 1262 - * channelsdecoded = 1(MONO)/2(STEREO) - * wmabytespersec = Tested with 6003 Bytes per sec - * wmasamplingfreq = 44100 - * wmaencoderopts = 31 - */ - - cmd.armdatareqthr = audio->wma_config.armdatareqthr; - cmd.channelsdecoded = audio->wma_config.channelsdecoded; - cmd.wmabytespersec = audio->wma_config.wmabytespersec; - cmd.wmasamplingfreq = audio->wma_config.wmasamplingfreq; - cmd.wmaencoderopts = audio->wma_config.wmaencoderopts; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - - MM_DBG("buf0_addr=%x buf0_len=%d\n", - refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDWMA_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (audio->wflush) { - audio->out_needed = 1; - goto done; - } - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - MM_DBG("\n"); /* Macro prints the file name and function */ - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audwma_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audwma_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audwma_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audwma_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audwma_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audwma_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audwma_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audwma_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_WMA_CONFIG:{ - if (copy_to_user((void *)arg, &audio->wma_config, - sizeof(audio->wma_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_WMA_CONFIG:{ - struct msm_audio_wma_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - audio->wma_config = usr_config; - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("map of read buf failed\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t a, loff_t b, - int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("audio_read: no partial frame done reading\n"); - break; - } else { - MM_DBG("audio_read: read from in[%d]\n", - audio->read_next); - /* order reads from the output buffer */ - rmb(); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audwma_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audplay_send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDWMA_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("audio_write: mf offset_val %x\n", - mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDWMA_EOS_FLG_OFFSET] & - AUDWMA_EOS_FLG_MASK) { - MM_DBG("audio_write: EOS SET\n"); - eos_condition = AUDWMA_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDWMA_EOS_FLG_OFFSET] - &= ~AUDWMA_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("audio_write: continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - if (eos_condition == AUDWMA_EOS_SET) - rc = audwma_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audwma_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwma_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audwma_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audwma_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audwma_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audwma_suspend(struct early_suspend *h) -{ - struct audwma_suspend_ctl *ctl = - container_of(h, struct audwma_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwma_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audwma_resume(struct early_suspend *h) -{ - struct audwma_suspend_ctl *ctl = - container_of(h, struct audwma_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwma_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audwma_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audwma_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audwma_debug_fops = { - .read = audwma_debug_read, - .open = audwma_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - unsigned mem_sz = DMASZ_MAX; - struct audwma_event *e_node = NULL; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wma_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_WMA; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_WMA_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) { - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance \ - 0x%08x\n", (int)audio); - goto err; - } - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_wma, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for WMA session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->wma_config.armdatareqthr = 1262; - audio->wma_config.channelsdecoded = 2; - audio->wma_config.wmabytespersec = 6003; - audio->wma_config.wmasamplingfreq = 44100; - audio->wma_config.wmaencoderopts = 31; - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_wma_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audwma_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audwma_resume; - audio->suspend_ctl.node.suspend = audwma_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDWMA_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audwma_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wma_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_wma_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wma", - .fops = &audio_wma_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_wma_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audio_wmapro.c b/arch/arm/mach-msm/qdsp5/audio_wmapro.c deleted file mode 100644 index 6a1d1d69c7cc..000000000000 --- a/arch/arm/mach-msm/qdsp5/audio_wmapro.c +++ /dev/null @@ -1,1837 +0,0 @@ -/* audio_wmapro.c - wmapro audio decoder driver - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audmgr.h" - -/* Size must be power of 2 */ -#define BUFSZ_MAX 8206 /* Includes meta in size */ -#define BUFSZ_MIN 2062 /* Includes meta in size */ -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_WMAPRO 13 - -#define PCM_BUFSZ_MIN 8216 /* Hold one stereo WMAPRO frame and meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDWMAPRO_METAFIELD_MASK 0xFFFF0000 -#define AUDWMAPRO_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDWMAPRO_EOS_FLG_MASK 0x01 -#define AUDWMAPRO_EOS_NONE 0x0 /* No EOS detected */ -#define AUDWMAPRO_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDWMAPRO_EVENT_NUM 10 /* Default no. of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audwmapro_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audwmapro_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - struct msm_audio_wmapro_config wmapro_config; - struct audmgr audmgr; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int rmt_resource_released; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audwmapro_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - - int eq_enable; - int eq_needs_commit; - audpp_cmd_cfg_object_params_eqalizer eq; - audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwmapro_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -static int rmt_put_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_DISABLE; - cmd.dec_type = AUDDEC_DEC_WMAPRO; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return put_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -static int rmt_get_resource(struct audio *audio) -{ - struct aud_codec_config_cmd cmd; - unsigned short client_idx; - - cmd.cmd_id = RM_CMD_AUD_CODEC_CFG; - cmd.client_id = RM_AUD_CLIENT_ID; - cmd.task_id = audio->dec_id; - cmd.enable = RMT_ENABLE; - cmd.dec_type = AUDDEC_DEC_WMAPRO; - client_idx = ((cmd.client_id << 8) | cmd.task_id); - - return get_adsp_resource(client_idx, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - struct audmgr_config cfg; - int rc; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - if (audio->rmt_resource_released == 1) { - audio->rmt_resource_released = 0; - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for WMAPRO \ - session 0x%08x on decoder: %d\n Ignoring \ - error and going ahead with the playback\n", - (int)audio, audio->dec_id); - } - } - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE; - cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000; - cfg.def_method = RPC_AUD_DEF_METHOD_PLAYBACK; - cfg.codec = RPC_AUD_DEF_CODEC_WMA; - cfg.snd_method = RPC_SND_METHOD_MIDI; - - rc = audmgr_enable(&audio->audmgr, &cfg); - if (rc < 0) { - msm_adsp_dump(audio->audplay); - return rc; - } - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - audmgr_disable(&audio->audmgr); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - audio->stopped = 1; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - rc = audmgr_disable(&audio->audmgr); - if (rc < 0) - msm_adsp_dump(audio->audplay); - - audio->out_needed = 0; - rmt_put_resource(audio); - audio->rmt_resource_released = 1; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audio_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("audio_update_pcm_buf_entry: \ - expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq); - audpp_avsync(audio->dec_id, 22050); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audpp_avsync(audio->dec_id, 0); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -static struct msm_adsp_ops audplay_adsp_ops_wmapro = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - u16 cfg_dec_cmd[AUDPP_CMD_CFG_DEC_TYPE_LEN / sizeof(unsigned short)]; - - memset(cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - cfg_dec_cmd[0] = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_WMAPRO; - else - cfg_dec_cmd[1 + audio->dec_id] = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wmapro cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WMAPRO_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - cmd.armdatareqthr = audio->wmapro_config.armdatareqthr; - cmd.numchannels = audio->wmapro_config.numchannels; - cmd.validbitspersample = audio->wmapro_config.validbitspersample; - cmd.formattag = audio->wmapro_config.formattag; - cmd.samplingrate = audio->wmapro_config.samplingrate; - cmd.avgbytespersecond = audio->wmapro_config.avgbytespersecond; - cmd.asfpacketlength = audio->wmapro_config.asfpacketlength; - cmd.channelmask = audio->wmapro_config.channelmask; - cmd.encodeopt = audio->wmapro_config.encodeopt; - cmd.advancedencodeopt = audio->wmapro_config.advancedencodeopt; - cmd.advancedencodeopt2 = audio->wmapro_config.advancedencodeopt2; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - - MM_DBG("buf0_addr=%x buf0_len=%d\n", - refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDWMAPRO_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (audio->wflush) { - audio->out_needed = 1; - goto done; - } - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - MM_DBG("\n"); /* Macro prints the file name and function */ - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); -} - -static int audwmapro_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audwmapro_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audwmapro_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audwmapro_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audwmapro_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout(audio->event_wait, - audwmapro_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audwmapro_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq); - audio->eq_needs_commit = 0; - } - return 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = audpp_avsync_byte_count(audio->dec_id); - stats.sample_count = audpp_avsync_sample_count(audio->dec_id); - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audwmapro_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_WMAPRO_CONFIG:{ - if (copy_to_user((void *)arg, &audio->wmapro_config, - sizeof(audio->wmapro_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_WMAPRO_CONFIG:{ - struct msm_audio_wmapro_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - audio->wmapro_config = usr_config; - - /* Need to swap the first and last words of advancedencodeopt2 - * as DSP cannot read 32-bit variable at a time. Need to be - * split into two 16-bit and swap them as required by DSP */ - - audio->wmapro_config.advancedencodeopt2 = - ((audio->wmapro_config.advancedencodeopt2 & 0xFFFF0000) - >> 16) | ((audio->wmapro_config.advancedencodeopt2 - << 16) & 0xFFFF0000); - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("map of read buf failed\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = audio->map_v_read; - audio->pcm_feedback = 1; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t a, loff_t b, - int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("audio_read: no partial frame done reading\n"); - break; - } else { - MM_DBG("audio_read: read from in[%d]\n", - audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audwmapro_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audplay_send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDWMAPRO_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("audio_write: mf offset_val %x\n", - mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDWMAPRO_EOS_FLG_OFFSET] & - AUDWMAPRO_EOS_FLG_MASK) { - MM_DBG("audio_write: EOS SET\n"); - eos_condition = AUDWMAPRO_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDWMAPRO_EOS_FLG_OFFSET] - &= ~AUDWMAPRO_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("audio_write: continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - if (eos_condition == AUDWMAPRO_EOS_SET) - rc = audwmapro_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - audio_disable(audio); - if (audio->rmt_resource_released == 0) - rmt_put_resource(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audwmapro_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwmapro_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audwmapro_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audwmapro_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audwmapro_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audwmapro_suspend(struct early_suspend *h) -{ - struct audwmapro_suspend_ctl *ctl = - container_of(h, struct audwmapro_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwmapro_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audwmapro_resume(struct early_suspend *h) -{ - struct audwmapro_suspend_ctl *ctl = - container_of(h, struct audwmapro_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwmapro_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audwmapro_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audwmapro_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audwmapro_debug_fops = { - .read = audwmapro_debug_read, - .open = audwmapro_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - unsigned mem_sz = DMASZ_MAX; - struct audwmapro_event *e_node = NULL; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wmapro_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_WMAPRO; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_WMA_PRO_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - - rc = audmgr_open(&audio->audmgr); - if (rc) { - MM_ERR("audmgr open failed, freeing instance 0x%08x\n", - (int)audio); - goto err; - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_wmapro, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - audmgr_close(&audio->audmgr); - goto err; - } - - rc = rmt_get_resource(audio); - if (rc) { - MM_ERR("ADSP resources are not available for WMAPRO session \ - 0x%08x on decoder: %d\n", (int)audio, audio->dec_id); - if (audio->pcm_feedback == TUNNEL_MODE_PLAYBACK) - audmgr_close(&audio->audmgr); - msm_adsp_put(audio->audplay); - goto err; - } - - audio->input_buff_handle = NULL; - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_wmapro_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audwmapro_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audwmapro_resume; - audio->suspend_ctl.node.suspend = audwmapro_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDWMAPRO_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audwmapro_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wmapro_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_wmapro_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wmapro", - .fops = &audio_wmapro_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_wmapro_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5/audmgr.c b/arch/arm/mach-msm/qdsp5/audmgr.c deleted file mode 100644 index cc4058522a85..000000000000 --- a/arch/arm/mach-msm/qdsp5/audmgr.c +++ /dev/null @@ -1,526 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audmgr.c - * - * interface to "audmgr" service on the baseband cpu - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009, 2012, 2013 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "audmgr.h" -#include - -#define STATE_CLOSED 0 -#define STATE_DISABLED 1 -#define STATE_ENABLING 2 -#define STATE_ENABLED 3 -#define STATE_DISABLING 4 -#define STATE_ERROR 5 -#define MAX_DEVICE_INFO_CALLBACK 1 -#define SESSION_VOICE 0 -#define SESSION_PLAYBACK 1 -#define SESSION_RECORDING 2 - -/* store information used across complete audmgr sessions */ -struct audmgr_global { - struct mutex *lock; - struct msm_rpc_endpoint *ept; - struct task_struct *task; - uint32_t rpc_version; - uint32_t rx_device; - uint32_t tx_device; - int cad; - struct device_info_callback *device_cb[MAX_DEVICE_INFO_CALLBACK]; - -}; -static DEFINE_MUTEX(audmgr_lock); - -static struct audmgr_global the_audmgr_state = { - .lock = &audmgr_lock, -}; - -static void audmgr_rpc_connect(struct audmgr_global *amg) -{ - amg->cad = 0; - amg->ept = msm_rpc_connect_compatible(AUDMGR_PROG, - AUDMGR_VERS_COMP_VER3, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(amg->ept)) { - MM_DBG("connect failed with current VERS"\ - "= %x, trying again with Cad API\n", - AUDMGR_VERS_COMP_VER3); - amg->ept = msm_rpc_connect_compatible(AUDMGR_PROG, - AUDMGR_VERS_COMP_VER4, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(amg->ept)) { - amg->ept = msm_rpc_connect_compatible(AUDMGR_PROG, - AUDMGR_VERS_COMP_VER2, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(amg->ept)) { - MM_ERR("connect failed with current VERS" \ - "= %x, trying again with another API\n", - AUDMGR_VERS_COMP_VER2); - amg->ept = msm_rpc_connect_compatible( - AUDMGR_PROG, - AUDMGR_VERS_COMP, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(amg->ept)) { - MM_ERR("connect failed with current" \ - "VERS=%x, trying again with" \ - "another API\n", - AUDMGR_VERS_COMP); - amg->ept = msm_rpc_connect(AUDMGR_PROG, - AUDMGR_VERS, - MSM_RPC_UNINTERRUPTIBLE); - amg->rpc_version = AUDMGR_VERS; - } else - amg->rpc_version = AUDMGR_VERS_COMP; - } else - amg->rpc_version = AUDMGR_VERS_COMP_VER2; - } else { - amg->rpc_version = AUDMGR_VERS_COMP_VER4; - amg->cad = 1; - } - } else - amg->rpc_version = AUDMGR_VERS_COMP_VER3; - - if (IS_ERR(amg->ept)) { - amg->ept = NULL; - MM_ERR("failed to connect to audmgr svc\n"); - } - - return; -} - -static void rpc_ack(struct msm_rpc_endpoint *ept, uint32_t xid) -{ - uint32_t rep[6]; - - rep[0] = cpu_to_be32(xid); - rep[1] = cpu_to_be32(1); - rep[2] = cpu_to_be32(RPCMSG_REPLYSTAT_ACCEPTED); - rep[3] = cpu_to_be32(RPC_ACCEPTSTAT_SUCCESS); - rep[4] = 0; - rep[5] = 0; - - msm_rpc_write(ept, rep, sizeof(rep)); -} - -static void process_audmgr_callback(struct audmgr_global *amg, - void *args, int len) -{ - struct audmgr *am; - int i = 0; - struct rpc_audmgr_cb_device_info *temp; - - /* Allow only if complete arguments recevied*/ - if (len < MIN_RPC_DATA_LENGTH) - return; - - /* Allow only if valid argument */ - if (be32_to_cpu(((struct rpc_audmgr_cb_common *)args)->set_to_one) != 1) - return; - - switch (be32_to_cpu(((struct rpc_audmgr_cb_common *)args)->status)) { - case RPC_AUDMGR_STATUS_READY: - am = (struct audmgr *) be32_to_cpu( - ((struct rpc_audmgr_cb_ready *)args)->client_data); - if (!am) - return; - am->handle = be32_to_cpu( - ((struct rpc_audmgr_cb_ready *)args)->u.handle); - MM_INFO("rpc READY handle=0x%08x\n", am->handle); - break; - case RPC_AUDMGR_STATUS_CODEC_CONFIG: { - MM_INFO("rpc CODEC_CONFIG\n"); - am = (struct audmgr *) be32_to_cpu( - ((struct rpc_audmgr_cb_ready *)args)->client_data); - if (!am) - return; - if (am->state != STATE_ENABLED) - am->state = STATE_ENABLED; - if (!amg->cad) { - wake_up(&am->wait); - break; - } - - if (am->evt.session_info == SESSION_PLAYBACK && - am->evt.dev_type.rx_device != amg->rx_device) { - am->evt.dev_type.rx_device = amg->rx_device; - am->evt.dev_type.tx_device = 0; - am->evt.acdb_id = am->evt.dev_type.rx_device; - } - if (am->evt.session_info == SESSION_RECORDING && - am->evt.dev_type.tx_device != amg->tx_device) { - am->evt.dev_type.rx_device = 0; - am->evt.dev_type.tx_device = amg->tx_device; - am->evt.acdb_id = am->evt.dev_type.tx_device; - } - - while ((amg->device_cb[i] != NULL) && - (i < MAX_DEVICE_INFO_CALLBACK) && - (amg->cad)) { - amg->device_cb[i]->func(&(am->evt), - amg->device_cb[i]->private); - i++; - } - wake_up(&am->wait); - break; - } - case RPC_AUDMGR_STATUS_PENDING: - MM_ERR("PENDING?\n"); - break; - case RPC_AUDMGR_STATUS_SUSPEND: - MM_ERR("SUSPEND?\n"); - break; - case RPC_AUDMGR_STATUS_FAILURE: - MM_ERR("FAILURE\n"); - break; - case RPC_AUDMGR_STATUS_VOLUME_CHANGE: - MM_ERR("VOLUME_CHANGE?\n"); - break; - case RPC_AUDMGR_STATUS_DISABLED: - MM_ERR("DISABLED\n"); - am = (struct audmgr *) be32_to_cpu( - ((struct rpc_audmgr_cb_ready *)args)->client_data); - if (!am) - return; - am->state = STATE_DISABLED; - wake_up(&am->wait); - break; - case RPC_AUDMGR_STATUS_ERROR: - MM_ERR("ERROR?\n"); - am = (struct audmgr *) be32_to_cpu( - ((struct rpc_audmgr_cb_ready *)args)->client_data); - if (!am) - return; - am->state = STATE_ERROR; - wake_up(&am->wait); - break; - case RPC_AUDMGR_STATUS_DEVICE_INFO: - MM_INFO("rpc DEVICE_INFO\n"); - if (!amg->cad) - break; - temp = (struct rpc_audmgr_cb_device_info *)args; - am = (struct audmgr *) be32_to_cpu(temp->client_data); - if (!am) - return; - if (am->evt.session_info == SESSION_PLAYBACK) { - am->evt.dev_type.rx_device = - be32_to_cpu(temp->d.rx_device); - am->evt.dev_type.tx_device = 0; - am->evt.acdb_id = am->evt.dev_type.rx_device; - amg->rx_device = am->evt.dev_type.rx_device; - } else if (am->evt.session_info == SESSION_RECORDING) { - am->evt.dev_type.rx_device = 0; - am->evt.dev_type.tx_device = - be32_to_cpu(temp->d.tx_device); - am->evt.acdb_id = am->evt.dev_type.tx_device; - amg->tx_device = am->evt.dev_type.tx_device; - } - am->evt.dev_type.ear_mute = - be32_to_cpu(temp->d.ear_mute); - am->evt.dev_type.mic_mute = - be32_to_cpu(temp->d.mic_mute); - am->evt.dev_type.volume = - be32_to_cpu(temp->d.volume); - break; - case RPC_AUDMGR_STATUS_DEVICE_CONFIG: - MM_ERR("rpc DEVICE_CONFIG\n"); - break; - default: - break; - } -} - -static void process_rpc_request(uint32_t proc, uint32_t xid, - void *data, int len, void *private) -{ - struct audmgr_global *amg = private; - - if (proc == AUDMGR_CB_FUNC_PTR) - process_audmgr_callback(amg, data, len); - else - MM_ERR("unknown rpc proc %d\n", proc); - rpc_ack(amg->ept, xid); -} - -#define RPC_TYPE_REQUEST 0 -#define RPC_TYPE_REPLY 1 - -#define RPC_VERSION 2 - -#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2) -#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr)) -#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3) -#define RPC_REPLY_SZ (sizeof(uint32_t) * 6) - -static int audmgr_rpc_thread(void *data) -{ - struct audmgr_global *amg = data; - struct rpc_request_hdr *hdr = NULL; - uint32_t type; - int len; - - MM_INFO("start\n"); - - while (!kthread_should_stop()) { - if (hdr) { - kfree(hdr); - hdr = NULL; - } - len = msm_rpc_read(amg->ept, (void **) &hdr, -1, -1); - if (len < 0) { - MM_ERR("rpc read failed (%d)\n", len); - break; - } - if (len < RPC_COMMON_HDR_SZ) - continue; - - type = be32_to_cpu(hdr->type); - if (type == RPC_TYPE_REPLY) { - struct rpc_reply_hdr *rep = (void *) hdr; - uint32_t status; - if (len < RPC_REPLY_HDR_SZ) - continue; - status = be32_to_cpu(rep->reply_stat); - if (status == RPCMSG_REPLYSTAT_ACCEPTED) { - status = be32_to_cpu(rep->data.acc_hdr.accept_stat); - MM_INFO("rpc_reply status %d\n", status); - } else { - MM_INFO("rpc_reply denied!\n"); - } - /* process reply */ - continue; - } - - if (len < RPC_REQUEST_HDR_SZ) - continue; - - process_rpc_request(be32_to_cpu(hdr->procedure), - be32_to_cpu(hdr->xid), - (void *) (hdr + 1), - len - sizeof(*hdr), - data); - } - MM_INFO("exit\n"); - if (hdr) { - kfree(hdr); - hdr = NULL; - } - amg->task = NULL; - return 0; -} - -static unsigned convert_samp_index(unsigned index) -{ - switch (index) { - case RPC_AUD_DEF_SAMPLE_RATE_48000: return 48000; - case RPC_AUD_DEF_SAMPLE_RATE_44100: return 44100; - case RPC_AUD_DEF_SAMPLE_RATE_32000: return 32000; - case RPC_AUD_DEF_SAMPLE_RATE_24000: return 24000; - case RPC_AUD_DEF_SAMPLE_RATE_22050: return 22050; - case RPC_AUD_DEF_SAMPLE_RATE_16000: return 16000; - case RPC_AUD_DEF_SAMPLE_RATE_12000: return 12000; - case RPC_AUD_DEF_SAMPLE_RATE_11025: return 11025; - case RPC_AUD_DEF_SAMPLE_RATE_8000: return 8000; - default: return 11025; - } -} - -static void get_current_session_info(struct audmgr *am, - struct audmgr_config *cfg) -{ - if (cfg->def_method == RPC_AUD_DEF_METHOD_PLAYBACK || - (cfg->def_method == RPC_AUD_DEF_METHOD_HOST_PCM && cfg->rx_rate)) { - am->evt.session_info = SESSION_PLAYBACK; /* playback */ - am->evt.sample_rate = convert_samp_index(cfg->rx_rate); - } else if (cfg->def_method == RPC_AUD_DEF_METHOD_RECORD) { - am->evt.session_info = SESSION_RECORDING; /* recording */ - am->evt.sample_rate = convert_samp_index(cfg->tx_rate); - } else - am->evt.session_info = SESSION_VOICE; -} - -struct audmgr_enable_msg { - struct rpc_request_hdr hdr; - struct rpc_audmgr_enable_client_args args; -}; - -struct audmgr_disable_msg { - struct rpc_request_hdr hdr; - uint32_t handle; -}; - -int audmgr_open(struct audmgr *am) -{ - struct audmgr_global *amg = &the_audmgr_state; - int rc; - - if (am->state != STATE_CLOSED) - return 0; - - mutex_lock(amg->lock); - - /* connect to audmgr end point and polling thread only once */ - if (amg->ept == NULL) { - audmgr_rpc_connect(amg); - if (IS_ERR(amg->ept)) { - rc = PTR_ERR(amg->ept); - amg->ept = NULL; - MM_ERR("failed to connect to audmgr svc\n"); - goto done; - } - - amg->task = kthread_run(audmgr_rpc_thread, amg, "audmgr_rpc"); - if (IS_ERR(amg->task)) { - rc = PTR_ERR(amg->task); - amg->task = NULL; - msm_rpc_close(amg->ept); - amg->ept = NULL; - goto done; - } - } - - /* Initialize session parameters */ - init_waitqueue_head(&am->wait); - am->state = STATE_DISABLED; - rc = 0; -done: - mutex_unlock(amg->lock); - return rc; -} -EXPORT_SYMBOL(audmgr_open); - -int audmgr_close(struct audmgr *am) -{ - return -EBUSY; -} -EXPORT_SYMBOL(audmgr_close); - -int audmgr_enable(struct audmgr *am, struct audmgr_config *cfg) -{ - struct audmgr_global *amg = &the_audmgr_state; - struct audmgr_enable_msg msg; - int rc; - - if (am->state == STATE_ENABLED) - return 0; - - if (am->state == STATE_DISABLING) - MM_ERR("state is DISABLING in enable?\n"); - am->state = STATE_ENABLING; - - MM_INFO("session 0x%08x\n", (int) am); - msg.args.set_to_one = cpu_to_be32(1); - msg.args.tx_sample_rate = cpu_to_be32(cfg->tx_rate); - msg.args.rx_sample_rate = cpu_to_be32(cfg->rx_rate); - msg.args.def_method = cpu_to_be32(cfg->def_method); - msg.args.codec_type = cpu_to_be32(cfg->codec); - msg.args.snd_method = cpu_to_be32(cfg->snd_method); - msg.args.cb_func = cpu_to_be32(0x11111111); - msg.args.client_data = cpu_to_be32((int)am); - - get_current_session_info(am, cfg); - msm_rpc_setup_req(&msg.hdr, AUDMGR_PROG, amg->rpc_version, - AUDMGR_ENABLE_CLIENT); - - rc = msm_rpc_write(amg->ept, &msg, sizeof(msg)); - if (rc < 0) - return rc; - - rc = wait_event_timeout(am->wait, am->state != STATE_ENABLING, 15 * HZ); - if (rc == 0) { - MM_ERR("ARM9 did not reply to RPC am->state = %d\n", am->state); - } - if (am->state == STATE_ENABLED) - return 0; - - am->evt.session_info = -1; - MM_ERR("unexpected state %d while enabling?!\n", am->state); - return -ENODEV; -} -EXPORT_SYMBOL(audmgr_enable); - -int audmgr_disable(struct audmgr *am) -{ - struct audmgr_global *amg = &the_audmgr_state; - struct audmgr_disable_msg msg; - int rc; - - if (am->state == STATE_DISABLED) - return 0; - - MM_INFO("session 0x%08x\n", (int) am); - am->evt.session_info = -1; - msg.handle = cpu_to_be32(am->handle); - msm_rpc_setup_req(&msg.hdr, AUDMGR_PROG, amg->rpc_version, - AUDMGR_DISABLE_CLIENT); - - am->state = STATE_DISABLING; - - rc = msm_rpc_write(amg->ept, &msg, sizeof(msg)); - if (rc < 0) - return rc; - - rc = wait_event_timeout(am->wait, am->state != STATE_DISABLING, 15 * HZ); - if (rc == 0) { - MM_ERR("ARM9 did not reply to RPC am->state = %d\n", am->state); - } - - if (am->state == STATE_DISABLED) - return 0; - - MM_ERR("unexpected state %d while disabling?!\n", am->state); - return -ENODEV; -} -EXPORT_SYMBOL(audmgr_disable); - -int audmgr_register_device_info_callback(struct device_info_callback *dcb) -{ - struct audmgr_global *amg = &the_audmgr_state; - int i; - - for (i = 0; i < MAX_DEVICE_INFO_CALLBACK; i++) { - if (NULL == amg->device_cb[i]) { - amg->device_cb[i] = dcb; - return 0; - } - } - return -EINVAL; -} -EXPORT_SYMBOL(audmgr_register_device_info_callback); - -int audmgr_deregister_device_info_callback(struct device_info_callback *dcb) -{ - struct audmgr_global *amg = &the_audmgr_state; - int i; - - for (i = 0; i < MAX_DEVICE_INFO_CALLBACK; i++) { - if (dcb == amg->device_cb[i]) { - amg->device_cb[i] = NULL; - return 0; - } - } - return -EINVAL; -} -EXPORT_SYMBOL(audmgr_deregister_device_info_callback); diff --git a/arch/arm/mach-msm/qdsp5/audmgr.h b/arch/arm/mach-msm/qdsp5/audmgr.h deleted file mode 100644 index 01a0890ef9db..000000000000 --- a/arch/arm/mach-msm/qdsp5/audmgr.h +++ /dev/null @@ -1,240 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audmgr.h - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, 2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _AUDIO_RPC_H_ -#define _AUDIO_RPC_H_ - -#include - -enum rpc_aud_def_sample_rate_type { - RPC_AUD_DEF_SAMPLE_RATE_NONE, - RPC_AUD_DEF_SAMPLE_RATE_8000, - RPC_AUD_DEF_SAMPLE_RATE_11025, - RPC_AUD_DEF_SAMPLE_RATE_12000, - RPC_AUD_DEF_SAMPLE_RATE_16000, - RPC_AUD_DEF_SAMPLE_RATE_22050, - RPC_AUD_DEF_SAMPLE_RATE_24000, - RPC_AUD_DEF_SAMPLE_RATE_32000, - RPC_AUD_DEF_SAMPLE_RATE_44100, - RPC_AUD_DEF_SAMPLE_RATE_48000, - RPC_AUD_DEF_SAMPLE_RATE_MAX, -}; - -enum rpc_aud_def_method_type { - RPC_AUD_DEF_METHOD_NONE, - RPC_AUD_DEF_METHOD_KEY_BEEP, - RPC_AUD_DEF_METHOD_PLAYBACK, - RPC_AUD_DEF_METHOD_VOICE, - RPC_AUD_DEF_METHOD_RECORD, - RPC_AUD_DEF_METHOD_HOST_PCM, - RPC_AUD_DEF_METHOD_MIDI_OUT, - RPC_AUD_DEF_METHOD_RECORD_SBC, - RPC_AUD_DEF_METHOD_DTMF_RINGER, - RPC_AUD_DEF_METHOD_MAX, -}; - -enum rpc_aud_def_codec_type { - RPC_AUD_DEF_CODEC_NONE, - RPC_AUD_DEF_CODEC_DTMF, - RPC_AUD_DEF_CODEC_MIDI, - RPC_AUD_DEF_CODEC_MP3, - RPC_AUD_DEF_CODEC_PCM, - RPC_AUD_DEF_CODEC_AAC, - RPC_AUD_DEF_CODEC_WMA, - RPC_AUD_DEF_CODEC_RA, - RPC_AUD_DEF_CODEC_ADPCM, - RPC_AUD_DEF_CODEC_GAUDIO, - RPC_AUD_DEF_CODEC_VOC_EVRC, - RPC_AUD_DEF_CODEC_VOC_13K, - RPC_AUD_DEF_CODEC_VOC_4GV_NB, - RPC_AUD_DEF_CODEC_VOC_AMR, - RPC_AUD_DEF_CODEC_VOC_EFR, - RPC_AUD_DEF_CODEC_VOC_FR, - RPC_AUD_DEF_CODEC_VOC_HR, - RPC_AUD_DEF_CODEC_VOC_CDMA, - RPC_AUD_DEF_CODEC_VOC_CDMA_WB, - RPC_AUD_DEF_CODEC_VOC_UMTS, - RPC_AUD_DEF_CODEC_VOC_UMTS_WB, - RPC_AUD_DEF_CODEC_SBC, - RPC_AUD_DEF_CODEC_VOC_PCM, - RPC_AUD_DEF_CODEC_AMR_WB, - RPC_AUD_DEF_CODEC_AMR_WB_PLUS, - RPC_AUD_DEF_CODEC_AAC_BSAC, - RPC_AUD_DEF_CODEC_MAX, - RPC_AUD_DEF_CODEC_AMR_NB, - RPC_AUD_DEF_CODEC_13K, - RPC_AUD_DEF_CODEC_EVRC, - RPC_AUD_DEF_CODEC_AC3, - RPC_AUD_DEF_CODEC_MAX_002, -}; - -enum rpc_snd_method_type { - RPC_SND_METHOD_VOICE = 0, - RPC_SND_METHOD_KEY_BEEP, - RPC_SND_METHOD_MESSAGE, - RPC_SND_METHOD_RING, - RPC_SND_METHOD_MIDI, - RPC_SND_METHOD_AUX, - RPC_SND_METHOD_MAX, -}; - -enum rpc_voc_codec_type { - RPC_VOC_CODEC_DEFAULT, - RPC_VOC_CODEC_ON_CHIP_0 = RPC_VOC_CODEC_DEFAULT, - RPC_VOC_CODEC_ON_CHIP_1, - RPC_VOC_CODEC_STEREO_HEADSET, - RPC_VOC_CODEC_ON_CHIP_AUX, - RPC_VOC_CODEC_BT_OFF_BOARD, - RPC_VOC_CODEC_BT_A2DP, - RPC_VOC_CODEC_OFF_BOARD, - RPC_VOC_CODEC_SDAC, - RPC_VOC_CODEC_RX_EXT_SDAC_TX_INTERNAL, - RPC_VOC_CODEC_IN_STEREO_SADC_OUT_MONO_HANDSET, - RPC_VOC_CODEC_IN_STEREO_SADC_OUT_STEREO_HEADSET, - RPC_VOC_CODEC_TX_INT_SADC_RX_EXT_AUXPCM, - RPC_VOC_CODEC_EXT_STEREO_SADC_OUT_MONO_HANDSET, - RPC_VOC_CODEC_EXT_STEREO_SADC_OUT_STEREO_HEADSET, - RPC_VOC_CODEC_TTY_ON_CHIP_1, - RPC_VOC_CODEC_TTY_OFF_BOARD, - RPC_VOC_CODEC_TTY_VCO, - RPC_VOC_CODEC_TTY_HCO, - RPC_VOC_CODEC_ON_CHIP_0_DUAL_MIC, - RPC_VOC_CODEC_MAX, - RPC_VOC_CODEC_NONE, -}; - -enum rpc_audmgr_status_type { - RPC_AUDMGR_STATUS_READY, - RPC_AUDMGR_STATUS_CODEC_CONFIG, - RPC_AUDMGR_STATUS_PENDING, - RPC_AUDMGR_STATUS_SUSPEND, - RPC_AUDMGR_STATUS_FAILURE, - RPC_AUDMGR_STATUS_VOLUME_CHANGE, - RPC_AUDMGR_STATUS_DISABLED, - RPC_AUDMGR_STATUS_ERROR, - RPC_AUDMGR_STATUS_DEVICE_CONFIG, - RPC_AUDMGR_STATUS_DEVICE_INFO - -}; - -struct rpc_audmgr_enable_client_args { - uint32_t set_to_one; - uint32_t tx_sample_rate; - uint32_t rx_sample_rate; - uint32_t def_method; - uint32_t codec_type; - uint32_t snd_method; - - uint32_t cb_func; - uint32_t client_data; -}; - -#define AUDMGR_ENABLE_CLIENT 2 -#define AUDMGR_DISABLE_CLIENT 3 -#define AUDMGR_SUSPEND_EVENT_RSP 4 -#define AUDMGR_REGISTER_OPERATION_LISTENER 5 -#define AUDMGR_UNREGISTER_OPERATION_LISTENER 6 -#define AUDMGR_REGISTER_CODEC_LISTENER 7 -#define AUDMGR_GET_RX_SAMPLE_RATE 8 -#define AUDMGR_GET_TX_SAMPLE_RATE 9 -#define AUDMGR_SET_DEVICE_MODE 10 -#define MIN_RPC_DATA_LENGTH 16 - -#define AUDMGR_PROG_VERS "rs30000013:0x7feccbff" -#define AUDMGR_PROG 0x30000013 -#define AUDMGR_VERS 0x7feccbff -#define AUDMGR_VERS_COMP 0x00010001 -#define AUDMGR_VERS_COMP_VER2 0x00020001 -#define AUDMGR_VERS_COMP_VER3 0x00030001 -#define AUDMGR_VERS_COMP_VER4 0x00040001 - -struct cad_device_info_type { - uint32_t rx_device; - uint32_t tx_device; - uint32_t ear_mute; - uint32_t mic_mute; - uint32_t volume; -}; - -struct rpc_audmgr_cb_common { - uint32_t cb_id; /* cb_func */ - uint32_t status; /* Audmgr status */ - uint32_t set_to_one; /* Pointer status (1 = valid, 0 = invalid) */ - uint32_t disc; - /* disc = AUDMGR_STATUS_READY => data=handle - disc = AUDMGR_STATUS_CODEC_CONFIG => data = volume - disc = AUDMGR_STATUS_DISABLED => data =status_disabled - disc = AUDMGR_STATUS_VOLUME_CHANGE => data = volume_change */ -}; - -struct rpc_audmgr_cb_ready { - struct rpc_audmgr_cb_common c_data; - union { - uint32_t handle; - uint32_t volume; - uint32_t status_disabled; - uint32_t volume_change; - } u; - uint32_t client_data; -}; - -struct rpc_audmgr_cb_device_info { - struct rpc_audmgr_cb_common c_data; - struct cad_device_info_type d; - uint32_t client_data; -}; - -#define AUDMGR_CB_FUNC_PTR 1 -#define AUDMGR_OPR_LSTNR_CB_FUNC_PTR 2 -#define AUDMGR_CODEC_LSTR_FUNC_PTR 3 - -struct dev_evt_msg { - struct cad_device_info_type dev_type; - uint32_t acdb_id; - int session_info; - uint32_t sample_rate; -}; - -typedef void (*device_info_func)(struct dev_evt_msg *evt_msg, void *private); - -struct device_info_callback { - device_info_func func; - void *private; -}; - -struct audmgr { - wait_queue_head_t wait; - uint32_t handle; - int state; - struct dev_evt_msg evt; -}; - -struct audmgr_config { - uint32_t tx_rate; - uint32_t rx_rate; - uint32_t def_method; - uint32_t codec; - uint32_t snd_method; -}; - -int audmgr_register_device_info_callback(struct device_info_callback *dcb); -int audmgr_deregister_device_info_callback(struct device_info_callback *dcb); - -int audmgr_open(struct audmgr *am); -int audmgr_close(struct audmgr *am); -int audmgr_enable(struct audmgr *am, struct audmgr_config *cfg); -int audmgr_disable(struct audmgr *am); -#endif diff --git a/arch/arm/mach-msm/qdsp5/audmgr_new.h b/arch/arm/mach-msm/qdsp5/audmgr_new.h deleted file mode 100644 index d775a9334df6..000000000000 --- a/arch/arm/mach-msm/qdsp5/audmgr_new.h +++ /dev/null @@ -1,197 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audmgr.h - * - * Copyright 2008,2012 (c) The Linux Foundation. All rights reserved. - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _ARCH_ARM_MACH_MSM_AUDMGR_NEW_H -#define _ARCH_ARM_MACH_MSM_AUDMGR_NEW_H - -enum rpc_aud_def_sample_rate_type { - RPC_AUD_DEF_SAMPLE_RATE_NONE, - RPC_AUD_DEF_SAMPLE_RATE_8000, - RPC_AUD_DEF_SAMPLE_RATE_11025, - RPC_AUD_DEF_SAMPLE_RATE_12000, - RPC_AUD_DEF_SAMPLE_RATE_16000, - RPC_AUD_DEF_SAMPLE_RATE_22050, - RPC_AUD_DEF_SAMPLE_RATE_24000, - RPC_AUD_DEF_SAMPLE_RATE_32000, - RPC_AUD_DEF_SAMPLE_RATE_44100, - RPC_AUD_DEF_SAMPLE_RATE_48000, - RPC_AUD_DEF_SAMPLE_RATE_MAX, -}; - -enum rpc_aud_def_method_type { - RPC_AUD_DEF_METHOD_NONE, - RPC_AUD_DEF_METHOD_KEY_BEEP, - RPC_AUD_DEF_METHOD_PLAYBACK, - RPC_AUD_DEF_METHOD_VOICE, - RPC_AUD_DEF_METHOD_RECORD, - RPC_AUD_DEF_METHOD_HOST_PCM, - RPC_AUD_DEF_METHOD_MIDI_OUT, - RPC_AUD_DEF_METHOD_RECORD_SBC, - RPC_AUD_DEF_METHOD_DTMF_RINGER, - RPC_AUD_DEF_METHOD_MAX, -}; - -enum rpc_aud_def_codec_type { - RPC_AUD_DEF_CODEC_NONE, - RPC_AUD_DEF_CODEC_DTMF, - RPC_AUD_DEF_CODEC_MIDI, - RPC_AUD_DEF_CODEC_MP3, - RPC_AUD_DEF_CODEC_PCM, - RPC_AUD_DEF_CODEC_AAC, - RPC_AUD_DEF_CODEC_WMA, - RPC_AUD_DEF_CODEC_RA, - RPC_AUD_DEF_CODEC_ADPCM, - RPC_AUD_DEF_CODEC_GAUDIO, - RPC_AUD_DEF_CODEC_VOC_EVRC, - RPC_AUD_DEF_CODEC_VOC_13K, - RPC_AUD_DEF_CODEC_VOC_4GV_NB, - RPC_AUD_DEF_CODEC_VOC_AMR, - RPC_AUD_DEF_CODEC_VOC_EFR, - RPC_AUD_DEF_CODEC_VOC_FR, - RPC_AUD_DEF_CODEC_VOC_HR, - RPC_AUD_DEF_CODEC_VOC_CDMA, - RPC_AUD_DEF_CODEC_VOC_CDMA_WB, - RPC_AUD_DEF_CODEC_VOC_UMTS, - RPC_AUD_DEF_CODEC_VOC_UMTS_WB, - RPC_AUD_DEF_CODEC_SBC, - RPC_AUD_DEF_CODEC_VOC_PCM, - RPC_AUD_DEF_CODEC_AMR_WB, - RPC_AUD_DEF_CODEC_AMR_WB_PLUS, - RPC_AUD_DEF_CODEC_AAC_BSAC, - RPC_AUD_DEF_CODEC_MAX, - RPC_AUD_DEF_CODEC_AMR_NB, - RPC_AUD_DEF_CODEC_13K, - RPC_AUD_DEF_CODEC_EVRC, - RPC_AUD_DEF_CODEC_AC3, - RPC_AUD_DEF_CODEC_MAX_002, -}; - -enum rpc_snd_method_type { - RPC_SND_METHOD_VOICE = 0, - RPC_SND_METHOD_KEY_BEEP, - RPC_SND_METHOD_MESSAGE, - RPC_SND_METHOD_RING, - RPC_SND_METHOD_MIDI, - RPC_SND_METHOD_AUX, - RPC_SND_METHOD_MAX, -}; - -enum rpc_voc_codec_type { - RPC_VOC_CODEC_DEFAULT, - RPC_VOC_CODEC_ON_CHIP_0 = RPC_VOC_CODEC_DEFAULT, - RPC_VOC_CODEC_ON_CHIP_1, - RPC_VOC_CODEC_STEREO_HEADSET, - RPC_VOC_CODEC_ON_CHIP_AUX, - RPC_VOC_CODEC_BT_OFF_BOARD, - RPC_VOC_CODEC_BT_A2DP, - RPC_VOC_CODEC_OFF_BOARD, - RPC_VOC_CODEC_SDAC, - RPC_VOC_CODEC_RX_EXT_SDAC_TX_INTERNAL, - RPC_VOC_CODEC_IN_STEREO_SADC_OUT_MONO_HANDSET, - RPC_VOC_CODEC_IN_STEREO_SADC_OUT_STEREO_HEADSET, - RPC_VOC_CODEC_TX_INT_SADC_RX_EXT_AUXPCM, - RPC_VOC_CODEC_EXT_STEREO_SADC_OUT_MONO_HANDSET, - RPC_VOC_CODEC_EXT_STEREO_SADC_OUT_STEREO_HEADSET, - RPC_VOC_CODEC_TTY_ON_CHIP_1, - RPC_VOC_CODEC_TTY_OFF_BOARD, - RPC_VOC_CODEC_TTY_VCO, - RPC_VOC_CODEC_TTY_HCO, - RPC_VOC_CODEC_ON_CHIP_0_DUAL_MIC, - RPC_VOC_CODEC_MAX, - RPC_VOC_CODEC_NONE, -}; - -enum rpc_audmgr_status_type { - RPC_AUDMGR_STATUS_READY, - RPC_AUDMGR_STATUS_CODEC_CONFIG, - RPC_AUDMGR_STATUS_PENDING, - RPC_AUDMGR_STATUS_SUSPEND, - RPC_AUDMGR_STATUS_FAILURE, - RPC_AUDMGR_STATUS_VOLUME_CHANGE, - RPC_AUDMGR_STATUS_DISABLED, - RPC_AUDMGR_STATUS_ERROR, -}; - -struct rpc_audmgr_enable_client_args { - uint32_t set_to_one; - uint32_t tx_sample_rate; - uint32_t rx_sample_rate; - uint32_t def_method; - uint32_t codec_type; - uint32_t snd_method; - - uint32_t cb_func; - uint32_t client_data; -}; - -#define AUDMGR_ENABLE_CLIENT 2 -#define AUDMGR_DISABLE_CLIENT 3 -#define AUDMGR_SUSPEND_EVENT_RSP 4 -#define AUDMGR_REGISTER_OPERATION_LISTENER 5 -#define AUDMGR_UNREGISTER_OPERATION_LISTENER 6 -#define AUDMGR_REGISTER_CODEC_LISTENER 7 -#define AUDMGR_GET_RX_SAMPLE_RATE 8 -#define AUDMGR_GET_TX_SAMPLE_RATE 9 -#define AUDMGR_SET_DEVICE_MODE 10 - -#define AUDMGR_PROG 0x30000013 -#define AUDMGR_VERS MSM_RPC_VERS(1,0) - -struct rpc_audmgr_cb_func_ptr { - uint32_t cb_id; - uint32_t status; /* Audmgr status */ - uint32_t set_to_one; /* Pointer status (1 = valid, 0 = invalid) */ - uint32_t disc; - /* disc = AUDMGR_STATUS_READY => data=handle - disc = AUDMGR_STATUS_CODEC_CONFIG => data = handle - disc = AUDMGR_STATUS_DISABLED => data =status_disabled - disc = AUDMGR_STATUS_VOLUME_CHANGE => data = volume-change */ - union { - uint32_t handle; - uint32_t volume; - uint32_t status_disabled; - uint32_t volume_change; - } u; -}; - -#define AUDMGR_CB_FUNC_PTR 1 -#define AUDMGR_OPR_LSTNR_CB_FUNC_PTR 2 -#define AUDMGR_CODEC_LSTR_FUNC_PTR 3 - -#define AUDMGR_CB_PROG 0x31000013 -#define AUDMGR_CB_VERS 0xf8e3e2d9 - -struct audmgr { - wait_queue_head_t wait; - uint32_t handle; - struct msm_rpc_endpoint *ept; - struct task_struct *task; - int state; -}; - -struct audmgr_config { - uint32_t tx_rate; - uint32_t rx_rate; - uint32_t def_method; - uint32_t codec; - uint32_t snd_method; -}; - -int audmgr_open(struct audmgr *am); -int audmgr_close(struct audmgr *am); -int audmgr_enable(struct audmgr *am, struct audmgr_config *cfg); -int audmgr_disable(struct audmgr *am); -#endif diff --git a/arch/arm/mach-msm/qdsp5/audpp.c b/arch/arm/mach-msm/qdsp5/audpp.c deleted file mode 100644 index bcc00a4d5e09..000000000000 --- a/arch/arm/mach-msm/qdsp5/audpp.c +++ /dev/null @@ -1,1038 +0,0 @@ - -/* arch/arm/mach-msm/qdsp5/audpp.c - * - * common code to deal with the AUDPP dsp task (audio postproc) - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009-2010, 2012-2013 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "audmgr.h" - -#include -#include -#include -#include -#include - -#include "evlog.h" - -enum { - EV_NULL, - EV_ENABLE, - EV_DISABLE, - EV_EVENT, - EV_DATA, -}; - -static const char *dsp_log_strings[] = { - "NULL", - "ENABLE", - "DISABLE", - "EVENT", - "DATA", -}; - -DECLARE_LOG(dsp_log, 64, dsp_log_strings); - -static int __init _dsp_log_init(void) -{ - return ev_log_init(&dsp_log); -} - -module_init(_dsp_log_init); -#define LOG(id,arg) ev_log_write(&dsp_log, id, arg) - -static DEFINE_MUTEX(audpp_lock); -static DEFINE_MUTEX(audpp_dec_lock); - -#define CH_COUNT 5 -#define AUDPP_CLNT_MAX_COUNT 6 -#define AUDPP_AVSYNC_INFO_SIZE 7 - -#define AUDPP_SRS_PARAMS 2 -#define AUDPP_SRS_PARAMS_G 0 -#define AUDPP_SRS_PARAMS_W 1 -#define AUDPP_SRS_PARAMS_C 2 -#define AUDPP_SRS_PARAMS_H 3 -#define AUDPP_SRS_PARAMS_P 4 -#define AUDPP_SRS_PARAMS_L 5 - -#define AUDPP_CMD_CFG_OBJ_UPDATE 0x8000 -#define AUDPP_CMD_EQ_FLAG_DIS 0x0000 -#define AUDPP_CMD_EQ_FLAG_ENA -1 -#define AUDPP_CMD_IIR_FLAG_DIS 0x0000 -#define AUDPP_CMD_IIR_FLAG_ENA -1 - -#define MAX_EVENT_CALLBACK_CLIENTS 2 - -#define AUDPP_CONCURRENCY_DEFAULT 6 /* All non tunnel mode */ -#define AUDPP_MAX_DECODER_CNT 5 -#define AUDPP_CODEC_MASK 0x000000FF -#define AUDPP_MODE_MASK 0x00000F00 -#define AUDPP_OP_MASK 0xF0000000 - -struct audpp_decoder_info { - unsigned int codec; - pid_t pid; -}; - -struct audpp_state { - struct msm_adsp_module *mod; - audpp_event_func func[AUDPP_CLNT_MAX_COUNT]; - void *private[AUDPP_CLNT_MAX_COUNT]; - struct mutex *lock; - unsigned open_count; - unsigned enabled; - - /* Related to decoder allocation */ - struct mutex *lock_dec; - struct msm_adspdec_database *dec_database; - struct audpp_decoder_info dec_info_table[AUDPP_MAX_DECODER_CNT]; - unsigned dec_inuse; - unsigned long concurrency; - - /* which channels are actually enabled */ - unsigned avsync_mask; - - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[CH_COUNT * AUDPP_CLNT_MAX_COUNT + 1]; - struct audpp_event_callback *cb_tbl[MAX_EVENT_CALLBACK_CLIENTS]; - - spinlock_t avsync_lock; - - wait_queue_head_t event_wait; -}; - -struct audpp_state the_audpp_state = { - .lock = &audpp_lock, - .lock_dec = &audpp_dec_lock, -}; - -int audpp_send_queue1(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd1Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue1); - -int audpp_send_queue2(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd2Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue2); - -int audpp_send_queue3(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd3Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue3); - -static int audpp_dsp_config(int enable) -{ - audpp_cmd_cfg cmd; - - cmd.cmd_id = AUDPP_CMD_CFG; - cmd.cfg = enable ? AUDPP_CMD_CFG_ENABLE : AUDPP_CMD_CFG_SLEEP; - - return audpp_send_queue1(&cmd, sizeof(cmd)); -} - -int is_audpp_enable(void) -{ - struct audpp_state *audpp = &the_audpp_state; - - return audpp->enabled; -} -EXPORT_SYMBOL(is_audpp_enable); - -int audpp_register_event_callback(struct audpp_event_callback *ecb) -{ - struct audpp_state *audpp = &the_audpp_state; - int i; - - mutex_lock(audpp->lock); - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (NULL == audpp->cb_tbl[i]) { - audpp->cb_tbl[i] = ecb; - mutex_unlock(audpp->lock); - return 0; - } - } - mutex_unlock(audpp->lock); - return -1; -} -EXPORT_SYMBOL(audpp_register_event_callback); - -int audpp_unregister_event_callback(struct audpp_event_callback *ecb) -{ - struct audpp_state *audpp = &the_audpp_state; - int i; - - mutex_lock(audpp->lock); - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (ecb == audpp->cb_tbl[i]) { - audpp->cb_tbl[i] = NULL; - mutex_unlock(audpp->lock); - return 0; - } - } - mutex_unlock(audpp->lock); - return -1; -} -EXPORT_SYMBOL(audpp_unregister_event_callback); - -static void audpp_broadcast(struct audpp_state *audpp, unsigned id, - uint16_t *msg) -{ - unsigned n; - - if ((id != AUDPP_MSG_PP_DISABLE_FEEDBACK) && - (id != AUDPP_MSG_PP_FEATS_RE_ENABLE)) { - for (n = 0; n < AUDPP_CLNT_MAX_COUNT; n++) { - if (audpp->func[n]) - audpp->func[n] (audpp->private[n], id, msg); - } - } - - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) - if (audpp->cb_tbl[n] && audpp->cb_tbl[n]->fn) - audpp->cb_tbl[n]->fn(audpp->cb_tbl[n]->private, id, - msg); -} - -static void audpp_notify_clnt(struct audpp_state *audpp, unsigned clnt_id, - unsigned id, uint16_t *msg) -{ - if (clnt_id < AUDPP_CLNT_MAX_COUNT && audpp->func[clnt_id]) - audpp->func[clnt_id] (audpp->private[clnt_id], id, msg); -} - -static void audpp_handle_pcmdmamiss(struct audpp_state *audpp, - uint16_t bit_mask) -{ - uint8_t b_index; - - for (b_index = 0; b_index < AUDPP_CLNT_MAX_COUNT; b_index++) { - if (bit_mask & (0x1 << b_index)) - if (audpp->func[b_index]) - audpp->func[b_index] (audpp->private[b_index], - AUDPP_MSG_PCMDMAMISSED, - &bit_mask); - } -} - -static void audpp_fake_event(struct audpp_state *audpp, int id, - unsigned event, unsigned arg) -{ - uint16_t msg[1]; - msg[0] = arg; - audpp->func[id] (audpp->private[id], event, msg); -} - -static void audpp_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audpp_state *audpp = data; - unsigned long flags; - uint16_t msg[8]; - int cid = 0; - - if (id == AUDPP_MSG_AVSYNC_MSG) { - spin_lock_irqsave(&audpp->avsync_lock, flags); - getevent(audpp->avsync, sizeof(audpp->avsync)); - - /* mask off any channels we're not watching to avoid - * cases where we might get one last update after - * disabling avsync and end up in an odd state when - * we next read... - */ - audpp->avsync[0] &= audpp->avsync_mask; - spin_unlock_irqrestore(&audpp->avsync_lock, flags); - return; - } - - getevent(msg, sizeof(msg)); - - LOG(EV_EVENT, (id << 16) | msg[0]); - LOG(EV_DATA, (msg[1] << 16) | msg[2]); - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned cid = msg[0]; - MM_DBG("status %d %d %d\n", cid, msg[1], msg[2]); - if ((cid < 5) && audpp->func[cid]) - audpp->func[cid] (audpp->private[cid], id, msg); - break; - } - case AUDPP_MSG_HOST_PCM_INTF_MSG: - if (audpp->func[5]) - audpp->func[5] (audpp->private[5], id, msg); - break; - case AUDPP_MSG_PCMDMAMISSED: - audpp_handle_pcmdmamiss(audpp, msg[0]); - break; - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_INFO("ENABLE\n"); - if (!audpp->enabled) { - audpp->enabled = 1; - wake_up(&audpp->event_wait); - audpp_broadcast(audpp, id, msg); - } else { - cid = msg[1]; - audpp_fake_event(audpp, cid, - id, AUDPP_MSG_ENA_ENA); - } - - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - if (audpp->open_count == 0) { - MM_INFO("DISABLE\n"); - audpp->enabled = 0; - wake_up(&audpp->event_wait); - audpp_broadcast(audpp, id, msg); - } else { - cid = msg[1]; - audpp_fake_event(audpp, cid, - id, AUDPP_MSG_ENA_DIS); - audpp->func[cid] = NULL; - audpp->private[cid] = NULL; - } - } else { - MM_ERR("invalid config msg %d\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - audpp_notify_clnt(audpp, msg[0], id, msg); - break; - case AUDPP_MSG_FLUSH_ACK: - audpp_notify_clnt(audpp, msg[0], id, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable/disable(audpptask)"); - break; - case AUDPP_MSG_FEAT_QUERY_DM_DONE: - MM_INFO(" RTC ACK --> %x %x %x\n", msg[0],\ - msg[1], msg[2]); - acdb_rtc_set_err(msg[2]); - break; - case AUDPP_MSG_PP_DISABLE_FEEDBACK: - MM_DBG("PP Disable feedback due to mips limitation"); - audpp_broadcast(audpp, id, msg); - break; - case AUDPP_MSG_PP_FEATS_RE_ENABLE: - MM_DBG("Re-enable the disabled PP features"); - audpp_broadcast(audpp, id, msg); - break; - default: - MM_ERR("unhandled msg id %x\n", id); - } -} - -static struct msm_adsp_ops adsp_ops = { - .event = audpp_dsp_event, -}; - -int audpp_enable(int id, audpp_event_func func, void *private) -{ - struct audpp_state *audpp = &the_audpp_state; - uint16_t msg[8]; - int res = 0; - int rc; - - if (id < -1 || id > 4) - return -EINVAL; - - if (id == -1) - id = 5; - - mutex_lock(audpp->lock); - if (audpp->func[id]) { - res = -EBUSY; - goto out; - } - - audpp->func[id] = func; - audpp->private[id] = private; - - LOG(EV_ENABLE, 1); - if (audpp->open_count++ == 0) { - MM_DBG("enable\n"); - res = msm_adsp_get("AUDPPTASK", &audpp->mod, &adsp_ops, audpp); - if (res < 0) { - MM_ERR("cannot open AUDPPTASK\n"); - audpp->open_count = 0; - audpp->func[id] = NULL; - audpp->private[id] = NULL; - goto out; - } - LOG(EV_ENABLE, 2); - msm_adsp_enable(audpp->mod); - audpp_dsp_config(1); - rc = wait_event_timeout(audpp->event_wait, - (audpp->enabled == 1), - 3 * HZ); - if (rc == 0) - msm_adsp_dump(audpp->mod); - } else { - if (audpp->enabled) { - msg[0] = AUDPP_MSG_ENA_ENA; - msg[1] = id; - res = msm_adsp_generate_event(audpp, audpp->mod, - AUDPP_MSG_CFG_MSG, sizeof(msg), - sizeof(uint16_t), (void *)msg); - if (res < 0) - goto out; - } - } - - res = 0; -out: - mutex_unlock(audpp->lock); - return res; -} -EXPORT_SYMBOL(audpp_enable); - -void audpp_disable(int id, void *private) -{ - struct audpp_state *audpp = &the_audpp_state; - uint16_t msg[8]; - int rc; - - if (id < -1 || id > 4) - return; - - if (id == -1) - id = 5; - - mutex_lock(audpp->lock); - LOG(EV_DISABLE, 1); - if (!audpp->func[id]) - goto out; - if (audpp->private[id] != private) - goto out; - - msg[0] = AUDPP_MSG_ENA_DIS; - msg[1] = id; - rc = msm_adsp_generate_event(audpp, audpp->mod, - AUDPP_MSG_CFG_MSG, sizeof(msg), - sizeof(uint16_t), (void *)msg); - if (rc < 0) - goto out; - - if (--audpp->open_count == 0) { - MM_DBG("disable\n"); - LOG(EV_DISABLE, 2); - audpp_dsp_config(0); - rc = wait_event_timeout(audpp->event_wait, - (audpp->enabled == 0), - 3 * HZ); - if (audpp->enabled == 0) - MM_INFO("Received CFG_MSG_DISABLE from ADSP\n"); - else { - MM_ERR("Didn't receive CFG_MSG DISABLE \ - message from ADSP\n"); - if (rc == 0) - msm_adsp_dump(audpp->mod); - } - msm_adsp_disable(audpp->mod); - msm_adsp_put(audpp->mod); - audpp->mod = NULL; - } -out: - mutex_unlock(audpp->lock); -} -EXPORT_SYMBOL(audpp_disable); - -#define BAD_ID(id) ((id < 0) || (id >= CH_COUNT)) - -void audpp_avsync(int id, unsigned rate) -{ - unsigned long flags; - audpp_cmd_avsync cmd; - - if (BAD_ID(id)) - return; - - spin_lock_irqsave(&the_audpp_state.avsync_lock, flags); - if (rate) - the_audpp_state.avsync_mask |= (1 << id); - else - the_audpp_state.avsync_mask &= (~(1 << id)); - the_audpp_state.avsync[0] &= the_audpp_state.avsync_mask; - spin_unlock_irqrestore(&the_audpp_state.avsync_lock, flags); - - cmd.cmd_id = AUDPP_CMD_AVSYNC; - cmd.object_number = id; - cmd.interrupt_interval_lsw = rate; - cmd.interrupt_interval_msw = rate >> 16; - audpp_send_queue1(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_avsync); - -unsigned audpp_avsync_sample_count(int id) -{ - struct audpp_state *audpp = &the_audpp_state; - uint16_t *avsync = audpp->avsync; - unsigned val; - unsigned long flags; - unsigned mask; - - if (BAD_ID(id)) - return 0; - - mask = 1 << id; - id = id * AUDPP_AVSYNC_INFO_SIZE + 2; - spin_lock_irqsave(&audpp->avsync_lock, flags); - if (avsync[0] & mask) - val = (avsync[id] << 16) | avsync[id + 1]; - else - val = 0; - spin_unlock_irqrestore(&audpp->avsync_lock, flags); - - return val; -} -EXPORT_SYMBOL(audpp_avsync_sample_count); - -unsigned audpp_avsync_byte_count(int id) -{ - struct audpp_state *audpp = &the_audpp_state; - uint16_t *avsync = audpp->avsync; - unsigned val; - unsigned long flags; - unsigned mask; - - if (BAD_ID(id)) - return 0; - - mask = 1 << id; - id = id * AUDPP_AVSYNC_INFO_SIZE + 5; - spin_lock_irqsave(&audpp->avsync_lock, flags); - if (avsync[0] & mask) - val = (avsync[id] << 16) | avsync[id + 1]; - else - val = 0; - spin_unlock_irqrestore(&audpp->avsync_lock, flags); - - return val; -} -EXPORT_SYMBOL(audpp_avsync_byte_count); - -int audpp_set_volume_and_pan(unsigned id, unsigned volume, int pan) -{ - /* cmd, obj_cfg[7], cmd_type, volume, pan */ - uint16_t cmd[11]; - - if (id > 6) - return -EINVAL; - - memset(cmd, 0, sizeof(cmd)); - cmd[0] = AUDPP_CMD_CFG_OBJECT_PARAMS; - cmd[1 + id] = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd[8] = AUDPP_CMD_VOLUME_PAN; - cmd[9] = volume; - cmd[10] = pan; - - return audpp_send_queue3(cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_set_volume_and_pan); - -/* Implementation of COPP features */ -int audpp_dsp_set_mbadrc(unsigned id, unsigned enable, - audpp_cmd_cfg_object_params_mbadrc *mbadrc) -{ - audpp_cmd_cfg_object_params_mbadrc cmd; - - if (id != 6) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_MBADRC; - - if (enable) { - memcpy(&cmd.num_bands, &mbadrc->num_bands, - sizeof(*mbadrc) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2)); - cmd.enable = AUDPP_CMD_ADRC_FLAG_ENA; - } else - cmd.enable = AUDPP_CMD_ADRC_FLAG_DIS; - - /*order the writes to mbadrc */ - dma_coherent_pre_ops(); - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_mbadrc); - -int audpp_dsp_set_qconcert_plus(unsigned id, unsigned enable, - audpp_cmd_cfg_object_params_qconcert * - qconcert_plus) -{ - audpp_cmd_cfg_object_params_qconcert cmd; - if (id != 6) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_QCONCERT; - - if (enable) { - memcpy(&cmd.op_mode, &qconcert_plus->op_mode, - sizeof(audpp_cmd_cfg_object_params_qconcert) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2)); - cmd.enable_flag = AUDPP_CMD_ADRC_FLAG_ENA; - } else - cmd.enable_flag = AUDPP_CMD_ADRC_FLAG_DIS; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} - -int audpp_dsp_set_rx_iir(unsigned id, unsigned enable, - audpp_cmd_cfg_object_params_pcm *iir) -{ - audpp_cmd_cfg_object_params_pcm cmd; - - if (id != 6) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_IIR_TUNING_FILTER; - - if (enable) { - cmd.active_flag = AUDPP_CMD_IIR_FLAG_ENA; - cmd.num_bands = iir->num_bands; - memcpy(&cmd.params_filter, &iir->params_filter, - sizeof(iir->params_filter)); - } else - cmd.active_flag = AUDPP_CMD_IIR_FLAG_DIS; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_iir); - -int audpp_dsp_set_rx_srs_trumedia_g( - struct audpp_cmd_cfg_object_params_srstm_g *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_g cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_G; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_g); - -int audpp_dsp_set_rx_srs_trumedia_w( - struct audpp_cmd_cfg_object_params_srstm_w *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_w cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_W; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_w); - -int audpp_dsp_set_rx_srs_trumedia_c( - struct audpp_cmd_cfg_object_params_srstm_c *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_c cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_C; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_c); - -int audpp_dsp_set_rx_srs_trumedia_h( - struct audpp_cmd_cfg_object_params_srstm_h *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_h cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_H; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_h); - -int audpp_dsp_set_rx_srs_trumedia_p( - struct audpp_cmd_cfg_object_params_srstm_p *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_p cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_P; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_p); - -int audpp_dsp_set_rx_srs_trumedia_l( - struct audpp_cmd_cfg_object_params_srstm_l *srstm) -{ - struct audpp_cmd_cfg_object_params_srstm_l cmd; - - MM_DBG("%s\n", __func__); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_SRS_PARAMS; - cmd.common.comman_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_SRS_PARAMS_L; - - memcpy(cmd.v, srstm->v, sizeof(srstm->v)); - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_srs_trumedia_l); - -/* Implementation Of COPP + POPP */ -int audpp_dsp_set_eq(unsigned id, unsigned enable, - audpp_cmd_cfg_object_params_eqalizer *eq) -{ - audpp_cmd_cfg_object_params_eqalizer cmd; - unsigned short *id_ptr = (unsigned short *)&cmd; - - if (id > 6 || id == 5) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - id_ptr[1 + id] = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_EQUALIZER; - - if (enable) { - cmd.eq_flag = AUDPP_CMD_EQ_FLAG_ENA; - cmd.num_bands = eq->num_bands; - memcpy(&cmd.eq_coeff, &eq->eq_coeff, sizeof(eq->eq_coeff)); - } else - cmd.eq_flag = AUDPP_CMD_EQ_FLAG_DIS; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_eq); - -int audpp_dsp_set_vol_pan(unsigned id, - audpp_cmd_cfg_object_params_volume *vol_pan) -{ - audpp_cmd_cfg_object_params_volume cmd; - unsigned short *id_ptr = (unsigned short *)&cmd; - - if (id > 6) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - id_ptr[1 + id] = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_VOLUME_PAN; - - cmd.volume = vol_pan->volume; - cmd.pan = vol_pan->pan; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_vol_pan); - -int audpp_pause(unsigned id, int pause) -{ - /* pause 1 = pause 0 = resume */ - u16 pause_cmd[AUDPP_CMD_DEC_CTRL_LEN / sizeof(unsigned short)]; - - if (id >= CH_COUNT) - return -EINVAL; - - memset(pause_cmd, 0, sizeof(pause_cmd)); - - pause_cmd[0] = AUDPP_CMD_DEC_CTRL; - if (pause == 1) - pause_cmd[1 + id] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_PAUSE_V; - else if (pause == 0) - pause_cmd[1 + id] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_RESUME_V; - else - return -EINVAL; - - return audpp_send_queue1(pause_cmd, sizeof(pause_cmd)); -} -EXPORT_SYMBOL(audpp_pause); - -int audpp_flush(unsigned id) -{ - u16 flush_cmd[AUDPP_CMD_DEC_CTRL_LEN / sizeof(unsigned short)]; - - if (id >= CH_COUNT) - return -EINVAL; - - memset(flush_cmd, 0, sizeof(flush_cmd)); - - flush_cmd[0] = AUDPP_CMD_DEC_CTRL; - flush_cmd[1 + id] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_FLUSH_V; - - return audpp_send_queue1(flush_cmd, sizeof(flush_cmd)); -} -EXPORT_SYMBOL(audpp_flush); - -/* dec_attrb = 7:0, 0 - No Decoder, else supported decoder * - * like mp3, aac, wma etc ... * - * = 15:8, bit[8] = 1 - Tunnel, bit[9] = 1 - NonTunnel * - * = 31:16, reserved */ -int audpp_adec_alloc(unsigned dec_attrb, const char **module_name, - unsigned *queueid) -{ - struct audpp_state *audpp = &the_audpp_state; - int decid = -1, idx, lidx, mode, codec; - int codecs_supported, min_codecs_supported; - unsigned int *concurrency_entry; - mutex_lock(audpp->lock_dec); - /* Represents in bit mask */ - mode = ((dec_attrb & AUDPP_MODE_MASK) << 16); - codec = (1 << (dec_attrb & AUDPP_CODEC_MASK)); - /* Point to Last entry of the row */ - concurrency_entry = ((audpp->dec_database->dec_concurrency_table + - ((audpp->concurrency + 1) * - (audpp->dec_database->num_dec))) - 1); - - lidx = audpp->dec_database->num_dec; - min_codecs_supported = sizeof(unsigned int) * 8; - - MM_DBG("mode = 0x%08x codec = 0x%08x\n", mode, codec); - - for (idx = lidx; idx > 0; idx--, concurrency_entry--) { - if (!(audpp->dec_inuse & (1 << (idx - 1)))) { - if ((mode & *concurrency_entry) && - (codec & *concurrency_entry)) { - /* Check supports minimum number codecs */ - codecs_supported = - audpp->dec_database->dec_info_list[idx - - 1]. - nr_codec_support; - if (codecs_supported < min_codecs_supported) { - lidx = idx - 1; - min_codecs_supported = codecs_supported; - } - } - } - } - - if (lidx < audpp->dec_database->num_dec) { - audpp->dec_inuse |= (1 << lidx); - *module_name = - audpp->dec_database->dec_info_list[lidx].module_name; - *queueid = - audpp->dec_database->dec_info_list[lidx].module_queueid; - decid = audpp->dec_database->dec_info_list[lidx].module_decid; - audpp->dec_info_table[lidx].codec = - (dec_attrb & AUDPP_CODEC_MASK); - audpp->dec_info_table[lidx].pid = current->pid; - /* point to row to get supported operation */ - concurrency_entry = - ((audpp->dec_database->dec_concurrency_table + - ((audpp->concurrency) * (audpp->dec_database->num_dec))) + - lidx); - decid |= ((*concurrency_entry & AUDPP_OP_MASK) >> 12); - MM_INFO("decid =0x%08x module_name=%s, queueid=%d \n", - decid, *module_name, *queueid); - } - mutex_unlock(audpp->lock_dec); - return decid; - -} -EXPORT_SYMBOL(audpp_adec_alloc); - -void audpp_adec_free(int decid) -{ - struct audpp_state *audpp = &the_audpp_state; - int idx; - mutex_lock(audpp->lock_dec); - for (idx = audpp->dec_database->num_dec; idx > 0; idx--) { - if (audpp->dec_database->dec_info_list[idx - 1].module_decid == - decid) { - audpp->dec_inuse &= ~(1 << (idx - 1)); - audpp->dec_info_table[idx - 1].codec = -1; - audpp->dec_info_table[idx - 1].pid = 0; - MM_INFO("free decid =%d \n", decid); - break; - } - } - mutex_unlock(audpp->lock_dec); - return; - -} -EXPORT_SYMBOL(audpp_adec_free); - -static ssize_t concurrency_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct audpp_state *audpp = &the_audpp_state; - int rc; - mutex_lock(audpp->lock_dec); - rc = sprintf(buf, "%ld\n", audpp->concurrency); - mutex_unlock(audpp->lock_dec); - return rc; -} - -static ssize_t concurrency_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct audpp_state *audpp = &the_audpp_state; - unsigned long concurrency; - int rc = -1; - mutex_lock(audpp->lock_dec); - if (audpp->dec_inuse) { - MM_ERR("Can not change profile, while playback in progress\n"); - goto done; - } - rc = strict_strtoul(buf, 10, &concurrency); - if (!rc && - (concurrency < audpp->dec_database->num_concurrency_support)) { - audpp->concurrency = concurrency; - MM_DBG("Concurrency case %ld\n", audpp->concurrency); - rc = count; - } else { - MM_ERR("Not a valid Concurrency case\n"); - rc = -EINVAL; - } -done: - mutex_unlock(audpp->lock_dec); - return rc; -} - -static ssize_t decoder_info_show(struct device *dev, - struct device_attribute *attr, char *buf); -static struct device_attribute dev_attr_decoder[AUDPP_MAX_DECODER_CNT] = { - __ATTR(decoder0, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder1, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder2, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder3, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder4, S_IRUGO, decoder_info_show, NULL), -}; - -static ssize_t decoder_info_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int cpy_sz = 0; - struct audpp_state *audpp = &the_audpp_state; - const ptrdiff_t off = attr - dev_attr_decoder; /* decoder number */ - mutex_lock(audpp->lock_dec); - cpy_sz += scnprintf(buf + cpy_sz, PAGE_SIZE - cpy_sz, "%d:", - audpp->dec_info_table[off].codec); - cpy_sz += scnprintf(buf + cpy_sz, PAGE_SIZE - cpy_sz, "%d\n", - audpp->dec_info_table[off].pid); - mutex_unlock(audpp->lock_dec); - return cpy_sz; -} - -static DEVICE_ATTR(concurrency, S_IWUSR | S_IRUGO, concurrency_show, - concurrency_store); -static int audpp_probe(struct platform_device *pdev) -{ - int rc, idx; - struct audpp_state *audpp = &the_audpp_state; - audpp->concurrency = AUDPP_CONCURRENCY_DEFAULT; - audpp->dec_database = - (struct msm_adspdec_database *)pdev->dev.platform_data; - - MM_INFO("Number of decoder supported %d\n", - audpp->dec_database->num_dec); - MM_INFO("Number of concurrency supported %d\n", - audpp->dec_database->num_concurrency_support); - - init_waitqueue_head(&audpp->event_wait); - - spin_lock_init(&audpp->avsync_lock); - - for (idx = 0; idx < audpp->dec_database->num_dec; idx++) { - audpp->dec_info_table[idx].codec = -1; - audpp->dec_info_table[idx].pid = 0; - MM_INFO("module_name:%s\n", - audpp->dec_database->dec_info_list[idx].module_name); - MM_INFO("queueid:%d\n", - audpp->dec_database->dec_info_list[idx].module_queueid); - MM_INFO("decid:%d\n", - audpp->dec_database->dec_info_list[idx].module_decid); - MM_INFO("nr_codec_support:%d\n", - audpp->dec_database->dec_info_list[idx]. - nr_codec_support); - } - - for (idx = 0; idx < audpp->dec_database->num_dec; idx++) { - rc = device_create_file(&pdev->dev, &dev_attr_decoder[idx]); - if (rc) - goto err; - } - rc = device_create_file(&pdev->dev, &dev_attr_concurrency); - if (rc) - goto err; - else - goto done; -err: - while (idx--) - device_remove_file(&pdev->dev, &dev_attr_decoder[idx]); -done: - return rc; -} - -static struct platform_driver audpp_plat_driver = { - .probe = audpp_probe, - .driver = { - .name = "msm_adspdec", - .owner = THIS_MODULE, - }, -}; - -static int __init audpp_init(void) -{ - return platform_driver_register(&audpp_plat_driver); -} - -device_initcall(audpp_init); diff --git a/arch/arm/mach-msm/qdsp5/audpreproc.c b/arch/arm/mach-msm/qdsp5/audpreproc.c deleted file mode 100644 index 45d91536eaa3..000000000000 --- a/arch/arm/mach-msm/qdsp5/audpreproc.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Common code to deal with the AUDPREPROC dsp task (audio preprocessing) - * - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * Based on the audpp layer in arch/arm/mach-msm/qdsp5/audpp.c - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -static DEFINE_MUTEX(audpreproc_lock); - -struct msm_adspenc_info { - const char *module_name; - unsigned module_queueids; - int module_encid; /* streamid */ - int enc_formats; /* supported formats */ - int nr_codec_support; /* number of codec suported */ -}; - -#define ENC_MODULE_INFO(name, queueids, encid, formats, nr_codec) \ - {.module_name = name, .module_queueids = queueids, \ - .module_encid = encid, .enc_formats = formats, \ - .nr_codec_support = nr_codec } - -#ifdef CONFIG_MSM7X27A_AUDIO -#define ENC0_FORMAT ((1<func[0]) - audpreproc->func[0]( - audpreproc->private[0], id, - &msg); - break; - case AUDPREPROC_MSG_ERROR_MSG_ID: - MM_INFO("err_index %d\n", msg[0]); - if (audpreproc->func[0]) - audpreproc->func[0]( - audpreproc->private[0], id, - &msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audpreproctask)\n"); - if (audpreproc->func[0]) - audpreproc->func[0]( - audpreproc->private[0], id, - &msg); - break; - case AUDPREPROC_MSG_FEAT_QUERY_DM_DONE: - { - uint16_t msg[3]; - getevent(msg, sizeof(msg)); - MM_INFO("RTC ACK --> %x %x %x\n", msg[0], msg[1], msg[2]); - acdb_rtc_set_err(msg[2]); - } - break; - default: - MM_ERR("unknown event %d\n", id); - } - return; -} - -static struct msm_adsp_ops adsp_ops = { - .event = audpreproc_dsp_event, -}; - -/* EXPORTED API's */ -int audpreproc_enable(int enc_id, audpreproc_event_func func, void *private) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int res = 0; - uint16_t msg[2]; - int n = 0; - MM_DBG("audpreproc_enable %d\n", enc_id); - - if (enc_id < 0 || enc_id > (MAX_ENC_COUNT - 1)) - return -EINVAL; - - mutex_lock(audpreproc->lock); - if (audpreproc->func[enc_id]) { - res = -EBUSY; - goto out; - } - - audpreproc->func[enc_id] = func; - audpreproc->private[enc_id] = private; - - /* First client to enable preproc task */ - if (audpreproc->open_count++ == 0) { - MM_DBG("Get AUDPREPROCTASK\n"); - res = msm_adsp_get("AUDPREPROCTASK", &audpreproc->mod, - &adsp_ops, audpreproc); - if (res < 0) { - MM_ERR("Can not get AUDPREPROCTASK\n"); - audpreproc->open_count = 0; - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - goto out; - } - if (msm_adsp_enable(audpreproc->mod)) { - audpreproc->open_count = 0; - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - msm_adsp_put(audpreproc->mod); - audpreproc->mod = NULL; - res = -ENODEV; - goto out; - } - } - msg[0] = AUDPREPROC_MSG_STATUS_FLAG_ENA; - /* Generate audpre enabled message for registered clients */ - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) { - if (audpreproc->cb_tbl[n] && - audpreproc->cb_tbl[n]->fn) { - audpreproc->cb_tbl[n]->fn( \ - audpreproc->cb_tbl[n]->private,\ - AUDPREPROC_MSG_CMD_CFG_DONE_MSG, - (void *) &msg); - } - } - res = 0; -out: - mutex_unlock(audpreproc->lock); - return res; -} -EXPORT_SYMBOL(audpreproc_enable); - - -void audpreproc_disable(int enc_id, void *private) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - uint16_t msg[2]; - int n = 0; - - if (enc_id < 0 || enc_id > (MAX_ENC_COUNT - 1)) - return; - - mutex_lock(audpreproc->lock); - if (!audpreproc->func[enc_id]) - goto out; - if (audpreproc->private[enc_id] != private) - goto out; - - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - - /* Last client then disable preproc task */ - if (--audpreproc->open_count == 0) { - msm_adsp_disable(audpreproc->mod); - MM_DBG("Put AUDPREPROCTASK\n"); - msm_adsp_put(audpreproc->mod); - audpreproc->mod = NULL; - } - msg[0] = AUDPREPROC_MSG_STATUS_FLAG_DIS; - /* Generate audpre enabled message for registered clients */ - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) { - if (audpreproc->cb_tbl[n] && - audpreproc->cb_tbl[n]->fn) { - audpreproc->cb_tbl[n]->fn( \ - audpreproc->cb_tbl[n]->private,\ - AUDPREPROC_MSG_CMD_CFG_DONE_MSG, - (void *) &msg); - } - } -out: - mutex_unlock(audpreproc->lock); - return; -} -EXPORT_SYMBOL(audpreproc_disable); - -int audpreproc_update_audrec_info( - struct audrec_session_info *audrec_session_info) -{ - if (!audrec_session_info) { - MM_ERR("error in audrec session info address\n"); - return -EINVAL; - } - if (audrec_session_info->session_id < MAX_ENC_COUNT) { - memcpy(&session_info, - audrec_session_info, - sizeof(struct audrec_session_info)); - return 0; - } - return -EINVAL; -} -EXPORT_SYMBOL(audpreproc_update_audrec_info); - -int get_audrec_session_info(struct audrec_session_info *info) -{ - if (!info) { - MM_ERR("error in audrec session info address\n"); - return -EINVAL; - } - - if (the_audpreproc_state.open_count == 0) { - MM_ERR("No aud pre session active\n"); - return -EINVAL; - } - - memcpy(info, &session_info, sizeof(struct audrec_session_info)); - - return 0; -} -EXPORT_SYMBOL(get_audrec_session_info); - -int audpreproc_register_event_callback(struct audpreproc_event_callback *ecb) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (NULL == audpreproc->cb_tbl[i]) { - audpreproc->cb_tbl[i] = ecb; - return 0; - } - } - return -EINVAL; -} -EXPORT_SYMBOL(audpreproc_register_event_callback); - -int audpreproc_unregister_event_callback(struct audpreproc_event_callback *ecb) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (ecb == audpreproc->cb_tbl[i]) { - audpreproc->cb_tbl[i] = NULL; - return 0; - } - } - return -EINVAL; -} -/* enc_type = supported encode format * - * like pcm, aac, sbc, evrc, qcelp, amrnb etc ... * - */ -int audpreproc_aenc_alloc(unsigned enc_type, const char **module_name, - unsigned *queue_ids) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int encid = -1, idx, lidx, mode, codec; - int codecs_supported, min_codecs_supported; - - mutex_lock(audpreproc->lock); - /* Represents in bit mask */ - mode = ((enc_type & AUDPREPROC_MODE_MASK) << 16); - codec = (1 << (enc_type & AUDPREPROC_CODEC_MASK)); - - lidx = msm_enc_database.num_enc; - min_codecs_supported = sizeof(unsigned int) * 8; - MM_DBG("mode = 0x%08x codec = 0x%08x\n", mode, codec); - - for (idx = lidx-1; idx >= 0; idx--) { - /* encoder free and supports the format */ - if (!(audpreproc->enc_inuse & (1 << (idx))) && - ((mode & msm_enc_database.enc_info_list[idx].enc_formats) - == mode) && ((codec & - msm_enc_database.enc_info_list[idx].enc_formats) - == codec)){ - /* Check supports minimum number codecs */ - codecs_supported = - msm_enc_database.enc_info_list[idx].nr_codec_support; - if (codecs_supported < min_codecs_supported) { - lidx = idx; - min_codecs_supported = codecs_supported; - } - } - } - - if (lidx < msm_enc_database.num_enc) { - audpreproc->enc_inuse |= (1 << lidx); - *module_name = - msm_enc_database.enc_info_list[lidx].module_name; - *queue_ids = - msm_enc_database.enc_info_list[lidx].module_queueids; - encid = msm_enc_database.enc_info_list[lidx].module_encid; - } - - mutex_unlock(audpreproc->lock); - return encid; -} -EXPORT_SYMBOL(audpreproc_aenc_alloc); - -void audpreproc_aenc_free(int enc_id) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int idx; - - mutex_lock(audpreproc->lock); - for (idx = 0; idx < msm_enc_database.num_enc; idx++) { - if (msm_enc_database.enc_info_list[idx].module_encid == - enc_id) { - audpreproc->enc_inuse &= ~(1 << idx); - break; - } - } - mutex_unlock(audpreproc->lock); - return; - -} -EXPORT_SYMBOL(audpreproc_aenc_free); - -int audpreproc_dsp_set_agc( - audpreproc_cmd_cfg_agc_params *agc_cfg, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, agc_cfg, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_agc); - -int audpreproc_dsp_set_ns( - audpreproc_cmd_cfg_ns_params *ns_cfg, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, ns_cfg, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_ns); - -int audpreproc_dsp_set_iir( - audpreproc_cmd_cfg_iir_tuning_filter_params *iir_cfg, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, iir_cfg, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_iir); - -int audpreproc_send_preproccmdqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, cmd, len); -} -EXPORT_SYMBOL(audpreproc_send_preproccmdqueue); diff --git a/arch/arm/mach-msm/qdsp5/audrec.c b/arch/arm/mach-msm/qdsp5/audrec.c deleted file mode 100644 index 0f34518f3212..000000000000 --- a/arch/arm/mach-msm/qdsp5/audrec.c +++ /dev/null @@ -1,273 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audrec.c - * - * common code to deal with the AUDREC dsp task (audio recording) - * - * Copyright (c) 2009,2012 The Linux Foundation. All rights reserved. - * - * Based on the audpp layer in arch/arm/mach-msm/qdsp5/audpp.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - * - */ - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "audmgr.h" -#include - -static DEFINE_MUTEX(audrec_lock); - -#define MAX_ENC_COUNT 8 /* Max encoder supported */ - -#define ENC_SESSION_FREE 0 -#define ENC_SESSION_ACTIVE 1 - -struct enc_session { - unsigned enc_type; /* Param to identify type of encoder */ - unsigned audrec_obj_idx; /* Param to identify REC_OBJ or Session ID */ - audrec_event_func event_func; /* Event Call back - routine for the encoder */ - void *private; /* private data element passed as - part of Event Call back routine */ - unsigned state; /* Current state of the encoder session , - free, active*/ -}; - -struct audrec_state { - struct msm_adsp_module *audrec_mod; - struct enc_session enc_session[MAX_ENC_COUNT]; - struct mutex *lock; - unsigned enc_count; -}; - -struct audrec_state the_audrec_state = { - .lock = &audrec_lock, -}; - -int audrectask_send_cmdqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audrec_state.audrec_mod, - QDSP_uPAudRecCmdQueue, cmd, len); -} -EXPORT_SYMBOL(audrectask_send_cmdqueue); - -int audrectask_send_bitstreamqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audrec_state.audrec_mod, - QDSP_uPAudRecBitStreamQueue, cmd, len); -} -EXPORT_SYMBOL(audrectask_send_bitstreamqueue); - -static void audrectask_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audrec_state *audrec = data; - int cnt; - uint16_t msg[5]; /* Max size of message */ - getevent(msg, len); - - switch (id) { - case AUDREC_MSG_CMD_CFG_DONE_MSG: { - MM_DBG("CMD CFG DONE %x\n", msg[1]); - if (msg[0] & AUDREC_MSG_CFG_DONE_ENC_ENA) { - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].enc_type == - (msg[0] & AUDREC_CMD_ENC_TYPE_MASK)) { - audrec->enc_session[cnt].audrec_obj_idx - = msg[1]; - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, - msg); - break; - } - } - } else { - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].enc_type == - (msg[0] & AUDREC_CMD_ENC_TYPE_MASK)) { - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, - msg); - audrec->enc_session[cnt].audrec_obj_idx - = 0xFFFFFFFF; - audrec->enc_session[cnt].state - = ENC_SESSION_FREE; - audrec->enc_session[cnt].enc_type - = 0xFFFFFFFF; - audrec->enc_session[cnt].event_func - = NULL; - audrec->enc_session[cnt].private - = NULL; - break; - } - } - } - break; - } - case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: { - MM_DBG("CMD AREC MEM CFG DONE %x\n", msg[0]); - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].audrec_obj_idx == - msg[0]) { - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, msg); - break; - } - } - break; - } - case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD AREC PARAM CFG DONE %x\n", msg[0]); - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].audrec_obj_idx == - msg[0]) { - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, msg); - break; - } - } - break; - } - case AUDREC_MSG_PACKET_READY_MSG: { - MM_DBG("PCK READY %x\n", msg[0]); - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].audrec_obj_idx == - msg[0]) { - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, msg); - break; - } - } - break; - } - case AUDREC_MSG_FATAL_ERR_MSG: { - MM_ERR("ERROR %x\n", msg[0]); - if (msg[1] & AUDREC_MSG_FATAL_ERR_TYPE_0) { - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].audrec_obj_idx == - msg[0]) { - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, - msg); - break; - } - } - } else if (msg[1] & AUDREC_MSG_FATAL_ERR_TYPE_1) { - cnt = audrec->enc_count-1; - if (audrec->enc_session[cnt].event_func) - audrec->enc_session[cnt].event_func( - audrec->enc_session[cnt].private, id, - msg); - } - break; - } - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module \ - enable/disable(audrectask)\n"); - break; - default: - MM_ERR("unknown event %d\n", id); - } -} - -static struct msm_adsp_ops adsp_ops = { - .event = audrectask_dsp_event, -}; - -int audrectask_enable(unsigned enc_type, audrec_event_func func, void *private) -{ - struct audrec_state *audrec = &the_audrec_state; - int cnt, rc = 0; - - mutex_lock(audrec->lock); - - if (audrec->enc_count++ == 0) { - MM_DBG("enable\n"); - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].state == - ENC_SESSION_FREE) { - audrec->enc_session[cnt].state = - ENC_SESSION_ACTIVE; - audrec->enc_session[cnt].enc_type = enc_type; - audrec->enc_session[cnt].event_func = func; - audrec->enc_session[cnt].private = private; - break; - } - } - rc = msm_adsp_get("AUDRECTASK", &audrec->audrec_mod, &adsp_ops, - audrec); - if (rc < 0) { - MM_ERR("cannot open AUDRECTASK\n"); - audrec->enc_count = 0; - audrec->enc_session[cnt].state = ENC_SESSION_FREE; - audrec->enc_session[cnt].enc_type = 0xFFFFFFFF; - audrec->enc_session[cnt].event_func = NULL; - audrec->enc_session[cnt].private = NULL; - goto out; - } - msm_adsp_enable(audrec->audrec_mod); - } else { - for (cnt = 0; cnt < MAX_ENC_COUNT ; cnt++) { - if (audrec->enc_session[cnt].state == - ENC_SESSION_FREE) { - audrec->enc_session[cnt].state = - ENC_SESSION_ACTIVE; - audrec->enc_session[cnt].enc_type = enc_type; - audrec->enc_session[cnt].event_func = func; - audrec->enc_session[cnt].private = private; - break; - } - } - } - if (cnt == MAX_ENC_COUNT) - rc = -EBUSY; - else - rc = 0; - -out: - mutex_unlock(audrec->lock); - return rc; -} -EXPORT_SYMBOL(audrectask_enable); - -void audrectask_disable(unsigned enc_type, void *private) -{ - struct audrec_state *audrec = &the_audrec_state; - - mutex_lock(audrec->lock); - - if (--audrec->enc_count == 0) { - MM_DBG("\n"); /* Macro prints the file name and function */ - msm_adsp_disable(audrec->audrec_mod); - msm_adsp_put(audrec->audrec_mod); - audrec->audrec_mod = NULL; - } - - mutex_unlock(audrec->lock); -} -EXPORT_SYMBOL(audrectask_disable); - diff --git a/arch/arm/mach-msm/qdsp5/dsp_debug.c b/arch/arm/mach-msm/qdsp5/dsp_debug.c deleted file mode 100644 index 6e73a60a5492..000000000000 --- a/arch/arm/mach-msm/qdsp5/dsp_debug.c +++ /dev/null @@ -1,235 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "dsp_debug.h" - -static wait_queue_head_t dsp_wait; -static int dsp_has_crashed; -static int dsp_wait_count; - -static atomic_t dsp_crash_count = ATOMIC_INIT(0); -static dsp_state_cb cb_ptr; - -#define MAX_LEN 64 -#define HDR_LEN 20 -#define NUM_DSP_RAM_BANKS 3 - -static char l_buf[MAX_LEN]; -#ifdef CONFIG_DEBUG_FS -static struct dentry *dsp_dentry; -#endif - -void q5audio_dsp_not_responding(void) -{ - if (cb_ptr) - cb_ptr(DSP_STATE_CRASHED); - - MM_DBG("entered q5audio_dsp_not_responding\n"); - if (atomic_add_return(1, &dsp_crash_count) != 1) { - MM_ERR("q5audio_dsp_not_responding() \ - - parking additional crasher...\n"); - for (;;) - msleep(1000); - } - if (dsp_wait_count) { - dsp_has_crashed = 1; - wake_up(&dsp_wait); - - while (dsp_has_crashed != 2) - wait_event(dsp_wait, dsp_has_crashed == 2); - } else { - MM_ERR("q5audio_dsp_not_responding() - no waiter?\n"); - } - - if (cb_ptr) - cb_ptr(DSP_STATE_CRASH_DUMP_DONE); -} - -static int dsp_open(struct inode *inode, struct file *file) -{ - return 0; -} - -static ssize_t dsp_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - char cmd[32]; - - if (count >= sizeof(cmd)) - return -EINVAL; - if (copy_from_user(cmd, buf, count)) - return -EFAULT; - cmd[count] = 0; - - if ((count > 1) && (cmd[count-1] == '\n')) - cmd[count-1] = 0; - - if (!strncmp(cmd, "wait-for-crash", sizeof("wait-for-crash"))) { - while (!dsp_has_crashed) { - int res; - dsp_wait_count++; - res = wait_event_interruptible(dsp_wait, - dsp_has_crashed); - if (res < 0) { - dsp_wait_count--; - return res; - } - } - } else if (!strncmp(cmd, "boom", sizeof("boom"))) { - q5audio_dsp_not_responding(); - } else if (!strncmp(cmd, "continue-crash", sizeof("continue-crash"))) { - dsp_has_crashed = 2; - wake_up(&dsp_wait); - } else { - MM_ERR("[%s:%s] unknown dsp_debug command: %s\n", __MM_FILE__, - __func__, cmd); - } - - return count; -} - -static ssize_t dsp_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - size_t actual = 0; - static void *dsp_addr; - static unsigned copy_ok_count; - - MM_INFO("pos = %lld\n", *pos); - if (*pos >= DSP_RAM_SIZE * NUM_DSP_RAM_BANKS) - return 0; - - if (*pos == 0) - dsp_addr = (*pos + RAMA_BASE); - else if (*pos == DSP_RAM_SIZE) - dsp_addr = RAMB_BASE; - else if (*pos >= DSP_RAM_SIZE * 2) - dsp_addr = RAMC_BASE; - - MM_INFO("dsp_addr = %p\n", dsp_addr); - while (count >= PAGE_SIZE) { - if (copy_to_user(buf, dsp_addr, PAGE_SIZE)) { - MM_ERR("[%s:%s] copy error @ %p\n", __MM_FILE__, - __func__, buf); - return -EFAULT; - } - copy_ok_count += PAGE_SIZE; - dsp_addr = (char *)dsp_addr + PAGE_SIZE; - buf += PAGE_SIZE; - actual += PAGE_SIZE; - count -= PAGE_SIZE; - } - - *pos += actual; - return actual; -} - -static int dsp_release(struct inode *inode, struct file *file) -{ - return 0; -} - -int dsp_debug_register(dsp_state_cb ptr) -{ - if (ptr == NULL) - return -EINVAL; - - cb_ptr = ptr; - - return 0; -} - -static const struct file_operations dsp_fops = { - .owner = THIS_MODULE, - .open = dsp_open, - .read = dsp_read, - .write = dsp_write, - .release = dsp_release, -}; - -#ifdef CONFIG_DEBUG_FS -static struct miscdevice dsp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "dsp_debug", - .fops = &dsp_fops, -}; -#endif - -static ssize_t dsp_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_DBG("adsp debugfs opened\n"); - return 0; -} - -static ssize_t dsp_debug_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int len; - - if (count < 0) - return 0; - len = count > (MAX_LEN - 1) ? (MAX_LEN - 1) : count; - if (copy_from_user(l_buf + HDR_LEN, buf, len)) { - MM_ERR("Unable to copy data from user space\n"); - return -EFAULT; - } - l_buf[len + HDR_LEN] = 0; - if (l_buf[len + HDR_LEN - 1] == '\n') { - l_buf[len + HDR_LEN - 1] = 0; - len--; - } - if (!strncmp(l_buf + HDR_LEN, "boom", 64)) { - q5audio_dsp_not_responding(); - } else if (!strncmp(l_buf + HDR_LEN, "continue-crash", - sizeof("continue-crash"))) { - dsp_has_crashed = 2; - wake_up(&dsp_wait); - } else - MM_ERR("Unknown command\n"); - - return count; -} -static const struct file_operations dsp_debug_fops = { - .write = dsp_debug_write, - .open = dsp_debug_open, -}; - -static int __init dsp_init(void) -{ - init_waitqueue_head(&dsp_wait); -#ifdef CONFIG_DEBUG_FS - dsp_dentry = debugfs_create_file("dsp_debug", S_IFREG | S_IRUGO, - NULL, (void *) NULL, &dsp_debug_fops); - - return misc_register(&dsp_misc); -#else - return 0; -#endif /* CONFIG_DEBUG_FS */ -} - -device_initcall(dsp_init); diff --git a/arch/arm/mach-msm/qdsp5/dsp_debug.h b/arch/arm/mach-msm/qdsp5/dsp_debug.h deleted file mode 100644 index 15c14caf2029..000000000000 --- a/arch/arm/mach-msm/qdsp5/dsp_debug.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __DSP_DEBUG_H_ -#define __DSP_DEBUG_H_ - -typedef int (*dsp_state_cb)(int state); -int dsp_debug_register(dsp_state_cb ptr); - -#define DSP_STATE_CRASHED 0x0 -#define DSP_STATE_CRASH_DUMP_DONE 0x1 - -#define RAMA_BASE MSM_AD5_BASE -#define RAMB_BASE ((RAMA_BASE) + (0x200000)) -#define RAMC_BASE ((RAMB_BASE) + (0x200000)) -#define DSP_RAM_SIZE 0x40000 - -#endif diff --git a/arch/arm/mach-msm/qdsp5/evlog.h b/arch/arm/mach-msm/qdsp5/evlog.h deleted file mode 100644 index 1f0f16bada25..000000000000 --- a/arch/arm/mach-msm/qdsp5/evlog.h +++ /dev/null @@ -1,125 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/evlog.h - * - * simple event log debugging facility - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#define EV_LOG_ENTRY_NAME(n) n##_entry - -#define DECLARE_LOG(_name, _size, _str) \ -static struct ev_entry EV_LOG_ENTRY_NAME(_name)[_size]; \ -static struct ev_log _name = { \ - .name = #_name, \ - .strings = _str, \ - .num_strings = ARRAY_SIZE(_str), \ - .entry = EV_LOG_ENTRY_NAME(_name), \ - .max = ARRAY_SIZE(EV_LOG_ENTRY_NAME(_name)), \ -} - -struct ev_entry { - struct timespec when; - uint32_t id; - uint32_t arg; -}; - -struct ev_log { - struct ev_entry *entry; - unsigned max; - unsigned next; - unsigned fault; - const char **strings; - unsigned num_strings; - const char *name; -}; - -static char ev_buf[4096]; - -static ssize_t ev_log_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - struct ev_log *log = file->private_data; - struct ev_entry *entry; - unsigned long flags; - int size = 0; - unsigned n, id, max; - struct timespec now, t; - - max = log->max; - getnstimeofday(&now); - local_irq_save(flags); - n = (log->next - 1) & (max - 1); - entry = log->entry; - while (n != log->next) { - t = timespec_sub(now, entry[n].when); - id = entry[n].id; - if (id) { - const char *str; - if (id < log->num_strings) - str = log->strings[id]; - else - str = "UNKNOWN"; - size += scnprintf(ev_buf + size, 4096 - size, - "%lu.%03lu %08x %s\n", - t.tv_sec, t.tv_nsec / 1000000, - entry[n].arg, str); - } - n = (n - 1) & (max - 1); - } - log->fault = 0; - local_irq_restore(flags); - return simple_read_from_buffer(buf, count, ppos, ev_buf, size); -} - -static void ev_log_write(struct ev_log *log, unsigned id, unsigned arg) -{ - struct ev_entry *entry; - unsigned long flags; - local_irq_save(flags); - - if (log->fault) { - if (log->fault == 1) - goto done; - log->fault--; - } - - entry = log->entry + log->next; - getnstimeofday(&entry->when); - entry->id = id; - entry->arg = arg; - log->next = (log->next + 1) & (log->max - 1); -done: - local_irq_restore(flags); -} - -static int ev_log_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static const struct file_operations ev_log_ops = { - .read = ev_log_read, - .open = ev_log_open, -}; - -static int ev_log_init(struct ev_log *log) -{ - debugfs_create_file(log->name, 0444, 0, log, &ev_log_ops); - return 0; -} - diff --git a/arch/arm/mach-msm/qdsp5/snd.c b/arch/arm/mach-msm/qdsp5/snd.c deleted file mode 100644 index 3f379dcd2703..000000000000 --- a/arch/arm/mach-msm/qdsp5/snd.c +++ /dev/null @@ -1,675 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/snd.c - * - * interface to "snd" service on the baseband cpu - * - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct snd_ctxt { - struct mutex lock; - int opened; - struct msm_rpc_endpoint *ept; - struct msm_snd_endpoints *snd_epts; -}; - -struct snd_sys_ctxt { - struct mutex lock; - struct msm_rpc_endpoint *ept; -}; - -static struct snd_sys_ctxt the_snd_sys; - -static struct snd_ctxt the_snd; - -#define RPC_SND_PROG 0x30000002 -#define RPC_SND_CB_PROG 0x31000002 - -#define RPC_SND_VERS 0x00020001 -#define RPC_SND_VERS2 0x00030001 - -#define SND_SET_DEVICE_PROC 2 -#define SND_SET_VOLUME_PROC 3 -#define SND_AVC_CTL_PROC 29 -#define SND_AGC_CTL_PROC 30 - -struct rpc_snd_set_device_args { - uint32_t device; - uint32_t ear_mute; - uint32_t mic_mute; - - uint32_t cb_func; - uint32_t client_data; -}; - -struct rpc_snd_set_volume_args { - uint32_t device; - uint32_t method; - uint32_t volume; - - uint32_t cb_func; - uint32_t client_data; -}; - -struct rpc_snd_avc_ctl_args { - uint32_t avc_ctl; - uint32_t cb_func; - uint32_t client_data; -}; - -struct rpc_snd_agc_ctl_args { - uint32_t agc_ctl; - uint32_t cb_func; - uint32_t client_data; -}; - -struct snd_set_device_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_set_device_args args; -}; - -struct snd_set_volume_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_set_volume_args args; -}; - -struct snd_avc_ctl_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_avc_ctl_args args; -}; - -struct snd_agc_ctl_msg { - struct rpc_request_hdr hdr; - struct rpc_snd_agc_ctl_args args; -}; - -struct snd_endpoint *get_snd_endpoints(int *size); - -static inline int check_mute(int mute) -{ - return (mute == SND_MUTE_MUTED || - mute == SND_MUTE_UNMUTED) ? 0 : -EINVAL; -} - -static int get_endpoint(struct snd_ctxt *snd, unsigned long arg) -{ - int rc = 0, index; - struct msm_snd_endpoint ept; - - if (copy_from_user(&ept, (void __user *)arg, sizeof(ept))) { - MM_ERR("snd_ioctl get endpoint: invalid read pointer\n"); - return -EFAULT; - } - - index = ept.id; - if (index < 0 || index >= snd->snd_epts->num) { - MM_ERR("snd_ioctl get endpoint: invalid index!\n"); - return -EINVAL; - } - - ept.id = snd->snd_epts->endpoints[index].id; - strncpy(ept.name, - snd->snd_epts->endpoints[index].name, - sizeof(ept.name)); - - if (copy_to_user((void __user *)arg, &ept, sizeof(ept))) { - MM_ERR("snd_ioctl get endpoint: invalid write pointer\n"); - rc = -EFAULT; - } - - return rc; -} - -static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct snd_set_device_msg dmsg; - struct snd_set_volume_msg vmsg; - struct snd_avc_ctl_msg avc_msg; - struct snd_agc_ctl_msg agc_msg; - - struct msm_snd_device_config dev; - struct msm_snd_volume_config vol; - struct snd_ctxt *snd = file->private_data; - int rc = 0; - - uint32_t avc, agc; - - mutex_lock(&snd->lock); - switch (cmd) { - case SND_SET_DEVICE: - if (copy_from_user(&dev, (void __user *) arg, sizeof(dev))) { - MM_ERR("set device: invalid pointer\n"); - rc = -EFAULT; - break; - } - - dmsg.args.device = cpu_to_be32(dev.device); - dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute); - dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute); - if (check_mute(dev.ear_mute) < 0 || - check_mute(dev.mic_mute) < 0) { - MM_ERR("set device: invalid mute status\n"); - rc = -EINVAL; - break; - } - dmsg.args.cb_func = -1; - dmsg.args.client_data = 0; - - MM_INFO("snd_set_device %d %d %d\n", dev.device, - dev.ear_mute, dev.mic_mute); - - rc = msm_rpc_call(snd->ept, - SND_SET_DEVICE_PROC, - &dmsg, sizeof(dmsg), 5 * HZ); - break; - - case SND_SET_VOLUME: - if (copy_from_user(&vol, (void __user *) arg, sizeof(vol))) { - MM_ERR("set volume: invalid pointer\n"); - rc = -EFAULT; - break; - } - - vmsg.args.device = cpu_to_be32(vol.device); - vmsg.args.method = cpu_to_be32(vol.method); - if (vol.method != SND_METHOD_VOICE) { - MM_ERR("set volume: invalid method\n"); - rc = -EINVAL; - break; - } - - vmsg.args.volume = cpu_to_be32(vol.volume); - vmsg.args.cb_func = -1; - vmsg.args.client_data = 0; - - MM_INFO("snd_set_volume %d %d %d\n", vol.device, - vol.method, vol.volume); - - rc = msm_rpc_call(snd->ept, - SND_SET_VOLUME_PROC, - &vmsg, sizeof(vmsg), 5 * HZ); - break; - - case SND_AVC_CTL: - if (get_user(avc, (uint32_t __user *) arg)) { - rc = -EFAULT; - break; - } else if ((avc != 1) && (avc != 0)) { - rc = -EINVAL; - break; - } - - avc_msg.args.avc_ctl = cpu_to_be32(avc); - avc_msg.args.cb_func = -1; - avc_msg.args.client_data = 0; - - MM_INFO("snd_avc_ctl %d\n", avc); - - rc = msm_rpc_call(snd->ept, - SND_AVC_CTL_PROC, - &avc_msg, sizeof(avc_msg), 5 * HZ); - break; - - case SND_AGC_CTL: - if (get_user(agc, (uint32_t __user *) arg)) { - rc = -EFAULT; - break; - } else if ((agc != 1) && (agc != 0)) { - rc = -EINVAL; - break; - } - agc_msg.args.agc_ctl = cpu_to_be32(agc); - agc_msg.args.cb_func = -1; - agc_msg.args.client_data = 0; - - MM_INFO("snd_agc_ctl %d\n", agc); - - rc = msm_rpc_call(snd->ept, - SND_AGC_CTL_PROC, - &agc_msg, sizeof(agc_msg), 5 * HZ); - break; - - case SND_GET_NUM_ENDPOINTS: - if (copy_to_user((void __user *)arg, - &snd->snd_epts->num, sizeof(unsigned))) { - MM_ERR("get endpoint: invalid pointer\n"); - rc = -EFAULT; - } - break; - - case SND_GET_ENDPOINT: - rc = get_endpoint(snd, arg); - break; - - default: - MM_ERR("unknown command\n"); - rc = -EINVAL; - break; - } - mutex_unlock(&snd->lock); - - return rc; -} - -static int snd_release(struct inode *inode, struct file *file) -{ - struct snd_ctxt *snd = file->private_data; - int rc; - - mutex_lock(&snd->lock); - rc = msm_rpc_close(snd->ept); - if (rc < 0) - MM_ERR("msm_rpc_close failed\n"); - snd->ept = NULL; - snd->opened = 0; - mutex_unlock(&snd->lock); - return 0; -} -static int snd_sys_release(void) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - mutex_lock(&snd_sys->lock); - rc = msm_rpc_close(snd_sys->ept); - if (rc < 0) - MM_ERR("msm_rpc_close failed\n"); - snd_sys->ept = NULL; - mutex_unlock(&snd_sys->lock); - return rc; -} -static int snd_open(struct inode *inode, struct file *file) -{ - struct snd_ctxt *snd = &the_snd; - int rc = 0; - - mutex_lock(&snd->lock); - if (snd->opened == 0) { - if (snd->ept == NULL) { - snd->ept = msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS, 0); - if (IS_ERR(snd->ept)) { - MM_DBG("connect failed with current VERS \ - = %x, trying again with another API\n", - RPC_SND_VERS2); - snd->ept = - msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS2, 0); - } - if (IS_ERR(snd->ept)) { - rc = PTR_ERR(snd->ept); - snd->ept = NULL; - MM_ERR("failed to connect snd svc\n"); - goto err; - } - } - file->private_data = snd; - snd->opened = 1; - } else { - MM_ERR("snd already opened\n"); - rc = -EBUSY; - } - -err: - mutex_unlock(&snd->lock); - return rc; -} -static int snd_sys_open(void) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - mutex_lock(&snd_sys->lock); - if (snd_sys->ept == NULL) { - snd_sys->ept = msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS, 0); - if (IS_ERR(snd_sys->ept)) { - MM_DBG("connect failed with current VERS \ - = %x, trying again with another API\n", - RPC_SND_VERS2); - snd_sys->ept = msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS2, 0); - } - if (IS_ERR(snd_sys->ept)) { - rc = PTR_ERR(snd_sys->ept); - snd_sys->ept = NULL; - MM_ERR("failed to connect snd svc\n"); - goto err; - } - } else - MM_DBG("snd already opened\n"); - -err: - mutex_unlock(&snd_sys->lock); - return rc; -} - -static struct file_operations snd_fops = { - .owner = THIS_MODULE, - .open = snd_open, - .release = snd_release, - .unlocked_ioctl = snd_ioctl, -}; - -struct miscdevice snd_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_snd", - .fops = &snd_fops, -}; - -static long snd_agc_enable(unsigned long arg) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - struct snd_agc_ctl_msg agc_msg; - int rc = 0; - - if ((arg != 1) && (arg != 0)) - return -EINVAL; - - agc_msg.args.agc_ctl = cpu_to_be32(arg); - agc_msg.args.cb_func = -1; - agc_msg.args.client_data = 0; - - MM_DBG("snd_agc_ctl %ld,%d\n", arg, agc_msg.args.agc_ctl); - - rc = msm_rpc_call(snd_sys->ept, - SND_AGC_CTL_PROC, - &agc_msg, sizeof(agc_msg), 5 * HZ); - return rc; -} - -static long snd_avc_enable(unsigned long arg) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - struct snd_avc_ctl_msg avc_msg; - int rc = 0; - - if ((arg != 1) && (arg != 0)) - return -EINVAL; - - avc_msg.args.avc_ctl = cpu_to_be32(arg); - - avc_msg.args.cb_func = -1; - avc_msg.args.client_data = 0; - - MM_DBG("snd_avc_ctl %ld,%d\n", arg, avc_msg.args.avc_ctl); - - rc = msm_rpc_call(snd_sys->ept, - SND_AVC_CTL_PROC, - &avc_msg, sizeof(avc_msg), 5 * HZ); - return rc; -} - -static ssize_t snd_agc_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - rc = snd_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_sys->lock); - - if (sysfs_streq(buf, "enable")) - status = snd_agc_enable(1); - else if (sysfs_streq(buf, "disable")) - status = snd_agc_enable(0); - else - status = -EINVAL; - - mutex_unlock(&snd_sys->lock); - rc = snd_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static ssize_t snd_avc_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - rc = snd_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_sys->lock); - - if (sysfs_streq(buf, "enable")) - status = snd_avc_enable(1); - else if (sysfs_streq(buf, "disable")) - status = snd_avc_enable(0); - else - status = -EINVAL; - - mutex_unlock(&snd_sys->lock); - rc = snd_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static long snd_vol_enable(const char *arg) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - struct snd_set_volume_msg vmsg; - struct msm_snd_volume_config vol; - int rc = 0; - - rc = sscanf(arg, "%d %d %d", &vol.device, &vol.method, &vol.volume); - if (rc != 3) { - MM_ERR("Invalid arguments. Usage: \ - \n"); - rc = -EINVAL; - return rc; - } - - vmsg.args.device = cpu_to_be32(vol.device); - vmsg.args.method = cpu_to_be32(vol.method); - if (vol.method != SND_METHOD_VOICE) { - MM_ERR("snd_ioctl set volume: invalid method\n"); - rc = -EINVAL; - return rc; - } - - vmsg.args.volume = cpu_to_be32(vol.volume); - vmsg.args.cb_func = -1; - vmsg.args.client_data = 0; - - MM_DBG("snd_set_volume %d %d %d\n", vol.device, vol.method, - vol.volume); - - rc = msm_rpc_call(snd_sys->ept, - SND_SET_VOLUME_PROC, - &vmsg, sizeof(vmsg), 5 * HZ); - return rc; -} - -static long snd_dev_enable(const char *arg) -{ - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - struct snd_set_device_msg dmsg; - struct msm_snd_device_config dev; - int rc = 0; - - rc = sscanf(arg, "%d %d %d", &dev.device, &dev.ear_mute, &dev.mic_mute); - if (rc != 3) { - MM_ERR("Invalid arguments. Usage: \ - \n"); - rc = -EINVAL; - return rc; - } - dmsg.args.device = cpu_to_be32(dev.device); - dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute); - dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute); - if (check_mute(dev.ear_mute) < 0 || - check_mute(dev.mic_mute) < 0) { - MM_ERR("snd_ioctl set device: invalid mute status\n"); - rc = -EINVAL; - return rc; - } - dmsg.args.cb_func = -1; - dmsg.args.client_data = 0; - - MM_INFO("snd_set_device %d %d %d\n", dev.device, dev.ear_mute, - dev.mic_mute); - - rc = msm_rpc_call(snd_sys->ept, - SND_SET_DEVICE_PROC, - &dmsg, sizeof(dmsg), 5 * HZ); - return rc; -} - -static ssize_t snd_dev_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - rc = snd_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_sys->lock); - status = snd_dev_enable(buf); - mutex_unlock(&snd_sys->lock); - - rc = snd_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static ssize_t snd_vol_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - rc = snd_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_sys->lock); - status = snd_vol_enable(buf); - mutex_unlock(&snd_sys->lock); - - rc = snd_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static DEVICE_ATTR(agc, S_IWUSR | S_IRUGO, - NULL, snd_agc_store); - -static DEVICE_ATTR(avc, S_IWUSR | S_IRUGO, - NULL, snd_avc_store); - -static DEVICE_ATTR(device, S_IWUSR | S_IRUGO, - NULL, snd_dev_store); - -static DEVICE_ATTR(volume, S_IWUSR | S_IRUGO, - NULL, snd_vol_store); - -static int snd_probe(struct platform_device *pdev) -{ - struct snd_ctxt *snd = &the_snd; - struct snd_sys_ctxt *snd_sys = &the_snd_sys; - int rc = 0; - - mutex_init(&snd->lock); - mutex_init(&snd_sys->lock); - snd_sys->ept = NULL; - snd->snd_epts = (struct msm_snd_endpoints *)pdev->dev.platform_data; - rc = misc_register(&snd_misc); - if (rc) - return rc; - - rc = device_create_file(snd_misc.this_device, &dev_attr_agc); - if (rc) { - misc_deregister(&snd_misc); - return rc; - } - - rc = device_create_file(snd_misc.this_device, &dev_attr_avc); - if (rc) { - device_remove_file(snd_misc.this_device, - &dev_attr_agc); - misc_deregister(&snd_misc); - return rc; - } - - rc = device_create_file(snd_misc.this_device, &dev_attr_device); - if (rc) { - device_remove_file(snd_misc.this_device, - &dev_attr_agc); - device_remove_file(snd_misc.this_device, - &dev_attr_avc); - misc_deregister(&snd_misc); - return rc; - } - - rc = device_create_file(snd_misc.this_device, &dev_attr_volume); - if (rc) { - device_remove_file(snd_misc.this_device, - &dev_attr_agc); - device_remove_file(snd_misc.this_device, - &dev_attr_avc); - device_remove_file(snd_misc.this_device, - &dev_attr_device); - misc_deregister(&snd_misc); - } - - return rc; -} - -static struct platform_driver snd_plat_driver = { - .probe = snd_probe, - .driver = { - .name = "msm_snd", - .owner = THIS_MODULE, - }, -}; - -static int __init snd_init(void) -{ - return platform_driver_register(&snd_plat_driver); -} - -module_init(snd_init); diff --git a/arch/arm/mach-msm/qdsp5/snd_adie.c b/arch/arm/mach-msm/qdsp5/snd_adie.c deleted file mode 100644 index 0598d91ef03e..000000000000 --- a/arch/arm/mach-msm/qdsp5/snd_adie.c +++ /dev/null @@ -1,490 +0,0 @@ -/* Copyright (c) 2009,2013 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static struct adie_svc_client adie_client[ADIE_SVC_MAX_CLIENTS]; -static DEFINE_MUTEX(adie_client_lock); - -static int adie_svc_process_cb(struct msm_rpc_client *client, - void *buffer, int in_size) -{ - int rc, id; - uint32_t accept_status; - struct rpc_request_hdr *req; - struct adie_svc_client_register_cb_cb_args arg, *buf_ptr; - - req = (struct rpc_request_hdr *)buffer; - for (id = 0; id < ADIE_SVC_MAX_CLIENTS; id++) { - if (adie_client[id].rpc_client == client) - break; - } - if (id == ADIE_SVC_MAX_CLIENTS) { - MM_ERR("RPC reply with invalid rpc client\n"); - accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; - goto err; - } - - buf_ptr = (struct adie_svc_client_register_cb_cb_args *)(req + 1); - arg.cb_id = be32_to_cpu(buf_ptr->cb_id); - arg.size = be32_to_cpu(buf_ptr->size); - arg.client_id = be32_to_cpu(buf_ptr->client_id); - arg.adie_block = be32_to_cpu(buf_ptr->adie_block); - arg.status = be32_to_cpu(buf_ptr->status); - arg.client_operation = be32_to_cpu(buf_ptr->client_operation); - - if (arg.cb_id != adie_client[id].cb_id) { - MM_ERR("RPC reply with invalid invalid cb_id\n"); - accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; - goto err; - } - - mutex_lock(&adie_client[id].lock); - switch (arg.client_operation) { - case ADIE_SVC_REGISTER_CLIENT: - MM_DBG("ADIE_SVC_REGISTER_CLIENT callback\n"); - adie_client[id].client_id = arg.client_id; - break; - case ADIE_SVC_DEREGISTER_CLIENT: - MM_DBG("ADIE_SVC_DEREGISTER_CLIENT callback\n"); - break; - case ADIE_SVC_CONFIG_ADIE_BLOCK: - MM_DBG("ADIE_SVC_CONFIG_ADIE_BLOCK callback\n"); - if (adie_client[id].client_id != arg.client_id) { - mutex_unlock(&adie_client[id].lock); - accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; - goto err; - } - break; - default: - accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; - goto err; - } - - adie_client[id].status = arg.status; - adie_client[id].adie_svc_cb_done = 1; - mutex_unlock(&adie_client[id].lock); - wake_up(&adie_client[id].wq); - accept_status = RPC_ACCEPTSTAT_SUCCESS; - -err: - msm_rpc_start_accepted_reply(client, be32_to_cpu(req->xid), - accept_status); - rc = msm_rpc_send_accepted_reply(client, 0); - if (rc) - MM_ERR("%s: send accepted reply failed: %d\n", __func__, rc); - - return rc; -} - -static int adie_svc_rpc_cb_func(struct msm_rpc_client *client, - void *buffer, int in_size) -{ - int rc = 0; - struct rpc_request_hdr *req; - - req = (struct rpc_request_hdr *)buffer; - - MM_DBG("procedure received to rpc cb %d\n", - be32_to_cpu(req->procedure)); - switch (be32_to_cpu(req->procedure)) { - case ADIE_SVC_CLIENT_STATUS_FUNC_PTR_TYPE_PROC: - rc = adie_svc_process_cb(client, buffer, in_size); - break; - default: - MM_ERR("%s: procedure not supported %d\n", __func__, - be32_to_cpu(req->procedure)); - msm_rpc_start_accepted_reply(client, be32_to_cpu(req->xid), - RPC_ACCEPTSTAT_PROC_UNAVAIL); - rc = msm_rpc_send_accepted_reply(client, 0); - if (rc) - MM_ERR("%s: sending reply failed: %d\n", __func__, rc); - break; - } - return rc; -} - -static int adie_svc_client_register_arg(struct msm_rpc_client *client, - void *buf, void *data) -{ - struct adie_svc_client_register_cb_args *arg; - - arg = (struct adie_svc_client_register_cb_args *)data; - - *((int *)buf) = cpu_to_be32((int)arg->cb_id); - return sizeof(int); -} - -static int adie_svc_client_deregister_arg(struct msm_rpc_client *client, - void *buf, void *data) -{ - struct adie_svc_client_deregister_cb_args *arg; - - arg = (struct adie_svc_client_deregister_cb_args *)data; - - *((int *)buf) = cpu_to_be32(arg->client_id); - return sizeof(int); -} - -static int adie_svc_config_adie_block_arg(struct msm_rpc_client *client, - void *buf, void *data) -{ - struct adie_svc_config_adie_block_cb_args *arg; - int size = 0; - - arg = (struct adie_svc_config_adie_block_cb_args *)data; - - *((int *)buf) = cpu_to_be32(arg->client_id); - size += sizeof(int); - buf += sizeof(int); - - *((int *)buf) = cpu_to_be32(arg->adie_block); - size += sizeof(int); - buf += sizeof(int); - - *((int *)buf) = cpu_to_be32(arg->config); - size += sizeof(int); - - return size; -} - -/* Returns : client id on success - * and -1 on failure - */ -int adie_svc_get(void) -{ - int id, rc = 0; - struct adie_svc_client_register_cb_args arg; - - mutex_lock(&adie_client_lock); - for (id = 0; id < ADIE_SVC_MAX_CLIENTS; id++) { - if (adie_client[id].client_id == -1 && - adie_client[id].rpc_client == NULL) - break; - } - if (id == ADIE_SVC_MAX_CLIENTS) { - mutex_unlock(&adie_client_lock); - return -1; - } - - mutex_lock(&adie_client[id].lock); - adie_client[id].rpc_client = msm_rpc_register_client("adie_client", - ADIE_SVC_PROG, - ADIE_SVC_VERS, 1, - adie_svc_rpc_cb_func); - if (IS_ERR(adie_client[id].rpc_client)) { - MM_ERR("Failed to register RPC client\n"); - adie_client[id].rpc_client = NULL; - mutex_unlock(&adie_client[id].lock); - mutex_unlock(&adie_client_lock); - return -1; - } - mutex_unlock(&adie_client_lock); - - adie_client[id].adie_svc_cb_done = 0; - arg.cb_id = id; - adie_client[id].cb_id = arg.cb_id; - mutex_unlock(&adie_client[id].lock); - rc = msm_rpc_client_req(adie_client[id].rpc_client, - SND_ADIE_SVC_CLIENT_REGISTER_PROC, - adie_svc_client_register_arg, &arg, - NULL, NULL, -1); - if (!rc) { - rc = wait_event_interruptible(adie_client[id].wq, - adie_client[id].adie_svc_cb_done); - mutex_lock(&adie_client[id].lock); - if (unlikely(rc < 0)) { - if (rc == -ERESTARTSYS) - MM_ERR("wait_event_interruptible " - "returned -ERESTARTSYS\n"); - else - MM_ERR("wait_event_interruptible " - "returned error\n"); - rc = -1; - goto err; - } - MM_DBG("Status %d received from CB function, id %d rc %d\n", - adie_client[id].status, adie_client[id].client_id, rc); - rc = id; - if (adie_client[id].status == ADIE_SVC_STATUS_FAILURE) { - MM_ERR("Received failed status for register request\n"); - rc = -1; - } else - goto done; - } else { - MM_ERR("Failed to send register client request\n"); - rc = -1; - mutex_lock(&adie_client[id].lock); - } -err: - msm_rpc_unregister_client(adie_client[id].rpc_client); - adie_client[id].rpc_client = NULL; - adie_client[id].client_id = -1; - adie_client[id].cb_id = MSM_RPC_CLIENT_NULL_CB_ID; - adie_client[id].adie_svc_cb_done = 0; -done: - mutex_unlock(&adie_client[id].lock); - return rc; -} -EXPORT_SYMBOL(adie_svc_get); - -/* Returns: 0 on succes and - * -1 on failure - */ -int adie_svc_put(int id) -{ - int rc = 0; - struct adie_svc_client_deregister_cb_args arg; - - if (id < 0 || id >= ADIE_SVC_MAX_CLIENTS) - return -1; - - mutex_lock(&adie_client[id].lock); - if (adie_client[id].client_id == -1 || - adie_client[id].rpc_client == NULL) { - mutex_unlock(&adie_client[id].lock); - return -1; - } - arg.client_id = adie_client[id].client_id; - adie_client[id].adie_svc_cb_done = 0; - mutex_unlock(&adie_client[id].lock); - rc = msm_rpc_client_req(adie_client[id].rpc_client, - SND_ADIE_SVC_CLIENT_DEREGISTER_PROC, - adie_svc_client_deregister_arg, &arg, - NULL, NULL, -1); - if (!rc) { - rc = wait_event_interruptible(adie_client[id].wq, - adie_client[id].adie_svc_cb_done); - if (unlikely(rc < 0)) { - if (rc == -ERESTARTSYS) - MM_ERR("wait_event_interruptible " - "returned -ERESTARTSYS\n"); - else - MM_ERR("wait_event_interruptible " - "returned error\n"); - rc = -1; - goto err; - } - MM_DBG("Status received from CB function\n"); - mutex_lock(&adie_client[id].lock); - if (adie_client[id].status == ADIE_SVC_STATUS_FAILURE) { - rc = -1; - } else { - msm_rpc_unregister_client(adie_client[id].rpc_client); - adie_client[id].rpc_client = NULL; - adie_client[id].client_id = -1; - adie_client[id].cb_id = MSM_RPC_CLIENT_NULL_CB_ID; - adie_client[id].adie_svc_cb_done = 0; - } - mutex_unlock(&adie_client[id].lock); - } else { - MM_ERR("Failed to send deregister client request\n"); - rc = -1; - } -err: - return rc; -} -EXPORT_SYMBOL(adie_svc_put); - -/* Returns: 0 on success - * 2 already in use - * -1 on failure - */ -int adie_svc_config_adie_block(int id, - enum adie_block_enum_type adie_block_type, bool enable) -{ - int rc = 0; - struct adie_svc_config_adie_block_cb_args arg; - - if (id < 0 || id >= ADIE_SVC_MAX_CLIENTS) - return -1; - - mutex_lock(&adie_client[id].lock); - if (adie_client[id].client_id == -1 || - adie_client[id].rpc_client == NULL) { - mutex_unlock(&adie_client[id].lock); - return -1; - } - arg.client_id = adie_client[id].client_id; - arg.adie_block = adie_block_type; - arg.config = (enum adie_config_enum_type)enable; - adie_client[id].adie_svc_cb_done = 0; - mutex_unlock(&adie_client[id].lock); - rc = msm_rpc_client_req(adie_client[id].rpc_client, - SND_ADIE_SVC_CONFIG_ADIE_BLOCK_PROC, - adie_svc_config_adie_block_arg, &arg, - NULL, NULL, -1); - if (!rc) { - rc = wait_event_interruptible(adie_client[id].wq, - adie_client[id].adie_svc_cb_done); - if (unlikely(rc < 0)) { - if (rc == -ERESTARTSYS) - MM_ERR("wait_event_interruptible " - "returned -ERESTARTSYS\n"); - else - MM_ERR("wait_event_interruptible " - "returned error\n"); - rc = -1; - goto err; - } - MM_DBG("Status received from CB function\n"); - mutex_lock(&adie_client[id].lock); - if (adie_client[id].status == ADIE_SVC_STATUS_FAILURE) - rc = -1; - else - rc = adie_client[id].status; - mutex_unlock(&adie_client[id].lock); - } else { - MM_ERR("Failed to send adie block config request\n"); - rc = -1; - } -err: - return rc; -} -EXPORT_SYMBOL(adie_svc_config_adie_block); - -#ifdef CONFIG_DEBUG_FS - -struct dentry *dentry; -static char l_buf[100]; - -static ssize_t snd_adie_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t snd_adie_debug_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int rc = 0, op = 0; - int id = 0, adie_block = 0, config = 1; - size_t len; - - len = count > (sizeof(l_buf) - 1) ? - (sizeof(l_buf) - 1) : count; - l_buf[len] = 0; - if (copy_from_user(l_buf, buf, len)) { - pr_info("Unable to copy data from user space\n"); - return -EFAULT; - } - if (sscanf(l_buf, "%d %d %d %d", &op, &id, &adie_block, &config) != 4) - return -EINVAL; - MM_INFO("\nUser input: op %d id %d block %d config %d\n", op, id, - adie_block, config); - switch (op) { - case ADIE_SVC_REGISTER_CLIENT: - MM_INFO("ADIE_SVC_REGISTER_CLIENT\n"); - rc = adie_svc_get(); - if (rc >= 0) - MM_INFO("Client registered: %d\n", rc); - else - MM_ERR("Failed registering client\n"); - break; - case ADIE_SVC_DEREGISTER_CLIENT: - MM_INFO("ADIE_SVC_DEREGISTER_CLIENT: %d\n", id); - rc = adie_svc_put(id); - if (!rc) - MM_INFO("Client %d deregistered\n", id); - else - MM_ERR("Failed unregistering the client: %d\n", id); - break; - case ADIE_SVC_CONFIG_ADIE_BLOCK: - MM_INFO("ADIE_SVC_CONFIG_ADIE_BLOCK: id %d adie_block %d \ - config %d\n", id, adie_block, config); - rc = adie_svc_config_adie_block(id, - (enum adie_block_enum_type)adie_block, (bool)config); - if (!rc) - MM_INFO("ADIE block %d %s", adie_block, - config ? "enabled\n" : "disabled\n"); - else if (rc == 2) - MM_INFO("ADIE block %d already in use\n", adie_block); - else - MM_ERR("ERROR configuring the ADIE block\n"); - break; - default: - MM_INFO("Invalid operation\n"); - } - return count; -} - -static ssize_t snd_adie_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - static char buffer[1024]; - const int debug_bufmax = sizeof(buffer); - int id, n = 0; - - n += scnprintf(buffer + n, debug_bufmax - n, - "LIST OF CLIENTS\n"); - for (id = 0; id < ADIE_SVC_MAX_CLIENTS ; id++) { - if (adie_client[id].client_id != -1 && - adie_client[id].rpc_client != NULL) { - n += scnprintf(buffer + n, debug_bufmax - n, - "id %d rpc client 0x%08x\n", id, - (uint32_t)adie_client[id].rpc_client); - } - } - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations snd_adie_debug_fops = { - .read = snd_adie_debug_read, - .open = snd_adie_debug_open, - .write = snd_adie_debug_write, -}; -#endif - -static void __exit snd_adie_exit(void) -{ -#ifdef CONFIG_DEBUG_FS - if (dentry) - debugfs_remove(dentry); -#endif -} - -static int __init snd_adie_init(void) -{ - int id; -#ifdef CONFIG_DEBUG_FS - char name[sizeof "msm_snd_adie"]; - - snprintf(name, sizeof name, "msm_snd_adie"); - dentry = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, &snd_adie_debug_fops); - if (IS_ERR(dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif - for (id = 0; id < ADIE_SVC_MAX_CLIENTS; id++) { - adie_client[id].client_id = -1; - adie_client[id].cb_id = MSM_RPC_CLIENT_NULL_CB_ID; - adie_client[id].status = 0; - adie_client[id].adie_svc_cb_done = 0; - mutex_init(&adie_client[id].lock); - init_waitqueue_head(&adie_client[id].wq); - adie_client[id].rpc_client = NULL; - } - return 0; -} - -module_init(snd_adie_init); -module_exit(snd_adie_exit); diff --git a/arch/arm/mach-msm/qdsp5/snd_cad.c b/arch/arm/mach-msm/qdsp5/snd_cad.c deleted file mode 100644 index 0b92cef2b923..000000000000 --- a/arch/arm/mach-msm/qdsp5/snd_cad.c +++ /dev/null @@ -1,608 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/snd_cad.c - * - * interface to "snd" service on the baseband cpu - * This code also borrows from snd.c, which is - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009, 2012 The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct snd_cad_ctxt { - struct mutex lock; - int opened; - struct msm_rpc_endpoint *ept; - struct msm_cad_endpoints *cad_epts; -}; - -struct snd_cad_sys_ctxt { - struct mutex lock; - struct msm_rpc_endpoint *ept; -}; - -struct snd_curr_dev_info { - int rx_dev; - int tx_dev; -}; - -static struct snd_cad_sys_ctxt the_snd_cad_sys; - -static struct snd_cad_ctxt the_snd; -static struct snd_curr_dev_info curr_dev; - -#define RPC_SND_PROG 0x30000002 -#define RPC_SND_CB_PROG 0x31000002 - -#define RPC_SND_VERS 0x00030003 - -#define SND_CAD_SET_DEVICE_PROC 40 -#define SND_CAD_SET_VOLUME_PROC 39 -#define MAX_SND_ACTIVE_DEVICE 2 - -struct rpc_cad_set_device_args { - struct cad_devices_type device; - uint32_t ear_mute; - uint32_t mic_mute; - - uint32_t cb_func; - uint32_t client_data; -}; - -struct rpc_cad_set_volume_args { - struct cad_devices_type device; - uint32_t method; - uint32_t volume; - - uint32_t cb_func; - uint32_t client_data; -}; - -struct snd_cad_set_device_msg { - struct rpc_request_hdr hdr; - struct rpc_cad_set_device_args args; -}; - -struct snd_cad_set_volume_msg { - struct rpc_request_hdr hdr; - struct rpc_cad_set_volume_args args; -}; - -struct cad_endpoint *get_cad_endpoints(int *size); - -#ifdef CONFIG_DEBUG_FS -static struct dentry *dentry; - -static int rtc_getdevice_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("debug intf %s\n", (char *) file->private_data); - return 0; -} - -static ssize_t rtc_getdevice_dbg_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - int n = 0; - static char *buffer; - static char *swap_buf; - const int debug_bufmax = 1024; - int swap_count = 0; - int rc = 0; - int dev_count = 0; - int dev_id = 0; - struct msm_cad_endpoints *msm_cad_epts = the_snd.cad_epts; - struct cad_endpoint *cad_epts; - - buffer = kmalloc(sizeof(char) * 1024, GFP_KERNEL); - if (buffer == NULL) { - MM_ERR("Memory allocation failed for buffer failed\n"); - return -EFAULT; - } - - swap_buf = kmalloc(sizeof(char) * 1024, GFP_KERNEL); - if (swap_buf == NULL) { - MM_ERR("Memory allocation failed for swap buffer failed\n"); - kfree(buffer); - return -EFAULT; - } - - if (msm_cad_epts->num <= 0) { - dev_count = 0; - n = scnprintf(buffer, debug_bufmax, "DEV_NO:0x%x\n", - msm_cad_epts->num); - } else { - for (dev_id = 0; dev_id < msm_cad_epts->num; dev_id++) { - cad_epts = &msm_cad_epts->endpoints[dev_id]; - if (IS_ERR(cad_epts)) { - MM_ERR("invalid snd endpoint for dev_id %d\n", - dev_id); - rc = PTR_ERR(cad_epts); - continue; - } - - if ((cad_epts->id != curr_dev.tx_dev) && - (cad_epts->id != curr_dev.rx_dev)) - continue; - - n += scnprintf(swap_buf + n, debug_bufmax - n, - "ACDB_ID:0x%x;CAPB:0x%x\n", - cad_epts->id, - cad_epts->capability); - dev_count++; - MM_DBG("RTC Get Device %x Capb %x Dev Count %x\n", - dev_id, cad_epts->capability, - dev_count); - - } - } - swap_count = scnprintf(buffer, debug_bufmax, \ - "DEV_NO:0x%x\n", dev_count); - - memcpy(buffer+swap_count, swap_buf, n*sizeof(char)); - n = n+swap_count; - - buffer[n] = 0; - rc = simple_read_from_buffer(buf, count, ppos, buffer, n); - kfree(buffer); - kfree(swap_buf); - return rc; -} - -static const struct file_operations rtc_acdb_debug_fops = { - .open = rtc_getdevice_dbg_open, - .read = rtc_getdevice_dbg_read -}; - -static int rtc_debugfs_create_entry(void) -{ - int rc = 0; - char name[sizeof "rtc_get_device"+1]; - - snprintf(name, sizeof name, "rtc_get_device"); - dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, NULL, &rtc_acdb_debug_fops); - if (IS_ERR(dentry)) { - MM_ERR("debugfs_create_file failed\n"); - rc = PTR_ERR(dentry); - } - return rc; -} -#else -static int rtc_debugfs_create_entry() -{ - return 0; -} -#endif - -static inline int check_mute(int mute) -{ - return (mute == SND_MUTE_MUTED || - mute == SND_MUTE_UNMUTED) ? 0 : -EINVAL; -} - -static int get_endpoint(struct snd_cad_ctxt *snd, unsigned long arg) -{ - int rc = 0, index; - struct msm_cad_endpoint ept; - - if (copy_from_user(&ept, (void __user *)arg, sizeof(ept))) { - MM_ERR("cad_ioctl get endpoint: invalid read pointer\n"); - return -EFAULT; - } - - index = ept.id; - if (index < 0 || index >= snd->cad_epts->num) { - MM_ERR("snd_ioctl get endpoint: invalid index!\n"); - return -EINVAL; - } - - ept.id = snd->cad_epts->endpoints[index].id; - strlcpy(ept.name, - snd->cad_epts->endpoints[index].name, - sizeof(ept.name)); - - if (copy_to_user((void __user *)arg, &ept, sizeof(ept))) { - MM_ERR("snd_ioctl get endpoint: invalid write pointer\n"); - rc = -EFAULT; - } - - return rc; -} - -static long snd_cad_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct snd_cad_set_device_msg dmsg; - struct snd_cad_set_volume_msg vmsg; - - struct msm_cad_device_config dev; - struct msm_cad_volume_config vol; - struct snd_cad_ctxt *snd = file->private_data; - int rc = 0; - - mutex_lock(&snd->lock); - switch (cmd) { - case SND_SET_DEVICE: - if (copy_from_user(&dev, (void __user *) arg, sizeof(dev))) { - MM_ERR("set device: invalid pointer\n"); - rc = -EFAULT; - break; - } - - dmsg.args.device.rx_device = cpu_to_be32(dev.device.rx_device); - dmsg.args.device.tx_device = cpu_to_be32(dev.device.tx_device); - dmsg.args.device.pathtype = cpu_to_be32(dev.device.pathtype); - dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute); - dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute); - if (check_mute(dev.ear_mute) < 0 || - check_mute(dev.mic_mute) < 0) { - MM_ERR("set device: invalid mute status\n"); - rc = -EINVAL; - break; - } - dmsg.args.cb_func = -1; - dmsg.args.client_data = 0; - curr_dev.tx_dev = dev.device.tx_device; - curr_dev.rx_dev = dev.device.rx_device; - MM_ERR("snd_cad_set_device %d %d %d %d\n", dev.device.rx_device, - dev.device.tx_device, dev.ear_mute, dev.mic_mute); - - rc = msm_rpc_call(snd->ept, - SND_CAD_SET_DEVICE_PROC, - &dmsg, sizeof(dmsg), 5 * HZ); - break; - - case SND_SET_VOLUME: - if (copy_from_user(&vol, (void __user *) arg, sizeof(vol))) { - MM_ERR("set volume: invalid pointer\n"); - rc = -EFAULT; - break; - } - - vmsg.args.device.rx_device = cpu_to_be32(dev.device.rx_device); - vmsg.args.device.tx_device = cpu_to_be32(dev.device.tx_device); - vmsg.args.method = cpu_to_be32(vol.method); - if (vol.method != SND_METHOD_VOICE && - vol.method != SND_METHOD_MIDI) { - MM_ERR("set volume: invalid method %d\n", vol.method); - rc = -EINVAL; - break; - } - - vmsg.args.volume = cpu_to_be32(vol.volume); - vmsg.args.cb_func = -1; - vmsg.args.client_data = 0; - - MM_ERR("snd_cad_set_volume %d %d %d %d\n", vol.device.rx_device, - vol.device.tx_device, vol.method, vol.volume); - - rc = msm_rpc_call(snd->ept, - SND_CAD_SET_VOLUME_PROC, - &vmsg, sizeof(vmsg), 5 * HZ); - - break; - - case SND_GET_NUM_ENDPOINTS: - if (copy_to_user((void __user *)arg, - &snd->cad_epts->num, sizeof(unsigned))) { - MM_ERR("get endpoint: invalid pointer\n"); - rc = -EFAULT; - } - break; - - case SND_GET_ENDPOINT: - rc = get_endpoint(snd, arg); - break; - - default: - MM_ERR("unknown command\n"); - rc = -EINVAL; - break; - } - mutex_unlock(&snd->lock); - - return rc; -} - -static int snd_cad_release(struct inode *inode, struct file *file) -{ - struct snd_cad_ctxt *snd = file->private_data; - int rc; - - mutex_lock(&snd->lock); - rc = msm_rpc_close(snd->ept); - if (rc < 0) - MM_ERR("msm_rpc_close failed\n"); - snd->ept = NULL; - snd->opened = 0; - mutex_unlock(&snd->lock); - return 0; -} -static int snd_cad_sys_release(void) -{ - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - int rc = 0; - - mutex_lock(&snd_cad_sys->lock); - rc = msm_rpc_close(snd_cad_sys->ept); - if (rc < 0) - MM_ERR("msm_rpc_close failed\n"); - snd_cad_sys->ept = NULL; - mutex_unlock(&snd_cad_sys->lock); - return rc; -} -static int snd_cad_open(struct inode *inode, struct file *file) -{ - struct snd_cad_ctxt *snd = &the_snd; - int rc = 0; - - mutex_lock(&snd->lock); - if (snd->opened == 0) { - if (snd->ept == NULL) { - snd->ept = msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS, 0); - if (IS_ERR(snd->ept)) { - rc = PTR_ERR(snd->ept); - snd->ept = NULL; - MM_ERR("cad connect failed with VERS %x\n", - RPC_SND_VERS); - goto err; - } - } - file->private_data = snd; - snd->opened = 1; - } else { - MM_ERR("snd already opened\n"); - rc = -EBUSY; - } - -err: - mutex_unlock(&snd->lock); - return rc; -} -static int snd_cad_sys_open(void) -{ - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - int rc = 0; - - mutex_lock(&snd_cad_sys->lock); - if (snd_cad_sys->ept == NULL) { - snd_cad_sys->ept = msm_rpc_connect_compatible(RPC_SND_PROG, - RPC_SND_VERS, 0); - if (IS_ERR(snd_cad_sys->ept)) { - rc = PTR_ERR(snd_cad_sys->ept); - snd_cad_sys->ept = NULL; - MM_ERR("func %s : cad connect failed with VERS %x\n", - __func__, RPC_SND_VERS); - goto err; - } - } else - MM_DBG("snd already opened\n"); -err: - mutex_unlock(&snd_cad_sys->lock); - return rc; -} - -static const struct file_operations snd_cad_fops = { - .owner = THIS_MODULE, - .open = snd_cad_open, - .release = snd_cad_release, - .unlocked_ioctl = snd_cad_ioctl, -}; - -struct miscdevice snd_cad_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_cad", - .fops = &snd_cad_fops, -}; - -static long snd_cad_vol_enable(const char *arg) -{ - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - struct snd_cad_set_volume_msg vmsg; - struct msm_cad_volume_config vol; - int rc = 0; - - rc = sscanf(arg, "%d %d %d %d", &vol.device.rx_device, - &vol.device.tx_device, &vol.method, &vol.volume); - if (rc != 4) { - MM_ERR("Invalid arguments. Usage: " \ - "method> \n"); - rc = -EINVAL; - return rc; - } - - vmsg.args.device.rx_device = cpu_to_be32(vol.device.rx_device); - vmsg.args.device.tx_device = cpu_to_be32(vol.device.tx_device); - vmsg.args.method = cpu_to_be32(vol.method); - if (vol.method != SND_METHOD_VOICE && vol.method != SND_METHOD_MIDI) { - MM_ERR("snd_cad_ioctl set volume: invalid method\n"); - rc = -EINVAL; - return rc; - } - - vmsg.args.volume = cpu_to_be32(vol.volume); - vmsg.args.cb_func = -1; - vmsg.args.client_data = 0; - - MM_DBG("snd_cad_set_volume %d %d %d %d\n", vol.device.rx_device, - vol.device.tx_device, vol.method, vol.volume); - - rc = msm_rpc_call(snd_cad_sys->ept, - SND_CAD_SET_VOLUME_PROC, - &vmsg, sizeof(vmsg), 5 * HZ); - return rc; -} - -static long snd_cad_dev_enable(const char *arg) -{ - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - struct snd_cad_set_device_msg dmsg; - struct msm_cad_device_config dev; - int rc = 0; - - - rc = sscanf(arg, "%d %d %d %d", &dev.device.rx_device, - &dev.device.tx_device, &dev.ear_mute, &dev.mic_mute); - if (rc != 4) { - MM_ERR("Invalid arguments. Usage: "\ - " \n"); - rc = -EINVAL; - return rc; - } - dmsg.args.device.rx_device = cpu_to_be32(dev.device.rx_device); - dmsg.args.device.tx_device = cpu_to_be32(dev.device.tx_device); - dmsg.args.device.pathtype = cpu_to_be32(CAD_DEVICE_PATH_RX_TX); - dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute); - dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute); - if (check_mute(dev.ear_mute) < 0 || - check_mute(dev.mic_mute) < 0) { - MM_ERR("snd_cad_ioctl set device: invalid mute status\n"); - rc = -EINVAL; - return rc; - } - dmsg.args.cb_func = -1; - dmsg.args.client_data = 0; - curr_dev.tx_dev = dev.device.tx_device; - curr_dev.rx_dev = dev.device.rx_device; - - MM_INFO("snd_cad_set_device %d %d %d %d\n", dev.device.rx_device, - dev.device.tx_device, dev.ear_mute, dev.mic_mute); - - rc = msm_rpc_call(snd_cad_sys->ept, - SND_CAD_SET_DEVICE_PROC, - &dmsg, sizeof(dmsg), 5 * HZ); - return rc; -} - -static ssize_t snd_cad_dev_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - int rc = 0; - - rc = snd_cad_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_cad_sys->lock); - status = snd_cad_dev_enable(buf); - mutex_unlock(&snd_cad_sys->lock); - - rc = snd_cad_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static ssize_t snd_cad_vol_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - ssize_t status; - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - int rc = 0; - - rc = snd_cad_sys_open(); - if (rc) - return rc; - - mutex_lock(&snd_cad_sys->lock); - status = snd_cad_vol_enable(buf); - mutex_unlock(&snd_cad_sys->lock); - - rc = snd_cad_sys_release(); - if (rc) - return rc; - - return status ? : size; -} - -static DEVICE_ATTR(device, S_IWUSR | S_IRUGO, - NULL, snd_cad_dev_store); - -static DEVICE_ATTR(volume, S_IWUSR | S_IRUGO, - NULL, snd_cad_vol_store); - -static int snd_cad_probe(struct platform_device *pdev) -{ - struct snd_cad_ctxt *snd = &the_snd; - struct snd_cad_sys_ctxt *snd_cad_sys = &the_snd_cad_sys; - int rc = 0; - - mutex_init(&snd->lock); - mutex_init(&snd_cad_sys->lock); - snd_cad_sys->ept = NULL; - snd->cad_epts = - (struct msm_cad_endpoints *)pdev->dev.platform_data; - rc = misc_register(&snd_cad_misc); - if (rc) - return rc; - - rc = device_create_file(snd_cad_misc.this_device, &dev_attr_device); - if (rc) { - misc_deregister(&snd_cad_misc); - return rc; - } - - rc = device_create_file(snd_cad_misc.this_device, &dev_attr_volume); - if (rc) { - device_remove_file(snd_cad_misc.this_device, - &dev_attr_device); - misc_deregister(&snd_cad_misc); - } - -#ifdef CONFIG_DEBUG_FS - rc = rtc_debugfs_create_entry(); - if (rc) { - device_remove_file(snd_cad_misc.this_device, - &dev_attr_volume); - device_remove_file(snd_cad_misc.this_device, - &dev_attr_device); - misc_deregister(&snd_cad_misc); - } -#endif - return rc; -} - -static struct platform_driver snd_cad_plat_driver = { - .probe = snd_cad_probe, - .driver = { - .name = "msm_cad", - .owner = THIS_MODULE, - }, -}; - -static int __init snd_cad_init(void) -{ - return platform_driver_register(&snd_cad_plat_driver); -} - -module_init(snd_cad_init); - -MODULE_DESCRIPTION("MSM CAD SND driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5/snd_pcm_client.c b/arch/arm/mach-msm/qdsp5/snd_pcm_client.c deleted file mode 100644 index 5c596017e473..000000000000 --- a/arch/arm/mach-msm/qdsp5/snd_pcm_client.c +++ /dev/null @@ -1,522 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SND_VOC_PCM_INTERFACE_PROG 0x30000002 -#define SND_VOC_PCM_INTERFACE_VERS 0x00020004 - -/* Supply always 160 words of PCM samples (20ms data) */ -#define MAX_VOC_FRAME_SIZE 160 -#define VOC_FRAME_DURATION 20 -/* Buffering for Maximum 8 frames between userspace and driver */ -#define MAX_VOC_FRAMES 8 -#define BUFSZ ((MAX_VOC_FRAME_SIZE*2)*MAX_VOC_FRAMES) -#define SND_VOC_PCM_CLIENT_INPUT_FN_TYPE_PROC 3 -#define SND_VOC_REGISTER_PCM_INPUT_CLIENT_PROC 24 - -#define START_CALLBACK_ID 0x12345678 -#define STOP_CALLBACK_ID 0xffffffff - -#define MAX_WAIT_CONSUME (MAX_VOC_FRAMES * VOC_FRAME_DURATION) -/* PCM Interfaces */ -enum voice_pcm_interface_type { - VOICE_PCM_INTERFACE_TX_INPUT = 3, /* PCM Inject input to PreProc */ -}; - -enum voice_pcm_interface_reg_status_type { - SUCCESS = 0, /* Success 0, else failure */ -}; - -/* status used by PCM input callbacks to indicate availability of PCM Data */ -enum voice_pcm_data_status_type { - VOICE_PCM_DATA_STATUS_AVAILABLE, /* Data available for PCM input */ - VOICE_PCM_DATA_STATUS_UNAVAILABLE, /* Data not available */ - VOICE_PCM_DATA_STATUS_MAX -}; - -/* Argument needed to register PCM input client */ -struct snd_voice_pcm_interface_ipclnt_reg_args { - /* Interface number specifies the PCM inject point */ - enum voice_pcm_interface_type interface; - /* Non-NULL indicates start,NULL indicates stop */ - uint32_t callback_id; -}; - -struct snd_voice_pcm_interface_ipclnt_reg_status { - enum voice_pcm_interface_reg_status_type status; -}; - -struct snd_voice_pcm_interface_ipclnt_fn_type_args { - uint32_t callback_id; - uint32_t pcm_data_ptr_not_null; - uint32_t pcm_data_max_length; -}; - -struct snd_voice_pcm_interface_ipclnt_fn_type_reply { - enum voice_pcm_data_status_type status; - struct { - uint32_t pcm_data_len; - struct { - uint16_t pcm_data_ignore; - uint16_t pcm_data_valid; - } pcm_data_val[MAX_VOC_FRAME_SIZE]; - } pcm_data; -}; - -struct buffer { - void *data; - unsigned size; - unsigned used; -}; - -struct audio { - struct buffer out[MAX_VOC_FRAMES]; - - uint8_t out_head; - uint8_t out_tail; - - atomic_t out_bytes; - /* data allocated for various buffers */ - char *data; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t wait; - wait_queue_head_t stop_wait; - - int buffer_finished; - int opened; - int enabled; - int running; - int stopped; /* set when stopped */ - - struct msm_rpc_client *client; -}; - -static struct audio the_audio; - -static int snd_voice_pcm_interface_ipclnt_reg_args( - struct msm_rpc_client *client, void *buf, void *data) -{ - struct snd_voice_pcm_interface_ipclnt_reg_args *arg; - int size = 0; - - arg = (struct snd_voice_pcm_interface_ipclnt_reg_args *)data; - *((int *)buf) = cpu_to_be32(arg->interface); - size += sizeof(int); - buf += sizeof(int); - *((int *)buf) = cpu_to_be32(arg->callback_id); - size += sizeof(int); - - return size; -} - -static int snd_voice_pcm_interface_ipclnt_reg_status( - struct msm_rpc_client *client, void *buf, void *data) -{ - struct snd_voice_pcm_interface_ipclnt_reg_status *result = - (struct snd_voice_pcm_interface_ipclnt_reg_status *)buf; - - *((int *)data) = be32_to_cpu(result->status); - return 0; -} - -static void process_callback(struct audio *audio, - void *buffer, int in_size) -{ - uint32_t accept_status = RPC_ACCEPTSTAT_SUCCESS; - struct rpc_request_hdr *req; - struct snd_voice_pcm_interface_ipclnt_fn_type_args arg, *buf_ptr; - struct snd_voice_pcm_interface_ipclnt_fn_type_reply *reply; - struct buffer *frame; - uint32_t status; - uint32_t pcm_data_len; - - req = (struct rpc_request_hdr *)buffer; - buf_ptr = (struct snd_voice_pcm_interface_ipclnt_fn_type_args *)\ - (req + 1); - arg.callback_id = be32_to_cpu(buf_ptr->callback_id); - arg.pcm_data_ptr_not_null = be32_to_cpu(buf_ptr->pcm_data_ptr_not_null); - arg.pcm_data_max_length = be32_to_cpu(buf_ptr->pcm_data_max_length); - - MM_DBG("callback_id = 0x%8x pcm_data_ptr_not_null = 0x%8x"\ - "pcm_data_max_length = 0x%8x\n", arg.callback_id,\ - arg.pcm_data_ptr_not_null, arg.pcm_data_max_length); - /* Flag interface as running */ - if (!audio->running) - audio->running = 1; - if (!arg.pcm_data_ptr_not_null) { - accept_status = RPC_ACCEPTSTAT_SYSTEM_ERR; - msm_rpc_start_accepted_reply(audio->client, - be32_to_cpu(req->xid), accept_status); - msm_rpc_send_accepted_reply(audio->client, 0); - return; - } - reply = (struct snd_voice_pcm_interface_ipclnt_fn_type_reply *) - msm_rpc_start_accepted_reply(audio->client, - be32_to_cpu(req->xid), accept_status); - frame = audio->out + audio->out_tail; - /* If Data available, send data */ - if (frame->used) { - int i; - unsigned short *src = frame->data; - atomic_add(frame->used, &audio->out_bytes); - status = VOICE_PCM_DATA_STATUS_AVAILABLE; - pcm_data_len = MAX_VOC_FRAME_SIZE; - xdr_send_int32(&audio->client->cb_xdr, &status); - xdr_send_int32(&audio->client->cb_xdr, &pcm_data_len); - /* Expected cb_xdr buffer size is more than PCM buffer size */ - for (i = 0; i < MAX_VOC_FRAME_SIZE; i++, ++src) - xdr_send_int16(&audio->client->cb_xdr, src); - frame->used = 0; - audio->out_tail = ((++audio->out_tail) % MAX_VOC_FRAMES); - wake_up(&audio->wait); - } else { - status = VOICE_PCM_DATA_STATUS_UNAVAILABLE; - pcm_data_len = 0; - xdr_send_int32(&audio->client->cb_xdr, &status); - xdr_send_int32(&audio->client->cb_xdr, &pcm_data_len); - wake_up(&audio->wait); - /* Flag all buffer completed */ - if (audio->stopped) { - audio->buffer_finished = 1; - wake_up(&audio->stop_wait); - } - } - MM_DBG("Provided PCM data = 0x%8x\n", reply->status); - msm_rpc_send_accepted_reply(audio->client, 0); - return; -} - -static int pcm_interface_process_callback_routine(struct msm_rpc_client *client, - void *buffer, int in_size) -{ - struct rpc_request_hdr *req; - struct audio *audio = &the_audio; - int rc = 0; - - req = (struct rpc_request_hdr *)buffer; - - MM_DBG("proc id = 0x%8x xid = 0x%8x size = 0x%8x\n", - be32_to_cpu(req->procedure), be32_to_cpu(req->xid), in_size); - switch (be32_to_cpu(req->procedure)) { - /* Procedure which called every 20ms for PCM samples request*/ - case SND_VOC_PCM_CLIENT_INPUT_FN_TYPE_PROC: - process_callback(audio, buffer, in_size); - break; - default: - MM_ERR("Not supported proceudure 0x%8x\n", - be32_to_cpu(req->procedure)); - /* Not supported RPC Procedure, send nagative code */ - msm_rpc_start_accepted_reply(client, be32_to_cpu(req->xid), - RPC_ACCEPTSTAT_PROC_UNAVAIL); - msm_rpc_send_accepted_reply(client, 0); - } - return rc; -} - -static void audio_flush(struct audio *audio) -{ - int cnt; - for (cnt = 0; cnt < MAX_VOC_FRAMES; cnt++) - audio->out[cnt].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->stopped = 0; - audio->running = 0; - audio->buffer_finished = 0; -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - int rc; - struct snd_voice_pcm_interface_ipclnt_reg_args arg; - struct snd_voice_pcm_interface_ipclnt_reg_status result; - - /* voice_pcm_interface_type */ - arg.interface = VOICE_PCM_INTERFACE_TX_INPUT; - /* Should be non-zero, unique */ - arg.callback_id = START_CALLBACK_ID; - /* Start Voice PCM interface */ - rc = msm_rpc_client_req(audio->client, - SND_VOC_REGISTER_PCM_INPUT_CLIENT_PROC, - snd_voice_pcm_interface_ipclnt_reg_args, &arg, - snd_voice_pcm_interface_ipclnt_reg_status, - &result, -1); - MM_DBG("input client registration status rc 0x%8x result 0x%8x\n", - rc, result.status); - /* If error in server side */ - if (rc == 0) - if (result.status != SUCCESS) - rc = -ENODEV; - return rc; -} -static int audio_disable(struct audio *audio) -{ - int rc; - struct snd_voice_pcm_interface_ipclnt_reg_args arg; - struct snd_voice_pcm_interface_ipclnt_reg_status result; - - /* Wait till all buffers consumed to prevent data loss - Also ensure if client stops due to vocoder disable - do not loop forever */ - rc = wait_event_interruptible_timeout(audio->stop_wait, - !(audio->running) || (audio->buffer_finished == 1), - msecs_to_jiffies(MAX_WAIT_CONSUME)); - if (rc < 0) - return 0; - /* voice_pcm_interface_type */ - arg.interface = VOICE_PCM_INTERFACE_TX_INPUT; - arg.callback_id = STOP_CALLBACK_ID; /* Should be zero */ - /* Stop Voice PCM interface */ - rc = msm_rpc_client_req(audio->client, - SND_VOC_REGISTER_PCM_INPUT_CLIENT_PROC, - snd_voice_pcm_interface_ipclnt_reg_args, &arg, - snd_voice_pcm_interface_ipclnt_reg_status, - &result, -1); - MM_DBG("input client de-registration status rc 0x%8x result 0x%8x\n", - rc, result.status); - /* If error in server side */ - if (rc == 0) - if (result.status != SUCCESS) - rc = -ENODEV; - return rc; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = atomic_read(&audio->out_bytes); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - rc = audio_enable(audio); - if (rc == 0) - audio->enabled = 1; - break; - case AUDIO_STOP: - if (audio->enabled) { - audio->stopped = 1; - rc = audio_disable(audio); - if (rc == 0) { - audio->enabled = 0; - audio->running = 0; - wake_up(&audio->wait); - } else - audio->stopped = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.type == 0) { - /* Selection for different PCM intect point */ - } else { - rc = -EINVAL; - break; - } - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = MAX_VOC_FRAME_SIZE * 2; - config.buffer_count = MAX_VOC_FRAMES; - config.sample_rate = 8000; - config.channel_count = 1; - config.type = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - default: { - rc = -EINVAL; - MM_ERR(" Unsupported ioctl 0x%8x\n", cmd); - } - } - mutex_unlock(&audio->lock); - return rc; -} -static ssize_t audio_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - int rc = 0; - - mutex_lock(&audio->write_lock); - /* Ensure to copy only till frame boundary */ - while (count >= (MAX_VOC_FRAME_SIZE*2)) { - frame = audio->out + audio->out_head; - rc = wait_event_interruptible_timeout(audio->wait,\ - (frame->used == 0) || (audio->stopped), - msecs_to_jiffies(MAX_WAIT_CONSUME)); - - if (rc < 0) - break; - if (audio->stopped) { - rc = -EBUSY; - break; - } - if (rc == 0) { - rc = -ETIMEDOUT; - break; - } - - xfer = count > frame->size ? frame->size : count; - if (copy_from_user(frame->data, buf, xfer)) { - rc = -EFAULT; - break; - } - frame->used = xfer; - audio->out_head = ((++audio->out_head) % MAX_VOC_FRAMES); - count -= xfer; - buf += xfer; - } - mutex_unlock(&audio->write_lock); - MM_DBG("write done 0x%8x\n", (unsigned int)(buf - start)); - if (rc < 0) - return rc; - return buf - start; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = &the_audio; - int rc, cnt; - - mutex_lock(&audio->lock); - - if (audio->opened) { - MM_ERR("busy as driver already in open state\n"); - rc = -EBUSY; - goto done; - } - - if (!audio->data) { - audio->data = kmalloc(BUFSZ, GFP_KERNEL); - if (!audio->data) { - MM_ERR("could not allocate buffers\n"); - rc = -ENOMEM; - goto done; - } - } - - audio->client = msm_rpc_register_client("voice_pcm_interface_client", - SND_VOC_PCM_INTERFACE_PROG, - SND_VOC_PCM_INTERFACE_VERS, 1, - pcm_interface_process_callback_routine); - if (IS_ERR(audio->client)) { - MM_ERR("Failed to register voice pcm interface client"\ - "to 0x%8x\n", SND_VOC_PCM_INTERFACE_PROG); - kfree(audio->data); - audio->data = NULL; - rc = -ENODEV; - goto done; - } - MM_INFO("voice pcm client registred %p\n", audio->client); - for (cnt = 0; cnt < MAX_VOC_FRAMES; cnt++) { - audio->out[cnt].data = (audio->data +\ - ((MAX_VOC_FRAME_SIZE * 2) * cnt)); - audio->out[cnt].size = MAX_VOC_FRAME_SIZE * 2; - MM_DBG("data ptr = %p\n", audio->out[cnt].data); - } - file->private_data = audio; - audio_flush(audio); - audio->opened = 1; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - if (audio->enabled) { - audio->stopped = 1; - audio_disable(audio); - audio->running = 0; - audio->enabled = 0; - wake_up(&audio->wait); - } - msm_rpc_unregister_client(audio->client); - kfree(audio->data); - audio->data = NULL; - audio->opened = 0; - mutex_unlock(&audio->lock); - return 0; -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, -}; - -static struct miscdevice audio_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "snd_pcm_client", - .fops = &audio_fops, -}; - -static int __init audio_init(void) -{ - mutex_init(&the_audio.lock); - mutex_init(&the_audio.write_lock); - init_waitqueue_head(&the_audio.wait); - init_waitqueue_head(&the_audio.stop_wait); - return misc_register(&audio_misc); -} -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/Makefile b/arch/arm/mach-msm/qdsp5v2/Makefile deleted file mode 100644 index 3ae3c1b1fb40..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -obj-y += afe.o audio_interct.o mi2s.o audio_dev_ctl.o voice.o - -ifeq ($(CONFIG_TIMPANI_CODEC), y) -obj-y += snddev_icodec.o -else ifeq ($(CONFIG_MARIMBA_CODEC), y) -obj-y += snddev_icodec.o -endif - -obj-$(CONFIG_MARIMBA_CODEC) += snddev_data_marimba.o -obj-$(CONFIG_TIMPANI_CODEC) += snddev_data_timpani.o - -obj-y += audio_pcm.o audpp.o audio_mp3.o audio_wma.o audio_aac.o audio_amrnb.o -obj-y += audio_amrwb.o audio_wmapro.o audio_adpcm.o audio_evrc.o audio_qcelp.o -obj-y += aux_pcm.o snddev_ecodec.o audio_out.o -obj-y += audio_lpa.o mp3_funcs.o pcm_funcs.o -obj-y += audpreproc.o audio_pcm_in.o audio_aac_in.o audio_amrnb_in.o audio_a2dp_in.o -obj-y += audio_evrc_in.o audio_qcelp_in.o -obj-y += adsp.o adsp_driver.o adsp_info.o -obj-y += audio_acdb.o snddev_virtual.o -obj-y += audio_fm.o -obj-y += lpa.o snddev_mi2s.o -obj-y += audio_mvs.o \ No newline at end of file diff --git a/arch/arm/mach-msm/qdsp5v2/adsp.c b/arch/arm/mach-msm/qdsp5v2/adsp.c deleted file mode 100644 index 371ef008f717..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/adsp.c +++ /dev/null @@ -1,1225 +0,0 @@ -/* - * Register/Interrupt access for userspace aDSP library. - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009,2011-2012 The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* TODO: - * - move shareable rpc code outside of adsp.c - * - general solution for virt->phys patchup - * - queue IDs should be relative to modules - * - disallow access to non-associated queues - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp.h" -#include -#include - -#ifdef CONFIG_DEBUG_FS -static struct dentry *dentry_adsp; -static struct dentry *dentry_wdata; -static struct dentry *dentry_rdata; -static int wdump, rdump; -#endif /* CONFIG_DEBUG_FS */ - -static struct adsp_info adsp_info; -static struct msm_adsp_module *adsp_modules; -static int adsp_open_count; - -static DEFINE_MUTEX(adsp_open_lock); - -/* protect interactions with the ADSP command/message queue */ -static spinlock_t adsp_cmd_lock; -static spinlock_t adsp_write_lock; - -static uint32_t current_image = -1; - -void adsp_set_image(struct adsp_info *info, uint32_t image) -{ - current_image = image; -} - -/* - * Checks whether the module_id is available in the - * module_entries table.If module_id is available returns `0`. - * If module_id is not available returns `-ENXIO`. - */ -static int32_t adsp_validate_module(uint32_t module_id) -{ - uint32_t *ptr; - uint32_t module_index; - uint32_t num_mod_entries; - - ptr = adsp_info.init_info_ptr->module_entries; - num_mod_entries = adsp_info.init_info_ptr->module_table_size; - - for (module_index = 0; module_index < num_mod_entries; module_index++) - if (module_id == ptr[module_index]) - return 0; - - return -ENXIO; -} - -static int32_t adsp_validate_queue(uint32_t mod_id, unsigned q_idx, - uint32_t size) -{ - int32_t i; - struct adsp_rtos_mp_mtoa_init_info_type *sptr; - - sptr = adsp_info.init_info_ptr; - for (i = 0; i < sptr->mod_to_q_entries; i++) - if (mod_id == sptr->mod_to_q_tbl[i].module) - if (q_idx == sptr->mod_to_q_tbl[i].q_type) { - if (size <= sptr->mod_to_q_tbl[i].q_max_len) - return 0; - MM_ERR("q_idx: %d is not a valid queue \ - for module %x\n", q_idx, mod_id); - return -EINVAL; - } - MM_ERR("cmd_buf size is more than allowed size\n"); - return -EINVAL; -} - -uint32_t adsp_get_module(struct adsp_info *info, uint32_t task) -{ - return info->task_to_module[current_image][task]; -} - -uint32_t adsp_get_queue_offset(struct adsp_info *info, uint32_t queue_id) -{ - return info->queue_offset[current_image][queue_id]; -} - -static int rpc_adsp_rtos_app_to_modem(uint32_t cmd, uint32_t module, - struct msm_adsp_module *adsp_module) -{ - struct adsp_rtos_atom_cmd adspsvc_cmd; - int err; - - adspsvc_cmd.cmd = cmd; - adspsvc_cmd.proc_id = RPC_ADSP_RTOS_PROC_APPS; - adspsvc_cmd.module = module; - adspsvc_cmd.cb_handle = adsp_info.cb_handle; - - err = dalrpc_fcn_5(DALDEVICE_ADSP_CMD_IDX | 0x80000000, - adsp_info.handle, - &adspsvc_cmd, sizeof(adspsvc_cmd)); - if (err < 0) - MM_ERR("ADSP command send Failed\n"); - - return 0; -} - -static int get_module_index(uint32_t id) -{ - int mod_idx; - for (mod_idx = 0; mod_idx < adsp_info.module_count; mod_idx++) - if (adsp_info.module[mod_idx].id == id) - return mod_idx; - - return -ENXIO; -} - -static struct msm_adsp_module *find_adsp_module_by_id( - struct adsp_info *info, uint32_t id) -{ - int mod_idx; - - if (id > info->max_module_id) { - return NULL; - } else { - mod_idx = get_module_index(id); - if (mod_idx < 0) - return NULL; - return info->id_to_module[mod_idx]; - } -} - -static struct msm_adsp_module *find_adsp_module_by_name( - struct adsp_info *info, const char *name) -{ - unsigned n; - for (n = 0; n < info->module_count; n++) - if (!strcmp(name, adsp_modules[n].name)) - return adsp_modules + n; - return NULL; -} - -/* - * Send RPC_ADSP_RTOS_CMD_GET_INIT_INFO cmd to ARM9 and get - * queue offsets and module entries (init info) as part of the event. - */ -static void msm_get_init_info(void) -{ - struct adsp_rtos_atom_cmd cmd; - int err; - - cmd.cmd = RPC_ADSP_RTOS_CMD_GET_INIT_INFO; - cmd.proc_id = RPC_ADSP_RTOS_PROC_APPS; - cmd.module = 0; - cmd.cb_handle = adsp_info.cb_handle; - - err = dalrpc_fcn_5(DALDEVICE_ADSP_CMD_IDX | 0x80000000, - adsp_info.handle, - &cmd, sizeof(cmd)); - if (err < 0) - MM_ERR("INIT_INFO command send Failed\n"); -} - -int msm_adsp_get(const char *name, struct msm_adsp_module **out, - struct msm_adsp_ops *ops, void *driver_data) -{ - struct msm_adsp_module *module; - int rc = 0; - - module = find_adsp_module_by_name(&adsp_info, name); - if (!module) - return -ENODEV; - - mutex_lock(&module->lock); - MM_DBG("opening module %s\n", module->name); - - if (module->ops) { - rc = -EBUSY; - mutex_unlock(&module->lock); - goto done; - } - - module->ops = ops; - module->driver_data = driver_data; - *out = module; - mutex_unlock(&module->lock); - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_REGISTER_APP, - module->id, module); - if (rc) { - mutex_lock(&module->lock); - module->ops = NULL; - module->driver_data = NULL; - *out = NULL; - MM_ERR("REGISTER_APP failed\n"); - mutex_unlock(&module->lock); - goto done; - } - - MM_INFO("module %s has been registered\n", module->name); - -done: - return rc; -} -EXPORT_SYMBOL(msm_adsp_get); - -void msm_adsp_put(struct msm_adsp_module *module) -{ - unsigned long flags; - - mutex_lock(&module->lock); - if (module->ops) { - MM_INFO("closing module %s\n", module->name); - - /* lock to ensure a dsp event cannot be delivered - * during or after removal of the ops and driver_data - */ - spin_lock_irqsave(&adsp_cmd_lock, flags); - module->ops = NULL; - module->driver_data = NULL; - spin_unlock_irqrestore(&adsp_cmd_lock, flags); - - if (module->state != ADSP_STATE_DISABLED) { - MM_INFO("disabling module %s\n", module->name); - mutex_unlock(&module->lock); - msm_adsp_disable(module); - return; - } - } else { - MM_INFO("module %s is already closed\n", module->name); - } - mutex_unlock(&module->lock); -} -EXPORT_SYMBOL(msm_adsp_put); - -int __msm_adsp_write(struct msm_adsp_module *module, unsigned dsp_queue_addr, - void *cmd_buf, size_t cmd_size) -{ - uint32_t ctrl_word; - uint32_t dsp_q_addr; - uint32_t dsp_addr; - uint32_t cmd_id = 0; - int cnt = 0; - int ret_status = 0; - unsigned long flags; - struct adsp_info *info; - - if (!module || !cmd_buf) { - MM_ERR("Called with NULL parameters\n"); - return -EINVAL; - } - info = module->info; - spin_lock_irqsave(&adsp_write_lock, flags); - - if (module->state != ADSP_STATE_ENABLED) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("module %s not enabled before write\n", module->name); - return -ENODEV; - } - if (adsp_validate_module(module->id)) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("module id validation failed %s %d\n", - module->name, module->id); - return -ENXIO; - } - if (dsp_queue_addr >= QDSP_MAX_NUM_QUEUES) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - MM_ERR("Invalid Queue Index: %d\n", dsp_queue_addr); - return -ENXIO; - } - if (adsp_validate_queue(module->id, dsp_queue_addr, cmd_size)) { - spin_unlock_irqrestore(&adsp_write_lock, flags); - return -EINVAL; - } - dsp_q_addr = adsp_get_queue_offset(info, dsp_queue_addr); - dsp_q_addr &= ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M; - - /* Poll until the ADSP is ready to accept a command. - * Wait for 100us, return error if it's not responding. - * If this returns an error, we need to disable ALL modules and - * then retry. - */ - while (((ctrl_word = readl(info->write_ctrl)) & - ADSP_RTOS_WRITE_CTRL_WORD_READY_M) != - ADSP_RTOS_WRITE_CTRL_WORD_READY_V) { - if (cnt > 50) { - MM_ERR("timeout waiting for DSP write ready\n"); - ret_status = -EIO; - goto fail; - } - MM_DBG("waiting for DSP write ready\n"); - udelay(2); - cnt++; - } - - /* Set the mutex bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V; - - /* Clear the command bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_CMD_M); - - /* Set the queue address bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M); - ctrl_word |= dsp_q_addr; - - writel(ctrl_word, info->write_ctrl); - - /* Generate an interrupt to the DSP. This notifies the DSP that - * we are about to send a command on this particular queue. The - * DSP will in response change its state. - */ - writel(1, info->send_irq); - - /* Poll until the adsp responds to the interrupt; this does not - * generate an interrupt from the adsp. This should happen within - * 5ms. - */ - cnt = 0; - while ((readl(info->write_ctrl) & - ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M) == - ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V) { - if (cnt > 2500) { - MM_ERR("timeout waiting for adsp ack\n"); - ret_status = -EIO; - goto fail; - } - udelay(2); - cnt++; - } - - /* Read the ctrl word */ - ctrl_word = readl(info->write_ctrl); - - if ((ctrl_word & ADSP_RTOS_WRITE_CTRL_WORD_STATUS_M) != - ADSP_RTOS_WRITE_CTRL_WORD_NO_ERR_V) { - ret_status = -EAGAIN; - goto fail; - } else { - /* No error */ - /* Get the DSP buffer address */ - dsp_addr = (ctrl_word & ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M) + - (uint32_t)MSM_AD5_BASE; - - if (dsp_addr < (uint32_t)(MSM_AD5_BASE + QDSP_RAMC_OFFSET)) { - uint16_t *buf_ptr = (uint16_t *) cmd_buf; - uint16_t *dsp_addr16 = (uint16_t *)dsp_addr; - cmd_size /= sizeof(uint16_t); - - /* Save the command ID */ - cmd_id = (uint32_t) buf_ptr[0]; - - /* Copy the command to DSP memory */ - cmd_size++; - while (--cmd_size) - *dsp_addr16++ = *buf_ptr++; - } else { - uint32_t *buf_ptr = (uint32_t *) cmd_buf; - uint32_t *dsp_addr32 = (uint32_t *)dsp_addr; - cmd_size /= sizeof(uint32_t); - - /* Save the command ID */ - cmd_id = buf_ptr[0]; - - cmd_size++; - while (--cmd_size) - *dsp_addr32++ = *buf_ptr++; - } - - /* Set the mutex bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V; - - /* Set the command bits to write done */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_CMD_M); - ctrl_word |= ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_DONE_V; - - /* Set the queue address bits */ - ctrl_word &= ~(ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M); - ctrl_word |= dsp_q_addr; - - writel(ctrl_word, info->write_ctrl); - - /* Generate an interrupt to the DSP. It does not respond with - * an interrupt, and we do not need to wait for it to - * acknowledge, because it will hold the mutex lock until it's - * ready to receive more commands again. - */ - writel(1, info->send_irq); - - module->num_commands++; - } /* Ctrl word status bits were 00, no error in the ctrl word */ - -fail: - spin_unlock_irqrestore(&adsp_write_lock, flags); - return ret_status; -} -EXPORT_SYMBOL(msm_adsp_write); - -int msm_adsp_write(struct msm_adsp_module *module, unsigned dsp_queue_addr, - void *cmd_buf, size_t cmd_size) -{ - int rc, retries = 0; -#ifdef CONFIG_DEBUG_FS - uint16_t *ptr; - int ii; - - if (wdump > 0) { - ptr = cmd_buf; - pr_info("A->D:%x\n", module->id); - pr_info("adsp: %x %d\n", dsp_queue_addr, cmd_size); - for (ii = 0; ii < cmd_size/2; ii++) - pr_info("%x ", ptr[ii]); - pr_info("\n"); - } -#endif /* CONFIG_DEBUG_FS */ - do { - rc = __msm_adsp_write(module, dsp_queue_addr, cmd_buf, - cmd_size); - if (rc == -EAGAIN) - udelay(50); - } while (rc == -EAGAIN && retries++ < 300); - if (retries > 20) - MM_INFO("%s command took %d attempts: rc %d\n", - module->name, retries, rc); - return rc; -} - -#ifdef CONFIG_MSM_ADSP_REPORT_EVENTS -static void *event_addr; -static void read_event(void *buf, size_t len) -{ - uint32_t dptr[3]; - struct adsp_rtos_mp_mtoa_s_type *sptr; - struct adsp_rtos_mp_mtoa_type *pkt_ptr; - - sptr = event_addr; - pkt_ptr = &sptr->adsp_rtos_mp_mtoa_data.mp_mtoa_packet; - - dptr[0] = sptr->mp_mtoa_header.event; - dptr[1] = pkt_ptr->module; - dptr[2] = pkt_ptr->image; - - if (len > EVENT_LEN) - len = EVENT_LEN; - - memcpy(buf, dptr, len); -} -#endif - -static void adsp_rtos_mtoa_cb(void *context, uint32_t param, - void *evt_buf, uint32_t len) -{ - struct adsp_rtos_mp_mtoa_s_type *args = NULL; - uint32_t event = 0; - uint32_t proc_id = 0; - uint32_t module_id; - uint32_t image; - struct msm_adsp_module *module; - struct adsp_rtos_mp_mtoa_type *pkt_ptr; - struct queue_to_offset_type *qptr; - struct queue_to_offset_type *qtbl; - struct mod_to_queue_offsets *mqptr; - struct mod_to_queue_offsets *mqtbl; - uint32_t *mptr; - uint32_t *mtbl; - uint32_t q_idx; - uint32_t num_entries; - uint32_t entries_per_image; - struct adsp_rtos_mp_mtoa_init_info_type *iptr; - struct adsp_rtos_mp_mtoa_init_info_type *sptr; - int32_t i_no, e_idx; - static uint32_t init_info_completed; - static uint32_t init_info_len = - sizeof(struct adsp_rtos_mp_mtoa_header_type); - static uint32_t next_init_info_byte; - static uint32_t expected_byte = 1; - uint32_t hdr_len = sizeof(struct adsp_rtos_mp_mtoa_header_type); - - if (len) { - args = (struct adsp_rtos_mp_mtoa_s_type *) evt_buf; - event = args->mp_mtoa_header.event; - proc_id = args->mp_mtoa_header.proc_id; - } - - if (!init_info_completed && event == RPC_ADSP_RTOS_INIT_INFO) { - memcpy(((char *)adsp_info.raw_event) + init_info_len, - (char *)evt_buf + hdr_len + 4, - len - ((hdr_len + 4))); - init_info_len += (len - (hdr_len + 4)); - evt_buf += hdr_len; - next_init_info_byte = *(uint32_t *) evt_buf; - expected_byte += len; - if (next_init_info_byte && - (expected_byte != next_init_info_byte)) { - MM_ERR("INIT_INFO - expecting next byte to be %d\n" - "\tbut ADSPSVC indicated next byte to be %d\n", - expected_byte, next_init_info_byte); - return; - } - if (!next_init_info_byte) { - args = adsp_info.raw_event; - args->mp_mtoa_header.event = event; - args->mp_mtoa_header.proc_id = proc_id; - init_info_completed = 1; - } else - return; - } - - if (event == RPC_ADSP_RTOS_INIT_INFO) { - MM_INFO("INIT_INFO Event\n"); - sptr = &args->adsp_rtos_mp_mtoa_data.mp_mtoa_init_packet; - - iptr = adsp_info.init_info_ptr; - iptr->image_count = sptr->image_count; - if (iptr->image_count > IMG_MAX) - iptr->image_count = IMG_MAX; - iptr->num_queue_offsets = sptr->num_queue_offsets; - num_entries = iptr->num_queue_offsets; - if (num_entries > ENTRIES_MAX) { - num_entries = ENTRIES_MAX; - iptr->num_queue_offsets = ENTRIES_MAX; - } - qptr = &sptr->queue_offsets_tbl[0][0]; - for (i_no = 0; i_no < iptr->image_count; i_no++) { - qtbl = &iptr->queue_offsets_tbl[i_no][0]; - for (e_idx = 0; e_idx < num_entries; e_idx++) { - qtbl[e_idx].offset = qptr->offset; - qtbl[e_idx].queue = qptr->queue; - q_idx = qptr->queue; - iptr->queue_offsets[i_no][q_idx] = - qtbl[e_idx].offset; - qptr++; - } - } - - num_entries = sptr->num_task_module_entries; - if (num_entries > ENTRIES_MAX) - num_entries = ENTRIES_MAX; - iptr->num_task_module_entries = num_entries; - entries_per_image = num_entries / iptr->image_count; - mptr = &sptr->task_to_module_tbl[0][0]; - for (i_no = 0; i_no < iptr->image_count; i_no++) { - mtbl = &iptr->task_to_module_tbl[i_no][0]; - for (e_idx = 0; e_idx < entries_per_image; e_idx++) { - mtbl[e_idx] = *mptr; - mptr++; - } - } - - iptr->module_table_size = sptr->module_table_size; - if (iptr->module_table_size > MODULES_MAX) - iptr->module_table_size = MODULES_MAX; - mptr = &sptr->module_entries[0]; - for (i_no = 0; i_no < iptr->module_table_size; i_no++) - iptr->module_entries[i_no] = mptr[i_no]; - - mqptr = &sptr->mod_to_q_tbl[0]; - mqtbl = &iptr->mod_to_q_tbl[0]; - iptr->mod_to_q_entries = sptr->mod_to_q_entries; - if (iptr->mod_to_q_entries > ENTRIES_MAX) - iptr->mod_to_q_entries = ENTRIES_MAX; - for (e_idx = 0; e_idx < iptr->mod_to_q_entries; e_idx++) { - mqtbl[e_idx].module = mqptr->module; - mqtbl[e_idx].q_type = mqptr->q_type; - mqtbl[e_idx].q_max_len = mqptr->q_max_len; - mqptr++; - } - - adsp_info.init_info_state = ADSP_STATE_INIT_INFO; - kfree(adsp_info.raw_event); - wake_up(&adsp_info.init_info_wait); - return; - } - pkt_ptr = &args->adsp_rtos_mp_mtoa_data.mp_mtoa_packet; - module_id = pkt_ptr->module; - image = pkt_ptr->image; - - MM_INFO("rpc event=%d, proc_id=%d, module=%d, image=%d\n", - event, proc_id, module_id, image); - - module = find_adsp_module_by_id(&adsp_info, module_id); - if (!module) { - MM_ERR("module %d is not supported!\n", module_id); - return; - } - - mutex_lock(&module->lock); - switch (event) { - case RPC_ADSP_RTOS_MOD_READY: - MM_INFO("module %s: READY\n", module->name); - module->state = ADSP_STATE_ENABLED; - wake_up(&module->state_wait); - adsp_set_image(module->info, image); - break; - case RPC_ADSP_RTOS_MOD_DISABLE: - MM_INFO("module %s: DISABLED\n", module->name); - module->state = ADSP_STATE_DISABLED; - wake_up(&module->state_wait); - break; - case RPC_ADSP_RTOS_SERVICE_RESET: - MM_INFO("module %s: SERVICE_RESET\n", module->name); - module->state = ADSP_STATE_DISABLED; - wake_up(&module->state_wait); - break; - case RPC_ADSP_RTOS_CMD_SUCCESS: - MM_INFO("module %s: CMD_SUCCESS\n", module->name); - break; - case RPC_ADSP_RTOS_CMD_FAIL: - MM_INFO("module %s: CMD_FAIL\n", module->name); - break; - case RPC_ADSP_RTOS_DISABLE_FAIL: - MM_INFO("module %s: DISABLE_FAIL\n", module->name); - break; - default: - MM_ERR("unknown event %d\n", event); - mutex_unlock(&module->lock); - return; - } -#ifdef CONFIG_MSM_ADSP_REPORT_EVENTS - event_addr = (uint32_t *)evt_buf; - if (module->ops) - module->ops->event(module->driver_data, - EVENT_MSG_ID, - EVENT_LEN, - read_event); -#endif - mutex_unlock(&module->lock); -} - -static size_t read_event_size; -static void *read_event_addr; - -static void read_event_16(void *buf, size_t len) -{ - uint16_t *dst = buf; - uint16_t *src = read_event_addr; - len /= 2; - if (len > read_event_size) - len = read_event_size; - while (len--) - *dst++ = *src++; -} - -static void read_event_32(void *buf, size_t len) -{ - uint32_t *dst = buf; - uint32_t *src = read_event_addr; - len /= 2; - if (len > read_event_size) - len = read_event_size; - while (len--) - *dst++ = *src++; -} - -static int adsp_rtos_read_ctrl_word_cmd_tast_to_h_v( - struct adsp_info *info, void *dsp_addr) -{ - struct msm_adsp_module *module; - unsigned rtos_task_id; - unsigned msg_id; - unsigned msg_length; -#ifdef CONFIG_DEBUG_FS - uint16_t *ptr; - int ii; -#endif /* CONFIG_DEBUG_FS */ - void (*func)(void *, size_t); - - if (dsp_addr >= (void *)(MSM_AD5_BASE + QDSP_RAMC_OFFSET)) { - uint32_t *dsp_addr32 = dsp_addr; - uint32_t tmp = *dsp_addr32++; - rtos_task_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M) >> 8; - msg_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M); - read_event_size = tmp >> 16; - read_event_addr = dsp_addr32; - msg_length = read_event_size * sizeof(uint32_t); - func = read_event_32; - } else { - uint16_t *dsp_addr16 = dsp_addr; - uint16_t tmp = *dsp_addr16++; - rtos_task_id = (tmp & ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M) >> 8; - msg_id = tmp & ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M; - read_event_size = *dsp_addr16++; - read_event_addr = dsp_addr16; - msg_length = read_event_size * sizeof(uint16_t); - func = read_event_16; - } - - if (rtos_task_id > info->max_task_id) { - MM_ERR("bogus task id %d\n", rtos_task_id); - return 0; - } - module = find_adsp_module_by_id(info, - adsp_get_module(info, rtos_task_id)); - - if (!module) { - MM_ERR("no module for task id %d\n", rtos_task_id); - return 0; - } - - module->num_events++; - - if (!module->ops) { - MM_ERR("module %s is not open\n", module->name); - return 0; - } -#ifdef CONFIG_DEBUG_FS - if (rdump > 0) { - ptr = read_event_addr; - pr_info("D->A\n"); - pr_info("m_id = %x id = %x\n", module->id, msg_id); - for (ii = 0; ii < msg_length/2; ii++) - pr_info("%x ", ptr[ii]); - pr_info("\n"); - } -#endif /* CONFIG_DEBUG_FS */ - - module->ops->event(module->driver_data, msg_id, msg_length, func); - return 0; -} - -static int adsp_get_event(struct adsp_info *info) -{ - uint32_t ctrl_word; - uint32_t ready; - void *dsp_addr; - uint32_t cmd_type; - int cnt; - unsigned long flags; - int rc = 0; - - spin_lock_irqsave(&adsp_cmd_lock, flags); - - /* Whenever the DSP has a message, it updates this control word - * and generates an interrupt. When we receive the interrupt, we - * read this register to find out what ADSP task the command is - * comming from. - * - * The ADSP should *always* be ready on the first call, but the - * irq handler calls us in a loop (to handle back-to-back command - * processing), so we give the DSP some time to return to the - * ready state. The DSP will not issue another IRQ for events - * pending between the first IRQ and the event queue being drained, - * unfortunately. - */ - - for (cnt = 0; cnt < 50; cnt++) { - ctrl_word = readl(info->read_ctrl); - - if ((ctrl_word & ADSP_RTOS_READ_CTRL_WORD_FLAG_M) == - ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_CONT_V) - goto ready; - - udelay(2); - } - MM_ERR("not ready after 100uS\n"); - rc = -EBUSY; - goto done; - -ready: - /* Here we check to see if there are pending messages. If there are - * none, we siply return -EAGAIN to indicate that there are no more - * messages pending. - */ - ready = ctrl_word & ADSP_RTOS_READ_CTRL_WORD_READY_M; - if ((ready != ADSP_RTOS_READ_CTRL_WORD_READY_V) && - (ready != ADSP_RTOS_READ_CTRL_WORD_CONT_V)) { - rc = -EAGAIN; - goto done; - } - - /* DSP says that there are messages waiting for the host to read */ - - /* Get the Command Type */ - cmd_type = ctrl_word & ADSP_RTOS_READ_CTRL_WORD_CMD_TYPE_M; - - /* Get the DSP buffer address */ - dsp_addr = (void *)((ctrl_word & - ADSP_RTOS_READ_CTRL_WORD_DSP_ADDR_M) + - (uint32_t)MSM_AD5_BASE); - - /* We can only handle Task-to-Host messages */ - if (cmd_type != ADSP_RTOS_READ_CTRL_WORD_CMD_TASK_TO_H_V) { - MM_ERR("unknown dsp cmd_type %d\n", cmd_type); - rc = -EIO; - goto done; - } - - adsp_rtos_read_ctrl_word_cmd_tast_to_h_v(info, dsp_addr); - - ctrl_word = readl(info->read_ctrl); - ctrl_word &= ~ADSP_RTOS_READ_CTRL_WORD_READY_M; - - /* Write ctrl word to the DSP */ - writel(ctrl_word, info->read_ctrl); - - /* Generate an interrupt to the DSP */ - writel(1, info->send_irq); - -done: - spin_unlock_irqrestore(&adsp_cmd_lock, flags); - return rc; -} - -static irqreturn_t adsp_irq_handler(int irq, void *data) -{ - struct adsp_info *info = &adsp_info; - int cnt = 0; - for (cnt = 0; cnt < 15; cnt++) - if (adsp_get_event(info) < 0) - break; - if (cnt > info->event_backlog_max) - info->event_backlog_max = cnt; - info->events_received += cnt; - if (cnt == 15) - MM_ERR("too many (%d) events for single irq!\n", cnt); - return IRQ_HANDLED; -} - -int adsp_set_clkrate(struct msm_adsp_module *module, unsigned long clk_rate) -{ - if (module->clk && clk_rate) - return clk_set_rate(module->clk, clk_rate); - - return -EINVAL; -} - -int msm_adsp_enable(struct msm_adsp_module *module) -{ - int rc = 0; - - MM_INFO("enable '%s'state[%d] id[%d]\n", - module->name, module->state, module->id); - - mutex_lock(&module->lock); - switch (module->state) { - case ADSP_STATE_DISABLED: - module->state = ADSP_STATE_ENABLING; - mutex_unlock(&module->lock); - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_ENABLE, - module->id, module); - if (rc) { - mutex_lock(&module->lock); - module->state = ADSP_STATE_DISABLED; - break; - } - rc = wait_event_timeout(module->state_wait, - module->state != ADSP_STATE_ENABLING, - 1 * HZ); - mutex_lock(&module->lock); - if (module->state == ADSP_STATE_ENABLED) { - rc = 0; - } else { - MM_ERR("module '%s' enable timed out\n", module->name); - rc = -ETIMEDOUT; - } - if (module->open_count++ == 0 && module->clk) - clk_prepare_enable(module->clk); - - mutex_lock(&adsp_open_lock); - if (adsp_open_count++ == 0) - enable_irq(adsp_info.int_adsp); - mutex_unlock(&adsp_open_lock); - break; - case ADSP_STATE_ENABLING: - MM_DBG("module '%s' enable in progress\n", module->name); - break; - case ADSP_STATE_ENABLED: - MM_DBG("module '%s' already enabled\n", module->name); - break; - case ADSP_STATE_DISABLING: - MM_ERR("module '%s' disable in progress\n", module->name); - rc = -EBUSY; - break; - } - mutex_unlock(&module->lock); - return rc; -} -EXPORT_SYMBOL(msm_adsp_enable); - -int msm_adsp_disable_event_rsp(struct msm_adsp_module *module) -{ - int rc = 0; - - mutex_lock(&module->lock); - - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_DISABLE_EVENT_RSP, - module->id, module); - mutex_unlock(&module->lock); - - return rc; -} -EXPORT_SYMBOL(msm_adsp_disable_event_rsp); - -int msm_adsp_disable(struct msm_adsp_module *module) -{ - int rc = 0; - - mutex_lock(&module->lock); - switch (module->state) { - case ADSP_STATE_DISABLED: - MM_DBG("module '%s' already disabled\n", module->name); - mutex_unlock(&module->lock); - break; - case ADSP_STATE_ENABLING: - case ADSP_STATE_ENABLED: - mutex_unlock(&module->lock); - rc = rpc_adsp_rtos_app_to_modem(RPC_ADSP_RTOS_CMD_DISABLE, - module->id, module); - mutex_lock(&module->lock); - module->state = ADSP_STATE_DISABLED; - if (--module->open_count == 0 && module->clk) - clk_disable_unprepare(module->clk); - mutex_unlock(&module->lock); - mutex_lock(&adsp_open_lock); - if (--adsp_open_count == 0) { - disable_irq(adsp_info.int_adsp); - MM_INFO("disable interrupt\n"); - } - mutex_unlock(&adsp_open_lock); - break; - } - return rc; -} -EXPORT_SYMBOL(msm_adsp_disable); - -static int msm_adsp_probe(struct platform_device *pdev) -{ - unsigned count; - int rc, i; - - adsp_info.int_adsp = platform_get_irq(pdev, 0); - if (adsp_info.int_adsp < 0) { - MM_ERR("no irq resource?\n"); - return -ENODEV; - } - - adsp_info.init_info_ptr = kzalloc( - (sizeof(struct adsp_rtos_mp_mtoa_init_info_type)), GFP_KERNEL); - if (!adsp_info.init_info_ptr) - return -ENOMEM; - - adsp_info.raw_event = kzalloc( - (sizeof(struct adsp_rtos_mp_mtoa_s_type)), GFP_KERNEL); - if (!adsp_info.raw_event) { - kfree(adsp_info.init_info_ptr); - return -ENOMEM; - } - - rc = adsp_init_info(&adsp_info); - if (rc) { - kfree(adsp_info.init_info_ptr); - kfree(adsp_info.raw_event); - return rc; - } - adsp_info.send_irq += (uint32_t) MSM_AD5_BASE; - adsp_info.read_ctrl += (uint32_t) MSM_AD5_BASE; - adsp_info.write_ctrl += (uint32_t) MSM_AD5_BASE; - count = adsp_info.module_count; - - adsp_modules = kzalloc( - (sizeof(struct msm_adsp_module) + sizeof(void *)) * - count, GFP_KERNEL); - if (!adsp_modules) { - kfree(adsp_info.init_info_ptr); - kfree(adsp_info.raw_event); - return -ENOMEM; - } - - adsp_info.id_to_module = (void *) (adsp_modules + count); - - spin_lock_init(&adsp_cmd_lock); - spin_lock_init(&adsp_write_lock); - - rc = request_irq(adsp_info.int_adsp, adsp_irq_handler, - IRQF_TRIGGER_RISING, "adsp", 0); - if (rc < 0) - goto fail_request_irq; - disable_irq(adsp_info.int_adsp); - - for (i = 0; i < count; i++) { - struct msm_adsp_module *mod = adsp_modules + i; - mutex_init(&mod->lock); - init_waitqueue_head(&mod->state_wait); - mod->info = &adsp_info; - mod->name = adsp_info.module[i].name; - mod->id = adsp_info.module[i].id; - if (adsp_info.module[i].clk_name) - mod->clk = clk_get(NULL, adsp_info.module[i].clk_name); - else - mod->clk = NULL; - if (mod->clk && adsp_info.module[i].clk_rate) - clk_set_rate(mod->clk, adsp_info.module[i].clk_rate); - mod->verify_cmd = adsp_info.module[i].verify_cmd; - mod->patch_event = adsp_info.module[i].patch_event; - INIT_HLIST_HEAD(&mod->pmem_regions); - mod->pdev.name = adsp_info.module[i].pdev_name; - mod->pdev.id = -1; - adsp_info.id_to_module[i] = mod; - platform_device_register(&mod->pdev); - } - - msm_adsp_publish_cdevs(adsp_modules, count); - - rc = daldevice_attach(DALRPC_ADSPSVC_DEVICEID, DALRPC_ADSPSVC_PORT, - DALRPC_ADSPSVC_DEST, &adsp_info.handle); - if (rc) { - MM_ERR("adsp attach failed : %d\n", rc); - goto fail_dal_attach; - } - - adsp_info.cb_handle = dalrpc_alloc_cb(adsp_info.handle, - adsp_rtos_mtoa_cb, NULL); - if (adsp_info.cb_handle == NULL) { - MM_ERR("Callback registration failed\n"); - goto fail_allocate_cb; - } - - /* Get INIT_INFO */ - init_waitqueue_head(&adsp_info.init_info_wait); - msm_get_init_info(); - rc = wait_event_timeout(adsp_info.init_info_wait, - adsp_info.init_info_state == ADSP_STATE_INIT_INFO, - 10 * HZ); - if (!rc) { - MM_ERR("INIT_INFO failed\n"); - rc = -ETIMEDOUT; - } else - return 0; - -fail_allocate_cb: - daldevice_detach(adsp_info.handle); - adsp_info.handle = NULL; -fail_dal_attach: - enable_irq(adsp_info.int_adsp); - free_irq(adsp_info.int_adsp, 0); -fail_request_irq: - kfree(adsp_modules); - kfree(adsp_info.init_info_ptr); - kfree(adsp_info.raw_event); - return rc; -} - -#ifdef CONFIG_DEBUG_FS -static int get_parameters(char *buf, long int *param1, int num_of_par) -{ - char *token; - int base, cnt; - - token = strsep(&buf, " "); - - for (cnt = 0; cnt < num_of_par; cnt++) { - if (token != NULL) { - if ((token[1] == 'x') || (token[1] == 'X')) - base = 16; - else - base = 10; - - if (strict_strtoul(token, base, ¶m1[cnt]) != 0) - return -EINVAL; - - token = strsep(&buf, " "); - } - else - return -EINVAL; - } - return 0; -} - -static ssize_t adsp_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - pr_debug("adsp debugfs opened\n"); - return 0; -} -static ssize_t adsp_debug_write(struct file *file, const char __user *buf, - size_t cnt, loff_t *ppos) -{ - char *access_str = file->private_data; - char lbuf[32]; - int rc; - long int param[5]; - - if (cnt > sizeof(lbuf) - 1) - return -EINVAL; - rc = copy_from_user(lbuf, buf, cnt); - if (rc) { - pr_info("Unable to copy data from user space\n"); - return -EFAULT; - } - lbuf[cnt] = '\0'; - - if (!strncmp(access_str, "write_log", 9)) { - if (get_parameters(lbuf, param, 1) == 0) { - switch (param[0]) { - case 1: - if (wdump <= 0) - wdump = 1; - pr_debug("write cmd to DSP(A->D) dump \ - started:%d\n", wdump); - break; - case 0: - if (wdump > 0) - wdump = 0; - pr_debug("Stop write cmd to \ - DSP(A->D):%d\n", wdump); - break; - default: - rc = -EINVAL; - break; - } - } else - rc = -EINVAL; - } else if (!strncmp(access_str, "read_log", 8)) { - if (get_parameters(lbuf, param, 1) == 0) { - switch (param[0]) { - case 1: - if (rdump <= 0) - rdump = 1; - pr_debug("write cmd from DSP(D->A) dump \ - started:%d\n", wdump); - break; - case 0: - if (rdump > 0) - rdump = 0; - pr_debug("Stop write cmd from \ - DSP(D->A):%d\n", wdump); - break; - default: - rc = -EINVAL; - break; - } - } else - rc = -EINVAL; - } else { - rc = -EINVAL; - } - if (rc == 0) - rc = cnt; - else { - pr_err("%s: rc = %d\n", __func__, rc); - pr_info("\nWrong command: Use =>\n"); - pr_info("-------------------------\n"); - pr_info("To Start A->D:: echo \"1\">/sys/kernel/debug/ \ - adsp_cmd/write_log\n"); - pr_info("To Start D->A:: echo \"1\">/sys/kernel/debug/ \ - adsp_cmd/read_log\n"); - pr_info("To Stop A->D:: echo \"0\">/sys/kernel/debug/ \ - adsp_cmd/write_log\n"); - pr_info("To Stop D->A:: echo \"0\">/sys/kernel/debug/ \ - adsp_cmd/read_log\n"); - pr_info("------------------------\n"); - } - - return rc; -} -#endif - -static struct platform_driver msm_adsp_driver = { - .probe = msm_adsp_probe, - .driver = { - .owner = THIS_MODULE, - }, -}; - -static char msm_adsp_driver_name[] = "msm_adsp"; - -#ifdef CONFIG_DEBUG_FS -static const struct file_operations adsp_debug_fops = { - .write = adsp_debug_write, - .open = adsp_debug_open, -}; -#endif - -static int __init adsp_init(void) -{ - int rc; - -#ifdef CONFIG_DEBUG_FS - dentry_adsp = debugfs_create_dir("adsp_cmd", 0); - if (!IS_ERR(dentry_adsp)) { - dentry_wdata = debugfs_create_file("write_log", \ - S_IFREG | S_IRUGO, dentry_adsp, - (void *) "write_log" , &adsp_debug_fops); - dentry_rdata = debugfs_create_file("read_log", \ - S_IFREG | S_IRUGO, dentry_adsp, - (void *) "read_log", &adsp_debug_fops); - } -#endif /* CONFIG_DEBUG_FS */ - - msm_adsp_driver.driver.name = msm_adsp_driver_name; - rc = platform_driver_register(&msm_adsp_driver); - MM_INFO("%s -- %d\n", msm_adsp_driver_name, rc); - return rc; -} - -device_initcall(adsp_init); diff --git a/arch/arm/mach-msm/qdsp5v2/adsp.h b/arch/arm/mach-msm/qdsp5v2/adsp.h deleted file mode 100644 index b5a574beaa0e..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/adsp.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _ARCH_ARM_MACH_MSM_ADSP_H -#define _ARCH_ARM_MACH_MSM_ADSP_H - -#include -#include -#include -#include -#include - -int adsp_pmem_fixup(struct msm_adsp_module *module, void **addr, - unsigned long len); -int adsp_pmem_fixup_kvaddr(struct msm_adsp_module *module, void **addr, - unsigned long *kvaddr, unsigned long len); -int adsp_pmem_paddr_fixup(struct msm_adsp_module *module, void **addr); - -int adsp_vfe_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_jpeg_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_lpm_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_video_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); -int adsp_videoenc_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size); - - -struct adsp_event; - -int adsp_vfe_patch_event(struct msm_adsp_module *module, - struct adsp_event *event); - -int adsp_jpeg_patch_event(struct msm_adsp_module *module, - struct adsp_event *event); - - -struct adsp_module_info { - const char *name; - const char *pdev_name; - uint32_t id; - const char *clk_name; - unsigned long clk_rate; - int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *, - size_t); - int (*patch_event) (struct msm_adsp_module*, struct adsp_event *); -}; - -#define ADSP_EVENT_MAX_SIZE 496 -#define EVENT_LEN 12 -#define EVENT_MSG_ID ((uint16_t)~0) - -struct adsp_event { - struct list_head list; - uint32_t size; /* always in bytes */ - uint16_t msg_id; - uint16_t type; /* 0 for msgs (from aDSP), -1 for events (from ARM9) */ - int is16; /* always 0 (msg is 32-bit) when the event type is 1(ARM9) */ - union { - uint16_t msg16[ADSP_EVENT_MAX_SIZE / 2]; - uint32_t msg32[ADSP_EVENT_MAX_SIZE / 4]; - } data; -}; - -#define DALRPC_ADSPSVC_DEVICEID 0x0200009A -#define DALRPC_ADSPSVC_DEST SMD_APPS_MODEM -#define DALRPC_ADSPSVC_PORT "DAL00" - -enum { - DALDEVICE_ADSP_CMD_IDX = DALDEVICE_FIRST_DEVICE_API_IDX, -}; - -struct adsp_rtos_atom_cmd { - uint32_t cmd; - uint32_t proc_id; - uint32_t module; - void *cb_handle; -}; - -enum rpc_adsp_rtos_proc_type { - RPC_ADSP_RTOS_PROC_NONE = 0, - RPC_ADSP_RTOS_PROC_MODEM = 1, - RPC_ADSP_RTOS_PROC_APPS = 2, -}; - -enum { - RPC_ADSP_RTOS_CMD_REGISTER_APP, - RPC_ADSP_RTOS_CMD_ENABLE, - RPC_ADSP_RTOS_CMD_DISABLE, - RPC_ADSP_RTOS_CMD_KERNEL_COMMAND, - RPC_ADSP_RTOS_CMD_16_COMMAND, - RPC_ADSP_RTOS_CMD_32_COMMAND, - RPC_ADSP_RTOS_CMD_DISABLE_EVENT_RSP, - RPC_ADSP_RTOS_CMD_REMOTE_EVENT, - RPC_ADSP_RTOS_CMD_SET_STATE, - RPC_ADSP_RTOS_CMD_REMOTE_INIT_INFO_EVENT, - RPC_ADSP_RTOS_CMD_GET_INIT_INFO, -}; - -enum rpc_adsp_rtos_mod_status_type { - RPC_ADSP_RTOS_MOD_READY, - RPC_ADSP_RTOS_MOD_DISABLE, - RPC_ADSP_RTOS_SERVICE_RESET, - RPC_ADSP_RTOS_CMD_FAIL, - RPC_ADSP_RTOS_CMD_SUCCESS, - RPC_ADSP_RTOS_INIT_INFO, - RPC_ADSP_RTOS_DISABLE_FAIL, -}; - -enum qdsp_image_type { - QDSP_IMAGE_COMBO, - QDSP_IMAGE_GAUDIO, - QDSP_IMAGE_QTV_LP, - QDSP_IMAGE_MAX, - /* DO NOT USE: Force this enum to be a 32bit type to improve speed */ - QDSP_IMAGE_32BIT_DUMMY = 0x10000 -}; - -struct adsp_rtos_mp_mtoa_header_type { - enum rpc_adsp_rtos_mod_status_type event; - uint32_t version; - enum rpc_adsp_rtos_proc_type proc_id; -}; - -/* ADSP RTOS MP Communications - Modem to APP's Event Info*/ -struct adsp_rtos_mp_mtoa_type { - uint32_t module; - uint32_t image; - uint32_t apps_okts; -}; - -/* ADSP RTOS MP Communications - Modem to APP's Init Info */ -#define IMG_MAX 2 -#define ENTRIES_MAX 36 -#define MODULES_MAX 64 -#define QUEUES_MAX 64 - -struct queue_to_offset_type { - uint32_t queue; - uint32_t offset; -}; - -struct mod_to_queue_offsets { - uint32_t module; - uint32_t q_type; - uint32_t q_max_len; -}; - -struct adsp_rtos_mp_mtoa_init_info_type { - uint32_t image_count; - uint32_t num_queue_offsets; - struct queue_to_offset_type queue_offsets_tbl[IMG_MAX][ENTRIES_MAX]; - uint32_t num_task_module_entries; - uint32_t task_to_module_tbl[IMG_MAX][ENTRIES_MAX]; - - uint32_t module_table_size; - uint32_t module_entries[MODULES_MAX]; - uint32_t mod_to_q_entries; - struct mod_to_queue_offsets mod_to_q_tbl[ENTRIES_MAX]; - /* - * queue_offsets[] is to store only queue_offsets - */ - uint32_t queue_offsets[IMG_MAX][QUEUES_MAX]; -}; - -struct adsp_rtos_mp_mtoa_s_type { - struct adsp_rtos_mp_mtoa_header_type mp_mtoa_header; - - union { - struct adsp_rtos_mp_mtoa_init_info_type mp_mtoa_init_packet; - struct adsp_rtos_mp_mtoa_type mp_mtoa_packet; - } adsp_rtos_mp_mtoa_data; -}; - -struct adsp_info { - uint32_t send_irq; - uint32_t read_ctrl; - uint32_t write_ctrl; - - uint32_t max_msg16_size; - uint32_t max_msg32_size; - - uint32_t max_task_id; - uint32_t max_module_id; - uint32_t max_queue_id; - uint32_t max_image_id; - - /* for each image id, a map of queue id to offset */ - uint32_t **queue_offset; - - /* for each image id, a map of task id to module id */ - uint32_t **task_to_module; - - /* for each module id, map of module id to module */ - struct msm_adsp_module **id_to_module; - - uint32_t module_count; - struct adsp_module_info *module; - - /* stats */ - uint32_t events_received; - uint32_t event_backlog_max; - - /* rpc_client for init_info */ - struct adsp_rtos_mp_mtoa_init_info_type *init_info_ptr; - struct adsp_rtos_mp_mtoa_s_type *raw_event; - wait_queue_head_t init_info_wait; - unsigned init_info_state; - - void *handle; - void *cb_handle; - - /* Interrupt value */ - int int_adsp; -}; - -#define ADSP_STATE_DISABLED 0 -#define ADSP_STATE_ENABLING 1 -#define ADSP_STATE_ENABLED 2 -#define ADSP_STATE_DISABLING 3 -#define ADSP_STATE_INIT_INFO 4 - -struct msm_adsp_module { - struct mutex lock; - const char *name; - unsigned id; - struct adsp_info *info; - - struct msm_adsp_ops *ops; - void *driver_data; - - /* statistics */ - unsigned num_commands; - unsigned num_events; - - wait_queue_head_t state_wait; - unsigned state; - - struct platform_device pdev; - struct clk *clk; - int open_count; - - struct mutex pmem_regions_lock; - struct hlist_head pmem_regions; - int (*verify_cmd) (struct msm_adsp_module*, unsigned int, void *, - size_t); - int (*patch_event) (struct msm_adsp_module*, struct adsp_event *); -}; - -extern void msm_adsp_publish_cdevs(struct msm_adsp_module *, unsigned); -extern int adsp_init_info(struct adsp_info *info); - -/* Value to indicate that a queue is not defined for a particular image */ -#define QDSP_RTOS_NO_QUEUE 0xfffffffe - -/* - * Constants used to communicate with the ADSP RTOS - */ -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_M 0x80000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_NAVAIL_V 0x80000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_MUTEX_AVAIL_V 0x00000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_M 0x70000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_REQ_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_WRITE_DONE_V 0x10000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_CMD_NO_CMD_V 0x70000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_STATUS_M 0x0E000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_NO_ERR_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_NO_FREE_BUF_V 0x02000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_KERNEL_FLG_M 0x01000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_MSG_WRITE_V 0x00000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_V 0x01000000U - -#define ADSP_RTOS_WRITE_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU -#define ADSP_RTOS_WRITE_CTRL_WORD_HTOD_CMD_ID_M 0x00FFFFFFU - -/* Combination of MUTEX and CMD bits to check if the DSP is busy */ -#define ADSP_RTOS_WRITE_CTRL_WORD_READY_M 0xF0000000U -#define ADSP_RTOS_WRITE_CTRL_WORD_READY_V 0x70000000U - -/* RTOS to Host processor command mask values */ -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_M 0x80000000U -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_WAIT_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_FLAG_UP_CONT_V 0x80000000U - -#define ADSP_RTOS_READ_CTRL_WORD_CMD_M 0x60000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_DONE_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_REQ_V 0x20000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_CMD_V 0x60000000U - -/* Combination of FLAG and COMMAND bits to check if MSG ready */ -#define ADSP_RTOS_READ_CTRL_WORD_READY_M 0xE0000000U -#define ADSP_RTOS_READ_CTRL_WORD_READY_V 0xA0000000U -#define ADSP_RTOS_READ_CTRL_WORD_CONT_V 0xC0000000U -#define ADSP_RTOS_READ_CTRL_WORD_DONE_V 0xE0000000U - -#define ADSP_RTOS_READ_CTRL_WORD_STATUS_M 0x18000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_ERR_V 0x00000000U - -#define ADSP_RTOS_READ_CTRL_WORD_IN_PROG_M 0x04000000U -#define ADSP_RTOS_READ_CTRL_WORD_NO_READ_IN_PROG_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_READ_IN_PROG_V 0x04000000U - -#define ADSP_RTOS_READ_CTRL_WORD_CMD_TYPE_M 0x03000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_TASK_TO_H_V 0x00000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_KRNL_TO_H_V 0x01000000U -#define ADSP_RTOS_READ_CTRL_WORD_CMD_H_TO_KRNL_CFM_V 0x02000000U - -#define ADSP_RTOS_READ_CTRL_WORD_DSP_ADDR_M 0x00FFFFFFU - -#define ADSP_RTOS_READ_CTRL_WORD_MSG_ID_M 0x000000FFU -#define ADSP_RTOS_READ_CTRL_WORD_TASK_ID_M 0x0000FF00U - -/* Base address of DSP and DSP hardware registers */ -#define QDSP_RAMC_OFFSET 0x400000 - -#endif diff --git a/arch/arm/mach-msm/qdsp5v2/adsp_driver.c b/arch/arm/mach-msm/qdsp5v2/adsp_driver.c deleted file mode 100644 index ad74ca3b5c84..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/adsp_driver.c +++ /dev/null @@ -1,560 +0,0 @@ -/* - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * Author: Iliyan Malchev - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "adsp.h" -#include -#include - -struct adsp_pmem_info { - int fd; - void *vaddr; -}; - -struct adsp_pmem_region { - struct hlist_node list; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - struct file *file; -}; - -struct adsp_device { - struct msm_adsp_module *module; - - spinlock_t event_queue_lock; - wait_queue_head_t event_wait; - struct list_head event_queue; - int abort; - - const char *name; - struct device *device; - struct cdev cdev; -}; - -static struct adsp_device *inode_to_device(struct inode *inode); - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = __v >= __r->vaddr && \ - __e <= __r->vaddr + __r->len; \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -static int adsp_pmem_lookup_vaddr(struct msm_adsp_module *module, void **addr, - unsigned long len, struct adsp_pmem_region **region) -{ - struct hlist_node *node; - void *vaddr = *addr; - struct adsp_pmem_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - hlist_for_each_entry(region_elt, node, &module->pmem_regions, list) { - if (vaddr >= region_elt->vaddr && - vaddr < region_elt->vaddr + region_elt->len && - vaddr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * pmem buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("module %s: " - "multiple hits for vaddr %p, len %ld\n", - module->name, vaddr, len); - hlist_for_each_entry(region_elt, node, - &module->pmem_regions, list) { - if (vaddr >= region_elt->vaddr && - vaddr < region_elt->vaddr + region_elt->len && - vaddr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("%p, %ld --> %p\n", - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -int adsp_pmem_fixup_kvaddr(struct msm_adsp_module *module, void **addr, - unsigned long *kvaddr, unsigned long len) -{ - struct adsp_pmem_region *region; - void *vaddr = *addr; - unsigned long *paddr = (unsigned long *)addr; - int ret; - - ret = adsp_pmem_lookup_vaddr(module, addr, len, ®ion); - if (ret) { - MM_ERR("not patching %s (paddr & kvaddr)," - " lookup (%p, %ld) failed\n", - module->name, vaddr, len); - return ret; - } - *paddr = region->paddr + (vaddr - region->vaddr); - *kvaddr = region->kvaddr + (vaddr - region->vaddr); - return 0; -} - -int adsp_pmem_fixup(struct msm_adsp_module *module, void **addr, - unsigned long len) -{ - struct adsp_pmem_region *region; - void *vaddr = *addr; - unsigned long *paddr = (unsigned long *)addr; - int ret; - - ret = adsp_pmem_lookup_vaddr(module, addr, len, ®ion); - if (ret) { - MM_ERR("not patching %s, lookup (%p, %ld) failed\n", - module->name, vaddr, len); - return ret; - } - - *paddr = region->paddr + (vaddr - region->vaddr); - return 0; -} - -static int adsp_verify_cmd(struct msm_adsp_module *module, - unsigned int queue_id, void *cmd_data, - size_t cmd_size) -{ - /* call the per module verifier */ - if (module->verify_cmd) - return module->verify_cmd(module, queue_id, cmd_data, - cmd_size); - else - MM_INFO("no packet verifying function " - "for task %s\n", module->name); - return 0; -} - -static long adsp_write_cmd(struct adsp_device *adev, void __user *arg) -{ - struct adsp_command_t cmd; - unsigned char buf[256]; - void *cmd_data; - long rc; - - if (copy_from_user(&cmd, (void __user *)arg, sizeof(cmd))) - return -EFAULT; - - if (cmd.len > 256) { - cmd_data = kmalloc(cmd.len, GFP_USER); - if (!cmd_data) - return -ENOMEM; - } else { - cmd_data = buf; - } - - if (copy_from_user(cmd_data, (void __user *)(cmd.data), cmd.len)) { - rc = -EFAULT; - goto end; - } - - mutex_lock(&adev->module->pmem_regions_lock); - if (adsp_verify_cmd(adev->module, cmd.queue, cmd_data, cmd.len)) { - MM_ERR("module %s: verify failed.\n", adev->module->name); - rc = -EINVAL; - goto end; - } - rc = msm_adsp_write(adev->module, cmd.queue, cmd_data, cmd.len); -end: - mutex_unlock(&adev->module->pmem_regions_lock); - - if (cmd.len > 256) - kfree(cmd_data); - - return rc; -} - -static int adsp_events_pending(struct adsp_device *adev) -{ - unsigned long flags; - int yes; - spin_lock_irqsave(&adev->event_queue_lock, flags); - yes = !list_empty(&adev->event_queue); - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - return yes || adev->abort; -} - -static int adsp_pmem_lookup_paddr(struct msm_adsp_module *module, void **addr, - struct adsp_pmem_region **region) -{ - struct hlist_node *node; - unsigned long paddr = (unsigned long)(*addr); - struct adsp_pmem_region *region_elt; - - hlist_for_each_entry(region_elt, node, &module->pmem_regions, list) { - if (paddr >= region_elt->paddr && - paddr < region_elt->paddr + region_elt->len) { - *region = region_elt; - return 0; - } - } - return -1; -} - -int adsp_pmem_paddr_fixup(struct msm_adsp_module *module, void **addr) -{ - struct adsp_pmem_region *region; - unsigned long paddr = (unsigned long)(*addr); - unsigned long *vaddr = (unsigned long *)addr; - int ret; - - ret = adsp_pmem_lookup_paddr(module, addr, ®ion); - if (ret) { - MM_ERR("not patching %s, paddr %p lookup failed\n", - module->name, vaddr); - return ret; - } - - *vaddr = (unsigned long)region->vaddr + (paddr - region->paddr); - return 0; -} - -static int adsp_patch_event(struct msm_adsp_module *module, - struct adsp_event *event) -{ - /* call the per-module msg verifier */ - if (module->patch_event) - return module->patch_event(module, event); - return 0; -} - -static long adsp_get_event(struct adsp_device *adev, void __user *arg) -{ - unsigned long flags; - struct adsp_event *data = NULL; - struct adsp_event_t evt; - int timeout; - long rc = 0; - - if (copy_from_user(&evt, arg, sizeof(struct adsp_event_t))) - return -EFAULT; - - timeout = (int)evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - adev->event_wait, adsp_events_pending(adev), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - adev->event_wait, adsp_events_pending(adev)); - } - if (rc < 0) - return rc; - - if (adev->abort) - return -ENODEV; - - spin_lock_irqsave(&adev->event_queue_lock, flags); - if (!list_empty(&adev->event_queue)) { - data = list_first_entry(&adev->event_queue, - struct adsp_event, list); - list_del(&data->list); - } - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - - if (!data) - return -EAGAIN; - - /* DSP messages are type 0; they may contain physical addresses */ - if (data->type == 0) - adsp_patch_event(adev->module, data); - - /* map adsp_event --> adsp_event_t */ - if (evt.len < data->size) { - rc = -ETOOSMALL; - goto end; - } - if (data->msg_id != EVENT_MSG_ID) { - if (copy_to_user((void *)(evt.data), data->data.msg16, - data->size)) { - rc = -EFAULT; - goto end; - } - } else { - if (copy_to_user((void *)(evt.data), data->data.msg32, - data->size)) { - rc = -EFAULT; - goto end; - } - } - - evt.type = data->type; /* 0 --> from aDSP, 1 --> from ARM9 */ - evt.msg_id = data->msg_id; - evt.flags = data->is16; - evt.len = data->size; - if (copy_to_user(arg, &evt, sizeof(evt))) - rc = -EFAULT; -end: - kfree(data); - return rc; -} - -static long adsp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct adsp_device *adev = filp->private_data; - - switch (cmd) { - case ADSP_IOCTL_ENABLE: - return msm_adsp_enable(adev->module); - - case ADSP_IOCTL_DISABLE: - return msm_adsp_disable(adev->module); - - case ADSP_IOCTL_DISABLE_EVENT_RSP: - return msm_adsp_disable_event_rsp(adev->module); - - case ADSP_IOCTL_DISABLE_ACK: - MM_ERR("ADSP_IOCTL_DISABLE_ACK is not implemented\n"); - break; - - case ADSP_IOCTL_WRITE_COMMAND: - return adsp_write_cmd(adev, (void __user *) arg); - - case ADSP_IOCTL_GET_EVENT: - return adsp_get_event(adev, (void __user *) arg); - - case ADSP_IOCTL_SET_CLKRATE: { - unsigned long clk_rate; - if (copy_from_user(&clk_rate, (void *) arg, sizeof(clk_rate))) - return -EFAULT; - return adsp_set_clkrate(adev->module, clk_rate); - } - - case ADSP_IOCTL_ABORT_EVENT_READ: - adev->abort = 1; - wake_up(&adev->event_wait); - break; - - default: - break; - } - return -EINVAL; -} - -static int adsp_release(struct inode *inode, struct file *filp) -{ - struct adsp_device *adev = filp->private_data; - struct msm_adsp_module *module = adev->module; - int rc = 0; - - MM_INFO("release '%s'\n", adev->name); - - /* clear module before putting it to avoid race with open() */ - adev->module = NULL; - - msm_adsp_put(module); - return rc; -} - -static void adsp_event(void *driver_data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct adsp_device *adev = driver_data; - struct adsp_event *event; - unsigned long flags; - - if (len > ADSP_EVENT_MAX_SIZE) { - MM_ERR("event too large (%d bytes)\n", len); - return; - } - - event = kmalloc(sizeof(*event), GFP_ATOMIC); - if (!event) { - MM_ERR("cannot allocate buffer\n"); - return; - } - - if (id != EVENT_MSG_ID) { - event->type = 0; - event->is16 = 0; - event->msg_id = id; - event->size = len; - - getevent(event->data.msg16, len); - } else { - event->type = 1; - event->is16 = 1; - event->msg_id = id; - event->size = len; - getevent(event->data.msg32, len); - } - - spin_lock_irqsave(&adev->event_queue_lock, flags); - list_add_tail(&event->list, &adev->event_queue); - spin_unlock_irqrestore(&adev->event_queue_lock, flags); - wake_up(&adev->event_wait); -} - -static struct msm_adsp_ops adsp_ops = { - .event = adsp_event, -}; - -static int adsp_open(struct inode *inode, struct file *filp) -{ - struct adsp_device *adev; - int rc; - - rc = nonseekable_open(inode, filp); - if (rc < 0) - return rc; - - adev = inode_to_device(inode); - if (!adev) - return -ENODEV; - - MM_INFO("open '%s'\n", adev->name); - - rc = msm_adsp_get(adev->name, &adev->module, &adsp_ops, adev); - if (rc) - return rc; - - MM_INFO("opened module '%s' adev %p\n", adev->name, adev); - filp->private_data = adev; - adev->abort = 0; - INIT_HLIST_HEAD(&adev->module->pmem_regions); - mutex_init(&adev->module->pmem_regions_lock); - - return 0; -} - -static unsigned adsp_device_count; -static struct adsp_device *adsp_devices; - -static struct adsp_device *inode_to_device(struct inode *inode) -{ - unsigned n = MINOR(inode->i_rdev); - if (n < adsp_device_count) { - if (adsp_devices[n].device) - return adsp_devices + n; - } - return NULL; -} - -static dev_t adsp_devno; -static struct class *adsp_class; - -static const struct file_operations adsp_fops = { - .owner = THIS_MODULE, - .open = adsp_open, - .unlocked_ioctl = adsp_ioctl, - .release = adsp_release, -}; - -static void adsp_create(struct adsp_device *adev, const char *name, - struct device *parent, dev_t devt) -{ - struct device *dev; - int rc; - - dev = device_create(adsp_class, parent, devt, "%s", name); - if (IS_ERR(dev)) - return; - - init_waitqueue_head(&adev->event_wait); - INIT_LIST_HEAD(&adev->event_queue); - spin_lock_init(&adev->event_queue_lock); - - cdev_init(&adev->cdev, &adsp_fops); - adev->cdev.owner = THIS_MODULE; - - rc = cdev_add(&adev->cdev, devt, 1); - if (rc < 0) { - device_destroy(adsp_class, devt); - } else { - adev->device = dev; - adev->name = name; - } -} - -void msm_adsp_publish_cdevs(struct msm_adsp_module *modules, unsigned n) -{ - int rc; - - adsp_devices = kzalloc(sizeof(struct adsp_device) * n, GFP_KERNEL); - if (!adsp_devices) - return; - - adsp_class = class_create(THIS_MODULE, "adsp"); - if (IS_ERR(adsp_class)) - goto fail_create_class; - - rc = alloc_chrdev_region(&adsp_devno, 0, n, "adsp"); - if (rc < 0) - goto fail_alloc_region; - - adsp_device_count = n; - for (n = 0; n < adsp_device_count; n++) { - adsp_create(adsp_devices + n, - modules[n].name, &modules[n].pdev.dev, - MKDEV(MAJOR(adsp_devno), n)); - } - - return; - -fail_alloc_region: - class_unregister(adsp_class); -fail_create_class: - kfree(adsp_devices); -} diff --git a/arch/arm/mach-msm/qdsp5v2/adsp_info.c b/arch/arm/mach-msm/qdsp5v2/adsp_info.c deleted file mode 100644 index 03b810d73836..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/adsp_info.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2008-2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "adsp.h" - -/* Firmware modules */ -#define QDSP_MODULE_KERNEL 0x0106dd4e -#define QDSP_MODULE_AFETASK 0x0106dd6f -#define QDSP_MODULE_AUDPLAY0TASK 0x0106dd70 -#define QDSP_MODULE_AUDPLAY1TASK 0x0106dd71 -#define QDSP_MODULE_AUDPPTASK 0x0106dd72 -#define QDSP_MODULE_VIDEOTASK 0x0106dd73 -#define QDSP_MODULE_VIDEO_AAC_VOC 0x0106dd74 -#define QDSP_MODULE_PCM_DEC 0x0106dd75 -#define QDSP_MODULE_AUDIO_DEC_MP3 0x0106dd76 -#define QDSP_MODULE_AUDIO_DEC_AAC 0x0106dd77 -#define QDSP_MODULE_AUDIO_DEC_WMA 0x0106dd78 -#define QDSP_MODULE_HOSTPCM 0x0106dd79 -#define QDSP_MODULE_DTMF 0x0106dd7a -#define QDSP_MODULE_AUDRECTASK 0x0106dd7b -#define QDSP_MODULE_AUDPREPROCTASK 0x0106dd7c -#define QDSP_MODULE_SBC_ENC 0x0106dd7d -#define QDSP_MODULE_VOC_UMTS 0x0106dd9a -#define QDSP_MODULE_VOC_CDMA 0x0106dd98 -#define QDSP_MODULE_VOC_PCM 0x0106dd7f -#define QDSP_MODULE_VOCENCTASK 0x0106dd80 -#define QDSP_MODULE_VOCDECTASK 0x0106dd81 -#define QDSP_MODULE_VOICEPROCTASK 0x0106dd82 -#define QDSP_MODULE_VIDEOENCTASK 0x0106dd83 -#define QDSP_MODULE_VFETASK 0x0106dd84 -#define QDSP_MODULE_WAV_ENC 0x0106dd85 -#define QDSP_MODULE_AACLC_ENC 0x0106dd86 -#define QDSP_MODULE_VIDEO_AMR 0x0106dd87 -#define QDSP_MODULE_VOC_AMR 0x0106dd88 -#define QDSP_MODULE_VOC_EVRC 0x0106dd89 -#define QDSP_MODULE_VOC_13K 0x0106dd8a -#define QDSP_MODULE_VOC_FGV 0x0106dd8b -#define QDSP_MODULE_DIAGTASK 0x0106dd8c -#define QDSP_MODULE_JPEGTASK 0x0106dd8d -#define QDSP_MODULE_LPMTASK 0x0106dd8e -#define QDSP_MODULE_QCAMTASK 0x0106dd8f -#define QDSP_MODULE_MODMATHTASK 0x0106dd90 -#define QDSP_MODULE_AUDPLAY2TASK 0x0106dd91 -#define QDSP_MODULE_AUDPLAY3TASK 0x0106dd92 -#define QDSP_MODULE_AUDPLAY4TASK 0x0106dd93 -#define QDSP_MODULE_GRAPHICSTASK 0x0106dd94 -#define QDSP_MODULE_MIDI 0x0106dd95 -#define QDSP_MODULE_GAUDIO 0x0106dd96 -#define QDSP_MODULE_VDEC_LP_MODE 0x0106dd97 -#define QDSP_MODULE_VIDEO_AAC_VOC_TURBO 0x01089f77 -#define QDSP_MODULE_VIDEO_AMR_TURBO 0x01089f78 -#define QDSP_MODULE_WM_TURBO_MODE 0x01089f79 -#define QDSP_MODULE_VDEC_LP_MODE_TURBO 0x01089f7a -#define QDSP_MODULE_AUDREC0TASK 0x0109696f -#define QDSP_MODULE_AUDREC1TASK 0x01096970 -#define QDSP_MODULE_AUDREC2TASK 0x010a2f59 -#define QDSP_MODULE_MAX 0x7fffffff - - /* DO NOT USE: Force this enum to be a 32bit type to improve speed */ -#define QDSP_MODULE_32BIT_DUMMY 0x10000 - -static uint32_t *qdsp_task_to_module[IMG_MAX]; -static uint32_t *qdsp_queue_offset_table[IMG_MAX]; - -#define QDSP_MODULE(n, clkname, clkrate, verify_cmd_func, patch_event_func) \ - { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n, \ - .clk_name = clkname, .clk_rate = clkrate, \ - .verify_cmd = verify_cmd_func, .patch_event = patch_event_func } - -static struct adsp_module_info module_info[] = { - QDSP_MODULE(AUDPLAY0TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY1TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY2TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPLAY3TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPPTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDPREPROCTASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AFETASK , NULL, 0, NULL, NULL), - QDSP_MODULE(AUDREC0TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDREC1TASK, NULL, 0, NULL, NULL), - QDSP_MODULE(AUDREC2TASK, NULL, 0, NULL, NULL), -}; - -int adsp_init_info(struct adsp_info *info) -{ - uint32_t img_num; - - info->send_irq = 0x00c00200; - info->read_ctrl = 0x00400038; - info->write_ctrl = 0x00400034; - - info->max_msg16_size = 193; - info->max_msg32_size = 8; - for (img_num = 0; img_num < IMG_MAX; img_num++) - qdsp_queue_offset_table[img_num] = - &info->init_info_ptr->queue_offsets[img_num][0]; - - for (img_num = 0; img_num < IMG_MAX; img_num++) - qdsp_task_to_module[img_num] = - &info->init_info_ptr->task_to_module_tbl[img_num][0]; - info->max_task_id = ENTRIES_MAX; - info->max_module_id = QDSP_MODULE_MAX - 1; - info->max_queue_id = QDSP_MAX_NUM_QUEUES; - info->max_image_id = 0; - info->queue_offset = qdsp_queue_offset_table; - info->task_to_module = qdsp_task_to_module; - - info->module_count = ARRAY_SIZE(module_info); - info->module = module_info; - return 0; -} diff --git a/arch/arm/mach-msm/qdsp5v2/afe.c b/arch/arm/mach-msm/qdsp5v2/afe.c deleted file mode 100644 index 1e856e5d9247..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/afe.c +++ /dev/null @@ -1,534 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define AFE_MAX_TIMEOUT 500 /* 500 ms */ -#define AFE_MAX_CLNT 6 /* 6 HW path defined so far */ -#define GETDEVICEID(x) ((x) - 1) - -struct msm_afe_state { - struct msm_adsp_module *mod; - struct msm_adsp_ops adsp_ops; - struct mutex lock; - u8 in_use; - u8 codec_config[AFE_MAX_CLNT]; - wait_queue_head_t wait; - u8 aux_conf_flag; -}; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_afelb; -#endif - - -static struct msm_afe_state the_afe_state; - -#define afe_send_queue(afe, cmd, len) \ - msm_adsp_write(afe->mod, QDSP_apuAfeQueue, \ - cmd, len) - -static void afe_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct msm_afe_state *afe = data; - - MM_DBG("msg_id %d \n", id); - - switch (id) { - case AFE_APU_MSG_CODEC_CONFIG_ACK: { - struct afe_msg_codec_config_ack afe_ack; - getevent(&afe_ack, AFE_APU_MSG_CODEC_CONFIG_ACK_LEN); - MM_DBG("%s: device_id: %d device activity: %d\n", __func__, - afe_ack.device_id, afe_ack.device_activity); - if (afe_ack.device_activity == AFE_MSG_CODEC_CONFIG_DISABLED) - afe->codec_config[GETDEVICEID(afe_ack.device_id)] = 0; - else - afe->codec_config[GETDEVICEID(afe_ack.device_id)] = - afe_ack.device_activity; - - wake_up(&afe->wait); - break; - } - case AFE_APU_MSG_VOC_TIMING_SUCCESS: - MM_INFO("Received VOC_TIMING_SUCCESS message from AFETASK\n"); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable/disable(audpptask)"); - break; - default: - MM_ERR("unexpected message from afe \n"); - } - - return; -} - -static void afe_dsp_codec_config(struct msm_afe_state *afe, - u8 path_id, u8 enable, struct msm_afe_config *config) -{ - struct afe_cmd_codec_config cmd; - - MM_DBG("%s() %p\n", __func__, config); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_CODEC_CONFIG_CMD; - cmd.device_id = path_id; - cmd.activity = enable; - if (config) { - MM_DBG("%s: sample_rate %x ch mode %x vol %x\n", - __func__, config->sample_rate, - config->channel_mode, config->volume); - cmd.sample_rate = config->sample_rate; - cmd.channel_mode = config->channel_mode; - cmd.volume = config->volume; - } - afe_send_queue(afe, &cmd, sizeof(cmd)); -} -/* Function is called after afe module been enabled */ -void afe_loopback(int enable) -{ - struct afe_cmd_loopback cmd; - struct msm_afe_state *afe; - - afe = &the_afe_state; - MM_DBG("enable %d\n", enable); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_LOOPBACK; - if (enable) - cmd.enable_flag = AFE_LOOPBACK_ENABLE_COMMAND; - - afe_send_queue(afe, &cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(afe_loopback); - -void afe_ext_loopback(int enable, int rx_copp_id, int tx_copp_id) -{ - struct afe_cmd_ext_loopback cmd; - struct msm_afe_state *afe; - - afe = &the_afe_state; - MM_DBG("enable %d\n", enable); - if ((rx_copp_id == 0) && (tx_copp_id == 0)) { - afe_loopback(enable); - } else { - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_EXT_LOOPBACK; - cmd.source_id = tx_copp_id; - cmd.dst_id = rx_copp_id; - if (enable) - cmd.enable_flag = AFE_LOOPBACK_ENABLE_COMMAND; - - afe_send_queue(afe, &cmd, sizeof(cmd)); - } -} -EXPORT_SYMBOL(afe_ext_loopback); - -void afe_device_volume_ctrl(u16 device_id, u16 device_volume) -{ - struct afe_cmd_device_volume_ctrl cmd; - struct msm_afe_state *afe; - - afe = &the_afe_state; - MM_DBG("device 0x%4x volume 0x%4x\n", device_id, device_volume); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_DEVICE_VOLUME_CTRL; - cmd.device_id = device_id; - cmd.device_volume = device_volume; - afe_send_queue(afe, &cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(afe_device_volume_ctrl); - -int afe_enable(u8 path_id, struct msm_afe_config *config) -{ - struct msm_afe_state *afe = &the_afe_state; - int rc; - - MM_DBG("%s: path %d\n", __func__, path_id); - if ((GETDEVICEID(path_id) < 0) || (GETDEVICEID(path_id) > 5)) { - MM_ERR("Invalid path_id: %d\n", path_id); - return -EINVAL; - } - mutex_lock(&afe->lock); - if (!afe->in_use && !afe->aux_conf_flag) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_ERR("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - /* Issue codec config command */ - afe_dsp_codec_config(afe, path_id, 1, config); - rc = wait_event_timeout(afe->wait, - afe->codec_config[GETDEVICEID(path_id)], - msecs_to_jiffies(AFE_MAX_TIMEOUT)); - if (!rc) { - MM_ERR("AFE failed to respond within %d ms\n", AFE_MAX_TIMEOUT); - rc = -ENODEV; - if (!afe->in_use) { - if (!afe->aux_conf_flag || - (afe->aux_conf_flag && - (path_id == AFE_HW_PATH_AUXPCM_RX || - path_id == AFE_HW_PATH_AUXPCM_TX))) { - /* clean up if there is no client */ - msm_adsp_disable(afe->mod); - msm_adsp_put(afe->mod); - afe->aux_conf_flag = 0; - afe->mod = NULL; - } - } - - } else { - rc = 0; - afe->in_use++; - } - - mutex_unlock(&afe->lock); - return rc; - -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_enable); - -int afe_config_fm_codec(int fm_enable, uint16_t source) -{ - struct afe_cmd_fm_codec_config cmd; - struct msm_afe_state *afe = &the_afe_state; - int rc = 0; - int i = 0; - unsigned short *ptrmem = (unsigned short *)&cmd; - - MM_INFO(" configure fm codec\n"); - mutex_lock(&afe->lock); - if (!afe->in_use) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_ERR("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_FM_RX_ROUTING_CMD; - cmd.enable = fm_enable; - cmd.device_id = source; - - for (i = 0; i < sizeof(cmd)/2; i++, ++ptrmem) - MM_DBG("cmd[%d]=0x%04x\n", i, *ptrmem); - afe_send_queue(afe, &cmd, sizeof(cmd)); - - mutex_unlock(&afe->lock); - return rc; -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_config_fm_codec); - -int afe_config_fm_volume(uint16_t volume) -{ - struct afe_cmd_fm_volume_config cmd; - struct msm_afe_state *afe = &the_afe_state; - int rc = 0; - - MM_INFO(" configure fm volume\n"); - mutex_lock(&afe->lock); - if (!afe->in_use) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_ERR("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_FM_PLAYBACK_VOLUME_CMD; - cmd.volume = volume; - - afe_send_queue(afe, &cmd, sizeof(cmd)); - - mutex_unlock(&afe->lock); - return rc; -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_config_fm_volume); - -int afe_config_fm_calibration_gain(uint16_t device_id, - uint16_t calibration_gain) -{ - struct afe_cmd_fm_calibgain_config cmd; - struct msm_afe_state *afe = &the_afe_state; - int rc = 0; - - MM_INFO("Configure for rx device = 0x%4x, gain = 0x%4x\n", device_id, - calibration_gain); - mutex_lock(&afe->lock); - if (!afe->in_use) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_ERR("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_FM_CALIBRATION_GAIN_CMD; - cmd.device_id = device_id; - cmd.calibration_gain = calibration_gain; - - afe_send_queue(afe, &cmd, sizeof(cmd)); - - mutex_unlock(&afe->lock); - return rc; -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_config_fm_calibration_gain); - -int afe_config_aux_codec(int pcm_ctl_value, int aux_codec_intf_value, - int data_format_pad) -{ - struct afe_cmd_aux_codec_config cmd; - struct msm_afe_state *afe = &the_afe_state; - int rc = 0; - - MM_DBG(" configure aux codec \n"); - mutex_lock(&afe->lock); - if (!afe->in_use && !afe->aux_conf_flag) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_ERR("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - afe->aux_conf_flag = 1; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_AUX_CODEC_CONFIG_CMD; - cmd.dma_path_ctl = 0; - cmd.pcm_ctl = pcm_ctl_value; - cmd.eight_khz_int_mode = 0; - cmd.aux_codec_intf_ctl = aux_codec_intf_value; - cmd.data_format_padding_info = data_format_pad; - - afe_send_queue(afe, &cmd, sizeof(cmd)); - - mutex_unlock(&afe->lock); - return rc; -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_config_aux_codec); - -int afe_config_rmc_block(struct acdb_rmc_block *acdb_rmc) -{ - struct afe_cmd_cfg_rmc cmd; - struct msm_afe_state *afe = &the_afe_state; - int rc = 0; - int i = 0; - unsigned short *ptrmem = (unsigned short *)&cmd; - - MM_DBG(" configure rmc block\n"); - mutex_lock(&afe->lock); - if (!afe->in_use && !afe->mod) { - /* enable afe */ - rc = msm_adsp_get("AFETASK", &afe->mod, &afe->adsp_ops, afe); - if (rc < 0) { - MM_DBG("%s: failed to get AFETASK module\n", __func__); - goto error_adsp_get; - } - rc = msm_adsp_enable(afe->mod); - if (rc < 0) - goto error_adsp_enable; - } - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AFE_CMD_CFG_RMC_PARAMS; - - cmd.rmc_mode = acdb_rmc->rmc_enable; - cmd.rmc_ipw_length_ms = acdb_rmc->rmc_ipw_length_ms; - cmd.rmc_peak_length_ms = acdb_rmc->rmc_peak_length_ms; - cmd.rmc_init_pulse_length_ms = acdb_rmc->rmc_init_pulse_length_ms; - cmd.rmc_total_int_length_ms = acdb_rmc->rmc_total_int_length_ms; - cmd.rmc_rampupdn_length_ms = acdb_rmc->rmc_rampupdn_length_ms; - cmd.rmc_delay_length_ms = acdb_rmc->rmc_delay_length_ms; - cmd.rmc_detect_start_threshdb = acdb_rmc->rmc_detect_start_threshdb; - cmd.rmc_init_pulse_threshdb = acdb_rmc->rmc_init_pulse_threshdb; - - for (i = 0; i < sizeof(cmd)/2; i++, ++ptrmem) - MM_DBG("cmd[%d]=0x%04x\n", i, *ptrmem); - afe_send_queue(afe, &cmd, sizeof(cmd)); - - mutex_unlock(&afe->lock); - return rc; -error_adsp_enable: - msm_adsp_put(afe->mod); - afe->mod = NULL; -error_adsp_get: - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_config_rmc_block); - -int afe_disable(u8 path_id) -{ - struct msm_afe_state *afe = &the_afe_state; - int rc; - - mutex_lock(&afe->lock); - - BUG_ON(!afe->in_use); - MM_DBG("%s() path_id:%d codec state:%d\n", __func__, path_id, - afe->codec_config[GETDEVICEID(path_id)]); - afe_dsp_codec_config(afe, path_id, 0, NULL); - rc = wait_event_timeout(afe->wait, - !afe->codec_config[GETDEVICEID(path_id)], - msecs_to_jiffies(AFE_MAX_TIMEOUT)); - if (!rc) { - MM_ERR("AFE failed to respond within %d ms\n", AFE_MAX_TIMEOUT); - rc = -1; - } else - rc = 0; - afe->in_use--; - MM_DBG("%s() in_use:%d \n", __func__, afe->in_use); - if (!afe->in_use) { - msm_adsp_disable(afe->mod); - msm_adsp_put(afe->mod); - afe->aux_conf_flag = 0; - afe->mod = NULL; - } - mutex_unlock(&afe->lock); - return rc; -} -EXPORT_SYMBOL(afe_disable); - - -#ifdef CONFIG_DEBUG_FS -static int afe_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("debug intf %s\n", (char *) file->private_data); - return 0; -} - -static ssize_t afe_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char cmd; - - if (get_user(cmd, ubuf)) - return -EFAULT; - - MM_INFO("%s %c\n", lb_str, cmd); - - if (!strcmp(lb_str, "afe_loopback")) { - switch (cmd) { - case '1': - afe_loopback(1); - break; - case '0': - afe_loopback(0); - break; - } - } - - return cnt; -} - -static const struct file_operations afe_debug_fops = { - .open = afe_debug_open, - .write = afe_debug_write -}; -#endif - -static int __init afe_init(void) -{ - struct msm_afe_state *afe = &the_afe_state; - - MM_INFO("AFE driver init\n"); - - memset(afe, 0, sizeof(struct msm_afe_state)); - afe->adsp_ops.event = afe_dsp_event; - mutex_init(&afe->lock); - init_waitqueue_head(&afe->wait); - -#ifdef CONFIG_DEBUG_FS - debugfs_afelb = debugfs_create_file("afe_loopback", - S_IFREG | S_IWUGO, NULL, (void *) "afe_loopback", - &afe_debug_fops); -#endif - - return 0; -} - -static void __exit afe_exit(void) -{ - MM_INFO("AFE driver exit\n"); -#ifdef CONFIG_DEBUG_FS - if (debugfs_afelb) - debugfs_remove(debugfs_afelb); -#endif - if (the_afe_state.mod) - msm_adsp_put(the_afe_state.mod); - return; -} - -module_init(afe_init); -module_exit(afe_exit); - -MODULE_DESCRIPTION("MSM AFE driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c b/arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c deleted file mode 100644 index 8d644f0a581c..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_a2dp_in.c +++ /dev/null @@ -1,1041 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * sbc/pcm audio input driver - * Based on the pcm input driver in arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c - * - * Copyright (C) 2008 HTC Corporation - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_SIZE (2052 * 2) -#define FRAME_SIZE_SBC (768 * 2) -#define MONO_DATA_SIZE (2048) -#define STEREO_DATA_SIZE (MONO_DATA_SIZE * 2) -#define DMASZ (FRAME_SIZE * FRAME_NUM) - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t frame_num; - uint32_t frame_len; -}; - -struct audio_a2dp_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - - struct msm_adsp_module *audrec; - - struct audrec_session_info session_info; /*audrec session info*/ - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* 2048 for mono, 4096 for stereo */ - uint32_t enc_type; - struct msm_audio_sbc_enc_config cfg; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; /* device events interested in */ - uint32_t dev_cnt; - spinlock_t dev_lock; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *msm_map; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int abort; /* set when error, like sample rate mismatch */ - char *build_id; - struct ion_client *client; - struct ion_handle *output_buff_handle; -}; - -static struct audio_a2dp_in the_audio_a2dp_in; - -struct wav_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_a2dp; - unsigned char raw_bitstream[]; /* samples */ -}; - -struct sbc_frame { - uint16_t bit_rate_msw; - uint16_t bit_rate_lsw; - uint16_t frame_length; - uint16_t frame_num; - unsigned char raw_bitstream[]; /* samples */ -}; - -struct audio_frame { - union { - struct wav_frame wav; - struct sbc_frame sbc; - } a2dp; -} __attribute__((packed)); - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -/* DSP command send functions */ -static int auda2dp_in_enc_config(struct audio_a2dp_in *audio, int enable); -static int auda2dp_in_param_config(struct audio_a2dp_in *audio); -static int auda2dp_in_mem_config(struct audio_a2dp_in *audio); -static int auda2dp_in_record_config(struct audio_a2dp_in *audio, int enable); -static int auda2dp_dsp_read_buffer(struct audio_a2dp_in *audio, - uint32_t read_cnt); - -static void auda2dp_in_get_dsp_frames(struct audio_a2dp_in *audio); - -static void auda2dp_in_flush(struct audio_a2dp_in *audio); - -static void a2dp_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_a2dp_in *audio = (struct audio_a2dp_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1)) - auda2dp_in_record_config(audio, 1); - - break; - } - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if (!audio->running || !audio->enabled) - break; - - /* Turn of as per source */ - if (audio->source) - auda2dp_in_record_config(audio, 1); - else - /* Turn off all */ - auda2dp_in_record_config(audio, 0); - - break; - } - case AUDDEV_EVT_FREQ_CHG: { - MM_DBG("Encoder Driver got sample rate change event\n"); - MM_DBG("sample rate %d\n", evt_payload->freq_info.sample_rate); - MM_DBG("dev_type %d\n", evt_payload->freq_info.dev_type); - MM_DBG("acdb_dev_id %d\n", evt_payload->freq_info.acdb_dev_id); - if (audio->running == 1) { - /* Stop Recording sample rate does not match - with device sample rate */ - if (evt_payload->freq_info.sample_rate != - audio->samp_rate) { - auda2dp_in_record_config(audio, 0); - audio->abort = 1; - wake_up(&audio->wait); - } - } - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_a2dp_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) - auda2dp_in_param_config(audio); - else { /* Encoder disable success */ - audio->running = 0; - auda2dp_in_record_config(audio, 0); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG \n"); - auda2dp_in_mem_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG \n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_a2dp_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if (audio->dev_cnt > 0) - auda2dp_in_record_config(audio, 1); - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - auda2dp_in_get_dsp_frames(audio); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event: module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void auda2dp_in_get_dsp_frames(struct audio_a2dp_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (audio->enc_type == ENC_TYPE_WAV) - audio->in[index].size = frame->a2dp.wav.frame_length; - else if (audio->enc_type == ENC_TYPE_SBC) { - audio->in[index].size = frame->a2dp.sbc.frame_length * - frame->a2dp.sbc.frame_num; - audio->in[index].frame_num = frame->a2dp.sbc.frame_num; - audio->in[index].frame_len = frame->a2dp.sbc.frame_length; - } - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - else - audio->in_count++; - - auda2dp_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - -static struct msm_adsp_ops audrec_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int auda2dp_in_enc_config(struct audio_a2dp_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int auda2dp_in_param_config(struct audio_a2dp_in *audio) -{ - if (audio->enc_type == ENC_TYPE_WAV) { - struct audpreproc_audrec_cmd_parm_cfg_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.aud_rec_samplerate_idx = audio->samp_rate; - cmd.aud_rec_stereo_mode = audio->channel_mode; - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); - } else if (audio->enc_type == ENC_TYPE_SBC) { - struct audpreproc_audrec_cmd_parm_cfg_sbc cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - cmd.aud_rec_sbc_enc_param = - (audio->cfg.number_of_blocks << - AUDREC_SBC_ENC_PARAM_NUM_SUB_BLOCKS_MASK) | - (audio->cfg.number_of_subbands << - AUDREC_SBC_ENC_PARAM_NUM_SUB_BANDS_MASK) | - (audio->cfg.mode << - AUDREC_SBC_ENC_PARAM_MODE_MASK) | - (audio->cfg.bit_allocation << - AUDREC_SBC_ENC_PARAM_BIT_ALLOC_MASK); - cmd.aud_rec_sbc_bit_rate_msw = - (audio->cfg.bit_rate & 0xFFFF0000) >> 16; - cmd.aud_rec_sbc_bit_rate_lsw = - (audio->cfg.bit_rate & 0xFFFF); - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); - } - return 0; -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int auda2dp_in_record_config(struct audio_a2dp_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & - INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int auda2dp_in_mem_config(struct audio_a2dp_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - - /* prepare buffer pointers: - * Wav: - * Mono: 1024 samples + 4 halfword header - * Stereo: 2048 samples + 4 halfword header - * SBC: - * 768 + 4 halfword header - */ - if (audio->enc_type == ENC_TYPE_SBC) { - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + 4; - data += (4 + (FRAME_SIZE_SBC/2)); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } - } else if (audio->enc_type == ENC_TYPE_WAV) { - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + 4; - data += (4 + (audio->channel_mode ? 2048 : 1024)); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } - } - - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int auda2dp_dsp_read_buffer(struct audio_a2dp_in *audio, - uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int auda2dp_in_enable(struct audio_a2dp_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - auda2dp_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int auda2dp_in_disable(struct audio_a2dp_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - auda2dp_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void auda2dp_in_flush(struct audio_a2dp_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -/* ------------------- device --------------------- */ -static long auda2dp_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_a2dp_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - /* Poll at 48KHz always */ - freq = 48000; - MM_DBG("AUDIO_START\n"); - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d sample rate requested %d\n", - freq, audio->samp_rate); - if (rc < 0) { - MM_DBG("sample rate can not be set, return code %d\n",\ - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = audio->samp_rate; - audpreproc_update_audrec_info(&audio->session_info); - rc = auda2dp_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) { - rc = -ENODEV; - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - } else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = auda2dp_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - audio->abort = 0; - break; - } - case AUDIO_FLUSH: { - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - auda2dp_in_flush(audio); - mutex_unlock(&audio->read_lock); - } - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if ((audio->enc_type == ENC_TYPE_SBC) && - (cfg.buffer_size != FRAME_SIZE_SBC)) - rc = -EINVAL; - else - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - if (audio->enc_type == ENC_TYPE_SBC) - cfg.buffer_size = FRAME_SIZE_SBC; - else - cfg.buffer_size = MONO_DATA_SIZE; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_SBC_ENC_CONFIG: { - if (copy_from_user(&audio->cfg, (void *) arg, - sizeof(audio->cfg))) { - rc = -EFAULT; - break; - } - audio->samp_rate = audio->cfg.sample_rate; - audio->channel_mode = audio->cfg.channels; - audio->enc_type = ENC_TYPE_SBC; - break; - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.channel_count == 1) { - cfg.channel_count = AUDREC_CMD_MODE_MONO; - audio->buffer_size = MONO_DATA_SIZE; - } else if (cfg.channel_count == 2) { - cfg.channel_count = AUDREC_CMD_MODE_STEREO; - audio->buffer_size = STEREO_DATA_SIZE; - } else { - rc = -EINVAL; - break; - } - audio->samp_rate = cfg.sample_rate; - audio->channel_mode = cfg.channel_count; - audio->enc_type = ENC_TYPE_WAV; - break; - } - case AUDIO_GET_SBC_ENC_CONFIG: { - struct msm_audio_sbc_enc_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.bit_allocation = audio->cfg.bit_allocation; - cfg.mode = audio->cfg.mode; - cfg.number_of_subbands = audio->cfg.number_of_subbands; - cfg.number_of_blocks = audio->cfg.number_of_blocks; - cfg.sample_rate = audio->samp_rate; - cfg.channels = audio->channel_mode; - cfg.bit_rate = audio->cfg.bit_rate; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_count = FRAME_NUM; - cfg.sample_rate = audio->samp_rate; - if (audio->channel_mode == AUDREC_CMD_MODE_MONO) { - cfg.channel_count = 1; - cfg.buffer_size = MONO_DATA_SIZE; - } else { - cfg.channel_count = 2; - cfg.buffer_size = STEREO_DATA_SIZE; - } - cfg.type = ENC_TYPE_WAV; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t auda2dp_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_a2dp_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - uint32_t f_len = 0, f_num = 0; - int i = 0; - - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->abort); - - if (rc < 0) - break; - - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - if (audio->abort) { - rc = -EPERM; /* Not permitted due to abort */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - if (count >= size) { - if (audio->enc_type == ENC_TYPE_SBC && - (audio->in[index].frame_len % 2)) { - f_len = audio->in[index].frame_len; - f_num = audio->in[index].frame_num; - for (i = 0; i < f_num; i++) { - if (copy_to_user(&buf[i * f_len], - (uint8_t *) (data + (i * (f_len + 1))), - f_len)) { - rc = -EFAULT; - break; - } - } - } else { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - } else { - MM_ERR("short read\n"); - break; - } - } - mutex_unlock(&audio->read_lock); - if (buf > start) - return buf - start; - - return rc; -} - -static ssize_t auda2dp_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int auda2dp_in_release(struct inode *inode, struct file *file) -{ - struct audio_a2dp_in *audio = file->private_data; - - mutex_lock(&audio->lock); - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - auda2dp_in_disable(audio); - auda2dp_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -static int auda2dp_in_open(struct inode *inode, struct file *file) -{ - struct audio_a2dp_in *audio = &the_audio_a2dp_in; - int rc; - int encid; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - client = msm_ion_client_create(UINT_MAX, "Audio_a2dp_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", DMASZ); - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->msm_map = ion_map_kernel(client, handle); - if (IS_ERR(audio->data)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->data = (char *)audio->msm_map; - - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - rc = -EACCES; - MM_ERR("Non tunnel encoding is not supported\n"); - goto done; - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for Tunnel mode encoding\n"); - } else { - rc = -EACCES; - goto done; - } - /* Settings will be re-config at AUDIO_SET_CONFIG/SBC_ENC_CONFIG, - * but at least we need to have initial config - */ - audio->channel_mode = AUDREC_CMD_MODE_MONO; - audio->buffer_size = FRAME_SIZE_SBC; - audio->samp_rate = 48000; - audio->enc_type = ENC_TYPE_SBC | audio->mode; - audio->cfg.bit_allocation = AUDIO_SBC_BA_SNR; - audio->cfg.mode = AUDIO_SBC_MODE_JSTEREO; - audio->cfg.number_of_subbands = AUDIO_SBC_BANDS_8; - audio->cfg.number_of_blocks = AUDIO_SBC_BLOCKS_16; - audio->cfg.bit_rate = 320000; /* max 512kbps(mono), 320kbs(others) */ - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - audio->abort = 0; - auda2dp_in_flush(audio); - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_FREQ_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - a2dp_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - goto evt_error; - } - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); - file->private_data = audio; - audio->opened = 1; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_a2dp_in_fops = { - .owner = THIS_MODULE, - .open = auda2dp_in_open, - .release = auda2dp_in_release, - .read = auda2dp_in_read, - .write = auda2dp_in_write, - .unlocked_ioctl = auda2dp_in_ioctl, -}; - -struct miscdevice audio_a2dp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_a2dp_in", - .fops = &audio_a2dp_in_fops, -}; - -static int __init auda2dp_in_init(void) -{ - mutex_init(&the_audio_a2dp_in.lock); - mutex_init(&the_audio_a2dp_in.read_lock); - spin_lock_init(&the_audio_a2dp_in.dsp_lock); - spin_lock_init(&the_audio_a2dp_in.dev_lock); - init_waitqueue_head(&the_audio_a2dp_in.wait); - init_waitqueue_head(&the_audio_a2dp_in.wait_enable); - return misc_register(&audio_a2dp_in_misc); -} - -device_initcall(auda2dp_in_init); - -MODULE_DESCRIPTION("MSM SBC encode driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_aac.c b/arch/arm/mach-msm/qdsp5v2/audio_aac.c deleted file mode 100644 index fbce5d628286..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_aac.c +++ /dev/null @@ -1,2036 +0,0 @@ -/* - * aac audio decoder device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define BUFSZ 32768 -#define DMASZ (BUFSZ * 2) -#define BUFSZ_MIN 4096 -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AAC 5 - -#define PCM_BUFSZ_MIN 9600 /* Hold one stereo AAC frame */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAAC_METAFIELD_MASK 0xFFFF0000 -#define AUDAAC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAAC_EOS_FLG_MASK 0x01 -#define AUDAAC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAAC_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAAC_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define BITSTREAM_ERROR_THRESHOLD_VALUE 0x1 /* DEFAULT THRESHOLD VALUE */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audaac_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audaac_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - struct msm_audio_aac_config aac_config; - - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audaac_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - uint32_t device_events; - - struct msm_audio_bitstream_info stream_info; - struct msm_audio_bitstream_error_info bitstream_error_info; - uint32_t bitstream_error_threshold_value; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_error_threshold_config(struct audio *audio); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audaac_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -static void aac_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} - -static void audaac_bitstream_error_info(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload e_payload; - - if (payload[0] != AUDDEC_DEC_AAC) { - MM_ERR("Unexpected bitstream error info from DSP:\ - Invalid decoder\n"); - return; - } - - /* get stream info from DSP msg */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->bitstream_error_info.dec_id = payload[0]; - audio->bitstream_error_info.err_msg_indicator = payload[1]; - audio->bitstream_error_info.err_type = payload[2]; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_ERR("bit_stream_error_type=%d error_count=%d\n", - audio->bitstream_error_info.err_type, (0x0000FFFF & - audio->bitstream_error_info.err_msg_indicator)); - - /* send event to ARM to notify error info coming */ - e_payload.error_info = audio->bitstream_error_info; - audaac_post_event(audio, AUDIO_EVENT_BITSTREAM_ERROR_INFO, e_payload); -} - -static void audaac_update_stream_info(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload e_payload; - - /* get stream info from DSP msg */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->stream_info.codec_type = AUDIO_CODEC_TYPE_AAC; - audio->stream_info.chan_info = (0x0000FFFF & payload[1]); - audio->stream_info.sample_rate = (0x0000FFFF & payload[2]); - audio->stream_info.bit_stream_info = (0x0000FFFF & payload[3]); - audio->stream_info.bit_rate = payload[4]; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("chan_info=%d, sample_rate=%d, bit_stream_info=%d\n", - audio->stream_info.chan_info, - audio->stream_info.sample_rate, - audio->stream_info.bit_stream_info); - - /* send event to ARM to notify steam info coming */ - e_payload.stream_info = audio->stream_info; - audaac_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); -} -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case AUDPLAY_UP_STREAM_INFO: - if ((msg[1] & AUDPLAY_STREAM_INFO_MSG_MASK) == - AUDPLAY_STREAM_INFO_MSG_MASK) { - audaac_bitstream_error_info(audio, msg); - } else { - audaac_update_stream_info(audio, msg); - } - break; - - case AUDPLAY_UP_OUTPORT_FLUSH_ACK: - MM_DBG("OUTPORT_FLUSH_ACK\n"); - audio->rflush = 0; - wake_up(&audio->read_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audplay_error_threshold_config(audio); - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_aac = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id,\ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AAC; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_aac cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_AAC_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.format = audio->aac_config.format; - cmd.audio_object = audio->aac_config.audio_object; - cmd.ep_config = audio->aac_config.ep_config; - cmd.aac_section_data_resilience_flag = - audio->aac_config.aac_section_data_resilience_flag; - cmd.aac_scalefactor_data_resilience_flag = - audio->aac_config.aac_scalefactor_data_resilience_flag; - cmd.aac_spectral_data_resilience_flag = - audio->aac_config.aac_spectral_data_resilience_flag; - cmd.sbr_on_flag = audio->aac_config.sbr_on_flag; - cmd.sbr_ps_on_flag = audio->aac_config.sbr_ps_on_flag; - cmd.channel_configuration = audio->aac_config.channel_configuration; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAAC_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - /* AAC frame size */ - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % 1024) - + (audio->mfield ? 24 : 0); - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_outport_flush(struct audio *audio) -{ - struct audplay_cmd_outport_flush op_flush_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - op_flush_cmd.cmd_id = AUDPLAY_CMD_OUTPORT_FLUSH; - (void)audplay_send_queue0(audio, &op_flush_cmd, sizeof(op_flush_cmd)); -} - -static void audplay_error_threshold_config(struct audio *audio) -{ - union audplay_cmd_channel_info ch_cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - ch_cfg_cmd.thr_update.cmd_id = AUDPLAY_CMD_CHANNEL_INFO; - ch_cfg_cmd.thr_update.threshold_update = AUDPLAY_ERROR_THRESHOLD_ENABLE; - ch_cfg_cmd.thr_update.threshold_value = - audio->bitstream_error_threshold_value; - (void)audplay_send_queue0(audio, &ch_cfg_cmd, sizeof(ch_cfg_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static int audaac_validate_usr_config(struct msm_audio_aac_config *config) -{ - int ret_val = -1; - - if (config->format != AUDIO_AAC_FORMAT_ADTS && - config->format != AUDIO_AAC_FORMAT_RAW && - config->format != AUDIO_AAC_FORMAT_PSUEDO_RAW && - config->format != AUDIO_AAC_FORMAT_LOAS) - goto done; - - if (config->audio_object != AUDIO_AAC_OBJECT_LC && - config->audio_object != AUDIO_AAC_OBJECT_LTP && - config->audio_object != AUDIO_AAC_OBJECT_BSAC && - config->audio_object != AUDIO_AAC_OBJECT_ERLC) - goto done; - - if (config->audio_object == AUDIO_AAC_OBJECT_ERLC) { - if (config->ep_config > 3) - goto done; - if (config->aac_scalefactor_data_resilience_flag != - AUDIO_AAC_SCA_DATA_RES_OFF && - config->aac_scalefactor_data_resilience_flag != - AUDIO_AAC_SCA_DATA_RES_ON) - goto done; - if (config->aac_section_data_resilience_flag != - AUDIO_AAC_SEC_DATA_RES_OFF && - config->aac_section_data_resilience_flag != - AUDIO_AAC_SEC_DATA_RES_ON) - goto done; - if (config->aac_spectral_data_resilience_flag != - AUDIO_AAC_SPEC_DATA_RES_OFF && - config->aac_spectral_data_resilience_flag != - AUDIO_AAC_SPEC_DATA_RES_ON) - goto done; - } else { - config->aac_section_data_resilience_flag = - AUDIO_AAC_SEC_DATA_RES_OFF; - config->aac_scalefactor_data_resilience_flag = - AUDIO_AAC_SCA_DATA_RES_OFF; - config->aac_spectral_data_resilience_flag = - AUDIO_AAC_SPEC_DATA_RES_OFF; - } - -#ifndef CONFIG_AUDIO_AAC_PLUS - if (AUDIO_AAC_SBR_ON_FLAG_OFF != config->sbr_on_flag) - goto done; -#else - if (config->sbr_on_flag != AUDIO_AAC_SBR_ON_FLAG_OFF && - config->sbr_on_flag != AUDIO_AAC_SBR_ON_FLAG_ON) - goto done; -#endif - -#ifndef CONFIG_AUDIO_ENHANCED_AAC_PLUS - if (AUDIO_AAC_SBR_PS_ON_FLAG_OFF != config->sbr_ps_on_flag) - goto done; -#else - if (config->sbr_ps_on_flag != AUDIO_AAC_SBR_PS_ON_FLAG_OFF && - config->sbr_ps_on_flag != AUDIO_AAC_SBR_PS_ON_FLAG_ON) - goto done; -#endif - - if (config->dual_mono_mode > AUDIO_AAC_DUAL_MONO_PL_SR) - goto done; - - if (config->channel_configuration > 2) - goto done; - - ret_val = 0; - done: - return ret_val; -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - -} - -static int audaac_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audaac_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audaac_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audaac_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audaac_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audaac_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audaac_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audaac_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audaac_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH running=%d\n", audio->running); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - - case AUDIO_OUTPORT_FLUSH: - MM_DBG("AUDIO_OUTPORT_FLUSH\n"); - audio->rflush = 1; - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audplay_outport_flush(audio); - rc = wait_event_interruptible(audio->read_wait, - !audio->rflush); - if (rc < 0) { - MM_ERR("AUDPLAY_OUTPORT_FLUSH interrupted\n"); - rc = -EINTR; - } - break; - - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - - if (config.channel_count == 1) { - config.channel_count = - AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = - AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == - AUDPP_CMD_PCM_INTF_MONO_V) { - config.channel_count = 1; - } else { - config.channel_count = 2; - } - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_AAC_CONFIG:{ - if (copy_to_user((void *)arg, &audio->aac_config, - sizeof(audio->aac_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_AAC_CONFIG:{ - struct msm_audio_aac_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - if (audaac_validate_usr_config(&usr_config) == 0) { - audio->aac_config = usr_config; - rc = 0; - } else - rc = -EINVAL; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if (config.pcm_feedback) { - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; - } - rc = 0; - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_STREAM_INFO:{ - if (audio->stream_info.sample_rate == 0) { - /* haven't received DSP stream event, - the stream info is not updated */ - rc = -EPERM; - break; - } - if (copy_to_user((void *)arg, &audio->stream_info, - sizeof(struct msm_audio_bitstream_info))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_BITSTREAM_ERROR_INFO:{ - if ((audio->bitstream_error_info.err_msg_indicator & - AUDPLAY_STREAM_INFO_MSG_MASK) == - AUDPLAY_STREAM_INFO_MSG_MASK) { - /* haven't received bitstream error info event, - the bitstream error info is not updated */ - rc = -EPERM; - break; - } - if (copy_to_user((void *)arg, &audio->bitstream_error_info, - sizeof(struct msm_audio_bitstream_error_info))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - case AUDIO_SET_ERR_THRESHOLD_VALUE: - if (copy_from_user(&audio->bitstream_error_threshold_value, - (void *)arg, sizeof(uint32_t))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} -/* Only useful in tunnel-mode */ -static int audaac_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("to read %d \n", count); - while (count > 0) { - rc = wait_event_interruptible_timeout(audio->read_wait, - (audio->in[audio->read_next]. - used > 0) || (audio->stopped) - || (audio->rflush), - msecs_to_jiffies(MSM_AUD_BUFFER_UPDATE_WAIT_MS)); - - if (rc == 0) { - rc = -ETIMEDOUT; - break; - } else if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("no partial frame done reading\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* - * Force to exit while loop - * to prevent output thread - * sleep too long if data is not - * ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audaac_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - char *buf_ptr; - int rc = 0; - - MM_DBG("signal input EOS reserved=%d\n", audio->reserved); - if (audio->reserved) { - MM_DBG("Pass reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - audio->reserved = 0; - frame->used = 2; - audplay_send_data(audio, 0); - } - MM_DBG("Now signal input EOS after reserved bytes %d %d %d\n", - audio->out[0].used, audio->out[1].used, audio->out_needed); - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAAC_EOS_NONE; - unsigned dsize; - - unsigned short mfield_size = 0; - MM_DBG("cnt=%d\n", count); - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDAAC_EOS_FLG_OFFSET] & - AUDAAC_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAAC_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAAC_EOS_FLG_OFFSET] &= - ~AUDAAC_EOS_FLG_MASK; - } - /* Check EOS to see if */ - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", - audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - MM_DBG("eos_condition %x buf[0x%x] start[0x%x]\n", eos_condition, - (int) buf, (int) start); - if (eos_condition == AUDAAC_EOS_SET) - rc = audaac_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audaac_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -static void audaac_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audaac_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audaac_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audaac_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audaac_suspend(struct early_suspend *h) -{ - struct audaac_suspend_ctl *ctl = - container_of(h, struct audaac_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audaac_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audaac_resume(struct early_suspend *h) -{ - struct audaac_suspend_ctl *ctl = - container_of(h, struct audaac_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audaac_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audaac_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audaac_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audaac_debug_fops = { - .read = audaac_debug_read, - .open = audaac_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, index, offset = 0; - unsigned pmem_sz = DMASZ; - struct audaac_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_aac_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AAC; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, SZ_4K); - if (audio->phys) { - audio->map_v_write = - ioremap(audio->phys, - pmem_sz); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys address, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = (u8 *)audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; - } - audio->out_dma_sz = pmem_sz; - - audio->read_phys = allocate_contiguous_ebi_nomap(PCM_BUFSZ_MIN - * PCM_BUF_MAX_COUNT, SZ_4K); - if (!audio->read_phys) { - MM_ERR("could not allocate read buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->map_v_read = ioremap(audio->read_phys, - PCM_BUFSZ_MIN * PCM_BUF_MAX_COUNT); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read phys address, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - free_contiguous_memory_by_paddr(audio->read_phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->read_data = audio->map_v_read; - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->read_phys, (int)audio->read_data); - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_aac, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->pcm_buf_count = PCM_BUF_MAX_COUNT; - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) { - audio->in[index].data = audio->read_data + offset; - audio->in[index].addr = audio->read_phys + offset; - audio->in[index].size = PCM_BUFSZ_MIN; - audio->in[index].used = 0; - offset += PCM_BUFSZ_MIN; - } - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->aac_config.format = AUDIO_AAC_FORMAT_ADTS; - audio->aac_config.audio_object = AUDIO_AAC_OBJECT_LC; - audio->aac_config.ep_config = 0; - audio->aac_config.aac_section_data_resilience_flag = - AUDIO_AAC_SEC_DATA_RES_OFF; - audio->aac_config.aac_scalefactor_data_resilience_flag = - AUDIO_AAC_SCA_DATA_RES_OFF; - audio->aac_config.aac_spectral_data_resilience_flag = - AUDIO_AAC_SPEC_DATA_RES_OFF; -#ifdef CONFIG_AUDIO_AAC_PLUS - audio->aac_config.sbr_on_flag = AUDIO_AAC_SBR_ON_FLAG_ON; -#else - audio->aac_config.sbr_on_flag = AUDIO_AAC_SBR_ON_FLAG_OFF; -#endif -#ifdef CONFIG_AUDIO_ENHANCED_AAC_PLUS - audio->aac_config.sbr_ps_on_flag = AUDIO_AAC_SBR_PS_ON_FLAG_ON; -#else - audio->aac_config.sbr_ps_on_flag = AUDIO_AAC_SBR_PS_ON_FLAG_OFF; -#endif - audio->aac_config.dual_mono_mode = AUDIO_AAC_DUAL_MONO_PL_SR; - audio->aac_config.channel_configuration = 2; - audio->vol_pan.volume = 0x2000; - audio->bitstream_error_threshold_value = - BITSTREAM_ERROR_THRESHOLD_VALUE; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - aac_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_aac_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audaac_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audaac_resume; - audio->suspend_ctl.node.suspend = audaac_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (index = 0; index < AUDAAC_EVENT_NUM; index++) { - e_node = kmalloc(sizeof(struct audaac_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - memset(&audio->stream_info, 0, sizeof(struct msm_audio_bitstream_info)); - memset(&audio->bitstream_error_info, 0, - sizeof(struct msm_audio_bitstream_info)); -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_aac_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audaac_fsync -}; - -struct miscdevice audio_aac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac", - .fops = &audio_aac_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_aac_misc); -} - -static void __exit audio_exit(void) -{ - misc_deregister(&audio_aac_misc); -} - -module_init(audio_init); -module_exit(audio_exit); - -MODULE_DESCRIPTION("MSM AAC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_aac_in.c b/arch/arm/mach-msm/qdsp5v2/audio_aac_in.c deleted file mode 100644 index 368441f801f5..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_aac_in.c +++ /dev/null @@ -1,1482 +0,0 @@ -/* - * aac audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_SIZE (772 * 2) /* 1536 bytes data */ -#define NT_FRAME_SIZE (780 * 2) /* 1536 bytes data + 24 meta field*/ -#define AAC_FRAME_SIZE 1536 -#define DMASZ (FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM (2) -#define META_OUT_SIZE (24) -#define META_IN_SIZE (14) -#define OUT_BUFFER_SIZE (32 * 1024 + META_OUT_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -#define AUDPREPROC_AAC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDPREPROC_AAC_EOS_FLG_MASK 0x01 -#define AUDPREPROC_AAC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_AAC_EOS_SET 0x1 /* EOS set in meta field */ - -#define PCM_CONFIG_UPDATE_FLAG_ENABLE -1 -#define PCM_CONFIG_UPDATE_FLAG_DISABLE 0 - -#define ENABLE_FLAG_VALUE -1 -#define DISABLE_FLAG_VALUE 0 - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - /* configuration to use on next enable */ - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t bit_rate; /* bit rate for AAC */ - uint32_t record_quality; /* record quality (bits/sample/channel) */ - uint32_t enc_type; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; - - struct audrec_session_info session_info; /*audrec session info*/ - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; /* device events interested in */ - uint32_t dev_cnt; - spinlock_t dev_lock; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int abort; /* set when error, like sample rate mismatch */ - char *build_id; -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct aac_encoded_meta_in { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -/* DSP command send functions */ -static int audaac_in_enc_config(struct audio_in *audio, int enable); -static int audaac_in_param_config(struct audio_in *audio); -static int audaac_in_mem_config(struct audio_in *audio); -static int audaac_in_record_config(struct audio_in *audio, int enable); -static int audaac_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); - -static void audaac_in_get_dsp_frames(struct audio_in *audio); -static int audpcm_config(struct audio_in *audio); -static void audaac_out_flush(struct audio_in *audio); -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio); -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed); -static void audaac_nt_in_get_dsp_frames(struct audio_in *audio); - -static void audaac_in_flush(struct audio_in *audio); - -static void aac_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_in *audio = (struct audio_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1) && - (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) - audaac_in_record_config(audio, 1); - - break; - } - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((!audio->running) || (!audio->enabled)) - break; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - /* Turn of as per source */ - if (audio->source) - audaac_in_record_config(audio, 1); - else - /* Turn off all */ - audaac_in_record_config(audio, 0); - } - break; - } - case AUDDEV_EVT_FREQ_CHG: { - MM_DBG("Encoder Driver got sample rate change event\n"); - MM_DBG("sample rate %d\n", evt_payload->freq_info.sample_rate); - MM_DBG("dev_type %d\n", evt_payload->freq_info.dev_type); - MM_DBG("acdb_dev_id %d\n", evt_payload->freq_info.acdb_dev_id); - if ((audio->running == 1) && (audio->enabled == 1)) { - /* Stop Recording sample rate does not match - with device sample rate */ - if (evt_payload->freq_info.sample_rate != - audio->samp_rate) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audaac_in_record_config(audio, 0); - audio->abort = 1; - wake_up(&audio->wait); - } - } - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* Convert Bit Rate to Record Quality field of DSP */ -static unsigned int bitrate_to_record_quality(unsigned int sample_rate, - unsigned int channel, unsigned int bit_rate) { - unsigned int temp; - - temp = sample_rate * channel; - MM_DBG(" sample rate * channel = %d \n", temp); - /* To represent in Q12 fixed format */ - temp = (bit_rate * 4096) / temp; - MM_DBG(" Record Quality = 0x%8x \n", temp); - return temp; -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) { - if(audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audpreproc_cmd_cfg_routing_mode(audio); - } else { - audaac_in_param_config(audio); - } - } else { /* Encoder disable success */ - audio->running = 0; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audaac_in_record_config(audio, 0); - else - wake_up(&audio->wait_enable); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audaac_in_mem_config(audio); - else - audpcm_config(audio); - break; - } - case AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG: { - struct audpreproc_cmd_routing_mode_done\ - *routing_cfg_done_msg = msg; - if (routing_cfg_done_msg->configuration == 0) { - MM_INFO("routing configuration failed\n"); - audio->running = 0; - } else - audaac_in_param_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG\n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (audio->dev_cnt > 0) - audaac_in_record_config(audio, 1); - } else { - audpreproc_pcm_send_data(audio, 1); - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - wake_up(&audio->write_wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - audaac_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audpreproc_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_ERR("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audaac_in_mem_config(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audaac_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_EOS_ACK_MSG: { - MM_DBG("eos ack recieved\n"); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event:module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void audaac_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - MM_DBG("head = %d\n", audio->in_head); - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - } else - audio->in_count++; - - audaac_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audaac_nt_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - MM_DBG("head = %d\n", audio->in_head); - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - - -struct msm_adsp_ops audrec_aac_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audpreproc_pcm_buffer_ptr_refresh(struct audio_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == META_OUT_SIZE) - len = len / 2; - else - len = (len + META_OUT_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpcm_config(struct audio_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = ENABLE_FLAG_VALUE; - cmd.sampling_freq = audio->samp_rate; - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ROUTING_MODE; - cmd.stream_id = audio->enc_id; - if (audio->mode == MSM_ADSP_ENC_MODE_NON_TUNNEL) - cmd.routing_mode = 1; - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - - - -static int audaac_in_enc_config(struct audio_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG_2 command"); - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG command"); - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audaac_in_param_config(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_parm_cfg_aac cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.aud_rec_samplerate_idx = audio->samp_rate; - cmd.aud_rec_stereo_mode = audio->channel_mode; - cmd.recording_quality = audio->record_quality; - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int audaac_in_record_config(struct audio_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audaac_in_mem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - MM_DBG("audio->phys = %x\n", audio->phys); - /* prepare buffer pointers: - * 1536 bytes aac packet + 4 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audio->in[n].data = data + 4; - data += (FRAME_SIZE/2); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } else { - audio->in[n].data = data + 12; - data += ((AAC_FRAME_SIZE) / 2) + 12; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 24)); - } - } - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int audaac_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} -static int audaac_flush_command(struct audio_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audaac_in_enable(struct audio_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - audaac_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audaac_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - audaac_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void audaac_ioport_reset(struct audio_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audaac_in_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audaac_out_flush(audio); - mutex_unlock(&audio->read_lock); -} - -static void audaac_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audaac_out_flush(struct audio_in *audio) -{ - int i; - - audio->out_head = 0; - audio->out_tail = 0; - audio->out_count = 0; - for (i = 0; i < OUT_FRAME_NUM; i++) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } -} - -/* ------------------- device --------------------- */ -static long audaac_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - /* Poll at 48KHz always */ - freq = 48000; - MM_DBG("AUDIO_START\n"); - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d sample rate requested %d\n", - freq, audio->samp_rate); - if (rc < 0) { - MM_DBG(" Sample rate can not be set, return code %d\n", - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = audio->samp_rate; - audpreproc_update_audrec_info(&audio->session_info); - rc = audaac_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audaac_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - audio->abort = 0; - break; - } - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audaac_ioport_reset(audio); - if (audio->running) { - audaac_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (NT_FRAME_SIZE - 24)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_pcm_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - if (audio->channel_mode == AUDREC_CMD_MODE_MONO) - cfg.channels = 1; - else - cfg.channels = 2; - cfg.sample_rate = audio->samp_rate; - cfg.bit_rate = audio->bit_rate; - cfg.stream_format = AUDIO_AAC_FORMAT_RAW; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_AAC_ENC_CONFIG: { - struct msm_audio_aac_enc_config cfg; - unsigned int record_quality; - if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.stream_format != AUDIO_AAC_FORMAT_RAW) { - MM_ERR("unsupported AAC format\n"); - rc = -EINVAL; - break; - } - record_quality = bitrate_to_record_quality(cfg.sample_rate, - cfg.channels, cfg.bit_rate); - /* Range of Record Quality Supported by DSP, Q12 format */ - if ((record_quality < 0x800) || (record_quality > 0x4000)) { - MM_ERR("Unsupported bit rate \n"); - rc = -EINVAL; - break; - } - MM_DBG("channels = %d\n", cfg.channels); - if (cfg.channels == 1) { - cfg.channels = AUDREC_CMD_MODE_MONO; - } else if (cfg.channels == 2) { - cfg.channels = AUDREC_CMD_MODE_STEREO; - } else { - rc = -EINVAL; - break; - } - MM_DBG("channels = %d\n", cfg.channels); - audio->samp_rate = cfg.sample_rate; - audio->channel_mode = cfg.channels; - audio->bit_rate = cfg.bit_rate; - audio->record_quality = record_quality; - MM_DBG(" Record Quality = 0x%8x \n", audio->record_quality); - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audaac_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct aac_encoded_meta_in meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG(" count = %d\n", count); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->abort || audio->rflush); - - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } - - if (audio->abort) { - rc = -EPERM; /* Not permitted due to abort */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, 12); - meta_field.metadata_len = - sizeof(struct aac_encoded_meta_in); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct aac_encoded_meta_in))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct aac_encoded_meta_in); - count -= sizeof(struct aac_encoded_meta_in); - } - if (count >= size) { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) && - (!audio->eos_ack)) { - MM_DBG("sending read ptr command %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audaac_dsp_read_buffer(audio, - audio->dsp_cnt++); - break; - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - if (buf > start) - return buf - start; - - return rc; -} - -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audpreproc_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - - -static int audaac_in_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) - -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - - int audpreproc_aac_process_eos(struct audio_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audpreproc_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audaac_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_AAC_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = count; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_AAC_EOS_FLG_OFFSET] & - AUDPREPROC_AAC_EOS_FLG_MASK) { - MM_DBG("EOS SET\n"); - eos_condition = AUDPREPROC_AAC_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - if (audio->mode == - MSM_AUD_ENC_MODE_NONTUNNEL) { - eos_condition = 0; - goto exit; - } - goto error; - } else - cpy_ptr[AUDPREPROC_AAC_EOS_FLG_OFFSET] &= - ~AUDPREPROC_AAC_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audpreproc_pcm_send_data(audio, 0); - else { - audpreproc_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_AAC_EOS_SET) - rc = audpreproc_aac_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audaac_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audaac_in_disable(audio); - audaac_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); - audio->data = NULL; - } - if (audio->out_data) { - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); - audio->out_data = NULL; - } - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_in the_audio_aac_in; - -static int audaac_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_aac_in; - int rc; - int encid; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = ioremap(audio->phys, DMASZ); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map DMA buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read; - } else { - MM_ERR("could not allocate DMA buffers\n"); - rc = -ENOMEM; - goto done; - } - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (NT_FRAME_SIZE - 24); - else - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = ENC_TYPE_AAC | audio->mode; - audio->samp_rate = 8000; - audio->channel_mode = AUDREC_CMD_MODE_MONO; - /* For AAC, bit rate hard coded, default settings is - * sample rate (8000) x channel count (1) x recording quality (1.75) - * = 14000 bps */ - audio->bit_rate = 14000; - audio->record_quality = 0x1c00; - MM_DBG("enc_type = %x\n", audio->enc_type); - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_aac_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - audio->abort = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audaac_in_flush(audio); - audaac_out_flush(audio); - - audio->out_phys = allocate_contiguous_ebi_nomap(BUFFER_SIZE, SZ_4K); - if (!audio->out_phys) { - MM_ERR("could not allocate write buffers\n"); - rc = -ENOMEM; - goto evt_error; - } else { - audio->map_v_write = ioremap( - audio->out_phys, BUFFER_SIZE); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->out_phys, (int)audio->out_data); - } - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_FREQ_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - aac_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->mfield = META_OUT_SIZE; - file->private_data = audio; - audio->opened = 1; - audio->out_frame_cnt++; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = audaac_in_open, - .release = audaac_in_release, - .read = audaac_in_read, - .write = audaac_in_write, - .fsync = audaac_in_fsync, - .unlocked_ioctl = audaac_in_ioctl, -}; - -struct miscdevice audio_aac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &audio_in_fops, -}; - -static int __init audaac_in_init(void) -{ - mutex_init(&the_audio_aac_in.lock); - mutex_init(&the_audio_aac_in.read_lock); - spin_lock_init(&the_audio_aac_in.dsp_lock); - spin_lock_init(&the_audio_aac_in.dev_lock); - init_waitqueue_head(&the_audio_aac_in.wait); - init_waitqueue_head(&the_audio_aac_in.wait_enable); - mutex_init(&the_audio_aac_in.write_lock); - init_waitqueue_head(&the_audio_aac_in.write_wait); - - return misc_register(&audio_aac_in_misc); -} - -device_initcall(audaac_in_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_acdb.c b/arch/arm/mach-msm/qdsp5v2/audio_acdb.c deleted file mode 100644 index 85378beef4bf..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_acdb.c +++ /dev/null @@ -1,3429 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* this is the ACDB device ID */ -#define DALDEVICEID_ACDB 0x02000069 -#define ACDB_PORT_NAME "DAL00" -#define ACDB_CPU SMD_APPS_MODEM -#define ACDB_BUF_SIZE 4096 -#define PBE_BUF_SIZE (33*1024) -#define FLUENCE_BUF_SIZE 498 - -#define ACDB_VALUES_NOT_FILLED 0 -#define ACDB_VALUES_FILLED 1 -#define MAX_RETRY 10 - -/*below macro is used to align the session info received from -Devctl driver with the state mentioned as not to alter the -Existing code*/ -#define AUDREC_OFFSET 2 -/* rpc table index */ -enum { - ACDB_DalACDB_ioctl = DALDEVICE_FIRST_DEVICE_API_IDX -}; - -enum { - CAL_DATA_READY = 0x1, - AUDPP_READY = 0x2, - AUDREC0_READY = 0x4, - AUDREC1_READY = 0x8, - AUDREC2_READY = 0x10, -}; - - -struct acdb_data { - void *handle; - - u32 phys_addr; - u8 *virt_addr; - - struct task_struct *cb_thread_task; - struct auddev_evt_audcal_info *device_info; - - u32 acdb_state; - struct audpp_event_callback audpp_cb; - struct audpreproc_event_callback audpreproc_cb; - - struct audpp_cmd_cfg_object_params_pcm *pp_iir; - struct audpp_cmd_cfg_cal_gain *calib_gain_rx; - struct audpp_cmd_cfg_pbe *pbe_block; - struct audpp_cmd_cfg_object_params_mbadrc *pp_mbadrc; - struct audpreproc_cmd_cfg_agc_params *preproc_agc; - struct audpreproc_cmd_cfg_iir_tuning_filter_params *preproc_iir; - struct audpreproc_cmd_cfg_cal_gain *calib_gain_tx; - struct acdb_mbadrc_block mbadrc_block; - struct audpreproc_cmd_cfg_lvnv_param preproc_lvnv; - - wait_queue_head_t wait; - struct mutex acdb_mutex; - u32 device_cb_compl; - u32 audpp_cb_compl; - u32 preproc_cb_compl; - u8 preproc_stream_id; - u8 audrec_applied; - u32 multiple_sessions; - u32 cur_tx_session; - struct acdb_result acdb_result; - u16 *pbe_extbuff; - u16 *pbe_enable_flag; - u32 fluence_extbuff; - u8 *fluence_extbuff_virt; - void *map_v_fluence; - - struct acdb_pbe_block *pbe_blk; - - spinlock_t dsp_lock; - int dec_id; - struct audpp_cmd_cfg_object_params_eqalizer eq; - /*status to enable or disable the fluence*/ - int fleuce_feature_status[MAX_AUDREC_SESSIONS]; - struct audrec_session_info session_info; - /*pmem info*/ - int pmem_fd; - unsigned long paddr; - unsigned long kvaddr; - unsigned long pmem_len; - struct file *file; - /* pmem for get acdb blk */ - unsigned long get_blk_paddr; - u8 *get_blk_kvaddr; - void *map_v_get_blk; - char *build_id; -}; - -static struct acdb_data acdb_data; - -struct acdb_cache_node { - u32 node_status; - s32 stream_id; - u32 phys_addr_acdb_values; - void *map_v_addr; - u8 *virt_addr_acdb_values; - struct auddev_evt_audcal_info device_info; -}; - -/*for RX devices acdb values are applied based on copp ID so -the depth of tx cache is MAX number of COPP supported in the system*/ -struct acdb_cache_node acdb_cache_rx[MAX_COPP_NODE_SUPPORTED]; - -/*for TX devices acdb values are applied based on AUDREC session and -the depth of the tx cache is define by number of AUDREC sessions supported*/ -struct acdb_cache_node acdb_cache_tx[MAX_AUDREC_SESSIONS]; - -/*Audrec session info includes Attributes Sampling frequency and enc_id */ -struct audrec_session_info session_info[MAX_AUDREC_SESSIONS]; -#ifdef CONFIG_DEBUG_FS - -#define RTC_MAX_TIMEOUT 500 /* 500 ms */ -#define PMEM_RTC_ACDB_QUERY_MEM 4096 -#define EXTRACT_HIGH_WORD(x) ((x & 0xFFFF0000)>>16) -#define EXTRACT_LOW_WORD(x) (0x0000FFFF & x) -#define ACDB_RTC_TX 0xF1 -#define ACDB_RTC_RX 0x1F - - -static u32 acdb_audpp_entry[][4] = { - - { ABID_AUDIO_RTC_VOLUME_PAN_RX,\ - IID_AUDIO_RTC_VOLUME_PAN_PARAMETERS,\ - AUDPP_CMD_VOLUME_PAN,\ - ACDB_RTC_RX - }, - { ABID_AUDIO_IIR_RX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPP_CMD_IIR_TUNING_FILTER, - ACDB_RTC_RX - }, - { ABID_AUDIO_RTC_EQUALIZER_PARAMETERS,\ - IID_AUDIO_RTC_EQUALIZER_PARAMETERS,\ - AUDPP_CMD_EQUALIZER,\ - ACDB_RTC_RX - }, - { ABID_AUDIO_RTC_SPA,\ - IID_AUDIO_RTC_SPA_PARAMETERS,\ - AUDPP_CMD_SPECTROGRAM, - ACDB_RTC_RX - }, - { ABID_AUDIO_STF_RX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPP_CMD_SIDECHAIN_TUNING_FILTER,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_MBADRC_RX,\ - IID_AUDIO_RTC_MBADRC_PARAMETERS,\ - AUDPP_CMD_MBADRC,\ - ACDB_RTC_RX - }, - { - ABID_AUDIO_AGC_TX,\ - IID_AUDIO_AGC_PARAMETERS,\ - AUDPREPROC_CMD_CFG_AGC_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_AGC_TX,\ - IID_AUDIO_RTC_AGC_PARAMETERS,\ - AUDPREPROC_CMD_CFG_AGC_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_NS_TX,\ - IID_NS_PARAMETERS,\ - AUDPREPROC_CMD_CFG_NS_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_IIR_TX,\ - IID_AUDIO_RTC_TX_IIR_COEFF,\ - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS,\ - ACDB_RTC_TX - }, - { - ABID_AUDIO_IIR_TX,\ - IID_AUDIO_IIR_COEFF,\ - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS,\ - ACDB_RTC_TX - } - /*Any new entries should be added here*/ -}; - -static struct dentry *get_set_abid_dentry; -static struct dentry *get_set_abid_data_dentry; - -struct rtc_acdb_pmem { - u8 *viraddr; - int32_t phys; - void *map_v_rtc; -}; - -struct rtc_acdb_data { - u32 acdb_id; - u32 cmd_id; - u32 set_abid; - u32 set_iid; - u32 abid; - u32 err; - bool valid_abid; - u32 tx_rx_ctl; - struct rtc_acdb_pmem rtc_read; - struct rtc_acdb_pmem rtc_write; - wait_queue_head_t wait; -}; - -struct get_abid { - u32 cmd_id; - u32 acdb_id; - u32 set_abid; - u32 set_iid; -}; - -struct acdb_block_mbadrc_rtc { - u16 enable; - u16 num_bands; - u16 down_samp_level; - u16 adrc_delay; - u16 ext_buf_size; - u16 ext_partition; - u16 ext_buf_msw; - u16 ext_buf_lsw; - struct adrc_config adrc_band[AUDPP_MAX_MBADRC_BANDS]; - signed int ExtBuff[196]; -} __attribute__((packed)); - -enum { - ACDB_RTC_SUCCESS, - ACDB_RTC_ERR_INVALID_DEVICE, - ACDB_RTC_ERR_DEVICE_INACTIVE, - ACDB_RTC_ERR_INVALID_ABID, - ACDB_RTC_DSP_FAILURE, - ACDB_RTC_DSP_FEATURE_NOT_AVAILABLE, - ACDB_RTC_ERR_INVALID_LEN, - ACDB_RTC_ERR_UNKNOWN_FAILURE, - ACDB_RTC_PENDING_RESPONSE, - ACDB_RTC_INIT_FAILURE, -}; - -static struct rtc_acdb_data rtc_acdb; - -static int rtc_getsetabid_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("GET-SET ABID Open debug intf %s\n", - (char *) file->private_data); - return 0; -} - -static bool get_feature_id(u32 set_abid, u32 iid, unsigned short *feature_id) -{ - bool ret_value = false; - int i = 0; - - for (; i < (sizeof(acdb_audpp_entry) / sizeof(acdb_audpp_entry[0]));\ - i++) { - if (acdb_audpp_entry[i][0] == set_abid && - acdb_audpp_entry[i][1] == iid) { - *feature_id = acdb_audpp_entry[i][2]; - rtc_acdb.tx_rx_ctl = acdb_audpp_entry[i][3]; - ret_value = true; - break; - } - } - return ret_value; -} -static ssize_t rtc_getsetabid_dbg_write(struct file *filp, - const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - struct get_abid write_abid; - unsigned short feat_id = 0; - rtc_acdb.valid_abid = false; - - if (copy_from_user(&write_abid, \ - (void *)ubuf, sizeof(struct get_abid))) { - MM_ERR("ACDB DATA WRITE - INVALID READ LEN\n"); - rtc_acdb.err = ACDB_RTC_ERR_INVALID_LEN; - return cnt; - } - MM_INFO("SET ABID : Cmd ID: %d Device:%d ABID:%d IID : %d cnt: %d\n",\ - write_abid.cmd_id, write_abid.acdb_id, - write_abid.set_abid, write_abid.set_iid, cnt); - if (write_abid.acdb_id > ACDB_ID_MAX || - write_abid.acdb_id < ACDB_ID_HANDSET_SPKR){ - rtc_acdb.err = ACDB_RTC_ERR_INVALID_DEVICE; - return cnt; - } - if (!is_dev_opened(write_abid.acdb_id)) { - rtc_acdb.err = ACDB_RTC_ERR_DEVICE_INACTIVE; - return cnt; - } - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - rtc_acdb.abid = write_abid.set_abid; - if (get_feature_id(write_abid.set_abid, \ - write_abid.set_iid, &feat_id)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - rtc_acdb.cmd_id = write_abid.cmd_id; - rtc_acdb.acdb_id = write_abid.acdb_id; - rtc_acdb.set_abid = feat_id; - rtc_acdb.valid_abid = true; - rtc_acdb.set_iid = write_abid.set_iid; - } - return cnt; -} -static ssize_t rtc_getsetabid_dbg_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - static char buffer[1024]; - int n = 0; - u32 msg = rtc_acdb.err; - memcpy(buffer, &rtc_acdb.cmd_id, sizeof(struct get_abid)); - memcpy(buffer+16, &msg, 4); - n = 20; - MM_INFO("SET ABID : Cmd ID: %x Device:%x ABID:%x IID : %x Err: %d\n",\ - rtc_acdb.cmd_id, rtc_acdb.acdb_id, rtc_acdb.set_abid,\ - rtc_acdb.set_iid, rtc_acdb.err); - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static int rtc_getsetabid_data_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("GET-SET ABID DATA Open debug intf %s\n", - (char *) file->private_data); - return 0; -} - -void acdb_rtc_set_err(u32 ErrCode) -{ - if (rtc_acdb.err == ACDB_RTC_PENDING_RESPONSE) { - if (ErrCode == 0xFFFF) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - MM_INFO("RTC READ SUCCESS---\n"); - } else if (ErrCode == 0) { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_INFO("RTC READ FAIL---\n"); - } else if (ErrCode == 1) { - rtc_acdb.err = ACDB_RTC_DSP_FEATURE_NOT_AVAILABLE; - MM_INFO("RTC READ FEAT UNAVAILABLE---\n"); - } else { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_ERR("RTC Err CODE---\n"); - } - } else { - rtc_acdb.err = ACDB_RTC_DSP_FAILURE; - MM_ERR("RTC Err code Invalid State\n"); - } - wake_up(&rtc_acdb.wait); -} -static ssize_t rtc_getsetabid_data_dbg_read(struct file *file, - char __user *buf, size_t count, - loff_t *ppos) -{ - static char buffer[PMEM_RTC_ACDB_QUERY_MEM]; - int rc, n = 0; - int counter = 0; - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - memset(&buffer, 0, PMEM_RTC_ACDB_QUERY_MEM); - - if (rtc_acdb.valid_abid != true) { - MM_ERR("ACDB DATA READ ---INVALID ABID\n"); - n = 0; - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - } else { - if (PMEM_RTC_ACDB_QUERY_MEM < count) { - MM_ERR("ACDB DATA READ ---\ - INVALID READ LEN %x\n", count); - n = 0; - rtc_acdb.err = ACDB_RTC_ERR_INVALID_LEN; - } else { - rtc_acdb.err = ACDB_RTC_PENDING_RESPONSE; - if (rtc_read->viraddr != NULL) { - memset(rtc_read->viraddr, - 0, PMEM_RTC_ACDB_QUERY_MEM); - } - if (rtc_acdb.tx_rx_ctl == ACDB_RTC_RX) { - struct rtc_audpp_read_data rtc_read_cmd; - rtc_read_cmd.cmd_id = - AUDPP_CMD_PP_FEAT_QUERY_PARAMS; - rtc_read_cmd.obj_id = - AUDPP_CMD_COPP_STREAM; - rtc_read_cmd.route_id = - acdb_data.device_info->dev_id; - rtc_read_cmd.feature_id = rtc_acdb.set_abid; - rtc_read_cmd.extbufsizemsw = - EXTRACT_HIGH_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_read_cmd.extbufsizelsw = - EXTRACT_LOW_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_read_cmd.extpart = 0x0000; - rtc_read_cmd.extbufstartmsw = - EXTRACT_HIGH_WORD(rtc_read->phys); - rtc_read_cmd.extbufstartlsw = - EXTRACT_LOW_WORD(rtc_read->phys); - rc = audpp_send_queue2(&rtc_read_cmd, - sizeof(rtc_read_cmd)); - MM_INFO("ACDB READ Command RC --->%x\ - Route ID=%x\n", rc,\ - acdb_data.device_info->dev_id); - } else if (rtc_acdb.tx_rx_ctl == ACDB_RTC_TX) { - struct rtc_audpreproc_read_data rtc_audpreproc; - rtc_audpreproc.cmd_id = - AUDPREPROC_CMD_FEAT_QUERY_PARAMS; - rtc_audpreproc.stream_id = - acdb_data.preproc_stream_id; - rtc_audpreproc.feature_id = rtc_acdb.set_abid; - rtc_audpreproc.extbufsizemsw = - EXTRACT_HIGH_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_audpreproc.extbufsizelsw = - EXTRACT_LOW_WORD(\ - PMEM_RTC_ACDB_QUERY_MEM); - rtc_audpreproc.extpart = 0x0000; - rtc_audpreproc.extbufstartmsw = - EXTRACT_HIGH_WORD(rtc_read->phys); - rtc_audpreproc.extbufstartlsw = - EXTRACT_LOW_WORD(rtc_read->phys); - rc = audpreproc_send_preproccmdqueue( - &rtc_audpreproc,\ - sizeof(rtc_audpreproc)); - MM_INFO("ACDB READ Command RC --->%x,\ - stream_id %x\n", rc,\ - acdb_data.preproc_stream_id); - } - rc = wait_event_timeout(rtc_acdb.wait, - (rtc_acdb.err != - ACDB_RTC_PENDING_RESPONSE), - msecs_to_jiffies(RTC_MAX_TIMEOUT)); - MM_INFO("ACDB READ ACK Count = %x Err = %x\n", - count, rtc_acdb.err); - { - if (rtc_acdb.err == ACDB_RTC_SUCCESS - && rtc_read->viraddr != NULL) { - memcpy(buffer, rtc_read->viraddr, count); - n = count; - while (counter < count) { - MM_DBG("%x", \ - rtc_read->viraddr[counter]); - counter++; - } - } - } - } - } - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static bool acdb_set_tx_rtc(const char *ubuf, size_t writecount) -{ - struct audpreproc_cmd_cfg_iir_tuning_filter_params *preproc_iir; - struct audpreproc_cmd_cfg_agc_params *preproc_agc; - struct audpreproc_cmd_cfg_ns_params *preproc_ns; - s32 result = 0; - bool retval = false; - unsigned short iircmdsize = - sizeof(struct audpreproc_cmd_cfg_iir_tuning_filter_params); - unsigned short iircmdid = AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - - switch (rtc_acdb.set_abid) { - - case AUDPREPROC_CMD_CFG_AGC_PARAMS: - case AUDPREPROC_CMD_CFG_AGC_PARAMS_2: - { - preproc_agc = kmalloc(sizeof(\ - struct audpreproc_cmd_cfg_agc_params),\ - GFP_KERNEL); - if ((sizeof(struct audpreproc_cmd_cfg_agc_params) -\ - (2*sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - AGC TX writecount > DSP struct\n"); - } else { - if (preproc_agc != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_agc; - offset = offsetof(struct \ - audpreproc_cmd_cfg_agc_params,\ - tx_agc_param_mask); - offset_addr = (unsigned short *)(base + offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_agc->cmd_id = - AUDPREPROC_CMD_CFG_AGC_PARAMS; - preproc_agc->stream_id = - acdb_data.preproc_stream_id; - result = audpreproc_dsp_set_agc( - preproc_agc, - sizeof(struct \ - audpreproc_cmd_cfg_agc_params)); - if (result) { - MM_ERR("ACDB=> Failed to \ - send AGC data to \ - preproc)\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - GC Tx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --\ - AGC TX kalloc Failed LEN\n"); - } - } - if (preproc_agc != NULL) - kfree(preproc_agc); - break; - } - case AUDPREPROC_CMD_CFG_NS_PARAMS: - { - - preproc_ns = kmalloc(sizeof(struct \ - audpreproc_cmd_cfg_ns_params),\ - GFP_KERNEL); - if ((sizeof(struct audpreproc_cmd_cfg_ns_params) -\ - (2 * sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - NS TX writecount > DSP struct\n"); - } else { - if (preproc_ns != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_ns; - offset = offsetof(struct \ - audpreproc_cmd_cfg_ns_params,\ - ec_mode_new); - offset_addr = (unsigned short *)(base + offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_ns->cmd_id = - AUDPREPROC_CMD_CFG_NS_PARAMS; - preproc_ns->stream_id = - acdb_data.preproc_stream_id; - result = audpreproc_dsp_set_ns( - preproc_ns, - sizeof(struct \ - audpreproc_cmd_cfg_ns_params)); - if (result) { - MM_ERR("ACDB=> Failed to send \ - NS data to preproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---NS Tx \ - copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --NS TX\ - kalloc Failed LEN\n"); - } - } - if (preproc_ns != NULL) - kfree(preproc_ns); - break; - } - case AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS: - { - - preproc_iir = kmalloc(sizeof(struct \ - audpreproc_cmd_cfg_iir_tuning_filter_params),\ - GFP_KERNEL); - if ((sizeof(struct \ - audpreproc_cmd_cfg_iir_tuning_filter_params)-\ - (2 * sizeof(unsigned short))) - < writecount) { - MM_ERR("ACDB DATA WRITE --IIR TX writecount\ - > DSP struct\n"); - } else { - if (preproc_iir != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)preproc_iir; - offset = offsetof(struct \ - audpreproc_cmd_cfg_iir_tuning_filter_params,\ - active_flag); - offset_addr = (unsigned short *)(base + \ - offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - preproc_iir->cmd_id = iircmdid; - preproc_iir->stream_id = - acdb_data.preproc_stream_id; - result = audpreproc_dsp_set_iir(\ - preproc_iir, - iircmdsize); - if (result) { - MM_ERR("ACDB=> Failed to send\ - IIR data to preproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---IIR Tx \ - copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --IIR TX kalloc \ - Failed LEN\n"); - } - } - if (preproc_iir != NULL) - kfree(preproc_iir); - break; - } - } - return retval; -} - -static bool acdb_set_rx_rtc(const char *ubuf, size_t writecount) -{ - - struct audpp_cmd_cfg_object_params_volpan *volpan_config; - struct audpp_cmd_cfg_object_params_mbadrc *mbadrc_config; - struct acdb_block_mbadrc_rtc *acdb_mbadrc_rtc; - struct audpp_cmd_cfg_object_params_sidechain *stf_config; - struct audpp_cmd_cfg_object_params_spectram *spa_config; - struct audpp_cmd_cfg_object_params_eqalizer *eq_config; - struct audpp_cmd_cfg_object_params_pcm *iir_config; - unsigned short temp_spa[34]; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - s32 result = 0; - bool retval = false; - - switch (rtc_acdb.set_abid) { - case AUDPP_CMD_VOLUME_PAN: - { - volpan_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_volpan),\ - GFP_KERNEL); - if ((sizeof(struct audpp_cmd_cfg_object_params_volpan) -\ - sizeof(struct audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - VolPan writecount > DSP struct\n"); - } else { - if (volpan_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)volpan_config; - offset = offsetof(struct \ - audpp_cmd_cfg_object_params_volpan,\ - volume); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - MM_ERR("ACDB RX WRITE DATA:\ - AUDPP_CMD_VOLUME_PAN\n"); - result = audpp_set_volume_and_pan( - acdb_data.device_info->dev_id,\ - volpan_config->volume, - volpan_config->pan, - COPP); - if (result) { - MM_ERR("ACDB=> Failed to \ - send VOLPAN data to" - " postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --\ - Vol Pan kalloc Failed LEN\n"); - } - } - if (volpan_config != NULL) - kfree(volpan_config); - break; - } - - case AUDPP_CMD_IIR_TUNING_FILTER: - { - iir_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_pcm),\ - GFP_KERNEL); - if ((sizeof(struct audpp_cmd_cfg_object_params_pcm) -\ - sizeof(struct audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - IIR RX writecount > DSP struct\n"); - } else { - if (iir_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)iir_config; - offset = offsetof(struct \ - audpp_cmd_cfg_object_params_pcm,\ - active_flag); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - - iir_config->common.cmd_id = - AUDPP_CMD_CFG_OBJECT_PARAMS; - iir_config->common.stream = - AUDPP_CMD_COPP_STREAM; - iir_config->common.stream_id = 0; - iir_config->common.obj_cfg = - AUDPP_CMD_OBJ0_UPDATE; - iir_config->common.command_type = 0; - MM_ERR("ACDB RX WRITE DATA:\ - AUDPP_CMD_IIR_TUNING_FILTER\n"); - result = audpp_dsp_set_rx_iir( - acdb_data.device_info->dev_id, - iir_config->active_flag,\ - iir_config, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send\ - IIR data to\ - postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - IIR Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --\ - acdb_iir_block kalloc Failed LEN\n"); - } - } - if (iir_config != NULL) - kfree(iir_config); - break; - } - case AUDPP_CMD_EQUALIZER: - { - eq_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_eqalizer),\ - GFP_KERNEL); - if ((sizeof(struct audpp_cmd_cfg_object_params_eqalizer) -\ - sizeof(struct audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - EQ RX writecount > DSP struct\n"); - } else { - if (eq_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)eq_config; - offset = offsetof(struct \ - audpp_cmd_cfg_object_params_eqalizer,\ - eq_flag); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - eq_config->common.cmd_id = - AUDPP_CMD_CFG_OBJECT_PARAMS; - eq_config->common.stream = - AUDPP_CMD_COPP_STREAM; - eq_config->common.stream_id = 0; - eq_config->common.obj_cfg = - AUDPP_CMD_OBJ0_UPDATE; - eq_config->common.command_type = 0; - MM_ERR("ACDB RX WRITE\ - DATA:AUDPP_CMD_EQUALIZER\n"); - result = audpp_dsp_set_eq( - acdb_data.device_info->dev_id, - eq_config->eq_flag,\ - eq_config, - COPP); - if (result) { - MM_ERR("ACDB=> Failed to \ - send EQ data to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - EQ Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --\ - EQ kalloc Failed LEN\n"); - } - } - if (eq_config != NULL) - kfree(eq_config); - break; - } - - case AUDPP_CMD_SPECTROGRAM: - { - spa_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_spectram),\ - GFP_KERNEL); - if ((sizeof(struct audpp_cmd_cfg_object_params_spectram)-\ - sizeof(struct \ - audpp_cmd_cfg_object_params_common)) - < (2 * sizeof(unsigned short))) { - MM_ERR("ACDB DATA WRITE --SPA \ - RX writecount > DSP struct\n"); - } else { - if (spa_config != NULL) { - if ((copy_from_user(&temp_spa[0],\ - (void *)ubuf, - (34 * sizeof(unsigned short)))) - == 0x00) { - spa_config->common.cmd_id = - AUDPP_CMD_CFG_OBJECT_PARAMS; - spa_config->common.stream = - AUDPP_CMD_COPP_STREAM; - spa_config->common.stream_id = 0; - spa_config->common.obj_cfg = - AUDPP_CMD_OBJ0_UPDATE; - spa_config->common.command_type = 0; - spa_config->sample_interval = - temp_spa[0]; - spa_config->num_coeff = temp_spa[1]; - MM_ERR("ACDB RX WRITE DATA:\ - AUDPP_CMD_SPECTROGRAM\n"); - result = audpp_dsp_set_spa( - acdb_data.device_info->dev_id,\ - spa_config, COPP); - if (result) { - MM_ERR("ACDB=> Failed to \ - send SPA data \ - to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE \ - ---SPA Rx copy_from_user\ - Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --\ - SPA kalloc Failed LEN\n"); - } - } - if (spa_config != NULL) - kfree(spa_config); - break; - } - case AUDPP_CMD_MBADRC: - { - acdb_mbadrc_rtc = kmalloc(sizeof(struct \ - acdb_block_mbadrc_rtc),\ - GFP_KERNEL); - mbadrc_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_mbadrc),\ - GFP_KERNEL); - if (mbadrc_config != NULL && acdb_mbadrc_rtc != NULL) { - if ((copy_from_user(acdb_mbadrc_rtc,\ - (void *)ubuf, - sizeof(struct acdb_block_mbadrc_rtc))) - == 0x00) { - mbadrc_config->common.cmd_id = - AUDPP_CMD_CFG_OBJECT_PARAMS; - mbadrc_config->common.stream = - AUDPP_CMD_COPP_STREAM; - mbadrc_config->common.stream_id = 0; - mbadrc_config->common.obj_cfg = - AUDPP_CMD_OBJ0_UPDATE; - mbadrc_config->common.command_type = 0; - mbadrc_config->enable = - acdb_mbadrc_rtc->enable; - mbadrc_config->num_bands = - acdb_mbadrc_rtc->num_bands; - mbadrc_config->down_samp_level = - acdb_mbadrc_rtc->down_samp_level; - mbadrc_config->adrc_delay = - acdb_mbadrc_rtc->adrc_delay; - memcpy(mbadrc_config->adrc_band,\ - acdb_mbadrc_rtc->adrc_band,\ - AUDPP_MAX_MBADRC_BANDS *\ - sizeof(struct adrc_config)); - if (mbadrc_config->num_bands > 1) { - mbadrc_config->ext_buf_size = - (97 * 2) + (33 * 2 * \ - (mbadrc_config->num_bands - 2)); - } - mbadrc_config->ext_partition = 0; - mbadrc_config->ext_buf_lsw = - (u16) EXTRACT_LOW_WORD(\ - rtc_write->phys); - mbadrc_config->ext_buf_msw = - (u16) EXTRACT_HIGH_WORD(\ - rtc_write->phys); - memcpy(rtc_write->viraddr, - acdb_mbadrc_rtc->ExtBuff, - (196*sizeof(signed int))); - result = audpp_dsp_set_mbadrc( - acdb_data.device_info->dev_id, - mbadrc_config->enable, - mbadrc_config, COPP); - if (result) { - MM_ERR("ACDB=> Failed to \ - Send MBADRC data \ - to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - MBADRC Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE --MBADRC kalloc Failed LEN\n"); - } - if (mbadrc_config != NULL) - kfree(mbadrc_config); - if (acdb_mbadrc_rtc != NULL) - kfree(acdb_mbadrc_rtc); - break; - } - case AUDPP_CMD_SIDECHAIN_TUNING_FILTER: - { - stf_config = kmalloc(sizeof(struct \ - audpp_cmd_cfg_object_params_sidechain),\ - GFP_KERNEL); - if ((sizeof(struct audpp_cmd_cfg_object_params_sidechain) -\ - sizeof(struct audpp_cmd_cfg_object_params_common)) - < writecount) { - MM_ERR("ACDB DATA WRITE --\ - STF RX writecount > DSP struct\n"); - } else { - if (stf_config != NULL) { - char *base; unsigned short offset; - unsigned short *offset_addr; - base = (char *)stf_config; - offset = offsetof(struct \ - audpp_cmd_cfg_object_params_sidechain,\ - active_flag); - offset_addr = (unsigned short *)(base+offset); - if ((copy_from_user(offset_addr,\ - (void *)ubuf, writecount)) == 0x00) { - stf_config->common.cmd_id = - AUDPP_CMD_CFG_OBJECT_PARAMS; - stf_config->common.stream = - AUDPP_CMD_COPP_STREAM; - stf_config->common.stream_id = 0; - stf_config->common.obj_cfg = - AUDPP_CMD_OBJ0_UPDATE; - stf_config->common.command_type = 0; - MM_ERR("ACDB RX WRITE DATA:\ - AUDPP_CMD_SIDECHAIN_TUNING_FILTER\n"); - result = audpp_dsp_set_stf( - acdb_data.device_info->dev_id,\ - stf_config->active_flag,\ - stf_config, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send \ - STF data to postproc\n"); - } else { - retval = true; - } - } else { - MM_ERR("ACDB DATA WRITE ---\ - STF Rx copy_from_user Fail\n"); - } - } else { - MM_ERR("ACDB DATA WRITE \ - STF kalloc Failed LEN\n"); - } - } - if (stf_config != NULL) - kfree(stf_config); - break; - } - } - return retval; -} -static ssize_t rtc_getsetabid_data_dbg_write(struct file *filp, - const char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - if (rtc_acdb.valid_abid != true) { - MM_INFO("ACDB DATA READ ---INVALID ABID\n"); - rtc_acdb.err = ACDB_RTC_ERR_INVALID_ABID; - } else { - if (rtc_acdb.tx_rx_ctl == ACDB_RTC_RX) { - if (acdb_set_rx_rtc(ubuf, cnt)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - } else { - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - cnt = 0; - } - } else if (rtc_acdb.tx_rx_ctl == ACDB_RTC_TX) { - if (acdb_set_tx_rtc(ubuf, cnt)) { - rtc_acdb.err = ACDB_RTC_SUCCESS; - } else { - rtc_acdb.err = ACDB_RTC_ERR_UNKNOWN_FAILURE; - cnt = 0; - } - } - } - return cnt; -} - - -static const struct file_operations rtc_acdb_data_debug_fops = { - .open = rtc_getsetabid_data_dbg_open, - .write = rtc_getsetabid_data_dbg_write, - .read = rtc_getsetabid_data_dbg_read -}; - -static const struct file_operations rtc_acdb_debug_fops = { - .open = rtc_getsetabid_dbg_open, - .write = rtc_getsetabid_dbg_write, - .read = rtc_getsetabid_dbg_read -}; - -static void rtc_acdb_deinit(void) -{ - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - if (get_set_abid_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_dentry); - } - - if (get_set_abid_data_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_data_dentry); - } - rtc_acdb.abid = 0; - rtc_acdb.acdb_id = 0; - rtc_acdb.cmd_id = 0; - rtc_acdb.err = 1; - rtc_acdb.set_abid = 0; - rtc_acdb.set_iid = 0; - rtc_acdb.tx_rx_ctl = 0; - rtc_acdb.valid_abid = false; - - if (rtc_read->viraddr != NULL || ((void *)rtc_read->phys) != NULL) { - iounmap(rtc_read->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_read->phys); - } - if (rtc_write->viraddr != NULL || ((void *)rtc_write->phys) != NULL) { - iounmap(rtc_write->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_write->phys); - } -} - -static bool rtc_acdb_init(void) -{ - struct rtc_acdb_pmem *rtc_read = &rtc_acdb.rtc_read; - struct rtc_acdb_pmem *rtc_write = &rtc_acdb.rtc_write; - s32 result = 0; - char name[sizeof "get_set_abid"+1]; - char name1[sizeof "get_set_abid_data"+1]; - rtc_acdb.abid = 0; - rtc_acdb.acdb_id = 0; - rtc_acdb.cmd_id = 0; - rtc_acdb.err = 1; - rtc_acdb.set_abid = 0; - rtc_acdb.set_iid = 0; - rtc_acdb.valid_abid = false; - rtc_acdb.tx_rx_ctl = 0; - if (acdb_data.build_id[17] == '1') { - snprintf(name, sizeof name, "get_set_abid"); - get_set_abid_dentry = debugfs_create_file(name, - S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, &rtc_acdb_debug_fops); - if (IS_ERR(get_set_abid_dentry)) { - MM_ERR("SET GET ABID debugfs_create_file failed\n"); - return false; - } - - snprintf(name1, sizeof name1, "get_set_abid_data"); - get_set_abid_data_dentry = debugfs_create_file(name1, - S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, - &rtc_acdb_data_debug_fops); - if (IS_ERR(get_set_abid_data_dentry)) { - MM_ERR("SET GET ABID DATA" - " debugfs_create_file failed\n"); - return false; - } - } - - rtc_read->phys = allocate_contiguous_ebi_nomap(PMEM_RTC_ACDB_QUERY_MEM, - SZ_4K); - - if (!rtc_read->phys) { - MM_ERR("ACDB Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - rtc_read->map_v_rtc = ioremap(rtc_read->phys, - PMEM_RTC_ACDB_QUERY_MEM); - - if (IS_ERR(rtc_read->map_v_rtc)) { - MM_ERR("ACDB Could not map physical address\n"); - result = -ENOMEM; - goto error; - } - rtc_read->viraddr = rtc_read->map_v_rtc; - memset(rtc_read->viraddr, 0, PMEM_RTC_ACDB_QUERY_MEM); - - rtc_write->phys = allocate_contiguous_ebi_nomap(PMEM_RTC_ACDB_QUERY_MEM, - SZ_4K); - - if (!rtc_write->phys) { - MM_ERR("ACDB Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - rtc_write->map_v_rtc = ioremap(rtc_write->phys, - PMEM_RTC_ACDB_QUERY_MEM); - - if (IS_ERR(rtc_write->map_v_rtc)) { - MM_ERR("ACDB Could not map physical address\n"); - result = -ENOMEM; - goto error; - } - rtc_write->viraddr = rtc_write->map_v_rtc; - memset(rtc_write->viraddr, 0, PMEM_RTC_ACDB_QUERY_MEM); - init_waitqueue_head(&rtc_acdb.wait); - return true; -error: - MM_DBG("INIT RTC FAILED REMOVING RTC DEBUG FS\n"); - if (get_set_abid_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_dentry); - } - - if (get_set_abid_data_dentry) { - MM_DBG("GetSet ABID remove debugfs\n"); - debugfs_remove(get_set_abid_data_dentry); - } - if (rtc_read->viraddr != NULL || ((void *)rtc_read->phys) != NULL) { - iounmap(rtc_read->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_read->phys); - } - if (rtc_write->viraddr != NULL || ((void *)rtc_write->phys) != NULL) { - iounmap(rtc_write->map_v_rtc); - free_contiguous_memory_by_paddr(rtc_write->phys); - } - return false; -} -#endif /*CONFIG_DEBUG_FS*/ -static s32 acdb_set_calibration_blk(unsigned long arg) -{ - struct acdb_cmd_device acdb_cmd; - s32 result = 0; - - MM_DBG("acdb_set_calibration_blk\n"); - if (copy_from_user(&acdb_cmd, (struct acdb_cmd_device *)arg, - sizeof(acdb_cmd))) { - MM_ERR("Failed copy command struct from user in" - "acdb_set_calibration_blk\n"); - return -EFAULT; - } - acdb_cmd.phys_buf = (u32 *)acdb_data.paddr; - - MM_DBG("acdb_cmd.phys_buf %x\n", (u32)acdb_cmd.phys_buf); - - result = dalrpc_fcn_8(ACDB_DalACDB_ioctl, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Set RPC failure" - " result = %d\n", result); - return -EINVAL; - } else { - MM_ERR("ACDB=> Device Set RPC success\n"); - if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) - MM_DBG("ACDB_SET_DEVICE Success\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_SET_DEVICE Failure\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_SET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } - return result; -} - -static s32 acdb_get_calibration_blk(unsigned long arg) -{ - s32 result = 0; - struct acdb_cmd_device acdb_cmd; - - MM_DBG("acdb_get_calibration_blk\n"); - - if (copy_from_user(&acdb_cmd, (struct acdb_cmd_device *)arg, - sizeof(acdb_cmd))) { - MM_ERR("Failed copy command struct from user in" - "acdb_get_calibration_blk\n"); - return -EFAULT; - } - acdb_cmd.phys_buf = (u32 *)acdb_data.paddr; - MM_ERR("acdb_cmd.phys_buf %x\n", (u32)acdb_cmd.phys_buf); - - result = dalrpc_fcn_8(ACDB_DalACDB_ioctl, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Get RPC failure" - " result = %d\n", result); - return -EINVAL; - } else { - MM_ERR("ACDB=> Device Get RPC Success\n"); - if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) - MM_DBG("ACDB_GET_DEVICE Success\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_GET_DEVICE Failure\n"); - else if (acdb_data.acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_GET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } - return result; -} - -static int audio_acdb_open(struct inode *inode, struct file *file) -{ - MM_DBG("%s\n", __func__); - return 0; -} -static int audio_acdb_release(struct inode *inode, struct file *file) -{ - MM_DBG("%s\n", __func__); - return 0; -} - -static long audio_acdb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - unsigned long flags = 0; - - MM_DBG("%s\n", __func__); - - switch (cmd) { - case AUDIO_SET_EQ: - MM_DBG("IOCTL SET_EQ_CONFIG\n"); - if (copy_from_user(&acdb_data.eq.num_bands, (void *) arg, - sizeof(acdb_data.eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&acdb_data.dsp_lock, flags); - acdb_data.dec_id = 0; - rc = audpp_dsp_set_eq(acdb_data.dec_id, 1, - &acdb_data.eq, COPP); - if (rc < 0) - MM_ERR("AUDPP returned err =%d\n", rc); - spin_unlock_irqrestore(&acdb_data.dsp_lock, flags); - break; - case AUDIO_SET_ACDB_BLK: - MM_DBG("IOCTL AUDIO_SET_ACDB_BLK\n"); - rc = acdb_set_calibration_blk(arg); - break; - case AUDIO_GET_ACDB_BLK: - MM_DBG("IOiCTL AUDIO_GET_ACDB_BLK\n"); - rc = acdb_get_calibration_blk(arg); - break; - default: - MM_DBG("Unknown IOCTL%d\n", cmd); - rc = -EINVAL; - } - return rc; -} - -static const struct file_operations acdb_fops = { - .owner = THIS_MODULE, - .open = audio_acdb_open, - .release = audio_acdb_release, - .llseek = no_llseek, - .unlocked_ioctl = audio_acdb_ioctl -}; - -struct miscdevice acdb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_acdb", - .fops = &acdb_fops, -}; - -static s32 acdb_get_calibration(void) -{ - struct acdb_cmd_get_device_table acdb_cmd; - s32 result = 0; - u32 iterations = 0; - - MM_DBG("acdb state = %d\n", acdb_data.acdb_state); - - acdb_cmd.command_id = ACDB_GET_DEVICE_TABLE; - acdb_cmd.device_id = acdb_data.device_info->acdb_id; - acdb_cmd.network_id = 0x0108B153; - acdb_cmd.sample_rate_id = acdb_data.device_info->sample_rate; - acdb_cmd.total_bytes = ACDB_BUF_SIZE; - acdb_cmd.phys_buf = (u32 *)acdb_data.phys_addr; - MM_DBG("device_id = %d, sampling_freq = %d\n", - acdb_cmd.device_id, acdb_cmd.sample_rate_id); - - do { - result = dalrpc_fcn_8(ACDB_DalACDB_ioctl, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device table RPC failure" - " result = %d\n", result); - goto error; - } - /*following check is introduced to handle boot up race - condition between AUDCAL SW peers running on apps - and modem (ACDB_RES_BADSTATE indicates modem AUDCAL SW is - not in initialized sate) we need to retry to get ACDB - values*/ - if (acdb_data.acdb_result.result == ACDB_RES_BADSTATE) { - msleep(500); - iterations++; - } else if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) { - MM_DBG("Modem query for acdb values is successful" - " (iterations = %d)\n", iterations); - acdb_data.acdb_state |= CAL_DATA_READY; - return result; - } else { - MM_ERR("ACDB=> modem failed to fill acdb values," - " reuslt = %d, (iterations = %d)\n", - acdb_data.acdb_result.result, - iterations); - goto error; - } - } while (iterations < MAX_RETRY); - MM_ERR("ACDB=> AUDCAL SW on modem is not in intiailized state (%d)\n", - acdb_data.acdb_result.result); -error: - result = -EINVAL; - return result; -} - -s32 acdb_get_calibration_data(struct acdb_get_block *get_block) -{ - s32 result = -EINVAL; - struct acdb_cmd_device acdb_cmd; - struct acdb_result acdb_result; - - MM_DBG("acdb_get_calibration_data\n"); - - acdb_cmd.command_id = ACDB_GET_DEVICE; - acdb_cmd.network_id = 0x0108B153; - acdb_cmd.device_id = get_block->acdb_id; - acdb_cmd.sample_rate_id = get_block->sample_rate_id; - acdb_cmd.interface_id = get_block->interface_id; - acdb_cmd.algorithm_block_id = get_block->algorithm_block_id; - acdb_cmd.total_bytes = get_block->total_bytes; - acdb_cmd.phys_buf = (u32 *)acdb_data.get_blk_paddr; - - result = dalrpc_fcn_8(ACDB_DalACDB_ioctl, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_result, - sizeof(acdb_result)); - - if (result < 0) { - MM_ERR("ACDB=> Device Get RPC failure" - " result = %d\n", result); - goto err_state; - } else { - MM_DBG("ACDB=> Device Get RPC Success\n"); - if (acdb_result.result == ACDB_RES_SUCCESS) { - MM_DBG("ACDB_GET_DEVICE Success\n"); - result = 0; - memcpy(get_block->buf_ptr, acdb_data.get_blk_kvaddr, - get_block->total_bytes); - } else if (acdb_result.result == ACDB_RES_FAILURE) - MM_ERR("ACDB_GET_DEVICE Failure\n"); - else if (acdb_result.result == ACDB_RES_BADPARM) - MM_ERR("ACDB_GET_DEVICE BadParams\n"); - else - MM_ERR("Unknown error\n"); - } -err_state: - return result; -} -EXPORT_SYMBOL(acdb_get_calibration_data); - -static u8 check_device_info_already_present( - struct auddev_evt_audcal_info audcal_info, - struct acdb_cache_node *acdb_cache_free_node) -{ - if ((audcal_info.dev_id == - acdb_cache_free_node->device_info.dev_id) && - (audcal_info.sample_rate == - acdb_cache_free_node->device_info.\ - sample_rate) && - (audcal_info.acdb_id == - acdb_cache_free_node->device_info.acdb_id)) { - MM_DBG("acdb values are already present\n"); - /*if acdb state is not set for CAL_DATA_READY and node status - is filled, acdb state should be updated with CAL_DATA_READY - state*/ - acdb_data.acdb_state |= CAL_DATA_READY; - /*checking for cache node status if it is not filled then the - acdb values are not cleaned from node so update node status - with acdb value filled*/ - if ((acdb_cache_free_node->node_status != ACDB_VALUES_FILLED) && - ((audcal_info.dev_type & RX_DEVICE) == 1)) { - MM_DBG("device was released earlier\n"); - acdb_cache_free_node->node_status = ACDB_VALUES_FILLED; - return 2; /*node is presnet but status as not filled*/ - } - return 1; /*node is present but status as filled*/ - } - MM_DBG("copying device info into node\n"); - /*as device information is not present in cache copy - the current device information into the node*/ - memcpy(&acdb_cache_free_node->device_info, - &audcal_info, sizeof(audcal_info)); - return 0; /*cant find the node*/ -} - -static struct acdb_iir_block *get_audpp_irr_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_IIR_RX) { - if (prs_hdr->iid == IID_AUDIO_IIR_COEFF) - return (struct acdb_iir_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - - -static s32 acdb_fill_audpp_iir(void) -{ - struct acdb_iir_block *acdb_iir; - s32 i = 0; - - acdb_iir = get_audpp_irr_block(); - if (acdb_iir == NULL) { - MM_ERR("unable to find audpp iir block returning\n"); - return -1; - } - memset(acdb_data.pp_iir, 0, sizeof(*acdb_data.pp_iir)); - - acdb_data.pp_iir->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - acdb_data.pp_iir->common.stream = AUDPP_CMD_COPP_STREAM; - acdb_data.pp_iir->common.stream_id = 0; - acdb_data.pp_iir->common.obj_cfg = AUDPP_CMD_OBJ0_UPDATE; - acdb_data.pp_iir->common.command_type = 0; - - acdb_data.pp_iir->active_flag = acdb_iir->enable_flag; - acdb_data.pp_iir->num_bands = acdb_iir->stage_count; - for (; i < acdb_iir->stage_count; i++) { - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b0_filter_lsw = - acdb_iir->stages[i].b0_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b0_filter_msw = - acdb_iir->stages[i].b0_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b1_filter_lsw = - acdb_iir->stages[i].b1_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b1_filter_msw = - acdb_iir->stages[i].b1_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b2_filter_lsw = - acdb_iir->stages[i].b2_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - numerator_filter[i].numerator_b2_filter_msw = - acdb_iir->stages[i].b2_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a0_filter_lsw = - acdb_iir->stages_a[i].a1_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a0_filter_msw = - acdb_iir->stages_a[i].a1_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a1_filter_lsw = - acdb_iir->stages_a[i].a2_lo; - acdb_data.pp_iir->params_filter.filter_4_params. - denominator_filter[i].denominator_a1_filter_msw = - acdb_iir->stages_a[i].a2_hi; - acdb_data.pp_iir->params_filter.filter_4_params. - shift_factor_filter[i].shift_factor_0 = - acdb_iir->shift_factor[i]; - acdb_data.pp_iir->params_filter.filter_4_params.pan_filter[i]. - pan_filter_0 = acdb_iir->pan[i]; - } - return 0; -} - -static void extract_mbadrc(u32 *phy_addr, struct header *prs_hdr, u32 *index) -{ - if (prs_hdr->iid == IID_MBADRC_EXT_BUFF) { - MM_DBG("Got IID = IID_MBADRC_EXT_BUFF\n"); - *phy_addr = acdb_data.phys_addr + *index + - sizeof(struct header); - memcpy(acdb_data.mbadrc_block.ext_buf, - (acdb_data.virt_addr + *index + - sizeof(struct header)), 196*2); - MM_DBG("phy_addr = %x\n", *phy_addr); - *index += prs_hdr->data_len + sizeof(struct header); - } else if (prs_hdr->iid == IID_MBADRC_BAND_CONFIG) { - MM_DBG("Got IID == IID_MBADRC_BAND_CONFIG\n"); - memcpy(acdb_data.mbadrc_block.band_config, (acdb_data.virt_addr - + *index + sizeof(struct header)), - sizeof(struct mbadrc_band_config_type) * - acdb_data.mbadrc_block.parameters.\ - mbadrc_num_bands); - *index += prs_hdr->data_len + sizeof(struct header); - } else if (prs_hdr->iid == IID_MBADRC_PARAMETERS) { - struct mbadrc_parameter *tmp; - tmp = (struct mbadrc_parameter *)(acdb_data.virt_addr + *index - + sizeof(struct header)); - MM_DBG("Got IID == IID_MBADRC_PARAMETERS\n"); - acdb_data.mbadrc_block.parameters.mbadrc_enable = - tmp->mbadrc_enable; - acdb_data.mbadrc_block.parameters.mbadrc_num_bands = - tmp->mbadrc_num_bands; - acdb_data.mbadrc_block.parameters.mbadrc_down_sample_level = - tmp->mbadrc_down_sample_level; - acdb_data.mbadrc_block.parameters.mbadrc_delay = - tmp->mbadrc_delay; - *index += prs_hdr->data_len + sizeof(struct header); - } -} - -static void get_audpp_mbadrc_block(u32 *phy_addr) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_MBADRC_RX) { - if ((prs_hdr->iid == IID_MBADRC_EXT_BUFF) - || (prs_hdr->iid == - IID_MBADRC_BAND_CONFIG) - || (prs_hdr->iid == - IID_MBADRC_PARAMETERS)) { - extract_mbadrc(phy_addr, prs_hdr, - &index); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } -} - -static s32 acdb_fill_audpp_mbadrc(void) -{ - u32 mbadrc_phys_addr = -1; - get_audpp_mbadrc_block(&mbadrc_phys_addr); - if (IS_ERR_VALUE(mbadrc_phys_addr)) { - MM_ERR("failed to get mbadrc block\n"); - return -1; - } - - memset(acdb_data.pp_mbadrc, 0, sizeof(*acdb_data.pp_mbadrc)); - - acdb_data.pp_mbadrc->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - acdb_data.pp_mbadrc->common.stream = AUDPP_CMD_COPP_STREAM; - acdb_data.pp_mbadrc->common.stream_id = 0; - acdb_data.pp_mbadrc->common.obj_cfg = AUDPP_CMD_OBJ0_UPDATE; - acdb_data.pp_mbadrc->common.command_type = 0; - - acdb_data.pp_mbadrc->enable = acdb_data.mbadrc_block.\ - parameters.mbadrc_enable; - acdb_data.pp_mbadrc->num_bands = - acdb_data.mbadrc_block.\ - parameters.mbadrc_num_bands; - acdb_data.pp_mbadrc->down_samp_level = - acdb_data.mbadrc_block.parameters.\ - mbadrc_down_sample_level; - acdb_data.pp_mbadrc->adrc_delay = - acdb_data.mbadrc_block.parameters.\ - mbadrc_delay; - - if (acdb_data.mbadrc_block.parameters.mbadrc_num_bands > 1) - acdb_data.pp_mbadrc->ext_buf_size = (97 * 2) + - (33 * 2 * (acdb_data.mbadrc_block.parameters.\ - mbadrc_num_bands - 2)); - - acdb_data.pp_mbadrc->ext_partition = 0; - acdb_data.pp_mbadrc->ext_buf_lsw = (u16)(mbadrc_phys_addr\ - & 0xFFFF); - acdb_data.pp_mbadrc->ext_buf_msw = (u16)((mbadrc_phys_addr\ - & 0xFFFF0000) >> 16); - memcpy(acdb_data.pp_mbadrc->adrc_band, acdb_data.mbadrc_block.\ - band_config, - sizeof(struct mbadrc_band_config_type) * - acdb_data.mbadrc_block.parameters.mbadrc_num_bands); - return 0; -} - -static struct acdb_calib_gain_rx *get_audpp_cal_gain(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_CALIBRATION_GAIN_RX) { - if (prs_hdr->iid == - IID_AUDIO_CALIBRATION_GAIN_RX) { - MM_DBG("Got audpp_calib_gain_rx" - " block\n"); - return (struct acdb_calib_gain_rx *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpp_cal_gain(void) -{ - struct acdb_calib_gain_rx *acdb_calib_gain_rx = NULL; - - acdb_calib_gain_rx = get_audpp_cal_gain(); - if (acdb_calib_gain_rx == NULL) { - MM_ERR("unable to find audpp" - " calibration gain block returning\n"); - return -1; - } - MM_DBG("Calibration value" - " for calib_gain_rx %d\n", acdb_calib_gain_rx->audppcalgain); - memset(acdb_data.calib_gain_rx, 0, sizeof(*acdb_data.calib_gain_rx)); - - acdb_data.calib_gain_rx->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - acdb_data.calib_gain_rx->common.stream = AUDPP_CMD_COPP_STREAM; - acdb_data.calib_gain_rx->common.stream_id = 0; - acdb_data.calib_gain_rx->common.obj_cfg = AUDPP_CMD_OBJ0_UPDATE; - acdb_data.calib_gain_rx->common.command_type = 0; - - acdb_data.calib_gain_rx->audppcalgain = - acdb_calib_gain_rx->audppcalgain; - return 0; -} - -static void extract_pbe_block(struct header *prs_hdr, u32 *index) -{ - if (prs_hdr->iid == IID_AUDIO_PBE_RX_ENABLE_FLAG) { - MM_DBG("Got IID = IID_AUDIO_PBE_RX_ENABLE\n"); - acdb_data.pbe_enable_flag = (u16 *)(acdb_data.virt_addr + - *index + - sizeof(struct header)); - *index += prs_hdr->data_len + sizeof(struct header); - } else if (prs_hdr->iid == IID_PBE_CONFIG_PARAMETERS) { - MM_DBG("Got IID == IID_PBE_CONFIG_PARAMETERS\n"); - acdb_data.pbe_blk = (struct acdb_pbe_block *) - (acdb_data.virt_addr + *index - + sizeof(struct header)); - *index += prs_hdr->data_len + sizeof(struct header); - } -} - -static s32 get_audpp_pbe_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - s32 result = -1; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_PBE_RX) { - if ((prs_hdr->iid == IID_PBE_CONFIG_PARAMETERS) - || (prs_hdr->iid == - IID_AUDIO_PBE_RX_ENABLE_FLAG)) { - extract_pbe_block(prs_hdr, &index); - result = 0; - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return result; -} - -static s32 acdb_fill_audpp_pbe(void) -{ - s32 result = -1; - - result = get_audpp_pbe_block(); - if (IS_ERR_VALUE(result)) - return result; - memset(acdb_data.pbe_block, 0, sizeof(*acdb_data.pbe_block)); - - acdb_data.pbe_block->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - acdb_data.pbe_block->common.stream = AUDPP_CMD_COPP_STREAM; - acdb_data.pbe_block->common.stream_id = 0; - acdb_data.pbe_block->common.obj_cfg = AUDPP_CMD_OBJ0_UPDATE; - acdb_data.pbe_block->common.command_type = 0; - acdb_data.pbe_block->pbe_enable = *acdb_data.pbe_enable_flag; - - acdb_data.pbe_block->realbassmix = acdb_data.pbe_blk->realbassmix; - acdb_data.pbe_block->basscolorcontrol = - acdb_data.pbe_blk->basscolorcontrol; - acdb_data.pbe_block->mainchaindelay = acdb_data.pbe_blk->mainchaindelay; - acdb_data.pbe_block->xoverfltorder = acdb_data.pbe_blk->xoverfltorder; - acdb_data.pbe_block->bandpassfltorder = - acdb_data.pbe_blk->bandpassfltorder; - acdb_data.pbe_block->adrcdelay = acdb_data.pbe_blk->adrcdelay; - acdb_data.pbe_block->downsamplelevel = - acdb_data.pbe_blk->downsamplelevel; - acdb_data.pbe_block->comprmstav = acdb_data.pbe_blk->comprmstav; - acdb_data.pbe_block->expthreshold = acdb_data.pbe_blk->expthreshold; - acdb_data.pbe_block->expslope = acdb_data.pbe_blk->expslope; - acdb_data.pbe_block->compthreshold = acdb_data.pbe_blk->compthreshold; - acdb_data.pbe_block->compslope = acdb_data.pbe_blk->compslope; - acdb_data.pbe_block->cpmpattack_lsw = acdb_data.pbe_blk->cpmpattack_lsw; - acdb_data.pbe_block->compattack_msw = acdb_data.pbe_blk->compattack_msw; - acdb_data.pbe_block->comprelease_lsw = - acdb_data.pbe_blk->comprelease_lsw; - acdb_data.pbe_block->comprelease_msw = - acdb_data.pbe_blk->comprelease_msw; - acdb_data.pbe_block->compmakeupgain = acdb_data.pbe_blk->compmakeupgain; - acdb_data.pbe_block->baselimthreshold = - acdb_data.pbe_blk->baselimthreshold; - acdb_data.pbe_block->highlimthreshold = - acdb_data.pbe_blk->highlimthreshold; - acdb_data.pbe_block->basslimmakeupgain = - acdb_data.pbe_blk->basslimmakeupgain; - acdb_data.pbe_block->highlimmakeupgain = - acdb_data.pbe_blk->highlimmakeupgain; - acdb_data.pbe_block->limbassgrc = acdb_data.pbe_blk->limbassgrc; - acdb_data.pbe_block->limhighgrc = acdb_data.pbe_blk->limhighgrc; - acdb_data.pbe_block->limdelay = acdb_data.pbe_blk->limdelay; - memcpy(acdb_data.pbe_block->filter_coeffs, - acdb_data.pbe_blk->filter_coeffs, sizeof(u16)*90); - acdb_data.pbe_block->extpartition = 0; - acdb_data.pbe_block->extbuffsize_lsw = PBE_BUF_SIZE; - acdb_data.pbe_block->extbuffsize_msw = 0; - acdb_data.pbe_block->extbuffstart_lsw = ((u32)acdb_data.pbe_extbuff - & 0xFFFF); - acdb_data.pbe_block->extbuffstart_msw = (((u32)acdb_data.pbe_extbuff - & 0xFFFF0000) >> 16); - return 0; -} - - -static s32 acdb_calibrate_audpp(void) -{ - s32 result = 0; - - result = acdb_fill_audpp_iir(); - if (!IS_ERR_VALUE(result)) { - result = audpp_dsp_set_rx_iir(acdb_data.device_info->dev_id, - acdb_data.pp_iir->active_flag, - acdb_data.pp_iir, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send IIR data to postproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPP is calibrated with IIR parameters" - " for COPP ID %d\n", - acdb_data.device_info->dev_id); - } - result = acdb_fill_audpp_mbadrc(); - if (!IS_ERR_VALUE(result)) { - result = audpp_dsp_set_mbadrc(acdb_data.device_info->dev_id, - acdb_data.pp_mbadrc->enable, - acdb_data.pp_mbadrc, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send MBADRC data to" - " postproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPP is calibrated with MBADRC parameters" - " for COPP ID %d\n", - acdb_data.device_info->dev_id); - } - result = acdb_fill_audpp_cal_gain(); - if (!(IS_ERR_VALUE(result))) { - result = audpp_dsp_set_gain_rx(acdb_data.device_info->dev_id, - acdb_data.calib_gain_rx, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send gain_rx" - " data to postproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPP is calibrated with calib_gain_rx\n"); - } - result = acdb_fill_audpp_pbe(); - if (!(IS_ERR_VALUE(result))) { - result = audpp_dsp_set_pbe(acdb_data.device_info->dev_id, - acdb_data.pbe_block->pbe_enable, - acdb_data.pbe_block, COPP); - if (result) { - MM_ERR("ACDB=> Failed to send pbe block" - "data to postproc\n"); - result = -EINVAL; - goto done; - } - MM_DBG("AUDPP is calibarted with PBE\n"); - } -done: - return result; -} - -static struct acdb_agc_block *get_audpreproc_agc_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_AGC_TX) { - if (prs_hdr->iid == IID_AUDIO_AGC_PARAMETERS) { - MM_DBG("GOT ABID_AUDIO_AGC_TX\n"); - return (struct acdb_agc_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpreproc_agc(void) -{ - struct acdb_agc_block *acdb_agc; - - acdb_agc = get_audpreproc_agc_block(); - if (!acdb_agc) { - MM_DBG("unable to find preproc agc parameters winding up\n"); - return -1; - } - memset(acdb_data.preproc_agc, 0, sizeof(*acdb_data.preproc_agc)); - acdb_data.preproc_agc->cmd_id = AUDPREPROC_CMD_CFG_AGC_PARAMS; - acdb_data.preproc_agc->stream_id = acdb_data.preproc_stream_id; - /* 0xFE00 to configure all parameters */ - acdb_data.preproc_agc->tx_agc_param_mask = 0xFFFF; - - if (acdb_agc->enable_status) - acdb_data.preproc_agc->tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_ENA; - else - acdb_data.preproc_agc->tx_agc_enable_flag = - AUDPREPROC_CMD_TX_AGC_ENA_FLAG_DIS; - - acdb_data.preproc_agc->comp_rlink_static_gain = - acdb_agc->comp_rlink_static_gain; - acdb_data.preproc_agc->comp_rlink_aig_flag = - acdb_agc->comp_rlink_aig_flag; - acdb_data.preproc_agc->expander_rlink_th = - acdb_agc->exp_rlink_threshold; - acdb_data.preproc_agc->expander_rlink_slope = - acdb_agc->exp_rlink_slope; - acdb_data.preproc_agc->compressor_rlink_th = - acdb_agc->comp_rlink_threshold; - acdb_data.preproc_agc->compressor_rlink_slope = - acdb_agc->comp_rlink_slope; - - /* 0xFFF0 to configure all parameters */ - acdb_data.preproc_agc->tx_adc_agc_param_mask = 0xFFFF; - - acdb_data.preproc_agc->comp_rlink_aig_attackk = - acdb_agc->comp_rlink_aig_attack_k; - acdb_data.preproc_agc->comp_rlink_aig_leak_down = - acdb_agc->comp_rlink_aig_leak_down; - acdb_data.preproc_agc->comp_rlink_aig_leak_up = - acdb_agc->comp_rlink_aig_leak_up; - acdb_data.preproc_agc->comp_rlink_aig_max = - acdb_agc->comp_rlink_aig_max; - acdb_data.preproc_agc->comp_rlink_aig_min = - acdb_agc->comp_rlink_aig_min; - acdb_data.preproc_agc->comp_rlink_aig_releasek = - acdb_agc->comp_rlink_aig_release_k; - acdb_data.preproc_agc->comp_rlink_aig_leakrate_fast = - acdb_agc->comp_rlink_aig_sm_leak_rate_fast; - acdb_data.preproc_agc->comp_rlink_aig_leakrate_slow = - acdb_agc->comp_rlink_aig_sm_leak_rate_slow; - acdb_data.preproc_agc->comp_rlink_attackk_msw = - acdb_agc->comp_rlink_attack_k_msw; - acdb_data.preproc_agc->comp_rlink_attackk_lsw = - acdb_agc->comp_rlink_attack_k_lsw; - acdb_data.preproc_agc->comp_rlink_delay = - acdb_agc->comp_rlink_delay; - acdb_data.preproc_agc->comp_rlink_releasek_msw = - acdb_agc->comp_rlink_release_k_msw; - acdb_data.preproc_agc->comp_rlink_releasek_lsw = - acdb_agc->comp_rlink_release_k_lsw; - acdb_data.preproc_agc->comp_rlink_rms_tav = - acdb_agc->comp_rlink_rms_trav; - return 0; -} - -static struct acdb_iir_block *get_audpreproc_irr_block(void) -{ - - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_IIR_TX) { - if (prs_hdr->iid == IID_AUDIO_IIR_COEFF) - return (struct acdb_iir_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - - -static s32 acdb_fill_audpreproc_iir(void) -{ - struct acdb_iir_block *acdb_iir; - - - acdb_iir = get_audpreproc_irr_block(); - if (!acdb_iir) { - MM_DBG("unable to find preproc iir parameters winding up\n"); - return -1; - } - memset(acdb_data.preproc_iir, 0, sizeof(*acdb_data.preproc_iir)); - - acdb_data.preproc_iir->cmd_id = - AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; - acdb_data.preproc_iir->stream_id = acdb_data.preproc_stream_id; - acdb_data.preproc_iir->active_flag = acdb_iir->enable_flag; - acdb_data.preproc_iir->num_bands = acdb_iir->stage_count; - - acdb_data.preproc_iir->numerator_coeff_b0_filter0_lsw = - acdb_iir->stages[0].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter0_msw = - acdb_iir->stages[0].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter0_lsw = - acdb_iir->stages[0].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter0_msw = - acdb_iir->stages[0].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter0_lsw = - acdb_iir->stages[0].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter0_msw = - acdb_iir->stages[0].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter1_lsw = - acdb_iir->stages[1].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter1_msw = - acdb_iir->stages[1].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter1_lsw = - acdb_iir->stages[1].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter1_msw = - acdb_iir->stages[1].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter1_lsw = - acdb_iir->stages[1].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter1_msw = - acdb_iir->stages[1].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter2_lsw = - acdb_iir->stages[2].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter2_msw = - acdb_iir->stages[2].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter2_lsw = - acdb_iir->stages[2].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter2_msw = - acdb_iir->stages[2].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter2_lsw = - acdb_iir->stages[2].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter2_msw = - acdb_iir->stages[2].b2_hi; - - acdb_data.preproc_iir->numerator_coeff_b0_filter3_lsw = - acdb_iir->stages[3].b0_lo; - acdb_data.preproc_iir->numerator_coeff_b0_filter3_msw = - acdb_iir->stages[3].b0_hi; - acdb_data.preproc_iir->numerator_coeff_b1_filter3_lsw = - acdb_iir->stages[3].b1_lo; - acdb_data.preproc_iir->numerator_coeff_b1_filter3_msw = - acdb_iir->stages[3].b1_hi; - acdb_data.preproc_iir->numerator_coeff_b2_filter3_lsw = - acdb_iir->stages[3].b2_lo; - acdb_data.preproc_iir->numerator_coeff_b2_filter3_msw = - acdb_iir->stages[3].b2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter0_lsw = - acdb_iir->stages_a[0].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter0_msw = - acdb_iir->stages_a[0].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter0_lsw = - acdb_iir->stages_a[0].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter0_msw = - acdb_iir->stages_a[0].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter1_lsw = - acdb_iir->stages_a[1].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter1_msw = - acdb_iir->stages_a[1].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter1_lsw = - acdb_iir->stages_a[1].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter1_msw = - acdb_iir->stages_a[1].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter2_lsw = - acdb_iir->stages_a[2].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter2_msw = - acdb_iir->stages_a[2].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter2_lsw = - acdb_iir->stages_a[2].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter2_msw = - acdb_iir->stages_a[2].a2_hi; - - acdb_data.preproc_iir->denominator_coeff_a0_filter3_lsw = - acdb_iir->stages_a[3].a1_lo; - acdb_data.preproc_iir->denominator_coeff_a0_filter3_msw = - acdb_iir->stages_a[3].a1_hi; - acdb_data.preproc_iir->denominator_coeff_a1_filter3_lsw = - acdb_iir->stages_a[3].a2_lo; - acdb_data.preproc_iir->denominator_coeff_a1_filter3_msw = - acdb_iir->stages_a[3].a2_hi; - - acdb_data.preproc_iir->shift_factor_filter0 = - acdb_iir->shift_factor[0]; - acdb_data.preproc_iir->shift_factor_filter1 = - acdb_iir->shift_factor[1]; - acdb_data.preproc_iir->shift_factor_filter2 = - acdb_iir->shift_factor[2]; - acdb_data.preproc_iir->shift_factor_filter3 = - acdb_iir->shift_factor[3]; - - acdb_data.preproc_iir->pan_of_filter0 = - acdb_iir->pan[0]; - acdb_data.preproc_iir->pan_of_filter1 = - acdb_iir->pan[1]; - acdb_data.preproc_iir->pan_of_filter2 = - acdb_iir->pan[2]; - acdb_data.preproc_iir->pan_of_filter3 = - acdb_iir->pan[3]; - return 0; -} - -static struct acdb_calib_gain_tx *get_audpreproc_cal_gain(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_CALIBRATION_GAIN_TX) { - if (prs_hdr->iid == - IID_AUDIO_CALIBRATION_GAIN_TX) { - MM_DBG("Got audpreproc_calib_gain_tx" - " block\n"); - return (struct acdb_calib_gain_tx *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpreproc_cal_gain(void) -{ - struct acdb_calib_gain_tx *acdb_calib_gain_tx = NULL; - - acdb_calib_gain_tx = get_audpreproc_cal_gain(); - if (acdb_calib_gain_tx == NULL) { - MM_ERR("unable to find audpreproc" - " calibration block returning\n"); - return -1; - } - MM_DBG("Calibration value" - " for calib_gain_tx %d\n", acdb_calib_gain_tx->audprecalgain); - memset(acdb_data.calib_gain_tx, 0, sizeof(*acdb_data.calib_gain_tx)); - - acdb_data.calib_gain_tx->cmd_id = - AUDPREPROC_CMD_CFG_CAL_GAIN_PARAMS; - acdb_data.calib_gain_tx->stream_id = acdb_data.preproc_stream_id; - acdb_data.calib_gain_tx->audprecalgain = - acdb_calib_gain_tx->audprecalgain; - return 0; -} - -static struct acdb_rmc_block *get_rmc_blk(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_RMC_TX) { - if (prs_hdr->iid == - IID_AUDIO_RMC_PARAM) { - MM_DBG("Got afe_rmc block\n"); - return (struct acdb_rmc_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -struct acdb_fluence_block *get_audpp_fluence_block(void) -{ - struct header *prs_hdr; - u32 index = 0; - - while (index < acdb_data.acdb_result.used_bytes) { - prs_hdr = (struct header *)(acdb_data.virt_addr + index); - - if (prs_hdr->dbor_signature == DBOR_SIGNATURE) { - if (prs_hdr->abid == ABID_AUDIO_FLUENCE_TX) { - if (prs_hdr->iid == IID_AUDIO_FLUENCE_TX) { - MM_DBG("got fluence block\n"); - return (struct acdb_fluence_block *) - (acdb_data.virt_addr + index - + sizeof(struct header)); - } - } else { - index += prs_hdr->data_len + - sizeof(struct header); - } - } else { - break; - } - } - return NULL; -} - -static s32 acdb_fill_audpreproc_fluence(void) -{ - struct acdb_fluence_block *fluence_block = NULL; - fluence_block = get_audpp_fluence_block(); - if (!fluence_block) { - MM_ERR("error in finding fluence block\n"); - return -EPERM; - } - memset(&acdb_data.preproc_lvnv, 0, sizeof( - struct audpreproc_cmd_cfg_lvnv_param)); - memcpy(acdb_data.fluence_extbuff_virt, - &fluence_block->cs_tuningMode, - (sizeof(struct acdb_fluence_block) - - sizeof(fluence_block->csmode))); - acdb_data.preproc_lvnv.cmd_id = AUDPREPROC_CMD_CFG_LVNV_PARMS; - acdb_data.preproc_lvnv.stream_id = acdb_data.preproc_stream_id; - acdb_data.preproc_lvnv.cs_mode = fluence_block->csmode; - acdb_data.preproc_lvnv.lvnv_ext_buf_size = FLUENCE_BUF_SIZE; - acdb_data.preproc_lvnv.lvnv_ext_buf_start_lsw =\ - ((u32)(acdb_data.fluence_extbuff)\ - & 0x0000FFFF); - acdb_data.preproc_lvnv.lvnv_ext_buf_start_msw =\ - (((u32)acdb_data.fluence_extbuff\ - & 0xFFFF0000) >> 16); - return 0; -} - -s32 acdb_calibrate_audpreproc(void) -{ - s32 result = 0; - struct acdb_rmc_block *acdb_rmc = NULL; - - result = acdb_fill_audpreproc_agc(); - if (!IS_ERR_VALUE(result)) { - result = audpreproc_dsp_set_agc(acdb_data.preproc_agc, sizeof( - struct audpreproc_cmd_cfg_agc_params)); - if (result) { - MM_ERR("ACDB=> Failed to send AGC data to preproc)\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPREC is calibrated with AGC parameters" - " for COPP ID %d and AUDREC session %d\n", - acdb_data.device_info->dev_id, - acdb_data.preproc_stream_id); - } - result = acdb_fill_audpreproc_iir(); - if (!IS_ERR_VALUE(result)) { - result = audpreproc_dsp_set_iir(acdb_data.preproc_iir, - sizeof(struct\ - audpreproc_cmd_cfg_iir_tuning_filter_params)); - if (result) { - MM_ERR("ACDB=> Failed to send IIR data to preproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("audpreproc is calibrated with iir parameters" - " for COPP ID %d and AUREC session %d\n", - acdb_data.device_info->dev_id, - acdb_data.preproc_stream_id); - } - result = acdb_fill_audpreproc_cal_gain(); - if (!(IS_ERR_VALUE(result))) { - result = audpreproc_dsp_set_gain_tx(acdb_data.calib_gain_tx, - sizeof(struct audpreproc_cmd_cfg_cal_gain)); - if (result) { - MM_ERR("ACDB=> Failed to send calib_gain_tx" - " data to preproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPREPROC is calibrated" - " with calib_gain_tx\n"); - } - if (acdb_data.build_id[17] != '0') { - acdb_rmc = get_rmc_blk(); - if (acdb_rmc != NULL) { - result = afe_config_rmc_block(acdb_rmc); - if (result) { - MM_ERR("ACDB=> Failed to send rmc" - " data to afe\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AFE is calibrated with rmc params\n"); - } else - MM_DBG("RMC block was not found\n"); - } - if (!acdb_data.fleuce_feature_status[acdb_data.preproc_stream_id]) { - result = acdb_fill_audpreproc_fluence(); - if (!(IS_ERR_VALUE(result))) { - result = audpreproc_dsp_set_lvnv( - &acdb_data.preproc_lvnv, - sizeof(struct\ - audpreproc_cmd_cfg_lvnv_param)); - if (result) { - MM_ERR("ACDB=> Failed to send lvnv " - "data to preproc\n"); - result = -EINVAL; - goto done; - } else - MM_DBG("AUDPREPROC is calibrated" - " with lvnv parameters\n"); - } else - MM_ERR("fluence block is not found\n"); - } else - MM_DBG("fluence block override\n"); -done: - return result; -} - -static s32 acdb_send_calibration(void) -{ - s32 result = 0; - - if ((acdb_data.device_info->dev_type & RX_DEVICE) == 1) { - result = acdb_calibrate_audpp(); - if (result) - goto done; - } else if ((acdb_data.device_info->dev_type & TX_DEVICE) == 2) { - result = acdb_calibrate_audpreproc(); - if (result) - goto done; - if (acdb_data.preproc_stream_id == 0) - acdb_data.audrec_applied |= AUDREC0_READY; - else if (acdb_data.preproc_stream_id == 1) - acdb_data.audrec_applied |= AUDREC1_READY; - else if (acdb_data.preproc_stream_id == 2) - acdb_data.audrec_applied |= AUDREC2_READY; - MM_DBG("acdb_data.audrec_applied = %x\n", - acdb_data.audrec_applied); - } -done: - return result; -} - -static u8 check_tx_acdb_values_cached(void) -{ - u8 stream_id = acdb_data.preproc_stream_id; - - if ((acdb_data.device_info->dev_id == - acdb_cache_tx[stream_id].device_info.dev_id) && - (acdb_data.device_info->sample_rate == - acdb_cache_tx[stream_id].device_info.sample_rate) && - (acdb_data.device_info->acdb_id == - acdb_cache_tx[stream_id].device_info.acdb_id) && - (acdb_cache_tx[stream_id].node_status == - ACDB_VALUES_FILLED)) - return 0; - else - return 1; -} - -static void handle_tx_device_ready_callback(void) -{ - u8 i = 0; - u8 ret = 0; - u8 acdb_value_apply = 0; - u8 result = 0; - u8 stream_id = acdb_data.preproc_stream_id; - - if (acdb_data.multiple_sessions) { - for (i = 0; i < MAX_AUDREC_SESSIONS; i++) { - /*check is to exclude copying acdb values in the - current node pointed by acdb_data structure*/ - if (acdb_cache_tx[i].phys_addr_acdb_values != - acdb_data.phys_addr) { - ret = check_device_info_already_present(\ - *acdb_data.device_info, - &acdb_cache_tx[i]); - if (ret) { - memcpy((char *)acdb_cache_tx[i].\ - virt_addr_acdb_values, - (char *)acdb_data.virt_addr, - ACDB_BUF_SIZE); - acdb_cache_tx[i].node_status = - ACDB_VALUES_FILLED; - } - } - } - acdb_data.multiple_sessions = 0; - } - /*check wheather AUDREC enabled before device call backs*/ - if ((acdb_data.acdb_state & AUDREC0_READY) && - !(acdb_data.audrec_applied & AUDREC0_READY)) { - MM_DBG("AUDREC0 already enabled apply acdb values\n"); - acdb_value_apply |= AUDREC0_READY; - } else if ((acdb_data.acdb_state & AUDREC1_READY) && - !(acdb_data.audrec_applied & AUDREC1_READY)) { - MM_DBG("AUDREC1 already enabled apply acdb values\n"); - acdb_value_apply |= AUDREC1_READY; - } else if ((acdb_data.acdb_state & AUDREC2_READY) && - !(acdb_data.audrec_applied & AUDREC2_READY)) { - MM_DBG("AUDREC2 already enabled apply acdb values\n"); - acdb_value_apply |= AUDREC2_READY; - } - if (acdb_value_apply) { - if (session_info[stream_id].sampling_freq) - acdb_data.device_info->sample_rate = - session_info[stream_id].sampling_freq; - result = check_tx_acdb_values_cached(); - if (result) { - result = acdb_get_calibration(); - if (result < 0) { - MM_ERR("Not able to get calibration" - " data continue\n"); - return; - } - } - acdb_cache_tx[stream_id].node_status = ACDB_VALUES_FILLED; - acdb_send_calibration(); - } -} - -static struct acdb_cache_node *get_acdb_values_from_cache_tx(u32 stream_id) -{ - MM_DBG("searching node with stream_id %d\n", stream_id); - if ((acdb_cache_tx[stream_id].stream_id == stream_id) && - (acdb_cache_tx[stream_id].node_status == - ACDB_VALUES_NOT_FILLED)) { - return &acdb_cache_tx[stream_id]; - } - MM_DBG("Error! in finding node\n"); - return NULL; -} - -static void update_acdb_data_struct(struct acdb_cache_node *cur_node) -{ - if (cur_node) { - acdb_data.device_info = &cur_node->device_info; - acdb_data.virt_addr = cur_node->virt_addr_acdb_values; - acdb_data.phys_addr = cur_node->phys_addr_acdb_values; - } else - MM_ERR("error in curent node\n"); -} - -static void send_acdb_values_for_active_devices(void) -{ - u32 i = 0; - for (i = 0; i < MAX_COPP_NODE_SUPPORTED; i++) { - if (acdb_cache_rx[i].node_status == - ACDB_VALUES_FILLED) { - update_acdb_data_struct(&acdb_cache_rx[i]); - if (acdb_data.acdb_state & CAL_DATA_READY) - acdb_send_calibration(); - } - } -} - -static s32 initialize_rpc(void) -{ - s32 result = 0; - - result = daldevice_attach(DALDEVICEID_ACDB, ACDB_PORT_NAME, - ACDB_CPU, &acdb_data.handle); - - if (result) { - MM_ERR("ACDB=> Device Attach failed\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static u32 allocate_memory_acdb_cache_tx(void) -{ - u32 result = 0; - u32 i = 0; - u32 err = 0; - /*initialize local cache */ - for (i = 0; i < MAX_AUDREC_SESSIONS; i++) { - acdb_cache_tx[i].phys_addr_acdb_values = - allocate_contiguous_ebi_nomap(ACDB_BUF_SIZE, - SZ_4K); - - if (!acdb_cache_tx[i].phys_addr_acdb_values) { - MM_ERR("ACDB=> Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_cache_tx[i].map_v_addr = ioremap( - acdb_cache_tx[i].phys_addr_acdb_values, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_cache_tx[i].map_v_addr)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_cache_tx[i].phys_addr_acdb_values); - goto error; - } - acdb_cache_tx[i].virt_addr_acdb_values = - acdb_cache_tx[i].map_v_addr; - memset(acdb_cache_tx[i].virt_addr_acdb_values, 0, - ACDB_BUF_SIZE); - } - return result; -error: - for (err = 0; err < i; err++) { - iounmap(acdb_cache_tx[err].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx[err].phys_addr_acdb_values); - } - return result; -} - -static u32 allocate_memory_acdb_cache_rx(void) -{ - u32 result = 0; - u32 i = 0; - u32 err = 0; - - /*initialize local cache */ - for (i = 0; i < MAX_COPP_NODE_SUPPORTED; i++) { - acdb_cache_rx[i].phys_addr_acdb_values = - allocate_contiguous_ebi_nomap( - ACDB_BUF_SIZE, SZ_4K); - - if (!acdb_cache_rx[i].phys_addr_acdb_values) { - MM_ERR("ACDB=> Can not allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_cache_rx[i].map_v_addr = - ioremap(acdb_cache_rx[i].phys_addr_acdb_values, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_cache_rx[i].map_v_addr)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_cache_rx[i].phys_addr_acdb_values); - goto error; - } - acdb_cache_rx[i].virt_addr_acdb_values = - acdb_cache_rx[i].map_v_addr; - memset(acdb_cache_rx[i].virt_addr_acdb_values, 0, - ACDB_BUF_SIZE); - } - return result; -error: - for (err = 0; err < i; err++) { - iounmap(acdb_cache_rx[err].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx[err].phys_addr_acdb_values); - } - return result; -} - -static u32 allocate_memory_acdb_get_blk(void) -{ - u32 result = 0; - acdb_data.get_blk_paddr = allocate_contiguous_ebi_nomap( - ACDB_BUF_SIZE, SZ_4K); - if (!acdb_data.get_blk_paddr) { - MM_ERR("ACDB=> Cannot allocate physical memory\n"); - result = -ENOMEM; - goto error; - } - acdb_data.map_v_get_blk = ioremap(acdb_data.get_blk_paddr, - ACDB_BUF_SIZE); - if (IS_ERR(acdb_data.map_v_get_blk)) { - MM_ERR("ACDB=> Could not map physical address\n"); - result = -ENOMEM; - free_contiguous_memory_by_paddr( - acdb_data.get_blk_paddr); - goto error; - } - acdb_data.get_blk_kvaddr = acdb_data.map_v_get_blk; - memset(acdb_data.get_blk_kvaddr, 0, ACDB_BUF_SIZE); -error: - return result; -} - -static void free_memory_acdb_cache_rx(void) -{ - u32 i = 0; - - for (i = 0; i < MAX_COPP_NODE_SUPPORTED; i++) { - iounmap(acdb_cache_rx[i].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx[i].phys_addr_acdb_values); - } -} - -static void free_memory_acdb_cache_tx(void) -{ - u32 i = 0; - - for (i = 0; i < MAX_AUDREC_SESSIONS; i++) { - iounmap(acdb_cache_tx[i].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx[i].phys_addr_acdb_values); - } -} - -static void free_memory_acdb_get_blk(void) -{ - iounmap(acdb_data.map_v_get_blk); - free_contiguous_memory_by_paddr(acdb_data.get_blk_paddr); -} - -static s32 initialize_memory(void) -{ - s32 result = 0; - - result = allocate_memory_acdb_get_blk(); - if (result < 0) { - MM_ERR("memory allocation for get blk failed\n"); - goto done; - } - - result = allocate_memory_acdb_cache_rx(); - if (result < 0) { - MM_ERR("memory allocation for rx cache is failed\n"); - free_memory_acdb_get_blk(); - goto done; - } - result = allocate_memory_acdb_cache_tx(); - if (result < 0) { - MM_ERR("memory allocation for tx cache is failed\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - goto done; - } - acdb_data.pp_iir = kmalloc(sizeof(*acdb_data.pp_iir), - GFP_KERNEL); - if (acdb_data.pp_iir == NULL) { - MM_ERR("ACDB=> Could not allocate postproc iir memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - result = -ENOMEM; - goto done; - } - - acdb_data.pp_mbadrc = kmalloc(sizeof(*acdb_data.pp_mbadrc), GFP_KERNEL); - if (acdb_data.pp_mbadrc == NULL) { - MM_ERR("ACDB=> Could not allocate postproc mbadrc memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - result = -ENOMEM; - goto done; - } - acdb_data.calib_gain_rx = kmalloc(sizeof(*acdb_data.calib_gain_rx), - GFP_KERNEL); - if (acdb_data.calib_gain_rx == NULL) { - MM_ERR("ACDB=> Could not allocate" - " postproc calib_gain_rx memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - result = -ENOMEM; - goto done; - } - - acdb_data.preproc_agc = kmalloc(sizeof(*acdb_data.preproc_agc), - GFP_KERNEL); - if (acdb_data.preproc_agc == NULL) { - MM_ERR("ACDB=> Could not allocate preproc agc memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - result = -ENOMEM; - goto done; - } - - acdb_data.preproc_iir = kmalloc(sizeof(*acdb_data.preproc_iir), - GFP_KERNEL); - if (acdb_data.preproc_iir == NULL) { - MM_ERR("ACDB=> Could not allocate preproc iir memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - result = -ENOMEM; - goto done; - } - acdb_data.calib_gain_tx = kmalloc(sizeof(*acdb_data.calib_gain_tx), - GFP_KERNEL); - if (acdb_data.calib_gain_tx == NULL) { - MM_ERR("ACDB=> Could not allocate" - " preproc calib_gain_tx memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - result = -ENOMEM; - goto done; - } - acdb_data.pbe_block = kmalloc(sizeof(*acdb_data.pbe_block), - GFP_KERNEL); - if (acdb_data.pbe_block == NULL) { - MM_ERR("ACDB=> Could not allocate pbe_block memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - kfree(acdb_data.calib_gain_tx); - result = -ENOMEM; - goto done; - } - acdb_data.pbe_extbuff = (u16 *) allocate_contiguous_ebi_nomap( - PBE_BUF_SIZE, SZ_4K); - if (!acdb_data.pbe_extbuff) { - MM_ERR("ACDB=> Cannot allocate physical memory\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - kfree(acdb_data.calib_gain_tx); - kfree(acdb_data.pbe_block); - result = -ENOMEM; - goto done; - } - acdb_data.fluence_extbuff = allocate_contiguous_ebi_nomap( - FLUENCE_BUF_SIZE, SZ_4K); - if (!acdb_data.fluence_extbuff) { - MM_ERR("ACDB=> cannot allocate physical memory for " - "fluence block\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - kfree(acdb_data.calib_gain_tx); - kfree(acdb_data.pbe_block); - free_contiguous_memory_by_paddr((int32_t)acdb_data.pbe_extbuff); - result = -ENOMEM; - goto done; - } - acdb_data.map_v_fluence = ioremap( - acdb_data.fluence_extbuff, - FLUENCE_BUF_SIZE); - if (IS_ERR(acdb_data.map_v_fluence)) { - MM_ERR("ACDB=> Could not map physical address\n"); - free_memory_acdb_get_blk(); - free_memory_acdb_cache_rx(); - free_memory_acdb_cache_tx(); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.calib_gain_rx); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - kfree(acdb_data.calib_gain_tx); - kfree(acdb_data.pbe_block); - free_contiguous_memory_by_paddr( - (int32_t)acdb_data.pbe_extbuff); - free_contiguous_memory_by_paddr( - (int32_t)acdb_data.fluence_extbuff); - result = -ENOMEM; - goto done; - } else - acdb_data.fluence_extbuff_virt = - acdb_data.map_v_fluence; -done: - return result; -} - -static u32 free_acdb_cache_node(union auddev_evt_data *evt) -{ - u32 session_id; - if ((evt->audcal_info.dev_type & TX_DEVICE) == 2) { - /*Second argument to find_first_bit should be maximum number - of bits interested - */ - session_id = find_first_bit( - (unsigned long *)&(evt->audcal_info.sessions), - sizeof(evt->audcal_info.sessions) * 8); - MM_DBG("freeing node %d for tx device", session_id); - acdb_cache_tx[session_id]. - node_status = ACDB_VALUES_NOT_FILLED; - } else { - MM_DBG("freeing rx cache node %d\n", - evt->audcal_info.dev_id); - acdb_cache_rx[evt->audcal_info.dev_id]. - node_status = ACDB_VALUES_NOT_FILLED; - } - return 0; -} - -static u8 check_device_change(struct auddev_evt_audcal_info audcal_info) -{ - if (!acdb_data.device_info) { - MM_ERR("not pointing to previous valid device detail\n"); - return 1; /*device info will not be pointing to*/ - /* valid device when acdb driver comes up*/ - } - if ((audcal_info.dev_id == acdb_data.device_info->dev_id) && - (audcal_info.sample_rate == - acdb_data.device_info->sample_rate) && - (audcal_info.acdb_id == acdb_data.device_info->acdb_id)) { - return 0; - } - return 1; -} - -static void device_cb(u32 evt_id, union auddev_evt_data *evt, void *private) -{ - struct auddev_evt_audcal_info audcal_info; - struct acdb_cache_node *acdb_cache_free_node = NULL; - u32 stream_id = 0; - u8 ret = 0; - u8 count = 0; - u8 i = 0; - u8 device_change = 0; - - if (!((evt_id == AUDDEV_EVT_DEV_RDY) || - (evt_id == AUDDEV_EVT_DEV_RLS))) { - goto done; - } - /*if session value is zero it indicates that device call back is for - voice call we will drop the request as acdb values for voice call is - not applied from acdb driver*/ - if (!evt->audcal_info.sessions) { - MM_DBG("no active sessions and call back is for" - " voice call\n"); - goto done; - } - if (evt_id == AUDDEV_EVT_DEV_RLS) { - MM_DBG("got release command for dev %d\n", - evt->audcal_info.dev_id); - acdb_data.acdb_state &= ~CAL_DATA_READY; - free_acdb_cache_node(evt); - /*reset the applied flag for the session routed to the device*/ - acdb_data.audrec_applied &= ~(evt->audcal_info.sessions - << AUDREC_OFFSET); - goto done; - } - if (((evt->audcal_info.dev_type & RX_DEVICE) == 1) && - (evt->audcal_info.acdb_id == PSEUDO_ACDB_ID)) { - MM_INFO("device cb is for rx device with pseudo acdb id\n"); - goto done; - } - audcal_info = evt->audcal_info; - MM_DBG("dev_id = %d\n", audcal_info.dev_id); - MM_DBG("sample_rate = %d\n", audcal_info.sample_rate); - MM_DBG("acdb_id = %d\n", audcal_info.acdb_id); - MM_DBG("sessions = %d\n", audcal_info.sessions); - MM_DBG("acdb_state = %x\n", acdb_data.acdb_state); - mutex_lock(&acdb_data.acdb_mutex); - device_change = check_device_change(audcal_info); - if (!device_change) { - if ((audcal_info.dev_type & TX_DEVICE) == 2) { - if (!(acdb_data.acdb_state & AUDREC0_READY)) - acdb_data.audrec_applied &= ~AUDREC0_READY; - if (!(acdb_data.acdb_state & AUDREC1_READY)) - acdb_data.audrec_applied &= ~AUDREC1_READY; - if (!(acdb_data.acdb_state & AUDREC2_READY)) - acdb_data.audrec_applied &= ~AUDREC2_READY; - acdb_data.acdb_state &= ~CAL_DATA_READY; - goto update_cache; - } - } else - /* state is updated to querry the modem for values */ - acdb_data.acdb_state &= ~CAL_DATA_READY; - -update_cache: - if ((audcal_info.dev_type & TX_DEVICE) == 2) { - /*loop is to take care of use case:- multiple Audrec - sessions are routed before enabling the device in this use - case we will get the sessions value as bits set for all the - sessions routed before device enable, so we should take care - of copying device info to all the sessions*/ - for (i = 0; i < MAX_AUDREC_SESSIONS; i++) { - stream_id = ((audcal_info.sessions >> i) & 0x01); - if (stream_id) { - acdb_cache_free_node = &acdb_cache_tx[i]; - ret = check_device_info_already_present( - audcal_info, - acdb_cache_free_node); - acdb_cache_free_node->stream_id = i; - acdb_data.cur_tx_session = i; - count++; - } - } - if (count > 1) - acdb_data.multiple_sessions = 1; - } else { - acdb_cache_free_node = &acdb_cache_rx[audcal_info.dev_id]; - ret = check_device_info_already_present(audcal_info, - acdb_cache_free_node); - if (ret == 1) { - MM_DBG("got device ready call back for another " - "audplay task sessions on same COPP\n"); - /*stream_id is used to keep track of number of active*/ - /*sessions active on this device*/ - acdb_cache_free_node->stream_id++; - mutex_unlock(&acdb_data.acdb_mutex); - goto done; - } - acdb_cache_free_node->stream_id++; - } - update_acdb_data_struct(acdb_cache_free_node); - acdb_data.device_cb_compl = 1; - mutex_unlock(&acdb_data.acdb_mutex); - wake_up(&acdb_data.wait); -done: - return; -} - - -static s32 register_device_cb(void) -{ - s32 result = 0; - - result = auddev_register_evt_listner((AUDDEV_EVT_DEV_RDY - | AUDDEV_EVT_DEV_RLS), - AUDDEV_CLNT_AUDIOCAL, 0, device_cb, (void *)&acdb_data); - - if (result) { - MM_ERR("ACDB=> Could not register device callback\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static void audpp_cb(void *private, u32 id, u16 *msg) -{ - MM_DBG("\n"); - if (id != AUDPP_MSG_CFG_MSG) - goto done; - - if (msg[0] == AUDPP_MSG_ENA_DIS) { - if (--acdb_cache_rx[acdb_data.\ - device_info->dev_id].stream_id <= 0) { - acdb_data.acdb_state &= ~AUDPP_READY; - acdb_cache_rx[acdb_data.device_info->dev_id]\ - .stream_id = 0; - MM_DBG("AUDPP_MSG_ENA_DIS\n"); - } - goto done; - } - - acdb_data.acdb_state |= AUDPP_READY; - acdb_data.audpp_cb_compl = 1; - wake_up(&acdb_data.wait); -done: - return; -} - -static s8 handle_audpreproc_cb(void) -{ - struct acdb_cache_node *acdb_cached_values; - s8 result = 0; - u8 stream_id = acdb_data.preproc_stream_id; - acdb_data.preproc_cb_compl = 0; - acdb_cached_values = get_acdb_values_from_cache_tx(stream_id); - if (acdb_cached_values == NULL) { - MM_DBG("ERROR: to get chached acdb values\n"); - return -EPERM; - } - update_acdb_data_struct(acdb_cached_values); - if (acdb_data.device_info->dev_id == PSEUDO_ACDB_ID) { - MM_INFO("audpreproc is routed to pseudo device\n"); - return result; - } - if (acdb_data.build_id[17] == '1') { - if (session_info[stream_id].sampling_freq) - acdb_data.device_info->sample_rate = - session_info[stream_id].sampling_freq; - } - if (!(acdb_data.acdb_state & CAL_DATA_READY)) { - result = check_tx_acdb_values_cached(); - if (result) { - result = acdb_get_calibration(); - if (result < 0) { - MM_ERR("failed to get calibration data\n"); - return result; - } - } - acdb_cached_values->node_status = ACDB_VALUES_FILLED; - } - return result; -} - -void fluence_feature_update(int enable, int stream_id) -{ - MM_INFO("Fluence feature over ride with = %d\n", enable); - acdb_data.fleuce_feature_status[stream_id] = enable; -} -EXPORT_SYMBOL(fluence_feature_update); - -static void audpreproc_cb(void *private, u32 id, void *msg) -{ - struct audpreproc_cmd_enc_cfg_done_msg *tmp; - u8 result = 0; - int stream_id = 0; - if (id != AUDPREPROC_CMD_ENC_CFG_DONE_MSG) - goto done; - - tmp = (struct audpreproc_cmd_enc_cfg_done_msg *)msg; - acdb_data.preproc_stream_id = tmp->stream_id; - stream_id = acdb_data.preproc_stream_id; - get_audrec_session_info(stream_id, &session_info[stream_id]); - MM_DBG("rec_enc_type = %x\n", tmp->rec_enc_type); - if ((tmp->rec_enc_type & 0x8000) == - AUD_PREPROC_CONFIG_DISABLED) { - if (acdb_data.preproc_stream_id == 0) { - acdb_data.acdb_state &= ~AUDREC0_READY; - acdb_data.audrec_applied &= ~AUDREC0_READY; - } else if (acdb_data.preproc_stream_id == 1) { - acdb_data.acdb_state &= ~AUDREC1_READY; - acdb_data.audrec_applied &= ~AUDREC1_READY; - } else if (acdb_data.preproc_stream_id == 2) { - acdb_data.acdb_state &= ~AUDREC2_READY; - acdb_data.audrec_applied &= ~AUDREC2_READY; - } - acdb_data.fleuce_feature_status[stream_id] = 0; - acdb_cache_tx[tmp->stream_id].node_status =\ - ACDB_VALUES_NOT_FILLED; - acdb_data.acdb_state &= ~CAL_DATA_READY; - goto done; - } - /*Following check is added to make sure that device info - is updated. audpre proc layer enabled without device - callback at this scenario we should not access - device information - */ - if (acdb_data.build_id[17] != '0') { - if (acdb_data.device_info && - session_info[stream_id].sampling_freq) { - acdb_data.device_info->sample_rate = - session_info[stream_id].sampling_freq; - result = check_tx_acdb_values_cached(); - if (!result) { - MM_INFO("acdb values for the stream is" \ - " querried from modem"); - acdb_data.acdb_state |= CAL_DATA_READY; - } else { - acdb_data.acdb_state &= ~CAL_DATA_READY; - } - } - } - if (acdb_data.preproc_stream_id == 0) - acdb_data.acdb_state |= AUDREC0_READY; - else if (acdb_data.preproc_stream_id == 1) - acdb_data.acdb_state |= AUDREC1_READY; - else if (acdb_data.preproc_stream_id == 2) - acdb_data.acdb_state |= AUDREC2_READY; - acdb_data.preproc_cb_compl = 1; - MM_DBG("acdb_data.acdb_state = %x\n", acdb_data.acdb_state); - wake_up(&acdb_data.wait); -done: - return; -} - -static s32 register_audpp_cb(void) -{ - s32 result = 0; - - acdb_data.audpp_cb.fn = audpp_cb; - acdb_data.audpp_cb.private = NULL; - result = audpp_register_event_callback(&acdb_data.audpp_cb); - if (result) { - MM_ERR("ACDB=> Could not register audpp callback\n"); - result = -ENODEV; - goto done; - } -done: - return result; -} - -static s32 register_audpreproc_cb(void) -{ - s32 result = 0; - - acdb_data.audpreproc_cb.fn = audpreproc_cb; - acdb_data.audpreproc_cb.private = NULL; - result = audpreproc_register_event_callback(&acdb_data.audpreproc_cb); - if (result) { - MM_ERR("ACDB=> Could not register audpreproc callback\n"); - result = -ENODEV; - goto done; - } - -done: - return result; -} - -static s32 acdb_initialize_data(void) -{ - s32 result = 0; - - mutex_init(&acdb_data.acdb_mutex); - - result = initialize_rpc(); - if (result) - goto err; - - result = initialize_memory(); - if (result) - goto err1; - - result = register_device_cb(); - if (result) - goto err2; - - result = register_audpp_cb(); - if (result) - goto err3; - - result = register_audpreproc_cb(); - if (result) - goto err4; - - - return result; - -err4: - result = audpreproc_unregister_event_callback(&acdb_data.audpreproc_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpreproc callback\n"); -err3: - result = audpp_unregister_event_callback(&acdb_data.audpp_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpp callback\n"); -err2: - result = auddev_unregister_evt_listner(AUDDEV_CLNT_AUDIOCAL, 0); - if (result) - MM_ERR("ACDB=> Could not unregister device callback\n"); -err1: - daldevice_detach(acdb_data.handle); - acdb_data.handle = NULL; -err: - return result; -} - -static s32 initialize_modem_acdb(void) -{ - struct acdb_cmd_init_adie acdb_cmd; - u8 codec_type = -1; - s32 result = 0; - u8 iterations = 0; - - codec_type = adie_get_detected_codec_type(); - if (codec_type == MARIMBA_ID) - acdb_cmd.adie_type = ACDB_CURRENT_ADIE_MODE_MARIMBA; - else if (codec_type == TIMPANI_ID) - acdb_cmd.adie_type = ACDB_CURRENT_ADIE_MODE_TIMPANI; - else - acdb_cmd.adie_type = ACDB_CURRENT_ADIE_MODE_UNKNOWN; - acdb_cmd.command_id = ACDB_CMD_INITIALIZE_FOR_ADIE; - do { - /*Initialize ACDB software on modem based on codec type*/ - result = dalrpc_fcn_8(ACDB_DalACDB_ioctl, acdb_data.handle, - (const void *)&acdb_cmd, sizeof(acdb_cmd), - &acdb_data.acdb_result, - sizeof(acdb_data.acdb_result)); - if (result < 0) { - MM_ERR("ACDB=> RPC failure result = %d\n", result); - goto error; - } - /*following check is introduced to handle boot up race - condition between AUDCAL SW peers running on apps - and modem (ACDB_RES_BADSTATE indicates modem AUDCAL SW is - not in initialized sate) we need to retry to get ACDB - initialized*/ - if (acdb_data.acdb_result.result == ACDB_RES_BADSTATE) { - msleep(500); - iterations++; - } else if (acdb_data.acdb_result.result == ACDB_RES_SUCCESS) { - MM_DBG("Modem ACDB SW initialized ((iterations = %d)\n", - iterations); - return result; - } else { - MM_ERR("ACDB=> Modem ACDB SW failed to initialize" - " reuslt = %d, (iterations = %d)\n", - acdb_data.acdb_result.result, - iterations); - goto error; - } - } while (iterations < MAX_RETRY); - MM_ERR("ACDB=> AUDCAL SW on modem is not in intiailized state (%d)\n", - acdb_data.acdb_result.result); -error: - result = -EINVAL; - return result; -} - -static s32 acdb_calibrate_device(void *data) -{ - s32 result = 0; - - /* initialize driver */ - result = acdb_initialize_data(); - if (result) - goto done; - if (acdb_data.build_id[17] != '0') { - result = initialize_modem_acdb(); - if (result < 0) - MM_ERR("failed to initialize modem ACDB\n"); - } - - while (!kthread_should_stop()) { - MM_DBG("Waiting for call back events\n"); - wait_event_interruptible(acdb_data.wait, - (acdb_data.device_cb_compl - | acdb_data.audpp_cb_compl - | acdb_data.preproc_cb_compl)); - mutex_lock(&acdb_data.acdb_mutex); - if (acdb_data.device_cb_compl) { - acdb_data.device_cb_compl = 0; - if (!(acdb_data.acdb_state & CAL_DATA_READY)) { - if ((acdb_data.device_info->dev_type - & RX_DEVICE) == 1) { - /*we need to get calibration values - only for RX device as resampler - moved to start of the pre - proc chain - tx calibration value will be based on - sampling frequency what audrec is - configured, calibration values for tx - device are fetch in audpreproc - callback*/ - result = acdb_get_calibration(); - if (result < 0) { - mutex_unlock( - &acdb_data.acdb_mutex); - MM_ERR("Not able to get " - "calibration " - "data continue\n"); - continue; - } - } - } - MM_DBG("acdb state = %d\n", - acdb_data.acdb_state); - if ((acdb_data.device_info->dev_type & TX_DEVICE) == 2) - handle_tx_device_ready_callback(); - else { - acdb_cache_rx[acdb_data.device_info->dev_id]\ - .node_status = - ACDB_VALUES_FILLED; - if (acdb_data.acdb_state & - AUDPP_READY) { - MM_DBG("AUDPP already enabled " - "apply acdb values\n"); - goto apply; - } - } - } - - if (!(acdb_data.audpp_cb_compl || - acdb_data.preproc_cb_compl)) { - MM_DBG("need to wait for either AUDPP / AUDPREPROC " - "Event\n"); - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } else { - MM_DBG("got audpp / preproc call back\n"); - if (acdb_data.audpp_cb_compl) { - send_acdb_values_for_active_devices(); - acdb_data.audpp_cb_compl = 0; - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } else { - result = handle_audpreproc_cb(); - if (result < 0) { - mutex_unlock(&acdb_data.acdb_mutex); - continue; - } - } - } -apply: - if (acdb_data.acdb_state & CAL_DATA_READY) - result = acdb_send_calibration(); - - mutex_unlock(&acdb_data.acdb_mutex); - } -done: - return 0; -} - -static int __init acdb_init(void) -{ - - s32 result = 0; - - memset(&acdb_data, 0, sizeof(acdb_data)); - spin_lock_init(&acdb_data.dsp_lock); - acdb_data.cb_thread_task = kthread_run(acdb_calibrate_device, - NULL, "acdb_cb_thread"); - - if (IS_ERR(acdb_data.cb_thread_task)) { - MM_ERR("ACDB=> Could not register cb thread\n"); - result = -ENODEV; - goto err; - } - - acdb_data.build_id = socinfo_get_build_id(); - MM_INFO("build id used is = %s\n", acdb_data.build_id); - -#ifdef CONFIG_DEBUG_FS - /*This is RTC specific INIT used only with debugfs*/ - if (!rtc_acdb_init()) - MM_ERR("RTC ACDB=>INIT Failure\n"); - -#endif - init_waitqueue_head(&acdb_data.wait); - - return misc_register(&acdb_misc); -err: - return result; -} - -static void __exit acdb_exit(void) -{ - s32 result = 0; - u32 i = 0; - - result = auddev_unregister_evt_listner(AUDDEV_CLNT_AUDIOCAL, 0); - if (result) - MM_ERR("ACDB=> Could not unregister device callback\n"); - - result = audpp_unregister_event_callback(&acdb_data.audpp_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpp callback\n"); - - result = audpreproc_unregister_event_callback(&acdb_data.\ - audpreproc_cb); - if (result) - MM_ERR("ACDB=> Could not unregister audpreproc callback\n"); - - result = kthread_stop(acdb_data.cb_thread_task); - if (result) - MM_ERR("ACDB=> Could not stop kthread\n"); - - free_memory_acdb_get_blk(); - - for (i = 0; i < MAX_COPP_NODE_SUPPORTED; i++) { - if (i < MAX_AUDREC_SESSIONS) { - iounmap(acdb_cache_tx[i].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_tx[i].phys_addr_acdb_values); - } - iounmap(acdb_cache_rx[i].map_v_addr); - free_contiguous_memory_by_paddr( - acdb_cache_rx[i].phys_addr_acdb_values); - } - kfree(acdb_data.device_info); - kfree(acdb_data.pp_iir); - kfree(acdb_data.pp_mbadrc); - kfree(acdb_data.preproc_agc); - kfree(acdb_data.preproc_iir); - free_contiguous_memory_by_paddr( - (int32_t)acdb_data.pbe_extbuff); - iounmap(acdb_data.map_v_fluence); - free_contiguous_memory_by_paddr( - (int32_t)acdb_data.fluence_extbuff); - mutex_destroy(&acdb_data.acdb_mutex); - memset(&acdb_data, 0, sizeof(acdb_data)); - #ifdef CONFIG_DEBUG_FS - rtc_acdb_deinit(); - #endif -} - -late_initcall(acdb_init); -module_exit(acdb_exit); - -MODULE_DESCRIPTION("MSM 7x30 Audio ACDB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_adpcm.c b/arch/arm/mach-msm/qdsp5v2/audio_adpcm.c deleted file mode 100644 index 632aa0d9872e..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_adpcm.c +++ /dev/null @@ -1,1753 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5v2/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Size must be power of 2 */ -#define BUFSZ_MAX 32768 /* Includes meta in size */ -#define BUFSZ_MIN 4096 /* Includes meta in size */ -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_ADPCM 1 - -#define PCM_BUFSZ_MIN 8216 /* Hold one stereo ADPCM frame and meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDADPCM_METAFIELD_MASK 0xFFFF0000 -#define AUDADPCM_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDADPCM_EOS_FLG_MASK 0x01 -#define AUDADPCM_EOS_NONE 0x0 /* No EOS detected */ -#define AUDADPCM_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDADPCM_EVENT_NUM 10 /* Default no. of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audadpcm_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audadpcm_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_block_size; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audadpcm_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audadpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -static void adpcm_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - if (audio->dec_state == MSM_AUD_DECODER_STATE_SUCCESS && - audio->enabled == 1) - audpp_route_stream(audio->dec_id, - msm_snddev_route_dec(audio->dec_id)); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audio_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("audio_update_pcm_buf_entry: \ - expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -static struct msm_adsp_ops audplay_adsp_ops_adpcm = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_ADPCM; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_adpcm cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_ADPCM_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - cmd.stereo_cfg = audio->out_channel_mode; - cmd.block_size = audio->out_block_size; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - - MM_DBG("buf0_addr=%x buf0_len=%d\n", - refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDADPCM_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (audio->wflush) { - audio->out_needed = 1; - goto done; - } - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - MM_DBG("\n"); /* Macro prints the file name and function */ - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audadpcm_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audadpcm_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audadpcm_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audadpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audadpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audadpcm_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audadpcm_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audadpcm_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audadpcm_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audadpcm_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audadpcm_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->out_block_size = config.bits; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("read buf map fail\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("audio_read: no partial frame done reading\n"); - break; - } else { - MM_DBG("audio_read: read from in[%d]\n", - audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audadpcm_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audplay_send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDADPCM_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("audio_write: mf offset_val %x\n", - mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDADPCM_EOS_FLG_OFFSET] & - AUDADPCM_EOS_FLG_MASK) { - MM_DBG("audio_write: EOS SET\n"); - eos_condition = AUDADPCM_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDADPCM_EOS_FLG_OFFSET] - &= ~AUDADPCM_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("audio_write: continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - if (eos_condition == AUDADPCM_EOS_SET) - rc = audadpcm_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audadpcm_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audadpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audadpcm_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audadpcm_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audadpcm_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audadpcm_suspend(struct early_suspend *h) -{ - struct audadpcm_suspend_ctl *ctl = - container_of(h, struct audadpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audadpcm_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audadpcm_resume(struct early_suspend *h) -{ - struct audadpcm_suspend_ctl *ctl = - container_of(h, struct audadpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audadpcm_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audadpcm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audadpcm_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audadpcm_debug_fops = { - .read = audadpcm_debug_read, - .open = audadpcm_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - unsigned pmem_sz = DMASZ_MAX; - struct audadpcm_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_adpcm_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_ADPCM; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, - SZ_4K); - if (audio->phys) { - audio->map_v_write = ioremap(audio->phys, pmem_sz); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys address, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; - } - audio->out_dma_sz = pmem_sz; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_adpcm, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - adpcm_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_adpcm_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audadpcm_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audadpcm_resume; - audio->suspend_ctl.node.suspend = audadpcm_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDADPCM_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audadpcm_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_adpcm_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_adpcm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_adpcm", - .fops = &audio_adpcm_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_adpcm_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_amrnb.c b/arch/arm/mach-msm/qdsp5v2/audio_amrnb.c deleted file mode 100644 index bd4f6e1ac253..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_amrnb.c +++ /dev/null @@ -1,1644 +0,0 @@ -/* - * amrnb audio decoder device - * - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFSZ 1024 /* Hold minimum 700ms voice data and 14 bytes of meta in*/ -#define DMASZ (BUFSZ * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AMRNB 10 - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and 24 bytes of meta out*/ -#define AMRNB_DECODED_FRSZ 320 /* AMR-NB 20ms 8KHz mono PCM size */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAMRNB_METAFIELD_MASK 0xFFFF0000 -#define AUDAMRNB_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAMRNB_EOS_FLG_MASK 0x01 -#define AUDAMRNB_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAMRNB_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAMRNB_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audamrnb_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audamrnb_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audamrnb_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -struct audpp_cmd_cfg_adec_params_amrnb { - struct audpp_cmd_cfg_adec_params_common common; - unsigned short stereo_cfg; -} __attribute__((packed)) ; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audamrnb_send_data(struct audio *audio, unsigned needed); -static void audamrnb_config_hostpcm(struct audio *audio); -static void audamrnb_buffer_refresh(struct audio *audio); -static void audamrnb_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrnb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audamrnb_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audamrnb_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -static void amrnb_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audamrnb_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audamrnb_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audamrnb_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audamrnb_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audamrnb_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder\n"); - } -} - -static void audamrnb_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audamrnb_config_hostpcm(audio); - audamrnb_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audamrnb_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_amrnb = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AMRNB; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_amrnb cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_V13K_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAMRNB_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audamrnb_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % AMRNB_DECODED_FRSZ) + - (audio->mfield ? 24 : 0); - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audamrnb_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audamrnb_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audamrnb_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audamrnb_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audamrnb_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audamrnb_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audamrnb_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audamrnb_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audamrnb_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audamrnb_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audamrnb_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audamrnb_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audamrnb_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audamrnb_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrnb_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audamrnb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audamrnb_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audamrnb_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audamrnb_disable(audio); - audio->stopped = 1; - audamrnb_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audamrnb_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * - config.buffer_size); - audio->read_phys = allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read phys address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x kernel \ - addr 0x%08x\n", audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audamrnb_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audamrnb_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audamrnb_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audamrnb_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audamrnb_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audamrnb_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAMRNB_EOS_NONE; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer - * contains just meta field - */ - if (cpy_ptr[AUDAMRNB_EOS_FLG_OFFSET] & - AUDAMRNB_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAMRNB_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAMRNB_EOS_FLG_OFFSET] &= - ~AUDAMRNB_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = (xfer + mfield_size); - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - - audamrnb_send_data(audio, 0); - - } - if (eos_condition == AUDAMRNB_EOS_SET) - rc = audamrnb_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audamrnb_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audamrnb_disable(audio); - audamrnb_flush(audio); - audamrnb_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audamrnb_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrnb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audamrnb_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audamrnb_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audamrnb_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audamrnb_suspend(struct early_suspend *h) -{ - struct audamrnb_suspend_ctl *ctl = - container_of(h, struct audamrnb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrnb_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audamrnb_resume(struct early_suspend *h) -{ - struct audamrnb_suspend_ctl *ctl = - container_of(h, struct audamrnb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrnb_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audamrnb_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audamrnb_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audamrnb_debug_fops = { - .read = audamrnb_debug_read, - .open = audamrnb_debug_open, -}; -#endif - -static int audamrnb_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audamrnb_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrnb_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AMRNB; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (!audio->phys) { - MM_ERR("could not allocate write buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else { - audio->map_v_write = ioremap(audio->phys, DMASZ); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys address, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - free_contiguous_memory_by_paddr(audio->phys); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_amrnb, audio); - if (rc) { - MM_ERR("failed to get %s module freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - - audamrnb_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - amrnb_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_amrnb_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audamrnb_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audamrnb_resume; - audio->suspend_ctl.node.suspend = audamrnb_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDAMRNB_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audamrnb_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrnb_fops = { - .owner = THIS_MODULE, - .open = audamrnb_open, - .release = audamrnb_release, - .read = audamrnb_read, - .write = audamrnb_write, - .unlocked_ioctl = audamrnb_ioctl, - .fsync = audamrnb_fsync, -}; - -struct miscdevice audio_amrnb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb", - .fops = &audio_amrnb_fops, -}; - -static int __init audamrnb_init(void) -{ - return misc_register(&audio_amrnb_misc); -} - -static void __exit audamrnb_exit(void) -{ - misc_deregister(&audio_amrnb_misc); -} - -module_init(audamrnb_init); -module_exit(audamrnb_exit); - -MODULE_DESCRIPTION("MSM AMR-NB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c b/arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c deleted file mode 100644 index cb3c3ea86e2c..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_amrnb_in.c +++ /dev/null @@ -1,950 +0,0 @@ -/* - * amrnb audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_SIZE (22 * 2) /* 36 bytes data */ -#define DMASZ (FRAME_SIZE * FRAME_NUM) - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - - struct msm_adsp_module *audrec; - struct audrec_session_info session_info; /*audrec session info*/ - - /* configuration to use on next enable */ - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t enc_type; - - int dtx_mode; - uint32_t frame_format; - uint32_t used_mode; - uint32_t rec_mode; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; - - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; - uint32_t in_call; - uint32_t dev_cnt; - int voice_state; - spinlock_t dev_lock; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_read; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - char *build_id; - struct ion_client *client; - struct ion_handle *buff_handle; -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -struct audio_in the_audio_amrnb_in; - -/* DSP command send functions */ -static int audamrnb_in_enc_config(struct audio_in *audio, int enable); -static int audamrnb_in_param_config(struct audio_in *audio); -static int audamrnb_in_mem_config(struct audio_in *audio); -static int audamrnb_in_record_config(struct audio_in *audio, int enable); -static int audamrnb_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); - -static void audamrnb_in_get_dsp_frames(struct audio_in *audio); - -static void audamrnb_in_flush(struct audio_in *audio); - -static void amrnb_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_in *audio = (struct audio_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - if (!audio->in_call) - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1)) - audamrnb_in_record_config(audio, 1); - - break; - } - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - if (!audio->in_call) - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((!audio->running) || (!audio->enabled)) - break; - - /* Turn of as per source */ - if (audio->source) - audamrnb_in_record_config(audio, 1); - else - /* Turn off all */ - audamrnb_in_record_config(audio, 0); - - break; - } - case AUDDEV_EVT_VOICE_STATE_CHG: { - MM_DBG("AUDDEV_EVT_VOICE_STATE_CHG, state = %d\n", - evt_payload->voice_state); - audio->voice_state = evt_payload->voice_state; - if (audio->in_call && audio->running) { - if (audio->voice_state == VOICE_STATE_INCALL) - audamrnb_in_record_config(audio, 1); - else if (audio->voice_state == VOICE_STATE_OFFCALL) { - audamrnb_in_record_config(audio, 0); - wake_up(&audio->wait); - } - } - - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) - audamrnb_in_param_config(audio); - else { /* Encoder disable success */ - audio->running = 0; - audamrnb_in_record_config(audio, 0); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG \n"); - audamrnb_in_mem_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG \n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if ((!audio->in_call && (audio->dev_cnt > 0)) || - (audio->in_call && - (audio->voice_state == VOICE_STATE_INCALL))) - audamrnb_in_record_config(audio, 1); - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - audamrnb_in_get_dsp_frames(audio); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event:module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void audamrnb_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - else - audio->in_count++; - - audamrnb_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} -struct msm_adsp_ops audrec_amrnb_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audamrnb_in_enc_config(struct audio_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG_2 command"); - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG command"); - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audamrnb_in_param_config(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_parm_cfg_amrnb cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.dtx_mode = audio->dtx_mode; - cmd.test_mode = -1; /* Default set to -1 */ - cmd.used_mode = audio->used_mode; - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int audamrnb_in_record_config(struct audio_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & - INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audamrnb_in_mem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - - /* prepare buffer pointers: - * 36 bytes amrnb packet + 4 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - audio->in[n].data = data + 4; - data += (FRAME_SIZE/2); /* word increment */ - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } - - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int audamrnb_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audamrnb_in_enable(struct audio_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - audamrnb_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audamrnb_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - audamrnb_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void audamrnb_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -/* ------------------- device --------------------- */ -static long audamrnb_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - freq = 48000; - MM_DBG("AUDIO_START\n"); - if (audio->in_call && (audio->voice_state != - VOICE_STATE_INCALL)) { - rc = -EPERM; - break; - } - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d\n", freq); - if (rc < 0) { - MM_DBG(" Sample rate can not be set, return code %d\n", - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - /*amrnb works only on 8KHz*/ - audio->session_info.sampling_freq = 8000; - audpreproc_update_audrec_info(&audio->session_info); - rc = audamrnb_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audamrnb_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - break; - } - case AUDIO_FLUSH: { - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audamrnb_in_flush(audio); - mutex_unlock(&audio->read_lock); - } - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (cfg.buffer_size != (FRAME_SIZE - 8)) - rc = -EINVAL; - else - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.dtx_enable = ((audio->dtx_mode == -1) ? 1 : 0); - cfg.band_mode = audio->used_mode; - cfg.frame_format = audio->frame_format; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_AMRNB_ENC_CONFIG_V2: { - struct msm_audio_amrnb_enc_config_v2 cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* DSP does not support any other than default format */ - if (audio->frame_format != cfg.frame_format) { - rc = -EINVAL; - break; - } - if (cfg.dtx_enable == 0) - audio->dtx_mode = 0; - else if (cfg.dtx_enable == 1) - audio->dtx_mode = -1; - else { - rc = -EINVAL; - break; - } - audio->used_mode = cfg.band_mode; - break; - } - case AUDIO_SET_INCALL: { - struct msm_voicerec_mode cfg; - unsigned long flags; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.rec_mode != VOC_REC_BOTH && - cfg.rec_mode != VOC_REC_UPLINK && - cfg.rec_mode != VOC_REC_DOWNLINK) { - MM_ERR("invalid rec_mode\n"); - rc = -EINVAL; - break; - } else { - spin_lock_irqsave(&audio->dev_lock, flags); - if (cfg.rec_mode == VOC_REC_UPLINK) - audio->source = VOICE_UL_SOURCE_MIX_MASK; - else if (cfg.rec_mode == VOC_REC_DOWNLINK) - audio->source = VOICE_DL_SOURCE_MIX_MASK; - else - audio->source = VOICE_DL_SOURCE_MIX_MASK | - VOICE_UL_SOURCE_MIX_MASK ; - audio->in_call = 1; - spin_unlock_irqrestore(&audio->dev_lock, flags); - } - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audamrnb_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped - || (audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL))); - if (rc < 0) - break; - - if (!audio->in_count) { - if (audio->stopped) { - rc = 0;/* End of File */ - break; - } else if (audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL)) { - MM_DBG("Not Permitted Voice Terminated\n"); - rc = -EPERM; /* Voice Call stopped */ - break; - } - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - if (count >= size) { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - } else { - MM_ERR("short read\n"); - break; - } - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static ssize_t audamrnb_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int audamrnb_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - MM_DBG("\n"); - mutex_lock(&audio->lock); - audio->in_call = 0; - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audamrnb_in_disable(audio); - audamrnb_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->buff_handle); - ion_free(audio->client, audio->buff_handle); - ion_client_destroy(audio->client); - audio->data = NULL; - } - mutex_unlock(&audio->lock); - return 0; -} - -static int audamrnb_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_amrnb_in; - int rc; - int encid; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - client = msm_ion_client_create(UINT_MAX, "Audio_AMR_In_Client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto buff_alloc_error; - } - audio->buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto buff_map_error; - } - audio->data = audio->map_v_read; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - rc = -EACCES; - MM_ERR("Non tunnel encoding is not supported\n"); - goto done; - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - rc = -EACCES; - goto done; - } - - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = ENC_TYPE_AMRNB | audio->mode; - audio->dtx_mode = -1; - audio->frame_format = 0; - audio->used_mode = 7; /* Bit Rate 12.2 kbps MR122 */ - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_amrnb_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - - audamrnb_in_flush(audio); - - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_VOICE_STATE_CHG; - - audio->voice_state = msm_get_voice_state(); - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - amrnb_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - goto evt_error; - } - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); - - file->private_data = audio; - audio->opened = 1; -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - ion_unmap_kernel(client, audio->buff_handle); -buff_map_error: -buff_get_phys_error: -buff_get_flags_error: - ion_free(client, audio->buff_handle); -buff_alloc_error: - ion_client_destroy(client); -client_create_error: - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = audamrnb_in_open, - .release = audamrnb_in_release, - .read = audamrnb_in_read, - .write = audamrnb_in_write, - .unlocked_ioctl = audamrnb_in_ioctl, -}; - -struct miscdevice audio_amrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrnb_in", - .fops = &audio_in_fops, -}; - -static int __init audamrnb_in_init(void) -{ - mutex_init(&the_audio_amrnb_in.lock); - mutex_init(&the_audio_amrnb_in.read_lock); - spin_lock_init(&the_audio_amrnb_in.dsp_lock); - spin_lock_init(&the_audio_amrnb_in.dev_lock); - init_waitqueue_head(&the_audio_amrnb_in.wait); - init_waitqueue_head(&the_audio_amrnb_in.wait_enable); - return misc_register(&audio_amrnb_in_misc); -} - -device_initcall(audamrnb_in_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_amrwb.c b/arch/arm/mach-msm/qdsp5v2/audio_amrwb.c deleted file mode 100644 index e5706c7af50a..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_amrwb.c +++ /dev/null @@ -1,1726 +0,0 @@ -/* amrwb audio decoder device - * - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5v2/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFSZ 4110 /* Hold minimum 700ms voice data and 14 bytes of meta in*/ -#define DMASZ (BUFSZ * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_AMRWB 11 - -#define PCM_BUFSZ_MIN 8216 /* 100ms worth of data and 24 bytes of meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDAMRWB_METAFIELD_MASK 0xFFFF0000 -#define AUDAMRWB_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDAMRWB_EOS_FLG_MASK 0x01 -#define AUDAMRWB_EOS_NONE 0x0 /* No EOS detected */ -#define AUDAMRWB_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDAMRWB_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audamrwb_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audamrwb_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audamrwb_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audamrwb_send_data(struct audio *audio, unsigned needed); -static void audamrwb_config_hostpcm(struct audio *audio); -static void audamrwb_buffer_refresh(struct audio *audio); -static void audamrwb_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrwb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audamrwb_enable(struct audio *audio) -{ - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audamrwb_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -static void amrwb_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG("AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR("ERROR:wrong event\n"); - break; - } -} - -/* must be called with audio->lock held */ -static int audamrwb_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audamrwb_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audamrwb_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audamrwb_buffer_refresh(audio); - } else { - MM_DBG("audamrwb_update_pcm_buf_entry: \ - read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("audplay_dsp_event: msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audamrwb_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audamrwb_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event:module audplaytask\n"); - break; - - default: - MM_DBG("unexpected message from decoder\n"); - } -} - -static void audamrwb_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audamrwb_config_hostpcm(audio); - audamrwb_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_DBG("unknown decoder status\n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audamrwb_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_DBG("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_amrwb = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_AMRWB; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_amrwb cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_AMRWB_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDAMRWB_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audamrwb_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audamrwb_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audamrwb_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audamrwb_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audamrwb_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audamrwb_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audamrwb_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audamrwb_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audamrwb_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audamrwb_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audamrwb_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audamrwb_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audamrwb_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audamrwb_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audamrwb_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audamrwb_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audamrwb_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audamrwb_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audamrwb_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audamrwb_disable(audio); - audio->stopped = 1; - audamrwb_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audamrwb_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) - config.channel_count = - AUDPP_CMD_PCM_INTF_MONO_V; - else if (config.channel_count == 2) - config.channel_count = - AUDPP_CMD_PCM_INTF_STEREO_V; - else - rc = -EINVAL; - audio->out_channel_mode = config.channel_count; - audio->out_sample_rate = config.sample_rate; - audio->mfield = config.meta_field; - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == - AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = 0; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", config.buffer_count * - config.buffer_size); - audio->read_phys = allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("Error could not map read" - " phys address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = audio->map_v_read; - audio->pcm_feedback = 1; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x \ - kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audamrwb_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audamrwb_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audamrwb_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("count %d\n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audamrwb_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audamrwb_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - char *buf_ptr; - int rc = 0; - - MM_DBG("signal input EOS reserved=%d\n", audio->reserved); - if (audio->reserved) { - MM_DBG("Pass reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - audio->reserved = 0; - frame->used = 2; - audamrwb_send_data(audio, 0); - } - - MM_DBG("Now signal input EOS after reserved bytes %d %d %d\n", - audio->out[0].used, audio->out[1].used, audio->out_needed); - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audamrwb_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audamrwb_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDAMRWB_EOS_NONE; - unsigned short mfield_size = 0; - unsigned dsize; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer - * contains just meta field - */ - if (cpy_ptr[AUDAMRWB_EOS_FLG_OFFSET] & - AUDAMRWB_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDAMRWB_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDAMRWB_EOS_FLG_OFFSET] &= - ~AUDAMRWB_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - ((frame->size - mfield_size) - 1) : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audamrwb_send_data(audio, 0); - } - } - MM_DBG("eos_condition %x buf[0x%x] start[0x%x]\n", eos_condition, - (int) buf, (int) start); - if (eos_condition == AUDAMRWB_EOS_SET) - rc = audamrwb_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audamrwb_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audamrwb_disable(audio); - audamrwb_flush(audio); - audamrwb_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audamrwb_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audamrwb_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audamrwb_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audamrwb_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audamrwb_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audamrwb_suspend(struct early_suspend *h) -{ - struct audamrwb_suspend_ctl *ctl = - container_of(h, struct audamrwb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrwb_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audamrwb_resume(struct early_suspend *h) -{ - struct audamrwb_suspend_ctl *ctl = - container_of(h, struct audamrwb_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audamrwb_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audamrwb_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audamrwb_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].used %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audamrwb_debug_fops = { - .read = audamrwb_debug_read, - .open = audamrwb_debug_open, -}; -#endif - -static int audamrwb_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audamrwb_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_amrwb_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_AMRWB; - if (file->f_mode & FMODE_READ) - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - else - dec_attrb |= MSM_AUD_MODE_TUNNEL; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (!audio->phys) { - MM_ERR("could not allocate write buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else { - audio->map_v_write = ioremap(audio->phys, DMASZ); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_amrwb, audio); - if (rc) { - MM_ERR("failed to get %s module freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - spin_lock_init(&audio->event_queue_lock); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - audio->vol_pan.pan = 0x0; - audio->eq_enable = 0; - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audamrwb_flush(audio); - - file->private_data = audio; - audio->opened = 1; - audio->event_abort = 0; - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - amrwb_listner, - (void *)audio); - if (rc) { - MM_ERR("failed to register listner\n"); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_amrwb_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audamrwb_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audamrwb_resume; - audio->suspend_ctl.node.suspend = audamrwb_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDAMRWB_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audamrwb_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_amrwb_fops = { - .owner = THIS_MODULE, - .open = audamrwb_open, - .release = audamrwb_release, - .read = audamrwb_read, - .write = audamrwb_write, - .unlocked_ioctl = audamrwb_ioctl, - .fsync = audamrwb_fsync, -}; - -struct miscdevice audio_amrwb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amrwb", - .fops = &audio_amrwb_fops, -}; - -static int __init audamrwb_init(void) -{ - return misc_register(&audio_amrwb_misc); -} - -static void __exit audamrwb_exit(void) -{ - misc_deregister(&audio_amrwb_misc); -} - -module_init(audamrwb_init); -module_exit(audamrwb_exit); - -MODULE_DESCRIPTION("MSM AMR-WB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_dev_ctl.c b/arch/arm/mach-msm/qdsp5v2/audio_dev_ctl.c deleted file mode 100644 index b1446e82cc48..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_dev_ctl.c +++ /dev/null @@ -1,1328 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef MAX -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -#endif - - -static DEFINE_MUTEX(session_lock); - -struct audio_dev_ctrl_state { - struct msm_snddev_info *devs[AUDIO_DEV_CTL_MAX_DEV]; - u32 num_dev; - atomic_t opened; - struct msm_snddev_info *voice_rx_dev; - struct msm_snddev_info *voice_tx_dev; - wait_queue_head_t wait; -}; - -static struct audio_dev_ctrl_state audio_dev_ctrl; -struct event_listner event; -#define MAX_DEC_SESSIONS 7 -#define MAX_ENC_SESSIONS 3 - -struct session_freq { - int freq; - int evt; -}; - - -struct audio_routing_info { - unsigned short mixer_mask[MAX_DEC_SESSIONS]; - unsigned short audrec_mixer_mask[MAX_ENC_SESSIONS]; - struct session_freq dec_freq[MAX_DEC_SESSIONS]; - struct session_freq enc_freq[MAX_ENC_SESSIONS]; - int dual_mic_setting[MAX_ENC_SESSIONS]; - int voice_tx_dev_id; - int voice_rx_dev_id; - int voice_tx_sample_rate; - int voice_rx_sample_rate; - signed int voice_tx_vol; - signed int voice_rx_vol; - int tx_mute; - int rx_mute; - int voice_state; -}; - -static struct audio_routing_info routing_info; - -#ifdef CONFIG_DEBUG_FS - -static struct dentry *dentry; -static int rtc_getdevice_dbg_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("debug intf %s\n", (char *) file->private_data); - return 0; -} -bool is_dev_opened(u32 adb_id) -{ - - int dev_id = 0; - struct msm_snddev_info *dev_info = NULL; - - for (dev_id = 0; dev_id < audio_dev_ctrl.num_dev; dev_id++) { - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) { - MM_ERR("pass invalid dev_id %d\n", dev_id); - return false; - } - if (dev_info->opened && (dev_info->acdb_id == adb_id)) - return true; - } - - return false; -} -static ssize_t rtc_getdevice_dbg_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - static char buffer[1024]; - static char swap_buf[1024]; - const int debug_bufmax = sizeof(buffer); - int n = 0; - int swap_count = 0; - int rc = 0; - int dev_count = 0; - int dev_id = 0; - struct msm_snddev_info *dev_info = NULL; - - - if (audio_dev_ctrl.num_dev <= 0) { - MM_ERR("Invalid no Device present\n"); - dev_count = 0; - n = scnprintf(buffer, debug_bufmax, "DEV_NO:0x%x\n", dev_count); - } else { - for (dev_id = 0; dev_id < audio_dev_ctrl.num_dev; dev_id++) { - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) { - MM_ERR("pass invalid dev_id %d\n", dev_id); - rc = PTR_ERR(dev_info); - return rc; - } - if (dev_info->opened) { - n += scnprintf(swap_buf + n, debug_bufmax - n, - "ACDB_ID:0x%x;CAPB:0x%x\n", - dev_info->acdb_id, - dev_info->capability); - dev_count++; - MM_DBG("RTC Get Device %x COPP %x Session Mask \ - %x Capb %x Dev Count %x\n", - dev_id , dev_info->copp_id, dev_info->sessions, - dev_info->capability, dev_count); - - } - } - - swap_count = scnprintf(buffer, debug_bufmax, \ - "DEV_NO:0x%x\n", dev_count); - - memcpy(buffer+swap_count, swap_buf, n*sizeof(char)); - n = n+swap_count; - - buffer[n] = 0; - } - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations rtc_acdb_debug_fops = { - .open = rtc_getdevice_dbg_open, - .read = rtc_getdevice_dbg_read -}; -#endif -int msm_reset_all_device(void) -{ - int rc = 0; - int dev_id = 0; - struct msm_snddev_info *dev_info = NULL; - - for (dev_id = 0; dev_id < audio_dev_ctrl.num_dev; dev_id++) { - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) { - MM_ERR("pass invalid dev_id %d\n", dev_id); - rc = PTR_ERR(dev_info); - return rc; - } - if (!dev_info->opened) - continue; - MM_DBG("Resetting device %d active on COPP %d" - "with 0x%08x as routing\n", - dev_id, dev_info->copp_id, dev_info->sessions); - broadcast_event(AUDDEV_EVT_REL_PENDING, - dev_id, - SESSION_IGNORE); - rc = dev_info->dev_ops.close(dev_info); - if (rc < 0) { - MM_ERR("Snd device %d failed close!\n", dev_id); - return rc; - } else { - dev_info->opened = 0; - broadcast_event(AUDDEV_EVT_DEV_RLS, - dev_id, - SESSION_IGNORE); - } - dev_info->sessions = 0; - } - return 0; -} -EXPORT_SYMBOL(msm_reset_all_device); - -int msm_set_dual_mic_config(int enc_session_id, int config) -{ - int i; - if (enc_session_id >= MAX_ENC_SESSIONS) - return -EINVAL; - /*config is set(1) dual mic recording is selected */ - /*config is reset (0) dual mic recording is not selected*/ - routing_info.dual_mic_setting[enc_session_id] = config; - for (i = 0; i < MAX_ENC_SESSIONS; i++) - MM_DBG("dual_mic_setting[%d] = %d\n", - i, routing_info.dual_mic_setting[i]); - return 0; -} -EXPORT_SYMBOL(msm_set_dual_mic_config); - -int msm_get_dual_mic_config(int enc_session_id) -{ - if (enc_session_id >= MAX_ENC_SESSIONS) - return -EINVAL; - return routing_info.dual_mic_setting[enc_session_id]; -} -EXPORT_SYMBOL(msm_get_dual_mic_config); - -int msm_get_voice_state(void) -{ - MM_DBG("voice state %d\n", routing_info.voice_state); - return routing_info.voice_state; -} -EXPORT_SYMBOL(msm_get_voice_state); - -int msm_set_voice_mute(int dir, int mute) -{ - MM_DBG("dir %x mute %x\n", dir, mute); - if (!audio_dev_ctrl.voice_rx_dev - || !audio_dev_ctrl.voice_tx_dev) - return -EPERM; - if (dir == DIR_TX) { - routing_info.tx_mute = mute; - broadcast_event(AUDDEV_EVT_DEVICE_VOL_MUTE_CHG, - routing_info.voice_tx_dev_id, SESSION_IGNORE); - } else - return -EPERM; - return 0; -} -EXPORT_SYMBOL(msm_set_voice_mute); - -int msm_set_voice_vol(int dir, s32 volume) -{ - if (!audio_dev_ctrl.voice_rx_dev - || !audio_dev_ctrl.voice_tx_dev) - return -EPERM; - if (dir == DIR_TX) { - routing_info.voice_tx_vol = volume; - broadcast_event(AUDDEV_EVT_DEVICE_VOL_MUTE_CHG, - routing_info.voice_tx_dev_id, - SESSION_IGNORE); - } else if (dir == DIR_RX) { - routing_info.voice_rx_vol = volume; - broadcast_event(AUDDEV_EVT_DEVICE_VOL_MUTE_CHG, - routing_info.voice_rx_dev_id, - SESSION_IGNORE); - } else - return -EINVAL; - return 0; -} -EXPORT_SYMBOL(msm_set_voice_vol); - -void msm_snddev_register(struct msm_snddev_info *dev_info) -{ - mutex_lock(&session_lock); - if (audio_dev_ctrl.num_dev < AUDIO_DEV_CTL_MAX_DEV) { - audio_dev_ctrl.devs[audio_dev_ctrl.num_dev] = dev_info; - dev_info->dev_volume = 50; /* 50% */ - dev_info->sessions = 0x0; - dev_info->usage_count = 0; - dev_info->set_sample_rate = 0; - audio_dev_ctrl.num_dev++; - } else - MM_ERR("%s: device registry max out\n", __func__); - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(msm_snddev_register); - -int msm_snddev_devcount(void) -{ - return audio_dev_ctrl.num_dev; -} -EXPORT_SYMBOL(msm_snddev_devcount); - -int msm_snddev_query(int dev_id) -{ - if (dev_id <= audio_dev_ctrl.num_dev) - return 0; - return -ENODEV; -} -EXPORT_SYMBOL(msm_snddev_query); - -int msm_snddev_is_set(int popp_id, int copp_id) -{ - return routing_info.mixer_mask[popp_id] & (0x1 << copp_id); -} -EXPORT_SYMBOL(msm_snddev_is_set); - -unsigned short msm_snddev_route_enc(int enc_id) -{ - if (enc_id >= MAX_ENC_SESSIONS) - return -EINVAL; - return routing_info.audrec_mixer_mask[enc_id]; -} -EXPORT_SYMBOL(msm_snddev_route_enc); - -unsigned short msm_snddev_route_dec(int popp_id) -{ - if (popp_id >= MAX_DEC_SESSIONS) - return -EINVAL; - return routing_info.mixer_mask[popp_id]; -} -EXPORT_SYMBOL(msm_snddev_route_dec); - -int msm_snddev_set_dec(int popp_id, int copp_id, int set) -{ - if (set) - routing_info.mixer_mask[popp_id] |= (0x1 << copp_id); - else - routing_info.mixer_mask[popp_id] &= ~(0x1 << copp_id); - - return 0; -} -EXPORT_SYMBOL(msm_snddev_set_dec); - -int msm_snddev_set_enc(int popp_id, int copp_id, int set) -{ - if (set) - routing_info.audrec_mixer_mask[popp_id] |= (0x1 << copp_id); - else - routing_info.audrec_mixer_mask[popp_id] &= ~(0x1 << copp_id); - return 0; -} -EXPORT_SYMBOL(msm_snddev_set_enc); - -int msm_device_is_voice(int dev_id) -{ - if ((dev_id == routing_info.voice_rx_dev_id) - || (dev_id == routing_info.voice_tx_dev_id)) - return 0; - else - return -EINVAL; -} -EXPORT_SYMBOL(msm_device_is_voice); - -int msm_set_voc_route(struct msm_snddev_info *dev_info, - int stream_type, int dev_id) -{ - int rc = 0; - u32 session_mask = 0; - - mutex_lock(&session_lock); - switch (stream_type) { - case AUDIO_ROUTE_STREAM_VOICE_RX: - if (audio_dev_ctrl.voice_rx_dev) - audio_dev_ctrl.voice_rx_dev->sessions &= ~0xFF; - - if (!(dev_info->capability & SNDDEV_CAP_RX) | - !(dev_info->capability & SNDDEV_CAP_VOICE)) { - rc = -EINVAL; - break; - } - audio_dev_ctrl.voice_rx_dev = dev_info; - if (audio_dev_ctrl.voice_rx_dev) { - session_mask = - 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); - audio_dev_ctrl.voice_rx_dev->sessions |= - session_mask; - } - routing_info.voice_rx_dev_id = dev_id; - break; - case AUDIO_ROUTE_STREAM_VOICE_TX: - if (audio_dev_ctrl.voice_tx_dev) - audio_dev_ctrl.voice_tx_dev->sessions &= ~0xFF; - - if (!(dev_info->capability & SNDDEV_CAP_TX) | - !(dev_info->capability & SNDDEV_CAP_VOICE)) { - rc = -EINVAL; - break; - } - - audio_dev_ctrl.voice_tx_dev = dev_info; - if (audio_dev_ctrl.voice_rx_dev) { - session_mask = - 0x1 << (8 * ((int)AUDDEV_CLNT_VOC-1)); - audio_dev_ctrl.voice_tx_dev->sessions |= - session_mask; - } - routing_info.voice_tx_dev_id = dev_id; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&session_lock); - return rc; -} -EXPORT_SYMBOL(msm_set_voc_route); - -void msm_release_voc_thread(void) -{ - wake_up(&audio_dev_ctrl.wait); -} -EXPORT_SYMBOL(msm_release_voc_thread); - -int msm_snddev_get_enc_freq(session_id) -{ - return routing_info.enc_freq[session_id].freq; -} -EXPORT_SYMBOL(msm_snddev_get_enc_freq); - -int msm_get_voc_freq(int *tx_freq, int *rx_freq) -{ - *tx_freq = routing_info.voice_tx_sample_rate; - *rx_freq = routing_info.voice_rx_sample_rate; - return 0; -} -EXPORT_SYMBOL(msm_get_voc_freq); - -int msm_get_voc_route(u32 *rx_id, u32 *tx_id) -{ - int rc = 0; - - if (!rx_id || !tx_id) - return -EINVAL; - - mutex_lock(&session_lock); - if (!audio_dev_ctrl.voice_rx_dev || !audio_dev_ctrl.voice_tx_dev) { - rc = -ENODEV; - mutex_unlock(&session_lock); - return rc; - } - - *rx_id = audio_dev_ctrl.voice_rx_dev->acdb_id; - *tx_id = audio_dev_ctrl.voice_tx_dev->acdb_id; - - mutex_unlock(&session_lock); - - return rc; -} -EXPORT_SYMBOL(msm_get_voc_route); - -struct msm_snddev_info *audio_dev_ctrl_find_dev(u32 dev_id) -{ - struct msm_snddev_info *info; - - if ((audio_dev_ctrl.num_dev - 1) < dev_id) { - info = ERR_PTR(-ENODEV); - goto error; - } - - info = audio_dev_ctrl.devs[dev_id]; -error: - return info; - -} -EXPORT_SYMBOL(audio_dev_ctrl_find_dev); - -int snddev_voice_set_volume(int vol, int path) -{ - if (audio_dev_ctrl.voice_rx_dev - && audio_dev_ctrl.voice_tx_dev) { - if (path) - audio_dev_ctrl.voice_tx_dev->dev_volume = vol; - else - audio_dev_ctrl.voice_rx_dev->dev_volume = vol; - } else - return -ENODEV; - return 0; -} -EXPORT_SYMBOL(snddev_voice_set_volume); - -static int audio_dev_ctrl_get_devices(struct audio_dev_ctrl_state *dev_ctrl, - void __user *arg) -{ - int rc = 0; - u32 index; - struct msm_snd_device_list work_list; - struct msm_snd_device_info *work_tbl; - - if (copy_from_user(&work_list, arg, sizeof(work_list))) { - rc = -EFAULT; - goto error; - } - - if (work_list.num_dev > dev_ctrl->num_dev) { - rc = -EINVAL; - goto error; - } - - work_tbl = kmalloc(work_list.num_dev * - sizeof(struct msm_snd_device_info), GFP_KERNEL); - if (!work_tbl) { - rc = -ENOMEM; - goto error; - } - - for (index = 0; index < dev_ctrl->num_dev; index++) { - work_tbl[index].dev_id = index; - work_tbl[index].dev_cap = dev_ctrl->devs[index]->capability; - strlcpy(work_tbl[index].dev_name, dev_ctrl->devs[index]->name, - 64); - } - - if (copy_to_user((void *) (work_list.list), work_tbl, - work_list.num_dev * sizeof(struct msm_snd_device_info))) - rc = -EFAULT; - kfree(work_tbl); -error: - return rc; -} - - -int auddev_register_evt_listner(u32 evt_id, u32 clnt_type, u32 clnt_id, - void (*listner)(u32 evt_id, - union auddev_evt_data *evt_payload, - void *private_data), - void *private_data) -{ - int rc; - struct msm_snd_evt_listner *callback = NULL; - struct msm_snd_evt_listner *new_cb; - - new_cb = kzalloc(sizeof(struct msm_snd_evt_listner), GFP_KERNEL); - if (!new_cb) { - MM_ERR("No memory to add new listener node\n"); - return -ENOMEM; - } - - mutex_lock(&session_lock); - new_cb->cb_next = NULL; - new_cb->auddev_evt_listener = listner; - new_cb->evt_id = evt_id; - new_cb->clnt_type = clnt_type; - new_cb->clnt_id = clnt_id; - new_cb->private_data = private_data; - if (event.cb == NULL) { - event.cb = new_cb; - new_cb->cb_prev = NULL; - } else { - callback = event.cb; - for (; ;) { - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } - callback->cb_next = new_cb; - new_cb->cb_prev = callback; - } - event.num_listner++; - mutex_unlock(&session_lock); - rc = 0; - return rc; -} -EXPORT_SYMBOL(auddev_register_evt_listner); - -int auddev_unregister_evt_listner(u32 clnt_type, u32 clnt_id) -{ - struct msm_snd_evt_listner *callback = event.cb; - struct msm_snddev_info *info; - u32 session_mask = 0; - int i = 0; - - mutex_lock(&session_lock); - while (callback != NULL) { - if ((callback->clnt_type == clnt_type) - && (callback->clnt_id == clnt_id)) - break; - callback = callback->cb_next; - } - if (callback == NULL) { - mutex_unlock(&session_lock); - return -EINVAL; - } - - if ((callback->cb_next == NULL) && (callback->cb_prev == NULL)) - event.cb = NULL; - else if (callback->cb_next == NULL) - callback->cb_prev->cb_next = NULL; - else if (callback->cb_prev == NULL) { - callback->cb_next->cb_prev = NULL; - event.cb = callback->cb_next; - } else { - callback->cb_prev->cb_next = callback->cb_next; - callback->cb_next->cb_prev = callback->cb_prev; - } - kfree(callback); - - session_mask = (0x1 << (clnt_id)) << (8 * ((int)clnt_type-1)); - for (i = 0; i < audio_dev_ctrl.num_dev; i++) { - info = audio_dev_ctrl.devs[i]; - info->sessions &= ~session_mask; - } - if (clnt_type == AUDDEV_CLNT_ENC) - msm_set_dual_mic_config(clnt_id, 0); - mutex_unlock(&session_lock); - return 0; -} -EXPORT_SYMBOL(auddev_unregister_evt_listner); - -int msm_snddev_withdraw_freq(u32 session_id, u32 capability, u32 clnt_type) -{ - int i = 0; - struct msm_snddev_info *info; - u32 session_mask = 0; - - if ((clnt_type == AUDDEV_CLNT_VOC) && (session_id != 0)) - return -EINVAL; - if ((clnt_type == AUDDEV_CLNT_DEC) - && (session_id >= MAX_DEC_SESSIONS)) - return -EINVAL; - if ((clnt_type == AUDDEV_CLNT_ENC) - && (session_id >= MAX_ENC_SESSIONS)) - return -EINVAL; - - session_mask = (0x1 << (session_id)) << (8 * ((int)clnt_type-1)); - - for (i = 0; i < audio_dev_ctrl.num_dev; i++) { - info = audio_dev_ctrl.devs[i]; - if ((info->sessions & session_mask) - && (info->capability & capability)) { - if (!(info->sessions & ~(session_mask))) - info->set_sample_rate = 0; - } - } - if (clnt_type == AUDDEV_CLNT_DEC) - routing_info.dec_freq[session_id].freq - = 0; - else if (clnt_type == AUDDEV_CLNT_ENC) - routing_info.enc_freq[session_id].freq - = 0; - else if (capability == SNDDEV_CAP_TX) - routing_info.voice_tx_sample_rate = 0; - else - routing_info.voice_rx_sample_rate = 48000; - return 0; -} - -int msm_snddev_request_freq(int *freq, u32 session_id, - u32 capability, u32 clnt_type) -{ - int i = 0; - int rc = 0; - struct msm_snddev_info *info; - u32 set_freq; - u32 session_mask = 0; - u32 clnt_type_mask = 0; - - MM_DBG(": clnt_type 0x%08x\n", clnt_type); - - if ((clnt_type == AUDDEV_CLNT_VOC) && (session_id != 0)) - return -EINVAL; - if ((clnt_type == AUDDEV_CLNT_DEC) - && (session_id >= MAX_DEC_SESSIONS)) - return -EINVAL; - if ((clnt_type == AUDDEV_CLNT_ENC) - && (session_id >= MAX_ENC_SESSIONS)) - return -EINVAL; - session_mask = ((0x1 << session_id)) << (8 * (clnt_type-1)); - clnt_type_mask = (0xFF << (8 * (clnt_type-1))); - if (!(*freq == 8000) && !(*freq == 11025) && - !(*freq == 12000) && !(*freq == 16000) && - !(*freq == 22050) && !(*freq == 24000) && - !(*freq == 32000) && !(*freq == 44100) && - !(*freq == 48000)) - return -EINVAL; - - for (i = 0; i < audio_dev_ctrl.num_dev; i++) { - info = audio_dev_ctrl.devs[i]; - if ((info->sessions & session_mask) - && (info->capability & capability)) { - rc = 0; - if ((info->sessions & ~clnt_type_mask) - && ((*freq != 8000) && (*freq != 16000) - && (*freq != 48000))) { - if (clnt_type == AUDDEV_CLNT_ENC) { - routing_info.enc_freq[session_id].freq - = 0; - return -EPERM; - } else if (clnt_type == AUDDEV_CLNT_DEC) { - routing_info.dec_freq[session_id].freq - = 0; - return -EPERM; - } - } - if (*freq == info->set_sample_rate) { - rc = info->set_sample_rate; - continue; - } - set_freq = MAX(*freq, info->set_sample_rate); - - - if (clnt_type == AUDDEV_CLNT_DEC) - routing_info.dec_freq[session_id].freq - = set_freq; - else if (clnt_type == AUDDEV_CLNT_ENC) - routing_info.enc_freq[session_id].freq - = set_freq; - else if (capability == SNDDEV_CAP_TX) - routing_info.voice_tx_sample_rate = set_freq; - - rc = set_freq; - *freq = set_freq; - /* There is difference in device sample rate to - * requested sample rate. So update device sample rate - * and propagate sample rate change event to active - * sessions of the device. - */ - if (info->set_sample_rate != set_freq) { - info->set_sample_rate = set_freq; - if (info->opened) { - /* Ignore propagating sample rate - * change event to requested client - * session - */ - if (clnt_type == AUDDEV_CLNT_DEC) - routing_info.\ - dec_freq[session_id].evt = 1; - else if (clnt_type == AUDDEV_CLNT_ENC) - routing_info.\ - enc_freq[session_id].evt = 1; - broadcast_event(AUDDEV_EVT_FREQ_CHG, i, - SESSION_IGNORE); - set_freq = info->dev_ops.set_freq(info, - set_freq); - broadcast_event(AUDDEV_EVT_DEV_RDY, i, - SESSION_IGNORE); - } - } - } - MM_DBG("info->set_sample_rate = %d\n", info->set_sample_rate); - MM_DBG("routing_info.enc_freq.freq = %d\n", - routing_info.enc_freq[session_id].freq); - } - return rc; -} -EXPORT_SYMBOL(msm_snddev_request_freq); - -int msm_snddev_enable_sidetone(u32 dev_id, u32 enable) -{ - int rc; - struct msm_snddev_info *dev_info; - - MM_DBG("dev_id %d enable %d\n", dev_id, enable); - - dev_info = audio_dev_ctrl_find_dev(dev_id); - - if (IS_ERR(dev_info)) { - MM_ERR("bad dev_id %d\n", dev_id); - rc = -EINVAL; - } else if (!dev_info->dev_ops.enable_sidetone) { - MM_DBG("dev %d no sidetone support\n", dev_id); - rc = -EPERM; - } else - rc = dev_info->dev_ops.enable_sidetone(dev_info, enable); - - return rc; -} -EXPORT_SYMBOL(msm_snddev_enable_sidetone); - -static long audio_dev_ctrl_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int rc = 0; - struct audio_dev_ctrl_state *dev_ctrl = file->private_data; - - mutex_lock(&session_lock); - switch (cmd) { - case AUDIO_GET_NUM_SND_DEVICE: - rc = put_user(dev_ctrl->num_dev, (uint32_t __user *) arg); - break; - case AUDIO_GET_SND_DEVICES: - rc = audio_dev_ctrl_get_devices(dev_ctrl, (void __user *) arg); - break; - case AUDIO_ENABLE_SND_DEVICE: { - struct msm_snddev_info *dev_info; - u32 dev_id; - - if (get_user(dev_id, (u32 __user *) arg)) { - rc = -EFAULT; - break; - } - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) - rc = PTR_ERR(dev_info); - else { - rc = dev_info->dev_ops.open(dev_info); - if (!rc) - dev_info->opened = 1; - wake_up(&audio_dev_ctrl.wait); - } - break; - - } - - case AUDIO_DISABLE_SND_DEVICE: { - struct msm_snddev_info *dev_info; - u32 dev_id; - - if (get_user(dev_id, (u32 __user *) arg)) { - rc = -EFAULT; - break; - } - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) - rc = PTR_ERR(dev_info); - else { - rc = dev_info->dev_ops.close(dev_info); - dev_info->opened = 0; - } - break; - } - - case AUDIO_ROUTE_STREAM: { - struct msm_audio_route_config route_cfg; - struct msm_snddev_info *dev_info; - - if (copy_from_user(&route_cfg, (void __user *) arg, - sizeof(struct msm_audio_route_config))) { - rc = -EFAULT; - break; - } - MM_DBG("%s: route cfg %d %d type\n", __func__, - route_cfg.dev_id, route_cfg.stream_type); - dev_info = audio_dev_ctrl_find_dev(route_cfg.dev_id); - if (IS_ERR(dev_info)) { - MM_ERR("%s: pass invalid dev_id\n", __func__); - rc = PTR_ERR(dev_info); - break; - } - - switch (route_cfg.stream_type) { - - case AUDIO_ROUTE_STREAM_VOICE_RX: - if (!(dev_info->capability & SNDDEV_CAP_RX) | - !(dev_info->capability & SNDDEV_CAP_VOICE)) { - rc = -EINVAL; - break; - } - dev_ctrl->voice_rx_dev = dev_info; - break; - case AUDIO_ROUTE_STREAM_VOICE_TX: - if (!(dev_info->capability & SNDDEV_CAP_TX) | - !(dev_info->capability & SNDDEV_CAP_VOICE)) { - rc = -EINVAL; - break; - } - dev_ctrl->voice_tx_dev = dev_info; - break; - } - break; - } - - default: - rc = -EINVAL; - } - mutex_unlock(&session_lock); - return rc; -} - -static int audio_dev_ctrl_open(struct inode *inode, struct file *file) -{ - MM_DBG("open audio_dev_ctrl\n"); - atomic_inc(&audio_dev_ctrl.opened); - file->private_data = &audio_dev_ctrl; - return 0; -} - -static int audio_dev_ctrl_release(struct inode *inode, struct file *file) -{ - MM_DBG("release audio_dev_ctrl\n"); - atomic_dec(&audio_dev_ctrl.opened); - return 0; -} - -static const struct file_operations audio_dev_ctrl_fops = { - .owner = THIS_MODULE, - .open = audio_dev_ctrl_open, - .release = audio_dev_ctrl_release, - .unlocked_ioctl = audio_dev_ctrl_ioctl, -}; - - -struct miscdevice audio_dev_ctrl_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_dev_ctrl", - .fops = &audio_dev_ctrl_fops, -}; - -/* session id is 32 bit routing mask per device - * 0-7 for voice clients - * 8-15 for Decoder clients - * 16-23 for Encoder clients - * 24-31 Do not care - */ -void broadcast_event(u32 evt_id, u32 dev_id, u32 session_id) -{ - int clnt_id = 0, i; - union auddev_evt_data *evt_payload; - struct msm_snd_evt_listner *callback; - struct msm_snddev_info *dev_info = NULL; - u32 session_mask = 0; - static int pending_sent; - - MM_DBG(": evt_id = %d\n", evt_id); - - if ((evt_id != AUDDEV_EVT_START_VOICE) - && (evt_id != AUDDEV_EVT_END_VOICE) - && (evt_id != AUDDEV_EVT_STREAM_VOL_CHG) - && (evt_id != AUDDEV_EVT_VOICE_STATE_CHG)) { - dev_info = audio_dev_ctrl_find_dev(dev_id); - if (IS_ERR(dev_info)) { - MM_ERR("pass invalid dev_id\n"); - return; - } - } - - if (event.cb != NULL) - callback = event.cb; - else - return; - - evt_payload = kzalloc(sizeof(union auddev_evt_data), - GFP_KERNEL); - if (evt_payload == NULL) { - MM_ERR("Memory allocation for event payload failed\n"); - return; - } - - mutex_lock(&session_lock); - - if (evt_id == AUDDEV_EVT_VOICE_STATE_CHG) - routing_info.voice_state = dev_id; - - for (; ;) { - if (!(evt_id & callback->evt_id)) { - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } - clnt_id = callback->clnt_id; - memset(evt_payload, 0, sizeof(union auddev_evt_data)); - - if ((evt_id == AUDDEV_EVT_START_VOICE) - || (evt_id == AUDDEV_EVT_END_VOICE)) - goto skip_check; - if (callback->clnt_type == AUDDEV_CLNT_AUDIOCAL) - goto aud_cal; - - session_mask = (0x1 << (clnt_id)) - << (8 * ((int)callback->clnt_type-1)); - - if ((evt_id == AUDDEV_EVT_STREAM_VOL_CHG) || \ - (evt_id == AUDDEV_EVT_VOICE_STATE_CHG)) { - MM_DBG("AUDDEV_EVT_STREAM_VOL_CHG or\ - AUDDEV_EVT_VOICE_STATE_CHG\n"); - goto volume_strm; - } - - MM_DBG("dev_info->sessions = %08x\n", dev_info->sessions); - - if ((!session_id && !(dev_info->sessions & session_mask)) || - (session_id && ((dev_info->sessions & session_mask) != - session_id))) { - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } - if (evt_id == AUDDEV_EVT_DEV_CHG_VOICE) - goto voc_events; - -volume_strm: - if (callback->clnt_type == AUDDEV_CLNT_DEC) { - MM_DBG("AUDDEV_CLNT_DEC\n"); - if (evt_id == AUDDEV_EVT_STREAM_VOL_CHG) { - MM_DBG("clnt_id = %d, session_id = 0x%8x\n", - clnt_id, session_id); - if (session_mask != session_id) - goto sent_dec; - else - evt_payload->session_vol = - msm_vol_ctl.volume; - } else if (evt_id == AUDDEV_EVT_FREQ_CHG) { - if (routing_info.dec_freq[clnt_id].evt) { - routing_info.dec_freq[clnt_id].evt - = 0; - goto sent_dec; - } else if (routing_info.dec_freq[clnt_id].freq - == dev_info->set_sample_rate) - goto sent_dec; - else { - evt_payload->freq_info.sample_rate - = dev_info->set_sample_rate; - evt_payload->freq_info.dev_type - = dev_info->capability; - evt_payload->freq_info.acdb_dev_id - = dev_info->acdb_id; - } - /* Propogate device information to client */ - } else if (evt_id == AUDDEV_EVT_DEVICE_INFO) { - evt_payload->devinfo.dev_id - = dev_info->copp_id; - evt_payload->devinfo.acdb_id - = dev_info->acdb_id; - evt_payload->devinfo.dev_type = - (dev_info->capability & SNDDEV_CAP_TX) ? - SNDDEV_CAP_TX : SNDDEV_CAP_RX; - evt_payload->devinfo.sample_rate - = dev_info->sample_rate; - if (session_id == SESSION_IGNORE) - evt_payload->devinfo.sessions - = dev_info->sessions; - else - evt_payload->devinfo.sessions - = session_id; - evt_payload->devinfo.sessions = - (evt_payload->devinfo.sessions >> - ((AUDDEV_CLNT_DEC-1) * 8)); - } else if (evt_id == AUDDEV_EVT_VOICE_STATE_CHG) - evt_payload->voice_state = - routing_info.voice_state; - else - evt_payload->routing_id = dev_info->copp_id; - callback->auddev_evt_listener( - evt_id, - evt_payload, - callback->private_data); -sent_dec: - if ((evt_id != AUDDEV_EVT_STREAM_VOL_CHG) && - (evt_id != AUDDEV_EVT_VOICE_STATE_CHG)) - routing_info.dec_freq[clnt_id].freq - = dev_info->set_sample_rate; - - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } - if (callback->clnt_type == AUDDEV_CLNT_ENC) { - - MM_DBG("AUDDEV_CLNT_ENC\n"); - if (evt_id == AUDDEV_EVT_FREQ_CHG) { - if (routing_info.enc_freq[clnt_id].evt) { - routing_info.enc_freq[clnt_id].evt - = 0; - goto sent_enc; - } else { - evt_payload->freq_info.sample_rate - = dev_info->set_sample_rate; - evt_payload->freq_info.dev_type - = dev_info->capability; - evt_payload->freq_info.acdb_dev_id - = dev_info->acdb_id; - } - /* Propogate device information to client */ - } else if (evt_id == AUDDEV_EVT_DEVICE_INFO) { - evt_payload->devinfo.dev_id - = dev_info->copp_id; - evt_payload->devinfo.acdb_id - = dev_info->acdb_id; - evt_payload->devinfo.dev_type = - (dev_info->capability & SNDDEV_CAP_TX) ? - SNDDEV_CAP_TX : SNDDEV_CAP_RX; - evt_payload->devinfo.sample_rate - = dev_info->sample_rate; - if (session_id == SESSION_IGNORE) - evt_payload->devinfo.sessions - = dev_info->sessions; - else - evt_payload->devinfo.sessions - = session_id; - evt_payload->devinfo.sessions = - (evt_payload->devinfo.sessions >> - ((AUDDEV_CLNT_ENC-1) * 8)); - } else if (evt_id == AUDDEV_EVT_VOICE_STATE_CHG) - evt_payload->voice_state = - routing_info.voice_state; - else - evt_payload->routing_id = dev_info->copp_id; - callback->auddev_evt_listener( - evt_id, - evt_payload, - callback->private_data); -sent_enc: - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } -aud_cal: - if (callback->clnt_type == AUDDEV_CLNT_AUDIOCAL) { - int temp_sessions; - MM_DBG("AUDDEV_CLNT_AUDIOCAL\n"); - if (evt_id == AUDDEV_EVT_VOICE_STATE_CHG) - evt_payload->voice_state = - routing_info.voice_state; - else if (!dev_info->sessions) - goto sent_aud_cal; - else { - evt_payload->audcal_info.dev_id = - dev_info->copp_id; - evt_payload->audcal_info.acdb_id = - dev_info->acdb_id; - evt_payload->audcal_info.dev_type = - (dev_info->capability & SNDDEV_CAP_TX) ? - SNDDEV_CAP_TX : SNDDEV_CAP_RX; - evt_payload->audcal_info.sample_rate = - dev_info->set_sample_rate ? - dev_info->set_sample_rate : - dev_info->sample_rate; - } - if (evt_payload->audcal_info.dev_type == - SNDDEV_CAP_TX) { - if (session_id == SESSION_IGNORE) - temp_sessions = dev_info->sessions; - else - temp_sessions = session_id; - evt_payload->audcal_info.sessions = - (temp_sessions >> - ((AUDDEV_CLNT_ENC-1) * 8)); - } else { - if (session_id == SESSION_IGNORE) - temp_sessions = dev_info->sessions; - else - temp_sessions = session_id; - evt_payload->audcal_info.sessions = - (temp_sessions >> - ((AUDDEV_CLNT_DEC-1) * 8)); - } - callback->auddev_evt_listener( - evt_id, - evt_payload, - callback->private_data); - -sent_aud_cal: - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } -skip_check: -voc_events: - if (callback->clnt_type == AUDDEV_CLNT_VOC) { - MM_DBG("AUDDEV_CLNT_VOC\n"); - if (evt_id == AUDDEV_EVT_DEV_RLS) { - if (!pending_sent) - goto sent_voc; - else - pending_sent = 0; - } - if (evt_id == AUDDEV_EVT_REL_PENDING) - pending_sent = 1; - - if (evt_id == AUDDEV_EVT_DEVICE_VOL_MUTE_CHG) { - if (dev_info->capability & SNDDEV_CAP_TX) { - evt_payload->voc_vm_info.dev_type = - SNDDEV_CAP_TX; - evt_payload->voc_vm_info.acdb_dev_id = - dev_info->acdb_id; - evt_payload-> - voc_vm_info.dev_vm_val.mute = - routing_info.tx_mute; - } else { - evt_payload->voc_vm_info.dev_type = - SNDDEV_CAP_RX; - evt_payload->voc_vm_info.acdb_dev_id = - dev_info->acdb_id; - evt_payload-> - voc_vm_info.dev_vm_val.vol = - routing_info.voice_rx_vol; - } - } else if ((evt_id == AUDDEV_EVT_START_VOICE) - || (evt_id == AUDDEV_EVT_END_VOICE)) - memset(evt_payload, 0, - sizeof(union auddev_evt_data)); - else if (evt_id == AUDDEV_EVT_FREQ_CHG) { - if (routing_info.voice_tx_sample_rate - != dev_info->set_sample_rate) { - routing_info.voice_tx_sample_rate - = dev_info->set_sample_rate; - evt_payload->freq_info.sample_rate - = dev_info->set_sample_rate; - evt_payload->freq_info.dev_type - = dev_info->capability; - evt_payload->freq_info.acdb_dev_id - = dev_info->acdb_id; - } else - goto sent_voc; - } else if (evt_id == AUDDEV_EVT_VOICE_STATE_CHG) - evt_payload->voice_state = - routing_info.voice_state; - else { - evt_payload->voc_devinfo.dev_type = - (dev_info->capability & SNDDEV_CAP_TX) ? - SNDDEV_CAP_TX : SNDDEV_CAP_RX; - evt_payload->voc_devinfo.acdb_dev_id = - dev_info->acdb_id; - evt_payload->voc_devinfo.dev_sample = - dev_info->set_sample_rate ? - dev_info->set_sample_rate : - dev_info->sample_rate; - evt_payload->voc_devinfo.dev_id = dev_id; - if (dev_info->capability & SNDDEV_CAP_RX) { - for (i = 0; i < VOC_RX_VOL_ARRAY_NUM; - i++) { - evt_payload-> - voc_devinfo.max_rx_vol[i] = - dev_info->max_voc_rx_vol[i]; - evt_payload - ->voc_devinfo.min_rx_vol[i] = - dev_info->min_voc_rx_vol[i]; - } - } - } - callback->auddev_evt_listener( - evt_id, - evt_payload, - callback->private_data); - if (evt_id == AUDDEV_EVT_DEV_RLS) - dev_info->sessions &= ~(0xFF); -sent_voc: - if (callback->cb_next == NULL) - break; - else { - callback = callback->cb_next; - continue; - } - } - } - kfree(evt_payload); - mutex_unlock(&session_lock); -} -EXPORT_SYMBOL(broadcast_event); - - -void mixer_post_event(u32 evt_id, u32 id) -{ - - MM_DBG("evt_id = %d\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_CHG_VOICE: /* Called from Voice_route */ - broadcast_event(AUDDEV_EVT_DEV_CHG_VOICE, id, SESSION_IGNORE); - break; - case AUDDEV_EVT_DEV_RDY: - broadcast_event(AUDDEV_EVT_DEV_RDY, id, SESSION_IGNORE); - break; - case AUDDEV_EVT_DEV_RLS: - broadcast_event(AUDDEV_EVT_DEV_RLS, id, SESSION_IGNORE); - break; - case AUDDEV_EVT_REL_PENDING: - broadcast_event(AUDDEV_EVT_REL_PENDING, id, SESSION_IGNORE); - break; - case AUDDEV_EVT_DEVICE_VOL_MUTE_CHG: - broadcast_event(AUDDEV_EVT_DEVICE_VOL_MUTE_CHG, id, - SESSION_IGNORE); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - broadcast_event(AUDDEV_EVT_STREAM_VOL_CHG, id, - SESSION_IGNORE); - break; - case AUDDEV_EVT_START_VOICE: - broadcast_event(AUDDEV_EVT_START_VOICE, - id, SESSION_IGNORE); - break; - case AUDDEV_EVT_END_VOICE: - broadcast_event(AUDDEV_EVT_END_VOICE, - id, SESSION_IGNORE); - break; - case AUDDEV_EVT_FREQ_CHG: - broadcast_event(AUDDEV_EVT_FREQ_CHG, id, SESSION_IGNORE); - break; - default: - break; - } -} -EXPORT_SYMBOL(mixer_post_event); - -static int __init audio_dev_ctrl_init(void) -{ -#ifdef CONFIG_DEBUG_FS - char name[sizeof "rtc_get_device"+1]; -#endif - - init_waitqueue_head(&audio_dev_ctrl.wait); - - event.cb = NULL; - - atomic_set(&audio_dev_ctrl.opened, 0); - audio_dev_ctrl.num_dev = 0; - audio_dev_ctrl.voice_tx_dev = NULL; - audio_dev_ctrl.voice_rx_dev = NULL; - routing_info.voice_state = VOICE_STATE_INVALID; -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "rtc_get_device"); - dentry = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUGO, - NULL, NULL, &rtc_acdb_debug_fops); - if (IS_ERR(dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif - - return misc_register(&audio_dev_ctrl_misc); -} - -static void __exit audio_dev_ctrl_exit(void) -{ -#ifdef CONFIG_DEBUG_FS - if (dentry) - debugfs_remove(dentry); -#endif - -} -module_init(audio_dev_ctrl_init); -module_exit(audio_dev_ctrl_exit); - -MODULE_DESCRIPTION("MSM 7K Audio Device Control driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_evrc.c b/arch/arm/mach-msm/qdsp5v2/audio_evrc.c deleted file mode 100644 index ed946f98cad3..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_evrc.c +++ /dev/null @@ -1,1639 +0,0 @@ -/* - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This code also borrows from audio_aac.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Hold 30 packets of 24 bytes each and 14 bytes of meta in */ -#define BUFSZ 734 -#define DMASZ (BUFSZ * 2) - -#define AUDDEC_DEC_EVRC 12 - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and - and 24 bytes of meta out */ -#define PCM_BUF_MAX_COUNT 5 -/* DSP only accepts 5 buffers at most - * but support 2 buffers currently - */ -#define EVRC_DECODED_FRSZ 320 /* EVRC 20ms 8KHz mono PCM size */ - -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDEVRC_METAFIELD_MASK 0xFFFF0000 -#define AUDEVRC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDEVRC_EOS_FLG_MASK 0x01 -#define AUDEVRC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDEVRC_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDEVRC_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audevrc_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audevrc_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audevrc_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audevrc_send_data(struct audio *audio, unsigned needed); -static void audevrc_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audevrc_config_hostpcm(struct audio *audio); -static void audevrc_buffer_refresh(struct audio *audio); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audevrc_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audevrc_enable(struct audio *audio) -{ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audevrc_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -static void evrc_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audevrc_disable(struct audio *audio) -{ - int rc = 0; - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ - -static void audevrc_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr - == payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audevrc_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audevrc_send_data(audio, 1); - break; - case AUDPLAY_MSG_BUFFER_UPDATE: - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_update_pcm_buf_entry(audio, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audevrc_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audevrc_config_hostpcm(audio); - audevrc_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK\n"); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audevrc_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_evrc = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_EVRC; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_evrc cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = sizeof(cmd); - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDEVRC_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audevrc_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audevrc_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audevrc_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audevrc_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audevrc_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audevrc_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audevrc_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audevrc_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audevrc_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audevrc_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audevrc_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - - -static long audevrc_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audevrc_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audevrc_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audevrc_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audevrc_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audevrc_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audevrc_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audevrc_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audevrc_disable(audio); - audio->stopped = 1; - audevrc_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audevrc_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - rc = 0; - MM_DBG("AUDIO_SET_CONFIG applicable only \ - for meta field configuration\n"); - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * - config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read" - " phy address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audevrc_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audevrc_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - if (!audio->pcm_feedback) { - return 0; - /* PCM feedback is not enabled. Nothing to read */ - } - mutex_lock(&audio->read_lock); - MM_DBG("\n"); /* Macro prints the file name and function */ - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - MM_DBG("wait terminated \n"); - if (rc < 0) - break; - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - * not know frame size, read count must be greater or - * equal to size of PCM samples - */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", - (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment - */ - - } - } - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audevrc_buffer_refresh(audio); - } - mutex_unlock(&audio->read_lock); - if (buf > start) - rc = buf - start; - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audevrc_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audevrc_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audevrc_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - unsigned short mfield_size = 0; - int rc = 0, eos_condition = AUDEVRC_EOS_NONE; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, - mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDEVRC_EOS_FLG_OFFSET] & - AUDEVRC_EOS_FLG_MASK) { - MM_DBG("eos set\n"); - eos_condition = AUDEVRC_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDEVRC_EOS_FLG_OFFSET] &= - ~AUDEVRC_EOS_FLG_MASK; - } - /* Check EOS to see if */ - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = xfer + mfield_size; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - audevrc_send_data(audio, 0); - } - if (eos_condition == AUDEVRC_EOS_SET) - rc = audevrc_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audevrc_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audevrc_disable(audio); - audevrc_flush(audio); - audevrc_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audevrc_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audevrc_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audevrc_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audevrc_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audevrc_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audevrc_suspend(struct early_suspend *h) -{ - struct audevrc_suspend_ctl *ctl = - container_of(h, struct audevrc_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audevrc_resume(struct early_suspend *h) -{ - struct audevrc_suspend_ctl *ctl = - container_of(h, struct audevrc_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audevrc_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audevrc_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audevrc_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audevrc_debug_fops = { - .read = audevrc_debug_read, - .open = audevrc_debug_open, -}; -#endif - -static int audevrc_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audevrc_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_evrc_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_EVRC; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (!audio->phys) { - MM_ERR("could not allocate write buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else { - audio->map_v_write = ioremap(audio->phys, DMASZ); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("failed to map write physical address, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_evrc, audio); - - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x3FFF; - - audevrc_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - evrc_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_evrc_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audevrc_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audevrc_resume; - audio->suspend_ctl.node.suspend = audevrc_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDEVRC_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audevrc_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_evrc_fops = { - .owner = THIS_MODULE, - .open = audevrc_open, - .release = audevrc_release, - .read = audevrc_read, - .write = audevrc_write, - .unlocked_ioctl = audevrc_ioctl, - .fsync = audevrc_fsync, -}; - -struct miscdevice audio_evrc_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc", - .fops = &audio_evrc_fops, -}; - -static int __init audevrc_init(void) -{ - return misc_register(&audio_evrc_misc); - -} - -static void __exit audevrc_exit(void) -{ - misc_deregister(&audio_evrc_misc); -} - -module_init(audevrc_init); -module_exit(audevrc_exit); - -MODULE_DESCRIPTION("MSM EVRC driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c b/arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c deleted file mode 100644 index 47e47d2fe56d..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_evrc_in.c +++ /dev/null @@ -1,1586 +0,0 @@ -/* - * evrc audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define META_OUT_SIZE 24 -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define EVRC_FRAME_SIZE 36 /* 36 bytes data */ -#define FRAME_SIZE (22 * 2) /* 36 bytes data */ - /* 36 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (EVRC_FRAME_SIZE + META_OUT_SIZE) -#define DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM 2 -#define OUT_BUFFER_SIZE (4 * 1024 + META_OUT_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - -#define AUDPREPROC_EVRC_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer*/ -#define AUDPREPROC_EVRC_EOS_FLG_MASK 0x01 -#define AUDPREPROC_EVRC_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_EVRC_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - struct audrec_session_info session_info; /*audrec session info*/ - - /* configuration to use on next enable */ - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t enc_type; - - struct msm_audio_evrc_enc_config cfg; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; - - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; - uint32_t in_call; - uint32_t dev_cnt; - int voice_state; - spinlock_t dev_lock; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_read; - void *map_v_write; - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - char *build_id; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct evrc_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -/* DSP command send functions */ -static int audevrc_in_enc_config(struct audio_in *audio, int enable); -static int audevrc_in_param_config(struct audio_in *audio); -static int audevrc_in_mem_config(struct audio_in *audio); -static int audevrc_in_record_config(struct audio_in *audio, int enable); -static int audevrc_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); - -static void audevrc_in_get_dsp_frames(struct audio_in *audio); -static int audpcm_config(struct audio_in *audio); -static void audevrc_out_flush(struct audio_in *audio); -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio); -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed); -static void audevrc_nt_in_get_dsp_frames(struct audio_in *audio); - -static void audevrc_in_flush(struct audio_in *audio); - -static void evrc_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_in *audio = (struct audio_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - if (!audio->in_call) - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1) && - (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) - audevrc_in_record_config(audio, 1); - } - break; - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - if (!audio->in_call) - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((!audio->running) || (!audio->enabled)) - break; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - /* Turn of as per source */ - if (audio->source) - audevrc_in_record_config(audio, 1); - else - /* Turn off all */ - audevrc_in_record_config(audio, 0); - } - } - break; - case AUDDEV_EVT_VOICE_STATE_CHG: { - MM_DBG("AUDDEV_EVT_VOICE_STATE_CHG, state = %d\n", - evt_payload->voice_state); - audio->voice_state = evt_payload->voice_state; - if (audio->in_call && audio->running && - (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - if (audio->voice_state == VOICE_STATE_INCALL) - audevrc_in_record_config(audio, 1); - else if (audio->voice_state == VOICE_STATE_OFFCALL) { - audevrc_in_record_config(audio, 0); - wake_up(&audio->wait); - } - } - - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) { - if(audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audpreproc_cmd_cfg_routing_mode(audio); - } else { - audevrc_in_param_config(audio); - } - } else { /* Encoder disable success */ - audio->running = 0; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audevrc_in_record_config(audio, 0); - else - wake_up(&audio->wait_enable); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audevrc_in_mem_config(audio); - else - audpcm_config(audio); - break; - } - case AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG: { - struct audpreproc_cmd_routing_mode_done\ - *routing_cfg_done_msg = msg; - if (routing_cfg_done_msg->configuration == 0) { - MM_INFO("routing configuration failed\n"); - audio->running = 0; - } else - audevrc_in_param_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG \n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if ((!audio->in_call && (audio->dev_cnt > 0)) || - (audio->in_call && - (audio->voice_state \ - == VOICE_STATE_INCALL))) - audevrc_in_record_config(audio, 1); - } else { - audpreproc_pcm_send_data(audio, 1); - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - wake_up(&audio->write_wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - audevrc_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audpreproc_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_ERR("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audevrc_in_mem_config(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audevrc_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_EOS_ACK_MSG: { - MM_DBG("eos ack recieved\n"); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event:module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void audevrc_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audevrc_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audevrc_nt_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - - -struct msm_adsp_ops audrec_evrc_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audpreproc_pcm_buffer_ptr_refresh(struct audio_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == META_OUT_SIZE) - len = len / 2; - else - len = (len + META_OUT_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpcm_config(struct audio_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = audio->samp_rate; - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ROUTING_MODE; - cmd.stream_id = audio->enc_id; - if (audio->mode == MSM_ADSP_ENC_MODE_NON_TUNNEL) - cmd.routing_mode = 1; - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - - - -static int audevrc_in_enc_config(struct audio_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG_2 command"); - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG command"); - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audevrc_in_param_config(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_parm_cfg_evrc cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.enc_min_rate = audio->cfg.min_bit_rate; - cmd.enc_max_rate = audio->cfg.max_bit_rate; - cmd.rate_modulation_cmd = 0; /* Default set to 0 */ - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int audevrc_in_record_config(struct audio_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & - INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - MM_DBG("stream_id %x destination_activity %x \ - source_mix_mask %x pipe_id %x",\ - cmd.stream_id, cmd.destination_activity, - cmd.source_mix_mask, cmd.pipe_id); - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audevrc_in_mem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - MM_DBG("audio->phys = %x\n", audio->phys); - /* prepare buffer pointers: - * T:36 bytes evrc packet + 4 halfword header - * NT:36 bytes evrc packet + 12 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audio->in[n].data = data + 4; - data += (FRAME_SIZE/2); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } else { - audio->in[n].data = data + 12; - data += ((EVRC_FRAME_SIZE) / 2) + 12; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 24)); - } - } - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int audevrc_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} -static int audevrc_flush_command(struct audio_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audevrc_in_enable(struct audio_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - audevrc_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audevrc_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - audevrc_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void audevrc_ioport_reset(struct audio_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audevrc_in_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audevrc_out_flush(audio); - mutex_unlock(&audio->read_lock); -} - -static void audevrc_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audevrc_out_flush(struct audio_in *audio) -{ - int i; - - audio->out_head = 0; - audio->out_tail = 0; - audio->out_count = 0; - for (i = 0; i < OUT_FRAME_NUM; i++) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } -} - -/* ------------------- device --------------------- */ -static long audevrc_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - freq = 48000; - MM_DBG("AUDIO_START\n"); - if (audio->in_call && (audio->voice_state != - VOICE_STATE_INCALL)) { - rc = -EPERM; - break; - } - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d\n", freq); - if (rc < 0) { - MM_DBG(" Sample rate can not be set, return code %d\n", - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = audio->samp_rate; - audpreproc_update_audrec_info(&audio->session_info); - rc = audevrc_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audevrc_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audevrc_ioport_reset(audio); - if (audio->running) { - audevrc_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (EVRC_FRAME_SIZE + 14)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_EVRC_ENC_CONFIG: { - if (copy_to_user((void *) arg, &audio->cfg, sizeof(audio->cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_EVRC_ENC_CONFIG: { - struct msm_audio_evrc_enc_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - MM_DBG("0X%8x, 0x%8x, 0x%8x\n", cfg.min_bit_rate, - cfg.max_bit_rate, cfg.cdma_rate); - if (cfg.min_bit_rate > CDMA_RATE_FULL || \ - cfg.min_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid min bitrate\n"); - rc = -EFAULT; - break; - } - if (cfg.max_bit_rate > CDMA_RATE_FULL || \ - cfg.max_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid max bitrate\n"); - rc = -EFAULT; - break; - } - /* Recording Does not support Erase and Blank */ - if (cfg.cdma_rate > CDMA_RATE_FULL || - cfg.cdma_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid qcelp cdma rate\n"); - rc = -EFAULT; - break; - } - memcpy(&audio->cfg, &cfg, sizeof(cfg)); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - cfg.sample_rate = audio->samp_rate; - cfg.channel_count = audio->channel_mode; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_INCALL: { - struct msm_voicerec_mode cfg; - unsigned long flags; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.rec_mode != VOC_REC_BOTH && - cfg.rec_mode != VOC_REC_UPLINK && - cfg.rec_mode != VOC_REC_DOWNLINK) { - MM_ERR("invalid rec_mode\n"); - rc = -EINVAL; - break; - } else { - spin_lock_irqsave(&audio->dev_lock, flags); - if (cfg.rec_mode == VOC_REC_UPLINK) - audio->source = \ - VOICE_UL_SOURCE_MIX_MASK; - else if (cfg.rec_mode == VOC_REC_DOWNLINK) - audio->source = \ - VOICE_DL_SOURCE_MIX_MASK; - else - audio->source = \ - VOICE_DL_SOURCE_MIX_MASK | - VOICE_UL_SOURCE_MIX_MASK ; - audio->in_call = 1; - spin_unlock_irqrestore(&audio->dev_lock, flags); - } - } - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audevrc_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct evrc_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG("count = %d\n", count); - memset(&meta_field, 0, sizeof(meta_field)); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush || - ((audio->mode == MSM_AUD_ENC_MODE_TUNNEL) && - audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL))); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } else if ((audio->mode == MSM_AUD_ENC_MODE_TUNNEL) && - audio->in_call && audio->running && - (audio->voice_state \ - == VOICE_STATE_OFFCALL)) { - MM_DBG("Not Permitted Voice Terminated\n"); - rc = -EPERM; /* Voice Call stopped */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct evrc_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct evrc_encoded_meta_out); - if (copy_to_user((char *)start, (char *)&meta_field, - sizeof(struct evrc_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct evrc_encoded_meta_out); - count -= sizeof(struct evrc_encoded_meta_out); - } - if (count >= size) { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command \ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audevrc_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audpreproc_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - - -static int audevrc_in_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) - -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - - int audpreproc_evrc_process_eos(struct audio_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audpreproc_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audevrc_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_EVRC_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = 0; - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_EVRC_EOS_FLG_OFFSET] & - AUDPREPROC_EVRC_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_EVRC_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_EVRC_EOS_FLG_OFFSET] &= - ~AUDPREPROC_EVRC_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audpreproc_pcm_send_data(audio, 0); - else { - audpreproc_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_EVRC_EOS_SET) - rc = audpreproc_evrc_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audevrc_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audio->in_call = 0; - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audevrc_in_disable(audio); - audevrc_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->data = NULL; - } - if (audio->out_data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->out_data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_in the_audio_evrc_in; -static int audevrc_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_evrc_in; - int rc; - int encid; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", DMASZ); - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_read; - - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (EVRC_FRAME_SIZE + 14); - else - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = ENC_TYPE_EVRC | audio->mode; - audio->samp_rate = 8000; - audio->channel_mode = AUDREC_CMD_MODE_MONO; - audio->cfg.cdma_rate = CDMA_RATE_FULL; - audio->cfg.min_bit_rate = CDMA_RATE_FULL; - audio->cfg.max_bit_rate = CDMA_RATE_FULL; - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_evrc_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audevrc_in_flush(audio); - audevrc_out_flush(audio); - - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_alloc_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_VOICE_STATE_CHG; - - audio->voice_state = msm_get_voice_state(); - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - evrc_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->mfield = META_OUT_SIZE; - file->private_data = audio; - audio->opened = 1; - audio->out_frame_cnt++; - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); - -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); -input_buff_map_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = audevrc_in_open, - .release = audevrc_in_release, - .read = audevrc_in_read, - .write = audevrc_in_write, - .fsync = audevrc_in_fsync, - .unlocked_ioctl = audevrc_in_ioctl, -}; - -struct miscdevice audio_evrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &audio_in_fops, -}; - -static int __init audevrc_in_init(void) -{ - mutex_init(&the_audio_evrc_in.lock); - mutex_init(&the_audio_evrc_in.read_lock); - spin_lock_init(&the_audio_evrc_in.dsp_lock); - spin_lock_init(&the_audio_evrc_in.dev_lock); - init_waitqueue_head(&the_audio_evrc_in.wait); - init_waitqueue_head(&the_audio_evrc_in.wait_enable); - mutex_init(&the_audio_evrc_in.write_lock); - init_waitqueue_head(&the_audio_evrc_in.write_wait); - return misc_register(&audio_evrc_in_misc); -} - -device_initcall(audevrc_in_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_fm.c b/arch/arm/mach-msm/qdsp5v2/audio_fm.c deleted file mode 100644 index 27548ac1a2e8..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_fm.c +++ /dev/null @@ -1,357 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5v2/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SESSION_ID_FM 6 -#define FM_ENABLE 0xFFFF -#define FM_DISABLE 0x0 -#define FM_COPP 0x2 -/* Macro specifies maximum FM routing - possible */ -#define FM_MAX_RX_ROUTE 0x2 - -struct fm_rx_calib_gain { - uint16_t device_id; - struct auddev_evt_devinfo dev_details; - struct acdb_calib_gain_rx calib_rx; -}; - -struct audio { - struct mutex lock; - - int opened; - int enabled; - int running; - - uint16_t dec_id; - uint16_t source; - uint16_t fm_source; - uint16_t fm_mask; - uint32_t device_events; - uint16_t volume; - struct fm_rx_calib_gain fm_calibration_rx[FM_MAX_RX_ROUTE]; -}; - -static struct audio fm_audio; - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - int rc = 0; - if (audio->enabled) - return 0; - - MM_DBG("fm mask= %08x fm_source = %08x\n", - audio->fm_mask, audio->fm_source); - if (audio->fm_mask && audio->fm_source) { - rc = afe_config_fm_codec(FM_ENABLE, audio->fm_mask); - if (!rc) - audio->running = 1; - /* Routed to icodec rx path */ - if ((audio->fm_mask & AFE_HW_PATH_CODEC_RX) == - AFE_HW_PATH_CODEC_RX) { - afe_config_fm_calibration_gain( - audio->fm_calibration_rx[0].device_id, - audio->fm_calibration_rx[0].calib_rx.audppcalgain); - } - /* Routed to aux codec rx path */ - if ((audio->fm_mask & AFE_HW_PATH_AUXPCM_RX) == - AFE_HW_PATH_AUXPCM_RX){ - afe_config_fm_calibration_gain( - audio->fm_calibration_rx[1].device_id, - audio->fm_calibration_rx[1].calib_rx.audppcalgain); - } - } - - audio->enabled = 1; - return rc; -} - -static void fm_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - struct auddev_evt_devinfo *devinfo = - (struct auddev_evt_devinfo *)evt_payload; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - if (evt_payload->routing_id == FM_COPP) - audio->fm_source = 1; - else - audio->source = (0x1 << evt_payload->routing_id); - - if (audio->source & 0x1) - audio->fm_mask = 0x1; - else if (audio->source & 0x2) - audio->fm_mask = 0x3; - else - audio->fm_mask = 0x0; - - if (!audio->enabled - || !audio->fm_mask - || !audio->fm_source) - break; - else { - afe_config_fm_codec(FM_ENABLE, audio->fm_mask); - audio->running = 1; - } - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - if (evt_payload->routing_id == FM_COPP) - audio->fm_source = 0; - else - audio->source &= ~(0x1 << evt_payload->routing_id); - - if (audio->source & 0x1) - audio->fm_mask = 0x1; - else if (audio->source & 0x2) - audio->fm_mask = 0x3; - else - audio->fm_mask = 0x0; - - if (audio->running - && (!audio->fm_mask || !audio->fm_source)) { - afe_config_fm_codec(FM_DISABLE, audio->fm_mask); - audio->running = 0; - } - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol \n"); - audio->volume = evt_payload->session_vol; - afe_config_fm_volume(audio->volume); - break; - case AUDDEV_EVT_DEVICE_INFO:{ - struct acdb_get_block get_block; - int rc = 0; - MM_DBG(":AUDDEV_EVT_DEVICE_INFO\n"); - MM_DBG("sample_rate = %d\n", devinfo->sample_rate); - MM_DBG("acdb_id = %d\n", devinfo->acdb_id); - /* Applucable only for icodec rx and aux codec rx path - and fm stream routed to it */ - if (((devinfo->dev_id == 0x00) || (devinfo->dev_id == 0x01)) && - (devinfo->sessions && (1 << audio->dec_id))) { - /* Query ACDB driver for calib gain, only if difference - in device */ - if ((audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.acdb_id != devinfo->acdb_id) || - (audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.sample_rate != - devinfo->sample_rate)) { - audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.dev_id = devinfo->dev_id; - audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.sample_rate = - devinfo->sample_rate; - audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.dev_type = - devinfo->dev_type; - audio->fm_calibration_rx[devinfo->dev_id]. - dev_details.sessions = - devinfo->sessions; - /* Query ACDB driver for calibration gain */ - get_block.acdb_id = devinfo->acdb_id; - get_block.sample_rate_id = devinfo->sample_rate; - get_block.interface_id = - IID_AUDIO_CALIBRATION_GAIN_RX; - get_block.algorithm_block_id = - ABID_AUDIO_CALIBRATION_GAIN_RX; - get_block.total_bytes = - sizeof(struct acdb_calib_gain_rx); - get_block.buf_ptr = (u32 *) - &audio->fm_calibration_rx[devinfo->dev_id]. - calib_rx; - - rc = acdb_get_calibration_data(&get_block); - if (rc < 0) { - MM_ERR("Unable to get calibration"\ - "gain\n"); - /* Set to unity incase of error */ - audio->\ - fm_calibration_rx[devinfo->dev_id]. - calib_rx.audppcalgain = 0x2000; - } else - MM_DBG("calibration gain = 0x%8x\n", - *(get_block.buf_ptr)); - } - if (audio->running) { - afe_config_fm_calibration_gain( - audio->fm_calibration_rx[devinfo->dev_id]. - device_id, - audio->fm_calibration_rx[devinfo->dev_id]. - calib_rx.audppcalgain); - } - } - break; - } - default: - MM_DBG(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - return afe_config_fm_codec(FM_DISABLE, audio->source); -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - - MM_DBG("cmd = %d\n", cmd); - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->running = 0; - audio->enabled = 0; - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_DBG("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio->running = 0; - audio->enabled = 0; - audio->opened = 0; - mutex_unlock(&audio->lock); - return 0; -} - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = &fm_audio; - int rc = 0; - - - if (audio->opened) - return -EPERM; - - /* Allocate the decoder */ - audio->dec_id = SESSION_ID_FM; - - audio->running = 0; - audio->fm_source = 0; - audio->fm_mask = 0; - - /* Initialize the calibration gain structure */ - audio->fm_calibration_rx[0].device_id = AFE_HW_PATH_CODEC_RX; - audio->fm_calibration_rx[1].device_id = AFE_HW_PATH_AUXPCM_RX; - audio->fm_calibration_rx[0].calib_rx.audppcalgain = 0x2000; - audio->fm_calibration_rx[1].calib_rx.audppcalgain = 0x2000; - audio->fm_calibration_rx[0].dev_details.acdb_id = PSEUDO_ACDB_ID; - audio->fm_calibration_rx[1].dev_details.acdb_id = PSEUDO_ACDB_ID; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG| - AUDDEV_EVT_DEVICE_INFO; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - fm_listner, - (void *)audio); - - if (rc) { - MM_ERR("%s: failed to register listnet\n", __func__); - goto event_err; - } - - audio->opened = 1; - file->private_data = audio; - -event_err: - return rc; -} - -static const struct file_operations audio_fm_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .unlocked_ioctl = audio_ioctl, -}; - -struct miscdevice audio_fm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_fm", - .fops = &audio_fm_fops, -}; - -static int __init audio_init(void) -{ - struct audio *audio = &fm_audio; - - mutex_init(&audio->lock); - return misc_register(&audio_fm_misc); -} - -device_initcall(audio_init); - -MODULE_DESCRIPTION("MSM FM driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_interct.c b/arch/arm/mach-msm/qdsp5v2/audio_interct.c deleted file mode 100644 index 4e4c5d621dee..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_interct.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright (c) 2009, 2011 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include - -#define AUDIO_INTERCT_ADSPLPA_WBRX_SEL_BMSK 0x4 -#define AUDIO_INTERCT_ADSPLPA_WBRX_SEL_SHFT 0x2 -#define AUDIO_INTERCT_ADSPAV_RPCMI2SRX_SEL_BMSK 0x10 -#define AUDIO_INTERCT_ADSPAV_RPCMI2SRX_SEL_SHFT 0x4 -#define AUDIO_INTERCT_ADSPAV_TPCMI2STX_SEL_BMSK 0x40 -#define AUDIO_INTERCT_ADSPAV_TPCMI2STX_SEL_SHFT 0x6 -#define AUDIO_INTERCT_ADSPAV_AUX_REGSEL_BMSK 0x100 -#define AUDIO_INTERCT_ADSPAV_AUX_REGSEL_SHFT 0x8 - -/* Should look to protect this register */ -void __iomem *aictl_reg; - -void audio_interct_codec(u32 source) -{ - u32 reg_val; - - reg_val = readl(aictl_reg); - reg_val = (reg_val & ~AUDIO_INTERCT_ADSPLPA_WBRX_SEL_BMSK) | - (source << AUDIO_INTERCT_ADSPLPA_WBRX_SEL_SHFT); - writel(reg_val, aictl_reg); - mb(); -} -EXPORT_SYMBOL(audio_interct_codec); - -void audio_interct_aux_regsel(u32 source) -{ - u32 reg_val; - - reg_val = readl(aictl_reg); - reg_val = (reg_val & ~AUDIO_INTERCT_ADSPAV_AUX_REGSEL_BMSK) | - (source << AUDIO_INTERCT_ADSPAV_AUX_REGSEL_SHFT); - writel(reg_val, aictl_reg); - mb(); -} -EXPORT_SYMBOL(audio_interct_aux_regsel); - -void audio_interct_tpcm_source(u32 source) -{ - u32 reg_val; - - reg_val = readl(aictl_reg); - reg_val = (reg_val & ~AUDIO_INTERCT_ADSPAV_TPCMI2STX_SEL_BMSK) | - (source << AUDIO_INTERCT_ADSPAV_TPCMI2STX_SEL_SHFT); - writel(reg_val, aictl_reg); - mb(); -} -EXPORT_SYMBOL(audio_interct_tpcm_source); - -void audio_interct_rpcm_source(u32 source) -{ - u32 reg_val; - - reg_val = readl(aictl_reg); - reg_val = (reg_val & ~AUDIO_INTERCT_ADSPAV_RPCMI2SRX_SEL_BMSK) | - (source << AUDIO_INTERCT_ADSPAV_RPCMI2SRX_SEL_SHFT); - writel(reg_val, aictl_reg); - mb(); -} -EXPORT_SYMBOL(audio_interct_rpcm_source); - -static int audio_interct_probe(struct platform_device *pdev) -{ - int rc = 0; - struct resource *aictl_mem; - - aictl_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!aictl_mem) { - rc = -ENODEV; - goto error; - } - aictl_reg = ioremap(aictl_mem->start, - (aictl_mem->end - aictl_mem->start) + 1); -error: - return rc; -} - - -static int audio_interct_remove(struct platform_device *pdev) -{ - iounmap(aictl_reg); - return 0; -} - -static struct platform_driver audio_interct_driver = { - .probe = audio_interct_probe, - .remove = audio_interct_remove, - .driver = { - .name = "audio_interct", - .owner = THIS_MODULE, - }, -}; - -static int __init audio_interct_init(void) -{ - return platform_driver_register(&audio_interct_driver); -} - -static void __exit audio_interct_exit(void) -{ - platform_driver_unregister(&audio_interct_driver); -} - -module_init(audio_interct_init); -module_exit(audio_interct_exit); - -MODULE_DESCRIPTION("MSM Audio Interconnect driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_lpa.c b/arch/arm/mach-msm/qdsp5v2/audio_lpa.c deleted file mode 100644 index ee84e8e4d32c..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_lpa.c +++ /dev/null @@ -1,1780 +0,0 @@ -/* low power audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 -#define ADRV_STATUS_PAUSE 0x00000010 - -#define DEVICE_SWITCH_STATE_NONE 0 -#define DEVICE_SWITCH_STATE_PENDING 1 -#define DEVICE_SWITCH_STATE_READY 2 -#define DEVICE_SWITCH_STATE_COMPLETE 3 - -#define AUDDEC_DEC_PCM 0 -#define AUDDEC_DEC_MP3 2 - -#define PCM_BUFSZ_MIN 4800 /* Hold one stereo MP3 frame */ - -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDMP3_METAFIELD_MASK 0xFFFF0000 -#define AUDMP3_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDMP3_EOS_FLG_MASK 0x01 -#define AUDMP3_EOS_NONE 0x0 /* No EOS detected */ -#define AUDMP3_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDLPA_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define MASK_32BITS 0xFFFFFFFF - -#define MAX_BUF 4 -#define BUFSZ (524288) - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -/* payload[7]; -1 indicates error, 0 indicates no error */ -#define CHECK_ERROR(v) (!v[7]) - -/* calculates avsync_info from payload */ -#define CALCULATE_AVSYNC_FROM_PAYLOAD(v) ((uint64_t)((((uint64_t)v[10]) \ - << 32) | (v[11] & MASK_32BITS))) - -/* calculates avsync_info from avsync_info stored in audio */ -#define CALCULATE_AVSYNC(v) \ - ((uint64_t)((((uint64_t)v[4]) << 32) | \ - (v[5] << 16) | (v[6]))) - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audlpa_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audlpa_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audlpa_ion_region { - struct list_head list; - struct ion_handle *handle; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audlpa_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audlpa_dec { - char *name; - int dec_attrb; - long (*ioctl)(struct file *, unsigned int, unsigned long); - void (*adec_params)(struct audio *); -}; - -struct audlpa_dec audlpa_decs[] = { - {"msm_mp3_lp", AUDDEC_DEC_MP3, &mp3_ioctl, &audpp_cmd_cfg_mp3_params}, - {"msm_pcm_lp_dec", AUDDEC_DEC_PCM, &pcm_ioctl, - &audpp_cmd_cfg_pcm_params}, -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audlpa_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); -static void audlpa_async_send_data(struct audio *audio, unsigned needed, - uint32_t *payload); - -static void lpa_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY routing id = %d\n", - evt_payload->routing_id); - /* Do not select HLB path for icodec, if there is already COPP3 - * routing exists. DSP can not support concurrency of HLB path - * and COPP3 routing as it involves different buffer Path */ - if (((0x1 << evt_payload->routing_id) == AUDPP_MIXER_ICODEC) && - !(audio->source & AUDPP_MIXER_3)) { - audio->source |= AUDPP_MIXER_HLB; - MM_DBG("mixer_mask modified for low-power audio\n"); - } else - audio->source |= (0x1 << evt_payload->routing_id); - - MM_DBG("running = %d, enabled = %d, source = 0x%x\n", - audio->running, audio->enabled, audio->source); - if (audio->running == 1 && audio->enabled == 1) { - audpp_route_stream(audio->dec_id, audio->source); - if (audio->source & AUDPP_MIXER_HLB) { - audpp_dsp_set_vol_pan( - AUDPP_CMD_CFG_DEV_MIXER_ID_4, - &audio->vol_pan, - COPP); - /*restore the POPP gain to 0x2000 - this is needed to avoid use cases - where POPP volume is lowered during - NON HLB playback, when device moved - from NON HLB to HLB POPP is not - disabled but POPP gain will be retained - as the old one which result - in lower volume*/ - audio->vol_pan.volume = 0x2000; - audpp_dsp_set_vol_pan( - audio->dec_id, - &audio->vol_pan, POPP); - } else if (audio->source & AUDPP_MIXER_NONHLB) - audpp_dsp_set_vol_pan( - audio->dec_id, &audio->vol_pan, POPP); - if (audio->device_switch == DEVICE_SWITCH_STATE_READY) { - audio->wflush = 1; - audio->device_switch = - DEVICE_SWITCH_STATE_COMPLETE; - audpp_flush(audio->dec_id); - if (wait_event_interruptible(audio->write_wait, - !audio->wflush) < 0) - MM_DBG("AUDIO_FLUSH interrupted\n"); - - if (audio->wflush == 0) { - if (audio->drv_status & - ADRV_STATUS_PAUSE) { - if (audpp_pause(audio->dec_id, - 1)) - MM_DBG("audpp_pause" - "failed\n"); - } - } - } - } - break; - case AUDDEV_EVT_REL_PENDING: - MM_DBG(":AUDDEV_EVT_REL_PENDING\n"); - /* If route to multiple devices like COPP3, not need to - * handle device switch */ - if ((audio->running == 1) && (audio->enabled == 1) && - !(audio->source & AUDPP_MIXER_3)) { - if (audio->device_switch == DEVICE_SWITCH_STATE_NONE) { - if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { - if (audpp_pause(audio->dec_id, 1)) - MM_DBG("audpp pause failed\n"); - } - audio->device_switch = - DEVICE_SWITCH_STATE_PENDING; - audio->avsync_flag = 0; - if (audpp_query_avsync(audio->dec_id) < 0) - MM_DBG("query avsync failed\n"); - - if (wait_event_interruptible_timeout - (audio->avsync_wait, audio->avsync_flag, - msecs_to_jiffies(AVSYNC_EVENT_TIMEOUT)) < 0) - MM_DBG("AV sync timeout failed\n"); - if (audio->avsync_flag == 1) { - if (audio->device_switch == - DEVICE_SWITCH_STATE_PENDING) - audio->device_switch = - DEVICE_SWITCH_STATE_READY; - } - } - } - break; - case AUDDEV_EVT_DEV_RLS: - /* If there is already COPP3 routing exists. icodec route - * was not having HLB path. */ - MM_DBG(":AUDDEV_EVT_DEV_RLS routing id = %d\n", - evt_payload->routing_id); - if (((0x1 << evt_payload->routing_id) == AUDPP_MIXER_ICODEC) && - !(audio->source & AUDPP_MIXER_3)) - audio->source &= ~AUDPP_MIXER_HLB; - else - audio->source &= ~(0x1 << evt_payload->routing_id); - MM_DBG("running = %d, enabled = %d, source = 0x%x\n", - audio->running, audio->enabled, audio->source); - - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG("\n:AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n" - "running = %d, enabled = %d, source = 0x%x", - audio->vol_pan.volume, audio->running, - audio->enabled, audio->source); - if (audio->running == 1 && audio->enabled == 1) { - if (audio->source & AUDPP_MIXER_HLB) - audpp_dsp_set_vol_pan( - AUDPP_CMD_CFG_DEV_MIXER_ID_4, - &audio->vol_pan, COPP); - else if (audio->source & AUDPP_MIXER_NONHLB) - audpp_dsp_set_vol_pan( - audio->dec_id, &audio->vol_pan, POPP); - } - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audlpa_async_send_data(audio, 1, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - default: - MM_ERR("unexpected message from decoder\n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - audio->codec_ops.adec_params(audio); - break; - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play\n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - case AUDPP_DEC_STATUS_EOS: - MM_DBG("decoder status: EOS\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - default: - MM_ERR("unknown decoder status\n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - MM_DBG("source = 0x%x\n", audio->source); - if (audio->source & AUDPP_MIXER_HLB) - audpp_dsp_set_vol_pan( - AUDPP_CMD_CFG_DEV_MIXER_ID_4, - &audio->vol_pan, - COPP); - else if (audio->source & AUDPP_MIXER_NONHLB) - audpp_dsp_set_vol_pan( - audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audio->codec_ops.adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_lpa = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | - audlpa_decs[audio->minor_no].dec_attrb; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audlpa_async_send_buffer(struct audio *audio) -{ - int found = 0; - uint64_t temp = 0; - struct audplay_cmd_bitstream_data_avail cmd; - struct audlpa_buffer_node *next_buf = NULL; - - temp = audio->bytecount_head; - if (audio->device_switch == DEVICE_SWITCH_STATE_NONE) { - list_for_each_entry(next_buf, &audio->out_queue, list) { - if (temp == audio->bytecount_given) { - found = 1; - break; - } else - temp += next_buf->buf.data_len; - } - if (next_buf && found) { - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - audio->bytecount_given += next_buf->buf.data_len; - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } else if (audio->device_switch == DEVICE_SWITCH_STATE_COMPLETE) { - audio->device_switch = DEVICE_SWITCH_STATE_NONE; - next_buf = list_first_entry(&audio->out_queue, - struct audlpa_buffer_node, list); - if (next_buf) { - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - cmd.decoder_id = audio->dec_id; - temp = audio->bytecount_head + - next_buf->buf.data_len - - audio->bytecount_consumed; - if (audpp_restore_avsync(audio->dec_id, - &audio->avsync[0])) - MM_DBG("audpp_restore_avsync failed\n"); - - if ((signed)(temp >= 0) && - ((signed)(next_buf->buf.data_len - temp) >= 0)) { - MM_DBG("audlpa_async_send_buffer - sending the" - "rest of the buffer bassedon AV sync"); - cmd.buf_ptr = (unsigned) (next_buf->paddr + - (next_buf->buf.data_len - - temp)); - cmd.buf_size = temp >> 1; - cmd.partition_number = 0; - audio->bytecount_given = - audio->bytecount_consumed + temp; - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } else if ((signed)(temp >= 0) && - ((signed)(next_buf->buf.data_len - - temp) < 0)) { - MM_DBG("audlpa_async_send_buffer - else case:" - "sending the rest of the buffer bassedon" - "AV sync"); - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - audio->bytecount_given = audio->bytecount_head + - next_buf->buf.data_len; - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } -} - -static void audlpa_async_send_data(struct audio *audio, unsigned needed, - uint32_t *payload) -{ - unsigned long flags; - uint64_t temp = 0; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - union msm_audio_event_payload evt_payload; - struct audlpa_buffer_node *used_buf = NULL; - - if (CHECK_ERROR(payload)) - audio->bytecount_consumed = - CALCULATE_AVSYNC_FROM_PAYLOAD(payload); - - if ((audio->device_switch == - DEVICE_SWITCH_STATE_COMPLETE) && - (audio->avsync_flag == 1)) { - audio->avsync_flag = 0; - audio->bytecount_consumed = - CALCULATE_AVSYNC(audio->avsync); - } - BUG_ON(list_empty(&audio->out_queue)); - temp = audio->bytecount_head; - used_buf = list_first_entry(&audio->out_queue, - struct audlpa_buffer_node, list); - if (audio->device_switch != - DEVICE_SWITCH_STATE_COMPLETE) { - audio->bytecount_head += - used_buf->buf.data_len; - temp = audio->bytecount_head; - list_del(&used_buf->list); - evt_payload.aio_buf = used_buf->buf; - audlpa_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - evt_payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - } - } - if (audio->out_needed) { - if (!list_empty(&audio->out_queue)) - audlpa_async_send_buffer(audio); - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audlpa_async_flush(struct audio *audio) -{ - struct audlpa_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audlpa_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - if ((buf_node->paddr != 0xFFFFFFFF) && - (buf_node->buf.data_len != 0)) - audlpa_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - audio->bytecount_consumed = 0; - audio->bytecount_head = 0; - audio->bytecount_given = 0; - audio->device_switch = DEVICE_SWITCH_STATE_NONE; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audlpa_async_flush(audio); - mutex_unlock(&audio->write_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - } else - audlpa_async_flush(audio); -} - -static int audlpa_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audlpa_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audlpa_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audlpa_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audlpa_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audlpa_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audlpa_event *drv_evt = NULL; - int timeout; - unsigned long flags; - memset(&usr_evt, 0, sizeof(usr_evt)); - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audlpa_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audlpa_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audlpa_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE || - drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - mutex_lock(&audio->lock); - audlpa_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audlpa_ion_check(struct audio *audio, - void *vaddr, unsigned long len) -{ - struct audlpa_ion_region *region_elt; - struct audlpa_ion_region t = {.vaddr = vaddr, .len = len }; - - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || - OVERLAPS(region_elt, &t)) { - MM_ERR("[%p]:region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", - audio, vaddr, len, - region_elt->vaddr, - (void *)region_elt->paddr, region_elt->len); - return -EINVAL; - } - } - - return 0; -} -static int audlpa_ion_add(struct audio *audio, - struct msm_audio_ion_info *info) -{ - ion_phys_addr_t paddr; - size_t len; - unsigned long kvaddr; - struct audlpa_ion_region *region; - int rc = -EINVAL; - struct ion_handle *handle; - unsigned long ionflag; - - MM_ERR("\n"); /* Macro prints the file name and function */ - region = kmalloc(sizeof(*region), GFP_KERNEL); - - if (!region) { - rc = -ENOMEM; - goto end; - } - handle = ion_import_dma_buf(audio->client, info->fd); - if (IS_ERR_OR_NULL(handle)) { - pr_err("%s: could not get handle of the given fd\n", __func__); - goto import_error; - } - rc = ion_handle_get_flags(audio->client, handle, &ionflag); - if (rc) { - pr_err("%s: could not get flags for the handle\n", __func__); - goto flag_error; - } - kvaddr = (unsigned long)ion_map_kernel(audio->client, handle); - if (IS_ERR_OR_NULL((void *)kvaddr)) { - pr_err("%s: could not get virtual address\n", __func__); - goto map_error; - } - rc = ion_phys(audio->client, handle, &paddr, &len); - if (rc) { - pr_err("%s: could not get physical address\n", __func__); - goto ion_error; - } - rc = audlpa_ion_check(audio, info->vaddr, len); - if (rc < 0) { - MM_ERR("audpcm_ion_check failed\n"); - goto ion_error; - } - region->handle = handle; - region->vaddr = info->vaddr; - region->fd = info->fd; - region->paddr = paddr; - region->kvaddr = kvaddr; - region->len = len; - region->ref_cnt = 0; - MM_DBG("[%p]:add region paddr %lx vaddr %p, len %lu kvaddr %lx\n", - audio, region->paddr, region->vaddr, - region->len, region->kvaddr); - list_add_tail(®ion->list, &audio->ion_region_queue); - - return rc; - -ion_error: - ion_unmap_kernel(audio->client, handle); -map_error: -flag_error: - ion_free(audio->client, handle); -import_error: - kfree(region); -end: - return rc; -} - -static int audlpa_ion_remove(struct audio *audio, - struct msm_audio_ion_info *info) -{ - struct audlpa_ion_region *region; - struct list_head *ptr, *next; - int rc = -EINVAL; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audlpa_ion_region, list); - - if (region != NULL && (region->fd == info->fd) && - (region->vaddr == info->vaddr)) { - if (region->ref_cnt) { - MM_DBG("%s[%p]:region %p in use ref_cnt %d\n", - __func__, audio, region, - region->ref_cnt); - break; - } - MM_DBG("remove region fd %d vaddr %p\n", - info->fd, info->vaddr); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - rc = 0; - break; - } - } - - return rc; -} - -static int audlpa_ion_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audlpa_ion_region **region) -{ - struct audlpa_ion_region *region_elt; - int match_count = 0; - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->ion_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * ion buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("%s[%p]:multiple hits for vaddr %p, len %ld\n", - __func__, audio, addr, len); - list_for_each_entry(region_elt, &audio->ion_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%s[%p]:%p, %ld --> %p\n", - __func__, audio, - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - - return *region ? 0 : -1; -} -static unsigned long audlpa_ion_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audlpa_ion_region *region; - unsigned long paddr; - int ret; - - ret = audlpa_ion_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("%s[%p]:lookup (%p, %ld) failed\n", - __func__, audio, addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audlpa_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audlpa_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len" - "%d\n", buf_node, dir, - buf_node->buf.buf_addr, buf_node->buf.buf_len, - buf_node->buf.data_len); - - buf_node->paddr = audlpa_ion_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audlpa_async_send_data(audio, 0, 0); - } else { - /* read */ - } - - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("audio_ioctl() cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(AUDPP_CMD_CFG_DEV_MIXER_ID_4, - &audio->vol_pan, - COPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(AUDPP_CMD_CFG_DEV_MIXER_ID_4, - &audio->vol_pan, - COPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG(" AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audlpa_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_DBG("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - break; - - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { - rc = audpp_pause(audio->dec_id, (int) arg); - if (rc < 0) { - MM_ERR("%s: pause cmd failed rc=%d\n", - __func__, rc); - rc = -EINTR; - break; - } - } - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - MM_INFO("AUDIO_SET_CONFIG\n"); - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - MM_INFO("ERROR: copy from user\n"); - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - MM_INFO("ERROR: config.channel_count == %d\n", - config.channel_count); - break; - } - - if (config.bits == 8) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_8; - else if (config.bits == 16) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - else if (config.bits == 24) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_24; - else { - rc = -EINVAL; - MM_INFO("ERROR: config.bits == %d\n", config.bits); - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->out_bits = config.bits; - audio->buffer_count = config.buffer_count; - audio->buffer_size = config.buffer_size; - MM_DBG("AUDIO_SET_CONFIG: config.bits = %d\n", config.bits); - rc = 0; - break; - } - - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_count = audio->buffer_count; - config.buffer_size = audio->buffer_size; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_8) - config.bits = 8; - else if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_24) - config.bits = 24; - else - config.bits = 16; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - MM_DBG("AUDIO_GET_CONFIG: config.bits = %d\n", config.bits); - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - if (arg == 1) - audio->drv_status |= ADRV_STATUS_PAUSE; - else if (arg == 0) - audio->drv_status &= ~ADRV_STATUS_PAUSE; - break; - - case AUDIO_REGISTER_ION: { - struct msm_audio_ion_info info; - MM_DBG("AUDIO_REGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audlpa_ion_add(audio, &info); - break; - } - - case AUDIO_DEREGISTER_ION: { - struct msm_audio_ion_info info; - MM_DBG("AUDIO_DEREGISTER_ION\n"); - if (copy_from_user(&info, (void *) arg, sizeof(info))) - rc = -EFAULT; - else - rc = audlpa_ion_remove(audio, &info); - break; - } - - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audlpa_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = audio->codec_ops.ioctl(file, cmd, arg); - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audlpa_async_fsync(struct audio *audio) -{ - int rc = 0, empty = 0; - struct audlpa_buffer_node *buf_node; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - audio->teos = 0; - empty = list_empty(&audio->out_queue); - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - if (!buf_node) - goto done; - - buf_node->paddr = 0xFFFFFFFF; - buf_node->buf.data_len = 0; - buf_node->buf.buf_addr = NULL; - buf_node->buf.buf_len = 0; - buf_node->buf.private_data = NULL; - list_add_tail(&buf_node->list, &audio->out_queue); - if ((empty != 0) && (audio->out_needed == 1)) - audlpa_async_send_data(audio, 0, 0); - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush || - audio->stopped); - - if (rc < 0) - goto done; - - if (audio->teos == 1) { - /* Releasing all the pending buffers to user */ - audio->teos = 0; - audlpa_async_flush(audio); - } - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audlpa_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running) - return -EINVAL; - - return audlpa_async_fsync(audio); -} - -static void audpcm_reset_ion_region(struct audio *audio) -{ - struct audlpa_ion_region *region; - struct list_head *ptr, *next; - - list_for_each_safe(ptr, next, &audio->ion_region_queue) { - region = list_entry(ptr, struct audlpa_ion_region, list); - list_del(®ion->list); - ion_unmap_kernel(audio->client, region->handle); - ion_free(audio->client, region->handle); - kfree(region); - } - - return; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audlpa_async_flush(audio); - audpcm_reset_ion_region(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audlpa_reset_event_queue(audio); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - ion_client_destroy(audio->client); - kfree(audio); - return 0; -} - -static void audlpa_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audlpa_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audlpa_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audlpa_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audlpa_suspend(struct early_suspend *h) -{ - struct audlpa_suspend_ctl *ctl = - container_of(h, struct audlpa_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audlpa_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audlpa_resume(struct early_suspend *h) -{ - struct audlpa_suspend_ctl *ctl = - container_of(h, struct audlpa_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audlpa_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audlpa_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audlpa_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x\n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d\n", - audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d\n", - audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d\n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d\n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d\n", audio->out_needed); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audlpa_debug_fops = { - .read = audlpa_debug_read, - .open = audlpa_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, i, dec_attrb = 0, decid; - struct audlpa_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_lpa_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - if ((file->f_mode & FMODE_WRITE) && !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - /* Allocate the decoder based on inode minor number*/ - audio->minor_no = iminor(inode); - dec_attrb |= audlpa_decs[audio->minor_no].dec_attrb; - audio->codec_ops.ioctl = audlpa_decs[audio->minor_no].ioctl; - audio->codec_ops.adec_params = audlpa_decs[audio->minor_no].adec_params; - audio->buffer_size = BUFSZ; - audio->buffer_count = MAX_BUF; - - dec_attrb |= MSM_AUD_MODE_LP; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available\n"); - rc = -ENODEV; - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - MM_DBG("set to aio interface\n"); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_lpa, audio); - - if (rc) { - MM_ERR("failed to get %s module\n", audio->module_name); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->ion_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - audio->vol_pan.volume = 0x2000; - - audlpa_async_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS | AUDDEV_EVT_REL_PENDING - |AUDDEV_EVT_STREAM_VOL_CHG; - audio->device_switch = DEVICE_SWITCH_STATE_NONE; - audio->drv_status &= ~ADRV_STATUS_PAUSE; - audio->bytecount_consumed = 0; - audio->bytecount_head = 0; - audio->bytecount_given = 0; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - lpa_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listnet\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_lpa_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audlpa_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audlpa_resume; - audio->suspend_ctl.node.suspend = audlpa_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDLPA_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audlpa_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - - audio->client = msm_ion_client_create(UINT_MAX, "Audio_LPA_Client"); - if (IS_ERR_OR_NULL(audio->client)) { - pr_err("Unable to create ION client\n"); - goto err; - } - MM_DBG("Ion client created\n"); - -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - audpp_adec_free(audio->dec_id); - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - kfree(audio); - return rc; -} - -static const struct file_operations audio_lpa_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .unlocked_ioctl = audio_ioctl, - .fsync = audlpa_fsync, -}; - -static dev_t audlpa_devno; -static struct class *audlpa_class; -struct audlpa_device { - const char *name; - struct device *device; - struct cdev cdev; -}; - -static struct audlpa_device *audlpa_devices; - -static void audlpa_create(struct audlpa_device *adev, const char *name, - struct device *parent, dev_t devt) -{ - struct device *dev; - int rc; - - dev = device_create(audlpa_class, parent, devt, "%s", name); - if (IS_ERR(dev)) - return; - - cdev_init(&adev->cdev, &audio_lpa_fops); - adev->cdev.owner = THIS_MODULE; - - rc = cdev_add(&adev->cdev, devt, 1); - if (rc < 0) { - device_destroy(audlpa_class, devt); - } else { - adev->device = dev; - adev->name = name; - } -} - -static int __init audio_init(void) -{ - int rc; - int n = ARRAY_SIZE(audlpa_decs); - - audlpa_devices = kzalloc(sizeof(struct audlpa_device) * n, GFP_KERNEL); - if (!audlpa_devices) - return -ENOMEM; - - audlpa_class = class_create(THIS_MODULE, "audlpa"); - if (IS_ERR(audlpa_class)) - goto fail_create_class; - - rc = alloc_chrdev_region(&audlpa_devno, 0, n, "msm_audio_lpa"); - if (rc < 0) - goto fail_alloc_region; - - for (n = 0; n < ARRAY_SIZE(audlpa_decs); n++) { - audlpa_create(audlpa_devices + n, - audlpa_decs[n].name, NULL, - MKDEV(MAJOR(audlpa_devno), n)); - } - - return 0; - -fail_alloc_region: - class_unregister(audlpa_class); - return rc; -fail_create_class: - kfree(audlpa_devices); - return -ENOMEM; -} - -static void __exit audio_exit(void) -{ - class_unregister(audlpa_class); - kfree(audlpa_devices); -} - -module_init(audio_init); -module_exit(audio_exit); - -MODULE_DESCRIPTION("MSM LPA driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_mp3.c b/arch/arm/mach-msm/qdsp5v2/audio_mp3.c deleted file mode 100644 index bda2e4db9424..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_mp3.c +++ /dev/null @@ -1,2388 +0,0 @@ -/* mp3 audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -/* Size must be power of 2 */ -#define BUFSZ_MAX 32768 -#define BUFSZ_MIN 4096 -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_MP3 2 - -#define PCM_BUFSZ_MIN 4800 /* Hold one stereo MP3 frame */ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDMP3_METAFIELD_MASK 0xFFFF0000 -#define AUDMP3_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDMP3_EOS_FLG_MASK 0x01 -#define AUDMP3_EOS_NONE 0x0 /* No EOS detected */ -#define AUDMP3_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDMP3_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define BITSTREAM_ERROR_THRESHOLD_VALUE 0x1 /* DEFAULT THRESHOLD VALUE */ - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) -struct audio; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audmp3_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audmp3_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audmp3_pmem_region { - struct list_head list; - struct file *file; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audmp3_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audmp3_drv_operations { - void (*pcm_buf_update)(struct audio *, uint32_t *); - void (*buffer_refresh)(struct audio *); - void (*send_data)(struct audio *, unsigned); - void (*out_flush)(struct audio *); - void (*in_flush)(struct audio *); - int (*fsync)(struct audio *); -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - struct list_head in_queue; /* queue to retain input buffers */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - uint32_t drv_status; - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audmp3_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - struct list_head pmem_region_queue; /* protected by lock */ - struct audmp3_drv_operations drv_ops; - - struct msm_audio_bitstream_info stream_info; - struct msm_audio_bitstream_error_info bitstream_error_info; - uint32_t bitstream_error_threshold_value; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_error_threshold_config(struct audio *audio); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audmp3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audmp3_pmem_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); - -static void mp3_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audmp3_async_pcm_buf_update(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audmp3_buffer_node *filled_buf; - uint8_t index; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - BUG_ON(list_empty(&audio->in_queue)); - filled_buf = list_first_entry(&audio->in_queue, - struct audmp3_buffer_node, list); - if (filled_buf->paddr == payload[2 + index * 2]) { - list_del(&filled_buf->list); - event_payload.aio_buf = filled_buf->buf; - event_payload.aio_buf.data_len = - payload[3 + index * 2]; - MM_DBG("pcm buf %p data_len %d\n", filled_buf, - event_payload.aio_buf.data_len); - audmp3_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - MM_ERR("expected=%lx ret=%x\n", filled_buf->paddr, - payload[2 + index * 2]); - break; - } - } - - audio->drv_status &= ~ADRV_STATUS_IBUF_GIVEN; - audio->drv_ops.buffer_refresh(audio); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} - -static void audio_update_pcm_buf_entry(struct audio *audio, uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[2 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audio->drv_ops.buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - -} - -static void audmp3_bitstream_error_info(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload e_payload; - - if (payload[0] != AUDDEC_DEC_MP3) { - MM_ERR("Unexpected bitstream error info from DSP:\ - Invalid decoder\n"); - return; - } - - /* get stream info from DSP msg */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->bitstream_error_info.dec_id = payload[0]; - audio->bitstream_error_info.err_msg_indicator = payload[1]; - audio->bitstream_error_info.err_type = payload[2]; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_ERR("bit_stream_error_type=%d error_count=%d\n", - audio->bitstream_error_info.err_type, (0x0000FFFF & - audio->bitstream_error_info.err_msg_indicator)); - - /* send event to ARM to notify error info coming */ - e_payload.error_info = audio->bitstream_error_info; - audmp3_post_event(audio, AUDIO_EVENT_BITSTREAM_ERROR_INFO, e_payload); -} - -static void audmp3_update_stream_info(struct audio *audio, uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload e_payload; - - /* get stream info from DSP msg */ - spin_lock_irqsave(&audio->dsp_lock, flags); - - audio->stream_info.codec_type = AUDIO_CODEC_TYPE_MP3; - audio->stream_info.chan_info = (0x0000FFFF & payload[1]); - audio->stream_info.sample_rate = (0x0000FFFF & payload[2]); - audio->stream_info.bit_stream_info = (0x0000FFFF & payload[3]); - audio->stream_info.bit_rate = payload[4]; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - MM_DBG("chan_info=%d, sample_rate=%d, bit_stream_info=%d\n", - audio->stream_info.chan_info, - audio->stream_info.sample_rate, - audio->stream_info.bit_stream_info); - - /* send event to ARM to notify steam info coming */ - e_payload.stream_info = audio->stream_info; - audmp3_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audio->drv_ops.send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio->drv_ops.pcm_buf_update(audio, msg); - break; - - case AUDPLAY_UP_STREAM_INFO: - if ((msg[1] & AUDPLAY_STREAM_INFO_MSG_MASK) == - AUDPLAY_STREAM_INFO_MSG_MASK) { - audmp3_bitstream_error_info(audio, msg); - } else { - audmp3_update_stream_info(audio, msg); - } - break; - - case AUDPLAY_UP_OUTPORT_FLUSH_ACK: - MM_DBG("OUTPORT_FLUSH_ACK\n"); - audio->rflush = 0; - wake_up(&audio->read_wait); - if (audio->pcm_feedback) - audio->drv_ops.buffer_refresh(audio); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status: sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audplay_error_threshold_config(audio); - audplay_config_hostpcm(audio); - audio->drv_ops.buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status \n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audio->drv_ops.buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - - -struct msm_adsp_ops audplay_adsp_ops = { - .event = audplay_dsp_event, -}; - - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_MP3; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_mp3 cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_MP3_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDMP3_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} -/* Caller holds irq_lock */ -static void audmp3_async_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - struct audmp3_buffer_node *next_buf; - - if (!audio->running || - audio->drv_status & ADRV_STATUS_IBUF_GIVEN) - return; - - if (!list_empty(&audio->in_queue)) { - next_buf = list_first_entry(&audio->in_queue, - struct audmp3_buffer_node, list); - if (!next_buf) - return; - MM_DBG("next buf %p phy %lx len %d\n", next_buf, - next_buf->paddr, next_buf->buf.buf_len); - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = next_buf->paddr; - refresh_cmd.buf0_length = next_buf->buf.buf_len - - (next_buf->buf.buf_len % 576) + - (audio->mfield ? 24 : 0); /* Mp3 frame size */ - refresh_cmd.buf_read_count = 0; - audio->drv_status |= ADRV_STATUS_IBUF_GIVEN; - (void) audplay_send_queue0(audio, &refresh_cmd, - sizeof(refresh_cmd)); - } - -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size - - (audio->in[audio->fill_next].size % 576) + - (audio->mfield ? 24 : 0); /* Mp3 frame size */ - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_error_threshold_config(struct audio *audio) -{ - union audplay_cmd_channel_info ch_cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - ch_cfg_cmd.thr_update.cmd_id = AUDPLAY_CMD_CHANNEL_INFO; - ch_cfg_cmd.thr_update.threshold_update = AUDPLAY_ERROR_THRESHOLD_ENABLE; - ch_cfg_cmd.thr_update.threshold_value = - audio->bitstream_error_threshold_value; - (void)audplay_send_queue0(audio, &ch_cfg_cmd, sizeof(ch_cfg_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); - -} - -static void audplay_outport_flush(struct audio *audio) -{ - struct audplay_cmd_outport_flush op_flush_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - op_flush_cmd.cmd_id = AUDPLAY_CMD_OUTPORT_FLUSH; - (void)audplay_send_queue0(audio, &op_flush_cmd, sizeof(op_flush_cmd)); -} - -static void audmp3_async_send_data(struct audio *audio, unsigned needed) -{ - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - /* pop one node out of queue */ - union msm_audio_event_payload payload; - struct audmp3_buffer_node *used_buf; - - MM_DBG("consumed\n"); - BUG_ON(list_empty(&audio->out_queue)); - used_buf = list_first_entry(&audio->out_queue, - struct audmp3_buffer_node, list); - list_del(&used_buf->list); - payload.aio_buf = used_buf->buf; - audmp3_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - - } - - if (audio->out_needed) { - struct audmp3_buffer_node *next_buf; - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - if (!list_empty(&audio->out_queue)) { - next_buf = list_first_entry(&audio->out_queue, - struct audmp3_buffer_node, list); - MM_DBG("next_buf %p\n", next_buf); - if (next_buf) { - MM_DBG("next buf phy %lx len %d\n", - next_buf->paddr, - next_buf->buf.data_len); - - cmd.cmd_id = - AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDMP3_METAFIELD_MASK | - (next_buf->buf.mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } - -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audmp3_async_flush(struct audio *audio) -{ - struct audmp3_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audmp3_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audmp3_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audmp3_async_flush_pcm_buf(struct audio *audio) -{ - struct audmp3_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audmp3_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - payload.aio_buf.data_len = 0; - audmp3_post_event(audio, AUDIO_EVENT_READ_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_IBUF_GIVEN; - -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audio_ioport_reset(struct audio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } else - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - } else { - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio->drv_ops.in_flush(audio); - mutex_unlock(&audio->read_lock); - } - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audmp3_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audmp3_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audmp3_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audmp3_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audmp3_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audmp3_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audmp3_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audmp3_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE || - drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - mutex_lock(&audio->lock); - audmp3_pmem_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audmp3_pmem_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audmp3_pmem_region **region) -{ - struct audmp3_pmem_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->pmem_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * pmem buffer - */ - - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("multiple hits for vaddr %p, len %ld\n", addr, len); - list_for_each_entry(region_elt, - &audio->pmem_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%p, %ld --> %p\n", region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -unsigned long audmp3_pmem_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audmp3_pmem_region *region; - unsigned long paddr; - int ret; - - ret = audmp3_pmem_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("lookup (%p, %ld) failed\n", addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audmp3_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audmp3_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len \ - %d\n", buf_node, dir, - buf_node->buf.buf_addr, buf_node->buf.buf_len, - buf_node->buf.data_len); - - buf_node->paddr = audmp3_pmem_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1) || - (!audio->pcm_feedback && - !buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audio->drv_ops.send_data(audio, 0); - } else { - /* read */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.buf_len < PCM_BUFSZ_MIN)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->in_queue); - audio->drv_ops.buffer_refresh(audio); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG(" AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audmp3_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_OUTPORT_FLUSH: - MM_DBG("AUDIO_OUTPORT_FLUSH\n"); - audio->rflush = 1; - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - audio->drv_ops.in_flush(audio); - } else { - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio->drv_ops.in_flush(audio); - mutex_unlock(&audio->read_lock); - } - audplay_outport_flush(audio); - rc = wait_event_interruptible(audio->read_wait, - !audio->rflush); - if (rc < 0) { - MM_ERR("AUDPLAY_OUTPORT_FLUSH interrupted\n"); - rc = -EINTR; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - rc = 0; - break; - } - - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read buffer" - " physical address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - rc = 0; - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - - case AUDIO_GET_STREAM_INFO:{ - if (audio->stream_info.sample_rate == 0) { - /* haven't received DSP stream event, - the stream info is not updated */ - rc = -EPERM; - break; - } - if (copy_to_user((void *)arg, &audio->stream_info, - sizeof(struct msm_audio_bitstream_info))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_BITSTREAM_ERROR_INFO:{ - if ((audio->bitstream_error_info.err_msg_indicator & - AUDPLAY_STREAM_INFO_MSG_MASK) == - AUDPLAY_STREAM_INFO_MSG_MASK) { - /* haven't received bitstream error info event, - the bitstream error info is not updated */ - rc = -EPERM; - break; - } - if (copy_to_user((void *)arg, &audio->bitstream_error_info, - sizeof(struct msm_audio_bitstream_error_info))) - rc = -EFAULT; - else - rc = 0; - break; - } - - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audmp3_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_ASYNC_READ: - if (audio->pcm_feedback) - rc = audmp3_aio_buf_add(audio, 0, (void __user *) arg); - else - rc = -EPERM; - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - case AUDIO_SET_ERR_THRESHOLD_VALUE: - if (copy_from_user(&audio->bitstream_error_threshold_value, - (void *)arg, sizeof(uint32_t))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audmp3_async_fsync(struct audio *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - (audio->teos && audio->out_needed && - list_empty(&audio->out_queue)) - || audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audmp3_sync_fsync(struct audio *audio) -{ - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audio->drv_ops.send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -int audmp3_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running || audio->pcm_feedback) - return -EINVAL; - - return audio->drv_ops.fsync(audio); -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - else if (!audio->pcm_feedback) - return 0; /* PCM feedback disabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible_timeout( - audio->read_wait, - (audio->in[audio->read_next]. - used > 0) || (audio->stopped) - || (audio->rflush), - msecs_to_jiffies(MSM_AUD_BUFFER_UPDATE_WAIT_MS)); - - if (rc == 0) { - rc = -ETIMEDOUT; - break; - } else if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since - * driver does not know frame size, read count - * must be greater or equal - * to size of PCM samples - */ - MM_DBG("no partial frame done reading\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audio->drv_ops.buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audmp3_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audio->drv_ops.send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audio->drv_ops.send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDMP3_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDMP3_EOS_FLG_OFFSET] & - AUDMP3_EOS_FLG_MASK) { - MM_DBG("EOS SET\n"); - eos_condition = AUDMP3_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDMP3_EOS_FLG_OFFSET] - &= ~AUDMP3_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audio->drv_ops.send_data(audio, 0); - } - } - if (eos_condition == AUDMP3_EOS_SET) - rc = audmp3_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio->drv_ops.out_flush(audio); - audio->drv_ops.in_flush(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audmp3_reset_event_queue(audio); - if (audio->data) { - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - } - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -static void audmp3_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audmp3_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audmp3_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audmp3_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audmp3_suspend(struct early_suspend *h) -{ - struct audmp3_suspend_ctl *ctl = - container_of(h, struct audmp3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audmp3_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audmp3_resume(struct early_suspend *h) -{ - struct audmp3_suspend_ctl *ctl = - container_of(h, struct audmp3_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audmp3_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audmp3_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audmp3_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audmp3_debug_fops = { - .read = audmp3_debug_read, - .open = audmp3_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - - struct audio *audio = NULL; - int rc, i, dec_attrb, decid; - struct audmp3_event *e_node = NULL; - unsigned pmem_sz = DMASZ_MAX; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_mp3_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_MP3; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - /* AIO interface */ - if (file->f_flags & O_NONBLOCK) { - MM_DBG("set to aio interface\n"); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.pcm_buf_update = audmp3_async_pcm_buf_update; - audio->drv_ops.buffer_refresh = audmp3_async_buffer_refresh; - audio->drv_ops.send_data = audmp3_async_send_data; - audio->drv_ops.out_flush = audmp3_async_flush; - audio->drv_ops.in_flush = audmp3_async_flush_pcm_buf; - audio->drv_ops.fsync = audmp3_async_fsync; - } else { - MM_DBG("set to std io interface\n"); - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, - SZ_4K); - if (audio->phys) { - audio->map_v_write = ioremap( - audio->phys, pmem_sz); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("failed to map write physical" - " address , freeing instance" - "0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr\ - 0x%08x\n", audio->phys,\ - (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; - } - audio->out_dma_sz = pmem_sz; - audio->drv_ops.pcm_buf_update = audio_update_pcm_buf_entry; - audio->drv_ops.buffer_refresh = audplay_buffer_refresh; - audio->drv_ops.send_data = audplay_send_data; - audio->drv_ops.out_flush = audio_flush; - audio->drv_ops.in_flush = audio_flush_pcm_buf; - audio->drv_ops.fsync = audmp3_sync_fsync; - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = (audio->out_dma_sz >> 1); - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops, audio); - - if (rc) { - MM_ERR("failed to get %s module freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->in_queue); - INIT_LIST_HEAD(&audio->pmem_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->vol_pan.volume = 0x2000; - audio->bitstream_error_threshold_value = - BITSTREAM_ERROR_THRESHOLD_VALUE; - - audio->drv_ops.out_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - mp3_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_mp3_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audmp3_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audmp3_resume; - audio->suspend_ctl.node.suspend = audmp3_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDMP3_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audmp3_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } - memset(&audio->stream_info, 0, sizeof(struct msm_audio_bitstream_info)); - memset(&audio->bitstream_error_info, 0, - sizeof(struct msm_audio_bitstream_info)); -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - if (audio->data) { - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - } - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_mp3_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audmp3_fsync, -}; - -struct miscdevice audio_mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &audio_mp3_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_mp3_misc); -} - -static void __exit audio_exit(void) -{ - misc_deregister(&audio_mp3_misc); -} - -module_init(audio_init); -module_exit(audio_exit); - -MODULE_DESCRIPTION("MSM MP3 driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_mvs.c b/arch/arm/mach-msm/qdsp5v2/audio_mvs.c deleted file mode 100644 index f211fa01ac3e..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_mvs.c +++ /dev/null @@ -1,1766 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define MVS_PROG 0x30000014 -#define MVS_VERS 0x00030001 -#define MVS_VERS_COMP_VER4 0x00040001 -#define MVS_VERS_COMP_VER5 0x00050001 - -#define MVS_CLIENT_ID_VOIP 0x00000003 - -#define MVS_ACQUIRE_PROC 4 -#define MVS_ENABLE_PROC 5 -#define MVS_RELEASE_PROC 6 -#define MVS_AMR_SET_AMR_MODE_PROC 7 -#define MVS_AMR_SET_AWB_MODE_PROC 8 -#define MVS_VOC_SET_FRAME_RATE_PROC 10 -#define MVS_GSM_SET_DTX_MODE_PROC 11 -#define MVS_G729A_SET_MODE_PROC 12 -#define MVS_G711_GET_MODE_PROC 14 -#define MVS_G711_SET_MODE_PROC 15 -#define MVS_G711A_GET_MODE_PROC 16 -#define MVS_G711A_SET_MODE_PROC 17 -#define MVS_G722_SET_MODE_PROC 20 -#define MVS_G722_GET_MODE_PROC 21 -#define MVS_SET_DTX_MODE_PROC 22 - -#define MVS_EVENT_CB_TYPE_PROC 1 -#define MVS_PACKET_UL_FN_TYPE_PROC 2 -#define MVS_PACKET_DL_FN_TYPE_PROC 3 - -#define MVS_CB_FUNC_ID 0xAAAABBBB -#define MVS_UL_CB_FUNC_ID 0xBBBBCCCC -#define MVS_DL_CB_FUNC_ID 0xCCCCDDDD - -#define MVS_FRAME_MODE_VOC_TX 1 -#define MVS_FRAME_MODE_VOC_RX 2 -#define MVS_FRAME_MODE_AMR_UL 3 -#define MVS_FRAME_MODE_AMR_DL 4 -#define MVS_FRAME_MODE_GSM_UL 5 -#define MVS_FRAME_MODE_GSM_DL 6 -#define MVS_FRAME_MODE_HR_UL 7 -#define MVS_FRAME_MODE_HR_DL 8 -#define MVS_FRAME_MODE_G711_UL 9 -#define MVS_FRAME_MODE_G711_DL 10 -#define MVS_FRAME_MODE_PCM_UL 13 -#define MVS_FRAME_MODE_PCM_DL 14 -#define MVS_FRAME_MODE_G729A_UL 17 -#define MVS_FRAME_MODE_G729A_DL 18 -#define MVS_FRAME_MODE_G711A_UL 19 -#define MVS_FRAME_MODE_G711A_DL 20 -#define MVS_FRAME_MODE_G722_UL 21 -#define MVS_FRAME_MODE_G722_DL 22 - - - -#define MVS_PKT_CONTEXT_ISR 0x00000001 - -#define RPC_TYPE_REQUEST 0 -#define RPC_TYPE_REPLY 1 - -#define RPC_STATUS_FAILURE 0 -#define RPC_STATUS_SUCCESS 1 -#define RPC_STATUS_REJECT 1 - -#define RPC_COMMON_HDR_SZ (sizeof(uint32_t) * 2) -#define RPC_REQUEST_HDR_SZ (sizeof(struct rpc_request_hdr)) -#define RPC_REPLY_HDR_SZ (sizeof(uint32_t) * 3) - -enum audio_mvs_state_type { - AUDIO_MVS_CLOSED, - AUDIO_MVS_OPENED, - AUDIO_MVS_STARTED, - AUDIO_MVS_STOPPED -}; - -enum audio_mvs_event_type { - AUDIO_MVS_COMMAND, - AUDIO_MVS_MODE, - AUDIO_MVS_NOTIFY -}; - -enum audio_mvs_cmd_status_type { - AUDIO_MVS_CMD_FAILURE, - AUDIO_MVS_CMD_BUSY, - AUDIO_MVS_CMD_SUCCESS -}; - -enum audio_mvs_mode_status_type { - AUDIO_MVS_MODE_NOT_AVAIL, - AUDIO_MVS_MODE_INIT, - AUDIO_MVS_MODE_READY -}; - -enum audio_mvs_pkt_status_type { - AUDIO_MVS_PKT_NORMAL, - AUDIO_MVS_PKT_FAST, - AUDIO_MVS_PKT_SLOW -}; - -/* Parameters required for MVS acquire. */ -struct rpc_audio_mvs_acquire_args { - uint32_t client_id; - uint32_t cb_func_id; -}; - -struct audio_mvs_acquire_msg { - struct rpc_request_hdr rpc_hdr; - struct rpc_audio_mvs_acquire_args acquire_args; -}; - -/* Parameters required for MVS enable. */ -struct rpc_audio_mvs_enable_args { - uint32_t client_id; - uint32_t mode; - uint32_t ul_cb_func_id; - uint32_t dl_cb_func_id; - uint32_t context; -}; - -struct audio_mvs_enable_msg { - struct rpc_request_hdr rpc_hdr; - struct rpc_audio_mvs_enable_args enable_args; -}; - -/* Parameters required for MVS release. */ -struct audio_mvs_release_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t client_id; -}; - -/* Parameters required for setting AMR mode. */ -struct audio_mvs_set_amr_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t amr_mode; -}; - -/* Parameters required for setting DTX. */ -struct audio_mvs_set_dtx_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t dtx_mode; -}; - -/* Parameters required for setting EVRC mode. */ -struct audio_mvs_set_voc_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t max_rate; - uint32_t min_rate; -}; - -/* Parameters for G711 mode */ -struct audio_mvs_set_g711_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g711_mode; -}; - -/* Parameters for G729 mode */ -struct audio_mvs_set_g729_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g729_mode; -}; - -/* Parameters for G722 mode */ -struct audio_mvs_set_g722_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g722_mode; -}; - - -/* Parameters for G711A mode */ -struct audio_mvs_set_g711A_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t g711A_mode; -}; - -/* Parameters for EFR FR and HR mode */ -struct audio_mvs_set_efr_mode_msg { - struct rpc_request_hdr rpc_hdr; - uint32_t efr_mode; -}; - -union audio_mvs_event_data { - struct mvs_ev_command_type { - uint32_t event; - uint32_t client_id; - uint32_t cmd_status; - } mvs_ev_command_type; - - struct mvs_ev_mode_type { - uint32_t event; - uint32_t client_id; - uint32_t mode_status; - uint32_t mode; - } mvs_ev_mode_type; - - struct mvs_ev_notify_type { - uint32_t event; - uint32_t client_id; - uint32_t buf_dir; - uint32_t max_frames; - } mvs_ev_notify_type; -}; - -struct audio_mvs_cb_func_args { - uint32_t cb_func_id; - uint32_t valid_ptr; - uint32_t event; - union audio_mvs_event_data event_data; -}; - -struct audio_mvs_frame_info_hdr { - uint32_t frame_mode; - uint32_t mvs_mode; - uint16_t buf_free_cnt; -}; - -struct audio_mvs_ul_reply { - struct rpc_reply_hdr reply_hdr; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; - -struct audio_mvs_dl_cb_func_args { - uint32_t cb_func_id; - - uint32_t valid_ptr; - uint32_t frame_mode; - uint32_t frame_mode_ignore; - - struct audio_mvs_frame_info_hdr frame_info_hdr; - - uint32_t amr_frame; - uint32_t amr_mode; -}; -/*general codec parameters includes AMR, G711A, PCM -G729, VOC and HR vocoders -*/ -struct gnr_cdc_param { - uint32_t param1; - uint32_t param2; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; -/*G711 codec parameter*/ -struct g711_param { - uint32_t param1; - uint32_t valid_pkt_status_ptr; - uint32_t pkt_status; -}; - -union codec_param { - struct gnr_cdc_param gnr_arg; - struct g711_param g711_arg; -}; - -struct audio_mvs_dl_reply { - struct rpc_reply_hdr reply_hdr; - - uint32_t voc_pkt[Q5V2_MVS_MAX_VOC_PKT_SIZE/4]; - - uint32_t valid_frame_info_ptr; - uint32_t frame_mode; - uint32_t frame_mode_again; - - struct audio_mvs_frame_info_hdr frame_info_hdr; - union codec_param cdc_param; -}; - -struct audio_mvs_buf_node { - struct list_head list; - struct q5v2_msm_audio_mvs_frame frame; -}; - -/* Each buffer is 20 ms, queue holds 200 ms of data. */ -#define MVS_MAX_Q_LEN 10 - -struct audio_mvs_info_type { - enum audio_mvs_state_type state; - uint32_t frame_mode; - uint32_t mvs_mode; - uint32_t buf_free_cnt; - uint32_t rate_type; - uint32_t dtx_mode; - struct min_max_rate min_max_rate; - - struct msm_rpc_endpoint *rpc_endpt; - uint32_t rpc_prog; - uint32_t rpc_ver; - uint32_t rpc_status; - - uint8_t *mem_chunk; - - struct list_head in_queue; - struct list_head free_in_queue; - - struct list_head out_queue; - struct list_head free_out_queue; - - struct task_struct *task; - - wait_queue_head_t wait; - wait_queue_head_t mode_wait; - wait_queue_head_t out_wait; - - struct mutex lock; - struct mutex in_lock; - struct mutex out_lock; - - struct wake_lock suspend_lock; - struct pm_qos_request pm_qos_req; -}; - -static struct audio_mvs_info_type audio_mvs_info; - -static int audio_mvs_setup_mode(struct audio_mvs_info_type *audio) -{ - int rc = 0; - - pr_debug("%s:\n", __func__); - - switch (audio->mvs_mode) { - case MVS_MODE_AMR: - case MVS_MODE_AMR_WB: { - struct audio_mvs_set_amr_mode_msg set_amr_mode_msg; - struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg; - - /* Set AMR mode. */ - memset(&set_amr_mode_msg, 0, sizeof(set_amr_mode_msg)); - set_amr_mode_msg.amr_mode = cpu_to_be32(audio->rate_type); - - if (audio->mvs_mode == MVS_MODE_AMR) { - msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_AMR_SET_AMR_MODE_PROC); - } else { - msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_AMR_SET_AWB_MODE_PROC); - } - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_amr_mode_msg, - sizeof(set_amr_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set amr mode done\n", - __func__); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_AMR_DL; - - /* Disable DTX. */ - memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg)); - set_dtx_mode_msg.dtx_mode = cpu_to_be32(0); - - msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_dtx_mode_msg, - sizeof(set_dtx_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set dtx done\n", - __func__); - - rc = 0; - } - } else { - pr_err("%s: RPC write for set amr mode failed %d\n", - __func__, rc); - } - break; - } - case MVS_MODE_PCM: - case MVS_MODE_LINEAR_PCM: { - /* PCM does not have any params to be set. - Save the MVS configuration information. */ - audio->rate_type = MVS_AMR_MODE_UNDEF; - audio->frame_mode = MVS_FRAME_MODE_PCM_DL; - break; - } - case MVS_MODE_IS127: - case MVS_MODE_IS733: - case MVS_MODE_4GV_NB: - case MVS_MODE_4GV_WB: { - struct audio_mvs_set_voc_mode_msg set_voc_mode_msg; - - /* Set EVRC mode. */ - memset(&set_voc_mode_msg, 0, sizeof(set_voc_mode_msg)); - set_voc_mode_msg.min_rate = - cpu_to_be32(audio->min_max_rate.min_rate); - set_voc_mode_msg.max_rate = - cpu_to_be32(audio->min_max_rate.max_rate); - - msm_rpc_setup_req(&set_voc_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_VOC_SET_FRAME_RATE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_voc_mode_msg, - sizeof(set_voc_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set voc mode done\n", - __func__); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_VOC_RX; - - rc = 0; - } else { - pr_err("%s: RPC write for set voc mode failed %d\n", - __func__, rc); - } - break; - } - case MVS_MODE_G711: { - struct audio_mvs_set_g711_mode_msg set_g711_mode_msg; - - /* Set G711 mode. */ - memset(&set_g711_mode_msg, 0, sizeof(set_g711_mode_msg)); - set_g711_mode_msg.g711_mode = cpu_to_be32(audio->rate_type); - - pr_debug("%s: mode of g711:%d\n", - __func__, set_g711_mode_msg.g711_mode); - - msm_rpc_setup_req(&set_g711_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G711_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g711_mode_msg, - sizeof(set_g711_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set g711 mode done\n", - __func__); - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G711_DL; - - rc = 0; - } else { - pr_err("%s: RPC write for set g711 mode failed %d\n", - __func__, rc); - } - break; - } - case MVS_MODE_G729A: { - struct audio_mvs_set_g729_mode_msg set_g729_mode_msg; - - /* Set G729 mode. */ - memset(&set_g729_mode_msg, 0, sizeof(set_g729_mode_msg)); - set_g729_mode_msg.g729_mode = cpu_to_be32(audio->dtx_mode); - - pr_debug("%s: mode of g729:%d\n", - __func__, set_g729_mode_msg.g729_mode); - - msm_rpc_setup_req(&set_g729_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G729A_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g729_mode_msg, - sizeof(set_g729_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set g729 mode done\n", - __func__); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G729A_DL; - - rc = 0; - } else { - pr_err("%s: RPC write for set g729 mode failed %d\n", - __func__, rc); - } - break; - } - case MVS_MODE_G722: { - struct audio_mvs_set_g722_mode_msg set_g722_mode_msg; - - /* Set G722 mode. */ - memset(&set_g722_mode_msg, 0, sizeof(set_g722_mode_msg)); - set_g722_mode_msg.g722_mode = cpu_to_be32(audio->rate_type); - - pr_debug("%s: mode of g722:%d\n", - __func__, set_g722_mode_msg.g722_mode); - - msm_rpc_setup_req(&set_g722_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G722_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g722_mode_msg, - sizeof(set_g722_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set g722 mode done\n", - __func__); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G722_DL; - - rc = 0; - } - break; - } - case MVS_MODE_G711A: { - struct audio_mvs_set_g711A_mode_msg set_g711A_mode_msg; - struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg; - - /* Set G711A mode. */ - memset(&set_g711A_mode_msg, 0, sizeof(set_g711A_mode_msg)); - set_g711A_mode_msg.g711A_mode = cpu_to_be32(audio->rate_type); - - pr_debug("%s: mode of g711A:%d\n", - __func__, set_g711A_mode_msg.g711A_mode); - - msm_rpc_setup_req(&set_g711A_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_G711A_SET_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_g711A_mode_msg, - sizeof(set_g711A_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set g711A mode done\n", - __func__); - - /* Save the MVS configuration information. */ - audio->frame_mode = MVS_FRAME_MODE_G711A_DL; - /* Set DTX MODE. */ - memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg)); - set_dtx_mode_msg.dtx_mode = - cpu_to_be32((audio->dtx_mode)); - - msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_dtx_mode_msg, - sizeof(set_dtx_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set dtx done\n", - __func__); - - rc = 0; - } - rc = 0; - } else { - pr_err("%s: RPC write for set g711A mode failed %d\n", - __func__, rc); - } - break; - } - case MVS_MODE_EFR: - case MVS_MODE_FR: - case MVS_MODE_HR: { - struct audio_mvs_set_efr_mode_msg set_efr_mode_msg; - - /* Set G729 mode. */ - memset(&set_efr_mode_msg, 0, sizeof(set_efr_mode_msg)); - set_efr_mode_msg.efr_mode = cpu_to_be32(audio->dtx_mode); - - pr_debug("%s: mode of EFR, FR and HR:%d\n", - __func__, set_efr_mode_msg.efr_mode); - - msm_rpc_setup_req(&set_efr_mode_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_GSM_SET_DTX_MODE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &set_efr_mode_msg, - sizeof(set_efr_mode_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for set EFR, FR and HR mode done\n", - __func__); - - /* Save the MVS configuration information. */ - if ((audio->mvs_mode == MVS_MODE_EFR) || - (audio->mvs_mode == MVS_MODE_FR)) - audio->frame_mode = MVS_FRAME_MODE_GSM_DL; - if (audio->mvs_mode == MVS_MODE_HR) - audio->frame_mode = MVS_FRAME_MODE_HR_DL; - - rc = 0; - } else { - pr_err("%s: RPC write for set EFR, FR and HR mode failed %d\n", - __func__, rc); - } - break; - } - default: - rc = -EINVAL; - pr_err("Default case\n"); - } - return rc; -} - -static int audio_mvs_setup(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_enable_msg enable_msg; - - pr_debug("%s:\n", __func__); - - /* Enable MVS. */ - memset(&enable_msg, 0, sizeof(enable_msg)); - enable_msg.enable_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - enable_msg.enable_args.mode = cpu_to_be32(audio->mvs_mode); - enable_msg.enable_args.ul_cb_func_id = cpu_to_be32(MVS_UL_CB_FUNC_ID); - enable_msg.enable_args.dl_cb_func_id = cpu_to_be32(MVS_DL_CB_FUNC_ID); - enable_msg.enable_args.context = cpu_to_be32(MVS_PKT_CONTEXT_ISR); - - msm_rpc_setup_req(&enable_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_ENABLE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, &enable_msg, sizeof(enable_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for enable done\n", __func__); - - rc = wait_event_timeout(audio->mode_wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 10 * HZ); - - if (rc > 0) { - pr_debug("%s: Wait event for enable succeeded\n", - __func__); - rc = audio_mvs_setup_mode(audio); - if (rc < 0) { - pr_err("%s: Unknown MVS mode %d\n", - __func__, audio->mvs_mode); - } - pr_err("rc value after mode setup: %d\n", rc); - } else { - pr_err("%s: Wait event for enable failed %d\n", - __func__, rc); - } - } else { - pr_err("%s: RPC write for enable failed %d\n", __func__, rc); - } - - return rc; -} - -static int audio_mvs_start(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_acquire_msg acquire_msg; - - pr_info("%s:\n", __func__); - - /* Prevent sleep. */ - wake_lock(&audio->suspend_lock); - pm_qos_update_request(&audio->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - /* Acquire MVS. */ - memset(&acquire_msg, 0, sizeof(acquire_msg)); - acquire_msg.acquire_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - acquire_msg.acquire_args.cb_func_id = cpu_to_be32(MVS_CB_FUNC_ID); - - msm_rpc_setup_req(&acquire_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_ACQUIRE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, - &acquire_msg, - sizeof(acquire_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for acquire done\n", __func__); - - rc = wait_event_timeout(audio->wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - - if (rc > 0) { - - rc = audio_mvs_setup(audio); - - if (rc == 0) - audio->state = AUDIO_MVS_STARTED; - - } else { - pr_err("%s: Wait event for acquire failed %d\n", - __func__, rc); - - rc = -EBUSY; - } - } else { - pr_err("%s: RPC write for acquire failed %d\n", __func__, rc); - - rc = -EBUSY; - } - - return rc; -} - -static int audio_mvs_stop(struct audio_mvs_info_type *audio) -{ - int rc = 0; - struct audio_mvs_release_msg release_msg; - - pr_info("%s:\n", __func__); - - /* Release MVS. */ - memset(&release_msg, 0, sizeof(release_msg)); - release_msg.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP); - - msm_rpc_setup_req(&release_msg.rpc_hdr, - audio->rpc_prog, - audio->rpc_ver, - MVS_RELEASE_PROC); - - audio->rpc_status = RPC_STATUS_FAILURE; - rc = msm_rpc_write(audio->rpc_endpt, &release_msg, sizeof(release_msg)); - - if (rc >= 0) { - pr_debug("%s: RPC write for release done\n", __func__); - - rc = wait_event_timeout(audio->mode_wait, - (audio->rpc_status != RPC_STATUS_FAILURE), - 1 * HZ); - - if (rc > 0) { - pr_debug("%s: Wait event for release succeeded\n", - __func__); - - audio->state = AUDIO_MVS_STOPPED; - - /* Un-block read in case it is waiting for data. */ - wake_up(&audio->out_wait); - rc = 0; - } else { - pr_err("%s: Wait event for release failed %d\n", - __func__, rc); - } - } else { - pr_err("%s: RPC write for release failed %d\n", __func__, rc); - } - - /* Allow sleep. */ - pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&audio->suspend_lock); - - return rc; -} - -static void audio_mvs_process_rpc_request(uint32_t procedure, - uint32_t xid, - void *data, - uint32_t length, - struct audio_mvs_info_type *audio) -{ - int rc = 0; - - pr_debug("%s:\n", __func__); - - switch (procedure) { - case MVS_EVENT_CB_TYPE_PROC: { - struct audio_mvs_cb_func_args *args = data; - struct rpc_reply_hdr reply_hdr; - - pr_debug("%s: MVS CB CB_FUNC_ID 0x%x\n", - __func__, be32_to_cpu(args->cb_func_id)); - - if (be32_to_cpu(args->valid_ptr)) { - uint32_t event_type = be32_to_cpu(args->event); - - pr_debug("%s: MVS CB event type %d\n", - __func__, be32_to_cpu(args->event)); - - if (event_type == AUDIO_MVS_COMMAND) { - uint32_t cmd_status = be32_to_cpu( - args->event_data.mvs_ev_command_type.cmd_status); - - pr_debug("%s: MVS CB command status %d\n", - __func__, cmd_status); - - if (cmd_status == AUDIO_MVS_CMD_SUCCESS) { - audio->rpc_status = RPC_STATUS_SUCCESS; - wake_up(&audio->wait); - } - - } else if (event_type == AUDIO_MVS_MODE) { - uint32_t mode_status = be32_to_cpu( - args->event_data.mvs_ev_mode_type.mode_status); - - pr_debug("%s: MVS CB mode status %d\n", - __func__, mode_status); - - if (mode_status == AUDIO_MVS_MODE_READY) { - audio->rpc_status = RPC_STATUS_SUCCESS; - wake_up(&audio->mode_wait); - } - } else { - pr_err("%s: MVS CB unknown event type %d\n", - __func__, event_type); - } - } else { - pr_err("%s: MVS CB event pointer not valid\n", - __func__); - } - - /* Send ack to modem. */ - memset(&reply_hdr, 0, sizeof(reply_hdr)); - reply_hdr.xid = cpu_to_be32(xid); - reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - reply_hdr.reply_stat = cpu_to_be32(RPCMSG_REPLYSTAT_ACCEPTED); - - reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - reply_hdr.data.acc_hdr.verf_flavor = 0; - reply_hdr.data.acc_hdr.verf_length = 0; - - rc = msm_rpc_write(audio->rpc_endpt, - &reply_hdr, - sizeof(reply_hdr)); - - if (rc < 0) - pr_err("%s: RPC write for response failed %d\n", - __func__, rc); - - break; - } - - case MVS_PACKET_UL_FN_TYPE_PROC: { - uint32_t *args = data; - uint32_t pkt_len; - uint32_t frame_mode; - struct audio_mvs_ul_reply ul_reply; - struct audio_mvs_buf_node *buf_node = NULL; - - pr_debug("%s: MVS UL CB_FUNC_ID 0x%x\n", - __func__, be32_to_cpu(*args)); - args++; - - pkt_len = be32_to_cpu(*args); - pr_debug("%s: UL pkt_len %d\n", __func__, pkt_len); - args++; - - /* Copy the vocoder packets. */ - mutex_lock(&audio->out_lock); - - if (!list_empty(&audio->free_out_queue)) { - buf_node = list_first_entry(&audio->free_out_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - memcpy(&buf_node->frame.voc_pkt[0], args, pkt_len); - buf_node->frame.len = pkt_len; - pkt_len = ALIGN(pkt_len, 4); - args = args + pkt_len/4; - - pr_debug("%s: UL valid_ptr 0x%x\n", - __func__, be32_to_cpu(*args)); - args++; - - frame_mode = be32_to_cpu(*args); - pr_debug("%s: UL frame_mode %d\n", - __func__, frame_mode); - args++; - - pr_debug("%s: UL frame_mode %d\n", - __func__, be32_to_cpu(*args)); - args++; - - pr_debug("%s: UL frame_mode %d\n", - __func__, be32_to_cpu(*args)); - args++; - - pr_debug("%s: UL mvs_mode %d\n", - __func__, be32_to_cpu(*args)); - args++; - - pr_debug("%s: UL buf_free_cnt %d\n", - __func__, be32_to_cpu(*args)); - args++; - - if (frame_mode == MVS_FRAME_MODE_AMR_UL) { - /* Extract AMR frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL AMR frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_PCM_UL) { - /* PCM don't have frame_type */ - buf_node->frame.frame_type = 0; - } else if (frame_mode == MVS_FRAME_MODE_VOC_TX) { - /* Extracting EVRC current buffer frame rate*/ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL EVRC frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G711_UL) { - /* Extract G711 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL G711 frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G729A_UL) { - /* Extract G729 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL G729 frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G722_UL) { - /* Extract G722 frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL G722 frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if (frame_mode == MVS_FRAME_MODE_G711A_UL) { - /* Extract G711A frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL G711A frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else if ((frame_mode == MVS_FRAME_MODE_GSM_UL) || - (frame_mode == MVS_FRAME_MODE_HR_UL)) { - /* Extract EFR, FR and HR frame type. */ - buf_node->frame.frame_type = be32_to_cpu(*args); - - pr_debug("%s: UL EFR,FR,HR frame_type %d\n", - __func__, be32_to_cpu(*args)); - } else { - pr_debug("%s: UL Unknown frame mode %d\n", - __func__, frame_mode); - } - - list_add_tail(&buf_node->list, &audio->out_queue); - } else { - pr_err("%s: UL data dropped, read is slow\n", __func__); - } - - mutex_unlock(&audio->out_lock); - - wake_up(&audio->out_wait); - - /* Send UL message accept to modem. */ - memset(&ul_reply, 0, sizeof(ul_reply)); - ul_reply.reply_hdr.xid = cpu_to_be32(xid); - ul_reply.reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - ul_reply.reply_hdr.reply_stat = cpu_to_be32( - RPCMSG_REPLYSTAT_ACCEPTED); - - ul_reply.reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - ul_reply.reply_hdr.data.acc_hdr.verf_flavor = 0; - ul_reply.reply_hdr.data.acc_hdr.verf_length = 0; - - ul_reply.valid_pkt_status_ptr = cpu_to_be32(0x00000001); - ul_reply.pkt_status = cpu_to_be32(0x00000000); - - rc = msm_rpc_write(audio->rpc_endpt, - &ul_reply, - sizeof(ul_reply)); - - if (rc < 0) - pr_err("%s: RPC write for UL response failed %d\n", - __func__, rc); - - break; - } - - case MVS_PACKET_DL_FN_TYPE_PROC: { - struct audio_mvs_dl_cb_func_args *args = data; - struct audio_mvs_dl_reply dl_reply; - uint32_t frame_mode; - struct audio_mvs_buf_node *buf_node = NULL; - - pr_debug("%s: MVS DL CB CB_FUNC_ID 0x%x\n", - __func__, be32_to_cpu(args->cb_func_id)); - - frame_mode = be32_to_cpu(args->frame_mode); - pr_debug("%s: DL frame_mode %d\n", __func__, frame_mode); - - /* Prepare and send the DL packets to modem. */ - memset(&dl_reply, 0, sizeof(dl_reply)); - dl_reply.reply_hdr.xid = cpu_to_be32(xid); - dl_reply.reply_hdr.type = cpu_to_be32(RPC_TYPE_REPLY); - dl_reply.reply_hdr.reply_stat = cpu_to_be32( - RPCMSG_REPLYSTAT_ACCEPTED); - - dl_reply.reply_hdr.data.acc_hdr.accept_stat = cpu_to_be32( - RPC_ACCEPTSTAT_SUCCESS); - dl_reply.reply_hdr.data.acc_hdr.verf_flavor = 0; - dl_reply.reply_hdr.data.acc_hdr.verf_length = 0; - - mutex_lock(&audio->in_lock); - - if (!list_empty(&audio->in_queue)) { - buf_node = list_first_entry(&audio->in_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - memcpy(&dl_reply.voc_pkt, - &buf_node->frame.voc_pkt[0], - buf_node->frame.len); - - pr_debug("%s:frame mode %d\n", __func__, frame_mode); - if (frame_mode == MVS_FRAME_MODE_AMR_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_PCM_DL) { - dl_reply.cdc_param.gnr_arg.param1 = 0; - dl_reply.cdc_param.gnr_arg.param2 = 0; - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_VOC_RX) { - dl_reply.cdc_param.gnr_arg.param1 = - cpu_to_be32(buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = 0; - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G711_DL) { - dl_reply.cdc_param.g711_arg.param1 = - cpu_to_be32(buf_node->frame.frame_type); - dl_reply.cdc_param.\ - g711_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.g711_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G729A_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G722_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if (frame_mode == MVS_FRAME_MODE_G711A_DL) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else if ((frame_mode == MVS_FRAME_MODE_GSM_DL) || - (frame_mode == MVS_FRAME_MODE_HR_DL)) { - dl_reply.cdc_param.gnr_arg.param1 = cpu_to_be32( - buf_node->frame.frame_type); - dl_reply.cdc_param.gnr_arg.param2 = - cpu_to_be32(audio->rate_type); - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_NORMAL); - } else { - pr_err("%s: DL Unknown frame mode %d\n", - __func__, frame_mode); - } - list_add_tail(&buf_node->list, &audio->free_in_queue); - } else { - pr_debug("%s: No DL data available to send to MVS\n", - __func__); - if (frame_mode == MVS_FRAME_MODE_G711_DL) { - dl_reply.cdc_param.\ - g711_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.g711_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_SLOW); - } else { - dl_reply.cdc_param.\ - gnr_arg.valid_pkt_status_ptr = - cpu_to_be32(0x00000001); - dl_reply.cdc_param.gnr_arg.pkt_status = - cpu_to_be32(AUDIO_MVS_PKT_SLOW); - } - } - - mutex_unlock(&audio->in_lock); - - dl_reply.valid_frame_info_ptr = cpu_to_be32(0x00000001); - - dl_reply.frame_mode = cpu_to_be32(audio->frame_mode); - dl_reply.frame_mode_again = cpu_to_be32(audio->frame_mode); - - dl_reply.frame_info_hdr.frame_mode = - cpu_to_be32(audio->frame_mode); - dl_reply.frame_info_hdr.mvs_mode = cpu_to_be32(audio->mvs_mode); - dl_reply.frame_info_hdr.buf_free_cnt = 0; - - rc = msm_rpc_write(audio->rpc_endpt, - &dl_reply, - sizeof(dl_reply)); - - if (rc < 0) - pr_err("%s: RPC write for DL response failed %d\n", - __func__, rc); - - break; - } - - default: - pr_err("%s: Unknown CB type %d\n", __func__, procedure); - } -} - -static int audio_mvs_thread(void *data) -{ - struct audio_mvs_info_type *audio = data; - struct rpc_request_hdr *rpc_hdr = NULL; - - pr_info("%s:\n", __func__); - - while (!kthread_should_stop()) { - - int rpc_hdr_len = msm_rpc_read(audio->rpc_endpt, - (void **) &rpc_hdr, - -1, - -1); - - if (rpc_hdr_len < 0) { - pr_err("%s: RPC read failed %d\n", - __func__, rpc_hdr_len); - - break; - } else if (rpc_hdr_len < RPC_COMMON_HDR_SZ) { - continue; - } else { - uint32_t rpc_type = be32_to_cpu(rpc_hdr->type); - if (rpc_type == RPC_TYPE_REPLY) { - struct rpc_reply_hdr *rpc_reply = - (void *) rpc_hdr; - uint32_t reply_status; - - if (rpc_hdr_len < RPC_REPLY_HDR_SZ) - continue; - - reply_status = - be32_to_cpu(rpc_reply->reply_stat); - - if (reply_status != RPCMSG_REPLYSTAT_ACCEPTED) { - /* If the command is not accepted, there - * will be no response callback. Wake - * the caller and report error. */ - audio->rpc_status = RPC_STATUS_REJECT; - - wake_up(&audio->wait); - - pr_err("%s: RPC reply status denied\n", - __func__); - } - } else if (rpc_type == RPC_TYPE_REQUEST) { - if (rpc_hdr_len < RPC_REQUEST_HDR_SZ) - continue; - - audio_mvs_process_rpc_request( - be32_to_cpu(rpc_hdr->procedure), - be32_to_cpu(rpc_hdr->xid), - (void *) (rpc_hdr + 1), - (rpc_hdr_len - sizeof(*rpc_hdr)), - audio); - } else { - pr_err("%s: Unexpected RPC type %d\n", - __func__, rpc_type); - } - } - - kfree(rpc_hdr); - rpc_hdr = NULL; - } - - pr_info("%s: MVS thread stopped\n", __func__); - - return 0; -} - -static int audio_mvs_alloc_buf(struct audio_mvs_info_type *audio) -{ - int i = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct list_head *ptr = NULL; - struct list_head *next = NULL; - - pr_debug("%s:\n", __func__); - - /* Allocate input buffers. */ - for (i = 0; i < MVS_MAX_Q_LEN; i++) { - buf_node = kmalloc(sizeof(struct audio_mvs_buf_node), - GFP_KERNEL); - - if (buf_node != NULL) { - list_add_tail(&buf_node->list, - &audio->free_in_queue); - } else { - pr_err("%s: No memory for IO buffers\n", - __func__); - goto err; - } - buf_node = NULL; - } - - /* Allocate output buffers. */ - for (i = 0; i < MVS_MAX_Q_LEN; i++) { - buf_node = kmalloc(sizeof(struct audio_mvs_buf_node), - GFP_KERNEL); - - if (buf_node != NULL) { - list_add_tail(&buf_node->list, - &audio->free_out_queue); - } else { - pr_err("%s: No memory for IO buffers\n", - __func__); - goto err; - } - buf_node = NULL; - } - - return 0; - -err: - list_for_each_safe(ptr, next, &audio->free_in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - ptr = next = NULL; - list_for_each_safe(ptr, next, &audio->free_out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - return -ENOMEM; -} - -static void audio_mvs_free_buf(struct audio_mvs_info_type *audio) -{ - struct list_head *ptr = NULL; - struct list_head *next = NULL; - struct audio_mvs_buf_node *buf_node = NULL; - - pr_debug("%s:\n", __func__); - - mutex_lock(&audio->in_lock); - /* Free input buffers. */ - list_for_each_safe(ptr, next, &audio->in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - ptr = next = NULL; - /* Free free_input buffers. */ - list_for_each_safe(ptr, next, &audio->free_in_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - mutex_unlock(&audio->in_lock); - - mutex_lock(&audio->out_lock); - ptr = next = NULL; - /* Free output buffers. */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - - /* Free free_ioutput buffers. */ - ptr = next = NULL; - list_for_each_safe(ptr, next, &audio->free_out_queue) { - buf_node = list_entry(ptr, struct audio_mvs_buf_node, list); - list_del(&buf_node->list); - kfree(buf_node); - buf_node = NULL; - } - mutex_unlock(&audio->out_lock); -} - -static int audio_mvs_open(struct inode *inode, struct file *file) -{ - int rc = 0; - - pr_info("%s:\n", __func__); - - mutex_lock(&audio_mvs_info.lock); - - if (audio_mvs_info.state == AUDIO_MVS_CLOSED) { - - if (audio_mvs_info.task != NULL || - audio_mvs_info.rpc_endpt != NULL) { - rc = audio_mvs_alloc_buf(&audio_mvs_info); - - if (rc == 0) { - audio_mvs_info.state = AUDIO_MVS_OPENED; - file->private_data = &audio_mvs_info; - } - } else { - pr_err("%s: MVS thread and RPC end point do not exist\n", - __func__); - - rc = -ENODEV; - } - } else { - pr_err("%s: MVS driver exists, state %d\n", - __func__, audio_mvs_info.state); - - rc = -EBUSY; - } - - mutex_unlock(&audio_mvs_info.lock); - - return rc; -} - -static int audio_mvs_release(struct inode *inode, struct file *file) -{ - - struct audio_mvs_info_type *audio = file->private_data; - - pr_info("%s:\n", __func__); - - mutex_lock(&audio->lock); - if (audio->state == AUDIO_MVS_STARTED) - audio_mvs_stop(audio); - audio_mvs_free_buf(audio); - audio->state = AUDIO_MVS_CLOSED; - mutex_unlock(&audio->lock); - - pr_debug("%s: Release done\n", __func__); - return 0; -} - -static ssize_t audio_mvs_read(struct file *file, - char __user *buf, - size_t count, - loff_t *pos) -{ - int rc = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct audio_mvs_info_type *audio = file->private_data; - - pr_debug("%s:\n", __func__); - - rc = wait_event_interruptible_timeout(audio->out_wait, - (!list_empty(&audio->out_queue) || - audio->state == AUDIO_MVS_STOPPED), - 1 * HZ); - - if (rc > 0) { - mutex_lock(&audio->out_lock); - if ((audio->state == AUDIO_MVS_STARTED) && - (!list_empty(&audio->out_queue))) { - - if (count >= sizeof(struct q5v2_msm_audio_mvs_frame)) { - buf_node = list_first_entry(&audio->out_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - rc = copy_to_user(buf, - &buf_node->frame, - sizeof(struct q5v2_msm_audio_mvs_frame) - ); - - if (rc == 0) { - rc = buf_node->frame.len + - sizeof(buf_node->frame.frame_type) + - sizeof(buf_node->frame.len); - } else { - pr_err("%s: Copy to user retuned %d", - __func__, rc); - - rc = -EFAULT; - } - - list_add_tail(&buf_node->list, - &audio->free_out_queue); - } else { - pr_err("%s: Read count %d < sizeof(frame) %d", - __func__, count, - sizeof(struct q5v2_msm_audio_mvs_frame)); - - rc = -ENOMEM; - } - } else { - pr_err("%s: Read performed in state %d\n", - __func__, audio->state); - - rc = -EPERM; - } - mutex_unlock(&audio->out_lock); - - } else if (rc == 0) { - pr_err("%s: No UL data available\n", __func__); - - rc = -ETIMEDOUT; - } else { - pr_err("%s: Read was interrupted\n", __func__); - - rc = -ERESTARTSYS; - } - - return rc; -} - -static ssize_t audio_mvs_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *pos) -{ - int rc = 0; - struct audio_mvs_buf_node *buf_node = NULL; - struct audio_mvs_info_type *audio = file->private_data; - - pr_debug("%s:\n", __func__); - - mutex_lock(&audio->in_lock); - if (audio->state == AUDIO_MVS_STARTED) { - if (count <= sizeof(struct q5v2_msm_audio_mvs_frame)) { - if (!list_empty(&audio->free_in_queue)) { - buf_node = - list_first_entry(&audio->free_in_queue, - struct audio_mvs_buf_node, - list); - list_del(&buf_node->list); - - rc = copy_from_user(&buf_node->frame, - buf, - count); - - list_add_tail(&buf_node->list, - &audio->in_queue); - } else { - pr_err("%s: No free DL buffs\n", __func__); - } - } else { - pr_err("%s: Write count %d < sizeof(frame) %d", - __func__, count, - sizeof(struct q5v2_msm_audio_mvs_frame)); - - rc = -ENOMEM; - } - } else { - pr_err("%s: Write performed in invalid state %d\n", - __func__, audio->state); - - rc = -EPERM; - } - mutex_unlock(&audio->in_lock); - - return rc; -} - -static long audio_mvs_ioctl(struct file *file, - unsigned int cmd, - unsigned long arg) -{ - int rc = 0; - - struct audio_mvs_info_type *audio = file->private_data; - - pr_info("%s:\n", __func__); - - switch (cmd) { - case AUDIO_GET_MVS_CONFIG: { - struct msm_audio_mvs_config config; - - pr_debug("%s: IOCTL GET_MVS_CONFIG\n", __func__); - - mutex_lock(&audio->lock); - config.mvs_mode = audio->mvs_mode; - config.rate_type = audio->rate_type; - config.min_max_rate.min_rate = audio->min_max_rate.min_rate; - config.min_max_rate.max_rate = audio->min_max_rate.max_rate; - mutex_unlock(&audio->lock); - - rc = copy_to_user((void *)arg, &config, sizeof(config)); - if (rc == 0) - rc = sizeof(config); - else - pr_err("%s: Config copy failed %d\n", __func__, rc); - - break; - } - - case AUDIO_SET_MVS_CONFIG: { - struct msm_audio_mvs_config config; - - pr_debug("%s: IOCTL SET_MVS_CONFIG\n", __func__); - - rc = copy_from_user(&config, (void *)arg, sizeof(config)); - if (rc == 0) { - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_OPENED) { - audio->mvs_mode = config.mvs_mode; - audio->rate_type = config.rate_type; - audio->dtx_mode = config.dtx_mode; - audio->min_max_rate.min_rate = - config.min_max_rate.min_rate; - audio->min_max_rate.max_rate = - config.min_max_rate.max_rate; - } else { - pr_err("%s: Set confg called in state %d\n", - __func__, audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - } else { - pr_err("%s: Config copy failed %d\n", __func__, rc); - } - - break; - } - - case AUDIO_START: { - pr_debug("%s: IOCTL START\n", __func__); - - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_OPENED || - audio->state == AUDIO_MVS_STOPPED) { - rc = audio_mvs_start(audio); - - if (rc != 0) - audio_mvs_stop(audio); - } else { - pr_err("%s: Start called in invalid state %d\n", - __func__, audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - - break; - } - - case AUDIO_STOP: { - pr_debug("%s: IOCTL STOP\n", __func__); - - mutex_lock(&audio->lock); - - if (audio->state == AUDIO_MVS_STARTED) { - rc = audio_mvs_stop(audio); - } else { - pr_err("%s: Stop called in invalid state %d\n", - __func__, audio->state); - - rc = -EPERM; - } - - mutex_unlock(&audio->lock); - break; - } - - default: { - pr_err("%s: Unknown IOCTL %d\n", __func__, cmd); - } - } - - return rc; -} - -static const struct file_operations audio_mvs_fops = { - .owner = THIS_MODULE, - .open = audio_mvs_open, - .release = audio_mvs_release, - .read = audio_mvs_read, - .write = audio_mvs_write, - .unlocked_ioctl = audio_mvs_ioctl -}; - -struct miscdevice audio_mvs_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mvs", - .fops = &audio_mvs_fops -}; - -static int __init audio_mvs_init(void) -{ - int rc; - - pr_info("%s:\n", __func__); - - memset(&audio_mvs_info, 0, sizeof(audio_mvs_info)); - mutex_init(&audio_mvs_info.lock); - mutex_init(&audio_mvs_info.in_lock); - mutex_init(&audio_mvs_info.out_lock); - - init_waitqueue_head(&audio_mvs_info.wait); - init_waitqueue_head(&audio_mvs_info.mode_wait); - init_waitqueue_head(&audio_mvs_info.out_wait); - - INIT_LIST_HEAD(&audio_mvs_info.in_queue); - INIT_LIST_HEAD(&audio_mvs_info.free_in_queue); - INIT_LIST_HEAD(&audio_mvs_info.out_queue); - INIT_LIST_HEAD(&audio_mvs_info.free_out_queue); - - wake_lock_init(&audio_mvs_info.suspend_lock, - WAKE_LOCK_SUSPEND, - "audio_mvs_suspend"); - pm_qos_add_request(&audio_mvs_info.pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - - audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG, - MVS_VERS_COMP_VER5, - MSM_RPC_UNINTERRUPTIBLE); - - if (IS_ERR(audio_mvs_info.rpc_endpt)) { - pr_err("%s: MVS RPC connect failed ver 0x%x\n", __func__, - MVS_VERS_COMP_VER5); - audio_mvs_info.rpc_endpt = msm_rpc_connect_compatible(MVS_PROG, - MVS_VERS_COMP_VER4, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(audio_mvs_info.rpc_endpt)) { - pr_err("%s: MVS RPC connect failed ver 0x%x\n", - __func__, MVS_VERS_COMP_VER4); - audio_mvs_info.rpc_endpt = - msm_rpc_connect_compatible(MVS_PROG, - MVS_VERS, - MSM_RPC_UNINTERRUPTIBLE); - if (IS_ERR(audio_mvs_info.rpc_endpt)) { - pr_err("%s: MVS RPC connect failed ver 0x%x\n", - __func__, MVS_VERS); - rc = PTR_ERR(audio_mvs_info.rpc_endpt); - audio_mvs_info.rpc_endpt = NULL; - goto done; - } else { - pr_debug("%s: MVS RPC connect succeeded ver\ - 0x%x\n", __func__, MVS_VERS); - audio_mvs_info.rpc_prog = MVS_PROG; - audio_mvs_info.rpc_ver = MVS_VERS; - } - } else { - pr_debug("%s: MVS RPC connect succeeded ver 0x%x\n", - __func__, MVS_VERS_COMP_VER4); - audio_mvs_info.rpc_prog = MVS_PROG; - audio_mvs_info.rpc_ver = MVS_VERS_COMP_VER4; - } - } else { - pr_debug("%s: MVS RPC connect succeeded ver 0x%x\n", __func__, - MVS_VERS_COMP_VER5); - audio_mvs_info.rpc_prog = MVS_PROG; - audio_mvs_info.rpc_ver = MVS_VERS_COMP_VER5; - } - audio_mvs_info.task = kthread_run(audio_mvs_thread, - &audio_mvs_info, - "audio_mvs"); - if (IS_ERR(audio_mvs_info.task)) { - pr_err("%s: MVS thread create failed\n", __func__); - rc = PTR_ERR(audio_mvs_info.task); - audio_mvs_info.task = NULL; - msm_rpc_close(audio_mvs_info.rpc_endpt); - audio_mvs_info.rpc_endpt = NULL; - goto done; - } - - rc = misc_register(&audio_mvs_misc); -done: - return rc; -} - -static void __exit audio_mvs_exit(void) -{ - pr_info("%s:\n", __func__); - - misc_deregister(&audio_mvs_misc); -} - -module_init(audio_mvs_init); -module_exit(audio_mvs_exit); - -MODULE_DESCRIPTION("MSM MVS driver"); -MODULE_LICENSE("GPL v2"); - diff --git a/arch/arm/mach-msm/qdsp5v2/audio_out.c b/arch/arm/mach-msm/qdsp5v2/audio_out.c deleted file mode 100644 index a5ec5e416cb8..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_out.c +++ /dev/null @@ -1,775 +0,0 @@ -/* - * pcm audio output device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFSZ (960 * 5) -#define DMASZ (BUFSZ * 2) - -#define HOSTPCM_STREAM_ID 5 - -struct buffer { - void *data; - unsigned size; - unsigned used; - unsigned addr; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t wait; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_weight; - uint32_t out_buffer_size; - uint32_t device_events; - int16_t source; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_write; - int teos; /* valid only if tunnel mode & no data left for decoder */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - uint16_t dec_id; - int voice_state; - - struct wake_lock wakelock; - struct pm_qos_request pm_qos_req; - - struct audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *buff_handle; -}; - -static void audio_out_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - case AUDDEV_EVT_VOICE_STATE_CHG: - MM_DBG("AUDDEV_EVT_VOICE_STATE_CHG, state = %d\n", - evt_payload->voice_state); - audio->voice_state = evt_payload->voice_state; - /* Voice uplink Rx case */ - if (audio->running && - (audio->source & AUDPP_MIXER_UPLINK_RX) && - (audio->voice_state == VOICE_STATE_OFFCALL)) { - MM_DBG("Voice is terminated, Wake up write: %x %x\n", - audio->voice_state, audio->source); - wake_up(&audio->wait); - } - break; - default: - MM_ERR("ERROR:wrong event\n"); - break; - } -} - -static void audio_prevent_sleep(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - wake_lock(&audio->wakelock); - pm_qos_update_request(&audio->pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); -} - -static void audio_allow_sleep(struct audio *audio) -{ - pm_qos_update_request(&audio->pm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&audio->wakelock); - MM_DBG("\n"); /* Macro prints the file name and function */ -} - -static int audio_dsp_out_enable(struct audio *audio, int yes); -static int audio_dsp_send_buffer(struct audio *audio, unsigned id, - unsigned len); - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - /* refuse to start if we're not ready */ - if (!audio->out[0].used || !audio->out[1].used) - return -EIO; - - /* we start buffers 0 and 1, so buffer 0 will be the - * next one the dsp will want - */ - audio->out_tail = 0; - audio->out_needed = 0; - - audio_prevent_sleep(audio); - - if (audpp_enable(-1, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - audio_allow_sleep(audio); - return -ENODEV; - } - - audio->enabled = 1; - htc_pwrsink_set(PWRSINK_AUDIO, 100); - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio_dsp_out_enable(audio, 0); - - audpp_disable(-1, audio); - - wake_up(&audio->wait); - audio->out_needed = 0; - audio_allow_sleep(audio); - } - return 0; -} - -/* ------------------- dsp --------------------- */ -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - struct buffer *frame; - unsigned long flags; - static unsigned long pcmdmamsd_time; - - switch (id) { - case AUDPP_MSG_HOST_PCM_INTF_MSG: { - unsigned id = msg[3]; - unsigned idx = msg[4] - 1; - - MM_DBG("HOST_PCM id %d idx %d\n", id, idx); - if (id != AUDPP_MSG_HOSTPCM_ID_ARM_RX) { - MM_ERR("bogus id\n"); - break; - } - if (idx > 1) { - MM_ERR("bogus buffer idx\n"); - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (audio->running) { - atomic_add(audio->out[idx].used, &audio->out_bytes); - audio->out[idx].used = 0; - frame = audio->out + audio->out_tail; - if (frame->used) { - /* Reset teos flag to avoid stale - * PCMDMAMISS been considered - */ - audio->teos = 0; - audio_dsp_send_buffer( - audio, audio->out_tail, frame->used); - audio->out_tail ^= 1; - } else { - audio->out_needed++; - } - wake_up(&audio->wait); - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - break; - } - case AUDPP_MSG_PCMDMAMISSED: - /* prints only if 1 second is elapsed since the last time - * this message has been printed */ - if (printk_timed_ratelimit(&pcmdmamsd_time, 1000)) - printk(KERN_INFO "[%s:%s] PCMDMAMISSED %d\n", - __MM_FILE__, __func__, msg[0]); - audio->teos++; - MM_DBG("PCMDMAMISSED Count per Buffer %d\n", audio->teos); - wake_up(&audio->wait); - break; - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_route_stream(audio->dec_id, audio->source); - audio_dsp_out_enable(audio, 1); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_ERR("CFG_MSG %d?\n", msg[0]); - } - break; - default: - MM_ERR("UNKNOWN (%d)\n", id); - } -} - -static int audio_dsp_out_enable(struct audio *audio, int yes) -{ - struct audpp_cmd_pcm_intf cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_PCM_INTF; - cmd.stream = AUDPP_CMD_POPP_STREAM; - cmd.stream_id = audio->dec_id; - cmd.config = AUDPP_CMD_PCM_INTF_CONFIG_CMD_V; - cmd.intf_type = AUDPP_CMD_PCM_INTF_RX_ENA_ARMTODSP_V; - - if (yes) { - cmd.write_buf1LSW = audio->out[0].addr; - cmd.write_buf1MSW = audio->out[0].addr >> 16; - if (audio->out[0].used) - cmd.write_buf1_len = audio->out[0].used; - else - cmd.write_buf1_len = audio->out[0].size; - cmd.write_buf2LSW = audio->out[1].addr; - cmd.write_buf2MSW = audio->out[1].addr >> 16; - if (audio->out[1].used) - cmd.write_buf2_len = audio->out[1].used; - else - cmd.write_buf2_len = audio->out[1].size; - cmd.arm_to_rx_flag = AUDPP_CMD_PCM_INTF_ENA_V; - cmd.weight_decoder_to_rx = audio->out_weight; - cmd.weight_arm_to_rx = 1; - cmd.partition_number_arm_to_dsp = 0; - cmd.sample_rate = audio->out_sample_rate; - cmd.channel_mode = audio->out_channel_mode; - } - - return audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static int audio_dsp_send_buffer(struct audio *audio, unsigned idx, - unsigned len) -{ - struct audpp_cmd_pcm_intf_send_buffer cmd; - - cmd.cmd_id = AUDPP_CMD_PCM_INTF; - cmd.stream = AUDPP_CMD_POPP_STREAM; - cmd.stream_id = audio->dec_id; - cmd.config = AUDPP_CMD_PCM_INTF_BUFFER_CMD_V; - cmd.intf_type = AUDPP_CMD_PCM_INTF_RX_ENA_ARMTODSP_V; - cmd.dsp_to_arm_buf_id = 0; - cmd.arm_to_dsp_buf_id = idx + 1; - cmd.arm_to_dsp_buf_len = len; - - return audpp_send_queue2(&cmd, sizeof(cmd)); -} - -/* ------------------- device --------------------- */ -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->stopped = 0; -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->out_bytes); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - switch (cmd) { - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - if ((audio->voice_state != VOICE_STATE_INCALL) - && (audio->source & AUDPP_MIXER_UPLINK_RX)) { - MM_ERR("Unable to Start : state %d source %d\n", - audio->voice_state, audio->source); - rc = -EPERM; - break; - } - rc = audio_enable(audio); - break; - case AUDIO_STOP: - rc = audio_disable(audio); - audio->stopped = 1; - break; - case AUDIO_FLUSH: - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the write_lock. - * While audio->stopped write threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - else if (config.channel_count == 2) - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - else { - rc = -EINVAL; - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - return -EFAULT; - rc = 0; - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - if (!audio->running) - return -EINVAL; - - mutex_lock(&audio->write_lock); - - /* PCM DMAMISS message is sent only once in - * hpcm interface. So, wait for buffer complete - * and teos flag. - */ - rc = wait_event_interruptible(audio->wait, - (!audio->out[0].used && - !audio->out[1].used)); - - if (rc < 0) - goto done; - - rc = wait_event_interruptible(audio->wait, - audio->teos); -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static inline int rt_policy(int policy) -{ - if (unlikely(policy == SCHED_FIFO) || unlikely(policy == SCHED_RR)) - return 1; - return 0; -} - -static inline int task_has_rt_policy(struct task_struct *p) -{ - return rt_policy(p->policy); -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct sched_param s = { .sched_priority = 1 }; - struct audio *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - int old_prio = current->rt_priority; - int old_policy = current->policy; - int cap_nice = cap_raised(current_cap(), CAP_SYS_NICE); - int rc = 0; - - - if ((audio->voice_state == VOICE_STATE_OFFCALL) - && (audio->source & AUDPP_MIXER_UPLINK_RX) && - audio->running) { - MM_ERR("Not Permitted Voice Terminated: state %d source %x \ - running %d\n", - audio->voice_state, audio->source, audio->running); - return -EPERM; - } - /* just for this write, set us real-time */ - if (!task_has_rt_policy(current)) { - struct cred *new = prepare_creds(); - cap_raise(new->cap_effective, CAP_SYS_NICE); - commit_creds(new); - if ((sched_setscheduler(current, SCHED_RR, &s)) < 0) - MM_ERR("sched_setscheduler failed\n"); - } - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->wait, - (frame->used == 0) || (audio->stopped) || - ((audio->voice_state == VOICE_STATE_OFFCALL) && - (audio->source & AUDPP_MIXER_UPLINK_RX))); - - if (rc < 0) - break; - if (audio->stopped) { - rc = -EBUSY; - break; - } else if ((audio->voice_state == VOICE_STATE_OFFCALL) && - (audio->source & AUDPP_MIXER_UPLINK_RX)) { - MM_ERR("Not Permitted Voice Terminated: %d\n", - audio->voice_state); - rc = -EPERM; - break; - } - - xfer = count > frame->size ? frame->size : count; - if (copy_from_user(frame->data, buf, xfer)) { - rc = -EFAULT; - break; - } - frame->used = xfer; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - - spin_lock_irqsave(&audio->dsp_lock, flags); - frame = audio->out + audio->out_tail; - if (frame->used && audio->out_needed) { - /* Reset teos flag to avoid stale - * PCMDMAMISS been considered - */ - audio->teos = 0; - audio_dsp_send_buffer(audio, audio->out_tail, - frame->used); - audio->out_tail ^= 1; - audio->out_needed--; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } - - mutex_unlock(&audio->write_lock); - - /* restore scheduling policy and priority */ - if (!rt_policy(old_policy)) { - struct sched_param v = { .sched_priority = old_prio }; - if ((sched_setscheduler(current, old_policy, &v)) < 0) - MM_ERR("sched_setscheduler failed\n"); - if (likely(!cap_nice)) { - struct cred *new = prepare_creds(); - cap_lower(new->cap_effective, CAP_SYS_NICE); - commit_creds(new); - } - } - - if (buf > start) - return buf - start; - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio_flush(audio); - audio->opened = 0; - mutex_unlock(&audio->lock); - htc_pwrsink_set(PWRSINK_AUDIO, 0); - return 0; -} - -static struct audio the_audio; - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = &the_audio; - int rc; - - mutex_lock(&audio->lock); - - if (audio->opened) { - MM_ERR("busy\n"); - rc = -EBUSY; - goto done; - } - - - audio->dec_id = HOSTPCM_STREAM_ID; - - audio->out_buffer_size = BUFSZ; - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_weight = 100; - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - audio->vol_pan.pan = 0x0; - audio->source = 0x0; - - audio_flush(audio); - audio->voice_state = msm_get_voice_state(); - MM_DBG("voice_state = %x\n", audio->voice_state); - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG| - AUDDEV_EVT_VOICE_STATE_CHG; - - MM_DBG("register for event callback pdata %p\n", audio); - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - audio_out_listener, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listener\n", __func__); - goto done; - } - - file->private_data = audio; - audio->opened = 1; - rc = 0; -done: - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_out", - .fops = &audio_fops, -}; - -static int __init audio_init(void) -{ - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - int rc; - int len = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - client = msm_ion_client_create(UINT_MAX, "HostPCM"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - the_audio.client = client; - - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto buff_alloc_error; - } - the_audio.buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto buff_get_phys_error; - } else - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - the_audio.phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto buff_get_flags_error; - } - - the_audio.map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(the_audio.map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto buff_map_error; - } - the_audio.data = (char *)the_audio.map_v_write; - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) the_audio.data, (int) the_audio.phys); - mutex_init(&the_audio.lock); - mutex_init(&the_audio.write_lock); - spin_lock_init(&the_audio.dsp_lock); - init_waitqueue_head(&the_audio.wait); - wake_lock_init(&the_audio.wakelock, WAKE_LOCK_SUSPEND, "audio_pcm"); - pm_qos_add_request(&the_audio.pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - return misc_register(&audio_misc); -buff_map_error: -buff_get_phys_error: -buff_get_flags_error: - ion_free(client, the_audio.buff_handle); -buff_alloc_error: - ion_client_destroy(client); -client_create_error: - return rc; - -} - -late_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_pcm.c b/arch/arm/mach-msm/qdsp5v2/audio_pcm.c deleted file mode 100644 index cbd2913a6dab..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_pcm.c +++ /dev/null @@ -1,1577 +0,0 @@ -/* arch/arm/mach-msm/qdsp5v2/audio_pcm.c - * - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ADRV_STATUS_AIO_INTF 0x00000001 -#define ADRV_STATUS_OBUF_GIVEN 0x00000002 -#define ADRV_STATUS_IBUF_GIVEN 0x00000004 -#define ADRV_STATUS_FSYNC 0x00000008 - -/* Size must be power of 2 */ -#define BUFSZ_MAX 32768 -#define BUFSZ_MIN 4096 -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDDEC_DEC_PCM 0 - -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDPCM_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -#define __CONTAINS(r, v, l) ({ \ - typeof(r) __r = r; \ - typeof(v) __v = v; \ - typeof(v) __e = __v + l; \ - int res = ((__v >= __r->vaddr) && \ - (__e <= __r->vaddr + __r->len)); \ - res; \ -}) - -#define CONTAINS(r1, r2) ({ \ - typeof(r2) __r2 = r2; \ - __CONTAINS(r1, __r2->vaddr, __r2->len); \ -}) - -#define IN_RANGE(r, v) ({ \ - typeof(r) __r = r; \ - typeof(v) __vv = v; \ - int res = ((__vv >= __r->vaddr) && \ - (__vv < (__r->vaddr + __r->len))); \ - res; \ -}) - -#define OVERLAPS(r1, r2) ({ \ - typeof(r1) __r1 = r1; \ - typeof(r2) __r2 = r2; \ - typeof(__r2->vaddr) __v = __r2->vaddr; \ - typeof(__v) __e = __v + __r2->len - 1; \ - int res = (IN_RANGE(__r1, __v) || IN_RANGE(__r1, __e)); \ - res; \ -}) - -struct audio; - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audpcm_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audpcm_event { - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audpcm_pmem_region { - struct list_head list; - struct file *file; - int fd; - void *vaddr; - unsigned long paddr; - unsigned long kvaddr; - unsigned long len; - unsigned ref_cnt; -}; - -struct audpcm_buffer_node { - struct list_head list; - struct msm_audio_aio_buf buf; - unsigned long paddr; -}; - -struct audpcm_drv_operations { - void (*send_data)(struct audio *, unsigned); - void (*out_flush)(struct audio *); - int (*fsync)(struct audio *); -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - struct list_head out_queue; /* queue to retain output buffers */ - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - uint32_t out_bits; /* bits per sample */ - - /* data allocated for various buffers */ - char *data; - int32_t phys; - void *map_v_write; - uint32_t drv_status; - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint32_t device_events; - - unsigned volume; - - uint16_t dec_id; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audpcm_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - struct list_head pmem_region_queue; - struct audpcm_drv_operations drv_ops; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -static unsigned long audpcm_pmem_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up); - -static void pcm_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->volume = evt_payload->session_vol; - MM_DBG("AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->volume); - if (audio->running) - audpp_set_volume_and_pan(audio->dec_id, audio->volume, - 0, POPP); - break; - default: - MM_ERR("ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audio->drv_ops.send_data(audio, 1); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event:module audplaytask\n"); - break; - - default: - MM_ERR("unexpected message from decoder\n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason=0x%04x\n", - reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - audpp_route_stream(audio->dec_id, - audio->source); - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - break; - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_set_volume_and_pan(audio->dec_id, audio->volume, - 0, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_ERR("audio_dsp_event: CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - pr_info("%s: AVSYNC_MSG\n", __func__); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_DBG("audio_dsp_event: UNKNOWN (%d)\n", id); - } - -} - - -struct msm_adsp_ops audpcmdec_adsp_ops = { - .event = audplay_dsp_event, -}; - - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_PCM; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WAV_LEN >> 1; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - cmd.pcm_width = audio->out_bits; - cmd.sign = 0; - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audpcm_async_send_data(struct audio *audio, unsigned needed) -{ - unsigned long flags; - - if (!audio->running) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (needed && !audio->wflush) { - audio->out_needed = 1; - if (audio->drv_status & ADRV_STATUS_OBUF_GIVEN) { - /* pop one node out of queue */ - union msm_audio_event_payload payload; - struct audpcm_buffer_node *used_buf; - - MM_DBG("consumed\n"); - - BUG_ON(list_empty(&audio->out_queue)); - used_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - list_del(&used_buf->list); - payload.aio_buf = used_buf->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(used_buf); - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - } - } - if (audio->out_needed) { - struct audpcm_buffer_node *next_buf; - struct audplay_cmd_bitstream_data_avail cmd; - if (!list_empty(&audio->out_queue)) { - next_buf = list_first_entry(&audio->out_queue, - struct audpcm_buffer_node, list); - MM_DBG("next_buf %p\n", next_buf); - if (next_buf) { - MM_DBG("next buf phy %lx len %d\n", - next_buf->paddr, next_buf->buf.data_len); - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL; - if (next_buf->buf.data_len) - cmd.decoder_id = audio->dec_id; - else { - cmd.decoder_id = -1; - MM_DBG("input EOS signaled\n"); - } - cmd.buf_ptr = (unsigned) next_buf->paddr; - cmd.buf_size = next_buf->buf.data_len >> 1; - cmd.partition_number = 0; - /* complete writes to the input buffer */ - wmb(); - audplay_send_queue0(audio, &cmd, sizeof(cmd)); - audio->out_needed = 0; - audio->drv_status |= ADRV_STATUS_OBUF_GIVEN; - } - } - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - if (!audio->running) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ -static void audpcm_async_flush(struct audio *audio) -{ - struct audpcm_buffer_node *buf_node; - struct list_head *ptr, *next; - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - list_for_each_safe(ptr, next, &audio->out_queue) { - buf_node = list_entry(ptr, struct audpcm_buffer_node, list); - list_del(&buf_node->list); - payload.aio_buf = buf_node->buf; - audpcm_post_event(audio, AUDIO_EVENT_WRITE_DONE, - payload); - kfree(buf_node); - } - audio->drv_status &= ~ADRV_STATUS_OBUF_GIVEN; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - audio->out_needed = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_ioport_reset(struct audio *audio) -{ - if (audio->drv_status & ADRV_STATUS_AIO_INTF) { - /* If fsync is in progress, make sure - * return value of fsync indicates - * abort due to flush - */ - if (audio->drv_status & ADRV_STATUS_FSYNC) { - MM_DBG("fsync in progress\n"); - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } else - audio->drv_ops.out_flush(audio); - } else { - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio->drv_ops.out_flush(audio); - mutex_unlock(&audio->write_lock); - } - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audpcm_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audpcm_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audpcm_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audpcm_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audpcm_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audpcm_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audpcm_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audpcm_event, list); - list_del(&drv_evt->list); - } - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (drv_evt && drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - mutex_lock(&audio->lock); - audpcm_pmem_fixup(audio, drv_evt->payload.aio_buf.buf_addr, - drv_evt->payload.aio_buf.buf_len, 0); - mutex_unlock(&audio->lock); - } - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audpcm_pmem_lookup_vaddr(struct audio *audio, void *addr, - unsigned long len, struct audpcm_pmem_region **region) -{ - struct audpcm_pmem_region *region_elt; - - int match_count = 0; - - *region = NULL; - - /* returns physical address or zero */ - list_for_each_entry(region_elt, &audio->pmem_region_queue, - list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { - /* offset since we could pass vaddr inside a registerd - * pmem buffer - */ - match_count++; - if (!*region) - *region = region_elt; - } - } - - if (match_count > 1) { - MM_ERR("multiple hits for vaddr %p, len %ld\n", addr, len); - list_for_each_entry(region_elt, - &audio->pmem_region_queue, list) { - if (addr >= region_elt->vaddr && - addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - MM_ERR("\t%p, %ld --> %p\n", - region_elt->vaddr, - region_elt->len, - (void *)region_elt->paddr); - } - } - - return *region ? 0 : -1; -} - -static unsigned long audpcm_pmem_fixup(struct audio *audio, void *addr, - unsigned long len, int ref_up) -{ - struct audpcm_pmem_region *region; - unsigned long paddr; - int ret; - - ret = audpcm_pmem_lookup_vaddr(audio, addr, len, ®ion); - if (ret) { - MM_ERR("lookup (%p, %ld) failed\n", addr, len); - return 0; - } - if (ref_up) - region->ref_cnt++; - else - region->ref_cnt--; - MM_DBG("found region %p ref_cnt %d\n", region, region->ref_cnt); - paddr = region->paddr + (addr - region->vaddr); - return paddr; -} - -/* audio -> lock must be held at this point */ -static int audpcm_aio_buf_add(struct audio *audio, unsigned dir, - void __user *arg) -{ - unsigned long flags; - struct audpcm_buffer_node *buf_node; - - buf_node = kmalloc(sizeof(*buf_node), GFP_KERNEL); - - if (!buf_node) - return -ENOMEM; - - if (copy_from_user(&buf_node->buf, arg, sizeof(buf_node->buf))) { - kfree(buf_node); - return -EFAULT; - } - - MM_DBG("node %p dir %x buf_addr %p buf_len %d data_len %d\n", - buf_node, dir, buf_node->buf.buf_addr, - buf_node->buf.buf_len, buf_node->buf.data_len); - - buf_node->paddr = audpcm_pmem_fixup( - audio, buf_node->buf.buf_addr, - buf_node->buf.buf_len, 1); - if (dir) { - /* write */ - if (!buf_node->paddr || - (buf_node->paddr & 0x1) || - (buf_node->buf.data_len & 0x1) || - (!buf_node->buf.data_len)) { - kfree(buf_node); - return -EINVAL; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - list_add_tail(&buf_node->list, &audio->out_queue); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - audio->drv_ops.send_data(audio, 0); - } - - MM_DBG("Add buf_node %p paddr %lx\n", buf_node, buf_node->paddr); - - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - if (cmd == AUDIO_SET_VOLUME) { - unsigned long flags; - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->volume = arg; - if (audio->running) - audpp_set_volume_and_pan(audio->dec_id, arg, 0, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - return 0; - } - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audpcm_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->wflush = 0; - } - break; - - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - if (config.bits == 8) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_8; - else if (config.bits == 16) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - else if (config.bits == 24) - config.bits = AUDPP_CMD_WAV_PCM_WIDTH_24; - else { - rc = -EINVAL; - break; - } - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - audio->out_bits = config.bits; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_8) - config.bits = 8; - else if (audio->out_bits == AUDPP_CMD_WAV_PCM_WIDTH_24) - config.bits = 24; - else - config.bits = 16; - config.unused[0] = 0; - config.unused[1] = 0; - - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - - case AUDIO_ASYNC_WRITE: - if (audio->drv_status & ADRV_STATUS_FSYNC) - rc = -EBUSY; - else - rc = audpcm_aio_buf_add(audio, 1, (void __user *) arg); - break; - - case AUDIO_ASYNC_READ: - MM_ERR("AUDIO_ASYNC_READ not supported\n"); - rc = -EPERM; - break; - - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - return -EFAULT; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -int audpcm_async_fsync(struct audio *audio) -{ - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - /* Blocking client sends more data */ - mutex_lock(&audio->lock); - audio->drv_status |= ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - mutex_lock(&audio->write_lock); - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - (audio->teos && audio->out_needed && - list_empty(&audio->out_queue)) - || audio->wflush || audio->stopped); - - if (audio->stopped || audio->wflush) - rc = -EBUSY; - - mutex_unlock(&audio->write_lock); - mutex_lock(&audio->lock); - audio->drv_status &= ~ADRV_STATUS_FSYNC; - mutex_unlock(&audio->lock); - - return rc; -} - -int audpcm_sync_fsync(struct audio *audio) -{ - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audio->drv_ops.send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); - return rc; -} - -int audpcm_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - - if (!audio->running) - return -EINVAL; - - return audio->drv_ops.fsync(audio); -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0; - unsigned dsize; - - if (audio->drv_status & ADRV_STATUS_AIO_INTF) - return -EPERM; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > (frame->size - 1)) ? - frame->size - 1 : count; - cpy_ptr++; - dsize = 1; - audio->reserved = 0; - } else - xfer = (count > frame->size) ? frame->size : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audio->drv_ops.send_data(audio, 0); - } - } - mutex_unlock(&audio->write_lock); - if (buf > start) - return buf - start; - - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio->drv_ops.out_flush(audio); - - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audpcm_reset_event_queue(audio); - if (audio->data) { - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -static void audpcm_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audpcm_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audpcm_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audpcm_suspend(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audpcm_resume(struct early_suspend *h) -{ - struct audpcm_suspend_ctl *ctl = - container_of(h, struct audpcm_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audpcm_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audpcm_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audpcm_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audpcm_debug_fops = { - .read = audpcm_debug_read, - .open = audpcm_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, i, dec_attrb, decid; - struct audpcm_event *e_node = NULL; - unsigned pmem_sz = DMASZ_MAX; - -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_pcm_dec_" + 5]; -#endif - - /* Allocate audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_PCM; - if (file->f_mode & FMODE_READ) { - MM_ERR("Non-Tunneled mode not supported\n"); - rc = -EPERM; - kfree(audio); - goto done; - } else - dec_attrb |= MSM_AUD_MODE_TUNNEL; - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - /* AIO interface */ - if (file->f_flags & O_NONBLOCK) { - MM_DBG("set to aio interface\n"); - audio->drv_status |= ADRV_STATUS_AIO_INTF; - audio->drv_ops.send_data = audpcm_async_send_data; - audio->drv_ops.out_flush = audpcm_async_flush; - audio->drv_ops.fsync = audpcm_async_fsync; - } else { - MM_DBG("set to std io interface\n"); - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, - SZ_4K); - if (audio->phys) { - audio->map_v_write = ioremap( - audio->phys, pmem_sz); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys\ - address freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x \ - kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers \ - freeing instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; - } - audio->out_dma_sz = pmem_sz; - audio->drv_ops.send_data = audplay_send_data; - audio->drv_ops.out_flush = audio_flush; - audio->drv_ops.fsync = audpcm_sync_fsync; - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = (audio->out_dma_sz >> 1); - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audpcmdec_adsp_ops, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - INIT_LIST_HEAD(&audio->out_queue); - INIT_LIST_HEAD(&audio->pmem_region_queue); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - audio->out_bits = AUDPP_CMD_WAV_PCM_WIDTH_16; - audio->volume = 0x7FFF; - audio->drv_ops.out_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - pcm_listner, - (void *)audio); - if (rc) { - MM_ERR("failed to register listnet\n"); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_pcm_dec_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audpcm_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_ERR("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audpcm_resume; - audio->suspend_ctl.node.suspend = audpcm_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDPCM_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audpcm_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - if (audio->data) { - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - } - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_pcm_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audpcm_fsync, -}; - -struct miscdevice audio_pcm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_dec", - .fops = &audio_pcm_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_pcm_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c b/arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c deleted file mode 100644 index ff3a69628312..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_pcm_in.c +++ /dev/null @@ -1,1027 +0,0 @@ -/* - * pcm audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM (8) -#define FRAME_HEADER_SIZE (8) /*4 half words*/ -/* size of a mono frame with 256 samples */ -#define MONO_DATA_SIZE_256 (512) /* in bytes*/ -/*size of a mono frame with 512 samples */ -#define MONO_DATA_SIZE_512 (1024) /* in bytes*/ -/*size of a mono frame with 1024 samples */ -#define MONO_DATA_SIZE_1024 (2048) /* in bytes */ - -/*size of a stereo frame with 256 samples per channel */ -#define STEREO_DATA_SIZE_256 (1024) /* in bytes*/ -/*size of a stereo frame with 512 samples per channel */ -#define STEREO_DATA_SIZE_512 (2048) /* in bytes*/ -/*size of a stereo frame with 1024 samples per channel */ -#define STEREO_DATA_SIZE_1024 (4096) /* in bytes */ - -#define MAX_FRAME_SIZE ((STEREO_DATA_SIZE_1024) + FRAME_HEADER_SIZE) -#define DMASZ (MAX_FRAME_SIZE * FRAME_NUM) - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - - struct msm_adsp_module *audrec; - - /* configuration to use on next enable */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t buffer_size; /* 2048 for mono, 4096 for stereo */ - uint32_t enc_type; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; /* Session Id */ - - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; /* device events interested in */ - uint32_t in_call; - uint32_t dev_cnt; - int voice_state; - spinlock_t dev_lock; - - struct audrec_session_info session_info; /*audrec session info*/ - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_read; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int abort; /* set when error, like sample rate mismatch */ - int dual_mic_config; - char *build_id; - struct ion_client *client; - struct ion_handle *output_buff_handle; -}; - -static struct audio_in the_audio_in; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -/* DSP command send functions */ -static int audpcm_in_enc_config(struct audio_in *audio, int enable); -static int audpcm_in_param_config(struct audio_in *audio); -static int audpcm_in_mem_config(struct audio_in *audio); -static int audpcm_in_record_config(struct audio_in *audio, int enable); -static int audpcm_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); - -static void audpcm_in_get_dsp_frames(struct audio_in *audio); - -static void audpcm_in_flush(struct audio_in *audio); - -static void pcm_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_in *audio = (struct audio_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - if (!audio->in_call) - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1)) - audpcm_in_record_config(audio, 1); - - break; - } - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - if (!audio->in_call) - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if (!audio->running || !audio->enabled) - break; - - /* Turn of as per source */ - if (audio->source) - audpcm_in_record_config(audio, 1); - else - /* Turn off all */ - audpcm_in_record_config(audio, 0); - - break; - } - case AUDDEV_EVT_VOICE_STATE_CHG: { - MM_DBG("AUDDEV_EVT_VOICE_STATE_CHG, state = %d\n", - evt_payload->voice_state); - audio->voice_state = evt_payload->voice_state; - if (audio->in_call && audio->running) { - if (audio->voice_state == VOICE_STATE_INCALL) - audpcm_in_record_config(audio, 1); - else if (audio->voice_state == VOICE_STATE_OFFCALL) { - audpcm_in_record_config(audio, 0); - wake_up(&audio->wait); - } - } - break; - } - case AUDDEV_EVT_FREQ_CHG: { - MM_DBG("Encoder Driver got sample rate change event\n"); - MM_DBG("sample rate %d\n", evt_payload->freq_info.sample_rate); - MM_DBG("dev_type %d\n", evt_payload->freq_info.dev_type); - MM_DBG("acdb_dev_id %d\n", evt_payload->freq_info.acdb_dev_id); - if (audio->running == 1) { - /* Stop Recording sample rate does not match - with device sample rate */ - if (evt_payload->freq_info.sample_rate != - audio->samp_rate) { - audpcm_in_record_config(audio, 0); - audio->abort = 1; - wake_up(&audio->wait); - } - } - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) - audpcm_in_param_config(audio); - else { /* Encoder disable success */ - audio->running = 0; - audpcm_in_record_config(audio, 0); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG \n"); - audpcm_in_mem_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG \n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if ((!audio->in_call && (audio->dev_cnt > 0)) || - (audio->in_call && - (audio->voice_state == VOICE_STATE_INCALL))) - audpcm_in_record_config(audio, 1); - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - audpcm_in_get_dsp_frames(audio); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event :module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void audpcm_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - else - audio->in_count++; - - audpcm_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -struct msm_adsp_ops audrec_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audpcm_in_enc_config(struct audio_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG_2 command"); - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG command"); - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audpcm_in_param_config(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_parm_cfg_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.aud_rec_samplerate_idx = audio->samp_rate; - if (audio->dual_mic_config) - cmd.aud_rec_stereo_mode = DUAL_MIC_STEREO_RECORDING; - else - cmd.aud_rec_stereo_mode = audio->channel_mode; - - if (audio->channel_mode == AUDREC_CMD_MODE_MONO) - cmd.aud_rec_frame_size = audio->buffer_size/2; - else - cmd.aud_rec_frame_size = audio->buffer_size/4; - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int audpcm_in_record_config(struct audio_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & - INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audpcm_in_mem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - - /* prepare buffer pointers: - * Mono: 1024 samples + 4 halfword header - * Stereo: 2048 samples + 4 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - /* word increment*/ - audio->in[n].data = data + (FRAME_HEADER_SIZE/2); - data += ((FRAME_HEADER_SIZE/2) + (audio->buffer_size/2)); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - FRAME_HEADER_SIZE)); - } - - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int audpcm_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audpcm_in_enable(struct audio_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - audpcm_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audpcm_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - audpcm_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void audpcm_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -/* ------------------- device --------------------- */ -static long audpcm_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - /* Poll at 48KHz always */ - freq = 48000; - MM_DBG("AUDIO_START\n"); - if (audio->in_call && (audio->voice_state != - VOICE_STATE_INCALL)) { - rc = -EPERM; - break; - } - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d sample rate requested %d\n", - freq, audio->samp_rate); - if (rc < 0) { - MM_DBG("sample rate can not be set, return code %d\n",\ - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - audio->dual_mic_config = msm_get_dual_mic_config(audio->enc_id); - /*DSP supports fluence block and by default ACDB layer will - applies the fluence pre-processing feature, if dual MIC config - is enabled implies client want to record pure dual MIC sample - for this we need to over ride the fluence pre processing - feature at ACDB layer to not to apply if fluence preprocessing - feature supported*/ - if (audio->dual_mic_config) { - MM_INFO("dual MIC config = %d, over ride the fluence " - "feature\n", audio->dual_mic_config); - fluence_feature_update(audio->dual_mic_config, - audio->enc_id); - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = audio->samp_rate; - audpreproc_update_audrec_info(&audio->session_info); - rc = audpcm_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audpcm_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - audio->abort = 0; - break; - } - case AUDIO_FLUSH: { - if (audio->stopped) { - /* Make sure we're stopped and we wake any threads - * that might be blocked holding the read_lock. - * While audio->stopped read threads will always - * exit immediately. - */ - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audpcm_in_flush(audio); - mutex_unlock(&audio->read_lock); - } - break; - } - case AUDIO_SET_CONFIG: { - struct msm_audio_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (audio->build_id[17] == '1') { - audio->enc_type = ENC_TYPE_EXT_WAV | audio->mode; - if (cfg.channel_count == 1) { - cfg.channel_count = AUDREC_CMD_MODE_MONO; - if ((cfg.buffer_size == MONO_DATA_SIZE_256) || - (cfg.buffer_size == - MONO_DATA_SIZE_512) || - (cfg.buffer_size == - MONO_DATA_SIZE_1024)) { - audio->buffer_size = cfg.buffer_size; - } else { - rc = -EINVAL; - break; - } - } else if (cfg.channel_count == 2) { - cfg.channel_count = AUDREC_CMD_MODE_STEREO; - if ((cfg.buffer_size == - STEREO_DATA_SIZE_256) || - (cfg.buffer_size == - STEREO_DATA_SIZE_512) || - (cfg.buffer_size == - STEREO_DATA_SIZE_1024)) { - audio->buffer_size = cfg.buffer_size; - } else { - rc = -EINVAL; - break; - } - } else { - rc = -EINVAL; - break; - } - } else if (audio->build_id[17] == '0') { - audio->enc_type = ENC_TYPE_WAV | audio->mode; - if (cfg.channel_count == 1) { - cfg.channel_count = AUDREC_CMD_MODE_MONO; - audio->buffer_size = MONO_DATA_SIZE_1024; - } else if (cfg.channel_count == 2) { - cfg.channel_count = AUDREC_CMD_MODE_STEREO; - audio->buffer_size = STEREO_DATA_SIZE_1024; - } - } else { - MM_ERR("wrong build_id = %s\n", audio->build_id); - return -ENODEV; - } - audio->samp_rate = cfg.sample_rate; - audio->channel_mode = cfg.channel_count; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - cfg.sample_rate = audio->samp_rate; - if (audio->channel_mode == AUDREC_CMD_MODE_MONO) - cfg.channel_count = 1; - else - cfg.channel_count = 2; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_INCALL: { - struct msm_voicerec_mode cfg; - unsigned long flags; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.rec_mode != VOC_REC_BOTH && - cfg.rec_mode != VOC_REC_UPLINK && - cfg.rec_mode != VOC_REC_DOWNLINK) { - MM_ERR("invalid rec_mode\n"); - rc = -EINVAL; - break; - } else { - spin_lock_irqsave(&audio->dev_lock, flags); - if (cfg.rec_mode == VOC_REC_UPLINK) - audio->source = VOICE_UL_SOURCE_MIX_MASK; - else if (cfg.rec_mode == VOC_REC_DOWNLINK) - audio->source = VOICE_DL_SOURCE_MIX_MASK; - else - audio->source = VOICE_DL_SOURCE_MIX_MASK | - VOICE_UL_SOURCE_MIX_MASK ; - audio->in_call = 1; - spin_unlock_irqrestore(&audio->dev_lock, flags); - } - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audpcm_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->abort || (audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL))); - if (rc < 0) - break; - - if (!audio->in_count) { - if (audio->stopped) { - MM_DBG("Driver in stop state, No more \ - buffer to read"); - rc = 0;/* End of File */ - break; - } else if (audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL)) { - MM_DBG("Not Permitted Voice Terminated\n"); - rc = -EPERM; /* Voice Call stopped */ - break; - } - } - - if (audio->abort) { - rc = -EPERM; /* Not permitted due to abort */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - if (count >= size) { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - } else { - MM_ERR("short read count %d\n", count); - break; - } - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static ssize_t audpcm_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - return -EINVAL; -} - -static int audpcm_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audio->in_call = 0; - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audpcm_in_disable(audio); - audpcm_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -static int audpcm_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_in; - int rc; - int encid; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - - client = msm_ion_client_create(UINT_MAX, "Audio_PCM_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", DMASZ); - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->data)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->data = (char *)audio->map_v_read; - - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - rc = -EACCES; - MM_ERR("Non tunnel encoding is not supported\n"); - goto done; - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - rc = -EACCES; - goto done; - } - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - audio->channel_mode = AUDREC_CMD_MODE_MONO; - audio->buffer_size = MONO_DATA_SIZE_1024; - audio->samp_rate = 8000; - audio->enc_type = ENC_TYPE_EXT_WAV | audio->mode; - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - audio->abort = 0; - audpcm_in_flush(audio); - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_FREQ_CHG | - AUDDEV_EVT_VOICE_STATE_CHG; - - audio->voice_state = msm_get_voice_state(); - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - pcm_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - goto evt_error; - } - file->private_data = audio; - audio->opened = 1; - rc = 0; - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = audpcm_in_open, - .release = audpcm_in_release, - .read = audpcm_in_read, - .write = audpcm_in_write, - .unlocked_ioctl = audpcm_in_ioctl, -}; - -struct miscdevice audio_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_in", - .fops = &audio_in_fops, -}; - -static int __init audpcm_in_init(void) -{ - mutex_init(&the_audio_in.lock); - mutex_init(&the_audio_in.read_lock); - spin_lock_init(&the_audio_in.dsp_lock); - spin_lock_init(&the_audio_in.dev_lock); - init_waitqueue_head(&the_audio_in.wait); - init_waitqueue_head(&the_audio_in.wait_enable); - return misc_register(&audio_in_misc); -} - -device_initcall(audpcm_in_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_qcelp.c b/arch/arm/mach-msm/qdsp5v2/audio_qcelp.c deleted file mode 100644 index 33ca7a15397b..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_qcelp.c +++ /dev/null @@ -1,1638 +0,0 @@ -/* - * qcelp 13k audio decoder device - * - * Copyright (c) 2008-2012, The Linux Foundation. All rights reserved. - * - * This code is based in part on audio_mp3.c, which is - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org. - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFSZ 1094 /* QCELP 13K Hold 600ms packet data = 36 * 30 and - 14 bytes of meta in */ -#define BUF_COUNT 2 -#define DMASZ (BUFSZ * BUF_COUNT) - -#define PCM_BUFSZ_MIN 1624 /* 100ms worth of data and - 24 bytes of meta out */ -#define PCM_BUF_MAX_COUNT 5 - -#define AUDDEC_DEC_QCELP 9 - -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDQCELP_METAFIELD_MASK 0xFFFF0000 -#define AUDQCELP_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDQCELP_EOS_FLG_MASK 0x01 -#define AUDQCELP_EOS_NONE 0x0 /* No EOS detected */ -#define AUDQCELP_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDQCELP_EVENT_NUM 10 /* Default number of pre-allocated event pkts */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audqcelp_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audqcelp_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[BUF_COUNT]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section - START */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* Host PCM section - END */ - - struct msm_adsp_module *audplay; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - uint8_t opened:1; - uint8_t enabled:1; - uint8_t running:1; - uint8_t stopped:1; /* set when stopped, cleared on flush */ - uint8_t pcm_feedback:1; /* set when non-tunnel mode */ - uint8_t buf_refresh:1; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audqcelp_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audqcelp_send_data(struct audio *audio, unsigned needed); -static void audqcelp_config_hostpcm(struct audio *audio); -static void audqcelp_buffer_refresh(struct audio *audio); -static void audqcelp_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audqcelp_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audqcelp_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audqcelp_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - audio->enabled = 1; - return 0; -} - -static void qcelp_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audqcelp_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audqcelp_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audqcelp_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audqcelp_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audqcelp_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - } -} - -static void audqcelp_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init \n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg \n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audqcelp_config_hostpcm(audio); - audqcelp_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audqcelp_buffer_refresh(audio); - break; - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -struct msm_adsp_ops audplay_adsp_ops_qcelp = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_QCELP; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_v13k cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_V13K_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = 8000; - cmd.stereo_cfg = AUDPP_CMD_PCM_INTF_MONO_V; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDQCELP_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len / 2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audqcelp_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - MM_DBG("buf0_addr=%x buf0_len=%d\n", refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audqcelp_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = 1; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - -static void audqcelp_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audqcelp_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->out_needed = 0; -} - -static void audqcelp_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audqcelp_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audqcelp_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audqcelp_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audqcelp_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audqcelp_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audqcelp_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - - -static long audqcelp_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audqcelp_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audqcelp_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audqcelp_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audqcelp_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audqcelp_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audqcelp_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audqcelp_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audqcelp_disable(audio); - audio->stopped = 1; - audqcelp_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audqcelp_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG:{ - struct msm_audio_config config; - if (copy_from_user(&config, (void *)arg, - sizeof(config))) { - rc = -EFAULT; - break; - } - audio->mfield = config.meta_field; - MM_DBG("AUDIO_SET_CONFIG applicable \ - for metafield configuration\n"); - rc = 0; - break; - } - case AUDIO_GET_CONFIG:{ - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = BUF_COUNT; - config.sample_rate = 8000; - config.channel_count = 1; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - - if (copy_from_user(&config, (void *)arg, - sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buf %d\n", - config.buffer_count * config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read buf\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr 0x%08x \ - kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audqcelp_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audqcelp_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d\n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver does - not know frame size, read count must be greater or equal - to size of PCM samples */ - MM_DBG("read stop - partial frame\n"); - break; - } else { - MM_DBG("read from in[%d]\n", audio->read_next); - - if (copy_to_user(buf, - audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x\n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; - /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audqcelp_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audqcelp_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audqcelp_send_data(audio, 0); - -done: - return rc; -} - -static ssize_t audqcelp_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDQCELP_EOS_NONE; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - if (count & 1) - return -EINVAL; - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - MM_DBG("buffer available\n"); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDQCELP_EOS_FLG_OFFSET] & - AUDQCELP_EOS_FLG_MASK) { - MM_DBG("EOS SET\n"); - eos_condition = AUDQCELP_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDQCELP_EOS_FLG_OFFSET] &= - ~AUDQCELP_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - frame->used = xfer + mfield_size; - audio->out_head ^= 1; - count -= xfer; - buf += xfer; - audqcelp_send_data(audio, 0); - } - if (eos_condition == AUDQCELP_EOS_SET) - rc = audqcelp_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audqcelp_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int) audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audqcelp_disable(audio); - audqcelp_flush(audio); - audqcelp_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->opened = 0; - audio->event_abort = 1; - wake_up(&audio->event_wait); - audqcelp_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audqcelp_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audqcelp_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audqcelp_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audqcelp_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audqcelp_suspend(struct early_suspend *h) -{ - struct audqcelp_suspend_ctl *ctl = - container_of(h, struct audqcelp_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audqcelp_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audqcelp_resume(struct early_suspend *h) -{ - struct audqcelp_suspend_ctl *ctl = - container_of(h, struct audqcelp_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audqcelp_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audqcelp_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audqcelp_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 1024; - static char buffer[1024]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audqcelp_debug_fops = { - .read = audqcelp_debug_read, - .open = audqcelp_debug_open, -}; -#endif - -static int audqcelp_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - struct audqcelp_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_qcelp_" + 5]; -#endif - - /* Create audio instance, set to zero */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance\n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_QCELP; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (!audio->phys) { - MM_ERR("could not allocate write buffers, freeing instance \ - 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else { - audio->map_v_write = ioremap(audio->phys, DMASZ); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write phys address, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - } - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_qcelp, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - /* Initialize all locks of audio instance */ - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - /* Initialize buffer */ - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = BUFSZ; - - audio->out[1].data = audio->data + BUFSZ; - audio->out[1].addr = audio->phys + BUFSZ; - audio->out[1].size = BUFSZ; - - audio->vol_pan.volume = 0x2000; - - audqcelp_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - qcelp_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listnet\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_qcelp_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, &audqcelp_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audqcelp_resume; - audio->suspend_ctl.node.suspend = audqcelp_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDQCELP_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audqcelp_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_qcelp_fops = { - .owner = THIS_MODULE, - .open = audqcelp_open, - .release = audqcelp_release, - .read = audqcelp_read, - .write = audqcelp_write, - .unlocked_ioctl = audqcelp_ioctl, - .fsync = audqcelp_fsync, -}; - -struct miscdevice audio_qcelp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp", - .fops = &audio_qcelp_fops, -}; - -static int __init audqcelp_init(void) -{ - return misc_register(&audio_qcelp_misc); -} - -static void __exit audqcelp_exit(void) -{ - misc_deregister(&audio_qcelp_misc); -} - -module_init(audqcelp_init); -module_exit(audqcelp_exit); - -MODULE_DESCRIPTION("MSM QCELP 13K driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c b/arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c deleted file mode 100644 index 37a6726b7c9b..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_qcelp_in.c +++ /dev/null @@ -1,1591 +0,0 @@ -/* - * qcelp audio input device - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define META_OUT_SIZE 24 -/* FRAME_NUM must be a power of two */ -#define FRAME_NUM 8 -#define QCELP_FRAME_SIZE 36 /* 36 bytes data */ -#define FRAME_SIZE (22 * 2) /* 36 bytes data */ - /* 36 bytes data + 24 meta field*/ -#define NT_FRAME_SIZE (QCELP_FRAME_SIZE + META_OUT_SIZE) -#define DMASZ (NT_FRAME_SIZE * FRAME_NUM) -#define OUT_FRAME_NUM (2) -#define OUT_BUFFER_SIZE (4 * 1024 + META_OUT_SIZE) -#define BUFFER_SIZE (OUT_BUFFER_SIZE * OUT_FRAME_NUM) - - -#define AUDPREPROC_QCELP_EOS_FLG_OFFSET 0x0A -#define AUDPREPROC_QCELP_EOS_FLG_MASK 0x01 -#define AUDPREPROC_QCELP_EOS_NONE 0x0 /* No EOS detected */ -#define AUDPREPROC_QCELP_EOS_SET 0x1 /* EOS set in meta field */ - -struct buffer { - void *data; - uint32_t size; - uint32_t read; - uint32_t addr; - uint32_t used; - uint32_t mfield_sz; -}; - -struct audio_in { - struct buffer in[FRAME_NUM]; - - spinlock_t dsp_lock; - - atomic_t in_bytes; - atomic_t in_samples; - - struct mutex lock; - struct mutex read_lock; - wait_queue_head_t wait; - wait_queue_head_t wait_enable; - /*write section*/ - struct buffer out[OUT_FRAME_NUM]; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - uint32_t out_count; - - struct mutex write_lock; - wait_queue_head_t write_wait; - int32_t out_phys; /* physical address of write buffer */ - char *out_data; - int mfield; /* meta field embedded in data */ - int wflush; /*write flush */ - int rflush; /*read flush*/ - int out_frame_cnt; - - struct msm_adsp_module *audrec; - - struct audrec_session_info session_info; /*audrec session info*/ - - /* configuration to use on next enable */ - uint32_t buffer_size; /* Frame size (36 bytes) */ - uint32_t samp_rate; - uint32_t channel_mode; - uint32_t enc_type; - - struct msm_audio_qcelp_enc_config cfg; - uint32_t rec_mode; - - uint32_t dsp_cnt; - uint32_t in_head; /* next buffer dsp will write */ - uint32_t in_tail; /* next buffer read() will read */ - uint32_t in_count; /* number of buffers available to read() */ - uint32_t mode; - uint32_t eos_ack; - uint32_t flush_ack; - - const char *module_name; - unsigned queue_ids; - uint16_t enc_id; - - uint16_t source; /* Encoding source bit mask */ - uint32_t device_events; - uint32_t in_call; - uint32_t dev_cnt; - int voice_state; - spinlock_t dev_lock; - - /* data allocated for various buffers */ - char *data; - dma_addr_t phys; - void *map_v_read; - void *map_v_write; - - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - char *build_id; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -struct audio_frame { - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct audio_frame_nt { - uint16_t metadata_len; - uint16_t frame_count_lsw; - uint16_t frame_count_msw; - uint16_t frame_length; - uint16_t erased_pcm; - uint16_t reserved; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; - unsigned char raw_bitstream[]; /* samples */ -} __attribute__((packed)); - -struct qcelp_encoded_meta_out { - uint16_t metadata_len; - uint16_t time_stamp_dword_lsw; - uint16_t time_stamp_dword_msw; - uint16_t time_stamp_lsw; - uint16_t time_stamp_msw; - uint16_t nflag_lsw; - uint16_t nflag_msw; -}; - -/* Audrec Queue command sent macro's */ -#define audrec_send_bitstreamqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, ((audio->queue_ids & 0xFFFF0000) >> 16),\ - cmd, len) - -#define audrec_send_audrecqueue(audio, cmd, len) \ - msm_adsp_write(audio->audrec, (audio->queue_ids & 0x0000FFFF),\ - cmd, len) - -/* DSP command send functions */ -static int audqcelp_in_enc_config(struct audio_in *audio, int enable); -static int audqcelp_in_param_config(struct audio_in *audio); -static int audqcelp_in_mem_config(struct audio_in *audio); -static int audqcelp_in_record_config(struct audio_in *audio, int enable); -static int audqcelp_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt); - -static void audqcelp_in_get_dsp_frames(struct audio_in *audio); -static int audpcm_config(struct audio_in *audio); -static void audqcelp_out_flush(struct audio_in *audio); -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio); -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed); -static void audqcelp_nt_in_get_dsp_frames(struct audio_in *audio); - -static void audqcelp_in_flush(struct audio_in *audio); - -static void qcelp_in_listener(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio_in *audio = (struct audio_in *) private_data; - unsigned long flags; - - MM_DBG("evt_id = 0x%8x\n", evt_id); - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: { - MM_DBG("AUDDEV_EVT_DEV_RDY\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt++; - if (!audio->in_call) - audio->source |= (0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((audio->running == 1) && (audio->enabled == 1) && - (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) - audqcelp_in_record_config(audio, 1); - } - break; - case AUDDEV_EVT_DEV_RLS: { - MM_DBG("AUDDEV_EVT_DEV_RLS\n"); - spin_lock_irqsave(&audio->dev_lock, flags); - audio->dev_cnt--; - if (!audio->in_call) - audio->source &= ~(0x1 << evt_payload->routing_id); - spin_unlock_irqrestore(&audio->dev_lock, flags); - - if ((!audio->running) || (!audio->enabled)) - break; - - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - /* Turn of as per source */ - if (audio->source) - audqcelp_in_record_config(audio, 1); - else - /* Turn off all */ - audqcelp_in_record_config(audio, 0); - } - } - break; - case AUDDEV_EVT_VOICE_STATE_CHG: { - MM_DBG("AUDDEV_EVT_VOICE_STATE_CHG, state = %d\n", - evt_payload->voice_state); - audio->voice_state = evt_payload->voice_state; - if (audio->in_call && audio->running && - (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - if (audio->voice_state == VOICE_STATE_INCALL) - audqcelp_in_record_config(audio, 1); - else if (audio->voice_state == VOICE_STATE_OFFCALL) { - audqcelp_in_record_config(audio, 0); - wake_up(&audio->wait); - } - } - - break; - } - default: - MM_ERR("wrong event %d\n", evt_id); - break; - } -} - -/* ------------------- dsp preproc event handler--------------------- */ -static void audpreproc_dsp_event(void *data, unsigned id, void *msg) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg *err_msg = msg; - - MM_ERR("ERROR_MSG: stream id %d err idx %d\n", - err_msg->stream_id, err_msg->aud_preproc_err_idx); - /* Error case */ - wake_up(&audio->wait_enable); - break; - } - case AUDPREPROC_CMD_CFG_DONE_MSG: { - MM_DBG("CMD_CFG_DONE_MSG \n"); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg *enc_cfg_msg = msg; - - MM_DBG("CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - 0x%8x\n", enc_cfg_msg->stream_id, - enc_cfg_msg->rec_enc_type); - /* Encoder enable success */ - if (enc_cfg_msg->rec_enc_type & ENCODE_ENABLE) { - if(audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - MM_DBG("routing command\n"); - audpreproc_cmd_cfg_routing_mode(audio); - } else { - audqcelp_in_param_config(audio); - } - } else { /* Encoder disable success */ - audio->running = 0; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audqcelp_in_record_config(audio, 0); - else - wake_up(&audio->wait_enable); - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - MM_DBG("CMD_ENC_PARAM_CFG_DONE_MSG\n"); - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) - audqcelp_in_mem_config(audio); - else - audpcm_config(audio); - break; - } - case AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG: { - struct audpreproc_cmd_routing_mode_done\ - *routing_cfg_done_msg = msg; - if (routing_cfg_done_msg->configuration == 0) { - MM_INFO("routing configuration failed\n"); - audio->running = 0; - } else - audqcelp_in_param_config(audio); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - MM_DBG("AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG \n"); - wake_up(&audio->wait_enable); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -/* ------------------- dsp audrec event handler--------------------- */ -static void audrec_dsp_event(void *data, unsigned id, size_t len, - void (*getevent)(void *ptr, size_t len)) -{ - struct audio_in *audio = data; - - switch (id) { - case AUDREC_CMD_MEM_CFG_DONE_MSG: { - MM_DBG("CMD_MEM_CFG_DONE MSG DONE\n"); - audio->running = 1; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if ((!audio->in_call && (audio->dev_cnt > 0)) || - (audio->in_call && - (audio->voice_state \ - == VOICE_STATE_INCALL))) - audqcelp_in_record_config(audio, 1); - } else { - audpreproc_pcm_send_data(audio, 1); - wake_up(&audio->wait_enable); - } - break; - } - case AUDREC_FATAL_ERR_MSG: { - struct audrec_fatal_err_msg fatal_err_msg; - - getevent(&fatal_err_msg, AUDREC_FATAL_ERR_MSG_LEN); - MM_ERR("FATAL_ERR_MSG: err id %d\n", - fatal_err_msg.audrec_err_id); - /* Error stop the encoder */ - audio->stopped = 1; - wake_up(&audio->wait); - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - wake_up(&audio->write_wait); - break; - } - case AUDREC_UP_PACKET_READY_MSG: { - struct audrec_up_pkt_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_PACKET_READY_MSG_LEN); - MM_DBG("UP_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packet_write_cnt_lsw, \ - pkt_ready_msg.audrec_packet_write_cnt_msw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_lsw, \ - pkt_ready_msg.audrec_up_prev_read_cnt_msw); - - audqcelp_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_PCM_BUFFER_PTR_UPDATE_ARM_TO_ENC_MSG: { - MM_DBG("ptr_update recieved from DSP\n"); - audpreproc_pcm_send_data(audio, 1); - break; - } - case AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG: { - MM_ERR("AUDREC_CMD_PCM_CFG_ARM_TO_ENC_DONE_MSG"); - audqcelp_in_mem_config(audio); - break; - } - case AUDREC_UP_NT_PACKET_READY_MSG: { - struct audrec_up_nt_packet_ready_msg pkt_ready_msg; - - getevent(&pkt_ready_msg, AUDREC_UP_NT_PACKET_READY_MSG_LEN); - MM_DBG("UP_NT_PACKET_READY_MSG: write cnt lsw %d \ - write cnt msw %d read cnt lsw %d read cnt msw %d \n",\ - pkt_ready_msg.audrec_packetwrite_cnt_lsw, \ - pkt_ready_msg.audrec_packetwrite_cnt_msw, \ - pkt_ready_msg.audrec_upprev_readcount_lsw, \ - pkt_ready_msg.audrec_upprev_readcount_msw); - - audqcelp_nt_in_get_dsp_frames(audio); - break; - } - case AUDREC_CMD_EOS_ACK_MSG: { - MM_DBG("eos ack recieved\n"); - break; - } - case AUDREC_CMD_FLUSH_DONE_MSG: { - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 1; - wake_up(&audio->write_wait); - MM_DBG("flush ack recieved\n"); - break; - } - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event:module audrectask\n"); - break; - } - default: - MM_ERR("Unknown Event id %d\n", id); - } -} - -static void audqcelp_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame *frame; - uint32_t index; - unsigned long flags; - - MM_DBG("head = %d\n", audio->in_head); - index = audio->in_head; - - frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(*frame)); - - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = frame->frame_length; - - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) { - MM_ERR("Error! not able to keep up the read\n"); - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - MM_ERR("in_count = %d\n", audio->in_count); - } else - audio->in_count++; - - audqcelp_dsp_read_buffer(audio, audio->dsp_cnt++); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - - wake_up(&audio->wait); -} - -static void audqcelp_nt_in_get_dsp_frames(struct audio_in *audio) -{ - struct audio_frame_nt *nt_frame; - uint32_t index; - unsigned long flags; - MM_DBG("head = %d\n", audio->in_head); - index = audio->in_head; - nt_frame = (void *) (((char *)audio->in[index].data) - \ - sizeof(struct audio_frame_nt)); - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->in[index].size = nt_frame->frame_length; - /* statistics of read */ - atomic_add(audio->in[index].size, &audio->in_bytes); - atomic_add(1, &audio->in_samples); - - audio->in_head = (audio->in_head + 1) & (FRAME_NUM - 1); - - /* If overflow, move the tail index foward. */ - if (audio->in_head == audio->in_tail) - MM_DBG("Error! not able to keep up the read\n"); - else - audio->in_count++; - - spin_unlock_irqrestore(&audio->dsp_lock, flags); - wake_up(&audio->wait); -} - - -struct msm_adsp_ops audrec_qcelp_adsp_ops = { - .event = audrec_dsp_event, -}; - -static int audpreproc_pcm_buffer_ptr_refresh(struct audio_in *audio, - unsigned idx, unsigned len) -{ - struct audrec_cmd_pcm_buffer_ptr_refresh_arm_enc cmd; - - if (len == META_OUT_SIZE) - len = len / 2; - else - len = (len + META_OUT_SIZE) / 2; - MM_DBG("len = %d\n", len); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_BUFFER_PTR_REFRESH_ARM_TO_ENC; - cmd.num_buffers = 1; - if (cmd.num_buffers == 1) { - cmd.buf_address_length[0] = (audio->out[idx].addr & - 0xffff0000) >> 16; - cmd.buf_address_length[1] = (audio->out[idx].addr & - 0x0000ffff); - cmd.buf_address_length[2] = (len & 0xffff0000) >> 16; - cmd.buf_address_length[3] = (len & 0x0000ffff); - } - audio->out_frame_cnt++; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpcm_config(struct audio_in *audio) -{ - struct audrec_cmd_pcm_cfg_arm_to_enc cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_PCM_CFG_ARM_TO_ENC; - cmd.config_update_flag = AUDREC_PCM_CONFIG_UPDATE_FLAG_ENABLE; - cmd.enable_flag = AUDREC_ENABLE_FLAG_VALUE; - cmd.sampling_freq = audio->samp_rate; - if (!audio->channel_mode) - cmd.channels = 1; - else - cmd.channels = 2; - cmd.frequency_of_intimation = 1; - cmd.max_number_of_buffers = OUT_FRAME_NUM; - return audrec_send_audrecqueue(audio, (void *)&cmd, - (unsigned int)sizeof(cmd)); -} - - -static int audpreproc_cmd_cfg_routing_mode(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_routing_mode cmd; - - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ROUTING_MODE; - cmd.stream_id = audio->enc_id; - if (audio->mode == MSM_ADSP_ENC_MODE_NON_TUNNEL) - cmd.routing_mode = 1; - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - - - -static int audqcelp_in_enc_config(struct audio_in *audio, int enable) -{ - struct audpreproc_audrec_cmd_enc_cfg cmd; - - memset(&cmd, 0, sizeof(cmd)); - if (audio->build_id[17] == '1') { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG_2; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG_2 command"); - } else { - cmd.cmd_id = AUDPREPROC_AUDREC_CMD_ENC_CFG; - MM_ERR("sending AUDPREPROC_AUDREC_CMD_ENC_CFG command"); - } - cmd.stream_id = audio->enc_id; - - if (enable) - cmd.audrec_enc_type = audio->enc_type | ENCODE_ENABLE; - else - cmd.audrec_enc_type &= ~(ENCODE_ENABLE); - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audqcelp_in_param_config(struct audio_in *audio) -{ - struct audpreproc_audrec_cmd_parm_cfg_qcelp13k cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPREPROC_AUDREC_CMD_PARAM_CFG; - cmd.common.stream_id = audio->enc_id; - - cmd.enc_min_rate = audio->cfg.min_bit_rate; - cmd.enc_max_rate = audio->cfg.max_bit_rate; - cmd.rate_modulation_cmd = 0; /* Default set to 0 */ - cmd.reduced_rate_level = 0; /* Default set to 0 */ - - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -/* To Do: msm_snddev_route_enc(audio->enc_id); */ -static int audqcelp_in_record_config(struct audio_in *audio, int enable) -{ - struct audpreproc_afe_cmd_audio_record_cfg cmd; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG; - cmd.stream_id = audio->enc_id; - if (enable) - cmd.destination_activity = AUDIO_RECORDING_TURN_ON; - else - cmd.destination_activity = AUDIO_RECORDING_TURN_OFF; - - cmd.source_mix_mask = audio->source; - if (audio->enc_id == 2) { - if ((cmd.source_mix_mask & - INTERNAL_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & AUX_CODEC_TX_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_UL_SOURCE_MIX_MASK) || - (cmd.source_mix_mask & VOICE_DL_SOURCE_MIX_MASK)) { - cmd.pipe_id = SOURCE_PIPE_1; - } - if (cmd.source_mix_mask & - AUDPP_A2DP_PIPE_SOURCE_MIX_MASK) - cmd.pipe_id |= SOURCE_PIPE_0; - } - MM_DBG("stream_id %x destination_activity %x \ - source_mix_mask %x pipe_id %x",\ - cmd.stream_id, cmd.destination_activity, - cmd.source_mix_mask, cmd.pipe_id); - return audpreproc_send_audreccmdqueue(&cmd, sizeof(cmd)); -} - -static int audqcelp_in_mem_config(struct audio_in *audio) -{ - struct audrec_cmd_arecmem_cfg cmd; - uint16_t *data = (void *) audio->data; - int n; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_MEM_CFG_CMD; - cmd.audrec_up_pkt_intm_count = 1; - cmd.audrec_ext_pkt_start_addr_msw = audio->phys >> 16; - cmd.audrec_ext_pkt_start_addr_lsw = audio->phys; - cmd.audrec_ext_pkt_buf_number = FRAME_NUM; - MM_DBG("audio->phys = %x\n", audio->phys); - /* prepare buffer pointers: - * T:36 bytes qcelp ppacket + 4 halfword header - * NT:36 bytes qcelp packet + 12 halfword header - */ - for (n = 0; n < FRAME_NUM; n++) { - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - audio->in[n].data = data + 4; - data += (FRAME_SIZE/2); - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 8)); - } else { - audio->in[n].data = data + 12; - data += ((QCELP_FRAME_SIZE) / 2) + 12; - MM_DBG("0x%8x\n", (int)(audio->in[n].data - 24)); - } - } - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -static int audqcelp_dsp_read_buffer(struct audio_in *audio, uint32_t read_cnt) -{ - struct up_audrec_packet_ext_ptr cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = UP_AUDREC_PACKET_EXT_PTR; - cmd.audrec_up_curr_read_count_msw = read_cnt >> 16; - cmd.audrec_up_curr_read_count_lsw = read_cnt; - - return audrec_send_bitstreamqueue(audio, &cmd, sizeof(cmd)); -} -static int audqcelp_flush_command(struct audio_in *audio) -{ - struct audrec_cmd_flush cmd; - MM_DBG("\n"); - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDREC_CMD_FLUSH; - return audrec_send_audrecqueue(audio, &cmd, sizeof(cmd)); -} - -/* must be called with audio->lock held */ -static int audqcelp_in_enable(struct audio_in *audio) -{ - if (audio->enabled) - return 0; - - if (audpreproc_enable(audio->enc_id, &audpreproc_dsp_event, audio)) { - MM_ERR("msm_adsp_enable(audpreproc) failed\n"); - return -ENODEV; - } - - if (msm_adsp_enable(audio->audrec)) { - MM_ERR("msm_adsp_enable(audrec) failed\n"); - audpreproc_disable(audio->enc_id, audio); - return -ENODEV; - } - audio->enabled = 1; - audqcelp_in_enc_config(audio, 1); - - return 0; -} - -/* must be called with audio->lock held */ -static int audqcelp_in_disable(struct audio_in *audio) -{ - if (audio->enabled) { - audio->enabled = 0; - audqcelp_in_enc_config(audio, 0); - wake_up(&audio->wait); - wait_event_interruptible_timeout(audio->wait_enable, - audio->running == 0, 1*HZ); - msm_adsp_disable(audio->audrec); - audpreproc_disable(audio->enc_id, audio); - } - return 0; -} - -static void audqcelp_ioport_reset(struct audio_in *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audqcelp_in_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->wait); - mutex_lock(&audio->read_lock); - audqcelp_out_flush(audio); - mutex_unlock(&audio->read_lock); -} - -static void audqcelp_in_flush(struct audio_in *audio) -{ - int i; - - audio->dsp_cnt = 0; - audio->in_head = 0; - audio->in_tail = 0; - audio->in_count = 0; - audio->eos_ack = 0; - for (i = 0; i < FRAME_NUM; i++) { - audio->in[i].size = 0; - audio->in[i].read = 0; - } - MM_DBG("in_bytes %d\n", atomic_read(&audio->in_bytes)); - MM_DBG("in_samples %d\n", atomic_read(&audio->in_samples)); - atomic_set(&audio->in_bytes, 0); - atomic_set(&audio->in_samples, 0); -} - -static void audqcelp_out_flush(struct audio_in *audio) -{ - int i; - - audio->out_head = 0; - audio->out_tail = 0; - audio->out_count = 0; - for (i = 0; i < OUT_FRAME_NUM; i++) { - audio->out[i].size = 0; - audio->out[i].read = 0; - audio->out[i].used = 0; - } -} - -/* ------------------- device --------------------- */ -static long audqcelp_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - stats.byte_count = atomic_read(&audio->in_bytes); - stats.sample_count = atomic_read(&audio->in_samples); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return rc; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t freq; - freq = 48000; - MM_DBG("AUDIO_START\n"); - if (audio->in_call && (audio->voice_state != - VOICE_STATE_INCALL)) { - rc = -EPERM; - break; - } - rc = msm_snddev_request_freq(&freq, audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("sample rate configured %d\n", freq); - if (rc < 0) { - MM_DBG(" Sample rate can not be set, return code %d\n", - rc); - msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - break; - } - /*update aurec session info in audpreproc layer*/ - audio->session_info.session_id = audio->enc_id; - audio->session_info.sampling_freq = audio->samp_rate; - audpreproc_update_audrec_info(&audio->session_info); - rc = audqcelp_in_enable(audio); - if (!rc) { - rc = - wait_event_interruptible_timeout(audio->wait_enable, - audio->running != 0, 1*HZ); - MM_DBG("state %d rc = %d\n", audio->running, rc); - - if (audio->running == 0) - rc = -ENODEV; - else - rc = 0; - } - audio->stopped = 0; - break; - } - case AUDIO_STOP: { - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - rc = audqcelp_in_disable(audio); - rc = msm_snddev_withdraw_freq(audio->enc_id, - SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); - MM_DBG("msm_snddev_withdraw_freq\n"); - audio->stopped = 1; - break; - } - case AUDIO_FLUSH: { - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audqcelp_ioport_reset(audio); - if (audio->running) { - audqcelp_flush_command(audio); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - } - case AUDIO_SET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - /* Allow only single frame */ - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (cfg.buffer_size != (FRAME_SIZE - 8)) { - rc = -EINVAL; - break; - } - } else { - if (cfg.buffer_size != (QCELP_FRAME_SIZE + 14)) { - rc = -EINVAL; - break; - } - } - audio->buffer_size = cfg.buffer_size; - break; - } - case AUDIO_GET_STREAM_CONFIG: { - struct msm_audio_stream_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = audio->buffer_size; - cfg.buffer_count = FRAME_NUM; - if (copy_to_user((void *) arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_GET_QCELP_ENC_CONFIG: { - if (copy_to_user((void *) arg, &audio->cfg, sizeof(audio->cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_QCELP_ENC_CONFIG: { - struct msm_audio_qcelp_enc_config cfg; - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - MM_DBG("0X%8x, 0x%8x, 0x%8x\n", cfg.min_bit_rate, \ - cfg.max_bit_rate, cfg.cdma_rate); - if (cfg.min_bit_rate > CDMA_RATE_FULL || \ - cfg.min_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid min bitrate\n"); - rc = -EFAULT; - break; - } - if (cfg.max_bit_rate > CDMA_RATE_FULL || \ - cfg.max_bit_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid max bitrate\n"); - rc = -EFAULT; - break; - } - /* Recording Does not support Erase and Blank */ - if (cfg.cdma_rate > CDMA_RATE_FULL || - cfg.cdma_rate < CDMA_RATE_EIGHTH) { - MM_ERR("invalid qcelp cdma rate\n"); - rc = -EFAULT; - break; - } - memcpy(&audio->cfg, &cfg, sizeof(cfg)); - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.buffer_size = OUT_BUFFER_SIZE; - cfg.buffer_count = OUT_FRAME_NUM; - cfg.sample_rate = audio->samp_rate; - cfg.channel_count = audio->channel_mode; - if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) - rc = -EFAULT; - break; - } - case AUDIO_SET_INCALL: { - struct msm_voicerec_mode cfg; - unsigned long flags; - if (audio->mode == MSM_AUD_ENC_MODE_TUNNEL) { - if (copy_from_user(&cfg, (void *) arg, sizeof(cfg))) { - rc = -EFAULT; - break; - } - if (cfg.rec_mode != VOC_REC_BOTH && - cfg.rec_mode != VOC_REC_UPLINK && - cfg.rec_mode != VOC_REC_DOWNLINK) { - MM_ERR("invalid rec_mode\n"); - rc = -EINVAL; - break; - } else { - spin_lock_irqsave(&audio->dev_lock, flags); - if (cfg.rec_mode == VOC_REC_UPLINK) - audio->source = \ - VOICE_UL_SOURCE_MIX_MASK; - else if (cfg.rec_mode == VOC_REC_DOWNLINK) - audio->source = \ - VOICE_DL_SOURCE_MIX_MASK; - else - audio->source = \ - VOICE_DL_SOURCE_MIX_MASK | - VOICE_UL_SOURCE_MIX_MASK ; - audio->in_call = 1; - spin_unlock_irqrestore(&audio->dev_lock, flags); - } - } - break; - } - case AUDIO_GET_SESSION_ID: { - if (copy_to_user((void *) arg, &audio->enc_id, - sizeof(unsigned short))) { - rc = -EFAULT; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -static ssize_t audqcelp_in_read(struct file *file, - char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - unsigned long flags; - const char __user *start = buf; - void *data; - uint32_t index; - uint32_t size; - int rc = 0; - struct qcelp_encoded_meta_out meta_field; - struct audio_frame_nt *nt_frame; - MM_DBG(" count = %d\n", count); - mutex_lock(&audio->read_lock); - while (count > 0) { - rc = wait_event_interruptible( - audio->wait, (audio->in_count > 0) || audio->stopped || - audio->rflush || - ((audio->mode == MSM_AUD_ENC_MODE_TUNNEL) && - audio->in_call && audio->running && - (audio->voice_state == VOICE_STATE_OFFCALL))); - if (rc < 0) - break; - - if (audio->rflush) { - rc = -EBUSY; - break; - } - if (audio->stopped && !audio->in_count) { - MM_DBG("Driver in stop state, No more buffer to read"); - rc = 0;/* End of File */ - break; - } else if ((audio->mode == MSM_AUD_ENC_MODE_TUNNEL) && - audio->in_call && audio->running && - (audio->voice_state \ - == VOICE_STATE_OFFCALL)) { - MM_DBG("Not Permitted Voice Terminated\n"); - rc = -EPERM; /* Voice Call stopped */ - break; - } - - index = audio->in_tail; - data = (uint8_t *) audio->in[index].data; - size = audio->in[index].size; - - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) { - nt_frame = (struct audio_frame_nt *)(data - - sizeof(struct audio_frame_nt)); - memcpy((char *)&meta_field.time_stamp_dword_lsw, - (char *)&nt_frame->time_stamp_dword_lsw, - (sizeof(struct qcelp_encoded_meta_out) - \ - sizeof(uint16_t))); - meta_field.metadata_len = - sizeof(struct qcelp_encoded_meta_out); - if (copy_to_user((char *)start, - (char *)&meta_field, - sizeof(struct qcelp_encoded_meta_out))) { - rc = -EFAULT; - break; - } - if (nt_frame->nflag_lsw & 0x0001) { - MM_ERR("recieved EOS in read call\n"); - audio->eos_ack = 1; - } - buf += sizeof(struct qcelp_encoded_meta_out); - count -= sizeof(struct qcelp_encoded_meta_out); - } - if (count >= size) { - if (copy_to_user(buf, data, size)) { - rc = -EFAULT; - break; - } - spin_lock_irqsave(&audio->dsp_lock, flags); - if (index != audio->in_tail) { - /* overrun -- data is - * invalid and we need to retry */ - spin_unlock_irqrestore(&audio->dsp_lock, flags); - continue; - } - audio->in[index].size = 0; - audio->in_tail = (audio->in_tail + 1) & (FRAME_NUM - 1); - audio->in_count--; - spin_unlock_irqrestore(&audio->dsp_lock, flags); - count -= size; - buf += size; - if ((audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL)) { - if (!audio->eos_ack) { - MM_DBG("sending read ptr command\ - %d %d\n", - audio->dsp_cnt, - audio->in_tail); - audqcelp_dsp_read_buffer(audio, - audio->dsp_cnt++); - } - } - } else { - MM_ERR("short read\n"); - break; - } - break; - } - mutex_unlock(&audio->read_lock); - - if (buf > start) - return buf - start; - - return rc; -} - -static void audpreproc_pcm_send_data(struct audio_in *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - MM_DBG("\n"); - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - audpreproc_pcm_buffer_ptr_refresh(audio, - audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } - done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - - -static int audqcelp_in_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) - -{ - struct audio_in *audio = file->private_data; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - if (!audio->running || (audio->mode == MSM_AUD_ENC_MODE_TUNNEL)) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - audio->wflush); - MM_DBG("waked on by some event audio->wflush = %d\n", audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; - -} - - int audpreproc_qcelp_process_eos(struct audio_in *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - struct buffer *frame; - int rc = 0; - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - MM_DBG("copying meta_out frame->used = %d\n", frame->used); - audpreproc_pcm_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audqcelp_in_write(struct file *file, - const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_in *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - char *cpy_ptr; - int rc = 0, eos_condition = AUDPREPROC_QCELP_EOS_NONE; - unsigned short mfield_size = 0; - int write_count = 0; - - MM_DBG("cnt=%d\n", count); - if (count & 1) - return -EINVAL; - - if (audio->mode != MSM_AUD_ENC_MODE_NONTUNNEL) - return -EINVAL; - - mutex_lock(&audio->write_lock); - frame = audio->out + audio->out_head; - /* if supplied count is more than driver buffer size - * then only copy driver buffer size - */ - if (count > frame->size) - count = frame->size; - - write_count = count; - cpy_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto error; - - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto error; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - goto error; - } else if (mfield_size > count) { - rc = -EINVAL; - goto error; - } - MM_DBG("mf offset_val %x\n", mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - goto error; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDPREPROC_QCELP_EOS_FLG_OFFSET] & - AUDPREPROC_QCELP_EOS_FLG_MASK) { - eos_condition = AUDPREPROC_QCELP_EOS_SET; - MM_DBG("EOS SET\n"); - if (mfield_size == count) { - buf += mfield_size; - eos_condition = 0; - goto exit; - } else - cpy_ptr[AUDPREPROC_QCELP_EOS_FLG_OFFSET] &= - ~AUDPREPROC_QCELP_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - MM_DBG("copying the stream count = %d\n", count); - if (copy_from_user(cpy_ptr, buf, count)) { - rc = -EFAULT; - goto error; - } -exit: - frame->used = count; - audio->out_head ^= 1; - if (!audio->flush_ack) - audpreproc_pcm_send_data(audio, 0); - else { - audpreproc_pcm_send_data(audio, 1); - audio->flush_ack = 0; - } - if (eos_condition == AUDPREPROC_QCELP_EOS_SET) - rc = audpreproc_qcelp_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - return write_count; -error: - mutex_unlock(&audio->write_lock); - return rc; -} - -static int audqcelp_in_release(struct inode *inode, struct file *file) -{ - struct audio_in *audio = file->private_data; - - mutex_lock(&audio->lock); - audio->in_call = 0; - /* with draw frequency for session - incase not stopped the driver */ - msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, - AUDDEV_CLNT_ENC); - auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); - /*reset the sampling frequency information at audpreproc layer*/ - audio->session_info.sampling_freq = 0; - audpreproc_update_audrec_info(&audio->session_info); - audqcelp_in_disable(audio); - audqcelp_in_flush(audio); - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - audio->audrec = NULL; - audio->opened = 0; - if (audio->data) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - audio->data = NULL; - } - if (audio->out_data) { - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - audio->out_data = NULL; - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); - return 0; -} - -struct audio_in the_audio_qcelp_in; -static int audqcelp_in_open(struct inode *inode, struct file *file) -{ - struct audio_in *audio = &the_audio_qcelp_in; - int rc; - int encid; - int len = 0; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - - mutex_lock(&audio->lock); - if (audio->opened) { - rc = -EBUSY; - goto done; - } - client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); - if (IS_ERR_OR_NULL(client)) { - MM_ERR("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - MM_DBG("allocating mem sz = %d\n", DMASZ); - handle = ion_alloc(client, DMASZ, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - - audio->output_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto output_buff_get_flags_error; - } - - audio->map_v_read = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("could not map read buffers,freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_read; - - MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ - (int) audio->data, (int) audio->phys); - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_NONTUNNEL; - MM_DBG("Opened for non tunnel mode encoding\n"); - } else if (!(file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - audio->mode = MSM_AUD_ENC_MODE_TUNNEL; - MM_DBG("Opened for tunnel mode encoding\n"); - } else { - MM_ERR("Invalid mode\n"); - rc = -EACCES; - goto done; - } - - /* Settings will be re-config at AUDIO_SET_CONFIG, - * but at least we need to have initial config - */ - if (audio->mode == MSM_AUD_ENC_MODE_NONTUNNEL) - audio->buffer_size = (QCELP_FRAME_SIZE + 14); - else - audio->buffer_size = (FRAME_SIZE - 8); - audio->enc_type = ENC_TYPE_V13K | audio->mode; - audio->samp_rate = 8000; - audio->channel_mode = AUDREC_CMD_MODE_MONO; - audio->cfg.cdma_rate = CDMA_RATE_FULL; - audio->cfg.min_bit_rate = CDMA_RATE_FULL; - audio->cfg.max_bit_rate = CDMA_RATE_FULL; - audio->source = INTERNAL_CODEC_TX_SOURCE_MIX_MASK; - audio->rec_mode = VOC_REC_UPLINK; - - encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, - &audio->queue_ids); - if (encid < 0) { - MM_ERR("No free encoder available\n"); - rc = -ENODEV; - goto done; - } - audio->enc_id = encid; - - rc = msm_adsp_get(audio->module_name, &audio->audrec, - &audrec_qcelp_adsp_ops, audio); - - if (rc) { - audpreproc_aenc_free(audio->enc_id); - goto done; - } - - audio->stopped = 0; - audio->source = 0; - audio->wflush = 0; - audio->rflush = 0; - audio->flush_ack = 0; - - audqcelp_in_flush(audio); - audqcelp_out_flush(audio); - - MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); - handle = ion_alloc(client, BUFFER_SIZE, - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate I/P buffers\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(client , handle, &addr, &len); - if (rc) { - MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - rc = -ENOMEM; - goto input_buff_alloc_error; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - } - audio->out_phys = (int32_t)addr; - - rc = ion_handle_get_flags(client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - rc = -ENOMEM; - goto input_buff_alloc_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto input_buff_map_error; - } - audio->out_data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - (unsigned int)addr, - (unsigned int)audio->out_data); - - /* Initialize buffer */ - audio->out[0].data = audio->out_data + 0; - audio->out[0].addr = audio->out_phys + 0; - audio->out[0].size = OUT_BUFFER_SIZE; - - audio->out[1].data = audio->out_data + OUT_BUFFER_SIZE; - audio->out[1].addr = audio->out_phys + OUT_BUFFER_SIZE; - audio->out[1].size = OUT_BUFFER_SIZE; - - MM_DBG("audio->out[0].data = %d audio->out[1].data = %d", - (unsigned int)audio->out[0].data, - (unsigned int)audio->out[1].data); - audio->device_events = AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | - AUDDEV_EVT_VOICE_STATE_CHG; - - audio->voice_state = msm_get_voice_state(); - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_ENC, audio->enc_id, - qcelp_in_listener, (void *) audio); - if (rc) { - MM_ERR("failed to register device event listener\n"); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->mfield = META_OUT_SIZE; - file->private_data = audio; - audio->opened = 1; - audio->out_frame_cnt++; - audio->build_id = socinfo_get_build_id(); - MM_DBG("Modem build id = %s\n", audio->build_id); -done: - mutex_unlock(&audio->lock); - return rc; -evt_error: - msm_adsp_put(audio->audrec); - audpreproc_aenc_free(audio->enc_id); - mutex_unlock(&audio->lock); -input_buff_map_error: - ion_free(client, audio->input_buff_handle); -input_buff_alloc_error: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - return rc; -} - -static const struct file_operations audio_in_fops = { - .owner = THIS_MODULE, - .open = audqcelp_in_open, - .release = audqcelp_in_release, - .read = audqcelp_in_read, - .write = audqcelp_in_write, - .fsync = audqcelp_in_fsync, - .unlocked_ioctl = audqcelp_in_ioctl, -}; - -struct miscdevice audio_qcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &audio_in_fops, -}; - -static int __init audqcelp_in_init(void) -{ - mutex_init(&the_audio_qcelp_in.lock); - mutex_init(&the_audio_qcelp_in.read_lock); - spin_lock_init(&the_audio_qcelp_in.dsp_lock); - spin_lock_init(&the_audio_qcelp_in.dev_lock); - init_waitqueue_head(&the_audio_qcelp_in.wait); - init_waitqueue_head(&the_audio_qcelp_in.wait_enable); - mutex_init(&the_audio_qcelp_in.write_lock); - init_waitqueue_head(&the_audio_qcelp_in.write_wait); - return misc_register(&audio_qcelp_in_misc); -} - -device_initcall(audqcelp_in_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_wma.c b/arch/arm/mach-msm/qdsp5v2/audio_wma.c deleted file mode 100644 index 4e5dcd321a7b..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_wma.c +++ /dev/null @@ -1,1860 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5v2/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Size must be power of 2 */ -#define BUFSZ_MAX 4110 /* Includes meta in size */ -#define BUFSZ_MIN 1038 /* Includes meta in size */ -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_WMA 4 - -#define PCM_BUFSZ_MIN 8216 /* Hold one stereo WMA frame and meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDWMA_METAFIELD_MASK 0xFFFF0000 -#define AUDWMA_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDWMA_EOS_FLG_MASK 0x01 -#define AUDWMA_EOS_NONE 0x0 /* No EOS detected */ -#define AUDWMA_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDWMA_EVENT_NUM 10 /* Default number of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audwma_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audwma_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - struct msm_audio_wma_config wma_config; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audwma_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; - struct ion_client *client; - struct ion_handle *input_buff_handle; - struct ion_handle *output_buff_handle; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwma_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -static void wma_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audio_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("audio_update_pcm_buf_entry: \ - expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - /* send mixer command */ - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -static struct msm_adsp_ops audplay_adsp_ops_wma = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_WMA; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wma cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WMA_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - /* - * Test done for sample with the following configuration - * armdatareqthr = 1262 - * channelsdecoded = 1(MONO)/2(STEREO) - * wmabytespersec = Tested with 6003 Bytes per sec - * wmasamplingfreq = 44100 - * wmaencoderopts = 31 - */ - - cmd.armdatareqthr = audio->wma_config.armdatareqthr; - cmd.channelsdecoded = audio->wma_config.channelsdecoded; - cmd.wmabytespersec = audio->wma_config.wmabytespersec; - cmd.wmasamplingfreq = audio->wma_config.wmasamplingfreq; - cmd.wmaencoderopts = audio->wma_config.wmaencoderopts; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - - MM_DBG("buf0_addr=%x buf0_len=%d\n", - refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (!audio->pcm_feedback) - cmd.decoder_id = 0; - else { - if (audio->mfield) - cmd.decoder_id = AUDWMA_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - } - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (audio->wflush) { - audio->out_needed = 1; - goto done; - } - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - MM_DBG("\n"); /* Macro prints the file name and function */ - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audwma_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audwma_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audwma_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audwma_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audwma_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout( - audio->event_wait, audwma_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audwma_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwma_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - int len = 0; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audwma_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_WMA_CONFIG:{ - if (copy_to_user((void *)arg, &audio->wma_config, - sizeof(audio->wma_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_WMA_CONFIG:{ - struct msm_audio_wma_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - audio->wma_config = usr_config; - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - handle = ion_alloc(audio->client, - (config.buffer_size * - config.buffer_count), - SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to alloc I/P buffs\n"); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->input_buff_handle = handle; - - rc = ion_phys(audio->client , - handle, &addr, &len); - if (rc) { - MM_ERR("Invalid phy: %x sz: %x\n", - (unsigned int) addr, - (unsigned int) len); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } else { - MM_INFO("Got valid phy: %x sz: %x\n", - (unsigned int) audio->read_phys, - (unsigned int) len); - } - audio->read_phys = (int32_t)addr; - - rc = ion_handle_get_flags(audio->client, - handle, &ionflag); - if (rc) { - MM_ERR("could not get flags\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - break; - } - - audio->map_v_read = ion_map_kernel( - audio->client, handle); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("map of read buf failed\n"); - ion_free(audio->client, handle); - audio->input_buff_handle = NULL; - rc = -ENOMEM; - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("audio_read: no partial frame done reading\n"); - break; - } else { - MM_DBG("audio_read: read from in[%d]\n", - audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audwma_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audplay_send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDWMA_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("audio_write: mf offset_val %x\n", - mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDWMA_EOS_FLG_OFFSET] & - AUDWMA_EOS_FLG_MASK) { - MM_DBG("audio_write: EOS SET\n"); - eos_condition = AUDWMA_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDWMA_EOS_FLG_OFFSET] - &= ~AUDWMA_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("audio_write: continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - if (eos_condition == AUDWMA_EOS_SET) - rc = audwma_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audwma_reset_event_queue(audio); - ion_unmap_kernel(audio->client, audio->output_buff_handle); - ion_free(audio->client, audio->output_buff_handle); - if (audio->input_buff_handle != NULL) { - ion_unmap_kernel(audio->client, audio->input_buff_handle); - ion_free(audio->client, audio->input_buff_handle); - } - ion_client_destroy(audio->client); - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwma_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audwma_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audwma_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audwma_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audwma_suspend(struct early_suspend *h) -{ - struct audwma_suspend_ctl *ctl = - container_of(h, struct audwma_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwma_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audwma_resume(struct early_suspend *h) -{ - struct audwma_suspend_ctl *ctl = - container_of(h, struct audwma_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwma_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audwma_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audwma_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audwma_debug_fops = { - .read = audwma_debug_read, - .open = audwma_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - unsigned mem_sz = DMASZ_MAX; - struct audwma_event *e_node = NULL; - unsigned long ionflag = 0; - ion_phys_addr_t addr = 0; - struct ion_handle *handle = NULL; - struct ion_client *client = NULL; - int len = 0; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wma_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_WMA; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - client = msm_ion_client_create(UINT_MAX, "Audio_WMA_Client"); - if (IS_ERR_OR_NULL(client)) { - pr_err("Unable to create ION client\n"); - rc = -ENOMEM; - goto client_create_error; - } - audio->client = client; - - handle = ion_alloc(client, mem_sz, SZ_4K, - ION_HEAP(ION_AUDIO_HEAP_ID), 0); - if (IS_ERR_OR_NULL(handle)) { - MM_ERR("Unable to create allocate O/P buffers\n"); - rc = -ENOMEM; - goto output_buff_alloc_error; - } - audio->output_buff_handle = handle; - - rc = ion_phys(client, handle, &addr, &len); - if (rc) { - MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - goto output_buff_get_phys_error; - } else { - MM_INFO("O/P buffers:valid phy: %x sz: %x\n", - (unsigned int) addr, (unsigned int) len); - } - audio->phys = (int32_t)addr; - - - rc = ion_handle_get_flags(client, handle, &ionflag); - if (rc) { - MM_ERR("could not get flags for the handle\n"); - goto output_buff_get_flags_error; - } - - audio->map_v_write = ion_map_kernel(client, handle); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers\n"); - rc = -ENOMEM; - goto output_buff_map_error; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->phys, (int)audio->data); - - audio->out_dma_sz = mem_sz; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_wma, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - audio->wma_config.armdatareqthr = 1262; - audio->wma_config.channelsdecoded = 2; - audio->wma_config.wmabytespersec = 6003; - audio->wma_config.wmasamplingfreq = 44100; - audio->wma_config.wmaencoderopts = 31; - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - wma_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_wma_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audwma_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audwma_resume; - audio->suspend_ctl.node.suspend = audwma_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDWMA_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audwma_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - ion_unmap_kernel(client, audio->output_buff_handle); -output_buff_map_error: -output_buff_get_phys_error: -output_buff_get_flags_error: - ion_free(client, audio->output_buff_handle); -output_buff_alloc_error: - ion_client_destroy(client); -client_create_error: - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wma_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_wma_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wma", - .fops = &audio_wma_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_wma_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audio_wmapro.c b/arch/arm/mach-msm/qdsp5v2/audio_wmapro.c deleted file mode 100644 index 44fc10f6ac7a..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audio_wmapro.c +++ /dev/null @@ -1,1814 +0,0 @@ -/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. - * - * Based on the mp3 native driver in arch/arm/mach-msm/qdsp5v2/audio_mp3.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (C) 2008 HTC Corporation - * - * All source code in this file is licensed under the following license except - * where indicated. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * See the GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can find it at http://www.fsf.org - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Size must be power of 2 */ -#define BUFSZ_MAX 4110 /* Includes meta in size */ -#define BUFSZ_MIN 2062 /* Includes meta in size */ -#define DMASZ_MAX (BUFSZ_MAX * 2) -#define DMASZ_MIN (BUFSZ_MIN * 2) - -#define AUDPLAY_INVALID_READ_PTR_OFFSET 0xFFFF -#define AUDDEC_DEC_WMAPRO 13 - -#define PCM_BUFSZ_MIN 8216 /* Hold one stereo WMAPRO frame and meta out*/ -#define PCM_BUF_MAX_COUNT 5 /* DSP only accepts 5 buffers at most - but support 2 buffers currently */ -#define ROUTING_MODE_FTRT 1 -#define ROUTING_MODE_RT 2 -/* Decoder status received from AUDPPTASK */ -#define AUDPP_DEC_STATUS_SLEEP 0 -#define AUDPP_DEC_STATUS_INIT 1 -#define AUDPP_DEC_STATUS_CFG 2 -#define AUDPP_DEC_STATUS_PLAY 3 - -#define AUDWMAPRO_METAFIELD_MASK 0xFFFF0000 -#define AUDWMAPRO_EOS_FLG_OFFSET 0x0A /* Offset from beginning of buffer */ -#define AUDWMAPRO_EOS_FLG_MASK 0x01 -#define AUDWMAPRO_EOS_NONE 0x0 /* No EOS detected */ -#define AUDWMAPRO_EOS_SET 0x1 /* EOS set in meta field */ - -#define AUDWMAPRO_EVENT_NUM 10 /* Default no. of pre-allocated event packets */ - -struct buffer { - void *data; - unsigned size; - unsigned used; /* Input usage actual DSP produced PCM size */ - unsigned addr; - unsigned short mfield_sz; /*only useful for data has meta field */ -}; - -#ifdef CONFIG_HAS_EARLYSUSPEND -struct audwmapro_suspend_ctl { - struct early_suspend node; - struct audio *audio; -}; -#endif - -struct audwmapro_event{ - struct list_head list; - int event_type; - union msm_audio_event_payload payload; -}; - -struct audio { - struct buffer out[2]; - - spinlock_t dsp_lock; - - uint8_t out_head; - uint8_t out_tail; - uint8_t out_needed; /* number of buffers the dsp is waiting for */ - unsigned out_dma_sz; - - atomic_t out_bytes; - - struct mutex lock; - struct mutex write_lock; - wait_queue_head_t write_wait; - - /* Host PCM section */ - struct buffer in[PCM_BUF_MAX_COUNT]; - struct mutex read_lock; - wait_queue_head_t read_wait; /* Wait queue for read */ - char *read_data; /* pointer to reader buffer */ - int32_t read_phys; /* physical address of reader buffer */ - uint8_t read_next; /* index to input buffers to be read next */ - uint8_t fill_next; /* index to buffer that DSP should be filling */ - uint8_t pcm_buf_count; /* number of pcm buffer allocated */ - /* ---- End of Host PCM section */ - - struct msm_adsp_module *audplay; - - /* configuration to use on next enable */ - uint32_t out_sample_rate; - uint32_t out_channel_mode; - - struct msm_audio_wmapro_config wmapro_config; - - /* data allocated for various buffers */ - char *data; - int32_t phys; /* physical address of write buffer */ - void *map_v_read; - void *map_v_write; - - int mfield; /* meta field embedded in data */ - int rflush; /* Read flush */ - int wflush; /* Write flush */ - int opened; - int enabled; - int running; - int stopped; /* set when stopped, cleared on flush */ - int pcm_feedback; - int buf_refresh; - int teos; /* valid only if tunnel mode & no data left for decoder */ - enum msm_aud_decoder_state dec_state; /* Represents decoder state */ - int reserved; /* A byte is being reserved */ - char rsv_byte; /* Handle odd length user data */ - - const char *module_name; - unsigned queue_id; - uint16_t dec_id; - uint32_t read_ptr_offset; - int16_t source; - -#ifdef CONFIG_HAS_EARLYSUSPEND - struct audwmapro_suspend_ctl suspend_ctl; -#endif - -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif - - wait_queue_head_t wait; - struct list_head free_event_queue; - struct list_head event_queue; - wait_queue_head_t event_wait; - spinlock_t event_queue_lock; - struct mutex get_event_lock; - int event_abort; - /* AV sync Info */ - int avsync_flag; /* Flag to indicate feedback from DSP */ - wait_queue_head_t avsync_wait;/* Wait queue for AV Sync Message */ - /* flags, 48 bits sample/bytes counter per channel */ - uint16_t avsync[AUDPP_AVSYNC_CH_COUNT * AUDPP_AVSYNC_NUM_WORDS + 1]; - - uint32_t device_events; - - int eq_enable; - int eq_needs_commit; - struct audpp_cmd_cfg_object_params_eqalizer eq; - struct audpp_cmd_cfg_object_params_volume vol_pan; -}; - -static int auddec_dsp_config(struct audio *audio, int enable); -static void audpp_cmd_cfg_adec_params(struct audio *audio); -static void audpp_cmd_cfg_routing_mode(struct audio *audio); -static void audplay_send_data(struct audio *audio, unsigned needed); -static void audplay_config_hostpcm(struct audio *audio); -static void audplay_buffer_refresh(struct audio *audio); -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg); -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwmapro_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload); -#endif - -/* must be called with audio->lock held */ -static int audio_enable(struct audio *audio) -{ - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) - return 0; - - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - audio->out_tail = 0; - audio->out_needed = 0; - - if (msm_adsp_enable(audio->audplay)) { - MM_ERR("msm_adsp_enable(audplay) failed\n"); - return -ENODEV; - } - - if (audpp_enable(audio->dec_id, audio_dsp_event, audio)) { - MM_ERR("audpp_enable() failed\n"); - msm_adsp_disable(audio->audplay); - return -ENODEV; - } - - audio->enabled = 1; - return 0; -} - -static void wmapro_listner(u32 evt_id, union auddev_evt_data *evt_payload, - void *private_data) -{ - struct audio *audio = (struct audio *) private_data; - switch (evt_id) { - case AUDDEV_EVT_DEV_RDY: - MM_DBG(":AUDDEV_EVT_DEV_RDY\n"); - audio->source |= (0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_DEV_RLS: - MM_DBG(":AUDDEV_EVT_DEV_RLS\n"); - audio->source &= ~(0x1 << evt_payload->routing_id); - if (audio->running == 1 && audio->enabled == 1) - audpp_route_stream(audio->dec_id, audio->source); - break; - case AUDDEV_EVT_STREAM_VOL_CHG: - audio->vol_pan.volume = evt_payload->session_vol; - MM_DBG(":AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d\n", - audio->vol_pan.volume); - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - break; - default: - MM_ERR(":ERROR:wrong event\n"); - break; - } -} - -/* must be called with audio->lock held */ -static int audio_disable(struct audio *audio) -{ - int rc = 0; - MM_DBG("\n"); /* Macro prints the file name and function */ - if (audio->enabled) { - audio->enabled = 0; - audio->dec_state = MSM_AUD_DECODER_STATE_NONE; - auddec_dsp_config(audio, 0); - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - if (rc == 0) - rc = -ETIMEDOUT; - else if (audio->dec_state != MSM_AUD_DECODER_STATE_CLOSE) - rc = -EFAULT; - else - rc = 0; - wake_up(&audio->write_wait); - wake_up(&audio->read_wait); - msm_adsp_disable(audio->audplay); - audpp_disable(audio->dec_id, audio); - audio->out_needed = 0; - } - return rc; -} - -/* ------------------- dsp --------------------- */ -static void audio_update_pcm_buf_entry(struct audio *audio, - uint32_t *payload) -{ - uint8_t index; - unsigned long flags; - - if (audio->rflush) - return; - - spin_lock_irqsave(&audio->dsp_lock, flags); - for (index = 0; index < payload[1]; index++) { - if (audio->in[audio->fill_next].addr == - payload[2 + index * 2]) { - MM_DBG("audio_update_pcm_buf_entry: \ - in[%d] ready\n", audio->fill_next); - audio->in[audio->fill_next].used = - payload[3 + index * 2]; - if ((++audio->fill_next) == audio->pcm_buf_count) - audio->fill_next = 0; - } else { - MM_ERR("audio_update_pcm_buf_entry: \ - expected=%x ret=%x\n", - audio->in[audio->fill_next].addr, - payload[1 + index * 2]); - break; - } - } - if (audio->in[audio->fill_next].used == 0) { - audplay_buffer_refresh(audio); - } else { - MM_DBG("read cannot keep up\n"); - audio->buf_refresh = 1; - } - wake_up(&audio->read_wait); - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -static void audplay_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audio *audio = data; - uint32_t msg[28]; - - getevent(msg, sizeof(msg)); - - MM_DBG("msg_id=%x\n", id); - - switch (id) { - case AUDPLAY_MSG_DEC_NEEDS_DATA: - audplay_send_data(audio, 1); - break; - - case AUDPLAY_MSG_BUFFER_UPDATE: - audio_update_pcm_buf_entry(audio, msg); - break; - - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable(audplaytask)\n"); - break; - - default: - MM_ERR("unexpected message from decoder \n"); - break; - } -} - -static void audio_dsp_event(void *private, unsigned id, uint16_t *msg) -{ - struct audio *audio = private; - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned status = msg[1]; - - switch (status) { - case AUDPP_DEC_STATUS_SLEEP: { - uint16_t reason = msg[2]; - MM_DBG("decoder status:sleep reason = \ - 0x%04x\n", reason); - if ((reason == AUDPP_MSG_REASON_MEM) - || (reason == - AUDPP_MSG_REASON_NODECODER)) { - audio->dec_state = - MSM_AUD_DECODER_STATE_FAILURE; - wake_up(&audio->wait); - } else if (reason == AUDPP_MSG_REASON_NONE) { - /* decoder is in disable state */ - audio->dec_state = - MSM_AUD_DECODER_STATE_CLOSE; - wake_up(&audio->wait); - } - break; - } - case AUDPP_DEC_STATUS_INIT: - MM_DBG("decoder status: init\n"); - if (audio->pcm_feedback) - audpp_cmd_cfg_routing_mode(audio); - else - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_DEC_STATUS_CFG: - MM_DBG("decoder status: cfg\n"); - break; - case AUDPP_DEC_STATUS_PLAY: - MM_DBG("decoder status: play \n"); - audpp_route_stream(audio->dec_id, - audio->source); - if (audio->pcm_feedback) { - audplay_config_hostpcm(audio); - audplay_buffer_refresh(audio); - } - audio->dec_state = - MSM_AUD_DECODER_STATE_SUCCESS; - wake_up(&audio->wait); - break; - default: - MM_ERR("unknown decoder status\n"); - } - break; - } - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_DBG("CFG_MSG ENABLE\n"); - auddec_dsp_config(audio, 1); - audio->out_needed = 0; - audio->running = 1; - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - audpp_dsp_set_eq(audio->dec_id, audio->eq_enable, - &audio->eq, POPP); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_DBG("CFG_MSG DISABLE\n"); - audio->running = 0; - } else { - MM_DBG("CFG_MSG %d?\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - MM_DBG("ROUTING_ACK mode=%d\n", msg[1]); - audpp_cmd_cfg_adec_params(audio); - break; - - case AUDPP_MSG_FLUSH_ACK: - MM_DBG("FLUSH_ACK\n"); - audio->wflush = 0; - audio->rflush = 0; - wake_up(&audio->write_wait); - if (audio->pcm_feedback) - audplay_buffer_refresh(audio); - break; - - case AUDPP_MSG_PCMDMAMISSED: - MM_DBG("PCMDMAMISSED\n"); - audio->teos = 1; - wake_up(&audio->write_wait); - break; - - case AUDPP_MSG_AVSYNC_MSG: - MM_DBG("AUDPP_MSG_AVSYNC_MSG\n"); - memcpy(&audio->avsync[0], msg, sizeof(audio->avsync)); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); - break; - - default: - MM_ERR("UNKNOWN (%d)\n", id); - } - -} - -static struct msm_adsp_ops audplay_adsp_ops_wmapro = { - .event = audplay_dsp_event, -}; - -#define audplay_send_queue0(audio, cmd, len) \ - msm_adsp_write(audio->audplay, audio->queue_id, \ - cmd, len) - -static int auddec_dsp_config(struct audio *audio, int enable) -{ - struct audpp_cmd_cfg_dec_type cfg_dec_cmd; - - memset(&cfg_dec_cmd, 0, sizeof(cfg_dec_cmd)); - - cfg_dec_cmd.cmd_id = AUDPP_CMD_CFG_DEC_TYPE; - if (enable) - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_ENA_DEC_V | AUDDEC_DEC_WMAPRO; - else - cfg_dec_cmd.dec_cfg = AUDPP_CMD_UPDATDE_CFG_DEC | - AUDPP_CMD_DIS_DEC_V; - cfg_dec_cmd.dm_mode = 0x0; - cfg_dec_cmd.stream_id = audio->dec_id; - return audpp_send_queue1(&cfg_dec_cmd, sizeof(cfg_dec_cmd)); -} - -static void audpp_cmd_cfg_adec_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wmapro cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WMAPRO_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - /* - * Test done for sample with the following configuration - * armdatareqthr = 1262 - * channelsdecoded = 1(MONO)/2(STEREO) - * wmaprobytespersec = Tested with 6003 Bytes per sec - * wmaprosamplingfreq = 44100 - * wmaproencoderopts = 31 - */ - - cmd.armdatareqthr = audio->wmapro_config.armdatareqthr; - cmd.numchannels = audio->wmapro_config.numchannels; - cmd.validbitspersample = audio->wmapro_config.validbitspersample; - cmd.formattag = audio->wmapro_config.formattag; - cmd.samplingrate = audio->wmapro_config.samplingrate; - cmd.avgbytespersecond = audio->wmapro_config.avgbytespersecond; - cmd.asfpacketlength = audio->wmapro_config.asfpacketlength; - cmd.channelmask = audio->wmapro_config.channelmask; - cmd.encodeopt = audio->wmapro_config.encodeopt; - cmd.advancedencodeopt = audio->wmapro_config.advancedencodeopt; - cmd.advancedencodeopt2 = audio->wmapro_config.advancedencodeopt2; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} - -static void audpp_cmd_cfg_routing_mode(struct audio *audio) -{ - struct audpp_cmd_routing_mode cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_ROUTING_MODE; - cmd.object_number = audio->dec_id; - if (audio->pcm_feedback) - cmd.routing_mode = ROUTING_MODE_FTRT; - else - cmd.routing_mode = ROUTING_MODE_RT; - - audpp_send_queue1(&cmd, sizeof(cmd)); -} - -static void audplay_buffer_refresh(struct audio *audio) -{ - struct audplay_cmd_buffer_refresh refresh_cmd; - - refresh_cmd.cmd_id = AUDPLAY_CMD_BUFFER_REFRESH; - refresh_cmd.num_buffers = 1; - refresh_cmd.buf0_address = audio->in[audio->fill_next].addr; - refresh_cmd.buf0_length = audio->in[audio->fill_next].size; - refresh_cmd.buf_read_count = 0; - - MM_DBG("buf0_addr=%x buf0_len=%d\n", - refresh_cmd.buf0_address, - refresh_cmd.buf0_length); - - (void)audplay_send_queue0(audio, &refresh_cmd, sizeof(refresh_cmd)); -} - -static void audplay_config_hostpcm(struct audio *audio) -{ - struct audplay_cmd_hpcm_buf_cfg cfg_cmd; - - MM_DBG("\n"); /* Macro prints the file name and function */ - cfg_cmd.cmd_id = AUDPLAY_CMD_HPCM_BUF_CFG; - cfg_cmd.max_buffers = audio->pcm_buf_count; - cfg_cmd.byte_swap = 0; - cfg_cmd.hostpcm_config = (0x8000) | (0x4000); - cfg_cmd.feedback_frequency = 1; - cfg_cmd.partition_number = 0; - - (void)audplay_send_queue0(audio, &cfg_cmd, sizeof(cfg_cmd)); -} - - -static int audplay_dsp_send_data_avail(struct audio *audio, - unsigned idx, unsigned len) -{ - struct audplay_cmd_bitstream_data_avail_nt2 cmd; - - cmd.cmd_id = AUDPLAY_CMD_BITSTREAM_DATA_AVAIL_NT2; - if (audio->mfield) - cmd.decoder_id = AUDWMAPRO_METAFIELD_MASK | - (audio->out[idx].mfield_sz >> 1); - else - cmd.decoder_id = audio->dec_id; - cmd.buf_ptr = audio->out[idx].addr; - cmd.buf_size = len/2; - cmd.partition_number = 0; - return audplay_send_queue0(audio, &cmd, sizeof(cmd)); -} - -static void audplay_send_data(struct audio *audio, unsigned needed) -{ - struct buffer *frame; - unsigned long flags; - - spin_lock_irqsave(&audio->dsp_lock, flags); - if (!audio->running) - goto done; - - if (audio->wflush) { - audio->out_needed = 1; - goto done; - } - - if (needed && !audio->wflush) { - /* We were called from the callback because the DSP - * requested more data. Note that the DSP does want - * more data, and if a buffer was in-flight, mark it - * as available (since the DSP must now be done with - * it). - */ - audio->out_needed = 1; - frame = audio->out + audio->out_tail; - if (frame->used == 0xffffffff) { - MM_DBG("frame %d free\n", audio->out_tail); - frame->used = 0; - audio->out_tail ^= 1; - wake_up(&audio->write_wait); - } - } - - if (audio->out_needed) { - /* If the DSP currently wants data and we have a - * buffer available, we will send it and reset - * the needed flag. We'll mark the buffer as in-flight - * so that it won't be recycled until the next buffer - * is requested - */ - - MM_DBG("\n"); /* Macro prints the file name and function */ - frame = audio->out + audio->out_tail; - if (frame->used) { - BUG_ON(frame->used == 0xffffffff); - MM_DBG("frame %d busy\n", audio->out_tail); - audplay_dsp_send_data_avail(audio, audio->out_tail, - frame->used); - frame->used = 0xffffffff; - audio->out_needed = 0; - } - } -done: - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -/* ------------------- device --------------------- */ - -static void audio_flush(struct audio *audio) -{ - audio->out[0].used = 0; - audio->out[1].used = 0; - audio->out_head = 0; - audio->out_tail = 0; - audio->reserved = 0; - atomic_set(&audio->out_bytes, 0); -} - -static void audio_flush_pcm_buf(struct audio *audio) -{ - uint8_t index; - - for (index = 0; index < PCM_BUF_MAX_COUNT; index++) - audio->in[index].used = 0; - audio->buf_refresh = 0; - audio->read_next = 0; - audio->fill_next = 0; -} - -static void audio_ioport_reset(struct audio *audio) -{ - /* Make sure read/write thread are free from - * sleep and knowing that system is not able - * to process io request at the moment - */ - wake_up(&audio->write_wait); - mutex_lock(&audio->write_lock); - audio_flush(audio); - mutex_unlock(&audio->write_lock); - wake_up(&audio->read_wait); - mutex_lock(&audio->read_lock); - audio_flush_pcm_buf(audio); - mutex_unlock(&audio->read_lock); - audio->avsync_flag = 1; - wake_up(&audio->avsync_wait); -} - -static int audwmapro_events_pending(struct audio *audio) -{ - unsigned long flags; - int empty; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - empty = !list_empty(&audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - return empty || audio->event_abort; -} - -static void audwmapro_reset_event_queue(struct audio *audio) -{ - unsigned long flags; - struct audwmapro_event *drv_evt; - struct list_head *ptr, *next; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - list_for_each_safe(ptr, next, &audio->event_queue) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - list_for_each_safe(ptr, next, &audio->free_event_queue) { - drv_evt = list_first_entry(&audio->free_event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - kfree(drv_evt); - } - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - return; -} - -static long audwmapro_process_event_req(struct audio *audio, void __user *arg) -{ - long rc; - struct msm_audio_event usr_evt; - struct audwmapro_event *drv_evt = NULL; - int timeout; - unsigned long flags; - - if (copy_from_user(&usr_evt, arg, sizeof(struct msm_audio_event))) - return -EFAULT; - - timeout = (int) usr_evt.timeout_ms; - - if (timeout > 0) { - rc = wait_event_interruptible_timeout(audio->event_wait, - audwmapro_events_pending(audio), - msecs_to_jiffies(timeout)); - if (rc == 0) - return -ETIMEDOUT; - } else { - rc = wait_event_interruptible( - audio->event_wait, audwmapro_events_pending(audio)); - } - - if (rc < 0) - return rc; - - if (audio->event_abort) { - audio->event_abort = 0; - return -ENODEV; - } - - rc = 0; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - if (!list_empty(&audio->event_queue)) { - drv_evt = list_first_entry(&audio->event_queue, - struct audwmapro_event, list); - list_del(&drv_evt->list); - } - - if (drv_evt) { - usr_evt.event_type = drv_evt->event_type; - usr_evt.event_payload = drv_evt->payload; - list_add_tail(&drv_evt->list, &audio->free_event_queue); - } else - rc = -1; - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - - if (!rc && copy_to_user(arg, &usr_evt, sizeof(usr_evt))) - rc = -EFAULT; - - return rc; -} - -static int audio_enable_eq(struct audio *audio, int enable) -{ - if (audio->eq_enable == enable && !audio->eq_needs_commit) - return 0; - - audio->eq_enable = enable; - - if (audio->running) { - audpp_dsp_set_eq(audio->dec_id, enable, &audio->eq, POPP); - audio->eq_needs_commit = 0; - } - return 0; -} - -static int audio_get_avsync_data(struct audio *audio, - struct msm_audio_stats *stats) -{ - int rc = -EINVAL; - unsigned long flags; - - local_irq_save(flags); - if (audio->dec_id == audio->avsync[0] && audio->avsync_flag) { - /* av_sync sample count */ - stats->sample_count = (audio->avsync[2] << 16) | - (audio->avsync[3]); - - /* av_sync byte_count */ - stats->byte_count = (audio->avsync[5] << 16) | - (audio->avsync[6]); - - audio->avsync_flag = 0; - rc = 0; - } - local_irq_restore(flags); - return rc; - -} - -static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct audio *audio = file->private_data; - int rc = -EINVAL; - unsigned long flags = 0; - uint16_t enable_mask; - int enable; - int prev_state; - - MM_DBG("cmd = %d\n", cmd); - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - - audio->avsync_flag = 0; - memset(&stats, 0, sizeof(stats)); - if (audpp_query_avsync(audio->dec_id) < 0) - return rc; - - rc = wait_event_interruptible_timeout(audio->avsync_wait, - (audio->avsync_flag == 1), - msecs_to_jiffies(AUDPP_AVSYNC_EVENT_TIMEOUT)); - - if (rc < 0) - return rc; - else if ((rc > 0) || ((rc == 0) && (audio->avsync_flag == 1))) { - if (audio_get_avsync_data(audio, &stats) < 0) - return rc; - - if (copy_to_user((void *)arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } else - return -EAGAIN; - } - - switch (cmd) { - case AUDIO_ENABLE_AUDPP: - if (copy_from_user(&enable_mask, (void *) arg, - sizeof(enable_mask))) { - rc = -EFAULT; - break; - } - - spin_lock_irqsave(&audio->dsp_lock, flags); - enable = (enable_mask & EQ_ENABLE) ? 1 : 0; - audio_enable_eq(audio, enable); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - case AUDIO_SET_VOLUME: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.volume = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_PAN: - spin_lock_irqsave(&audio->dsp_lock, flags); - audio->vol_pan.pan = arg; - if (audio->running) - audpp_dsp_set_vol_pan(audio->dec_id, &audio->vol_pan, - POPP); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - rc = 0; - break; - - case AUDIO_SET_EQ: - prev_state = audio->eq_enable; - audio->eq_enable = 0; - if (copy_from_user(&audio->eq.num_bands, (void *) arg, - sizeof(audio->eq) - - (AUDPP_CMD_CFG_OBJECT_PARAMS_COMMON_LEN + 2))) { - rc = -EFAULT; - break; - } - audio->eq_enable = prev_state; - audio->eq_needs_commit = 1; - rc = 0; - break; - } - - if (-EINVAL != rc) - return rc; - - if (cmd == AUDIO_GET_EVENT) { - MM_DBG("AUDIO_GET_EVENT\n"); - if (mutex_trylock(&audio->get_event_lock)) { - rc = audwmapro_process_event_req(audio, - (void __user *) arg); - mutex_unlock(&audio->get_event_lock); - } else - rc = -EBUSY; - return rc; - } - - if (cmd == AUDIO_ABORT_GET_EVENT) { - audio->event_abort = 1; - wake_up(&audio->event_wait); - return 0; - } - - mutex_lock(&audio->lock); - switch (cmd) { - case AUDIO_START: - MM_DBG("AUDIO_START\n"); - rc = audio_enable(audio); - if (!rc) { - rc = wait_event_interruptible_timeout(audio->wait, - audio->dec_state != MSM_AUD_DECODER_STATE_NONE, - msecs_to_jiffies(MSM_AUD_DECODER_WAIT_MS)); - MM_INFO("dec_state %d rc = %d\n", audio->dec_state, rc); - - if (audio->dec_state != MSM_AUD_DECODER_STATE_SUCCESS) - rc = -ENODEV; - else - rc = 0; - } - break; - case AUDIO_STOP: - MM_DBG("AUDIO_STOP\n"); - rc = audio_disable(audio); - audio->stopped = 1; - audio_ioport_reset(audio); - audio->stopped = 0; - break; - case AUDIO_FLUSH: - MM_DBG("AUDIO_FLUSH\n"); - audio->rflush = 1; - audio->wflush = 1; - audio_ioport_reset(audio); - if (audio->running) { - audpp_flush(audio->dec_id); - rc = wait_event_interruptible(audio->write_wait, - !audio->wflush); - if (rc < 0) { - MM_ERR("AUDIO_FLUSH interrupted\n"); - rc = -EINTR; - } - } else { - audio->rflush = 0; - audio->wflush = 0; - } - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.channel_count == 1) { - config.channel_count = AUDPP_CMD_PCM_INTF_MONO_V; - } else if (config.channel_count == 2) { - config.channel_count = AUDPP_CMD_PCM_INTF_STEREO_V; - } else { - rc = -EINVAL; - break; - } - audio->mfield = config.meta_field; - audio->out_sample_rate = config.sample_rate; - audio->out_channel_mode = config.channel_count; - rc = 0; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = (audio->out_dma_sz >> 1); - config.buffer_count = 2; - config.sample_rate = audio->out_sample_rate; - if (audio->out_channel_mode == AUDPP_CMD_PCM_INTF_MONO_V) - config.channel_count = 1; - else - config.channel_count = 2; - config.meta_field = 0; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - else - rc = 0; - - break; - } - case AUDIO_GET_WMAPRO_CONFIG:{ - if (copy_to_user((void *)arg, &audio->wmapro_config, - sizeof(audio->wmapro_config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_WMAPRO_CONFIG:{ - struct msm_audio_wmapro_config usr_config; - - if (copy_from_user - (&usr_config, (void *)arg, - sizeof(usr_config))) { - rc = -EFAULT; - break; - } - - audio->wmapro_config = usr_config; - - /* Need to swap the first and last words of advancedencodeopt2 - * as DSP cannot read 32-bit variable at a time. Need to be - * split into two 16-bit and swap them as required by DSP */ - - audio->wmapro_config.advancedencodeopt2 = - ((audio->wmapro_config.advancedencodeopt2 & 0xFFFF0000) - >> 16) | ((audio->wmapro_config.advancedencodeopt2 - << 16) & 0xFFFF0000); - rc = 0; - break; - } - case AUDIO_GET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - config.pcm_feedback = audio->pcm_feedback; - config.buffer_count = PCM_BUF_MAX_COUNT; - config.buffer_size = PCM_BUFSZ_MIN; - if (copy_to_user((void *)arg, &config, - sizeof(config))) - rc = -EFAULT; - else - rc = 0; - break; - } - case AUDIO_SET_PCM_CONFIG:{ - struct msm_audio_pcm_config config; - if (copy_from_user - (&config, (void *)arg, sizeof(config))) { - rc = -EFAULT; - break; - } - if (config.pcm_feedback != audio->pcm_feedback) { - MM_ERR("Not sufficient permission to" - "change the playback mode\n"); - rc = -EACCES; - break; - } - if ((config.buffer_count > PCM_BUF_MAX_COUNT) || - (config.buffer_count == 1)) - config.buffer_count = PCM_BUF_MAX_COUNT; - - if (config.buffer_size < PCM_BUFSZ_MIN) - config.buffer_size = PCM_BUFSZ_MIN; - - /* Check if pcm feedback is required */ - if ((config.pcm_feedback) && (!audio->read_data)) { - MM_DBG("allocate PCM buffer %d\n", - config.buffer_count * - config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { - rc = -ENOMEM; - break; - } - audio->map_v_read = ioremap( - audio->read_phys, - config.buffer_size * - config.buffer_count); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("read buf map fail\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); - } else { - uint8_t index; - uint32_t offset = 0; - audio->read_data = - audio->map_v_read; - audio->pcm_feedback = 1; - audio->buf_refresh = 0; - audio->pcm_buf_count = - config.buffer_count; - audio->read_next = 0; - audio->fill_next = 0; - - for (index = 0; - index < config.buffer_count; - index++) { - audio->in[index].data = - audio->read_data + offset; - audio->in[index].addr = - audio->read_phys + offset; - audio->in[index].size = - config.buffer_size; - audio->in[index].used = 0; - offset += config.buffer_size; - } - MM_DBG("read buf: phy addr \ - 0x%08x kernel addr 0x%08x\n", - audio->read_phys, - (int)audio->read_data); - rc = 0; - } - } else { - rc = 0; - } - break; - } - case AUDIO_PAUSE: - MM_DBG("AUDIO_PAUSE %ld\n", arg); - rc = audpp_pause(audio->dec_id, (int) arg); - break; - case AUDIO_GET_SESSION_ID: - if (copy_to_user((void *) arg, &audio->dec_id, - sizeof(unsigned short))) - rc = -EFAULT; - else - rc = 0; - break; - default: - rc = -EINVAL; - } - mutex_unlock(&audio->lock); - return rc; -} - -/* Only useful in tunnel-mode */ -static int audio_fsync(struct file *file, loff_t ppos1, loff_t ppos2, int datasync) -{ - struct audio *audio = file->private_data; - struct buffer *frame; - int rc = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - if (!audio->running || audio->pcm_feedback) { - rc = -EINVAL; - goto done_nolock; - } - - mutex_lock(&audio->write_lock); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (audio->reserved) { - MM_DBG("send reserved byte\n"); - frame = audio->out + audio->out_tail; - ((char *) frame->data)[0] = audio->rsv_byte; - ((char *) frame->data)[1] = 0; - frame->used = 2; - audplay_send_data(audio, 0); - - rc = wait_event_interruptible(audio->write_wait, - (!audio->out[0].used && - !audio->out[1].used && - audio->out_needed) || audio->wflush); - - if (rc < 0) - goto done; - else if (audio->wflush) { - rc = -EBUSY; - goto done; - } - } - - /* pcm dmamiss message is sent continously - * when decoder is starved so no race - * condition concern - */ - audio->teos = 0; - - rc = wait_event_interruptible(audio->write_wait, - audio->teos || audio->wflush); - - if (audio->wflush) - rc = -EBUSY; - -done: - mutex_unlock(&audio->write_lock); -done_nolock: - return rc; -} - -static ssize_t audio_read(struct file *file, char __user *buf, size_t count, - loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - int rc = 0; - - if (!audio->pcm_feedback) - return 0; /* PCM feedback is not enabled. Nothing to read */ - - mutex_lock(&audio->read_lock); - MM_DBG("%d \n", count); - while (count > 0) { - rc = wait_event_interruptible(audio->read_wait, - (audio->in[audio->read_next].used > 0) || - (audio->stopped) || (audio->rflush)); - - if (rc < 0) - break; - - if (audio->stopped || audio->rflush) { - rc = -EBUSY; - break; - } - - if (count < audio->in[audio->read_next].used) { - /* Read must happen in frame boundary. Since driver - does not know frame size, read count must be greater - or equal to size of PCM samples */ - MM_DBG("audio_read: no partial frame done reading\n"); - break; - } else { - MM_DBG("audio_read: read from in[%d]\n", - audio->read_next); - if (copy_to_user - (buf, audio->in[audio->read_next].data, - audio->in[audio->read_next].used)) { - MM_ERR("invalid addr %x \n", (unsigned int)buf); - rc = -EFAULT; - break; - } - count -= audio->in[audio->read_next].used; - buf += audio->in[audio->read_next].used; - audio->in[audio->read_next].used = 0; - if ((++audio->read_next) == audio->pcm_buf_count) - audio->read_next = 0; - break; /* Force to exit while loop - * to prevent output thread - * sleep too long if data is - * not ready at this moment. - */ - } - } - - /* don't feed output buffer to HW decoder during flushing - * buffer refresh command will be sent once flush completes - * send buf refresh command here can confuse HW decoder - */ - if (audio->buf_refresh && !audio->rflush) { - audio->buf_refresh = 0; - MM_DBG("kick start pcm feedback again\n"); - audplay_buffer_refresh(audio); - } - - mutex_unlock(&audio->read_lock); - - if (buf > start) - rc = buf - start; - - MM_DBG("read %d bytes\n", rc); - return rc; -} - -static int audwmapro_process_eos(struct audio *audio, - const char __user *buf_start, unsigned short mfield_size) -{ - int rc = 0; - struct buffer *frame; - char *buf_ptr; - - if (audio->reserved) { - MM_DBG("flush reserve byte\n"); - frame = audio->out + audio->out_head; - buf_ptr = frame->data; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - buf_ptr[0] = audio->rsv_byte; - buf_ptr[1] = 0; - audio->out_head ^= 1; - frame->mfield_sz = 0; - frame->used = 2; - audio->reserved = 0; - audplay_send_data(audio, 0); - } - - frame = audio->out + audio->out_head; - - rc = wait_event_interruptible(audio->write_wait, - (audio->out_needed && - audio->out[0].used == 0 && - audio->out[1].used == 0) - || (audio->stopped) - || (audio->wflush)); - - if (rc < 0) - goto done; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - goto done; - } - - if (copy_from_user(frame->data, buf_start, mfield_size)) { - rc = -EFAULT; - goto done; - } - - frame->mfield_sz = mfield_size; - audio->out_head ^= 1; - frame->used = mfield_size; - audplay_send_data(audio, 0); -done: - return rc; -} - -static ssize_t audio_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct audio *audio = file->private_data; - const char __user *start = buf; - struct buffer *frame; - size_t xfer; - char *cpy_ptr; - int rc = 0, eos_condition = AUDWMAPRO_EOS_NONE; - unsigned dsize; - unsigned short mfield_size = 0; - - MM_DBG("cnt=%d\n", count); - - mutex_lock(&audio->write_lock); - while (count > 0) { - frame = audio->out + audio->out_head; - cpy_ptr = frame->data; - dsize = 0; - rc = wait_event_interruptible(audio->write_wait, - (frame->used == 0) - || (audio->stopped) - || (audio->wflush)); - if (rc < 0) - break; - if (audio->stopped || audio->wflush) { - rc = -EBUSY; - break; - } - if (audio->mfield) { - if (buf == start) { - /* Processing beginning of user buffer */ - if (__get_user(mfield_size, - (unsigned short __user *) buf)) { - rc = -EFAULT; - break; - } else if (mfield_size > count) { - rc = -EINVAL; - break; - } - MM_DBG("audio_write: mf offset_val %x\n", - mfield_size); - if (copy_from_user(cpy_ptr, buf, mfield_size)) { - rc = -EFAULT; - break; - } - /* Check if EOS flag is set and buffer has - * contains just meta field - */ - if (cpy_ptr[AUDWMAPRO_EOS_FLG_OFFSET] & - AUDWMAPRO_EOS_FLG_MASK) { - MM_DBG("audio_write: EOS SET\n"); - eos_condition = AUDWMAPRO_EOS_SET; - if (mfield_size == count) { - buf += mfield_size; - break; - } else - cpy_ptr[AUDWMAPRO_EOS_FLG_OFFSET] - &= ~AUDWMAPRO_EOS_FLG_MASK; - } - cpy_ptr += mfield_size; - count -= mfield_size; - dsize += mfield_size; - buf += mfield_size; - } else { - mfield_size = 0; - MM_DBG("audio_write: continuous buffer\n"); - } - frame->mfield_sz = mfield_size; - } - - if (audio->reserved) { - MM_DBG("append reserved byte %x\n", audio->rsv_byte); - *cpy_ptr = audio->rsv_byte; - xfer = (count > ((frame->size - mfield_size) - 1)) ? - (frame->size - mfield_size) - 1 : count; - cpy_ptr++; - dsize += 1; - audio->reserved = 0; - } else - xfer = (count > (frame->size - mfield_size)) ? - (frame->size - mfield_size) : count; - - if (copy_from_user(cpy_ptr, buf, xfer)) { - rc = -EFAULT; - break; - } - - dsize += xfer; - if (dsize & 1) { - audio->rsv_byte = ((char *) frame->data)[dsize - 1]; - MM_DBG("odd length buf reserve last byte %x\n", - audio->rsv_byte); - audio->reserved = 1; - dsize--; - } - count -= xfer; - buf += xfer; - - if (dsize > 0) { - audio->out_head ^= 1; - frame->used = dsize; - audplay_send_data(audio, 0); - } - } - if (eos_condition == AUDWMAPRO_EOS_SET) - rc = audwmapro_process_eos(audio, start, mfield_size); - mutex_unlock(&audio->write_lock); - if (!rc) { - if (buf > start) - return buf - start; - } - return rc; -} - -static int audio_release(struct inode *inode, struct file *file) -{ - struct audio *audio = file->private_data; - - MM_INFO("audio instance 0x%08x freeing\n", (int)audio); - mutex_lock(&audio->lock); - auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); - audio_disable(audio); - audio_flush(audio); - audio_flush_pcm_buf(audio); - msm_adsp_put(audio->audplay); - audpp_adec_free(audio->dec_id); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&audio->suspend_ctl.node); -#endif - audio->event_abort = 1; - wake_up(&audio->event_wait); - audwmapro_reset_event_queue(audio); - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - iounmap(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); - } - mutex_unlock(&audio->lock); -#ifdef CONFIG_DEBUG_FS - if (audio->dentry) - debugfs_remove(audio->dentry); -#endif - kfree(audio); - return 0; -} - -#ifdef CONFIG_HAS_EARLYSUSPEND -static void audwmapro_post_event(struct audio *audio, int type, - union msm_audio_event_payload payload) -{ - struct audwmapro_event *e_node = NULL; - unsigned long flags; - - spin_lock_irqsave(&audio->event_queue_lock, flags); - - if (!list_empty(&audio->free_event_queue)) { - e_node = list_first_entry(&audio->free_event_queue, - struct audwmapro_event, list); - list_del(&e_node->list); - } else { - e_node = kmalloc(sizeof(struct audwmapro_event), GFP_ATOMIC); - if (!e_node) { - MM_ERR("No mem to post event %d\n", type); - return; - } - } - - e_node->event_type = type; - e_node->payload = payload; - - list_add_tail(&e_node->list, &audio->event_queue); - spin_unlock_irqrestore(&audio->event_queue_lock, flags); - wake_up(&audio->event_wait); -} - -static void audwmapro_suspend(struct early_suspend *h) -{ - struct audwmapro_suspend_ctl *ctl = - container_of(h, struct audwmapro_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwmapro_post_event(ctl->audio, AUDIO_EVENT_SUSPEND, payload); -} - -static void audwmapro_resume(struct early_suspend *h) -{ - struct audwmapro_suspend_ctl *ctl = - container_of(h, struct audwmapro_suspend_ctl, node); - union msm_audio_event_payload payload; - - MM_DBG("\n"); /* Macro prints the file name and function */ - audwmapro_post_event(ctl->audio, AUDIO_EVENT_RESUME, payload); -} -#endif - -#ifdef CONFIG_DEBUG_FS -static ssize_t audwmapro_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t audwmapro_debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - const int debug_bufmax = 4096; - static char buffer[4096]; - int n = 0, i; - struct audio *audio = file->private_data; - - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_feedback %d\n", audio->pcm_feedback); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_buf_sz %d\n", audio->out[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_count %d \n", audio->pcm_buf_count); - n += scnprintf(buffer + n, debug_bufmax - n, - "pcm_buf_sz %d \n", audio->in[0].size); - n += scnprintf(buffer + n, debug_bufmax - n, - "volume %x \n", audio->vol_pan.volume); - n += scnprintf(buffer + n, debug_bufmax - n, - "sample rate %d \n", audio->out_sample_rate); - n += scnprintf(buffer + n, debug_bufmax - n, - "channel mode %d \n", audio->out_channel_mode); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "running %d \n", audio->running); - n += scnprintf(buffer + n, debug_bufmax - n, - "dec state %d \n", audio->dec_state); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_needed %d \n", audio->out_needed); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_head %d \n", audio->out_head); - n += scnprintf(buffer + n, debug_bufmax - n, - "out_tail %d \n", audio->out_tail); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[0].used %d \n", audio->out[0].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "out[1].used %d \n", audio->out[1].used); - n += scnprintf(buffer + n, debug_bufmax - n, - "buffer_refresh %d \n", audio->buf_refresh); - n += scnprintf(buffer + n, debug_bufmax - n, - "read_next %d \n", audio->read_next); - n += scnprintf(buffer + n, debug_bufmax - n, - "fill_next %d \n", audio->fill_next); - for (i = 0; i < audio->pcm_buf_count; i++) - n += scnprintf(buffer + n, debug_bufmax - n, - "in[%d].size %d \n", i, audio->in[i].used); - buffer[n] = 0; - return simple_read_from_buffer(buf, count, ppos, buffer, n); -} - -static const struct file_operations audwmapro_debug_fops = { - .read = audwmapro_debug_read, - .open = audwmapro_debug_open, -}; -#endif - -static int audio_open(struct inode *inode, struct file *file) -{ - struct audio *audio = NULL; - int rc, dec_attrb, decid, i; - unsigned pmem_sz = DMASZ_MAX; - struct audwmapro_event *e_node = NULL; -#ifdef CONFIG_DEBUG_FS - /* 4 bytes represents decoder number, 1 byte for terminate string */ - char name[sizeof "msm_wmapro_" + 5]; -#endif - - /* Allocate Mem for audio instance */ - audio = kzalloc(sizeof(struct audio), GFP_KERNEL); - if (!audio) { - MM_ERR("no memory to allocate audio instance \n"); - rc = -ENOMEM; - goto done; - } - MM_INFO("audio instance 0x%08x created\n", (int)audio); - - /* Allocate the decoder */ - dec_attrb = AUDDEC_DEC_WMAPRO; - if ((file->f_mode & FMODE_WRITE) && - (file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_NONTUNNEL; - audio->pcm_feedback = NON_TUNNEL_MODE_PLAYBACK; - } else if ((file->f_mode & FMODE_WRITE) && - !(file->f_mode & FMODE_READ)) { - dec_attrb |= MSM_AUD_MODE_TUNNEL; - audio->pcm_feedback = TUNNEL_MODE_PLAYBACK; - } else { - kfree(audio); - rc = -EACCES; - goto done; - } - - decid = audpp_adec_alloc(dec_attrb, &audio->module_name, - &audio->queue_id); - - if (decid < 0) { - MM_ERR("No free decoder available, freeing instance 0x%08x\n", - (int)audio); - rc = -ENODEV; - kfree(audio); - goto done; - } - audio->dec_id = decid & MSM_AUD_DECODER_MASK; - - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, SZ_4K); - if (audio->phys) { - audio->map_v_write = ioremap(audio->phys, pmem_sz); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not map write buffers, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; - } - audio->out_dma_sz = pmem_sz; - - rc = msm_adsp_get(audio->module_name, &audio->audplay, - &audplay_adsp_ops_wmapro, audio); - if (rc) { - MM_ERR("failed to get %s module, freeing instance 0x%08x\n", - audio->module_name, (int)audio); - goto err; - } - - mutex_init(&audio->lock); - mutex_init(&audio->write_lock); - mutex_init(&audio->read_lock); - mutex_init(&audio->get_event_lock); - spin_lock_init(&audio->dsp_lock); - init_waitqueue_head(&audio->write_wait); - init_waitqueue_head(&audio->read_wait); - INIT_LIST_HEAD(&audio->free_event_queue); - INIT_LIST_HEAD(&audio->event_queue); - init_waitqueue_head(&audio->wait); - init_waitqueue_head(&audio->event_wait); - spin_lock_init(&audio->event_queue_lock); - init_waitqueue_head(&audio->avsync_wait); - - audio->out[0].data = audio->data + 0; - audio->out[0].addr = audio->phys + 0; - audio->out[0].size = audio->out_dma_sz >> 1; - - audio->out[1].data = audio->data + audio->out[0].size; - audio->out[1].addr = audio->phys + audio->out[0].size; - audio->out[1].size = audio->out[0].size; - - /*audio->wmapro_config.armdatareqthr = 1268; - audio->wmapro_config.numchannels = 2; - audio->wmapro_config.avgbytespersecond = 6003; - audio->wmapro_config.samplingrate = 44100; - audio->wmapro_config.encodeopt = 224; - audio->wmapro_config.validbitspersample = 16; - audio->wmapro_config.formattag = 354; - audio->wmapro_config.asfpacketlength = 2230; - audio->wmapro_config.channelmask = 3; - audio->wmapro_config.advancedencodeopt = 32834; - audio->wmapro_config.advancedencodeopt2 = 0;*/ - - audio->out_sample_rate = 44100; - audio->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; - - audio->vol_pan.volume = 0x2000; - - audio_flush(audio); - - file->private_data = audio; - audio->opened = 1; - audio->device_events = AUDDEV_EVT_DEV_RDY - |AUDDEV_EVT_DEV_RLS| - AUDDEV_EVT_STREAM_VOL_CHG; - - rc = auddev_register_evt_listner(audio->device_events, - AUDDEV_CLNT_DEC, - audio->dec_id, - wmapro_listner, - (void *)audio); - if (rc) { - MM_ERR("%s: failed to register listner\n", __func__); - goto event_err; - } - -#ifdef CONFIG_DEBUG_FS - snprintf(name, sizeof name, "msm_wmapro_%04x", audio->dec_id); - audio->dentry = debugfs_create_file(name, S_IFREG | S_IRUGO, - NULL, (void *) audio, - &audwmapro_debug_fops); - - if (IS_ERR(audio->dentry)) - MM_DBG("debugfs_create_file failed\n"); -#endif -#ifdef CONFIG_HAS_EARLYSUSPEND - audio->suspend_ctl.node.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; - audio->suspend_ctl.node.resume = audwmapro_resume; - audio->suspend_ctl.node.suspend = audwmapro_suspend; - audio->suspend_ctl.audio = audio; - register_early_suspend(&audio->suspend_ctl.node); -#endif - for (i = 0; i < AUDWMAPRO_EVENT_NUM; i++) { - e_node = kmalloc(sizeof(struct audwmapro_event), GFP_KERNEL); - if (e_node) - list_add_tail(&e_node->list, &audio->free_event_queue); - else { - MM_ERR("event pkt alloc failed\n"); - break; - } - } -done: - return rc; -event_err: - msm_adsp_put(audio->audplay); -err: - iounmap(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - return rc; -} - -static const struct file_operations audio_wmapro_fops = { - .owner = THIS_MODULE, - .open = audio_open, - .release = audio_release, - .read = audio_read, - .write = audio_write, - .unlocked_ioctl = audio_ioctl, - .fsync = audio_fsync, -}; - -struct miscdevice audio_wmapro_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_wmapro", - .fops = &audio_wmapro_fops, -}; - -static int __init audio_init(void) -{ - return misc_register(&audio_wmapro_misc); -} - -device_initcall(audio_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audpp.c b/arch/arm/mach-msm/qdsp5v2/audpp.c deleted file mode 100644 index 7a40156d961f..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audpp.c +++ /dev/null @@ -1,1140 +0,0 @@ -/* arch/arm/mach-msm/qdsp5/audpp.c - * - * common code to deal with the AUDPP dsp task (audio postproc) - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../qdsp5/evlog.h" -#include - -enum { - EV_NULL, - EV_ENABLE, - EV_DISABLE, - EV_EVENT, - EV_DATA, -}; - -static const char *dsp_log_strings[] = { - "NULL", - "ENABLE", - "DISABLE", - "EVENT", - "DATA", -}; - -DECLARE_LOG(dsp_log, 64, dsp_log_strings); - -static int __init _dsp_log_init(void) -{ - return ev_log_init(&dsp_log); -} - -module_init(_dsp_log_init); -#define LOG(id, arg) ev_log_write(&dsp_log, id, arg) - -static DEFINE_MUTEX(audpp_lock); -static DEFINE_MUTEX(audpp_dec_lock); -static struct wake_lock audpp_wake_lock; - -#define CH_COUNT 5 -#define AUDPP_CLNT_MAX_COUNT 6 - -#define AUDPP_CMD_CFG_OBJ_UPDATE 0x8000 -#define AUDPP_CMD_EQ_FLAG_DIS 0x0000 -#define AUDPP_CMD_EQ_FLAG_ENA -1 -#define AUDPP_CMD_IIR_FLAG_DIS 0x0000 -#define AUDPP_CMD_IIR_FLAG_ENA -1 -#define AUDPP_CMD_STF_FLAG_ENA -1 -#define AUDPP_CMD_STF_FLAG_DIS 0x0000 - -#define MAX_EVENT_CALLBACK_CLIENTS 1 - -#define AUDPP_CONCURRENCY_DEFAULT 0 /* Set default to LPA mode */ -#define AUDPP_MAX_DECODER_CNT 5 -#define AUDPP_CODEC_MASK 0x000000FF -#define AUDPP_MODE_MASK 0x00000F00 -#define AUDPP_OP_MASK 0xF0000000 - -struct audpp_decoder_info { - unsigned int codec; - pid_t pid; -}; - -struct audpp_state { - struct msm_adsp_module *mod; - audpp_event_func func[AUDPP_CLNT_MAX_COUNT]; - void *private[AUDPP_CLNT_MAX_COUNT]; - struct mutex *lock; - unsigned open_count; - unsigned enabled; - - /* Related to decoder allocation */ - struct mutex *lock_dec; - struct msm_adspdec_database *dec_database; - struct audpp_decoder_info dec_info_table[AUDPP_MAX_DECODER_CNT]; - unsigned dec_inuse; - unsigned long concurrency; - - struct audpp_event_callback *cb_tbl[MAX_EVENT_CALLBACK_CLIENTS]; - - /* Related to decoder instances */ - uint8_t op_mode; /* Specifies Turbo/Non Turbo mode */ - uint8_t decoder_count; /* No. of decoders active running */ - uint8_t codec_max_instances; /* Max codecs allowed currently */ - uint8_t codec_cnt[MSM_MAX_DEC_CNT]; /* Nr of each codec - type enabled */ - - wait_queue_head_t event_wait; -}; - -struct audpp_state the_audpp_state = { - .lock = &audpp_lock, - .lock_dec = &audpp_dec_lock, -}; - -static inline void prevent_suspend(void) -{ - wake_lock(&audpp_wake_lock); -} -static inline void allow_suspend(void) -{ - wake_unlock(&audpp_wake_lock); -} - -int audpp_send_queue1(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd1Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue1); - -int audpp_send_queue2(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd2Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue2); - -int audpp_send_queue3(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpp_state.mod, - QDSP_uPAudPPCmd3Queue, cmd, len); -} -EXPORT_SYMBOL(audpp_send_queue3); - -static int audpp_dsp_config(int enable) -{ - struct audpp_cmd_cfg cmd; - - cmd.cmd_id = AUDPP_CMD_CFG; - cmd.cfg = enable ? AUDPP_CMD_CFG_ENABLE : AUDPP_CMD_CFG_SLEEP; - - return audpp_send_queue1(&cmd, sizeof(cmd)); -} - -void audpp_route_stream(unsigned short dec_id, unsigned short mixer_mask) -{ - struct audpp_cmd_cfg_dev_mixer_params mixer_params_cmd; - - memset(&mixer_params_cmd, 0, sizeof(mixer_params_cmd)); - - mixer_params_cmd.cmd_id = AUDPP_CMD_CFG_DEV_MIXER; - mixer_params_cmd.stream_id = dec_id; - mixer_params_cmd.mixer_cmd = mixer_mask; - audpp_send_queue1(&mixer_params_cmd, sizeof(mixer_params_cmd)); - -} -EXPORT_SYMBOL(audpp_route_stream); - -int is_audpp_enable(void) -{ - struct audpp_state *audpp = &the_audpp_state; - - return audpp->enabled; -} -EXPORT_SYMBOL(is_audpp_enable); - -int audpp_register_event_callback(struct audpp_event_callback *ecb) -{ - struct audpp_state *audpp = &the_audpp_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (NULL == audpp->cb_tbl[i]) { - audpp->cb_tbl[i] = ecb; - return 0; - } - } - return -1; -} -EXPORT_SYMBOL(audpp_register_event_callback); - - -int audpp_unregister_event_callback(struct audpp_event_callback *ecb) -{ - struct audpp_state *audpp = &the_audpp_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (ecb == audpp->cb_tbl[i]) { - audpp->cb_tbl[i] = NULL; - return 0; - } - } - return -1; -} -EXPORT_SYMBOL(audpp_unregister_event_callback); - -static void audpp_broadcast(struct audpp_state *audpp, unsigned id, - uint16_t *msg) -{ - unsigned n; - for (n = 0; n < AUDPP_CLNT_MAX_COUNT; n++) { - if (audpp->func[n]) - audpp->func[n] (audpp->private[n], id, msg); - } - - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) - if (audpp->cb_tbl[n] && audpp->cb_tbl[n]->fn) - audpp->cb_tbl[n]->fn(audpp->cb_tbl[n]->private, id, - msg); -} - -static void audpp_notify_clnt(struct audpp_state *audpp, unsigned clnt_id, - unsigned id, uint16_t *msg) -{ - if (clnt_id < AUDPP_CLNT_MAX_COUNT && audpp->func[clnt_id]) - audpp->func[clnt_id] (audpp->private[clnt_id], id, msg); -} - -static void audpp_handle_pcmdmamiss(struct audpp_state *audpp, - uint16_t bit_mask) -{ - uint8_t b_index; - - for (b_index = 0; b_index < AUDPP_CLNT_MAX_COUNT; b_index++) { - if (bit_mask & (0x1 << b_index)) - if (audpp->func[b_index]) - audpp->func[b_index] (audpp->private[b_index], - AUDPP_MSG_PCMDMAMISSED, - &bit_mask); - } -} - -static void audpp_dsp_event(void *data, unsigned id, size_t len, - void (*getevent) (void *ptr, size_t len)) -{ - struct audpp_state *audpp = data; - uint16_t msg[8]; - - getevent(msg, sizeof(msg)); - - LOG(EV_EVENT, (id << 16) | msg[0]); - LOG(EV_DATA, (msg[1] << 16) | msg[2]); - - switch (id) { - case AUDPP_MSG_STATUS_MSG:{ - unsigned cid = msg[0]; - MM_DBG("status %d %d %d\n", cid, msg[1], msg[2]); - - if ((cid < 5) && audpp->func[cid]) - audpp->func[cid] (audpp->private[cid], id, msg); - break; - } - case AUDPP_MSG_HOST_PCM_INTF_MSG: - if (audpp->func[5]) - audpp->func[5] (audpp->private[5], id, msg); - break; - case AUDPP_MSG_PCMDMAMISSED: - audpp_handle_pcmdmamiss(audpp, msg[0]); - break; - case AUDPP_MSG_CFG_MSG: - if (msg[0] == AUDPP_MSG_ENA_ENA) { - MM_INFO("ENABLE\n"); - audpp->enabled = 1; - audpp_broadcast(audpp, id, msg); - } else if (msg[0] == AUDPP_MSG_ENA_DIS) { - MM_INFO("DISABLE\n"); - audpp->enabled = 0; - wake_up(&audpp->event_wait); - audpp_broadcast(audpp, id, msg); - } else { - MM_ERR("invalid config msg %d\n", msg[0]); - } - break; - case AUDPP_MSG_ROUTING_ACK: - audpp_notify_clnt(audpp, msg[0], id, msg); - break; - case AUDPP_MSG_FLUSH_ACK: - audpp_notify_clnt(audpp, msg[0], id, msg); - break; - case ADSP_MESSAGE_ID: - MM_DBG("Received ADSP event: module enable/disable \ - (audpptask)"); - break; - case AUDPP_MSG_AVSYNC_MSG: - audpp_notify_clnt(audpp, msg[0], id, msg); - break; -#ifdef CONFIG_DEBUG_FS - case AUDPP_MSG_FEAT_QUERY_DM_DONE: - MM_INFO(" RTC ACK --> %x %x %x %x %x %x %x %x\n", msg[0],\ - msg[1], msg[2], msg[3], msg[4], \ - msg[5], msg[6], msg[7]); - acdb_rtc_set_err(msg[3]); - break; -#endif - default: - MM_INFO("unhandled msg id %x\n", id); - } -} - -static struct msm_adsp_ops adsp_ops = { - .event = audpp_dsp_event, -}; - -static void audpp_fake_event(struct audpp_state *audpp, int id, - unsigned event, unsigned arg) -{ - uint16_t msg[1]; - uint16_t n = 0; - msg[0] = arg; - audpp->func[id] (audpp->private[id], event, msg); - if (audpp->enabled == 1) { - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) - if (audpp->cb_tbl[n] && audpp->cb_tbl[n]->fn) - audpp->cb_tbl[n]->fn(audpp->cb_tbl[n]->private, - AUDPP_MSG_CFG_MSG, msg); - } -} - -int audpp_enable(int id, audpp_event_func func, void *private) -{ - struct audpp_state *audpp = &the_audpp_state; - int res = 0; - - if (id < -1 || id > 4) - return -EINVAL; - - if (id == -1) - id = 5; - - mutex_lock(audpp->lock); - if (audpp->func[id]) { - res = -EBUSY; - goto out; - } - - audpp->func[id] = func; - audpp->private[id] = private; - - LOG(EV_ENABLE, 1); - if (audpp->open_count++ == 0) { - MM_DBG("enable\n"); - res = msm_adsp_get("AUDPPTASK", &audpp->mod, &adsp_ops, audpp); - if (res < 0) { - MM_ERR("audpp: cannot open AUDPPTASK\n"); - audpp->open_count = 0; - audpp->func[id] = NULL; - audpp->private[id] = NULL; - goto out; - } - LOG(EV_ENABLE, 2); - prevent_suspend(); - msm_adsp_enable(audpp->mod); - audpp_dsp_config(1); - } else { - unsigned long flags; - local_irq_save(flags); - if (audpp->enabled) - audpp_fake_event(audpp, id, - AUDPP_MSG_CFG_MSG, AUDPP_MSG_ENA_ENA); - local_irq_restore(flags); - } - - res = 0; -out: - mutex_unlock(audpp->lock); - return res; -} -EXPORT_SYMBOL(audpp_enable); - -void audpp_disable(int id, void *private) -{ - struct audpp_state *audpp = &the_audpp_state; - unsigned long flags; - int rc; - - if (id < -1 || id > 4) - return; - - if (id == -1) - id = 5; - - mutex_lock(audpp->lock); - LOG(EV_DISABLE, 1); - if (!audpp->func[id]) - goto out; - if (audpp->private[id] != private) - goto out; - - local_irq_save(flags); - audpp_fake_event(audpp, id, AUDPP_MSG_CFG_MSG, AUDPP_MSG_ENA_DIS); - audpp->func[id] = NULL; - audpp->private[id] = NULL; - local_irq_restore(flags); - - if (--audpp->open_count == 0) { - MM_DBG("disable\n"); - LOG(EV_DISABLE, 2); - audpp_dsp_config(0); - rc = wait_event_interruptible(audpp->event_wait, - (audpp->enabled == 0)); - if (audpp->enabled == 0) - MM_INFO("Received CFG_MSG_DISABLE from ADSP\n"); - else - MM_ERR("Didn't receive CFG_MSG DISABLE \ - message from ADSP\n"); - msm_adsp_disable(audpp->mod); - msm_adsp_put(audpp->mod); - audpp->mod = NULL; - allow_suspend(); - } -out: - mutex_unlock(audpp->lock); -} -EXPORT_SYMBOL(audpp_disable); - -#define BAD_ID(id) ((id < 0) || (id >= CH_COUNT)) - -int audpp_restore_avsync(int id, uint16_t *avsync) -{ - struct audpp_cmd_avsync cmd; - - if (BAD_ID(id)) - return -1; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_AVSYNC; - cmd.stream_id = id; - cmd.interrupt_interval = 0; /* Setting it to Zero as there won't be - periodic update */ - cmd.sample_counter_dlsw = avsync[3]; - cmd.sample_counter_dmsw = avsync[2]; - cmd.sample_counter_msw = avsync[1]; - cmd.byte_counter_dlsw = avsync[6]; - cmd.byte_counter_dmsw = avsync[5]; - cmd.byte_counter_msw = avsync[4]; - - return audpp_send_queue1(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_restore_avsync); - -int audpp_query_avsync(int id) -{ - struct audpp_cmd_query_avsync cmd; - - if (BAD_ID(id)) - return -EINVAL; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_id = AUDPP_CMD_QUERY_AVSYNC; - cmd.stream_id = id; - return audpp_send_queue1(&cmd, sizeof(cmd)); - -} -EXPORT_SYMBOL(audpp_query_avsync); - -int audpp_set_volume_and_pan(unsigned id, unsigned volume, int pan, - enum obj_type objtype) -{ - /* cmd, obj_cfg[7], cmd_type, volume, pan */ - uint16_t cmd[7]; - - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - memset(cmd, 0, sizeof(cmd)); - cmd[0] = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - cmd[1] = AUDPP_CMD_POPP_STREAM; - else - cmd[1] = AUDPP_CMD_COPP_STREAM; - cmd[2] = id; - cmd[3] = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd[4] = AUDPP_CMD_VOLUME_PAN; - cmd[5] = volume; - cmd[6] = pan; - - return audpp_send_queue3(cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_set_volume_and_pan); - -/* Implementation of COPP features */ -int audpp_dsp_set_mbadrc(unsigned id, unsigned enable, - struct audpp_cmd_cfg_object_params_mbadrc *mbadrc, - enum obj_type objtype) -{ - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - mbadrc->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - mbadrc->common.stream = AUDPP_CMD_POPP_STREAM; - else - mbadrc->common.stream = AUDPP_CMD_COPP_STREAM; - - mbadrc->common.stream_id = id; - mbadrc->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - mbadrc->common.command_type = AUDPP_CMD_MBADRC; - - if (enable) - mbadrc->enable = AUDPP_CMD_ADRC_FLAG_ENA; - else - mbadrc->enable = AUDPP_CMD_ADRC_FLAG_DIS; - - return audpp_send_queue3(mbadrc, - sizeof(struct audpp_cmd_cfg_object_params_mbadrc)); -} -EXPORT_SYMBOL(audpp_dsp_set_mbadrc); - -int audpp_dsp_set_qconcert_plus(unsigned id, unsigned enable, - struct audpp_cmd_cfg_object_params_qconcert *qconcert_plus, - enum obj_type objtype) -{ - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - qconcert_plus->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - qconcert_plus->common.stream = AUDPP_CMD_POPP_STREAM; - else - qconcert_plus->common.stream = AUDPP_CMD_COPP_STREAM; - - qconcert_plus->common.stream_id = id; - qconcert_plus->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - qconcert_plus->common.command_type = AUDPP_CMD_QCONCERT; - - if (enable) - qconcert_plus->enable_flag = AUDPP_CMD_ADRC_FLAG_ENA; - else - qconcert_plus->enable_flag = AUDPP_CMD_ADRC_FLAG_DIS; - - return audpp_send_queue3(qconcert_plus, - sizeof(struct audpp_cmd_cfg_object_params_qconcert)); -} -EXPORT_SYMBOL(audpp_dsp_set_qconcert_plus); - -int audpp_dsp_set_rx_iir(unsigned id, unsigned enable, - struct audpp_cmd_cfg_object_params_pcm *iir, - enum obj_type objtype) -{ - - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - iir->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - iir->common.stream = AUDPP_CMD_POPP_STREAM; - else - iir->common.stream = AUDPP_CMD_COPP_STREAM; - - iir->common.stream_id = id; - iir->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - iir->common.command_type = AUDPP_CMD_IIR_TUNING_FILTER; - - if (enable) - iir->active_flag = AUDPP_CMD_IIR_FLAG_ENA; - else - iir->active_flag = AUDPP_CMD_IIR_FLAG_DIS; - - return audpp_send_queue3(iir, - sizeof(struct audpp_cmd_cfg_object_params_pcm)); -} -EXPORT_SYMBOL(audpp_dsp_set_rx_iir); - -int audpp_dsp_set_gain_rx(unsigned id, - struct audpp_cmd_cfg_cal_gain *calib_gain_rx, - enum obj_type objtype) -{ - if (objtype) { - return -EINVAL; - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - calib_gain_rx->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - calib_gain_rx->common.stream = AUDPP_CMD_COPP_STREAM; - - calib_gain_rx->common.stream_id = id; - calib_gain_rx->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - calib_gain_rx->common.command_type = AUDPP_CMD_CALIB_GAIN_RX; - - return audpp_send_queue3(calib_gain_rx, - sizeof(struct audpp_cmd_cfg_cal_gain)); -} -EXPORT_SYMBOL(audpp_dsp_set_gain_rx); - -int audpp_dsp_set_pbe(unsigned id, unsigned enable, - struct audpp_cmd_cfg_pbe *pbe_block, - enum obj_type objtype) -{ - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - pbe_block->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - pbe_block->common.stream = AUDPP_CMD_POPP_STREAM; - else - pbe_block->common.stream = AUDPP_CMD_COPP_STREAM; - - pbe_block->common.stream_id = id; - pbe_block->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - pbe_block->common.command_type = AUDPP_CMD_PBE; - - if (enable) - pbe_block->pbe_enable = AUDPP_CMD_PBE_FLAG_ENA; - else - pbe_block->pbe_enable = AUDPP_CMD_PBE_FLAG_DIS; - - return audpp_send_queue3(pbe_block, - sizeof(struct audpp_cmd_cfg_pbe)); -} -EXPORT_SYMBOL(audpp_dsp_set_pbe); - -int audpp_dsp_set_spa(unsigned id, - struct audpp_cmd_cfg_object_params_spectram *spa, - enum obj_type objtype){ - struct audpp_cmd_cfg_object_params_spectram cmd; - - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - memset(&cmd, 0, sizeof(cmd)); - if (objtype) - cmd.common.stream = AUDPP_CMD_POPP_STREAM; - else - cmd.common.stream = AUDPP_CMD_COPP_STREAM; - - cmd.common.stream_id = id; - cmd.common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_SPECTROGRAM; - cmd.sample_interval = spa->sample_interval; - cmd.num_coeff = spa->num_coeff; - return audpp_send_queue3(&cmd, sizeof(cmd)); - -} -EXPORT_SYMBOL(audpp_dsp_set_spa); - -int audpp_dsp_set_stf(unsigned id, unsigned enable, - struct audpp_cmd_cfg_object_params_sidechain *stf, - enum obj_type objtype){ - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - stf->common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - stf->common.stream = AUDPP_CMD_POPP_STREAM; - else - stf->common.stream = AUDPP_CMD_COPP_STREAM; - - stf->common.stream_id = id; - stf->common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - stf->common.command_type = AUDPP_CMD_SIDECHAIN_TUNING_FILTER; - - if (enable) - stf->active_flag = AUDPP_CMD_STF_FLAG_ENA; - else - stf->active_flag = AUDPP_CMD_STF_FLAG_DIS; - return audpp_send_queue3(stf, - sizeof(struct audpp_cmd_cfg_object_params_sidechain)); -} -EXPORT_SYMBOL(audpp_dsp_set_stf); - -/* Implementation Of COPP + POPP */ -int audpp_dsp_set_eq(unsigned id, unsigned enable, - struct audpp_cmd_cfg_object_params_eqalizer *eq, - enum obj_type objtype) -{ - struct audpp_cmd_cfg_object_params_eqalizer cmd; - - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > 3) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - memset(&cmd, 0, sizeof(cmd)); - if (objtype) - cmd.common.stream = AUDPP_CMD_POPP_STREAM; - else - cmd.common.stream = AUDPP_CMD_COPP_STREAM; - - cmd.common.stream_id = id; - cmd.common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_EQUALIZER; - if (enable) { - cmd.eq_flag = AUDPP_CMD_EQ_FLAG_ENA; - cmd.num_bands = eq->num_bands; - memcpy(&cmd.eq_coeff, &eq->eq_coeff, sizeof(eq->eq_coeff)); - } else - cmd.eq_flag = AUDPP_CMD_EQ_FLAG_DIS; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_eq); - -int audpp_dsp_set_vol_pan(unsigned id, - struct audpp_cmd_cfg_object_params_volume *vol_pan, - enum obj_type objtype) -{ - struct audpp_cmd_cfg_object_params_volume cmd; - - if (objtype) { - if (id > 5) { - MM_ERR("Wrong POPP decoder id: %d\n", id); - return -EINVAL; - } - } else { - if (id > AUDPP_MAX_COPP_DEVICES) { - MM_ERR("Wrong COPP decoder id: %d\n", id); - return -EINVAL; - } - } - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_OBJECT_PARAMS; - if (objtype) - cmd.common.stream = AUDPP_CMD_POPP_STREAM; - else - cmd.common.stream = AUDPP_CMD_COPP_STREAM; - - cmd.common.stream_id = id; - cmd.common.obj_cfg = AUDPP_CMD_CFG_OBJ_UPDATE; - cmd.common.command_type = AUDPP_CMD_VOLUME_PAN; - - cmd.volume = vol_pan->volume; - cmd.pan = vol_pan->pan; - - return audpp_send_queue3(&cmd, sizeof(cmd)); -} -EXPORT_SYMBOL(audpp_dsp_set_vol_pan); - -int audpp_pause(unsigned id, int pause) -{ - /* pause 1 = pause 0 = resume */ - u16 pause_cmd[AUDPP_CMD_DEC_CTRL_LEN / sizeof(unsigned short)]; - - if (id >= CH_COUNT) - return -EINVAL; - - memset(pause_cmd, 0, sizeof(pause_cmd)); - - pause_cmd[0] = AUDPP_CMD_DEC_CTRL; - pause_cmd[1] = id; - if (pause == 1) - pause_cmd[2] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_PAUSE_V; - else if (pause == 0) - pause_cmd[2] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_RESUME_V; - else - return -EINVAL; - - return audpp_send_queue1(pause_cmd, sizeof(pause_cmd)); -} -EXPORT_SYMBOL(audpp_pause); - -int audpp_flush(unsigned id) -{ - u16 flush_cmd[AUDPP_CMD_DEC_CTRL_LEN / sizeof(unsigned short)]; - - if (id >= CH_COUNT) - return -EINVAL; - - memset(flush_cmd, 0, sizeof(flush_cmd)); - - flush_cmd[0] = AUDPP_CMD_DEC_CTRL; - flush_cmd[1] = id; - flush_cmd[2] = AUDPP_CMD_UPDATE_V | AUDPP_CMD_FLUSH_V; - - return audpp_send_queue1(flush_cmd, sizeof(flush_cmd)); -} -EXPORT_SYMBOL(audpp_flush); - -/* dec_attrb = 7:0, 0 - No Decoder, else supported decoder * - * like mp3, aac, wma etc ... * - * = 15:8, bit[8] = 1 - Tunnel, bit[9] = 1 - NonTunnel * - * = 31:16, reserved */ -int audpp_adec_alloc(unsigned dec_attrb, const char **module_name, - unsigned *queueid) -{ - struct audpp_state *audpp = &the_audpp_state; - int decid = -1, idx, lidx, mode, codec; - int codecs_supported, min_codecs_supported; - unsigned int *concurrency_entry; - u8 max_instance, codec_type; - - struct dec_instance_table *dec_instance_list; - dec_instance_list = (struct dec_instance_table *) - (audpp->dec_database->dec_instance_list); - - mutex_lock(audpp->lock_dec); - /* Represents in bit mask */ - mode = ((dec_attrb & AUDPP_MODE_MASK) << 16); - codec = (1 << (dec_attrb & AUDPP_CODEC_MASK)); - codec_type = (dec_attrb & AUDPP_CODEC_MASK); - - /* Find whether same/different codec instances are running */ - audpp->decoder_count++; - audpp->codec_cnt[codec_type]++; - max_instance = 0; - - /*if different instance of codec*/ - if (audpp->codec_cnt[codec_type] < audpp->decoder_count) { - max_instance = audpp->codec_max_instances; - /* Get the maximum no. of instances that can be supported */ - for (idx = 0; idx < MSM_MAX_DEC_CNT; idx++) { - if (audpp->codec_cnt[idx]) { - if ((dec_instance_list + - audpp->op_mode * MSM_MAX_DEC_CNT + - idx)-> - max_instances_diff_dec < - max_instance) { - max_instance = - (dec_instance_list + - audpp->op_mode * - MSM_MAX_DEC_CNT - + idx)-> - max_instances_diff_dec; - } - } - } - /* if different codec type, should not cross maximum other - supported */ - if (audpp->decoder_count > (max_instance + 1)) { - MM_ERR("Can not support, already reached max\n"); - audpp->decoder_count--; - audpp->codec_cnt[codec_type]--; - goto done; - } - audpp->codec_max_instances = max_instance; - MM_DBG("different codec running\n"); - } else { - max_instance = (dec_instance_list + audpp->op_mode * - MSM_MAX_DEC_CNT + - codec_type)-> - max_instances_same_dec; - /* if same codec type, should not cross maximum supported */ - if (audpp->decoder_count > max_instance) { - MM_ERR("Can not support, already reached max\n"); - audpp->decoder_count--; - audpp->codec_cnt[codec_type]--; - goto done; - } - audpp->codec_max_instances = max_instance; - MM_DBG("same codec running\n"); - } - - /* Point to Last entry of the row */ - concurrency_entry = ((audpp->dec_database->dec_concurrency_table + - ((audpp->concurrency + 1) * - (audpp->dec_database->num_dec))) - 1); - - lidx = audpp->dec_database->num_dec; - min_codecs_supported = sizeof(unsigned int) * 8; - - MM_DBG("mode = 0x%08x codec = 0x%08x\n", mode, codec); - - for (idx = lidx; idx > 0; idx--, concurrency_entry--) { - if (!(audpp->dec_inuse & (1 << (idx - 1)))) { - if (((mode & *concurrency_entry) == mode) && - (codec & *concurrency_entry)) { - /* Check supports minimum number codecs */ - codecs_supported = - audpp->dec_database->dec_info_list[idx - - 1]. - nr_codec_support; - if (codecs_supported < min_codecs_supported) { - lidx = idx - 1; - min_codecs_supported = codecs_supported; - } - } - } - } - - if (lidx < audpp->dec_database->num_dec) { - audpp->dec_inuse |= (1 << lidx); - *module_name = - audpp->dec_database->dec_info_list[lidx].module_name; - *queueid = - audpp->dec_database->dec_info_list[lidx].module_queueid; - decid = audpp->dec_database->dec_info_list[lidx].module_decid; - audpp->dec_info_table[lidx].codec = - (dec_attrb & AUDPP_CODEC_MASK); - audpp->dec_info_table[lidx].pid = current->pid; - /* point to row to get supported operation */ - concurrency_entry = - ((audpp->dec_database->dec_concurrency_table + - ((audpp->concurrency) * (audpp->dec_database->num_dec))) + - lidx); - decid |= ((*concurrency_entry & AUDPP_OP_MASK) >> 12); - MM_INFO("decid =0x%08x module_name=%s, queueid=%d \n", decid, - *module_name, *queueid); - } -done: - mutex_unlock(audpp->lock_dec); - return decid; - -} -EXPORT_SYMBOL(audpp_adec_alloc); - -void audpp_adec_free(int decid) -{ - struct audpp_state *audpp = &the_audpp_state; - int idx; - mutex_lock(audpp->lock_dec); - for (idx = audpp->dec_database->num_dec; idx > 0; idx--) { - if (audpp->dec_database->dec_info_list[idx - 1].module_decid == - decid) { - audpp->decoder_count--; - audpp->\ - codec_cnt[audpp->dec_info_table[idx - 1].codec]--; - audpp->dec_inuse &= ~(1 << (idx - 1)); - audpp->dec_info_table[idx - 1].codec = -1; - audpp->dec_info_table[idx - 1].pid = 0; - MM_INFO("free decid =%d \n", decid); - break; - } - } - mutex_unlock(audpp->lock_dec); - return; - -} -EXPORT_SYMBOL(audpp_adec_free); - -static ssize_t concurrency_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct audpp_state *audpp = &the_audpp_state; - int rc; - mutex_lock(audpp->lock_dec); - rc = sprintf(buf, "%ld\n", audpp->concurrency); - mutex_unlock(audpp->lock_dec); - return rc; -} - -static ssize_t concurrency_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct audpp_state *audpp = &the_audpp_state; - unsigned long concurrency; - int rc = -1; - mutex_lock(audpp->lock_dec); - if (audpp->dec_inuse) { - MM_ERR("Can not change profile, while playback in progress\n"); - goto done; - } - rc = strict_strtoul(buf, 10, &concurrency); - if (!rc && - (concurrency < audpp->dec_database->num_concurrency_support)) { - audpp->concurrency = concurrency; - MM_DBG("Concurrency case %ld\n", audpp->concurrency); - rc = count; - } else { - MM_ERR("Not a valid Concurrency case\n"); - rc = -EINVAL; - } -done: - mutex_unlock(audpp->lock_dec); - return rc; -} - -static ssize_t decoder_info_show(struct device *dev, - struct device_attribute *attr, char *buf); -static struct device_attribute dev_attr_decoder[AUDPP_MAX_DECODER_CNT] = { - __ATTR(decoder0, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder1, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder2, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder3, S_IRUGO, decoder_info_show, NULL), - __ATTR(decoder4, S_IRUGO, decoder_info_show, NULL), -}; - -static ssize_t decoder_info_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int cpy_sz = 0; - struct audpp_state *audpp = &the_audpp_state; - const ptrdiff_t off = attr - dev_attr_decoder; /* decoder number */ - mutex_lock(audpp->lock_dec); - cpy_sz += scnprintf(buf + cpy_sz, PAGE_SIZE - cpy_sz, "%d:", - audpp->dec_info_table[off].codec); - cpy_sz += scnprintf(buf + cpy_sz, PAGE_SIZE - cpy_sz, "%d\n", - audpp->dec_info_table[off].pid); - mutex_unlock(audpp->lock_dec); - return cpy_sz; -} - -static DEVICE_ATTR(concurrency, S_IWUSR | S_IRUGO, concurrency_show, - concurrency_store); -static int audpp_probe(struct platform_device *pdev) -{ - int rc, idx; - struct audpp_state *audpp = &the_audpp_state; - audpp->concurrency = AUDPP_CONCURRENCY_DEFAULT; - audpp->dec_database = - (struct msm_adspdec_database *)pdev->dev.platform_data; - - MM_INFO("Number of decoder supported %d\n", - audpp->dec_database->num_dec); - MM_INFO("Number of concurrency supported %d\n", - audpp->dec_database->num_concurrency_support); - init_waitqueue_head(&audpp->event_wait); - for (idx = 0; idx < audpp->dec_database->num_dec; idx++) { - audpp->dec_info_table[idx].codec = -1; - audpp->dec_info_table[idx].pid = 0; - MM_INFO("module_name:%s\n", - audpp->dec_database->dec_info_list[idx].module_name); - MM_INFO("queueid:%d\n", - audpp->dec_database->dec_info_list[idx].module_queueid); - MM_INFO("decid:%d\n", - audpp->dec_database->dec_info_list[idx].module_decid); - MM_INFO("nr_codec_support:%d\n", - audpp->dec_database->dec_info_list[idx]. - nr_codec_support); - } - - wake_lock_init(&audpp_wake_lock, WAKE_LOCK_SUSPEND, "audpp"); - for (idx = 0; idx < audpp->dec_database->num_dec; idx++) { - rc = device_create_file(&pdev->dev, &dev_attr_decoder[idx]); - if (rc) - goto err; - } - rc = device_create_file(&pdev->dev, &dev_attr_concurrency); - audpp->op_mode = 0; /* Consider as non turbo mode */ - if (rc) - goto err; - else - goto done; -err: - while (idx--) - device_remove_file(&pdev->dev, &dev_attr_decoder[idx]); -done: - return rc; -} - -static struct platform_driver audpp_plat_driver = { - .probe = audpp_probe, - .driver = { - .name = "msm_adspdec", - .owner = THIS_MODULE, - }, -}; - -static int __init audpp_init(void) -{ - return platform_driver_register(&audpp_plat_driver); -} - -device_initcall(audpp_init); diff --git a/arch/arm/mach-msm/qdsp5v2/audpreproc.c b/arch/arm/mach-msm/qdsp5v2/audpreproc.c deleted file mode 100644 index 28eead08e819..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/audpreproc.c +++ /dev/null @@ -1,527 +0,0 @@ -/* - * Common code to deal with the AUDPREPROC dsp task (audio preprocessing) - * - * Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * Based on the audpp layer in arch/arm/mach-msm/qdsp5/audpp.c - * - * Copyright (C) 2008 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -static DEFINE_MUTEX(audpreproc_lock); -static struct wake_lock audpre_wake_lock; -static struct pm_qos_request audpre_pm_qos_req; - -struct msm_adspenc_info { - const char *module_name; - unsigned module_queueids; - int module_encid; /* streamid */ - int enc_formats; /* supported formats */ - int nr_codec_support; /* number of codec suported */ -}; - -#define ENC_MODULE_INFO(name, queueids, encid, formats, nr_codec) \ - {.module_name = name, .module_queueids = queueids, \ - .module_encid = encid, .enc_formats = formats, \ - .nr_codec_support = nr_codec } - -#define MAX_EVENT_CALLBACK_CLIENTS 1 - -#define ENC0_FORMAT ((1<func[cfg_done_msg.stream_id]) - audpreproc->func[cfg_done_msg.stream_id]( - audpreproc->private[cfg_done_msg.stream_id], id, - &cfg_done_msg); - break; - } - case AUDPREPROC_ERROR_MSG: { - struct audpreproc_err_msg err_msg; - - getevent(&err_msg, AUDPREPROC_ERROR_MSG_LEN); - MM_DBG("AUDPREPROC_ERROR_MSG: stream id %d err idx %d\n", - err_msg.stream_id, err_msg.aud_preproc_err_idx); - if ((err_msg.stream_id < MAX_ENC_COUNT) && - audpreproc->func[err_msg.stream_id]) - audpreproc->func[err_msg.stream_id]( - audpreproc->private[err_msg.stream_id], id, - &err_msg); - break; - } - case AUDPREPROC_CMD_ENC_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_cfg_done_msg enc_cfg_msg; - - getevent(&enc_cfg_msg, AUDPREPROC_CMD_ENC_CFG_DONE_MSG_LEN); - MM_DBG("AUDPREPROC_CMD_ENC_CFG_DONE_MSG: stream id %d enc type \ - %d\n", enc_cfg_msg.stream_id, enc_cfg_msg.rec_enc_type); - if ((enc_cfg_msg.stream_id < MAX_ENC_COUNT) && - audpreproc->func[enc_cfg_msg.stream_id]) - audpreproc->func[enc_cfg_msg.stream_id]( - audpreproc->private[enc_cfg_msg.stream_id], id, - &enc_cfg_msg); - for (n = 0; n < MAX_EVENT_CALLBACK_CLIENTS; ++n) { - if (audpreproc->cb_tbl[n] && - audpreproc->cb_tbl[n]->fn) { - audpreproc->cb_tbl[n]->fn( \ - audpreproc->cb_tbl[n]->private, \ - id, (void *) &enc_cfg_msg); - } - } - break; - } - case AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: { - struct audpreproc_cmd_enc_param_cfg_done_msg enc_param_msg; - - getevent(&enc_param_msg, - AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG_LEN); - MM_DBG("AUDPREPROC_CMD_ENC_PARAM_CFG_DONE_MSG: stream id %d\n", - enc_param_msg.stream_id); - if ((enc_param_msg.stream_id < MAX_ENC_COUNT) && - audpreproc->func[enc_param_msg.stream_id]) - audpreproc->func[enc_param_msg.stream_id]( - audpreproc->private[enc_param_msg.stream_id], id, - &enc_param_msg); - break; - } - case AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: { - struct audpreproc_afe_cmd_audio_record_cfg_done - record_cfg_done; - getevent(&record_cfg_done, - AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG_LEN); - MM_DBG("AUDPREPROC_AFE_CMD_AUDIO_RECORD_CFG_DONE_MSG: \ - stream id %d\n", record_cfg_done.stream_id); - if ((record_cfg_done.stream_id < MAX_ENC_COUNT) && - audpreproc->func[record_cfg_done.stream_id]) - audpreproc->func[record_cfg_done.stream_id]( - audpreproc->private[record_cfg_done.stream_id], id, - &record_cfg_done); - break; - } - case AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG: { - struct audpreproc_cmd_routing_mode_done routing_mode_done; - - getevent(&routing_mode_done, - AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG_LEN); - MM_DBG("AUDPREPROC_CMD_ROUTING_MODE_DONE_MSG: \ - stream id %d\n", routing_mode_done.stream_id); - if ((routing_mode_done.stream_id < MAX_ENC_COUNT) && - audpreproc->func[routing_mode_done.stream_id]) - audpreproc->func[routing_mode_done.stream_id]( - audpreproc->private[routing_mode_done.stream_id], id, - &routing_mode_done); - break; - } -#ifdef CONFIG_DEBUG_FS - case AUDPREPROC_MSG_FEAT_QUERY_DM_DONE: - { - uint16_t msg[3]; - getevent(msg, sizeof(msg)); - MM_INFO("RTC ACK --> %x %x %x\n", msg[0], msg[1], msg[2]); - acdb_rtc_set_err(msg[2]); - } - break; -#endif - case ADSP_MESSAGE_ID: { - MM_DBG("Received ADSP event:module audpreproctask\n"); - break; - } - default: - MM_ERR("Unknown Event %d\n", id); - } - return; -} - -static struct msm_adsp_ops adsp_ops = { - .event = audpreproc_dsp_event, -}; - -/* EXPORTED API's */ -int audpreproc_enable(int enc_id, audpreproc_event_func func, void *private) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int res = 0; - - if (enc_id < 0 || enc_id > (MAX_ENC_COUNT - 1)) - return -EINVAL; - - mutex_lock(audpreproc->lock); - if (audpreproc->func[enc_id]) { - res = -EBUSY; - goto out; - } - - audpreproc->func[enc_id] = func; - audpreproc->private[enc_id] = private; - - /* First client to enable preproc task */ - if (audpreproc->open_count++ == 0) { - MM_DBG("Get AUDPREPROCTASK\n"); - res = msm_adsp_get("AUDPREPROCTASK", &audpreproc->mod, - &adsp_ops, audpreproc); - if (res < 0) { - MM_ERR("Can not get AUDPREPROCTASK\n"); - audpreproc->open_count = 0; - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - goto out; - } - prevent_suspend(); - if (msm_adsp_enable(audpreproc->mod)) { - MM_ERR("Can not enable AUDPREPROCTASK\n"); - audpreproc->open_count = 0; - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - msm_adsp_put(audpreproc->mod); - audpreproc->mod = NULL; - res = -ENODEV; - allow_suspend(); - goto out; - } - } - res = 0; -out: - mutex_unlock(audpreproc->lock); - return res; -} -EXPORT_SYMBOL(audpreproc_enable); - -int audpreproc_update_audrec_info( - struct audrec_session_info *audrec_session_info) -{ - if (!audrec_session_info) { - MM_ERR("error in audrec session info address\n"); - return -EINVAL; - } - if (audrec_session_info->session_id < MAX_ENC_COUNT) { - memcpy(&session_info[audrec_session_info->session_id], - audrec_session_info, - sizeof(struct audrec_session_info)); - return 0; - } - return -EINVAL; -} -EXPORT_SYMBOL(audpreproc_update_audrec_info); - -void audpreproc_disable(int enc_id, void *private) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - - if (enc_id < 0 || enc_id > (MAX_ENC_COUNT - 1)) - return; - - mutex_lock(audpreproc->lock); - if (!audpreproc->func[enc_id]) - goto out; - if (audpreproc->private[enc_id] != private) - goto out; - - audpreproc->func[enc_id] = NULL; - audpreproc->private[enc_id] = NULL; - - /* Last client then disable preproc task */ - if (--audpreproc->open_count == 0) { - msm_adsp_disable(audpreproc->mod); - MM_DBG("Put AUDPREPROCTASK\n"); - msm_adsp_put(audpreproc->mod); - audpreproc->mod = NULL; - allow_suspend(); - } -out: - mutex_unlock(audpreproc->lock); - return; -} -EXPORT_SYMBOL(audpreproc_disable); - - -int audpreproc_register_event_callback(struct audpreproc_event_callback *ecb) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (NULL == audpreproc->cb_tbl[i]) { - audpreproc->cb_tbl[i] = ecb; - return 0; - } - } - return -1; -} -EXPORT_SYMBOL(audpreproc_register_event_callback); - -int audpreproc_unregister_event_callback(struct audpreproc_event_callback *ecb) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int i; - - for (i = 0; i < MAX_EVENT_CALLBACK_CLIENTS; ++i) { - if (ecb == audpreproc->cb_tbl[i]) { - audpreproc->cb_tbl[i] = NULL; - return 0; - } - } - return -1; -} -EXPORT_SYMBOL(audpreproc_unregister_event_callback); - - -/* enc_type = supported encode format * - * like pcm, aac, sbc, evrc, qcelp, amrnb etc ... * - */ -int audpreproc_aenc_alloc(unsigned enc_type, const char **module_name, - unsigned *queue_ids) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int encid = -1, idx, lidx, mode, codec; - int codecs_supported, min_codecs_supported; - static int wakelock_init; - - mutex_lock(audpreproc->lock); - /* Represents in bit mask */ - mode = ((enc_type & AUDPREPROC_MODE_MASK) << 16); - codec = (1 << (enc_type & AUDPREPROC_CODEC_MASK)); - - lidx = msm_enc_database.num_enc; - min_codecs_supported = sizeof(unsigned int) * 8; - MM_DBG("mode = 0x%08x codec = 0x%08x\n", mode, codec); - - for (idx = lidx-1; idx >= 0; idx--) { - /* encoder free and supports the format */ - if (!(audpreproc->enc_inuse & (1 << (idx))) && - ((mode & msm_enc_database.enc_info_list[idx].enc_formats) - == mode) && ((codec & - msm_enc_database.enc_info_list[idx].enc_formats) - == codec)){ - /* Check supports minimum number codecs */ - codecs_supported = - msm_enc_database.enc_info_list[idx].nr_codec_support; - if (codecs_supported < min_codecs_supported) { - lidx = idx; - min_codecs_supported = codecs_supported; - } - } - } - - if (lidx < msm_enc_database.num_enc) { - audpreproc->enc_inuse |= (1 << lidx); - *module_name = - msm_enc_database.enc_info_list[lidx].module_name; - *queue_ids = - msm_enc_database.enc_info_list[lidx].module_queueids; - encid = msm_enc_database.enc_info_list[lidx].module_encid; - } - - if (!wakelock_init) { - wake_lock_init(&audpre_wake_lock, WAKE_LOCK_SUSPEND, "audpre"); - pm_qos_add_request(&audpre_pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - wakelock_init = 1; - } - - mutex_unlock(audpreproc->lock); - return encid; -} -EXPORT_SYMBOL(audpreproc_aenc_alloc); - -void audpreproc_aenc_free(int enc_id) -{ - struct audpreproc_state *audpreproc = &the_audpreproc_state; - int idx; - - mutex_lock(audpreproc->lock); - for (idx = 0; idx < msm_enc_database.num_enc; idx++) { - if (msm_enc_database.enc_info_list[idx].module_encid == - enc_id) { - audpreproc->enc_inuse &= ~(1 << idx); - break; - } - } - mutex_unlock(audpreproc->lock); - return; - -} -EXPORT_SYMBOL(audpreproc_aenc_free); - -int audpreproc_send_preproccmdqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, cmd, len); -} -EXPORT_SYMBOL(audpreproc_send_preproccmdqueue); - -int audpreproc_send_audreccmdqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcAudRecCmdQueue, cmd, len); -} -EXPORT_SYMBOL(audpreproc_send_audreccmdqueue); - -int audpreproc_send_audrec2cmdqueue(void *cmd, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudRec2CmdQueue, cmd, len); -} -EXPORT_SYMBOL(audpreproc_send_audrec2cmdqueue); - -int audpreproc_dsp_set_agc(struct audpreproc_cmd_cfg_agc_params *agc, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, agc, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_agc); - -int audpreproc_dsp_set_agc2(struct audpreproc_cmd_cfg_agc_params_2 *agc2, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, agc2, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_agc2); - -int audpreproc_dsp_set_ns(struct audpreproc_cmd_cfg_ns_params *ns, - unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, ns, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_ns); - -int audpreproc_dsp_set_iir( -struct audpreproc_cmd_cfg_iir_tuning_filter_params *iir, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, iir, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_iir); - -int audpreproc_dsp_set_gain_tx( - struct audpreproc_cmd_cfg_cal_gain *calib_gain_tx, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, calib_gain_tx, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_gain_tx); - -void get_audrec_session_info(int id, struct audrec_session_info *info) -{ - if (id >= MAX_ENC_COUNT) { - MM_ERR("invalid session id = %d\n", id); - return; - } - memcpy(info, &session_info[id], sizeof(struct audrec_session_info)); -} -EXPORT_SYMBOL(get_audrec_session_info); - -int audpreproc_dsp_set_lvnv( - struct audpreproc_cmd_cfg_lvnv_param *preproc_lvnv, unsigned len) -{ - return msm_adsp_write(the_audpreproc_state.mod, - QDSP_uPAudPreProcCmdQueue, preproc_lvnv, len); -} -EXPORT_SYMBOL(audpreproc_dsp_set_lvnv); - diff --git a/arch/arm/mach-msm/qdsp5v2/aux_pcm.c b/arch/arm/mach-msm/qdsp5v2/aux_pcm.c deleted file mode 100644 index 06318bc7f78a..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/aux_pcm.c +++ /dev/null @@ -1,280 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/*---------------------------------------------------------------------------- - * Preprocessor Definitions and Constants - * -------------------------------------------------------------------------*/ - -/* define offset of registers here, may put them into platform data */ -#define AUX_CODEC_CTL_OFFSET 0x00 -#define PCM_PATH_CTL_OFFSET 0x04 -#define AUX_CODEC_CTL_OUT_OFFSET 0x08 - -/* define some bit values in PCM_PATH_CTL register */ -#define PCM_PATH_CTL__ADSP_CTL_EN_BMSK 0x8 - -/* mask and shift */ -#define AUX_CODEC_CTL_ADSP_CODEC_CTL_EN_BMSK 0x800 -#define AUX_CODEC_CTL_PCM_SYNC_LONG_BMSK 0x400 -#define AUX_CODEC_CTL_PCM_SYNC_SHORT_BMSK 0x200 -#define AUX_CODEC_CTL_I2S_SAMPLE_CLK_SRC_BMSK 0x80 -#define AUX_CODEC_CTL_I2S_SAMPLE_CLK_MODE_BMSK 0x40 -#define AUX_CODEC_CTL_I2S_RX_MODE_BMSK 0x20 -#define AUX_CODEC_CTL_I2S_CLK_MODE_BMSK 0x10 -#define AUX_CODEC_CTL_AUX_PCM_MODE_BMSK 0x0b -#define AUX_CODEC_CTL_AUX_CODEC_MODE_BMSK 0x02 - -/* AUX PCM MODE */ -#define MASTER_PRIM_PCM_SHORT 0 -#define MASTER_AUX_PCM_LONG 1 -#define SLAVE_PRIM_PCM_SHORT 2 - -struct aux_pcm_state { - void __iomem *aux_pcm_base; /* configure aux pcm through Scorpion */ - int dout; - int din; - int syncout; - int clkin_a; -}; - -static struct aux_pcm_state the_aux_pcm_state; - -static void __iomem *get_base_addr(struct aux_pcm_state *aux_pcm) -{ - return aux_pcm->aux_pcm_base; -} - -/* Set who control aux pcm : adsp or MSM */ -void aux_codec_adsp_codec_ctl_en(bool msm_adsp_en) -{ - void __iomem *baddr = get_base_addr(&the_aux_pcm_state); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + AUX_CODEC_CTL_OFFSET); - if (msm_adsp_en) { /* adsp */ - writel( - ((val & ~AUX_CODEC_CTL_ADSP_CODEC_CTL_EN_BMSK) | - AUX_CODEC_CTL__ADSP_CODEC_CTL_EN__ADSP_V), - baddr + AUX_CODEC_CTL_OFFSET); - } else { /* MSM */ - writel( - ((val & ~AUX_CODEC_CTL_ADSP_CODEC_CTL_EN_BMSK) | - AUX_CODEC_CTL__ADSP_CODEC_CTL_EN__MSM_V), - baddr + AUX_CODEC_CTL_OFFSET); - } - } - mb(); -} - -/* Set who control aux pcm path: adsp or MSM */ -void aux_codec_pcm_path_ctl_en(bool msm_adsp_en) -{ - void __iomem *baddr = get_base_addr(&the_aux_pcm_state); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + PCM_PATH_CTL_OFFSET); - if (msm_adsp_en) { /* adsp */ - writel( - ((val & ~PCM_PATH_CTL__ADSP_CTL_EN_BMSK) | - PCM_PATH_CTL__ADSP_CTL_EN__ADSP_V), - baddr + PCM_PATH_CTL_OFFSET); - } else { /* MSM */ - writel( - ((val & ~PCM_PATH_CTL__ADSP_CTL_EN_BMSK) | - PCM_PATH_CTL__ADSP_CTL_EN__MSM_V), - baddr + PCM_PATH_CTL_OFFSET); - } - } - mb(); - return; -} -EXPORT_SYMBOL(aux_codec_pcm_path_ctl_en); - -int aux_pcm_gpios_request(void) -{ - int rc = 0; - - MM_DBG("aux_pcm_gpios_request\n"); - rc = gpio_request(the_aux_pcm_state.dout, "AUX PCM DOUT"); - if (rc) { - MM_ERR("GPIO request for AUX PCM DOUT failed\n"); - return rc; - } - - rc = gpio_request(the_aux_pcm_state.din, "AUX PCM DIN"); - if (rc) { - MM_ERR("GPIO request for AUX PCM DIN failed\n"); - gpio_free(the_aux_pcm_state.dout); - return rc; - } - - rc = gpio_request(the_aux_pcm_state.syncout, "AUX PCM SYNC OUT"); - if (rc) { - MM_ERR("GPIO request for AUX PCM SYNC OUT failed\n"); - gpio_free(the_aux_pcm_state.dout); - gpio_free(the_aux_pcm_state.din); - return rc; - } - - rc = gpio_request(the_aux_pcm_state.clkin_a, "AUX PCM CLKIN A"); - if (rc) { - MM_ERR("GPIO request for AUX PCM CLKIN A failed\n"); - gpio_free(the_aux_pcm_state.dout); - gpio_free(the_aux_pcm_state.din); - gpio_free(the_aux_pcm_state.syncout); - return rc; - } - - return rc; -} -EXPORT_SYMBOL(aux_pcm_gpios_request); - - -void aux_pcm_gpios_free(void) -{ - MM_DBG(" aux_pcm_gpios_free \n"); - - /* - * Feed silence frames before close to prevent buzzing sound in BT at - * call end. This fix is applicable only to Marimba BT. - */ - gpio_tlmm_config(GPIO_CFG(the_aux_pcm_state.dout, 0, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); - gpio_set_value(the_aux_pcm_state.dout, 0); - msleep(20); - gpio_tlmm_config(GPIO_CFG(the_aux_pcm_state.dout, 1, GPIO_CFG_OUTPUT, - GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); - - gpio_free(the_aux_pcm_state.dout); - gpio_free(the_aux_pcm_state.din); - gpio_free(the_aux_pcm_state.syncout); - gpio_free(the_aux_pcm_state.clkin_a); -} -EXPORT_SYMBOL(aux_pcm_gpios_free); - - -static int get_aux_pcm_gpios(struct platform_device *pdev) -{ - int rc = 0; - struct resource *res; - - /* Claim all of the GPIOs. */ - res = platform_get_resource_byname(pdev, IORESOURCE_IO, - "aux_pcm_dout"); - if (!res) { - MM_ERR("%s: failed to get gpio AUX PCM DOUT\n", __func__); - return -ENODEV; - } - - the_aux_pcm_state.dout = res->start; - - res = platform_get_resource_byname(pdev, IORESOURCE_IO, - "aux_pcm_din"); - if (!res) { - MM_ERR("%s: failed to get gpio AUX PCM DIN\n", __func__); - return -ENODEV; - } - - the_aux_pcm_state.din = res->start; - - res = platform_get_resource_byname(pdev, IORESOURCE_IO, - "aux_pcm_syncout"); - if (!res) { - MM_ERR("%s: failed to get gpio AUX PCM SYNC OUT\n", __func__); - return -ENODEV; - } - - the_aux_pcm_state.syncout = res->start; - - res = platform_get_resource_byname(pdev, IORESOURCE_IO, - "aux_pcm_clkin_a"); - if (!res) { - MM_ERR("%s: failed to get gpio AUX PCM CLKIN A\n", __func__); - return -ENODEV; - } - - the_aux_pcm_state.clkin_a = res->start; - - return rc; -} -static int aux_pcm_probe(struct platform_device *pdev) -{ - int rc = 0; - struct resource *mem_src; - - MM_DBG("aux_pcm_probe \n"); - mem_src = platform_get_resource_byname(pdev, IORESOURCE_MEM, - "aux_codec_reg_addr"); - if (!mem_src) { - rc = -ENODEV; - goto done; - } - - the_aux_pcm_state.aux_pcm_base = ioremap(mem_src->start, - (mem_src->end - mem_src->start) + 1); - if (!the_aux_pcm_state.aux_pcm_base) { - rc = -ENOMEM; - goto done; - } - rc = get_aux_pcm_gpios(pdev); - if (rc) { - MM_ERR("GPIO configuration failed\n"); - rc = -ENODEV; - } - -done: return rc; - -} - -static int aux_pcm_remove(struct platform_device *pdev) -{ - iounmap(the_aux_pcm_state.aux_pcm_base); - return 0; -} - -static struct platform_driver aux_pcm_driver = { - .probe = aux_pcm_probe, - .remove = aux_pcm_remove, - .driver = { - .name = "msm_aux_pcm", - .owner = THIS_MODULE, - }, -}; - -static int __init aux_pcm_init(void) -{ - - return platform_driver_register(&aux_pcm_driver); -} - -static void __exit aux_pcm_exit(void) -{ - platform_driver_unregister(&aux_pcm_driver); -} - -module_init(aux_pcm_init); -module_exit(aux_pcm_exit); - -MODULE_DESCRIPTION("MSM AUX PCM driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/lpa.c b/arch/arm/mach-msm/qdsp5v2/lpa.c deleted file mode 100644 index 5ffda8ad700d..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/lpa.c +++ /dev/null @@ -1,608 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define LPA_REG_WRITEL(drv, val, reg) writel(val, drv->baseaddr + reg) -#define LPA_REG_READL(drv, reg) readl(drv->baseaddr + reg) - -/* bit 2:0 is reserved because watermarks have to be 64-bit aligned */ -#define LLB_WATERMARK_VAL_MASK 0x00000003 - -#define LPA_STATUS_SBUF_EN 0x01 - -struct lpa_drv { - void __iomem *baseaddr; - u32 obuf_hlb_size; - u32 dsp_proc_id; - u32 app_proc_id; - struct lpa_mem_config nosb_config; - struct lpa_mem_config sb_config; - u32 status; - u32 watermark_bytes; - u32 watermark_aheadtime; - u32 sample_boundary; -}; - -struct lpa_state { - struct lpa_drv lpa_drv; /* One instance for now */ - u32 assigned; - struct mutex lpa_lock; -}; - -struct lpa_state the_lpa_state; - -static void lpa_enable_codec(struct lpa_drv *lpa, bool enable) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_CODEC); - val = enable ? (val | LPA_OBUF_CODEC_CODEC_INTF_EN_BMSK) : - (val & ~LPA_OBUF_CODEC_CODEC_INTF_EN_BMSK); - val |= LPA_OBUF_CODEC_LOAD_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CODEC); - mb(); -} - -static void lpa_reset(struct lpa_drv *lpa) -{ - u32 status; - struct clk *adsp_clk; - /* Need to make sure not disable clock while other device is enabled */ - adsp_clk = clk_get(NULL, "adsp_clk"); - if (!adsp_clk) { - MM_ERR("failed to get adsp clk\n"); - goto error; - } - clk_prepare_enable(adsp_clk); - lpa_enable_codec(lpa, 0); - LPA_REG_WRITEL(lpa, (LPA_OBUF_RESETS_MISR_RESET | - LPA_OBUF_RESETS_OVERALL_RESET), LPA_OBUF_RESETS); - do { - status = LPA_REG_READL(lpa, LPA_OBUF_STATUS); - } while (!(status & LPA_OBUF_STATUS_RESET_DONE)); - - LPA_REG_WRITEL(lpa, LPA_OBUF_ACK_RESET_DONE_BMSK, LPA_OBUF_ACK); - mb(); - clk_disable_unprepare(adsp_clk); - clk_put(adsp_clk); -error: - return; -} - -static void lpa_config_hlb_addr(struct lpa_drv *lpa) -{ - u32 val, min_addr = 0, max_addr = min_addr + lpa->obuf_hlb_size; - - val = (min_addr & LPA_OBUF_HLB_MIN_ADDR_SEG_BMSK) | - LPA_OBUF_HLB_MIN_ADDR_LOAD_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_HLB_MIN_ADDR); - val = max_addr & LPA_OBUF_HLB_MAX_ADDR_SEG_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_HLB_MAX_ADDR); -} - -static void lpa_powerup_mem_bank(struct lpa_drv *lpa, - struct lpa_mem_bank_select *bank) -{ - u32 status, val; - - status = LPA_REG_READL(lpa, LPA_OBUF_MEMORY_CONTROL); - val = ((*((u32 *) bank)) << LPA_OBUF_MEM_CTL_PWRUP_SHFT) & - LPA_OBUF_MEM_CTL_PWRUP_BMSK; - val |= status; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_MEMORY_CONTROL); -} - -static void lpa_enable_interrupt(struct lpa_drv *lpa, u32 proc_id) -{ - u32 val; - - proc_id &= LPA_OBUF_INTR_EN_BMSK; - val = 0x1 << proc_id; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_INTR_ENABLE); -} - -static void lpa_config_llb_addr(struct lpa_drv *lpa, u32 min_addr, u32 max_addr) -{ - u32 val; - - val = (min_addr & LPA_OBUF_LLB_MIN_ADDR_SEG_BMSK) | - LPA_OBUF_LLB_MIN_ADDR_LOAD_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_LLB_MIN_ADDR); - val = max_addr & LPA_OBUF_LLB_MAX_ADDR_SEG_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_LLB_MAX_ADDR); -} - -static void lpa_config_sb_addr(struct lpa_drv *lpa, u32 min_addr, u32 max_addr) -{ - u32 val; - - val = (min_addr & LPA_OBUF_SB_MIN_ADDR_SEG_BMSK) | - LPA_OBUF_SB_MIN_ADDR_LOAD_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_SB_MIN_ADDR); - val = max_addr & LPA_OBUF_SB_MAX_ADDR_SEG_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_SB_MAX_ADDR); -} - -static void lpa_switch_sb(struct lpa_drv *lpa) -{ - if (lpa->status & LPA_STATUS_SBUF_EN) { - lpa_config_llb_addr(lpa, lpa->sb_config.llb_min_addr, - lpa->sb_config.llb_max_addr); - lpa_config_sb_addr(lpa, lpa->sb_config.sb_min_addr, - lpa->sb_config.sb_max_addr); - } else { - lpa_config_llb_addr(lpa, lpa->nosb_config.llb_min_addr, - lpa->nosb_config.llb_max_addr); - lpa_config_sb_addr(lpa, lpa->nosb_config.sb_min_addr, - lpa->nosb_config.sb_max_addr); - } -} - -static u8 lpa_req_wmark_id(struct lpa_drv *lpa) -{ - return (u8) (LPA_REG_READL(lpa, LPA_OBUF_WMARK_ASSIGN) & - LPA_OBUF_WMARK_ASSIGN_BMSK); -} - -static void lpa_enable_llb_wmark(struct lpa_drv *lpa, u32 wmark_ctrl, - u32 wmark_id, u32 cpu_id) -{ - u32 val; - - wmark_id = (wmark_id > 3) ? 0 : wmark_id; - val = LPA_REG_READL(lpa, LPA_OBUF_WMARK_n_LLB_ADDR(wmark_id)); - val &= ~LPA_OBUF_LLB_WMARK_CTRL_BMSK; - val &= ~LPA_OBUF_LLB_WMARK_MAP_BMSK; - val |= (wmark_ctrl << LPA_OBUF_LLB_WMARK_CTRL_SHFT) & - LPA_OBUF_LLB_WMARK_CTRL_BMSK; - val |= (cpu_id << LPA_OBUF_LLB_WMARK_MAP_SHFT) & - LPA_OBUF_LLB_WMARK_MAP_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_WMARK_n_LLB_ADDR(wmark_id)); -} - -static void lpa_enable_sb_wmark(struct lpa_drv *lpa, u32 wmark_ctrl, - u32 cpu_id) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_WMARK_SB); - val &= ~LPA_OBUF_SB_WMARK_CTRL_BMSK; - val &= ~LPA_OBUF_SB_WMARK_MAP_BMSK; - val |= (wmark_ctrl << LPA_OBUF_SB_WMARK_CTRL_SHFT) & - LPA_OBUF_SB_WMARK_CTRL_BMSK; - val |= (cpu_id << LPA_OBUF_SB_WMARK_MAP_SHFT) & - LPA_OBUF_SB_WMARK_MAP_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_WMARK_SB); -} -static void lpa_enable_hlb_wmark(struct lpa_drv *lpa, u32 wmark_ctrl, - u32 cpu_id) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_WMARK_HLB); - val &= ~LPA_OBUF_HLB_WMARK_CTRL_BMSK; - val &= ~LPA_OBUF_HLB_WMARK_MAP_BMSK; - val |= (wmark_ctrl << LPA_OBUF_HLB_WMARK_CTRL_SHFT) & - LPA_OBUF_HLB_WMARK_CTRL_BMSK; - val |= (cpu_id << LPA_OBUF_HLB_WMARK_MAP_SHFT) & - LPA_OBUF_HLB_WMARK_MAP_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_WMARK_HLB); -} - -static void lpa_enable_utc(struct lpa_drv *lpa, bool enable, u32 cpu_id) -{ - u32 val; - - val = (cpu_id << LPA_OBUF_UTC_CONFIG_MAP_SHFT) & - LPA_OBUF_UTC_CONFIG_MAP_BMSK; - enable = (enable ? 1 : 0); - val = (enable << LPA_OBUF_UTC_CONFIG_EN_SHFT) & - LPA_OBUF_UTC_CONFIG_EN_BMSK; - LPA_REG_WRITEL(lpa, val, LPA_OBUF_UTC_CONFIG); -} - -static void lpa_enable_mixing(struct lpa_drv *lpa, bool enable) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_CONTROL); - val = (enable ? val | LPA_OBUF_CONTROL_LLB_EN_BMSK : - val & ~LPA_OBUF_CONTROL_LLB_EN_BMSK); - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CONTROL); -} - -static void lpa_enable_mixer_saturation(struct lpa_drv *lpa, u32 buf_id, - bool enable) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_CONTROL); - - switch (buf_id) { - case LPA_BUF_ID_LLB: - val = enable ? (val | LPA_OBUF_CONTROL_LLB_SAT_EN_BMSK) : - (val & ~LPA_OBUF_CONTROL_LLB_SAT_EN_BMSK); - break; - - case LPA_BUF_ID_SB: - val = enable ? (val | LPA_OBUF_CONTROL_SB_SAT_EN_BMSK) : - (val & ~LPA_OBUF_CONTROL_SB_SAT_EN_BMSK); - break; - } - - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CONTROL); -} - -static void lpa_enable_obuf(struct lpa_drv *lpa, u32 buf_id, bool enable) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_CONTROL); - - switch (buf_id) { - case LPA_BUF_ID_HLB: - val = enable ? (val | LPA_OBUF_CONTROL_HLB_EN_BMSK) : - (val & ~LPA_OBUF_CONTROL_HLB_EN_BMSK); - break; - - case LPA_BUF_ID_LLB: - val = enable ? (val | LPA_OBUF_CONTROL_LLB_EN_BMSK) : - (val & ~LPA_OBUF_CONTROL_LLB_EN_BMSK); - break; - - case LPA_BUF_ID_SB: - val = enable ? (val | LPA_OBUF_CONTROL_SB_EN_BMSK) : - (val & ~LPA_OBUF_CONTROL_SB_EN_BMSK); - break; - } - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CONTROL); -} - -struct lpa_drv *lpa_get(void) -{ - struct lpa_mem_bank_select mem_bank; - struct lpa_drv *ret_lpa = &the_lpa_state.lpa_drv; - - mutex_lock(&the_lpa_state.lpa_lock); - if (the_lpa_state.assigned) { - MM_ERR("LPA HW accupied\n"); - ret_lpa = ERR_PTR(-EBUSY); - goto error; - } - /* perform initialization */ - lpa_reset(ret_lpa); - /* Config adec param */ - /* Initialize LLB/SB min/max address */ - lpa_switch_sb(ret_lpa); - /* Config HLB minx/max address */ - lpa_config_hlb_addr(ret_lpa); - - /* Power up all memory bank for now */ - mem_bank.b0 = 1; - mem_bank.b1 = 1; - mem_bank.b2 = 1; - mem_bank.b3 = 1; - mem_bank.b4 = 1; - mem_bank.b5 = 1; - mem_bank.b6 = 1; - mem_bank.b7 = 1; - mem_bank.b8 = 1; - mem_bank.b9 = 1; - mem_bank.b10 = 1; - mem_bank.llb = 1; - lpa_powerup_mem_bank(ret_lpa, &mem_bank); - - while - (lpa_req_wmark_id(ret_lpa) != LPA_OBUF_WMARK_ASSIGN_DONE); - - lpa_enable_llb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, 0, - ret_lpa->dsp_proc_id); - lpa_enable_llb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, 1, - ret_lpa->dsp_proc_id); - lpa_enable_llb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, 2, - ret_lpa->app_proc_id); - lpa_enable_llb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, 3, - ret_lpa->app_proc_id); - lpa_enable_hlb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, - ret_lpa->dsp_proc_id); - lpa_enable_sb_wmark(ret_lpa, LPA_WMARK_CTL_DISABLED, - ret_lpa->dsp_proc_id); - lpa_enable_utc(ret_lpa, 0, LPA_OBUF_UTC_CONFIG_NO_INTR); - - lpa_enable_mixing(ret_lpa, 1); - lpa_enable_mixer_saturation(ret_lpa, LPA_BUF_ID_LLB, 1); - - lpa_enable_obuf(ret_lpa, LPA_BUF_ID_HLB, 0); - lpa_enable_obuf(ret_lpa, LPA_BUF_ID_LLB, 1); - if (ret_lpa->status & LPA_STATUS_SBUF_EN) { - lpa_enable_mixer_saturation(ret_lpa, LPA_BUF_ID_SB, 1); - lpa_enable_obuf(ret_lpa, LPA_BUF_ID_SB, 1); - } - - lpa_enable_interrupt(ret_lpa, ret_lpa->dsp_proc_id); - mb(); - the_lpa_state.assigned++; -error: - mutex_unlock(&the_lpa_state.lpa_lock); - return ret_lpa; -} -EXPORT_SYMBOL(lpa_get); - -void lpa_put(struct lpa_drv *lpa) -{ - - mutex_lock(&the_lpa_state.lpa_lock); - if (!lpa || &the_lpa_state.lpa_drv != lpa) { - MM_ERR("invalid arg\n"); - goto error; - } - /* Deinitialize */ - the_lpa_state.assigned--; -error: - mutex_unlock(&the_lpa_state.lpa_lock); -} -EXPORT_SYMBOL(lpa_put); - -int lpa_cmd_codec_config(struct lpa_drv *lpa, - struct lpa_codec_config *config_ptr) -{ - u32 sample_rate; - u32 num_channels; - u32 width; - u32 val = 0; - - if (!lpa || !config_ptr) { - MM_ERR("invalid parameters\n"); - return -EINVAL; - } - - switch (config_ptr->num_channels) { - case 8: - num_channels = LPA_NUM_CHAN_7P1; - break; - case 6: - num_channels = LPA_NUM_CHAN_5P1; - break; - case 4: - num_channels = LPA_NUM_CHAN_4_CHANNEL; - break; - case 2: - num_channels = LPA_NUM_CHAN_STEREO; - break; - case 1: - num_channels = LPA_NUM_CHAN_MONO; - break; - default: - MM_ERR("unsupported number of channel\n"); - goto error; - } - val |= (num_channels << LPA_OBUF_CODEC_NUM_CHAN_SHFT) & - LPA_OBUF_CODEC_NUM_CHAN_BMSK; - - switch (config_ptr->sample_rate) { - case 96000: - sample_rate = LPA_SAMPLE_RATE_96KHZ; - break; - case 64000: - sample_rate = LPA_SAMPLE_RATE_64KHZ; - break; - case 48000: - sample_rate = LPA_SAMPLE_RATE_48KHZ; - break; - case 44100: - sample_rate = LPA_SAMPLE_RATE_44P1KHZ; - break; - case 32000: - sample_rate = LPA_SAMPLE_RATE_32KHZ; - break; - case 22050: - sample_rate = LPA_SAMPLE_RATE_22P05KHZ; - break; - case 16000: - sample_rate = LPA_SAMPLE_RATE_16KHZ; - break; - case 11025: - sample_rate = LPA_SAMPLE_RATE_11P025KHZ; - break; - case 8000: - sample_rate = LPA_SAMPLE_RATE_8KHZ; - break; - default: - MM_ERR("unsupported sample rate \n"); - goto error; - } - val |= (sample_rate << LPA_OBUF_CODEC_SAMP_SHFT) & - LPA_OBUF_CODEC_SAMP_BMSK; - switch (config_ptr->sample_width) { - case 32: - width = LPA_BITS_PER_CHAN_32BITS; - break; - case 24: - width = LPA_BITS_PER_CHAN_24BITS; - break; - case 16: - width = LPA_BITS_PER_CHAN_16BITS; - break; - default: - MM_ERR("unsupported sample width \n"); - goto error; - } - val |= (width << LPA_OBUF_CODEC_BITS_PER_CHAN_SHFT) & - LPA_OBUF_CODEC_BITS_PER_CHAN_BMSK; - - val |= LPA_OBUF_CODEC_LOAD_BMSK; - val |= (config_ptr->output_interface << LPA_OBUF_CODEC_INTF_SHFT) & - LPA_OBUF_CODEC_INTF_BMSK; - - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CODEC); - mb(); - - return 0; -error: - return -EINVAL; -} -EXPORT_SYMBOL(lpa_cmd_codec_config); - -static int lpa_check_llb_clear(struct lpa_drv *lpa) -{ - u32 val; - val = LPA_REG_READL(lpa, LPA_OBUF_STATUS); - - return !(val & LPA_OBUF_STATUS_LLB_CLR_BMSK); -} - -static void lpa_clear_llb(struct lpa_drv *lpa) -{ - u32 val; - - val = LPA_REG_READL(lpa, LPA_OBUF_CONTROL); - LPA_REG_WRITEL(lpa, (val | LPA_OBUF_CONTROL_LLB_CLR_CMD_BMSK), - LPA_OBUF_CONTROL); - lpa_enable_obuf(lpa, LPA_BUF_ID_LLB, 0); - - while (!lpa_check_llb_clear(lpa)) - udelay(100); - LPA_REG_WRITEL(lpa, val, LPA_OBUF_CONTROL); -} - -int lpa_cmd_enable_codec(struct lpa_drv *lpa, bool enable) -{ - u32 val; - struct lpa_mem_bank_select mem_bank; - - MM_DBG(" %s\n", (enable ? "enable" : "disable")); - - if (!lpa) - return -EINVAL; - - val = LPA_REG_READL(lpa, LPA_OBUF_CODEC); - - if (enable) { - if (val & LPA_OBUF_CODEC_CODEC_INTF_EN_BMSK) - return -EBUSY; - /* Power up all memory bank for now */ - mem_bank.b0 = 1; - mem_bank.b1 = 1; - mem_bank.b2 = 1; - mem_bank.b3 = 1; - mem_bank.b4 = 1; - mem_bank.b5 = 1; - mem_bank.b6 = 1; - mem_bank.b7 = 1; - mem_bank.b8 = 1; - mem_bank.b9 = 1; - mem_bank.b10 = 1; - mem_bank.llb = 1; - lpa_powerup_mem_bank(lpa, &mem_bank); - - /*clear LLB*/ - lpa_clear_llb(lpa); - - lpa_enable_codec(lpa, 1); - MM_DBG("LPA codec is enabled\n"); - } else { - if (val & LPA_OBUF_CODEC_CODEC_INTF_EN_BMSK) { - lpa_enable_codec(lpa, 0); - MM_DBG("LPA codec is disabled\n"); - } else - MM_ERR("LPA codec is already disable\n"); - } - mb(); - return 0; -} -EXPORT_SYMBOL(lpa_cmd_enable_codec); - -static int lpa_probe(struct platform_device *pdev) -{ - int rc = 0; - struct resource *mem_src; - struct msm_lpa_platform_data *pdata; - - MM_INFO("lpa probe\n"); - - if (!pdev || !pdev->dev.platform_data) { - MM_ERR("no plaform data\n"); - rc = -ENODEV; - goto error; - } - - mem_src = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpa"); - if (!mem_src) { - MM_ERR("LPA base address undefined\n"); - rc = -ENODEV; - goto error; - } - - pdata = pdev->dev.platform_data; - the_lpa_state.lpa_drv.baseaddr = ioremap(mem_src->start, - (mem_src->end - mem_src->start) + 1); - if (!the_lpa_state.lpa_drv.baseaddr) { - rc = -ENOMEM; - goto error; - } - - the_lpa_state.lpa_drv.obuf_hlb_size = pdata->obuf_hlb_size; - the_lpa_state.lpa_drv.dsp_proc_id = pdata->dsp_proc_id; - the_lpa_state.lpa_drv.app_proc_id = pdata->app_proc_id; - the_lpa_state.lpa_drv.nosb_config = pdata->nosb_config; - the_lpa_state.lpa_drv.sb_config = pdata->sb_config; - /* default to enable summing buffer */ - the_lpa_state.lpa_drv.status = LPA_STATUS_SBUF_EN; - -error: - return rc; - -} - -static int lpa_remove(struct platform_device *pdev) -{ - iounmap(the_lpa_state.lpa_drv.baseaddr); - return 0; -} - -static struct platform_driver lpa_driver = { - .probe = lpa_probe, - .remove = lpa_remove, - .driver = { - .name = "lpa", - .owner = THIS_MODULE, - }, -}; - -static int __init lpa_init(void) -{ - the_lpa_state.assigned = 0; - mutex_init(&the_lpa_state.lpa_lock); - return platform_driver_register(&lpa_driver); -} - -static void __exit lpa_exit(void) -{ - platform_driver_unregister(&lpa_driver); -} - -module_init(lpa_init); -module_exit(lpa_exit); - -MODULE_DESCRIPTION("MSM LPA driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/mi2s.c b/arch/arm/mach-msm/qdsp5v2/mi2s.c deleted file mode 100644 index b649ec144165..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/mi2s.c +++ /dev/null @@ -1,885 +0,0 @@ -/* Copyright (c) 2009,2011 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include -#include - -#define DEBUG -#ifdef DEBUG -#define dprintk(format, arg...) \ -printk(KERN_DEBUG format, ## arg) -#else -#define dprintk(format, arg...) do {} while (0) -#endif - -/*---------------------------------------------------------------------------- - * Preprocessor Definitions and Constants - * -------------------------------------------------------------------------*/ - -/* Device Types */ -#define HDMI 0 -#define CODEC_RX 1 -#define CODEC_TX 2 - -/* Static offset for now. If different target have different - * offset, update to platform data model - */ -#define MI2S_RESET_OFFSET 0x0 -#define MI2S_MODE_OFFSET 0x4 -#define MI2S_TX_MODE_OFFSET 0x8 -#define MI2S_RX_MODE_OFFSET 0xc - -#define MI2S_SD_N_EN_MASK 0xF0 -#define MI2S_TX_RX_N_MASK 0x0F - -#define MI2S_RESET__MI2S_RESET__RESET 0x1 -#define MI2S_RESET__MI2S_RESET__ACTIVE 0x0 -#define MI2S_MODE__MI2S_MASTER__MASTER 0x1 -#define MI2S_MODE__MI2S_MASTER__SLAVE 0x0 -#define MI2S_MODE__MI2S_TX_RX_WORD_TYPE__16_BIT 0x1 -#define MI2S_MODE__MI2S_TX_RX_WORD_TYPE__24_BIT 0x2 -#define MI2S_MODE__MI2S_TX_RX_WORD_TYPE__32_BIT 0x3 -#define MI2S_TX_MODE__MI2S_TX_CODEC_16_MONO_MODE__RAW 0x0 -#define MI2S_TX_MODE__MI2S_TX_CODEC_16_MONO_MODE__PACKED 0x1 -#define MI2S_TX_MODE__MI2S_TX_STEREO_MODE__MONO_SAMPLE 0x0 -#define MI2S_TX_MODE__MI2S_TX_STEREO_MODE__STEREO_SAMPLE 0x1 -#define MI2S_TX_MODE__MI2S_TX_CH_TYPE__2_CHANNEL 0x0 -#define MI2S_TX_MODE__MI2S_TX_CH_TYPE__4_CHANNEL 0x1 -#define MI2S_TX_MODE__MI2S_TX_CH_TYPE__6_CHANNEL 0x2 -#define MI2S_TX_MODE__MI2S_TX_CH_TYPE__8_CHANNEL 0x3 -#define MI2S_TX_MODE__MI2S_TX_DMA_ACK_SYNCH_EN__SYNC_ENABLE 0x1 -#define MI2S_RX_MODE__MI2S_RX_CODEC_16_MONO_MODE__RAW 0x0 -#define MI2S_RX_MODE__MI2S_RX_CODEC_16_MONO_MODE__PACKED 0x1 -#define MI2S_RX_MODE__MI2S_RX_STEREO_MODE__MONO_SAMPLE 0x0 -#define MI2S_RX_MODE__MI2S_RX_STEREO_MODE__STEREO_SAMPLE 0x1 -#define MI2S_RX_MODE__MI2S_RX_CH_TYPE__2_CH 0x0 -#define MI2S_RX_MODE__MI2S_RX_DMA_ACK_SYNCH_EN__SYNC_ENABLE 0x1 - -#define HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_BMSK 0x1000 -#define HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_SHFT 0xC -#define HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_BMSK 0x300 -#define HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_SHFT 0x8 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK 0x4 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT 0x2 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_BMSK 0x2 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_SHFT 0x1 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_BMSK 0x18 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_SHFT 0x3 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_4_0_CH_MAP_BMSK 0x80 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_4_0_CH_MAP_SHFT 0x7 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_2_0_CH_MAP_BMSK 0x60 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_2_0_CH_MAP_SHFT 0x5 -#define HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_DMA_ACK_SYNCH_EN_BMSK 0x1 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_I2S_LINE_BMSK 0x60 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_I2S_LINE_SHFT 0x5 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_BMSK 0x4 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_SHFT 0x2 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_BMSK 0x2 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_SHFT 0x1 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_BMSK 0x18 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_SHFT 0x3 -#define HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_DMA_ACK_SYNCH_EN_BMSK 0x1 - -/* Max number of channels */ -#define MAX_NUM_CHANNELS_OUT 8 -#define MAX_NUM_CHANNELS_IN 2 - -/* Num of SD Lines */ -#define MAX_SD_LINES 4 - -#define MI2S_SD_0_EN_MAP 0x10 -#define MI2S_SD_1_EN_MAP 0x20 -#define MI2S_SD_2_EN_MAP 0x40 -#define MI2S_SD_3_EN_MAP 0x80 -#define MI2S_SD_0_TX_MAP 0x01 -#define MI2S_SD_1_TX_MAP 0x02 -#define MI2S_SD_2_TX_MAP 0x04 -#define MI2S_SD_3_TX_MAP 0x08 - -struct mi2s_state { - void __iomem *mi2s_hdmi_base; - void __iomem *mi2s_rx_base; - void __iomem *mi2s_tx_base; - struct mutex mutex_lock; - -}; - -static struct mi2s_state the_mi2s_state; - -static void __iomem *get_base_addr(struct mi2s_state *mi2s, uint8_t dev_id) -{ - switch (dev_id) { - case HDMI: - return mi2s->mi2s_hdmi_base; - case CODEC_RX: - return mi2s->mi2s_rx_base; - case CODEC_TX: - return mi2s->mi2s_tx_base; - default: - break; - } - return ERR_PTR(-ENODEV); -} - -static void mi2s_reset(struct mi2s_state *mi2s, uint8_t dev_id) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - if (!IS_ERR(baddr)) - writel(MI2S_RESET__MI2S_RESET__RESET, - baddr + MI2S_RESET_OFFSET); -} - -static void mi2s_release(struct mi2s_state *mi2s, uint8_t dev_id) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - if (!IS_ERR(baddr)) - writel(MI2S_RESET__MI2S_RESET__ACTIVE, - baddr + MI2S_RESET_OFFSET); -} - -static void mi2s_master(struct mi2s_state *mi2s, uint8_t dev_id, bool master) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_MODE_OFFSET); - if (master) { - writel( - ((val & ~HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_BMSK) | - (MI2S_MODE__MI2S_MASTER__MASTER << - HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_SHFT)), - baddr + MI2S_MODE_OFFSET); - } else { - writel( - ((val & ~HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_BMSK) | - (MI2S_MODE__MI2S_MASTER__SLAVE << - HWIO_AUDIO1_MI2S_MODE_MI2S_MASTER_SHFT)), - baddr + MI2S_MODE_OFFSET); - } - } -} - -static void mi2s_set_word_type(struct mi2s_state *mi2s, uint8_t dev_id, - uint8_t size) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_MODE_OFFSET); - switch (size) { - case WT_16_BIT: - writel( - ((val & - ~HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_BMSK) | - (MI2S_MODE__MI2S_TX_RX_WORD_TYPE__16_BIT << - HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_SHFT)), - baddr + MI2S_MODE_OFFSET); - break; - case WT_24_BIT: - writel( - ((val & - ~HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_BMSK) | - (MI2S_MODE__MI2S_TX_RX_WORD_TYPE__24_BIT << - HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_SHFT)), - baddr + MI2S_MODE_OFFSET); - break; - case WT_32_BIT: - writel( - ((val & - ~HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_BMSK) | - (MI2S_MODE__MI2S_TX_RX_WORD_TYPE__32_BIT << - HWIO_AUDIO1_MI2S_MODE_MI2S_TX_RX_WORD_TYPE_SHFT)), - baddr + MI2S_MODE_OFFSET); - break; - default: - break; - } - } -} - -static void mi2s_set_sd(struct mi2s_state *mi2s, uint8_t dev_id, uint8_t sd_map) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_MODE_OFFSET) & - ~(MI2S_SD_N_EN_MASK | MI2S_TX_RX_N_MASK); - writel(val | sd_map, baddr + MI2S_MODE_OFFSET); - } -} - -static void mi2s_set_output_num_channels(struct mi2s_state *mi2s, - uint8_t dev_id, uint8_t channels) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_TX_MODE_OFFSET); - if (channels == MI2S_CHAN_MONO_RAW) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__MONO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CODEC_16_MONO_MODE__RAW << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_SHFT)); - } else if (channels == MI2S_CHAN_MONO_PACKED) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__MONO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CODEC_16_MONO_MODE__PACKED << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_P_MONO_SHFT)); - } else if (channels == MI2S_CHAN_STEREO) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CH_TYPE__2_CHANNEL << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_SHFT)); - } else if (channels == MI2S_CHAN_4CHANNELS) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CH_TYPE__4_CHANNEL << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_SHFT)); - } else if (channels == MI2S_CHAN_6CHANNELS) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CH_TYPE__6_CHANNEL << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_SHFT)); - } else if (channels == MI2S_CHAN_8CHANNELS) { - val = (val & - ~(HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_BMSK)) | - ((MI2S_TX_MODE__MI2S_TX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_STEREO_MODE_SHFT) | - (MI2S_TX_MODE__MI2S_TX_CH_TYPE__8_CHANNEL << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_CH_TYPE_SHFT)); - } - writel(val, baddr + MI2S_TX_MODE_OFFSET); - } -} - -static void mi2s_set_output_4ch_map(struct mi2s_state *mi2s, uint8_t dev_id, - bool high_low) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_TX_MODE_OFFSET); - val = (val & ~HWIO_AUDIO1_MI2S_TX_MODE_MI2S_4_0_CH_MAP_BMSK) | - (high_low << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_4_0_CH_MAP_SHFT); - writel(val, baddr + MI2S_TX_MODE_OFFSET); - } -} - -static void mi2s_set_output_2ch_map(struct mi2s_state *mi2s, uint8_t dev_id, - uint8_t sd_line) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_TX_MODE_OFFSET); - if (sd_line < 4) { - val = (val & - ~HWIO_AUDIO1_MI2S_TX_MODE_MI2S_2_0_CH_MAP_BMSK) | - (sd_line << - HWIO_AUDIO1_MI2S_TX_MODE_MI2S_2_0_CH_MAP_SHFT); - writel(val, baddr + MI2S_TX_MODE_OFFSET); - } - } -} - -static void mi2s_set_output_clk_synch(struct mi2s_state *mi2s, uint8_t dev_id) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_TX_MODE_OFFSET); - writel(((val & - ~HWIO_AUDIO1_MI2S_TX_MODE_MI2S_TX_DMA_ACK_SYNCH_EN_BMSK) | - MI2S_TX_MODE__MI2S_TX_DMA_ACK_SYNCH_EN__SYNC_ENABLE), - baddr + MI2S_TX_MODE_OFFSET); - } -} - -static void mi2s_set_input_sd_line(struct mi2s_state *mi2s, uint8_t dev_id, - uint8_t sd_line) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_RX_MODE_OFFSET); - if (sd_line < 4) { - val = (val & - ~HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_I2S_LINE_BMSK) | - (sd_line << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_I2S_LINE_SHFT); - writel(val, baddr + MI2S_RX_MODE_OFFSET); - } - } -} - -static void mi2s_set_input_num_channels(struct mi2s_state *mi2s, uint8_t dev_id, - uint8_t channels) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_RX_MODE_OFFSET); - if (channels == MI2S_CHAN_MONO_RAW) { - val = (val & - ~(HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_BMSK)) | - ((MI2S_RX_MODE__MI2S_RX_STEREO_MODE__MONO_SAMPLE << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_SHFT) | - (MI2S_RX_MODE__MI2S_RX_CODEC_16_MONO_MODE__RAW << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_SHFT)); - } else if (channels == MI2S_CHAN_MONO_PACKED) { - val = (val & - ~(HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_BMSK)) | - ((MI2S_RX_MODE__MI2S_RX_STEREO_MODE__MONO_SAMPLE << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_SHFT) | - (MI2S_RX_MODE__MI2S_RX_CODEC_16_MONO_MODE__PACKED << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_SHFT)); - } else if (channels == MI2S_CHAN_STEREO) { - - if (dev_id == HDMI) - val = (val & - ~(HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_BMSK)) | - ((MI2S_RX_MODE__MI2S_RX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_SHFT) | - (MI2S_RX_MODE__MI2S_RX_CH_TYPE__2_CH << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_SHFT)); - - else - val = (val & - ~(HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_BMSK | - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_BMSK)) | - ((MI2S_RX_MODE__MI2S_RX_STEREO_MODE__STEREO_SAMPLE << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_STEREO_MODE_SHFT) | - (MI2S_RX_MODE__MI2S_RX_CODEC_16_MONO_MODE__PACKED << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CODEC_P_MONO_SHFT) | - (MI2S_RX_MODE__MI2S_RX_CH_TYPE__2_CH << - HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_CH_TYPE_SHFT)); - - - } - writel(val, baddr + MI2S_RX_MODE_OFFSET); - } -} - -static void mi2s_set_input_clk_synch(struct mi2s_state *mi2s, uint8_t dev_id) -{ - void __iomem *baddr = get_base_addr(mi2s, dev_id); - uint32_t val; - - if (!IS_ERR(baddr)) { - val = readl(baddr + MI2S_RX_MODE_OFFSET); - writel( - ((val & - ~HWIO_AUDIO1_MI2S_RX_MODE_MI2S_RX_DMA_ACK_SYNCH_EN_BMSK) | - MI2S_RX_MODE__MI2S_RX_DMA_ACK_SYNCH_EN__SYNC_ENABLE), - baddr + MI2S_RX_MODE_OFFSET); - } -} - - -static u8 num_of_bits_set(u8 sd_line_mask) -{ - u8 num_bits_set = 0; - - while (sd_line_mask) { - - if (sd_line_mask & 1) - num_bits_set++; - sd_line_mask = sd_line_mask >> 1; - } - return num_bits_set; -} - - -bool mi2s_set_hdmi_output_path(uint8_t channels, uint8_t size, - uint8_t sd_line_mask) -{ - bool ret_val = MI2S_TRUE; - struct mi2s_state *mi2s = &the_mi2s_state; - u8 sd_line, num_of_sd_lines = 0; - void __iomem *baddr; - uint32_t val; - - pr_debug("%s: channels = %u size = %u sd_line_mask = 0x%x\n", __func__, - channels, size, sd_line_mask); - - if ((channels == 0) || (channels > MAX_NUM_CHANNELS_OUT) || - ((channels != 1) && (channels % 2 != 0))) { - - pr_err("%s: invalid number of channels. channels = %u\n", - __func__, channels); - return MI2S_FALSE; - } - - sd_line_mask &= MI2S_SD_LINE_MASK; - - if (!sd_line_mask) { - pr_err("%s: Did not set any data lines to use " - " sd_line_mask =0x%x\n", __func__, sd_line_mask); - return MI2S_FALSE; - } - - mutex_lock(&mi2s->mutex_lock); - /* Put device in reset */ - mi2s_reset(mi2s, HDMI); - - mi2s_master(mi2s, HDMI, 1); - - /* Set word type */ - if (size <= WT_MAX) - mi2s_set_word_type(mi2s, HDMI, size); - else - ret_val = MI2S_FALSE; - - /* Enable clock crossing synchronization of RD DMA ACK */ - mi2s_set_output_clk_synch(mi2s, HDMI); - - mi2s_set_output_num_channels(mi2s, HDMI, channels); - - num_of_sd_lines = num_of_bits_set(sd_line_mask); - /*Second argument to find_first_bit should be maximum number of - bit*/ - - sd_line = find_first_bit((unsigned long *)&sd_line_mask, - sizeof(sd_line_mask) * 8); - pr_debug("sd_line = %d\n", sd_line); - - if (channels == 1) { - - if (num_of_sd_lines != 1) { - pr_err("%s: for one channel only one SD lines is" - " needed. num_of_sd_lines = %u\n", - __func__, num_of_sd_lines); - - ret_val = MI2S_FALSE; - goto error; - } - - if (sd_line != 0) { - pr_err("%s: for one channel tx, need to use SD_0 " - "sd_line = %u\n", __func__, sd_line); - - ret_val = MI2S_FALSE; - goto error; - } - - /* Enable SD line 0 for Tx (only option for - * mono audio) - */ - mi2s_set_sd(mi2s, HDMI, MI2S_SD_0_EN_MAP | MI2S_SD_0_TX_MAP); - - } else if (channels == 2) { - - if (num_of_sd_lines != 1) { - pr_err("%s: for two channel only one SD lines is" - " needed. num_of_sd_lines = %u\n", - __func__, num_of_sd_lines); - ret_val = MI2S_FALSE; - goto error; - } - - /* Enable single SD line for Tx */ - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_0_EN_MAP << sd_line) | - (MI2S_SD_0_TX_MAP << sd_line)); - - /* Set 2-channel mapping */ - mi2s_set_output_2ch_map(mi2s, HDMI, sd_line); - - } else if (channels == 4) { - - if (num_of_sd_lines != 2) { - pr_err("%s: for 4 channels two SD lines are" - " needed. num_of_sd_lines = %u\\n", - __func__, num_of_sd_lines); - ret_val = MI2S_FALSE; - goto error; - } - - if ((sd_line_mask && MI2S_SD_0) && - (sd_line_mask && MI2S_SD_1)) { - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_0_EN_MAP | - MI2S_SD_1_EN_MAP) | (MI2S_SD_0_TX_MAP | - MI2S_SD_1_TX_MAP)); - mi2s_set_output_4ch_map(mi2s, HDMI, MI2S_FALSE); - - } else if ((sd_line_mask && MI2S_SD_2) && - (sd_line_mask && MI2S_SD_3)) { - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_2_EN_MAP | - MI2S_SD_3_EN_MAP) | (MI2S_SD_2_TX_MAP | - MI2S_SD_3_TX_MAP)); - - mi2s_set_output_4ch_map(mi2s, HDMI, MI2S_TRUE); - } else { - - pr_err("%s: for 4 channels invalid SD lines usage" - " sd_line_mask = 0x%x\n", - __func__, sd_line_mask); - ret_val = MI2S_FALSE; - goto error; - } - } else if (channels == 6) { - - if (num_of_sd_lines != 3) { - pr_err("%s: for 6 channels three SD lines are" - " needed. num_of_sd_lines = %u\n", - __func__, num_of_sd_lines); - ret_val = MI2S_FALSE; - goto error; - } - - if ((sd_line_mask && MI2S_SD_0) && - (sd_line_mask && MI2S_SD_1) && - (sd_line_mask && MI2S_SD_2)) { - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_0_EN_MAP | - MI2S_SD_1_EN_MAP | MI2S_SD_2_EN_MAP) | - (MI2S_SD_0_TX_MAP | MI2S_SD_1_TX_MAP | - MI2S_SD_2_TX_MAP)); - - } else if ((sd_line_mask && MI2S_SD_1) && - (sd_line_mask && MI2S_SD_2) && - (sd_line_mask && MI2S_SD_3)) { - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_1_EN_MAP | - MI2S_SD_2_EN_MAP | MI2S_SD_3_EN_MAP) | - (MI2S_SD_1_TX_MAP | MI2S_SD_2_TX_MAP | - MI2S_SD_3_TX_MAP)); - - } else { - - pr_err("%s: for 6 channels invalid SD lines usage" - " sd_line_mask = 0x%x\n", - __func__, sd_line_mask); - ret_val = MI2S_FALSE; - goto error; - } - } else if (channels == 8) { - - if (num_of_sd_lines != 4) { - pr_err("%s: for 8 channels four SD lines are" - " needed. num_of_sd_lines = %u\n", - __func__, num_of_sd_lines); - ret_val = MI2S_FALSE; - goto error; - } - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_0_EN_MAP | - MI2S_SD_1_EN_MAP | MI2S_SD_2_EN_MAP | - MI2S_SD_3_EN_MAP) | (MI2S_SD_0_TX_MAP | - MI2S_SD_1_TX_MAP | MI2S_SD_2_TX_MAP | - MI2S_SD_3_TX_MAP)); - } else { - pr_err("%s: invalid number channels = %u\n", - __func__, channels); - ret_val = MI2S_FALSE; - goto error; - } - - baddr = get_base_addr(mi2s, HDMI); - - val = readl(baddr + MI2S_MODE_OFFSET); - pr_debug("%s(): MI2S_MODE = 0x%x\n", __func__, val); - - val = readl(baddr + MI2S_TX_MODE_OFFSET); - pr_debug("%s(): MI2S_TX_MODE = 0x%x\n", __func__, val); - - -error: - /* Release device from reset */ - mi2s_release(mi2s, HDMI); - - mutex_unlock(&mi2s->mutex_lock); - mb(); - return ret_val; -} -EXPORT_SYMBOL(mi2s_set_hdmi_output_path); - -bool mi2s_set_hdmi_input_path(uint8_t channels, uint8_t size, - uint8_t sd_line_mask) -{ - bool ret_val = MI2S_TRUE; - struct mi2s_state *mi2s = &the_mi2s_state; - u8 sd_line, num_of_sd_lines = 0; - void __iomem *baddr; - uint32_t val; - - pr_debug("%s: channels = %u size = %u sd_line_mask = 0x%x\n", __func__, - channels, size, sd_line_mask); - - if ((channels != 1) && (channels != MAX_NUM_CHANNELS_IN)) { - - pr_err("%s: invalid number of channels. channels = %u\n", - __func__, channels); - return MI2S_FALSE; - } - - if (size > WT_MAX) { - - pr_err("%s: mi2s word size can not be greater than 32 bits\n", - __func__); - return MI2S_FALSE; - } - - sd_line_mask &= MI2S_SD_LINE_MASK; - - if (!sd_line_mask) { - pr_err("%s: Did not set any data lines to use " - " sd_line_mask =0x%x\n", __func__, sd_line_mask); - return MI2S_FALSE; - } - - num_of_sd_lines = num_of_bits_set(sd_line_mask); - - if (num_of_sd_lines != 1) { - pr_err("%s: for two channel input only one SD lines is" - " needed. num_of_sd_lines = %u sd_line_mask = 0x%x\n", - __func__, num_of_sd_lines, sd_line_mask); - return MI2S_FALSE; - } - - /*Second argument to find_first_bit should be maximum number of - bits interested*/ - sd_line = find_first_bit((unsigned long *)&sd_line_mask, - sizeof(sd_line_mask) * 8); - pr_debug("sd_line = %d\n", sd_line); - - /* Ensure sd_line parameter is valid (0-max) */ - if (sd_line > MAX_SD_LINES) { - pr_err("%s: Line number can not be greater than = %u\n", - __func__, MAX_SD_LINES); - return MI2S_FALSE; - } - - mutex_lock(&mi2s->mutex_lock); - /* Put device in reset */ - mi2s_reset(mi2s, HDMI); - - mi2s_master(mi2s, HDMI, 1); - - /* Set word type */ - mi2s_set_word_type(mi2s, HDMI, size); - - /* Enable clock crossing synchronization of WR DMA ACK */ - mi2s_set_input_clk_synch(mi2s, HDMI); - - /* Ensure channels parameter is valid (non-zero, less than max, - * and even or mono) - */ - mi2s_set_input_num_channels(mi2s, HDMI, channels); - - mi2s_set_input_sd_line(mi2s, HDMI, sd_line); - - mi2s_set_sd(mi2s, HDMI, (MI2S_SD_0_EN_MAP << sd_line)); - - baddr = get_base_addr(mi2s, HDMI); - - val = readl(baddr + MI2S_MODE_OFFSET); - pr_debug("%s(): MI2S_MODE = 0x%x\n", __func__, val); - - val = readl(baddr + MI2S_RX_MODE_OFFSET); - pr_debug("%s(): MI2S_RX_MODE = 0x%x\n", __func__, val); - - /* Release device from reset */ - mi2s_release(mi2s, HDMI); - - mutex_unlock(&mi2s->mutex_lock); - mb(); - return ret_val; -} -EXPORT_SYMBOL(mi2s_set_hdmi_input_path); - -bool mi2s_set_codec_output_path(uint8_t channels, uint8_t size) -{ - bool ret_val = MI2S_TRUE; - struct mi2s_state *mi2s = &the_mi2s_state; - - mutex_lock(&mi2s->mutex_lock); - /* Put device in reset */ - mi2s_reset(mi2s, CODEC_TX); - - mi2s_master(mi2s, CODEC_TX, 1); - - /* Enable clock crossing synchronization of RD DMA ACK */ - mi2s_set_output_clk_synch(mi2s, CODEC_TX); - - /* Set word type */ - if (size <= WT_MAX) - mi2s_set_word_type(mi2s, CODEC_TX, size); - else - ret_val = MI2S_FALSE; - - mi2s_set_output_num_channels(mi2s, CODEC_TX, channels); - - /* Enable SD line */ - mi2s_set_sd(mi2s, CODEC_TX, MI2S_SD_0_EN_MAP | MI2S_SD_0_TX_MAP); - - /* Release device from reset */ - mi2s_release(mi2s, CODEC_TX); - - mutex_unlock(&mi2s->mutex_lock); - mb(); - return ret_val; -} -EXPORT_SYMBOL(mi2s_set_codec_output_path); - -bool mi2s_set_codec_input_path(uint8_t channels, uint8_t size) -{ - bool ret_val = MI2S_TRUE; - struct mi2s_state *mi2s = &the_mi2s_state; - - mutex_lock(&the_mi2s_state.mutex_lock); - /* Put device in reset */ - mi2s_reset(mi2s, CODEC_RX); - - mi2s_master(mi2s, CODEC_RX, 1); - - /* Enable clock crossing synchronization of WR DMA ACK */ - mi2s_set_input_clk_synch(mi2s, CODEC_RX); - - /* Set word type */ - if (size <= WT_MAX) - mi2s_set_word_type(mi2s, CODEC_RX, size); - else - ret_val = MI2S_FALSE; - - mi2s_set_input_num_channels(mi2s, CODEC_RX, channels); - - /* Enable SD line */ - mi2s_set_sd(mi2s, CODEC_RX, MI2S_SD_0_EN_MAP); - - /* Release device from reset */ - mi2s_release(mi2s, CODEC_RX); - - mutex_unlock(&mi2s->mutex_lock); - mb(); - return ret_val; -} -EXPORT_SYMBOL(mi2s_set_codec_input_path); - - -static int mi2s_probe(struct platform_device *pdev) -{ - int rc = 0; - struct resource *mem_src; - - mem_src = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi"); - if (!mem_src) { - rc = -ENODEV; - goto error_hdmi; - } - the_mi2s_state.mi2s_hdmi_base = ioremap(mem_src->start, - (mem_src->end - mem_src->start) + 1); - if (!the_mi2s_state.mi2s_hdmi_base) { - rc = -ENOMEM; - goto error_hdmi; - } - mem_src = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "codec_rx"); - if (!mem_src) { - rc = -ENODEV; - goto error_codec_rx; - } - the_mi2s_state.mi2s_rx_base = ioremap(mem_src->start, - (mem_src->end - mem_src->start) + 1); - if (!the_mi2s_state.mi2s_rx_base) { - rc = -ENOMEM; - goto error_codec_rx; - } - mem_src = platform_get_resource_byname(pdev, - IORESOURCE_MEM, "codec_tx"); - if (!mem_src) { - rc = -ENODEV; - goto error_codec_tx; - } - the_mi2s_state.mi2s_tx_base = ioremap(mem_src->start, - (mem_src->end - mem_src->start) + 1); - if (!the_mi2s_state.mi2s_tx_base) { - rc = -ENOMEM; - goto error_codec_tx; - } - mutex_init(&the_mi2s_state.mutex_lock); - - return rc; - -error_codec_tx: - iounmap(the_mi2s_state.mi2s_rx_base); -error_codec_rx: - iounmap(the_mi2s_state.mi2s_hdmi_base); -error_hdmi: - return rc; - -} - -static int mi2s_remove(struct platform_device *pdev) -{ - iounmap(the_mi2s_state.mi2s_tx_base); - iounmap(the_mi2s_state.mi2s_rx_base); - iounmap(the_mi2s_state.mi2s_hdmi_base); - return 0; -} - -static struct platform_driver mi2s_driver = { - .probe = mi2s_probe, - .remove = mi2s_remove, - .driver = { - .name = "mi2s", - .owner = THIS_MODULE, - }, -}; - -static int __init mi2s_init(void) -{ - return platform_driver_register(&mi2s_driver); -} - -static void __exit mi2s_exit(void) -{ - platform_driver_unregister(&mi2s_driver); -} - -module_init(mi2s_init); -module_exit(mi2s_exit); - -MODULE_DESCRIPTION("MSM MI2S driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/mp3_funcs.c b/arch/arm/mach-msm/qdsp5v2/mp3_funcs.c deleted file mode 100644 index f857e5c302ff..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/mp3_funcs.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -long mp3_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - MM_DBG("mp3_ioctl() cmd = %d\b", cmd); - - return -EINVAL; -} - -void audpp_cmd_cfg_mp3_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_mp3 cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_MP3_LEN; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - - audpp_send_queue2(&cmd, sizeof(cmd)); -} diff --git a/arch/arm/mach-msm/qdsp5v2/pcm_funcs.c b/arch/arm/mach-msm/qdsp5v2/pcm_funcs.c deleted file mode 100644 index 866b71d74eb4..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/pcm_funcs.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - MM_DBG("pcm_ioctl() cmd = %d\n", cmd); - - return -EINVAL; -} - -void audpp_cmd_cfg_pcm_params(struct audio *audio) -{ - struct audpp_cmd_cfg_adec_params_wav cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.common.cmd_id = AUDPP_CMD_CFG_ADEC_PARAMS; - cmd.common.length = AUDPP_CMD_CFG_ADEC_PARAMS_WAV_LEN >> 1; - cmd.common.dec_id = audio->dec_id; - cmd.common.input_sampling_frequency = audio->out_sample_rate; - cmd.stereo_cfg = audio->out_channel_mode; - cmd.pcm_width = audio->out_bits; - cmd.sign = 0; - audpp_send_queue2(&cmd, sizeof(cmd)); -} diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_data_marimba.c b/arch/arm/mach-msm/qdsp5v2/snddev_data_marimba.c deleted file mode 100644 index b11cdb0e1398..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_data_marimba.c +++ /dev/null @@ -1,1537 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* define the value for BT_SCO */ -#define BT_SCO_PCM_CTL_VAL (PCM_CTL__RPCM_WIDTH__LINEAR_V |\ - PCM_CTL__TPCM_WIDTH__LINEAR_V) -#define BT_SCO_DATA_FORMAT_PADDING (DATA_FORMAT_PADDING_INFO__RPCM_FORMAT_V |\ - DATA_FORMAT_PADDING_INFO__TPCM_FORMAT_V) -#define BT_SCO_AUX_CODEC_INTF AUX_CODEC_INTF_CTL__PCMINTF_DATA_EN_V - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_hsed_config; -static void snddev_hsed_config_modify_setting(int type); -static void snddev_hsed_config_restore_setting(void); -#endif - -static struct adie_codec_action_unit iearpiece_48KHz_osr256_actions[] = - HANDSET_RX_48000_OSR_256; - -static struct adie_codec_hwsetting_entry iearpiece_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iearpiece_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(iearpiece_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iearpiece_profile = { - .path_type = ADIE_CODEC_RX, - .settings = iearpiece_settings, - .setting_sz = ARRAY_SIZE(iearpiece_settings), -}; - -static struct snddev_icodec_data snddev_iearpiece_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_SPKR, - .profile = &iearpiece_profile, - .channel_mode = 1, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .property = SIDE_TONE_MASK, - .max_voice_rx_vol[VOC_NB_INDEX] = -200, - .min_voice_rx_vol[VOC_NB_INDEX] = -1700, - .max_voice_rx_vol[VOC_WB_INDEX] = -200, - .min_voice_rx_vol[VOC_WB_INDEX] = -1700 -}; - -static struct platform_device msm_iearpiece_device = { - .name = "snddev_icodec", - .id = 0, - .dev = { .platform_data = &snddev_iearpiece_data }, -}; - -static struct adie_codec_action_unit imic_8KHz_osr256_actions[] = - HANDSET_TX_8000_OSR_256; - -static struct adie_codec_action_unit imic_16KHz_osr256_actions[] = - HANDSET_TX_16000_OSR_256; - -static struct adie_codec_action_unit imic_48KHz_osr256_actions[] = - HANDSET_TX_48000_OSR_256; - -static struct adie_codec_hwsetting_entry imic_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = imic_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_8KHz_osr256_actions), - }, - { - .freq_plan = 16000, - .osr = 256, - .actions = imic_16KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_16KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = imic_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile imic_profile = { - .path_type = ADIE_CODEC_TX, - .settings = imic_settings, - .setting_sz = ARRAY_SIZE(imic_settings), -}; - -static enum hsed_controller imic_pmctl_id[] = {PM_HSED_CONTROLLER_0}; - -static struct snddev_icodec_data snddev_imic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC, - .profile = &imic_profile, - .channel_mode = 1, - .pmctl_id = imic_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(imic_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_imic_device = { - .name = "snddev_icodec", - .id = 1, - .dev = { .platform_data = &snddev_imic_data }, -}; - -static struct adie_codec_action_unit ihs_stereo_rx_48KHz_osr256_actions[] = - HEADSET_STEREO_RX_LEGACY_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_stereo_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_stereo_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_stereo_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_stereo_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_stereo_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_stereo_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_STEREO, - .profile = &ihs_stereo_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .property = SIDE_TONE_MASK, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400 -}; - -static struct platform_device msm_ihs_stereo_rx_device = { - .name = "snddev_icodec", - .id = 2, - .dev = { .platform_data = &snddev_ihs_stereo_rx_data }, -}; - -static struct adie_codec_action_unit ihs_mono_rx_48KHz_osr256_actions[] = - HEADSET_RX_LEGACY_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_mono_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_mono_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_mono_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_mono_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_MONO, - .profile = &ihs_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .property = SIDE_TONE_MASK, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, - -}; - -static struct platform_device msm_ihs_mono_rx_device = { - .name = "snddev_icodec", - .id = 3, - .dev = { .platform_data = &snddev_ihs_mono_rx_data }, -}; - -static struct adie_codec_action_unit ihs_ffa_stereo_rx_48KHz_osr256_actions[] = - HEADSET_STEREO_RX_CAPLESS_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_ffa_stereo_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_ffa_stereo_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_ffa_stereo_rx_48KHz_osr256_actions), - } -}; - -#ifdef CONFIG_DEBUG_FS -static struct adie_codec_action_unit - ihs_ffa_stereo_rx_class_d_legacy_48KHz_osr256_actions[] = - HEADSET_STEREO_RX_CLASS_D_LEGACY_48000_OSR_256; - -static struct adie_codec_hwsetting_entry - ihs_ffa_stereo_rx_class_d_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_ffa_stereo_rx_class_d_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_ffa_stereo_rx_class_d_legacy_48KHz_osr256_actions), - } -}; - -static struct adie_codec_action_unit - ihs_ffa_stereo_rx_class_ab_legacy_48KHz_osr256_actions[] = - HEADSET_STEREO_RX_LEGACY_48000_OSR_256; - -static struct adie_codec_hwsetting_entry - ihs_ffa_stereo_rx_class_ab_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_ffa_stereo_rx_class_ab_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_ffa_stereo_rx_class_ab_legacy_48KHz_osr256_actions), - } -}; -#endif - -static struct adie_codec_dev_profile ihs_ffa_stereo_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_ffa_stereo_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_ffa_stereo_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_ffa_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_STEREO, - .profile = &ihs_ffa_stereo_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_hsed_voltage_on, - .voltage_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, -}; - -static struct platform_device msm_ihs_ffa_stereo_rx_device = { - .name = "snddev_icodec", - .id = 4, - .dev = { .platform_data = &snddev_ihs_ffa_stereo_rx_data }, -}; - -static struct adie_codec_action_unit ihs_ffa_mono_rx_48KHz_osr256_actions[] = - HEADSET_RX_CAPLESS_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_ffa_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_ffa_mono_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_ffa_mono_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_ffa_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_ffa_mono_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_ffa_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_ffa_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_mono_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_MONO, - .profile = &ihs_ffa_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_hsed_voltage_on, - .pamp_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, -}; - -static struct platform_device msm_ihs_ffa_mono_rx_device = { - .name = "snddev_icodec", - .id = 5, - .dev = { .platform_data = &snddev_ihs_ffa_mono_rx_data }, -}; - -static struct adie_codec_action_unit ihs_mono_tx_8KHz_osr256_actions[] = - HEADSET_MONO_TX_8000_OSR_256; - -static struct adie_codec_action_unit ihs_mono_tx_16KHz_osr256_actions[] = - HEADSET_MONO_TX_16000_OSR_256; - -static struct adie_codec_action_unit ihs_mono_tx_48KHz_osr256_actions[] = - HEADSET_MONO_TX_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_mono_tx_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ihs_mono_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_mono_tx_8KHz_osr256_actions), - }, - { - .freq_plan = 16000, - .osr = 256, - .actions = ihs_mono_tx_16KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_mono_tx_16KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_mono_tx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_mono_tx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_mono_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ihs_mono_tx_settings, - .setting_sz = ARRAY_SIZE(ihs_mono_tx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_mono_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "headset_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_MIC, - .profile = &ihs_mono_tx_profile, - .channel_mode = 1, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_ihs_mono_tx_device = { - .name = "snddev_icodec", - .id = 6, - .dev = { .platform_data = &snddev_ihs_mono_tx_data }, -}; - -static struct adie_codec_action_unit ifmradio_handset_osr64_actions[] = - FM_HANDSET_OSR_64; - -static struct adie_codec_hwsetting_entry ifmradio_handset_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ifmradio_handset_osr64_actions, - .action_sz = ARRAY_SIZE(ifmradio_handset_osr64_actions), - } -}; - -static struct adie_codec_dev_profile ifmradio_handset_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ifmradio_handset_settings, - .setting_sz = ARRAY_SIZE(ifmradio_handset_settings), -}; - -static struct snddev_icodec_data snddev_ifmradio_handset_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_FM), - .name = "fmradio_handset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_LP_FM_SPKR_PHONE_STEREO_RX, - .profile = &ifmradio_handset_profile, - .channel_mode = 1, - .default_sample_rate = 8000, - .pamp_on = NULL, - .pamp_off = NULL, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device msm_ifmradio_handset_device = { - .name = "snddev_icodec", - .id = 7, - .dev = { .platform_data = &snddev_ifmradio_handset_data }, -}; - - -static struct adie_codec_action_unit ispeaker_rx_48KHz_osr256_actions[] = - SPEAKER_STEREO_RX_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ispeaker_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ispeaker_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispeaker_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ispeaker_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ispeaker_rx_settings, - .setting_sz = ARRAY_SIZE(ispeaker_rx_settings), -}; - -static struct snddev_icodec_data snddev_ispeaker_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "speaker_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_STEREO, - .profile = &ispeaker_rx_profile, - .channel_mode = 2, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = &msm_snddev_poweramp_on, - .pamp_off = &msm_snddev_poweramp_off, - .max_voice_rx_vol[VOC_NB_INDEX] = 1000, - .min_voice_rx_vol[VOC_NB_INDEX] = -500, - .max_voice_rx_vol[VOC_WB_INDEX] = 1000, - .min_voice_rx_vol[VOC_WB_INDEX] = -500, -}; - -static struct platform_device msm_ispeaker_rx_device = { - .name = "snddev_icodec", - .id = 8, - .dev = { .platform_data = &snddev_ispeaker_rx_data }, - -}; - -static struct adie_codec_action_unit ifmradio_speaker_osr64_actions[] = - FM_SPEAKER_OSR_64; - -static struct adie_codec_hwsetting_entry ifmradio_speaker_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ifmradio_speaker_osr64_actions, - .action_sz = ARRAY_SIZE(ifmradio_speaker_osr64_actions), - } -}; - -static struct adie_codec_dev_profile ifmradio_speaker_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ifmradio_speaker_settings, - .setting_sz = ARRAY_SIZE(ifmradio_speaker_settings), -}; - -static struct snddev_icodec_data snddev_ifmradio_speaker_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_FM), - .name = "fmradio_speaker_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_LP_FM_SPKR_PHONE_STEREO_RX, - .profile = &ifmradio_speaker_profile, - .channel_mode = 1, - .default_sample_rate = 8000, - .pamp_on = &msm_snddev_poweramp_on, - .pamp_off = &msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device msm_ifmradio_speaker_device = { - .name = "snddev_icodec", - .id = 9, - .dev = { .platform_data = &snddev_ifmradio_speaker_data }, -}; - -static struct adie_codec_action_unit ifmradio_headset_osr64_actions[] = - FM_HEADSET_STEREO_CLASS_D_LEGACY_OSR_64; - -static struct adie_codec_hwsetting_entry ifmradio_headset_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ifmradio_headset_osr64_actions, - .action_sz = ARRAY_SIZE(ifmradio_headset_osr64_actions), - } -}; - -static struct adie_codec_dev_profile ifmradio_headset_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ifmradio_headset_settings, - .setting_sz = ARRAY_SIZE(ifmradio_headset_settings), -}; - -static struct snddev_icodec_data snddev_ifmradio_headset_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_FM), - .name = "fmradio_headset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_LP_FM_HEADSET_SPKR_STEREO_RX, - .profile = &ifmradio_headset_profile, - .channel_mode = 1, - .default_sample_rate = 8000, - .pamp_on = NULL, - .pamp_off = NULL, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device msm_ifmradio_headset_device = { - .name = "snddev_icodec", - .id = 10, - .dev = { .platform_data = &snddev_ifmradio_headset_data }, -}; - - -static struct adie_codec_action_unit ifmradio_ffa_headset_osr64_actions[] = - FM_HEADSET_CLASS_AB_STEREO_CAPLESS_OSR_64; - -static struct adie_codec_hwsetting_entry ifmradio_ffa_headset_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ifmradio_ffa_headset_osr64_actions, - .action_sz = ARRAY_SIZE(ifmradio_ffa_headset_osr64_actions), - } -}; - -static struct adie_codec_dev_profile ifmradio_ffa_headset_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ifmradio_ffa_headset_settings, - .setting_sz = ARRAY_SIZE(ifmradio_ffa_headset_settings), -}; - -static struct snddev_icodec_data snddev_ifmradio_ffa_headset_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_FM), - .name = "fmradio_headset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_LP_FM_HEADSET_SPKR_STEREO_RX, - .profile = &ifmradio_ffa_headset_profile, - .channel_mode = 1, - .default_sample_rate = 8000, - .pamp_on = msm_snddev_hsed_voltage_on, - .pamp_off = msm_snddev_hsed_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device msm_ifmradio_ffa_headset_device = { - .name = "snddev_icodec", - .id = 11, - .dev = { .platform_data = &snddev_ifmradio_ffa_headset_data }, -}; - -static struct snddev_ecodec_data snddev_bt_sco_earpiece_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "bt_sco_rx", - .copp_id = 1, - .acdb_id = ACDB_ID_BT_SCO_SPKR, - .channel_mode = 1, - .conf_pcm_ctl_val = BT_SCO_PCM_CTL_VAL, - .conf_aux_codec_intf = BT_SCO_AUX_CODEC_INTF, - .conf_data_format_padding_val = BT_SCO_DATA_FORMAT_PADDING, - .max_voice_rx_vol[VOC_NB_INDEX] = 400, - .min_voice_rx_vol[VOC_NB_INDEX] = -1100, - .max_voice_rx_vol[VOC_WB_INDEX] = 400, - .min_voice_rx_vol[VOC_WB_INDEX] = -1100, -}; - -static struct snddev_ecodec_data snddev_bt_sco_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "bt_sco_tx", - .copp_id = 1, - .acdb_id = ACDB_ID_BT_SCO_MIC, - .channel_mode = 1, - .conf_pcm_ctl_val = BT_SCO_PCM_CTL_VAL, - .conf_aux_codec_intf = BT_SCO_AUX_CODEC_INTF, - .conf_data_format_padding_val = BT_SCO_DATA_FORMAT_PADDING, -}; - -struct platform_device msm_bt_sco_earpiece_device = { - .name = "msm_snddev_ecodec", - .id = 0, - .dev = { .platform_data = &snddev_bt_sco_earpiece_data }, -}; - -struct platform_device msm_bt_sco_mic_device = { - .name = "msm_snddev_ecodec", - .id = 1, - .dev = { .platform_data = &snddev_bt_sco_mic_data }, -}; - -static struct adie_codec_action_unit idual_mic_endfire_8KHz_osr256_actions[] = - MIC1_LEFT_LINE_IN_RIGHT_8000_OSR_256; - -static struct adie_codec_hwsetting_entry idual_mic_endfire_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile idual_mic_endfire_profile = { - .path_type = ADIE_CODEC_TX, - .settings = idual_mic_endfire_settings, - .setting_sz = ARRAY_SIZE(idual_mic_endfire_settings), -}; - -static enum hsed_controller idual_mic_endfire_pmctl_id[] = { - PM_HSED_CONTROLLER_0, PM_HSED_CONTROLLER_2 -}; - -static struct snddev_icodec_data snddev_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC_ENDFIRE, - .profile = &idual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 12, - .dev = { .platform_data = &snddev_idual_mic_endfire_data }, -}; - - -static struct snddev_icodec_data\ - snddev_idual_mic_endfire_real_stereo_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx_real_stereo", - .copp_id = 0, - .acdb_id = PSEUDO_ACDB_ID, - .profile = &idual_mic_endfire_profile, - .channel_mode = REAL_STEREO_CHANNEL_MODE, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_real_stereo_tx_device = { - .name = "snddev_icodec", - .id = 26, - .dev = { .platform_data = - &snddev_idual_mic_endfire_real_stereo_data }, -}; - -static struct adie_codec_action_unit idual_mic_bs_8KHz_osr256_actions[] = - MIC1_LEFT_AUX_IN_RIGHT_8000_OSR_256; - -static struct adie_codec_hwsetting_entry idual_mic_broadside_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile idual_mic_broadside_profile = { - .path_type = ADIE_CODEC_TX, - .settings = idual_mic_broadside_settings, - .setting_sz = ARRAY_SIZE(idual_mic_broadside_settings), -}; - -static enum hsed_controller idual_mic_broadside_pmctl_id[] = { - PM_HSED_CONTROLLER_0, PM_HSED_CONTROLLER_2 -}; - -static struct snddev_icodec_data snddev_idual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_broadside_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC_BROADSIDE, - .profile = &idual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_broadside_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_broadside_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_idual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 13, - .dev = { .platform_data = &snddev_idual_mic_broadside_data }, -}; - -static struct adie_codec_action_unit ispk_dual_mic_ef_8KHz_osr256_actions[] = - SPEAKER_MIC1_LEFT_LINE_IN_RIGHT_8000_OSR_256; - -static struct adie_codec_hwsetting_entry ispk_dual_mic_ef_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ispk_dual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_ef_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16Khz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = ispk_dual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_ef_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = ispk_dual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_ef_8KHz_osr256_actions), - }, -}; - -static struct adie_codec_dev_profile ispk_dual_mic_ef_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ispk_dual_mic_ef_settings, - .setting_sz = ARRAY_SIZE(ispk_dual_mic_ef_settings), -}; - -static struct snddev_icodec_data snddev_spk_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_ENDFIRE, - .profile = &ispk_dual_mic_ef_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_spk_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 14, - .dev = { .platform_data = &snddev_spk_idual_mic_endfire_data }, -}; - -static struct adie_codec_action_unit ispk_dual_mic_bs_8KHz_osr256_actions[] = - SPEAKER_MIC1_LEFT_AUX_IN_RIGHT_8000_OSR_256; - -static struct adie_codec_hwsetting_entry ispk_dual_mic_bs_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16Khz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, -}; - -static struct adie_codec_dev_profile ispk_dual_mic_bs_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ispk_dual_mic_bs_settings, - .setting_sz = ARRAY_SIZE(ispk_dual_mic_bs_settings), -}; -static struct snddev_icodec_data snddev_spk_idual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_broadside_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_BROADSIDE, - .profile = &ispk_dual_mic_bs_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_broadside_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_broadside_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_spk_idual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 15, - .dev = { .platform_data = &snddev_spk_idual_mic_broadside_data }, -}; - -static struct adie_codec_action_unit itty_hs_mono_tx_8KHz_osr256_actions[] = - TTY_HEADSET_MONO_TX_8000_OSR_256; - -static struct adie_codec_hwsetting_entry itty_hs_mono_tx_settings[] = { - /* 8KHz, 16KHz, 48KHz TTY Tx devices can shared same set of actions */ - { - .freq_plan = 8000, - .osr = 256, - .actions = itty_hs_mono_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_tx_8KHz_osr256_actions), - }, - { - .freq_plan = 16000, - .osr = 256, - .actions = itty_hs_mono_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_tx_8KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_hs_mono_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_tx_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile itty_hs_mono_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = itty_hs_mono_tx_settings, - .setting_sz = ARRAY_SIZE(itty_hs_mono_tx_settings), -}; - -static struct snddev_icodec_data snddev_itty_hs_mono_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_TTY_HEADSET_MIC, - .profile = &itty_hs_mono_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_itty_hs_mono_tx_device = { - .name = "snddev_icodec", - .id = 16, - .dev = { .platform_data = &snddev_itty_hs_mono_tx_data }, -}; - -static struct adie_codec_action_unit itty_hs_mono_rx_8KHz_osr256_actions[] = - TTY_HEADSET_MONO_RX_CLASS_D_8000_OSR_256; - -static struct adie_codec_action_unit itty_hs_mono_rx_16KHz_osr256_actions[] = - TTY_HEADSET_MONO_RX_CLASS_D_16000_OSR_256; - -static struct adie_codec_action_unit itty_hs_mono_rx_48KHz_osr256_actions[] = - TTY_HEADSET_MONO_RX_CLASS_D_48000_OSR_256; - -static struct adie_codec_hwsetting_entry itty_hs_mono_rx_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = itty_hs_mono_rx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_rx_8KHz_osr256_actions), - }, - { - .freq_plan = 16000, - .osr = 256, - .actions = itty_hs_mono_rx_16KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_rx_16KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_hs_mono_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(itty_hs_mono_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile itty_hs_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = itty_hs_mono_rx_settings, - .setting_sz = ARRAY_SIZE(itty_hs_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_itty_hs_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_TTY_HEADSET_SPKR, - .profile = &itty_hs_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .max_voice_rx_vol[VOC_NB_INDEX] = 0, - .min_voice_rx_vol[VOC_NB_INDEX] = 0, - .max_voice_rx_vol[VOC_WB_INDEX] = 0, - .min_voice_rx_vol[VOC_WB_INDEX] = 0, -}; - -static struct platform_device msm_itty_hs_mono_rx_device = { - .name = "snddev_icodec", - .id = 17, - .dev = { .platform_data = &snddev_itty_hs_mono_rx_data }, -}; - -static struct adie_codec_action_unit ispeaker_tx_8KHz_osr256_actions[] = - SPEAKER_TX_8000_OSR_256; - -static struct adie_codec_action_unit ispeaker_tx_48KHz_osr256_actions[] = - SPEAKER_TX_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ispeaker_tx_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ispeaker_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispeaker_tx_8KHz_osr256_actions), - }, - { /* 8KHz profile is good for 16KHz */ - .freq_plan = 16000, - .osr = 256, - .actions = ispeaker_tx_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispeaker_tx_8KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = ispeaker_tx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispeaker_tx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ispeaker_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ispeaker_tx_settings, - .setting_sz = ARRAY_SIZE(ispeaker_tx_settings), -}; - -static enum hsed_controller ispk_pmctl_id[] = {PM_HSED_CONTROLLER_0}; - -static struct snddev_icodec_data snddev_ispeaker_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC, - .profile = &ispeaker_tx_profile, - .channel_mode = 1, - .pmctl_id = ispk_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(ispk_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_ispeaker_tx_device = { - .name = "snddev_icodec", - .id = 18, - .dev = { .platform_data = &snddev_ispeaker_tx_data }, -}; - -static struct adie_codec_action_unit iearpiece_ffa_48KHz_osr256_actions[] = - HANDSET_RX_48000_OSR_256_FFA; - -static struct adie_codec_hwsetting_entry iearpiece_ffa_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iearpiece_ffa_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(iearpiece_ffa_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iearpiece_ffa_profile = { - .path_type = ADIE_CODEC_RX, - .settings = iearpiece_ffa_settings, - .setting_sz = ARRAY_SIZE(iearpiece_ffa_settings), -}; - -static struct snddev_icodec_data snddev_iearpiece_ffa_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_SPKR, - .profile = &iearpiece_ffa_profile, - .channel_mode = 1, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -1400, - .min_voice_rx_vol[VOC_WB_INDEX] = -2900, -}; - -static struct platform_device msm_iearpiece_ffa_device = { - .name = "snddev_icodec", - .id = 19, - .dev = { .platform_data = &snddev_iearpiece_ffa_data }, -}; - -static struct adie_codec_action_unit imic_ffa_8KHz_osr256_actions[] = - HANDSET_TX_8000_OSR_256_FFA; - -static struct adie_codec_action_unit imic_ffa_16KHz_osr256_actions[] = - HANDSET_TX_16000_OSR_256_FFA; - -static struct adie_codec_action_unit imic_ffa_48KHz_osr256_actions[] = - HANDSET_TX_48000_OSR_256_FFA; - -static struct adie_codec_hwsetting_entry imic_ffa_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = imic_ffa_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_ffa_8KHz_osr256_actions), - }, - { - .freq_plan = 16000, - .osr = 256, - .actions = imic_ffa_16KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_ffa_16KHz_osr256_actions), - }, - { - .freq_plan = 48000, - .osr = 256, - .actions = imic_ffa_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_ffa_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile imic_ffa_profile = { - .path_type = ADIE_CODEC_TX, - .settings = imic_ffa_settings, - .setting_sz = ARRAY_SIZE(imic_ffa_settings), -}; - -static struct snddev_icodec_data snddev_imic_ffa_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC, - .profile = &imic_ffa_profile, - .channel_mode = 1, - .pmctl_id = imic_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(imic_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_imic_ffa_device = { - .name = "snddev_icodec", - .id = 20, - .dev = { .platform_data = &snddev_imic_ffa_data }, -}; - - -static struct adie_codec_action_unit - ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions[] = - HEADSET_STEREO_SPEAKER_STEREO_RX_CAPLESS_48000_OSR_256; - - -static struct adie_codec_hwsetting_entry - ihs_stereo_speaker_stereo_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions, - .action_sz = - ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_stereo_speaker_stereo_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_stereo_speaker_stereo_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_speaker_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_speaker_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX, - .profile = &ihs_stereo_speaker_stereo_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .voltage_on = msm_snddev_hsed_voltage_on, - .voltage_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -500, - .min_voice_rx_vol[VOC_NB_INDEX] = -2000, - .max_voice_rx_vol[VOC_WB_INDEX] = -500, - .min_voice_rx_vol[VOC_WB_INDEX] = -2000, -}; - -static struct platform_device msm_ihs_stereo_speaker_stereo_rx_device = { - .name = "snddev_icodec", - .id = 21, - .dev = { .platform_data = &snddev_ihs_stereo_speaker_stereo_rx_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_stereo_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "hdmi_stereo_rx", - .copp_id = 3, - .acdb_id = ACDB_ID_HDMI, - .channel_mode = 2, - .sd_lines = MI2S_SD_0, - .route = msm_snddev_tx_route_config, - .deroute = msm_snddev_tx_route_deconfig, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_mi2s_stereo_rx_device = { - .name = "snddev_mi2s", - .id = 0, - .dev = { .platform_data = &snddev_mi2s_stereo_rx_data }, -}; - - -static struct snddev_mi2s_data snddev_mi2s_fm_tx_data = { - .capability = SNDDEV_CAP_TX , - .name = "fmradio_stereo_tx", - .copp_id = 2, - .acdb_id = ACDB_ID_FM_TX, - .channel_mode = 2, - .sd_lines = MI2S_SD_3, - .route = NULL, - .deroute = NULL, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_mi2s_fm_tx_device = { - .name = "snddev_mi2s", - .id = 1, - .dev = { .platform_data = &snddev_mi2s_fm_tx_data}, -}; - -static struct snddev_icodec_data snddev_fluid_imic_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC, - .profile = &ispeaker_tx_profile, - .channel_mode = 1, - .pmctl_id = ispk_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(ispk_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_fluid_imic_tx_device = { - .name = "snddev_icodec", - .id = 22, - .dev = { .platform_data = &snddev_fluid_imic_tx_data }, -}; - -static struct snddev_icodec_data snddev_fluid_iearpiece_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_STEREO, - .profile = &ispeaker_rx_profile, - .channel_mode = 2, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = &msm_snddev_poweramp_on, - .pamp_off = &msm_snddev_poweramp_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -500, - .min_voice_rx_vol[VOC_NB_INDEX] = -1000, - .max_voice_rx_vol[VOC_WB_INDEX] = -500, - .min_voice_rx_vol[VOC_WB_INDEX] = -1000, -}; - -static struct platform_device msm_fluid_iearpeice_rx_device = { - .name = "snddev_icodec", - .id = 23, - .dev = { .platform_data = &snddev_fluid_iearpiece_rx_data }, -}; - -static struct adie_codec_action_unit fluid_idual_mic_ef_8KHz_osr256_actions[] = - MIC1_LEFT_AUX_IN_RIGHT_8000_OSR_256; - -static struct adie_codec_hwsetting_entry fluid_idual_mic_endfire_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = fluid_idual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(fluid_idual_mic_ef_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = fluid_idual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(fluid_idual_mic_ef_8KHz_osr256_actions), - }, /* 8KHz profile can also be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = fluid_idual_mic_ef_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(fluid_idual_mic_ef_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile fluid_idual_mic_endfire_profile = { - .path_type = ADIE_CODEC_TX, - .settings = fluid_idual_mic_endfire_settings, - .setting_sz = ARRAY_SIZE(fluid_idual_mic_endfire_settings), -}; - -static enum hsed_controller fluid_idual_mic_endfire_pmctl_id[] = { - PM_HSED_CONTROLLER_0, PM_HSED_CONTROLLER_2 -}; - -static struct snddev_icodec_data snddev_fluid_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_ENDFIRE, - .profile = &fluid_idual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = fluid_idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(fluid_idual_mic_endfire_pmctl_id), - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_fluid_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 24, - .dev = { .platform_data = &snddev_fluid_idual_mic_endfire_data }, -}; - -static struct snddev_icodec_data snddev_fluid_spk_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_ENDFIRE, - .profile = &fluid_idual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = fluid_idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(fluid_idual_mic_endfire_pmctl_id), - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_fluid_spk_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 25, - .dev = { .platform_data = &snddev_fluid_spk_idual_mic_endfire_data }, -}; - -static struct snddev_virtual_data snddev_a2dp_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "a2dp_tx", - .copp_id = 5, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct snddev_virtual_data snddev_a2dp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "a2dp_rx", - .copp_id = 2, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct platform_device msm_a2dp_rx_device = { - .name = "snddev_virtual", - .id = 0, - .dev = { .platform_data = &snddev_a2dp_rx_data }, -}; - -static struct platform_device msm_a2dp_tx_device = { - .name = "snddev_virtual", - .id = 1, - .dev = { .platform_data = &snddev_a2dp_tx_data }, -}; - -static struct snddev_virtual_data snddev_uplink_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "uplink_rx", - .copp_id = 5, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct platform_device msm_uplink_rx_device = { - .name = "snddev_virtual", - .id = 2, - .dev = { .platform_data = &snddev_uplink_rx_data }, -}; - -static struct platform_device *snd_devices_ffa[] __initdata = { - &msm_iearpiece_ffa_device, - &msm_imic_ffa_device, - &msm_ifmradio_handset_device, - &msm_ihs_ffa_stereo_rx_device, - &msm_ihs_ffa_mono_rx_device, - &msm_ihs_mono_tx_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_ispeaker_rx_device, - &msm_ifmradio_speaker_device, - &msm_ifmradio_ffa_headset_device, - &msm_idual_mic_endfire_device, - &msm_idual_mic_broadside_device, - &msm_spk_idual_mic_endfire_device, - &msm_spk_idual_mic_broadside_device, - &msm_itty_hs_mono_tx_device, - &msm_itty_hs_mono_rx_device, - &msm_ispeaker_tx_device, - &msm_ihs_stereo_speaker_stereo_rx_device, - &msm_a2dp_rx_device, - &msm_a2dp_tx_device, - &msm_snddev_mi2s_stereo_rx_device, - &msm_snddev_mi2s_fm_tx_device, - &msm_uplink_rx_device, - &msm_real_stereo_tx_device, -}; - -static struct platform_device *snd_devices_surf[] __initdata = { - &msm_iearpiece_device, - &msm_imic_device, - &msm_ihs_stereo_rx_device, - &msm_ihs_mono_rx_device, - &msm_ihs_mono_tx_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_ifmradio_handset_device, - &msm_ispeaker_rx_device, - &msm_ifmradio_speaker_device, - &msm_ifmradio_headset_device, - &msm_itty_hs_mono_tx_device, - &msm_itty_hs_mono_rx_device, - &msm_ispeaker_tx_device, - &msm_ihs_stereo_speaker_stereo_rx_device, - &msm_a2dp_rx_device, - &msm_a2dp_tx_device, - &msm_snddev_mi2s_stereo_rx_device, - &msm_snddev_mi2s_fm_tx_device, - &msm_uplink_rx_device, -}; - -static struct platform_device *snd_devices_fluid[] __initdata = { - &msm_ihs_stereo_rx_device, - &msm_ihs_mono_rx_device, - &msm_ihs_mono_tx_device, - &msm_ispeaker_rx_device, - &msm_ispeaker_tx_device, - &msm_fluid_imic_tx_device, - &msm_fluid_iearpeice_rx_device, - &msm_fluid_idual_mic_endfire_device, - &msm_fluid_spk_idual_mic_endfire_device, - &msm_a2dp_rx_device, - &msm_a2dp_tx_device, - &msm_snddev_mi2s_stereo_rx_device, - &msm_uplink_rx_device, - &msm_ifmradio_speaker_device, - &msm_ifmradio_headset_device, -}; - -#ifdef CONFIG_DEBUG_FS -static void snddev_hsed_config_modify_setting(int type) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_ihs_ffa_stereo_rx_device; - icodec_data = (struct snddev_icodec_data *)device->dev.platform_data; - - if (icodec_data) { - if (type == 1) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_ffa_stereo_rx_class_d_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_ffa_stereo_rx_class_d_legacy_settings); - } else if (type == 2) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_ffa_stereo_rx_class_ab_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_ffa_stereo_rx_class_ab_legacy_settings); - } - } -} - -static void snddev_hsed_config_restore_setting(void) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_ihs_ffa_stereo_rx_device; - icodec_data = (struct snddev_icodec_data *)device->dev.platform_data; - - if (icodec_data) { - icodec_data->voltage_on = msm_snddev_hsed_voltage_on; - icodec_data->voltage_off = msm_snddev_hsed_voltage_off; - icodec_data->profile->settings = ihs_ffa_stereo_rx_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_ffa_stereo_rx_settings); - } -} - -static ssize_t snddev_hsed_config_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char cmd; - - if (get_user(cmd, ubuf)) - return -EFAULT; - - if (!strcmp(lb_str, "msm_hsed_config")) { - switch (cmd) { - case '0': - snddev_hsed_config_restore_setting(); - break; - - case '1': - snddev_hsed_config_modify_setting(1); - break; - - case '2': - snddev_hsed_config_modify_setting(2); - break; - - default: - break; - } - } - return cnt; -} - -static int snddev_hsed_config_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static const struct file_operations snddev_hsed_config_debug_fops = { - .open = snddev_hsed_config_debug_open, - .write = snddev_hsed_config_debug_write -}; -#endif - -void __ref msm_snddev_init(void) -{ - if (machine_is_msm7x30_ffa() || machine_is_msm8x55_ffa() || - machine_is_msm8x55_svlte_ffa()) { - platform_add_devices(snd_devices_ffa, - ARRAY_SIZE(snd_devices_ffa)); -#ifdef CONFIG_DEBUG_FS - debugfs_hsed_config = debugfs_create_file("msm_hsed_config", - S_IFREG | S_IRUGO, NULL, - (void *) "msm_hsed_config", &snddev_hsed_config_debug_fops); -#endif - } else if (machine_is_msm7x30_surf() || machine_is_msm8x55_surf() || - machine_is_msm8x55_svlte_surf()) - platform_add_devices(snd_devices_surf, - ARRAY_SIZE(snd_devices_surf)); - else if (machine_is_msm7x30_fluid()) - platform_add_devices(snd_devices_fluid, - ARRAY_SIZE(snd_devices_fluid)); - else - pr_err("%s: Unknown machine type\n", __func__); -} diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_data_timpani.c b/arch/arm/mach-msm/qdsp5v2/snddev_data_timpani.c deleted file mode 100644 index a4e4dad34fb8..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_data_timpani.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "timpani_profile_7x30.h" -#include - -/* define the value for BT_SCO */ -#define BT_SCO_PCM_CTL_VAL (PCM_CTL__RPCM_WIDTH__LINEAR_V |\ - PCM_CTL__TPCM_WIDTH__LINEAR_V) -#define BT_SCO_DATA_FORMAT_PADDING (DATA_FORMAT_PADDING_INFO__RPCM_FORMAT_V |\ - DATA_FORMAT_PADDING_INFO__TPCM_FORMAT_V) -#define BT_SCO_AUX_CODEC_INTF AUX_CODEC_INTF_CTL__PCMINTF_DATA_EN_V - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_hsed_config; -static void snddev_hsed_config_modify_setting(int type); -static void snddev_hsed_config_restore_setting(void); -#endif - -static struct adie_codec_action_unit iearpiece_ffa_48KHz_osr256_actions[] = - EAR_PRI_MONO_8000_OSR_256; /* 8000 profile also works for 48k */ - -static struct adie_codec_hwsetting_entry iearpiece_ffa_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iearpiece_ffa_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(iearpiece_ffa_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iearpiece_ffa_profile = { - .path_type = ADIE_CODEC_RX, - .settings = iearpiece_ffa_settings, - .setting_sz = ARRAY_SIZE(iearpiece_ffa_settings), -}; - -static struct snddev_icodec_data snddev_iearpiece_ffa_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_SPKR, - .profile = &iearpiece_ffa_profile, - .channel_mode = 1, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .property = SIDE_TONE_MASK, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -1400, - .min_voice_rx_vol[VOC_WB_INDEX] = -2900, -}; - -static struct platform_device msm_iearpiece_ffa_device = { - .name = "snddev_icodec", - .id = 19, - .dev = { .platform_data = &snddev_iearpiece_ffa_data }, -}; - -static struct adie_codec_action_unit imic_ffa_48KHz_osr256_actions[] = - AMIC_PRI_MONO_8000_OSR_256; /* 8000 profile also works for 48k */ - -static struct adie_codec_hwsetting_entry imic_ffa_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = imic_ffa_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_ffa_48KHz_osr256_actions), - } -}; - -static enum hsed_controller imic_pmctl_id[] = {PM_HSED_CONTROLLER_0}; - -static struct adie_codec_dev_profile imic_ffa_profile = { - .path_type = ADIE_CODEC_TX, - .settings = imic_ffa_settings, - .setting_sz = ARRAY_SIZE(imic_ffa_settings), -}; - -static struct snddev_icodec_data snddev_imic_ffa_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC, - .profile = &imic_ffa_profile, - .channel_mode = 1, - .pmctl_id = imic_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(imic_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_imic_ffa_device = { - .name = "snddev_icodec", - .id = 20, - .dev = { .platform_data = &snddev_imic_ffa_data }, -}; - -static struct adie_codec_action_unit ispkr_stereo_48KHz_osr256_actions[] = - SPEAKER_PRI_STEREO_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ispkr_stereo_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ispkr_stereo_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispkr_stereo_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ispkr_stereo_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ispkr_stereo_settings, - .setting_sz = ARRAY_SIZE(ispkr_stereo_settings), -}; - -static struct snddev_icodec_data snddev_ispkr_stereo_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "speaker_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_STEREO, - .profile = &ispkr_stereo_profile, - .channel_mode = 2, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .max_voice_rx_vol[VOC_NB_INDEX] = 1000, - .min_voice_rx_vol[VOC_NB_INDEX] = -500, - .max_voice_rx_vol[VOC_WB_INDEX] = 1000, - .min_voice_rx_vol[VOC_WB_INDEX] = -500 -}; - -static struct platform_device msm_ispkr_stereo_device = { - .name = "snddev_icodec", - .id = 8, - .dev = { .platform_data = &snddev_ispkr_stereo_data }, -}; - -static struct adie_codec_action_unit iheadset_mic_tx_osr256_actions[] = - AMIC1_HEADSET_TX_MONO_PRIMARY_OSR256; - -static struct adie_codec_hwsetting_entry iheadset_mic_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iheadset_mic_tx_osr256_actions, - .action_sz = ARRAY_SIZE(iheadset_mic_tx_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iheadset_mic_profile = { - .path_type = ADIE_CODEC_TX, - .settings = iheadset_mic_tx_settings, - .setting_sz = ARRAY_SIZE(iheadset_mic_tx_settings), -}; - -static struct snddev_icodec_data snddev_headset_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "headset_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_MIC, - .profile = &iheadset_mic_profile, - .channel_mode = 1, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_headset_mic_device = { - .name = "snddev_icodec", - .id = 6, - .dev = { .platform_data = &snddev_headset_mic_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_fm_tx_data = { - .capability = SNDDEV_CAP_TX , - .name = "fmradio_stereo_tx", - .copp_id = 2, - .acdb_id = ACDB_ID_FM_TX, - .channel_mode = 2, - .sd_lines = MI2S_SD_3, - .route = NULL, - .deroute = NULL, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_mi2s_fm_tx_device = { - .name = "snddev_mi2s", - .id = 1, - .dev = { .platform_data = &snddev_mi2s_fm_tx_data}, -}; - -static struct snddev_mi2s_data snddev_mi2s_fm_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "fmradio_stereo_rx", - .copp_id = 3, - .acdb_id = ACDB_ID_FM_RX, - .channel_mode = 2, - .sd_lines = MI2S_SD_3, - .route = NULL, - .deroute = NULL, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_mi2s_fm_rx_device = { - .name = "snddev_mi2s", - .id = 2, - .dev = { .platform_data = &snddev_mi2s_fm_rx_data}, -}; - -static struct snddev_ecodec_data snddev_bt_sco_earpiece_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "bt_sco_rx", - .copp_id = 1, - .acdb_id = ACDB_ID_BT_SCO_SPKR, - .channel_mode = 1, - .conf_pcm_ctl_val = BT_SCO_PCM_CTL_VAL, - .conf_aux_codec_intf = BT_SCO_AUX_CODEC_INTF, - .conf_data_format_padding_val = BT_SCO_DATA_FORMAT_PADDING, - .max_voice_rx_vol[VOC_NB_INDEX] = 400, - .min_voice_rx_vol[VOC_NB_INDEX] = -1100, - .max_voice_rx_vol[VOC_WB_INDEX] = 400, - .min_voice_rx_vol[VOC_WB_INDEX] = -1100, -}; - -static struct snddev_ecodec_data snddev_bt_sco_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "bt_sco_tx", - .copp_id = 1, - .acdb_id = ACDB_ID_BT_SCO_MIC, - .channel_mode = 1, - .conf_pcm_ctl_val = BT_SCO_PCM_CTL_VAL, - .conf_aux_codec_intf = BT_SCO_AUX_CODEC_INTF, - .conf_data_format_padding_val = BT_SCO_DATA_FORMAT_PADDING, -}; - -static struct platform_device msm_bt_sco_earpiece_device = { - .name = "msm_snddev_ecodec", - .id = 0, - .dev = { .platform_data = &snddev_bt_sco_earpiece_data }, -}; - -static struct platform_device msm_bt_sco_mic_device = { - .name = "msm_snddev_ecodec", - .id = 1, - .dev = { .platform_data = &snddev_bt_sco_mic_data }, -}; - -static struct adie_codec_action_unit headset_ab_cpls_48KHz_osr256_actions[] = - HEADSET_AB_CPLS_48000_OSR_256; - -static struct adie_codec_hwsetting_entry headset_ab_cpls_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = headset_ab_cpls_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(headset_ab_cpls_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile headset_ab_cpls_profile = { - .path_type = ADIE_CODEC_RX, - .settings = headset_ab_cpls_settings, - .setting_sz = ARRAY_SIZE(headset_ab_cpls_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_STEREO, - .profile = &headset_ab_cpls_profile, - .channel_mode = 2, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .property = SIDE_TONE_MASK, - .voltage_on = msm_snddev_hsed_voltage_on, - .voltage_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, -}; - -static struct platform_device msm_headset_stereo_device = { - .name = "snddev_icodec", - .id = 2, - .dev = { .platform_data = &snddev_ihs_stereo_rx_data }, -}; - -/*debug FS interface is exposed to test Class D and class AB mode - * amplifers for headset device folloowing options are supported - * 0 -> settings will be restored - * 1 -> Cladd D mode is selected - * 2 -> Class AB mode is selected -*/ -#ifdef CONFIG_DEBUG_FS -static struct adie_codec_action_unit - ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions[] = - HPH_PRI_D_LEG_STEREO; - -static struct adie_codec_hwsetting_entry - ihs_stereo_rx_class_d_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions), - } -}; - -static struct adie_codec_action_unit - ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions[] = - HPH_PRI_AB_LEG_STEREO; - -static struct adie_codec_hwsetting_entry - ihs_stereo_rx_class_ab_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions), - } -}; - -static void snddev_hsed_config_modify_setting(int type) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_headset_stereo_device; - icodec_data = (struct snddev_icodec_data *)device->dev.platform_data; - - if (icodec_data) { - if (type == 1) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_stereo_rx_class_d_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_stereo_rx_class_d_legacy_settings); - } else if (type == 2) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_stereo_rx_class_ab_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_stereo_rx_class_ab_legacy_settings); - } - } -} - -static void snddev_hsed_config_restore_setting(void) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_headset_stereo_device; - icodec_data = device->dev.platform_data; - - if (icodec_data) { - icodec_data->voltage_on = msm_snddev_hsed_voltage_on; - icodec_data->voltage_off = msm_snddev_hsed_voltage_off; - icodec_data->profile->settings = headset_ab_cpls_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(headset_ab_cpls_settings); - } -} - -static ssize_t snddev_hsed_config_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char cmd; - - if (get_user(cmd, ubuf)) - return -EFAULT; - - if (!strcmp(lb_str, "msm_hsed_config")) { - switch (cmd) { - case '0': - snddev_hsed_config_restore_setting(); - break; - - case '1': - snddev_hsed_config_modify_setting(1); - break; - - case '2': - snddev_hsed_config_modify_setting(2); - break; - - default: - break; - } - } - return cnt; -} - -static int snddev_hsed_config_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static const struct file_operations snddev_hsed_config_debug_fops = { - .open = snddev_hsed_config_debug_open, - .write = snddev_hsed_config_debug_write -}; -#endif - -static enum hsed_controller ispk_pmctl_id[] = {PM_HSED_CONTROLLER_0}; - -static struct snddev_icodec_data snddev_ispkr_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC, - .profile = &imic_ffa_profile, - .channel_mode = 1, - .pmctl_id = ispk_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(ispk_pmctl_id), - .default_sample_rate = 48000, - .pamp_on = msm_snddev_tx_route_config, - .pamp_off = msm_snddev_tx_route_deconfig, -}; - -static struct platform_device msm_ispkr_mic_device = { - .name = "snddev_icodec", - .id = 18, - .dev = { .platform_data = &snddev_ispkr_mic_data }, -}; - -static struct adie_codec_action_unit idual_mic_endfire_8KHz_osr256_actions[] = - AMIC_DUAL_8000_OSR_256; - -static struct adie_codec_hwsetting_entry idual_mic_endfire_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = idual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_endfire_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile idual_mic_endfire_profile = { - .path_type = ADIE_CODEC_TX, - .settings = idual_mic_endfire_settings, - .setting_sz = ARRAY_SIZE(idual_mic_endfire_settings), -}; - -static enum hsed_controller idual_mic_endfire_pmctl_id[] = { - PM_HSED_CONTROLLER_0, PM_HSED_CONTROLLER_2 -}; - -static struct snddev_icodec_data snddev_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC_ENDFIRE, - .profile = &idual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 12, - .dev = { .platform_data = &snddev_idual_mic_endfire_data }, -}; - -static struct snddev_icodec_data snddev_spk_idual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_endfire_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_ENDFIRE, - .profile = &idual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_spk_idual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 14, - .dev = { .platform_data = &snddev_spk_idual_mic_endfire_data }, -}; - -static struct adie_codec_action_unit itty_mono_tx_actions[] = - TTY_HEADSET_MONO_TX_8000_OSR_256; - -static struct adie_codec_hwsetting_entry itty_mono_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_mono_tx_actions, - .action_sz = ARRAY_SIZE(itty_mono_tx_actions), - }, -}; - -static struct adie_codec_dev_profile itty_mono_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = itty_mono_tx_settings, - .setting_sz = ARRAY_SIZE(itty_mono_tx_settings), -}; - -static struct snddev_icodec_data snddev_itty_mono_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_TTY_HEADSET_MIC, - .profile = &itty_mono_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pmctl_id = NULL, - .pmctl_id_sz = 0, - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_itty_mono_tx_device = { - .name = "snddev_icodec", - .id = 16, - .dev = { .platform_data = &snddev_itty_mono_tx_data }, -}; - -static struct adie_codec_action_unit itty_mono_rx_actions[] = - TTY_HEADSET_MONO_RX_8000_OSR_256; - -static struct adie_codec_hwsetting_entry itty_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_mono_rx_actions, - .action_sz = ARRAY_SIZE(itty_mono_rx_actions), - }, -}; - -static struct adie_codec_dev_profile itty_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = itty_mono_rx_settings, - .setting_sz = ARRAY_SIZE(itty_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_itty_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_TTY_HEADSET_SPKR, - .profile = &itty_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = NULL, - .pamp_off = NULL, - .max_voice_rx_vol[VOC_NB_INDEX] = 0, - .min_voice_rx_vol[VOC_NB_INDEX] = 0, - .max_voice_rx_vol[VOC_WB_INDEX] = 0, - .min_voice_rx_vol[VOC_WB_INDEX] = 0, -}; - -static struct platform_device msm_itty_mono_rx_device = { - .name = "snddev_icodec", - .id = 17, - .dev = { .platform_data = &snddev_itty_mono_rx_data }, -}; - -static struct snddev_virtual_data snddev_a2dp_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "a2dp_tx", - .copp_id = 5, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct snddev_virtual_data snddev_a2dp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "a2dp_rx", - .copp_id = 2, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct platform_device msm_a2dp_rx_device = { - .name = "snddev_virtual", - .id = 0, - .dev = { .platform_data = &snddev_a2dp_rx_data }, -}; - -static struct platform_device msm_a2dp_tx_device = { - .name = "snddev_virtual", - .id = 1, - .dev = { .platform_data = &snddev_a2dp_tx_data }, -}; - -static struct snddev_virtual_data snddev_uplink_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "uplink_rx", - .copp_id = 5, - .acdb_id = PSEUDO_ACDB_ID, -}; - -static struct platform_device msm_uplink_rx_device = { - .name = "snddev_virtual", - .id = 2, - .dev = { .platform_data = &snddev_uplink_rx_data }, -}; - -static struct snddev_icodec_data\ - snddev_idual_mic_endfire_real_stereo_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx_real_stereo", - .copp_id = 0, - .acdb_id = PSEUDO_ACDB_ID, - .profile = &idual_mic_endfire_profile, - .channel_mode = REAL_STEREO_CHANNEL_MODE, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_endfire_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_endfire_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_real_stereo_tx_device = { - .name = "snddev_icodec", - .id = 26, - .dev = { .platform_data = - &snddev_idual_mic_endfire_real_stereo_data }, -}; - -static struct adie_codec_action_unit ihs_ffa_mono_rx_48KHz_osr256_actions[] = - HEADSET_RX_CAPLESS_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ihs_ffa_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_ffa_mono_rx_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ihs_ffa_mono_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_ffa_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_ffa_mono_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_ffa_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_ffa_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_mono_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_SPKR_MONO, - .profile = &ihs_ffa_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_hsed_voltage_on, - .pamp_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -700, - .min_voice_rx_vol[VOC_NB_INDEX] = -2200, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, - .property = SIDE_TONE_MASK, -}; - -static struct platform_device msm_ihs_ffa_mono_rx_device = { - .name = "snddev_icodec", - .id = 5, - .dev = { .platform_data = &snddev_ihs_ffa_mono_rx_data }, -}; - -static struct adie_codec_action_unit - ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions[] = - HEADSET_STEREO_SPEAKER_STEREO_RX_CAPLESS_48000_OSR_256; - - -static struct adie_codec_hwsetting_entry - ihs_stereo_speaker_stereo_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions, - .action_sz = - ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_stereo_speaker_stereo_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_stereo_speaker_stereo_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_speaker_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_speaker_stereo_rx", - .copp_id = 0, - .acdb_id = ACDB_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX, - .profile = &ihs_stereo_speaker_stereo_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .voltage_on = msm_snddev_hsed_voltage_on, - .voltage_off = msm_snddev_hsed_voltage_off, - .max_voice_rx_vol[VOC_NB_INDEX] = -500, - .min_voice_rx_vol[VOC_NB_INDEX] = -2000, - .max_voice_rx_vol[VOC_WB_INDEX] = -900, - .min_voice_rx_vol[VOC_WB_INDEX] = -2400, -}; - -static struct platform_device msm_ihs_stereo_speaker_stereo_rx_device = { - .name = "snddev_icodec", - .id = 21, - .dev = { .platform_data = &snddev_ihs_stereo_speaker_stereo_rx_data }, -}; - -static struct adie_codec_action_unit ispk_dual_mic_bs_8KHz_osr256_actions[] = - HS_DMIC2_STEREO_8000_OSR_256; - -static struct adie_codec_hwsetting_entry ispk_dual_mic_bs_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16Khz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 48KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = ispk_dual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispk_dual_mic_bs_8KHz_osr256_actions), - }, -}; - -static enum hsed_controller idual_mic_broadside_pmctl_id[] = { - PM_HSED_CONTROLLER_0, PM_HSED_CONTROLLER_2 -}; - -static struct adie_codec_dev_profile ispk_dual_mic_bs_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ispk_dual_mic_bs_settings, - .setting_sz = ARRAY_SIZE(ispk_dual_mic_bs_settings), -}; -static struct snddev_icodec_data snddev_spk_idual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_broadside_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_SPKR_PHONE_MIC_BROADSIDE, - .profile = &ispk_dual_mic_bs_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_broadside_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_broadside_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_spk_idual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 15, - .dev = { .platform_data = &snddev_spk_idual_mic_broadside_data }, -}; - -static struct adie_codec_action_unit idual_mic_bs_8KHz_osr256_actions[] = - HS_DMIC2_STEREO_8000_OSR_256; - -static struct adie_codec_hwsetting_entry idual_mic_broadside_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 16000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - }, /* 8KHz profile can be used for 16KHz */ - { - .freq_plan = 48000, - .osr = 256, - .actions = idual_mic_bs_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idual_mic_bs_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile idual_mic_broadside_profile = { - .path_type = ADIE_CODEC_TX, - .settings = idual_mic_broadside_settings, - .setting_sz = ARRAY_SIZE(idual_mic_broadside_settings), -}; - -static struct snddev_icodec_data snddev_idual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_broadside_tx", - .copp_id = 0, - .acdb_id = ACDB_ID_HANDSET_MIC_BROADSIDE, - .profile = &idual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pmctl_id = idual_mic_broadside_pmctl_id, - .pmctl_id_sz = ARRAY_SIZE(idual_mic_broadside_pmctl_id), - .pamp_on = NULL, - .pamp_off = NULL, -}; - -static struct platform_device msm_idual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 13, - .dev = { .platform_data = &snddev_idual_mic_broadside_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_stereo_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "hdmi_stereo_rx", - .copp_id = 3, - .acdb_id = ACDB_ID_HDMI, - .channel_mode = 2, - .sd_lines = MI2S_SD_0, - .route = msm_snddev_tx_route_config, - .deroute = msm_snddev_tx_route_deconfig, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_mi2s_stereo_rx_device = { - .name = "snddev_mi2s", - .id = 0, - .dev = { .platform_data = &snddev_mi2s_stereo_rx_data }, -}; - -static struct adie_codec_action_unit auxpga_lb_lo_actions[] = - LB_AUXPGA_LO_STEREO; - -static struct adie_codec_hwsetting_entry auxpga_lb_lo_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = auxpga_lb_lo_actions, - .action_sz = ARRAY_SIZE(auxpga_lb_lo_actions), - }, -}; - -static struct adie_codec_dev_profile auxpga_lb_lo_profile = { - .path_type = ADIE_CODEC_LB, - .settings = auxpga_lb_lo_settings, - .setting_sz = ARRAY_SIZE(auxpga_lb_lo_settings), -}; - -static struct snddev_icodec_data snddev_auxpga_lb_lo_data = { - .capability = SNDDEV_CAP_LB, - .name = "auxpga_loopback_lo", - .copp_id = 0, - .acdb_id = PSEUDO_ACDB_ID, - .profile = &auxpga_lb_lo_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_ANALOG, -}; - -static struct platform_device msm_auxpga_lb_lo_device = { - .name = "snddev_icodec", - .id = 27, - .dev = { .platform_data = &snddev_auxpga_lb_lo_data }, -}; - -static struct adie_codec_action_unit auxpga_lb_hs_actions[] = - LB_AUXPGA_HPH_AB_CPLS_STEREO; - -static struct adie_codec_hwsetting_entry auxpga_lb_hs_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = auxpga_lb_hs_actions, - .action_sz = ARRAY_SIZE(auxpga_lb_hs_actions), - }, -}; - -static struct adie_codec_dev_profile auxpga_lb_hs_profile = { - .path_type = ADIE_CODEC_LB, - .settings = auxpga_lb_hs_settings, - .setting_sz = ARRAY_SIZE(auxpga_lb_hs_settings), -}; - -static struct snddev_icodec_data snddev_auxpga_lb_hs_data = { - .capability = SNDDEV_CAP_LB, - .name = "auxpga_loopback_hs", - .copp_id = 0, - .acdb_id = PSEUDO_ACDB_ID, - .profile = &auxpga_lb_hs_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_hsed_voltage_on, - .voltage_off = msm_snddev_hsed_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_ANALOG, -}; - -static struct platform_device msm_auxpga_lb_hs_device = { - .name = "snddev_icodec", - .id = 25, - .dev = { .platform_data = &snddev_auxpga_lb_hs_data }, -}; - -static struct platform_device *snd_devices_ffa[] __initdata = { - &msm_iearpiece_ffa_device, - &msm_imic_ffa_device, - &msm_ispkr_stereo_device, - &msm_headset_mic_device, - &msm_ihs_ffa_mono_rx_device, - &msm_snddev_mi2s_fm_rx_device, - &msm_snddev_mi2s_fm_tx_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_ispkr_mic_device, - &msm_headset_stereo_device, - &msm_idual_mic_endfire_device, - &msm_spk_idual_mic_endfire_device, - &msm_itty_mono_tx_device, - &msm_itty_mono_rx_device, - &msm_a2dp_rx_device, - &msm_a2dp_tx_device, - &msm_uplink_rx_device, - &msm_real_stereo_tx_device, - &msm_ihs_stereo_speaker_stereo_rx_device, - &msm_spk_idual_mic_broadside_device, - &msm_idual_mic_broadside_device, - &msm_snddev_mi2s_stereo_rx_device, - &msm_auxpga_lb_hs_device, - &msm_auxpga_lb_lo_device, -}; - -void __ref msm_snddev_init_timpani(void) -{ - platform_add_devices(snd_devices_ffa, - ARRAY_SIZE(snd_devices_ffa)); -#ifdef CONFIG_DEBUG_FS - debugfs_hsed_config = debugfs_create_file("msm_hsed_config", - S_IFREG | S_IWUGO, NULL, - (void *) "msm_hsed_config", &snddev_hsed_config_debug_fops); - if (!debugfs_hsed_config) - pr_err("failed to create msm_head_config debug fs entry\n"); -#endif - -} diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_ecodec.c b/arch/arm/mach-msm/qdsp5v2/snddev_ecodec.c deleted file mode 100644 index d8009aa2460c..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_ecodec.c +++ /dev/null @@ -1,484 +0,0 @@ -/* Copyright (c) 2009,2011 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Context for each external codec device */ -struct snddev_ecodec_state { - struct snddev_ecodec_data *data; - u32 sample_rate; - bool enabled; -}; - -/* Global state for the driver */ -struct snddev_ecodec_drv_state { - struct mutex dev_lock; - u32 rx_active; /* ensure one rx device at a time */ - u32 tx_active; /* ensure one tx device at a time */ - struct clk *lpa_core_clk; - struct clk *ecodec_clk; -}; - -#define ADSP_CTL 1 - -static struct snddev_ecodec_drv_state snddev_ecodec_drv; - -static int snddev_ecodec_open_rx(struct snddev_ecodec_state *ecodec) -{ - int rc = 0; - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - struct msm_afe_config afe_config; - int ret = 0; - - MM_DBG("snddev_ecodec_open_rx\n"); - - if (!drv->tx_active) { - /* request GPIO */ - rc = aux_pcm_gpios_request(); - if (rc) { - MM_ERR("GPIO enable failed\n"); - goto done; - } - /* config clocks */ - clk_prepare_enable(drv->lpa_core_clk); - - /*if long sync is selected in aux PCM interface - ecodec clock is updated to work with 128KHz, - if short sync is selected ecodec clock is updated to - work with 2.048MHz frequency, actual clock output is - different than the SW configuration by factor of two*/ - if (!(ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_CODEC_MODE__I2S_V)) { - if (ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_PCM_MODE__AUX_MASTER_V) { - MM_DBG("Update ecodec clock to 128 KHz, long " - "sync in master mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 256000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 128KHz\n"); - } else if (ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_PCM_MODE__PRIM_SLAVE_V) { - MM_DBG("Update ecodec clock to 2 MHz, short" - " sync in slave mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 4096000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 2.048MHz\n"); - } else { - MM_DBG("Update ecodec clock to 2 MHz, short" - " sync in master mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 4096000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 2.048MHz\n"); - } - } - - /* enable ecodec clk */ - clk_prepare_enable(drv->ecodec_clk); - - /* let ADSP confiure AUX PCM regs */ - aux_codec_adsp_codec_ctl_en(ADSP_CTL); - - /* let adsp configure pcm path */ - aux_codec_pcm_path_ctl_en(ADSP_CTL); - - /* choose ADSP_A */ - audio_interct_aux_regsel(AUDIO_ADSP_A); - audio_interct_tpcm_source(AUDIO_ADSP_A); - audio_interct_rpcm_source(AUDIO_ADSP_A); - - clk_disable_unprepare(drv->lpa_core_clk); - - /* send AUX_CODEC_CONFIG to AFE */ - rc = afe_config_aux_codec(ecodec->data->conf_pcm_ctl_val, - ecodec->data->conf_aux_codec_intf, - ecodec->data->conf_data_format_padding_val); - if (IS_ERR_VALUE(rc)) - goto error; - } - /* send CODEC CONFIG to AFE */ - afe_config.sample_rate = ecodec->sample_rate / 1000; - afe_config.channel_mode = ecodec->data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - rc = afe_enable(AFE_HW_PATH_AUXPCM_RX, &afe_config); - if (IS_ERR_VALUE(rc)) { - if (!drv->tx_active) { - aux_pcm_gpios_free(); - clk_disable_unprepare(drv->ecodec_clk); - } - goto done; - } - - ecodec->enabled = 1; - return 0; - -error: - aux_pcm_gpios_free(); - clk_disable_unprepare(drv->ecodec_clk); -done: - return rc; -} - -static int snddev_ecodec_close_rx(struct snddev_ecodec_state *ecodec) -{ - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - - /* free GPIO */ - if (!drv->tx_active) { - aux_pcm_gpios_free(); - clk_disable_unprepare(drv->ecodec_clk); - } - - /* disable AFE */ - afe_disable(AFE_HW_PATH_AUXPCM_RX); - - ecodec->enabled = 0; - - return 0; -} - -static int snddev_ecodec_open_tx(struct snddev_ecodec_state *ecodec) -{ - int rc = 0; - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - struct msm_afe_config afe_config; - int ret = 0; - - MM_DBG("snddev_ecodec_open_tx\n"); - - /* request GPIO */ - if (!drv->rx_active) { - rc = aux_pcm_gpios_request(); - if (rc) { - MM_ERR("GPIO enable failed\n"); - goto done; - } - /* config clocks */ - clk_prepare_enable(drv->lpa_core_clk); - - /*if long sync is selected in aux PCM interface - ecodec clock is updated to work with 128KHz, - if short sync is selected ecodec clock is updated to - work with 2.048MHz frequency, actual clock output is - different than the SW configuration by factor of two*/ - if (!(ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_CODEC_MODE__I2S_V)) { - if (ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_PCM_MODE__AUX_MASTER_V) { - MM_DBG("Update ecodec clock to 128 KHz, long " - "sync in master mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 256000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 128KHz\n"); - } else if (ecodec->data->conf_aux_codec_intf & - AUX_CODEC_CTL__AUX_PCM_MODE__PRIM_SLAVE_V) { - MM_DBG("Update ecodec clock to 2 MHz, short" - " sync in slave mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 4096000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 2.048MHz\n"); - } else { - MM_DBG("Update ecodec clock to 2 MHz, short" - " sync in master mode is selected\n"); - ret = clk_set_rate(drv->ecodec_clk, 4096000); - if (ret < 0) - MM_ERR("Error updating ecodec clock" - " to 2.048MHz\n"); - } - } - - /* enable ecodec clk */ - clk_prepare_enable(drv->ecodec_clk); - - /* let ADSP confiure AUX PCM regs */ - aux_codec_adsp_codec_ctl_en(ADSP_CTL); - - /* let adsp configure pcm path */ - aux_codec_pcm_path_ctl_en(ADSP_CTL); - - /* choose ADSP_A */ - audio_interct_aux_regsel(AUDIO_ADSP_A); - audio_interct_tpcm_source(AUDIO_ADSP_A); - audio_interct_rpcm_source(AUDIO_ADSP_A); - - clk_disable_unprepare(drv->lpa_core_clk); - - /* send AUX_CODEC_CONFIG to AFE */ - rc = afe_config_aux_codec(ecodec->data->conf_pcm_ctl_val, - ecodec->data->conf_aux_codec_intf, - ecodec->data->conf_data_format_padding_val); - if (IS_ERR_VALUE(rc)) - goto error; - } - /* send CODEC CONFIG to AFE */ - afe_config.sample_rate = ecodec->sample_rate / 1000; - afe_config.channel_mode = ecodec->data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - rc = afe_enable(AFE_HW_PATH_AUXPCM_TX, &afe_config); - if (IS_ERR_VALUE(rc)) { - if (!drv->rx_active) { - aux_pcm_gpios_free(); - clk_disable_unprepare(drv->ecodec_clk); - } - goto done; - } - - ecodec->enabled = 1; - return 0; - -error: - clk_disable_unprepare(drv->ecodec_clk); - aux_pcm_gpios_free(); -done: - return rc; -} - -static int snddev_ecodec_close_tx(struct snddev_ecodec_state *ecodec) -{ - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - - /* free GPIO */ - if (!drv->rx_active) { - aux_pcm_gpios_free(); - clk_disable_unprepare(drv->ecodec_clk); - } - - /* disable AFE */ - afe_disable(AFE_HW_PATH_AUXPCM_TX); - - ecodec->enabled = 0; - - return 0; -} - - -static int snddev_ecodec_open(struct msm_snddev_info *dev_info) -{ - int rc = 0; - struct snddev_ecodec_state *ecodec; - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - - if (!dev_info) { - rc = -EINVAL; - goto error; - } - - ecodec = dev_info->private_data; - - if (ecodec->data->capability & SNDDEV_CAP_RX) { - mutex_lock(&drv->dev_lock); - if (drv->rx_active) { - mutex_unlock(&drv->dev_lock); - rc = -EBUSY; - goto error; - } - rc = snddev_ecodec_open_rx(ecodec); - if (!IS_ERR_VALUE(rc)) - drv->rx_active = 1; - mutex_unlock(&drv->dev_lock); - } else { - mutex_lock(&drv->dev_lock); - if (drv->tx_active) { - mutex_unlock(&drv->dev_lock); - rc = -EBUSY; - goto error; - } - rc = snddev_ecodec_open_tx(ecodec); - if (!IS_ERR_VALUE(rc)) - drv->tx_active = 1; - mutex_unlock(&drv->dev_lock); - } -error: - return rc; -} - -static int snddev_ecodec_close(struct msm_snddev_info *dev_info) -{ - int rc = 0; - struct snddev_ecodec_state *ecodec; - struct snddev_ecodec_drv_state *drv = &snddev_ecodec_drv; - if (!dev_info) { - rc = -EINVAL; - goto error; - } - - ecodec = dev_info->private_data; - - if (ecodec->data->capability & SNDDEV_CAP_RX) { - mutex_lock(&drv->dev_lock); - if (!drv->rx_active) { - mutex_unlock(&drv->dev_lock); - rc = -EPERM; - goto error; - } - rc = snddev_ecodec_close_rx(ecodec); - if (!IS_ERR_VALUE(rc)) - drv->rx_active = 0; - mutex_unlock(&drv->dev_lock); - } else { - mutex_lock(&drv->dev_lock); - if (!drv->tx_active) { - mutex_unlock(&drv->dev_lock); - rc = -EPERM; - goto error; - } - rc = snddev_ecodec_close_tx(ecodec); - if (!IS_ERR_VALUE(rc)) - drv->tx_active = 0; - mutex_unlock(&drv->dev_lock); - } - -error: - return rc; -} - -static int snddev_ecodec_set_freq(struct msm_snddev_info *dev_info, u32 rate) -{ - int rc = 0; - - if (!dev_info) { - rc = -EINVAL; - goto error; - } - return 8000; - -error: - return rc; -} - -static int snddev_ecodec_probe(struct platform_device *pdev) -{ - int rc = 0, i; - struct snddev_ecodec_data *pdata; - struct msm_snddev_info *dev_info; - struct snddev_ecodec_state *ecodec; - - if (!pdev || !pdev->dev.platform_data) { - printk(KERN_ALERT "Invalid caller \n"); - rc = -1; - goto error; - } - pdata = pdev->dev.platform_data; - - ecodec = kzalloc(sizeof(struct snddev_ecodec_state), GFP_KERNEL); - if (!ecodec) { - rc = -ENOMEM; - goto error; - } - - dev_info = kzalloc(sizeof(struct msm_snddev_info), GFP_KERNEL); - if (!dev_info) { - kfree(ecodec); - rc = -ENOMEM; - goto error; - } - - dev_info->name = pdata->name; - dev_info->copp_id = pdata->copp_id; - dev_info->acdb_id = pdata->acdb_id; - dev_info->private_data = (void *) ecodec; - dev_info->dev_ops.open = snddev_ecodec_open; - dev_info->dev_ops.close = snddev_ecodec_close; - dev_info->dev_ops.set_freq = snddev_ecodec_set_freq; - dev_info->dev_ops.enable_sidetone = NULL; - dev_info->capability = pdata->capability; - dev_info->opened = 0; - - msm_snddev_register(dev_info); - ecodec->data = pdata; - ecodec->sample_rate = 8000; /* Default to 8KHz */ - if (pdata->capability & SNDDEV_CAP_RX) { - for (i = 0; i < VOC_RX_VOL_ARRAY_NUM; i++) { - dev_info->max_voc_rx_vol[i] = - pdata->max_voice_rx_vol[i]; - dev_info->min_voc_rx_vol[i] = - pdata->min_voice_rx_vol[i]; - } - } -error: - return rc; -} - -static int snddev_ecodec_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver snddev_ecodec_driver = { - .probe = snddev_ecodec_probe, - .remove = snddev_ecodec_remove, - .driver = { .name = "msm_snddev_ecodec" } -}; - -static int __init snddev_ecodec_init(void) -{ - int rc = 0; - struct snddev_ecodec_drv_state *ecodec_drv = &snddev_ecodec_drv; - - MM_INFO("snddev_ecodec_init\n"); - rc = platform_driver_register(&snddev_ecodec_driver); - if (IS_ERR_VALUE(rc)) - goto error_platform_driver; - ecodec_drv->ecodec_clk = clk_get(NULL, "ecodec_clk"); - if (IS_ERR(ecodec_drv->ecodec_clk)) - goto error_ecodec_clk; - ecodec_drv->lpa_core_clk = clk_get(NULL, "lpa_core_clk"); - if (IS_ERR(ecodec_drv->lpa_core_clk)) - goto error_lpa_core_clk; - - - mutex_init(&ecodec_drv->dev_lock); - ecodec_drv->rx_active = 0; - ecodec_drv->tx_active = 0; - return 0; - -error_lpa_core_clk: - clk_put(ecodec_drv->ecodec_clk); -error_ecodec_clk: - platform_driver_unregister(&snddev_ecodec_driver); -error_platform_driver: - - MM_ERR("encounter error\n"); - return -ENODEV; -} - -static void __exit snddev_ecodec_exit(void) -{ - struct snddev_ecodec_drv_state *ecodec_drv = &snddev_ecodec_drv; - - platform_driver_unregister(&snddev_ecodec_driver); - clk_put(ecodec_drv->ecodec_clk); - - return; -} - -module_init(snddev_ecodec_init); -module_exit(snddev_ecodec_exit); - -MODULE_DESCRIPTION("ECodec Sound Device driver"); -MODULE_VERSION("1.0"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c b/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c deleted file mode 100644 index cbb05872bb37..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_icodec.c +++ /dev/null @@ -1,1218 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SMPS_AUDIO_PLAYBACK_ID "AUPB" -#define SMPS_AUDIO_RECORD_ID "AURC" - -#define SNDDEV_ICODEC_PCM_SZ 32 /* 16 bit / sample stereo mode */ -#define SNDDEV_ICODEC_MUL_FACTOR 3 /* Multi by 8 Shift by 3 */ -#define SNDDEV_ICODEC_CLK_RATE(freq) \ - (((freq) * (SNDDEV_ICODEC_PCM_SZ)) << (SNDDEV_ICODEC_MUL_FACTOR)) - -#ifdef CONFIG_DEBUG_FS -static struct adie_codec_action_unit debug_rx_actions[] = - HANDSET_RX_8000_OSR_256; - -static struct adie_codec_action_unit debug_tx_lb_actions[] = { - { ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF }, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x01)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x80, 0x01, 0x00) }, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x8A, 0x30, 0x30)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x11, 0xfc, 0xfc)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x13, 0xfc, 0x58)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x14, 0xff, 0x65)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x15, 0xff, 0x64)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x82, 0xff, 0x5C)}, - { ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY }, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x0D, 0xF0, 0xd0)}, - { ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x14)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x86, 0xff, 0x00)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x8A, 0x50, 0x40)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x91, 0xFF, 0x01)}, /* Start loop back */ - { ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x8A, 0x10, 0x30)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x83, 0x14, 0x00)}, - { ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, - { ADIE_CODEC_ACTION_ENTRY, - ADIE_CODEC_PACK_ENTRY(0x11, 0xff, 0x00)} -}; - -static struct adie_codec_action_unit debug_tx_actions[] = - HANDSET_TX_8000_OSR_256; - -static struct adie_codec_hwsetting_entry debug_rx_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = debug_rx_actions, - .action_sz = ARRAY_SIZE(debug_rx_actions), - } -}; - -static struct adie_codec_hwsetting_entry debug_tx_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = debug_tx_actions, - .action_sz = ARRAY_SIZE(debug_tx_actions), - } -}; - -static struct adie_codec_hwsetting_entry debug_tx_lb_settings[] = { - { - .freq_plan = 8000, - .osr = 256, - .actions = debug_tx_lb_actions, - .action_sz = ARRAY_SIZE(debug_tx_lb_actions), - } -}; - -static struct adie_codec_dev_profile debug_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = debug_rx_settings, - .setting_sz = ARRAY_SIZE(debug_rx_settings), -}; - -static struct adie_codec_dev_profile debug_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = debug_tx_settings, - .setting_sz = ARRAY_SIZE(debug_tx_settings), -}; - -static struct adie_codec_dev_profile debug_tx_lb_profile = { - .path_type = ADIE_CODEC_TX, - .settings = debug_tx_lb_settings, - .setting_sz = ARRAY_SIZE(debug_tx_lb_settings), -}; -#endif /* CONFIG_DEBUG_FS */ - -/* Context for each internal codec sound device */ -struct snddev_icodec_state { - struct snddev_icodec_data *data; - struct adie_codec_path *adie_path; - u32 sample_rate; - u32 enabled; -}; - -/* Global state for the driver */ -struct snddev_icodec_drv_state { - struct mutex rx_lock; - struct mutex lb_lock; - struct mutex tx_lock; - u32 rx_active; /* ensure one rx device at a time */ - u32 tx_active; /* ensure one tx device at a time */ - struct clk *rx_mclk; - struct clk *rx_sclk; - struct clk *tx_mclk; - struct clk *tx_sclk; - struct clk *lpa_codec_clk; - struct clk *lpa_core_clk; - struct clk *lpa_p_clk; - struct lpa_drv *lpa; - - struct pm_qos_request rx_pm_qos_req; - struct pm_qos_request tx_pm_qos_req; -}; - -static struct snddev_icodec_drv_state snddev_icodec_drv; - -static int snddev_icodec_open_rx(struct snddev_icodec_state *icodec) -{ - int trc, err; - int smps_mode = PMAPP_SMPS_MODE_VOTE_PWM; - struct msm_afe_config afe_config; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - struct lpa_codec_config lpa_config; - - pm_qos_update_request(&drv->rx_pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - if ((icodec->data->acdb_id == ACDB_ID_HEADSET_SPKR_MONO) || - (icodec->data->acdb_id == ACDB_ID_HEADSET_SPKR_STEREO)) { - /* Vote PMAPP_SMPS_MODE_VOTE_PFM for headset */ - smps_mode = PMAPP_SMPS_MODE_VOTE_PFM; - MM_DBG("snddev_icodec_open_rx: PMAPP_SMPS_MODE_VOTE_PFM \n"); - } else - MM_DBG("snddev_icodec_open_rx: PMAPP_SMPS_MODE_VOTE_PWM \n"); - - /* Vote for SMPS mode*/ - err = pmapp_smps_mode_vote(SMPS_AUDIO_PLAYBACK_ID, - PMAPP_VREG_S4, smps_mode); - if (err != 0) - MM_ERR("pmapp_smps_mode_vote error %d\n", err); - - /* enable MI2S RX master block */ - /* enable MI2S RX bit clock */ - trc = clk_set_rate(drv->rx_mclk, - SNDDEV_ICODEC_CLK_RATE(icodec->sample_rate)); - if (IS_ERR_VALUE(trc)) - goto error_invalid_freq; - clk_prepare_enable(drv->rx_mclk); - clk_prepare_enable(drv->rx_sclk); - /* clk_set_rate(drv->lpa_codec_clk, 1); */ /* Remove if use pcom */ - clk_prepare_enable(drv->lpa_p_clk); - clk_prepare_enable(drv->lpa_codec_clk); - clk_prepare_enable(drv->lpa_core_clk); - - /* Enable LPA sub system - */ - drv->lpa = lpa_get(); - if (!drv->lpa) - goto error_lpa; - lpa_config.sample_rate = icodec->sample_rate; - lpa_config.sample_width = 16; - lpa_config.output_interface = LPA_OUTPUT_INTF_WB_CODEC; - lpa_config.num_channels = icodec->data->channel_mode; - lpa_cmd_codec_config(drv->lpa, &lpa_config); - - /* Set audio interconnect reg to LPA */ - audio_interct_codec(AUDIO_INTERCT_LPA); - - /* Set MI2S */ - mi2s_set_codec_output_path((icodec->data->channel_mode == 2 ? - MI2S_CHAN_STEREO : MI2S_CHAN_MONO_PACKED), WT_16_BIT); - - if (icodec->data->voltage_on) - icodec->data->voltage_on(); - - /* Configure ADIE */ - trc = adie_codec_open(icodec->data->profile, &icodec->adie_path); - if (IS_ERR_VALUE(trc)) - goto error_adie; - /* OSR default to 256, can be changed for power optimization - * If OSR is to be changed, need clock API for setting the divider - */ - adie_codec_setpath(icodec->adie_path, icodec->sample_rate, 256); - /* Start AFE */ - afe_config.sample_rate = icodec->sample_rate / 1000; - afe_config.channel_mode = icodec->data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - trc = afe_enable(AFE_HW_PATH_CODEC_RX, &afe_config); - if (IS_ERR_VALUE(trc)) - goto error_afe; - lpa_cmd_enable_codec(drv->lpa, 1); - /* Enable ADIE */ - adie_codec_proceed_stage(icodec->adie_path, ADIE_CODEC_DIGITAL_READY); - adie_codec_proceed_stage(icodec->adie_path, - ADIE_CODEC_DIGITAL_ANALOG_READY); - - /* Enable power amplifier */ - if (icodec->data->pamp_on) - icodec->data->pamp_on(); - - icodec->enabled = 1; - - pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return 0; - -error_afe: - adie_codec_close(icodec->adie_path); - icodec->adie_path = NULL; -error_adie: - lpa_put(drv->lpa); -error_lpa: - clk_disable_unprepare(drv->lpa_p_clk); - clk_disable_unprepare(drv->lpa_codec_clk); - clk_disable_unprepare(drv->lpa_core_clk); - clk_disable_unprepare(drv->rx_sclk); - clk_disable_unprepare(drv->rx_mclk); -error_invalid_freq: - - MM_ERR("encounter error\n"); - - pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return -ENODEV; -} - -static int snddev_icodec_open_tx(struct snddev_icodec_state *icodec) -{ - int trc; - int i, err; - struct msm_afe_config afe_config; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv;; - - pm_qos_update_request(&drv->tx_pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - /* Vote for PWM mode*/ - err = pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_PWM); - if (err != 0) - MM_ERR("pmapp_smps_mode_vote error %d\n", err); - - /* Reuse pamp_on for TX platform-specific setup */ - if (icodec->data->pamp_on) - icodec->data->pamp_on(); - - for (i = 0; i < icodec->data->pmctl_id_sz; i++) { - pmic_hsed_enable(icodec->data->pmctl_id[i], - PM_HSED_ENABLE_PWM_TCXO); - } - - /* enable MI2S TX master block */ - /* enable MI2S TX bit clock */ - trc = clk_set_rate(drv->tx_mclk, - SNDDEV_ICODEC_CLK_RATE(icodec->sample_rate)); - if (IS_ERR_VALUE(trc)) - goto error_invalid_freq; - clk_prepare_enable(drv->tx_mclk); - clk_prepare_enable(drv->tx_sclk); - - /* Set MI2S */ - mi2s_set_codec_input_path((icodec->data->channel_mode == - REAL_STEREO_CHANNEL_MODE ? MI2S_CHAN_STEREO : - (icodec->data->channel_mode == 2 ? - MI2S_CHAN_STEREO : MI2S_CHAN_MONO_RAW)), - WT_16_BIT); - /* Configure ADIE */ - trc = adie_codec_open(icodec->data->profile, &icodec->adie_path); - if (IS_ERR_VALUE(trc)) - goto error_adie; - /* Enable ADIE */ - adie_codec_setpath(icodec->adie_path, icodec->sample_rate, 256); - adie_codec_proceed_stage(icodec->adie_path, ADIE_CODEC_DIGITAL_READY); - adie_codec_proceed_stage(icodec->adie_path, - ADIE_CODEC_DIGITAL_ANALOG_READY); - - /* Start AFE */ - afe_config.sample_rate = icodec->sample_rate / 1000; - afe_config.channel_mode = icodec->data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - trc = afe_enable(AFE_HW_PATH_CODEC_TX, &afe_config); - if (IS_ERR_VALUE(trc)) - goto error_afe; - - - icodec->enabled = 1; - - pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return 0; - -error_afe: - adie_codec_close(icodec->adie_path); - icodec->adie_path = NULL; -error_adie: - clk_disable_unprepare(drv->tx_sclk); - clk_disable_unprepare(drv->tx_mclk); -error_invalid_freq: - - /* Disable mic bias */ - for (i = 0; i < icodec->data->pmctl_id_sz; i++) { - pmic_hsed_enable(icodec->data->pmctl_id[i], - PM_HSED_ENABLE_OFF); - } - - if (icodec->data->pamp_off) - icodec->data->pamp_off(); - - MM_ERR("encounter error\n"); - - pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return -ENODEV; -} - -static int snddev_icodec_close_lb(struct snddev_icodec_state *icodec) -{ - /* Disable power amplifier */ - if (icodec->data->pamp_off) - icodec->data->pamp_off(); - - if (icodec->adie_path) { - adie_codec_proceed_stage(icodec->adie_path, - ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(icodec->adie_path); - icodec->adie_path = NULL; - } - if (icodec->data->voltage_off) - icodec->data->voltage_off(); - - return 0; -} - -static int snddev_icodec_close_rx(struct snddev_icodec_state *icodec) -{ - int err; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - - pm_qos_update_request(&drv->rx_pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - /* Remove the vote for SMPS mode*/ - err = pmapp_smps_mode_vote(SMPS_AUDIO_PLAYBACK_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_DONTCARE); - if (err != 0) - MM_ERR("pmapp_smps_mode_vote error %d\n", err); - - /* Disable power amplifier */ - if (icodec->data->pamp_off) - icodec->data->pamp_off(); - - /* Disable ADIE */ - adie_codec_proceed_stage(icodec->adie_path, ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(icodec->adie_path); - icodec->adie_path = NULL; - - afe_disable(AFE_HW_PATH_CODEC_RX); - - if (icodec->data->voltage_off) - icodec->data->voltage_off(); - - /* Disable LPA Sub system */ - lpa_cmd_enable_codec(drv->lpa, 0); - lpa_put(drv->lpa); - - /* Disable LPA clocks */ - clk_disable_unprepare(drv->lpa_p_clk); - clk_disable_unprepare(drv->lpa_codec_clk); - clk_disable_unprepare(drv->lpa_core_clk); - - /* Disable MI2S RX master block */ - /* Disable MI2S RX bit clock */ - clk_disable_unprepare(drv->rx_sclk); - clk_disable_unprepare(drv->rx_mclk); - - icodec->enabled = 0; - - pm_qos_update_request(&drv->rx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return 0; -} - -static int snddev_icodec_close_tx(struct snddev_icodec_state *icodec) -{ - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - int i, err; - - pm_qos_update_request(&drv->tx_pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - - /* Remove the vote for SMPS mode*/ - err = pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_DONTCARE); - if (err != 0) - MM_ERR("pmapp_smps_mode_vote error %d\n", err); - - afe_disable(AFE_HW_PATH_CODEC_TX); - - /* Disable ADIE */ - adie_codec_proceed_stage(icodec->adie_path, ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(icodec->adie_path); - icodec->adie_path = NULL; - - /* Disable MI2S TX master block */ - /* Disable MI2S TX bit clock */ - clk_disable_unprepare(drv->tx_sclk); - clk_disable_unprepare(drv->tx_mclk); - - /* Disable mic bias */ - for (i = 0; i < icodec->data->pmctl_id_sz; i++) { - pmic_hsed_enable(icodec->data->pmctl_id[i], - PM_HSED_ENABLE_OFF); - } - - /* Reuse pamp_off for TX platform-specific setup */ - if (icodec->data->pamp_off) - icodec->data->pamp_off(); - - icodec->enabled = 0; - - pm_qos_update_request(&drv->tx_pm_qos_req, PM_QOS_DEFAULT_VALUE); - return 0; -} - -static int snddev_icodec_open_lb(struct snddev_icodec_state *icodec) -{ - int trc; - trc = adie_codec_open(icodec->data->profile, &icodec->adie_path); - if (IS_ERR_VALUE(trc)) - pr_err("%s: adie codec open failed\n", __func__); - else - adie_codec_setpath(icodec->adie_path, - icodec->sample_rate, 256); - - if (icodec->adie_path) - adie_codec_proceed_stage(icodec->adie_path, - ADIE_CODEC_DIGITAL_ANALOG_READY); - if (icodec->data->pamp_on) - icodec->data->pamp_on(); - - icodec->enabled = 1; - return 0; -} - -static int snddev_icodec_set_device_volume_impl( - struct msm_snddev_info *dev_info, u32 volume) -{ - struct snddev_icodec_state *icodec; - u8 afe_path_id; - - int rc = 0; - - icodec = dev_info->private_data; - - if (icodec->data->capability & SNDDEV_CAP_RX) - afe_path_id = AFE_HW_PATH_CODEC_RX; - else - afe_path_id = AFE_HW_PATH_CODEC_TX; - - if (icodec->data->dev_vol_type & SNDDEV_DEV_VOL_DIGITAL) { - - rc = adie_codec_set_device_digital_volume(icodec->adie_path, - icodec->data->channel_mode == - REAL_STEREO_CHANNEL_MODE ? - 2 : icodec->data->channel_mode, volume); - if (rc < 0) { - MM_ERR("unable to set_device_digital_volume for" - "%s volume in percentage = %u\n", - dev_info->name, volume); - return rc; - } - - } else if (icodec->data->dev_vol_type & SNDDEV_DEV_VOL_ANALOG) { - rc = adie_codec_set_device_analog_volume(icodec->adie_path, - icodec->data->channel_mode == - REAL_STEREO_CHANNEL_MODE ? - 2 : icodec->data->channel_mode, volume); - if (rc < 0) { - MM_ERR("unable to set_device_analog_volume for" - "%s volume in percentage = %u\n", - dev_info->name, volume); - return rc; - } - } - else { - MM_ERR("Invalid device volume control\n"); - return -EPERM; - } - return rc; -} - -static int snddev_icodec_close(struct msm_snddev_info *dev_info) -{ - int rc = 0; - struct snddev_icodec_state *icodec; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - if (!dev_info) { - rc = -EINVAL; - goto error; - } - - icodec = dev_info->private_data; - - if (icodec->data->capability & SNDDEV_CAP_RX) { - mutex_lock(&drv->rx_lock); - if (!drv->rx_active) { - mutex_unlock(&drv->rx_lock); - rc = -EPERM; - goto error; - } - rc = snddev_icodec_close_rx(icodec); - if (!IS_ERR_VALUE(rc)) - drv->rx_active = 0; - mutex_unlock(&drv->rx_lock); - } else if (icodec->data->capability & SNDDEV_CAP_LB) { - mutex_lock(&drv->lb_lock); - rc = snddev_icodec_close_lb(icodec); - mutex_unlock(&drv->lb_lock); - } else { - mutex_lock(&drv->tx_lock); - if (!drv->tx_active) { - mutex_unlock(&drv->tx_lock); - rc = -EPERM; - goto error; - } - rc = snddev_icodec_close_tx(icodec); - if (!IS_ERR_VALUE(rc)) - drv->tx_active = 0; - mutex_unlock(&drv->tx_lock); - } - -error: - return rc; -} - -static int snddev_icodec_open(struct msm_snddev_info *dev_info) -{ - int rc = 0; - struct snddev_icodec_state *icodec; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - - if (!dev_info) { - rc = -EINVAL; - goto error; - } - - icodec = dev_info->private_data; - - if (icodec->data->capability & SNDDEV_CAP_RX) { - mutex_lock(&drv->rx_lock); - if (drv->rx_active) { - mutex_unlock(&drv->rx_lock); - rc = -EBUSY; - goto error; - } - rc = snddev_icodec_open_rx(icodec); - - if (!IS_ERR_VALUE(rc)) { - drv->rx_active = 1; - if ((icodec->data->dev_vol_type & ( - SNDDEV_DEV_VOL_DIGITAL | - SNDDEV_DEV_VOL_ANALOG))) - rc = snddev_icodec_set_device_volume_impl( - dev_info, dev_info->dev_volume); - if (IS_ERR_VALUE(rc)) { - MM_ERR("Failed to set device volume" - " impl for rx device\n"); - snddev_icodec_close(dev_info); - mutex_unlock(&drv->rx_lock); - goto error; - } - } - mutex_unlock(&drv->rx_lock); - } else if (icodec->data->capability & SNDDEV_CAP_LB) { - mutex_lock(&drv->lb_lock); - rc = snddev_icodec_open_lb(icodec); - if (!IS_ERR_VALUE(rc)) { - if ((icodec->data->dev_vol_type & ( - SNDDEV_DEV_VOL_DIGITAL | - SNDDEV_DEV_VOL_ANALOG))) - rc = snddev_icodec_set_device_volume_impl( - dev_info, - dev_info->dev_volume); - if (rc < 0) - MM_ERR("failed to set device volume\n"); - } - mutex_unlock(&drv->lb_lock); - } else { - mutex_lock(&drv->tx_lock); - if (drv->tx_active) { - mutex_unlock(&drv->tx_lock); - rc = -EBUSY; - goto error; - } - rc = snddev_icodec_open_tx(icodec); - - if (!IS_ERR_VALUE(rc)) { - drv->tx_active = 1; - if ((icodec->data->dev_vol_type & ( - SNDDEV_DEV_VOL_DIGITAL | - SNDDEV_DEV_VOL_ANALOG))) - rc = snddev_icodec_set_device_volume_impl( - dev_info, dev_info->dev_volume); - if (IS_ERR_VALUE(rc)) { - MM_ERR("Failed to set device volume" - " impl for tx device\n"); - snddev_icodec_close(dev_info); - mutex_unlock(&drv->tx_lock); - goto error; - } - } - mutex_unlock(&drv->tx_lock); - } -error: - return rc; -} - -static int snddev_icodec_check_freq(u32 req_freq) -{ - int rc = -EINVAL; - - if ((req_freq != 0) && (req_freq >= 8000) && (req_freq <= 48000)) { - if ((req_freq == 8000) || (req_freq == 11025) || - (req_freq == 12000) || (req_freq == 16000) || - (req_freq == 22050) || (req_freq == 24000) || - (req_freq == 32000) || (req_freq == 44100) || - (req_freq == 48000)) { - rc = 0; - } else - MM_INFO("Unsupported Frequency:%d\n", req_freq); - } - return rc; -} - -static int snddev_icodec_set_freq(struct msm_snddev_info *dev_info, u32 rate) -{ - int rc; - struct snddev_icodec_state *icodec; - - if (!dev_info) { - rc = -EINVAL; - goto error; - } - - icodec = dev_info->private_data; - if (adie_codec_freq_supported(icodec->data->profile, rate) != 0) { - rc = -EINVAL; - goto error; - } else { - if (snddev_icodec_check_freq(rate) != 0) { - rc = -EINVAL; - goto error; - } else - icodec->sample_rate = rate; - } - - if (icodec->enabled) { - snddev_icodec_close(dev_info); - snddev_icodec_open(dev_info); - } - - return icodec->sample_rate; - -error: - return rc; -} - -static int snddev_icodec_enable_sidetone(struct msm_snddev_info *dev_info, - u32 enable) -{ - int rc = 0; - struct snddev_icodec_state *icodec; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - - if (!dev_info) { - MM_ERR("invalid dev_info\n"); - rc = -EINVAL; - goto error; - } - - icodec = dev_info->private_data; - - if (icodec->data->capability & SNDDEV_CAP_RX) { - mutex_lock(&drv->rx_lock); - if (!drv->rx_active || !dev_info->opened) { - MM_ERR("dev not active\n"); - rc = -EPERM; - mutex_unlock(&drv->rx_lock); - goto error; - } - rc = adie_codec_enable_sidetone(icodec->adie_path, enable); - mutex_unlock(&drv->rx_lock); - } else { - rc = -EINVAL; - MM_ERR("rx device only\n"); - } - -error: - return rc; - -} - -int snddev_icodec_set_device_volume(struct msm_snddev_info *dev_info, - u32 volume) -{ - struct snddev_icodec_state *icodec; - struct mutex *lock; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - int rc = -EPERM; - - if (!dev_info) { - MM_INFO("device not intilized.\n"); - return -EINVAL; - } - - icodec = dev_info->private_data; - - if (!(icodec->data->dev_vol_type & (SNDDEV_DEV_VOL_DIGITAL - | SNDDEV_DEV_VOL_ANALOG))) { - - MM_INFO("device %s does not support device volume " - "control.", dev_info->name); - return -EPERM; - } - dev_info->dev_volume = volume; - - if (icodec->data->capability & SNDDEV_CAP_RX) - lock = &drv->rx_lock; - else if (icodec->data->capability & SNDDEV_CAP_LB) - lock = &drv->lb_lock; - else - lock = &drv->tx_lock; - - mutex_lock(lock); - - rc = snddev_icodec_set_device_volume_impl(dev_info, - dev_info->dev_volume); - mutex_unlock(lock); - return rc; -} - -static int snddev_icodec_probe(struct platform_device *pdev) -{ - int rc = 0, i; - struct snddev_icodec_data *pdata; - struct msm_snddev_info *dev_info; - struct snddev_icodec_state *icodec; - - if (!pdev || !pdev->dev.platform_data) { - printk(KERN_ALERT "Invalid caller \n"); - rc = -1; - goto error; - } - pdata = pdev->dev.platform_data; - if ((pdata->capability & SNDDEV_CAP_RX) && - (pdata->capability & SNDDEV_CAP_TX)) { - MM_ERR("invalid device data either RX or TX\n"); - goto error; - } - icodec = kzalloc(sizeof(struct snddev_icodec_state), GFP_KERNEL); - if (!icodec) { - rc = -ENOMEM; - goto error; - } - dev_info = kmalloc(sizeof(struct msm_snddev_info), GFP_KERNEL); - if (!dev_info) { - kfree(icodec); - rc = -ENOMEM; - goto error; - } - - dev_info->name = pdata->name; - dev_info->copp_id = pdata->copp_id; - dev_info->acdb_id = pdata->acdb_id; - dev_info->private_data = (void *) icodec; - dev_info->dev_ops.open = snddev_icodec_open; - dev_info->dev_ops.close = snddev_icodec_close; - dev_info->dev_ops.set_freq = snddev_icodec_set_freq; - dev_info->dev_ops.set_device_volume = snddev_icodec_set_device_volume; - dev_info->capability = pdata->capability; - dev_info->opened = 0; - msm_snddev_register(dev_info); - icodec->data = pdata; - icodec->sample_rate = pdata->default_sample_rate; - dev_info->sample_rate = pdata->default_sample_rate; - if (pdata->capability & SNDDEV_CAP_RX) { - for (i = 0; i < VOC_RX_VOL_ARRAY_NUM; i++) { - dev_info->max_voc_rx_vol[i] = - pdata->max_voice_rx_vol[i]; - dev_info->min_voc_rx_vol[i] = - pdata->min_voice_rx_vol[i]; - } - /*sidetone is enabled only for the device which - property set for side tone*/ - if (pdata->property & SIDE_TONE_MASK) - dev_info->dev_ops.enable_sidetone = - snddev_icodec_enable_sidetone; - else - dev_info->dev_ops.enable_sidetone = NULL; - } else { - dev_info->dev_ops.enable_sidetone = NULL; - } - -error: - return rc; -} - -static int snddev_icodec_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver snddev_icodec_driver = { - .probe = snddev_icodec_probe, - .remove = snddev_icodec_remove, - .driver = { .name = "snddev_icodec" } -}; - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_sdev_dent; -static struct dentry *debugfs_afelb; -static struct dentry *debugfs_adielb; -static struct adie_codec_path *debugfs_rx_adie; -static struct adie_codec_path *debugfs_tx_adie; - -static int snddev_icodec_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - MM_INFO("snddev_icodec: debug intf %s\n", (char *) file->private_data); - return 0; -} - -static void debugfs_adie_loopback(u32 loop) -{ - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - - if (loop) { - - /* enable MI2S RX master block */ - /* enable MI2S RX bit clock */ - clk_set_rate(drv->rx_mclk, - SNDDEV_ICODEC_CLK_RATE(8000)); - clk_prepare_enable(drv->rx_mclk); - clk_prepare_enable(drv->rx_sclk); - - MM_INFO("configure ADIE RX path\n"); - /* Configure ADIE */ - adie_codec_open(&debug_rx_profile, &debugfs_rx_adie); - adie_codec_setpath(debugfs_rx_adie, 8000, 256); - adie_codec_proceed_stage(debugfs_rx_adie, - ADIE_CODEC_DIGITAL_ANALOG_READY); - - MM_INFO("Enable Handset Mic bias\n"); - pmic_hsed_enable(PM_HSED_CONTROLLER_0, PM_HSED_ENABLE_PWM_TCXO); - /* enable MI2S TX master block */ - /* enable MI2S TX bit clock */ - clk_set_rate(drv->tx_mclk, - SNDDEV_ICODEC_CLK_RATE(8000)); - clk_prepare_enable(drv->tx_mclk); - clk_prepare_enable(drv->tx_sclk); - - MM_INFO("configure ADIE TX path\n"); - /* Configure ADIE */ - adie_codec_open(&debug_tx_lb_profile, &debugfs_tx_adie); - adie_codec_setpath(debugfs_tx_adie, 8000, 256); - adie_codec_proceed_stage(debugfs_tx_adie, - ADIE_CODEC_DIGITAL_ANALOG_READY); - } else { - /* Disable ADIE */ - adie_codec_proceed_stage(debugfs_rx_adie, - ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(debugfs_rx_adie); - adie_codec_proceed_stage(debugfs_tx_adie, - ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(debugfs_tx_adie); - - pmic_hsed_enable(PM_HSED_CONTROLLER_0, PM_HSED_ENABLE_OFF); - - /* Disable MI2S RX master block */ - /* Disable MI2S RX bit clock */ - clk_disable_unprepare(drv->rx_sclk); - clk_disable_unprepare(drv->rx_mclk); - - /* Disable MI2S TX master block */ - /* Disable MI2S TX bit clock */ - clk_disable_unprepare(drv->tx_sclk); - clk_disable_unprepare(drv->tx_mclk); - } -} - -static void debugfs_afe_loopback(u32 loop) -{ - int trc; - struct msm_afe_config afe_config; - struct snddev_icodec_drv_state *drv = &snddev_icodec_drv; - struct lpa_codec_config lpa_config; - - if (loop) { - /* Vote for SMPS mode*/ - pmapp_smps_mode_vote(SMPS_AUDIO_PLAYBACK_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_PWM); - - /* enable MI2S RX master block */ - /* enable MI2S RX bit clock */ - trc = clk_set_rate(drv->rx_mclk, - SNDDEV_ICODEC_CLK_RATE(8000)); - if (IS_ERR_VALUE(trc)) - MM_ERR("failed to set clk rate\n"); - clk_prepare_enable(drv->rx_mclk); - clk_prepare_enable(drv->rx_sclk); - clk_prepare_enable(drv->lpa_p_clk); - clk_prepare_enable(drv->lpa_codec_clk); - clk_prepare_enable(drv->lpa_core_clk); - /* Enable LPA sub system - */ - drv->lpa = lpa_get(); - if (!drv->lpa) - MM_ERR("failed to enable lpa\n"); - lpa_config.sample_rate = 8000; - lpa_config.sample_width = 16; - lpa_config.output_interface = LPA_OUTPUT_INTF_WB_CODEC; - lpa_config.num_channels = 1; - lpa_cmd_codec_config(drv->lpa, &lpa_config); - /* Set audio interconnect reg to LPA */ - audio_interct_codec(AUDIO_INTERCT_LPA); - mi2s_set_codec_output_path(MI2S_CHAN_MONO_PACKED, WT_16_BIT); - MM_INFO("configure ADIE RX path\n"); - /* Configure ADIE */ - adie_codec_open(&debug_rx_profile, &debugfs_rx_adie); - adie_codec_setpath(debugfs_rx_adie, 8000, 256); - lpa_cmd_enable_codec(drv->lpa, 1); - - /* Start AFE for RX */ - afe_config.sample_rate = 0x8; - afe_config.channel_mode = 1; - afe_config.volume = AFE_VOLUME_UNITY; - MM_INFO("enable afe\n"); - trc = afe_enable(AFE_HW_PATH_CODEC_RX, &afe_config); - if (IS_ERR_VALUE(trc)) - MM_ERR("fail to enable afe RX\n"); - adie_codec_proceed_stage(debugfs_rx_adie, - ADIE_CODEC_DIGITAL_READY); - adie_codec_proceed_stage(debugfs_rx_adie, - ADIE_CODEC_DIGITAL_ANALOG_READY); - - /* Vote for PWM mode*/ - pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_PWM); - - MM_INFO("Enable Handset Mic bias\n"); - pmic_hsed_enable(PM_HSED_CONTROLLER_0, PM_HSED_ENABLE_PWM_TCXO); - - /* enable MI2S TX master block */ - /* enable MI2S TX bit clock */ - clk_set_rate(drv->tx_mclk, - SNDDEV_ICODEC_CLK_RATE(8000)); - clk_prepare_enable(drv->tx_mclk); - clk_prepare_enable(drv->tx_sclk); - /* Set MI2S */ - mi2s_set_codec_input_path(MI2S_CHAN_MONO_PACKED, WT_16_BIT); - MM_INFO("configure ADIE TX path\n"); - /* Configure ADIE */ - adie_codec_open(&debug_tx_profile, &debugfs_tx_adie); - adie_codec_setpath(debugfs_tx_adie, 8000, 256); - adie_codec_proceed_stage(debugfs_tx_adie, - ADIE_CODEC_DIGITAL_READY); - adie_codec_proceed_stage(debugfs_tx_adie, - ADIE_CODEC_DIGITAL_ANALOG_READY); - /* Start AFE for TX */ - afe_config.sample_rate = 0x8; - afe_config.channel_mode = 1; - afe_config.volume = AFE_VOLUME_UNITY; - trc = afe_enable(AFE_HW_PATH_CODEC_TX, &afe_config); - if (IS_ERR_VALUE(trc)) - MM_ERR("failed to enable AFE TX\n"); - /* Set the volume level to non unity, to avoid - loopback effect */ - afe_device_volume_ctrl(AFE_HW_PATH_CODEC_RX, 0x0500); - - /* enable afe loopback */ - afe_loopback(1); - MM_INFO("AFE loopback enabled\n"); - } else { - /* disable afe loopback */ - afe_loopback(0); - /* Remove the vote for SMPS mode*/ - pmapp_smps_mode_vote(SMPS_AUDIO_PLAYBACK_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_DONTCARE); - - /* Disable ADIE */ - adie_codec_proceed_stage(debugfs_rx_adie, - ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(debugfs_rx_adie); - /* Disable AFE for RX */ - afe_disable(AFE_HW_PATH_CODEC_RX); - - /* Disable LPA Sub system */ - lpa_cmd_enable_codec(drv->lpa, 0); - lpa_put(drv->lpa); - - /* Disable LPA clocks */ - clk_disable_unprepare(drv->lpa_p_clk); - clk_disable_unprepare(drv->lpa_codec_clk); - clk_disable_unprepare(drv->lpa_core_clk); - - /* Disable MI2S RX master block */ - /* Disable MI2S RX bit clock */ - clk_disable_unprepare(drv->rx_sclk); - clk_disable_unprepare(drv->rx_mclk); - - pmapp_smps_mode_vote(SMPS_AUDIO_RECORD_ID, - PMAPP_VREG_S4, PMAPP_SMPS_MODE_VOTE_DONTCARE); - - /* Disable AFE for TX */ - afe_disable(AFE_HW_PATH_CODEC_TX); - - /* Disable ADIE */ - adie_codec_proceed_stage(debugfs_tx_adie, - ADIE_CODEC_DIGITAL_OFF); - adie_codec_close(debugfs_tx_adie); - /* Disable MI2S TX master block */ - /* Disable MI2S TX bit clock */ - clk_disable_unprepare(drv->tx_sclk); - clk_disable_unprepare(drv->tx_mclk); - pmic_hsed_enable(PM_HSED_CONTROLLER_0, PM_HSED_ENABLE_OFF); - MM_INFO("AFE loopback disabled\n"); - } -} - -static ssize_t snddev_icodec_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char cmd; - - if (get_user(cmd, ubuf)) - return -EFAULT; - - MM_INFO("%s %c\n", lb_str, cmd); - - if (!strcmp(lb_str, "adie_loopback")) { - switch (cmd) { - case '1': - debugfs_adie_loopback(1); - break; - case '0': - debugfs_adie_loopback(0); - break; - } - } else if (!strcmp(lb_str, "afe_loopback")) { - switch (cmd) { - case '1': - debugfs_afe_loopback(1); - break; - case '0': - debugfs_afe_loopback(0); - break; - } - } - - return cnt; -} - -static const struct file_operations snddev_icodec_debug_fops = { - .open = snddev_icodec_debug_open, - .write = snddev_icodec_debug_write -}; -#endif - -static int __init snddev_icodec_init(void) -{ - s32 rc; - struct snddev_icodec_drv_state *icodec_drv = &snddev_icodec_drv; - - rc = platform_driver_register(&snddev_icodec_driver); - if (IS_ERR_VALUE(rc)) - goto error_platform_driver; - icodec_drv->rx_mclk = clk_get(NULL, "mi2s_codec_rx_m_clk"); - if (IS_ERR(icodec_drv->rx_mclk)) - goto error_rx_mclk; - icodec_drv->rx_sclk = clk_get(NULL, "mi2s_codec_rx_s_clk"); - if (IS_ERR(icodec_drv->rx_sclk)) - goto error_rx_sclk; - icodec_drv->tx_mclk = clk_get(NULL, "mi2s_codec_tx_m_clk"); - if (IS_ERR(icodec_drv->tx_mclk)) - goto error_tx_mclk; - icodec_drv->tx_sclk = clk_get(NULL, "mi2s_codec_tx_s_clk"); - if (IS_ERR(icodec_drv->tx_sclk)) - goto error_tx_sclk; - icodec_drv->lpa_codec_clk = clk_get(NULL, "lpa_codec_clk"); - if (IS_ERR(icodec_drv->lpa_codec_clk)) - goto error_lpa_codec_clk; - icodec_drv->lpa_core_clk = clk_get(NULL, "lpa_core_clk"); - if (IS_ERR(icodec_drv->lpa_core_clk)) - goto error_lpa_core_clk; - icodec_drv->lpa_p_clk = clk_get(NULL, "lpa_pclk"); - if (IS_ERR(icodec_drv->lpa_p_clk)) - goto error_lpa_p_clk; - -#ifdef CONFIG_DEBUG_FS - debugfs_sdev_dent = debugfs_create_dir("snddev_icodec", 0); - if (debugfs_sdev_dent) { - debugfs_afelb = debugfs_create_file("afe_loopback", - S_IFREG | S_IWUGO, debugfs_sdev_dent, - (void *) "afe_loopback", &snddev_icodec_debug_fops); - debugfs_adielb = debugfs_create_file("adie_loopback", - S_IFREG | S_IWUGO, debugfs_sdev_dent, - (void *) "adie_loopback", &snddev_icodec_debug_fops); - } -#endif - mutex_init(&icodec_drv->rx_lock); - mutex_init(&icodec_drv->lb_lock); - mutex_init(&icodec_drv->tx_lock); - icodec_drv->rx_active = 0; - icodec_drv->tx_active = 0; - icodec_drv->lpa = NULL; - pm_qos_add_request(&icodec_drv->tx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - pm_qos_add_request(&icodec_drv->rx_pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - return 0; - -error_lpa_p_clk: - clk_put(icodec_drv->lpa_core_clk); -error_lpa_core_clk: - clk_put(icodec_drv->lpa_codec_clk); -error_lpa_codec_clk: - clk_put(icodec_drv->tx_sclk); -error_tx_sclk: - clk_put(icodec_drv->tx_mclk); -error_tx_mclk: - clk_put(icodec_drv->rx_sclk); -error_rx_sclk: - clk_put(icodec_drv->rx_mclk); -error_rx_mclk: - platform_driver_unregister(&snddev_icodec_driver); -error_platform_driver: - - MM_ERR("encounter error\n"); - return -ENODEV; -} - -static void __exit snddev_icodec_exit(void) -{ - struct snddev_icodec_drv_state *icodec_drv = &snddev_icodec_drv; - -#ifdef CONFIG_DEBUG_FS - if (debugfs_afelb) - debugfs_remove(debugfs_afelb); - if (debugfs_adielb) - debugfs_remove(debugfs_adielb); - if (debugfs_sdev_dent) - debugfs_remove(debugfs_sdev_dent); -#endif - platform_driver_unregister(&snddev_icodec_driver); - - clk_put(icodec_drv->rx_sclk); - clk_put(icodec_drv->rx_mclk); - clk_put(icodec_drv->tx_sclk); - clk_put(icodec_drv->tx_mclk); - return; -} - -module_init(snddev_icodec_init); -module_exit(snddev_icodec_exit); - -MODULE_DESCRIPTION("ICodec Sound Device driver"); -MODULE_VERSION("1.0"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_mi2s.c b/arch/arm/mach-msm/qdsp5v2/snddev_mi2s.c deleted file mode 100644 index 7f4ee265461d..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_mi2s.c +++ /dev/null @@ -1,405 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Global state for the driver */ -struct snddev_mi2s_drv_state { - struct clk *mclk; - struct clk *sclk; - struct mutex lock; - u8 sd_lines_used; - u8 clocks_enabled; -}; - -static struct snddev_mi2s_drv_state snddev_mi2s_drv; - -static int snddev_mi2s_open_tx(struct msm_snddev_info *dev_info) -{ - u8 channels; - struct msm_afe_config afe_config; - int rc; - struct snddev_mi2s_data *snddev_mi2s_data = dev_info->private_data; - - MM_DBG("%s: channel_mode = %u sd_line_mask = 0x%x " - "default_sample_rate = %u\n", __func__, - snddev_mi2s_data->channel_mode, snddev_mi2s_data->sd_lines, - snddev_mi2s_data->default_sample_rate); - - if (snddev_mi2s_data->channel_mode == 2) { - channels = MI2S_CHAN_STEREO; - } else { - MM_ERR("%s: Invalid number of channels = %u\n", __func__, - snddev_mi2s_data->channel_mode); - return -EINVAL; - } - - /* Set MI2S */ - mi2s_set_hdmi_input_path(channels, WT_16_BIT, - snddev_mi2s_data->sd_lines); - - afe_config.sample_rate = snddev_mi2s_data->default_sample_rate / 1000; - afe_config.channel_mode = snddev_mi2s_data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - rc = afe_enable(AFE_HW_PATH_MI2S_TX, &afe_config); - - if (IS_ERR_VALUE(rc)) { - MM_ERR("%s: afe_enable failed for AFE_HW_PATH_MI2S_TX " - "rc = %d\n", __func__, rc); - return -ENODEV; - } - - /* Enable audio path */ - if (snddev_mi2s_data->route) - snddev_mi2s_data->route(); - - return 0; -} - -static int snddev_mi2s_open_rx(struct msm_snddev_info *dev_info) -{ - int rc; - struct msm_afe_config afe_config; - u8 channels; - struct snddev_mi2s_data *snddev_mi2s_data = dev_info->private_data; - - MM_DBG("%s: channel_mode = %u sd_line_mask = 0x%x " - "default_sample_rate = %u\n", __func__, - snddev_mi2s_data->channel_mode, snddev_mi2s_data->sd_lines, - snddev_mi2s_data->default_sample_rate); - - if (snddev_mi2s_data->channel_mode == 2) - channels = MI2S_CHAN_STEREO; - else if (snddev_mi2s_data->channel_mode == 4) - channels = MI2S_CHAN_4CHANNELS; - else if (snddev_mi2s_data->channel_mode == 6) - channels = MI2S_CHAN_6CHANNELS; - else if (snddev_mi2s_data->channel_mode == 8) - channels = MI2S_CHAN_8CHANNELS; - else - channels = MI2S_CHAN_MONO_RAW; - - /* Set MI2S */ - mi2s_set_hdmi_output_path(channels, WT_16_BIT, - snddev_mi2s_data->sd_lines); - - /* Start AFE */ - afe_config.sample_rate = snddev_mi2s_data->default_sample_rate / 1000; - afe_config.channel_mode = snddev_mi2s_data->channel_mode; - afe_config.volume = AFE_VOLUME_UNITY; - rc = afe_enable(AFE_HW_PATH_MI2S_RX, &afe_config); - - if (IS_ERR_VALUE(rc)) { - MM_ERR("%s: encounter error\n", __func__); - return -ENODEV; - } - - /* Enable audio path */ - if (snddev_mi2s_data->route) - snddev_mi2s_data->route(); - - MM_DBG("%s: enabled %s \n", __func__, snddev_mi2s_data->name); - - return 0; -} - -static int snddev_mi2s_open(struct msm_snddev_info *dev_info) -{ - int rc = 0; - struct snddev_mi2s_drv_state *drv = &snddev_mi2s_drv; - u32 dir; - struct snddev_mi2s_data *snddev_mi2s_data = dev_info->private_data; - - if (!dev_info) { - MM_ERR("%s: msm_snddev_info is null \n", __func__); - return -EINVAL; - } - - mutex_lock(&drv->lock); - - if (drv->sd_lines_used & snddev_mi2s_data->sd_lines) { - MM_ERR("%s: conflict in SD data line. can not use the device\n", - __func__); - mutex_unlock(&drv->lock); - return -EBUSY; - } - - if (!drv->clocks_enabled) { - - rc = mi2s_config_clk_gpio(); - if (rc) { - MM_ERR("%s: mi2s GPIO config failed for %s\n", - __func__, snddev_mi2s_data->name); - mutex_unlock(&drv->lock); - return -EIO; - } - clk_prepare_enable(drv->mclk); - clk_prepare_enable(drv->sclk); - drv->clocks_enabled = 1; - MM_DBG("%s: clks enabled\n", __func__); - } else - MM_DBG("%s: clks already enabled\n", __func__); - - if (snddev_mi2s_data->capability & SNDDEV_CAP_RX) { - - dir = DIR_RX; - rc = mi2s_config_data_gpio(dir, snddev_mi2s_data->sd_lines); - - if (rc) { - rc = -EIO; - MM_ERR("%s: mi2s GPIO config failed for %s\n", - __func__, snddev_mi2s_data->name); - goto mi2s_data_gpio_failure; - } - - MM_DBG("%s: done gpio config rx SD lines\n", __func__); - - rc = snddev_mi2s_open_rx(dev_info); - - if (IS_ERR_VALUE(rc)) { - MM_ERR(" snddev_mi2s_open_rx failed \n"); - goto mi2s_cleanup_open; - } - - drv->sd_lines_used |= snddev_mi2s_data->sd_lines; - - MM_DBG("%s: sd_lines_used = 0x%x\n", __func__, - drv->sd_lines_used); - mutex_unlock(&drv->lock); - - } else { - dir = DIR_TX; - rc = mi2s_config_data_gpio(dir, snddev_mi2s_data->sd_lines); - - if (rc) { - rc = -EIO; - MM_ERR("%s: mi2s GPIO config failed for %s\n", - __func__, snddev_mi2s_data->name); - goto mi2s_data_gpio_failure; - } - MM_DBG("%s: done data line gpio config for %s\n", - __func__, snddev_mi2s_data->name); - - rc = snddev_mi2s_open_tx(dev_info); - - if (IS_ERR_VALUE(rc)) { - MM_ERR(" snddev_mi2s_open_tx failed \n"); - goto mi2s_cleanup_open; - } - - drv->sd_lines_used |= snddev_mi2s_data->sd_lines; - MM_DBG("%s: sd_lines_used = 0x%x\n", __func__, - drv->sd_lines_used); - mutex_unlock(&drv->lock); - } - - return 0; - -mi2s_cleanup_open: - mi2s_unconfig_data_gpio(dir, snddev_mi2s_data->sd_lines); - - /* Disable audio path */ - if (snddev_mi2s_data->deroute) - snddev_mi2s_data->deroute(); - -mi2s_data_gpio_failure: - if (!drv->sd_lines_used) { - clk_disable_unprepare(drv->sclk); - clk_disable_unprepare(drv->mclk); - drv->clocks_enabled = 0; - mi2s_unconfig_clk_gpio(); - } - mutex_unlock(&drv->lock); - return rc; -} - -static int snddev_mi2s_close(struct msm_snddev_info *dev_info) -{ - struct snddev_mi2s_drv_state *drv = &snddev_mi2s_drv; - int dir; - struct snddev_mi2s_data *snddev_mi2s_data = dev_info->private_data; - - if (!dev_info) { - MM_ERR("%s: msm_snddev_info is null \n", __func__); - return -EINVAL; - } - - if (!dev_info->opened) { - MM_ERR(" %s: calling close device with out opening the" - " device \n", __func__); - return -EIO; - } - - mutex_lock(&drv->lock); - - drv->sd_lines_used &= ~snddev_mi2s_data->sd_lines; - - MM_DBG("%s: sd_lines in use = 0x%x\n", __func__, drv->sd_lines_used); - - if (snddev_mi2s_data->capability & SNDDEV_CAP_RX) { - dir = DIR_RX; - afe_disable(AFE_HW_PATH_MI2S_RX); - } else { - dir = DIR_TX; - afe_disable(AFE_HW_PATH_MI2S_TX); - } - - mi2s_unconfig_data_gpio(dir, snddev_mi2s_data->sd_lines); - - if (!drv->sd_lines_used) { - clk_disable_unprepare(drv->sclk); - clk_disable_unprepare(drv->mclk); - drv->clocks_enabled = 0; - mi2s_unconfig_clk_gpio(); - } - - /* Disable audio path */ - if (snddev_mi2s_data->deroute) - snddev_mi2s_data->deroute(); - - mutex_unlock(&drv->lock); - - return 0; -} - -static int snddev_mi2s_set_freq(struct msm_snddev_info *dev_info, u32 req_freq) -{ - if (req_freq != 48000) { - MM_DBG("%s: Unsupported Frequency:%d\n", __func__, req_freq); - return -EINVAL; - } - return 48000; -} - -static int snddev_mi2s_probe(struct platform_device *pdev) -{ - int rc = 0; - struct snddev_mi2s_data *pdata; - struct msm_snddev_info *dev_info; - - if (!pdev || !pdev->dev.platform_data) { - printk(KERN_ALERT "Invalid caller \n"); - return -ENODEV; - } - - pdata = pdev->dev.platform_data; - if ((pdata->capability & SNDDEV_CAP_RX) && - (pdata->capability & SNDDEV_CAP_TX)) { - MM_ERR("%s: invalid device data either RX or TX\n", __func__); - return -ENODEV; - } - - dev_info = kzalloc(sizeof(struct msm_snddev_info), GFP_KERNEL); - if (!dev_info) { - MM_ERR("%s: uneable to allocate memeory for msm_snddev_info \n", - __func__); - - return -ENOMEM; - } - - dev_info->name = pdata->name; - dev_info->copp_id = pdata->copp_id; - dev_info->acdb_id = pdata->acdb_id; - dev_info->private_data = (void *)pdata; - dev_info->dev_ops.open = snddev_mi2s_open; - dev_info->dev_ops.close = snddev_mi2s_close; - dev_info->dev_ops.set_freq = snddev_mi2s_set_freq; - dev_info->capability = pdata->capability; - dev_info->opened = 0; - msm_snddev_register(dev_info); - dev_info->sample_rate = pdata->default_sample_rate; - - MM_DBG("%s: probe done for %s\n", __func__, pdata->name); - return rc; -} - -static int snddev_mi2s_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver snddev_mi2s_driver = { - .probe = snddev_mi2s_probe, - .remove = snddev_mi2s_remove, - .driver = {.name = "snddev_mi2s"} -}; - -static int __init snddev_mi2s_init(void) -{ - s32 rc; - struct snddev_mi2s_drv_state *drv = &snddev_mi2s_drv; - - rc = platform_driver_register(&snddev_mi2s_driver); - if (IS_ERR_VALUE(rc)) { - - MM_ERR("%s: platform_driver_register failed \n", __func__); - goto error_platform_driver; - } - - drv->mclk = clk_get(NULL, "mi2s_m_clk"); - if (IS_ERR(drv->mclk)) { - MM_ERR("%s: clk_get mi2s_mclk failed \n", __func__); - goto error_mclk; - } - - drv->sclk = clk_get(NULL, "mi2s_s_clk"); - if (IS_ERR(drv->sclk)) { - MM_ERR("%s: clk_get mi2s_sclk failed \n", __func__); - - goto error_sclk; - } - - mutex_init(&drv->lock); - - MM_DBG("snddev_mi2s_init : done \n"); - - return 0; - -error_sclk: - clk_put(drv->mclk); -error_mclk: - platform_driver_unregister(&snddev_mi2s_driver); -error_platform_driver: - - MM_ERR("%s: encounter error\n", __func__); - return -ENODEV; -} - -static void __exit snddev_mi2s_exit(void) -{ - struct snddev_mi2s_drv_state *drv = &snddev_mi2s_drv; - - platform_driver_unregister(&snddev_mi2s_driver); - - clk_put(drv->sclk); - clk_put(drv->mclk); - return; -} - -module_init(snddev_mi2s_init); -module_exit(snddev_mi2s_exit); - -MODULE_DESCRIPTION("mi2s Sound Device driver"); -MODULE_VERSION("1.0"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/snddev_virtual.c b/arch/arm/mach-msm/qdsp5v2/snddev_virtual.c deleted file mode 100644 index aa1d55780114..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/snddev_virtual.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static int snddev_virtual_open(struct msm_snddev_info *dev_info) -{ - int rc = 0; - - if (!dev_info) - rc = -EINVAL; - return rc; -} - -static int snddev_virtual_close(struct msm_snddev_info *dev_info) -{ - int rc = 0; - - if (!dev_info) - rc = -EINVAL; - return rc; -} - -static int snddev_virtual_set_freq(struct msm_snddev_info *dev_info, u32 rate) -{ - int rc = 0; - - if (!dev_info) - rc = -EINVAL; - return rate; -} - -static int snddev_virtual_probe(struct platform_device *pdev) -{ - int rc = 0; - struct snddev_virtual_data *pdata; - struct msm_snddev_info *dev_info; - - if (!pdev || !pdev->dev.platform_data) { - MM_ERR("Invalid caller\n"); - rc = -EPERM; - goto error; - } - pdata = pdev->dev.platform_data; - - dev_info = kmalloc(sizeof(struct msm_snddev_info), GFP_KERNEL); - if (!dev_info) { - rc = -ENOMEM; - goto error; - } - - dev_info->name = pdata->name; - dev_info->copp_id = pdata->copp_id; - dev_info->acdb_id = pdata->acdb_id; - dev_info->private_data = (void *) NULL; - dev_info->dev_ops.open = snddev_virtual_open; - dev_info->dev_ops.close = snddev_virtual_close; - dev_info->dev_ops.set_freq = snddev_virtual_set_freq; - dev_info->capability = pdata->capability; - dev_info->sample_rate = 8000; - dev_info->opened = 0; - dev_info->sessions = 0; - - msm_snddev_register(dev_info); - -error: - return rc; -} - -static int snddev_virtual_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver snddev_virtual_driver = { - .probe = snddev_virtual_probe, - .remove = snddev_virtual_remove, - .driver = { .name = "snddev_virtual" } -}; - -static int __init snddev_virtual_init(void) -{ - int rc = 0; - - MM_DBG(" snddev_virtual_init \n"); - rc = platform_driver_register(&snddev_virtual_driver); - if (IS_ERR_VALUE(rc)) { - MM_ERR("platform driver register failure\n"); - return -ENODEV; - } - return 0; -} - -static void __exit snddev_virtual_exit(void) -{ - platform_driver_unregister(&snddev_virtual_driver); - - return; -} - -module_init(snddev_virtual_init); -module_exit(snddev_virtual_exit); - -MODULE_DESCRIPTION("Virtual Sound Device driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp5v2/timpani_profile_7x30.h b/arch/arm/mach-msm/qdsp5v2/timpani_profile_7x30.h deleted file mode 100644 index e4cf1313ef72..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/timpani_profile_7x30.h +++ /dev/null @@ -1,623 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __MACH_QDSP5_V2_TIMPANI_PROFILE_H__ -#define __MACH_QDSP5_V2_MTIMPANI_PROFILE_H__ - -/* - * TX Device Profiles - */ - -/* Analog MIC */ -/* AMIC Primary mono */ -#define AMIC_PRI_MONO_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0xD0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x65)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x1E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x93, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0xFF, 0x1B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x99, 0x0F, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x9F, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x04, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE6)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xC0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xAB, 0x09, 0x09)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/* Headset MIC */ -#define AMIC1_HEADSET_TX_MONO_PRIMARY_OSR256 \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x1E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x93, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0xFF, 0x1B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x99, 0x0F, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x9F, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0xC8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x65)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8 }, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x04, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xE7)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0x03, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xC0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0x00)} } - -/* - * RX Device Profiles - */ - -/* RX EAR */ -#define EAR_PRI_MONO_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0F)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x97, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0xFF, 0x4C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x39, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/* RX SPEAKER */ -#define SPEAKER_PRI_STEREO_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x6C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x1388}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x1388}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0xF8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x24, 0x24)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x24, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} }; - -/* - * RX HPH PRIMARY - */ - -/* RX HPH CLASS AB CAPLESS */ - -#define HEADSET_AB_CPLS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x6C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFF, 0x29)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0xF5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFE, 0xC8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0x27, 0x24)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/* AMIC dual */ -#define AMIC_DUAL_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x1E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x93, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0xFF, 0x1B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x99, 0x0F, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x9F, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0xD0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xFF, 0xC2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x65)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8 }, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8b, 0xff, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB4, 0xFF, 0xCE)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8c, 0xFF, 0x5A)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xC0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0E, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/* TTY RX */ -#define TTY_HEADSET_MONO_RX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x97, 0xFF, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x06)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x01)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x4C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x45)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFF, 0x29)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0xC5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFE, 0xC8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0x27, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -/* TTY TX */ -#define TTY_HEADSET_MONO_TX_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0xFF, 0x1E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x93, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0xFF, 0x1B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x99, 0x0F, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x9F, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0xA8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x65)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x04, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xC0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x0D, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x14, 0xFF, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x11, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x12, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_RX_CAPLESS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x4e)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x04, 0xff, 0xBC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x64)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x25, 0x0F, 0x0B)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xfc, 0xfc)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xff, 0xa2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0xFF, 0xab)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x80)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0xf0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x23, 0xff, 0x20)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3B, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xff, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0f, 0x0c)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8a, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3b, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3c, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x34, 0xf0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x80, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HEADSET_STEREO_SPEAKER_STEREO_RX_CAPLESS_48000_OSR_256 \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x6C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFF, 0x29)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x1388}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0xF5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x48)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x1388}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0xF8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x24, 0x24)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0x27, 0x24)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x24, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HS_DMIC2_STEREO_8000_OSR_256 \ - {{ADIE_CODEC_ACTION_DELAY_WAIT, 0xbb8 }, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x05, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x82, 0x1F, 0x1E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x0C, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x92, 0x3F, 0x19)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0x3F, 0x24)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x39, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA8, 0x0F, 0x0E)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xAB, 0x3F, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x86, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x87, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xC0)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0xC0, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x92, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x94, 0xFF, 0x1B)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HPH_PRI_AB_LEG_STEREO \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x6C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x09)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x59)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0x186A0}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0xF9)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0x27, 0x27)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define HPH_PRI_D_LEG_STEREO \ - {{ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x80, 0x02, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xA3, 0x02, 0x02)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x84, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x85, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x0C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x81, 0xFF, 0x0E)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x83, 0x03, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x21, 0xFF, 0x60)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x22, 0xFF, 0xE1)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x24, 0x6F, 0x6C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x26, 0xFF, 0xD0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2D, 0xFF, 0x6F)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2E, 0xFF, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3F, 0xFF, 0x0F)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x40, 0xFF, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x41, 0x08, 0x08)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x42, 0xFF, 0xBB)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x43, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x44, 0xF7, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x45, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x46, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x47, 0xFF, 0xF2)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x48, 0xF7, 0x37)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x49, 0xFF, 0xFF)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4A, 0xFF, 0x77)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0x8C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x0F, 0x0A)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 300000}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x0F, 0x0F)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3E, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x0F, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define LB_AUXPGA_HPH_AB_CPLS_STEREO \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2F, 0xFF, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x30, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFD, 0x05)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFD, 0x55)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x30, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xFF, 0xAA)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFD, 0xF5)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x4C, 0xFF, 0x29)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0x90, 0x90)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x04)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE2, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE3, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0x30, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3C, 0xFF, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0xFD, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#define LB_AUXPGA_LO_STEREO \ - {{ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x2F, 0xFF, 0x44)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x30, 0xFF, 0x92)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x08)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x58)}, \ - {ADIE_CODEC_ACTION_DELAY_WAIT, 0xBB8}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0xF8)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x38, 0xFF, 0xAA)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x90, 0x90)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0xF0, 0x30)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xB7, 0x01, 0x01)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x10)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_ANALOG_READY}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0xF0, 0xF0)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x8A, 0x0F, 0x03)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x1C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFE, 0x3C)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE0, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0xE1, 0xFC, 0xAC)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x33, 0xF0, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x32, 0xF8, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x31, 0x01, 0x00)}, \ - {ADIE_CODEC_ACTION_ENTRY, ADIE_CODEC_PACK_ENTRY(0x3A, 0x90, 0x00)}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_ANALOG_OFF}, \ - {ADIE_CODEC_ACTION_STAGE_REACHED, ADIE_CODEC_DIGITAL_OFF} } - -#endif diff --git a/arch/arm/mach-msm/qdsp5v2/voice.c b/arch/arm/mach-msm/qdsp5v2/voice.c deleted file mode 100644 index 1ac79d463e42..000000000000 --- a/arch/arm/mach-msm/qdsp5v2/voice.c +++ /dev/null @@ -1,752 +0,0 @@ -/* Copyright (c) 2009-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct voice_data { - void *handle; /* DALRPC handle */ - void *cb_handle; /* DALRPC callback handle */ - int network; /* Network information */ - int dev_state;/*READY, CHANGE, REL_DONE,INIT*/ - int voc_state;/*INIT, CHANGE, RELEASE, ACQUIRE */ - struct mutex voc_lock; - struct mutex vol_lock; - int voc_event; - int dev_event; - atomic_t rel_start_flag; - atomic_t acq_start_flag; - atomic_t chg_start_flag; - struct task_struct *task; - struct completion complete; - wait_queue_head_t dev_wait; - wait_queue_head_t voc_wait; - uint32_t device_events; - /* cache the values related to Rx and Tx */ - struct device_data dev_rx; - struct device_data dev_tx; - /* these default values are for all devices */ - uint32_t default_mute_val; - uint32_t default_vol_val; - uint32_t default_sample_val; - /* call status */ - int v_call_status; /* Start or End */ - s32 max_rx_vol[VOC_RX_VOL_ARRAY_NUM]; /* [0] is for NB, [1] for WB */ - s32 min_rx_vol[VOC_RX_VOL_ARRAY_NUM]; -}; - -static struct voice_data voice; - -static int voice_cmd_device_info(struct voice_data *); -static int voice_cmd_acquire_done(struct voice_data *); -static void voice_auddev_cb_function(u32 evt_id, - union auddev_evt_data *evt_payload, - void *private_data); - -static int voice_cmd_change(void) -{ - - struct voice_header hdr; - struct voice_data *v = &voice; - int err; - - hdr.id = CMD_DEVICE_CHANGE; - hdr.data_len = 0; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - err = dalrpc_fcn_5(VOICE_DALRPC_CMD, v->handle, &hdr, - sizeof(struct voice_header)); - - if (err) - MM_ERR("Voice change command failed\n"); - return err; -} - -static void voice_auddev_cb_function(u32 evt_id, - union auddev_evt_data *evt_payload, - void *private_data) -{ - struct voice_data *v = &voice; - int rc = 0, i; - - MM_INFO("auddev_cb_function, evt_id=%d, dev_state=%d, voc_state=%d\n", - evt_id, v->dev_state, v->voc_state); - if ((evt_id != AUDDEV_EVT_START_VOICE) || - (evt_id != AUDDEV_EVT_END_VOICE)) { - if (evt_payload == NULL) { - MM_ERR(" evt_payload is NULL pointer\n"); - return; - } - } - switch (evt_id) { - case AUDDEV_EVT_START_VOICE: - if ((v->dev_state == DEV_INIT) || - (v->dev_state == DEV_REL_DONE)) { - v->v_call_status = VOICE_CALL_START; - if ((v->dev_rx.enabled == VOICE_DEV_ENABLED) - && (v->dev_tx.enabled == VOICE_DEV_ENABLED)) { - v->dev_state = DEV_READY; - MM_DBG("dev_state into ready\n"); - wake_up(&v->dev_wait); - } - if (v->voc_state == VOICE_CHANGE) { - MM_DBG("voc_state is in VOICE_CHANGE\n"); - v->voc_state = VOICE_ACQUIRE; - } - } - break; - case AUDDEV_EVT_DEV_CHG_VOICE: - if (v->dev_state == DEV_READY) { - v->dev_rx.enabled = VOICE_DEV_DISABLED; - v->dev_tx.enabled = VOICE_DEV_DISABLED; - v->dev_state = DEV_CHANGE; - mutex_lock(&voice.voc_lock); - if (v->voc_state == VOICE_ACQUIRE) { - /* send device change to modem */ - voice_cmd_change(); - mutex_unlock(&voice.voc_lock); - msm_snddev_enable_sidetone(v->dev_rx.dev_id, - 0); - /* block to wait for CHANGE_START */ - rc = wait_event_interruptible( - v->voc_wait, (v->voc_state == VOICE_CHANGE) - || (atomic_read(&v->chg_start_flag) == 1) - || (atomic_read(&v->rel_start_flag) == 1)); - } else { - mutex_unlock(&voice.voc_lock); - MM_ERR(" Voice is not at ACQUIRE state\n"); - } - } else if ((v->dev_state == DEV_INIT) || - (v->dev_state == DEV_REL_DONE)) { - v->dev_rx.enabled = VOICE_DEV_DISABLED; - v->dev_tx.enabled = VOICE_DEV_DISABLED; - } else - MM_ERR(" device is not at proper state\n"); - break; - case AUDDEV_EVT_DEV_RDY: - /* update the dev info */ - if (evt_payload->voc_devinfo.dev_type == DIR_RX) { - for (i = 0; i < VOC_RX_VOL_ARRAY_NUM; i++) { - v->max_rx_vol[i] = - evt_payload->voc_devinfo.max_rx_vol[i]; - v->min_rx_vol[i] = - evt_payload->voc_devinfo.min_rx_vol[i]; - } - } - if (v->dev_state == DEV_CHANGE) { - if (evt_payload->voc_devinfo.dev_type == DIR_RX) { - v->dev_rx.dev_acdb_id = - evt_payload->voc_devinfo.acdb_dev_id; - v->dev_rx.sample = - evt_payload->voc_devinfo.dev_sample; - v->dev_rx.dev_id = - evt_payload->voc_devinfo.dev_id; - v->dev_rx.enabled = VOICE_DEV_ENABLED; - } else { - v->dev_tx.dev_acdb_id = - evt_payload->voc_devinfo.acdb_dev_id; - v->dev_tx.sample = - evt_payload->voc_devinfo.dev_sample; - v->dev_tx.enabled = VOICE_DEV_ENABLED; - v->dev_tx.dev_id = - evt_payload->voc_devinfo.dev_id; - } - if ((v->dev_rx.enabled == VOICE_DEV_ENABLED) && - (v->dev_tx.enabled == VOICE_DEV_ENABLED)) { - v->dev_state = DEV_READY; - MM_DBG("dev state into ready\n"); - voice_cmd_device_info(v); - wake_up(&v->dev_wait); - mutex_lock(&voice.voc_lock); - if (v->voc_state == VOICE_CHANGE) { - v->dev_event = DEV_CHANGE_READY; - complete(&v->complete); - } - mutex_unlock(&voice.voc_lock); - } - } else if ((v->dev_state == DEV_INIT) || - (v->dev_state == DEV_REL_DONE)) { - if (evt_payload->voc_devinfo.dev_type == DIR_RX) { - v->dev_rx.dev_acdb_id = - evt_payload->voc_devinfo.acdb_dev_id; - v->dev_rx.sample = - evt_payload->voc_devinfo.dev_sample; - v->dev_rx.dev_id = - evt_payload->voc_devinfo.dev_id; - v->dev_rx.enabled = VOICE_DEV_ENABLED; - } else { - v->dev_tx.dev_acdb_id = - evt_payload->voc_devinfo.acdb_dev_id; - v->dev_tx.sample = - evt_payload->voc_devinfo.dev_sample; - v->dev_tx.dev_id = - evt_payload->voc_devinfo.dev_id; - v->dev_tx.enabled = VOICE_DEV_ENABLED; - } - if ((v->dev_rx.enabled == VOICE_DEV_ENABLED) && - (v->dev_tx.enabled == VOICE_DEV_ENABLED) && - (v->v_call_status == VOICE_CALL_START)) { - v->dev_state = DEV_READY; - MM_DBG("dev state into ready\n"); - voice_cmd_device_info(v); - wake_up(&v->dev_wait); - mutex_lock(&voice.voc_lock); - if (v->voc_state == VOICE_CHANGE) { - v->dev_event = DEV_CHANGE_READY; - complete(&v->complete); - } - mutex_unlock(&voice.voc_lock); - } - } else - MM_ERR("Receive READY not at the proper state =%d\n", - v->dev_state); - break; - case AUDDEV_EVT_DEVICE_VOL_MUTE_CHG: - if (evt_payload->voc_devinfo.dev_type == DIR_TX) - v->dev_tx.mute = - evt_payload->voc_vm_info.dev_vm_val.mute; - else - v->dev_rx.volume = evt_payload-> - voc_vm_info.dev_vm_val.vol; - /* send device info */ - voice_cmd_device_info(v); - break; - case AUDDEV_EVT_REL_PENDING: - /* recover the tx mute and rx volume to the default values */ - if (v->dev_state == DEV_READY) { - if (atomic_read(&v->rel_start_flag)) { - atomic_dec(&v->rel_start_flag); - if (evt_payload->voc_devinfo.dev_type == DIR_RX) - v->dev_rx.enabled = VOICE_DEV_DISABLED; - else - v->dev_tx.enabled = VOICE_DEV_DISABLED; - v->dev_state = DEV_REL_DONE; - wake_up(&v->dev_wait); - break; - } - mutex_lock(&voice.voc_lock); - if ((v->voc_state == VOICE_RELEASE) || - (v->voc_state == VOICE_INIT)) { - if (evt_payload->voc_devinfo.dev_type - == DIR_RX) { - v->dev_rx.enabled = VOICE_DEV_DISABLED; - } else { - v->dev_tx.enabled = VOICE_DEV_DISABLED; - } - v->dev_state = DEV_REL_DONE; - mutex_unlock(&voice.voc_lock); - wake_up(&v->dev_wait); - } else { - /* send device change to modem */ - voice_cmd_change(); - mutex_unlock(&voice.voc_lock); - rc = wait_event_interruptible( - v->voc_wait, (v->voc_state == VOICE_CHANGE) - || (atomic_read(&v->chg_start_flag) == 1) - || (atomic_read(&v->rel_start_flag) == 1)); - if (atomic_read(&v->rel_start_flag) == 1) - atomic_dec(&v->rel_start_flag); - /* clear Rx/Tx to Disable */ - if (evt_payload->voc_devinfo.dev_type == DIR_RX) - v->dev_rx.enabled = VOICE_DEV_DISABLED; - else - v->dev_tx.enabled = VOICE_DEV_DISABLED; - v->dev_state = DEV_REL_DONE; - wake_up(&v->dev_wait); - } - } else if ((v->dev_state == DEV_INIT) || - (v->dev_state == DEV_REL_DONE)) { - if (evt_payload->voc_devinfo.dev_type == DIR_RX) - v->dev_rx.enabled = VOICE_DEV_DISABLED; - else - v->dev_tx.enabled = VOICE_DEV_DISABLED; - } - break; - case AUDDEV_EVT_END_VOICE: - /* recover the tx mute and rx volume to the default values */ - v->dev_tx.mute = v->default_mute_val; - v->dev_rx.volume = v->default_vol_val; - - if (v->dev_rx.enabled == VOICE_DEV_ENABLED) - msm_snddev_enable_sidetone(v->dev_rx.dev_id, 0); - - if ((v->dev_state == DEV_READY) || - (v->dev_state == DEV_CHANGE)) { - if (atomic_read(&v->rel_start_flag)) { - atomic_dec(&v->rel_start_flag); - v->v_call_status = VOICE_CALL_END; - v->dev_state = DEV_REL_DONE; - wake_up(&v->dev_wait); - break; - } - mutex_lock(&voice.voc_lock); - if ((v->voc_state == VOICE_RELEASE) || - (v->voc_state == VOICE_INIT)) { - v->v_call_status = VOICE_CALL_END; - v->dev_state = DEV_REL_DONE; - mutex_unlock(&voice.voc_lock); - wake_up(&v->dev_wait); - } else { - /* send mute and default volume value to MCAD */ - voice_cmd_device_info(v); - /* send device change to modem */ - voice_cmd_change(); - mutex_unlock(&voice.voc_lock); - /* block to wait for RELEASE_START - or CHANGE_START */ - rc = wait_event_interruptible( - v->voc_wait, (v->voc_state == VOICE_CHANGE) - || (atomic_read(&v->chg_start_flag) == 1) - || (atomic_read(&v->rel_start_flag) == 1)); - if (atomic_read(&v->rel_start_flag) == 1) - atomic_dec(&v->rel_start_flag); - /* set voice call to END state */ - v->v_call_status = VOICE_CALL_END; - v->dev_state = DEV_REL_DONE; - wake_up(&v->dev_wait); - } - } else - v->v_call_status = VOICE_CALL_END; - break; - case AUDDEV_EVT_FREQ_CHG: - MM_DBG("Voice Driver got sample rate change Event\n"); - MM_DBG("sample rate %d\n", evt_payload->freq_info.sample_rate); - MM_DBG("dev_type %d\n", evt_payload->freq_info.dev_type); - MM_DBG("acdb_dev_id %d\n", evt_payload->freq_info.acdb_dev_id); - if (v->dev_state == DEV_READY) { - v->dev_tx.enabled = VOICE_DEV_DISABLED; - v->dev_state = DEV_CHANGE; - mutex_lock(&voice.voc_lock); - if (v->voc_state == VOICE_ACQUIRE) { - msm_snddev_enable_sidetone(v->dev_rx.dev_id, - 0); - /* send device change to modem */ - voice_cmd_change(); - mutex_unlock(&voice.voc_lock); - /* block to wait for CHANGE_START */ - rc = wait_event_interruptible( - v->voc_wait, (v->voc_state == VOICE_CHANGE) - || (atomic_read(&v->chg_start_flag) == 1) - || (atomic_read(&v->rel_start_flag) == 1)); - } else { - mutex_unlock(&voice.voc_lock); - MM_ERR(" Voice is not at ACQUIRE state\n"); - } - } else if ((v->dev_state == DEV_INIT) || - (v->dev_state == DEV_REL_DONE)) { - v->dev_tx.enabled = VOICE_DEV_DISABLED; - } else - MM_ERR("Event not at the proper state =%d\n", - v->dev_state); - break; - default: - MM_ERR("UNKNOWN EVENT\n"); - } - return; -} -EXPORT_SYMBOL(voice_auddev_cb_function); - -static void remote_cb_function(void *context, u32 param, - void *evt_buf, u32 len) -{ - struct voice_header *hdr; - struct voice_data *v = context; - - hdr = (struct voice_header *)evt_buf; - - MM_INFO("len=%d id=%d\n", len, hdr->id); - - if (len <= 0) { - MM_ERR("unexpected event with length %d \n", len); - return; - } - - switch (hdr->id) { - case EVENT_ACQUIRE_START: - atomic_inc(&v->acq_start_flag); - wake_up(&v->dev_wait); - v->voc_event = VOICE_ACQUIRE_START; - v->network = ((struct voice_network *)evt_buf)->network_info; - complete(&v->complete); - break; - case EVENT_RELEASE_START: - /* If ACQUIRED come in before the RELEASE, - * will only services the RELEASE */ - atomic_inc(&v->rel_start_flag); - wake_up(&v->voc_wait); - wake_up(&v->dev_wait); - v->voc_event = VOICE_RELEASE_START; - complete(&v->complete); - break; - case EVENT_CHANGE_START: - atomic_inc(&v->chg_start_flag); - wake_up(&v->voc_wait); - v->voc_event = VOICE_CHANGE_START; - complete(&v->complete); - break; - case EVENT_NETWORK_RECONFIG: - /* send network change to audio_dev, - if sample rate is less than 16k, - otherwise, send acquire done */ - v->voc_event = VOICE_NETWORK_RECONFIG; - v->network = ((struct voice_network *)evt_buf)->network_info; - complete(&v->complete); - break; - default: - MM_ERR("Undefined event %d \n", hdr->id); - } - -} - -static int voice_cmd_init(struct voice_data *v) -{ - - struct voice_init cmd; - int err; - - MM_DBG("\n"); /* Macro prints the file name and function */ - - cmd.hdr.id = CMD_VOICE_INIT; - cmd.hdr.data_len = sizeof(struct voice_init) - - sizeof(struct voice_header); - cmd.cb_handle = v->cb_handle; - - err = dalrpc_fcn_5(VOICE_DALRPC_CMD, v->handle, &cmd, - sizeof(struct voice_init)); - - if (err) - MM_ERR("Voice init command failed\n"); - return err; -} - -static int voice_cmd_acquire_done(struct voice_data *v) -{ - struct voice_header hdr; - int err; - - hdr.id = CMD_ACQUIRE_DONE; - hdr.data_len = 0; - - MM_INFO("\n"); /* Macro prints the file name and function */ - - /* Enable HW sidetone if device supports it */ - msm_snddev_enable_sidetone(v->dev_rx.dev_id, 1); - - err = dalrpc_fcn_5(VOICE_DALRPC_CMD, v->handle, &hdr, - sizeof(struct voice_header)); - - if (err) - MM_ERR("Voice acquire done command failed\n"); - return err; -} - -static int voice_cmd_device_info(struct voice_data *v) -{ - struct voice_device cmd; - int err, vol; - - MM_INFO("tx_dev=%d, rx_dev=%d, tx_sample=%d, tx_mute=%d\n", - v->dev_tx.dev_acdb_id, v->dev_rx.dev_acdb_id, - v->dev_tx.sample, v->dev_tx.mute); - - mutex_lock(&voice.vol_lock); - - cmd.hdr.id = CMD_DEVICE_INFO; - cmd.hdr.data_len = sizeof(struct voice_device) - - sizeof(struct voice_header); - cmd.tx_device = v->dev_tx.dev_acdb_id; - cmd.rx_device = v->dev_rx.dev_acdb_id; - if (v->network == NETWORK_WCDMA_WB) - vol = v->min_rx_vol[VOC_WB_INDEX] + - ((v->max_rx_vol[VOC_WB_INDEX] - - v->min_rx_vol[VOC_WB_INDEX]) * v->dev_rx.volume)/100; - else - vol = v->min_rx_vol[VOC_NB_INDEX] + - ((v->max_rx_vol[VOC_NB_INDEX] - - v->min_rx_vol[VOC_NB_INDEX]) * v->dev_rx.volume)/100; - cmd.rx_volume = (u32)vol; /* in mb */ - cmd.rx_mute = 0; - cmd.tx_mute = v->dev_tx.mute; - cmd.rx_sample = v->dev_rx.sample/1000; - cmd.tx_sample = v->dev_tx.sample/1000; - - MM_DBG("rx_vol=%d, rx_sample=%d\n", cmd.rx_volume, v->dev_rx.sample); - - err = dalrpc_fcn_5(VOICE_DALRPC_CMD, v->handle, &cmd, - sizeof(struct voice_device)); - - mutex_unlock(&voice.vol_lock); - - if (err) - MM_ERR("Voice device command failed\n"); - return err; -} -EXPORT_SYMBOL(voice_cmd_device_info); - -void voice_change_sample_rate(struct voice_data *v) -{ - int freq = 48000; - int rc = 0; - - MM_DBG("network =%d, vote freq=%d\n", v->network, freq); - if (freq != v->dev_tx.sample) { - rc = msm_snddev_request_freq(&freq, 0, - SNDDEV_CAP_TX, AUDDEV_CLNT_VOC); - if (rc >= 0) { - v->dev_tx.sample = freq; - MM_DBG(" vote for freq=%d successfully \n", freq); - } else - MM_ERR(" voting for freq=%d failed.\n", freq); - } -} - -static int voice_thread(void *data) -{ - struct voice_data *v = (struct voice_data *)data; - int rc = 0; - - MM_INFO("voice_thread() start\n"); - - while (!kthread_should_stop()) { - wait_for_completion(&v->complete); - init_completion(&v->complete); - - MM_DBG(" voc_event=%d, voice state =%d, dev_event=%d\n", - v->voc_event, v->voc_state, v->dev_event); - switch (v->voc_event) { - case VOICE_ACQUIRE_START: - /* check if dev_state = READY */ - /* if ready, send device_info and acquire_done */ - /* if not ready, block to wait the dev_state = READY */ - if ((v->voc_state == VOICE_INIT) || - (v->voc_state == VOICE_RELEASE)) { - if (v->dev_state == DEV_READY) { - mutex_lock(&voice.voc_lock); - voice_change_sample_rate(v); - rc = voice_cmd_device_info(v); - rc = voice_cmd_acquire_done(v); - v->voc_state = VOICE_ACQUIRE; - mutex_unlock(&voice.voc_lock); - broadcast_event( - AUDDEV_EVT_VOICE_STATE_CHG, - VOICE_STATE_INCALL, SESSION_IGNORE); - } else { - rc = wait_event_interruptible( - v->dev_wait, - (v->dev_state == DEV_READY) - || (atomic_read(&v->rel_start_flag) - == 1)); - if (atomic_read(&v->rel_start_flag) - == 1) { - v->voc_state = VOICE_RELEASE; - atomic_dec(&v->rel_start_flag); - msm_snddev_withdraw_freq(0, - SNDDEV_CAP_TX, AUDDEV_CLNT_VOC); - broadcast_event( - AUDDEV_EVT_VOICE_STATE_CHG, - VOICE_STATE_OFFCALL, - SESSION_IGNORE); - } else { - mutex_lock(&voice.voc_lock); - voice_change_sample_rate(v); - rc = voice_cmd_device_info(v); - rc = voice_cmd_acquire_done(v); - v->voc_state = VOICE_ACQUIRE; - mutex_unlock(&voice.voc_lock); - broadcast_event( - AUDDEV_EVT_VOICE_STATE_CHG, - VOICE_STATE_INCALL, - SESSION_IGNORE); - } - } - } else - MM_ERR("Get this event at the wrong state\n"); - if (atomic_read(&v->acq_start_flag)) - atomic_dec(&v->acq_start_flag); - break; - case VOICE_RELEASE_START: - MM_DBG("broadcast voice call end\n"); - broadcast_event(AUDDEV_EVT_VOICE_STATE_CHG, - VOICE_STATE_OFFCALL, SESSION_IGNORE); - if ((v->dev_state == DEV_REL_DONE) || - (v->dev_state == DEV_INIT)) { - v->voc_state = VOICE_RELEASE; - msm_snddev_withdraw_freq(0, SNDDEV_CAP_TX, - AUDDEV_CLNT_VOC); - } else { - /* wait for the dev_state = RELEASE */ - rc = wait_event_interruptible(v->dev_wait, - (v->dev_state == DEV_REL_DONE) - || (atomic_read(&v->acq_start_flag) == 1)); - if (atomic_read(&v->acq_start_flag) == 1) - atomic_dec(&v->acq_start_flag); - v->voc_state = VOICE_RELEASE; - msm_snddev_withdraw_freq(0, SNDDEV_CAP_TX, - AUDDEV_CLNT_VOC); - } - if (atomic_read(&v->rel_start_flag)) - atomic_dec(&v->rel_start_flag); - break; - case VOICE_CHANGE_START: - if (v->voc_state == VOICE_ACQUIRE) - v->voc_state = VOICE_CHANGE; - else - MM_ERR("Get this event at the wrong state\n"); - wake_up(&v->voc_wait); - if (atomic_read(&v->chg_start_flag)) - atomic_dec(&v->chg_start_flag); - break; - case VOICE_NETWORK_RECONFIG: - if ((v->voc_state == VOICE_ACQUIRE) - || (v->voc_state == VOICE_CHANGE)) { - voice_change_sample_rate(v); - rc = voice_cmd_device_info(v); - rc = voice_cmd_acquire_done(v); - } - break; - default: - break; - } - - switch (v->dev_event) { - case DEV_CHANGE_READY: - if (v->voc_state == VOICE_CHANGE) { - mutex_lock(&voice.voc_lock); - msm_snddev_enable_sidetone(v->dev_rx.dev_id, - 1); - /* update voice state */ - v->voc_state = VOICE_ACQUIRE; - v->dev_event = 0; - mutex_unlock(&voice.voc_lock); - broadcast_event(AUDDEV_EVT_VOICE_STATE_CHG, - VOICE_STATE_INCALL, SESSION_IGNORE); - } else { - mutex_lock(&voice.voc_lock); - v->dev_event = 0; - mutex_unlock(&voice.voc_lock); - MM_ERR("Get this event at the wrong state\n"); - } - break; - default: - mutex_lock(&voice.voc_lock); - v->dev_event = 0; - mutex_unlock(&voice.voc_lock); - break; - } - } - return 0; -} - -static int __init voice_init(void) -{ - int rc, i; - struct voice_data *v = &voice; - MM_INFO("\n"); /* Macro prints the file name and function */ - - mutex_init(&voice.voc_lock); - mutex_init(&voice.vol_lock); - v->handle = NULL; - v->cb_handle = NULL; - - /* set default value */ - v->default_mute_val = 1; /* default is mute */ - v->default_vol_val = 0; - v->default_sample_val = 8000; - for (i = 0; i < VOC_RX_VOL_ARRAY_NUM; i++) { - v->max_rx_vol[i] = 0; - v->min_rx_vol[i] = 0; - } - v->network = NETWORK_GSM; - - /* initialize dev_rx and dev_tx */ - memset(&v->dev_tx, 0, sizeof(struct device_data)); - memset(&v->dev_rx, 0, sizeof(struct device_data)); - v->dev_rx.volume = v->default_vol_val; - v->dev_tx.mute = v->default_mute_val; - - v->dev_state = DEV_INIT; - v->voc_state = VOICE_INIT; - atomic_set(&v->rel_start_flag, 0); - atomic_set(&v->acq_start_flag, 0); - v->dev_event = 0; - v->voc_event = 0; - init_completion(&voice.complete); - init_waitqueue_head(&v->dev_wait); - init_waitqueue_head(&v->voc_wait); - - /* get device handle */ - rc = daldevice_attach(VOICE_DALRPC_DEVICEID, - VOICE_DALRPC_PORT_NAME, - VOICE_DALRPC_CPU, - &v->handle); - if (rc) { - MM_ERR("Voc DALRPC call to Modem attach failed\n"); - goto done; - } - - /* Allocate the callback handle */ - v->cb_handle = dalrpc_alloc_cb(v->handle, remote_cb_function, v); - if (v->cb_handle == NULL) { - MM_ERR("Allocate Callback failure\n"); - goto err; - } - - /* setup the callback */ - rc = voice_cmd_init(v); - if (rc) - goto err1; - - v->device_events = AUDDEV_EVT_DEV_CHG_VOICE | - AUDDEV_EVT_DEV_RDY | - AUDDEV_EVT_REL_PENDING | - AUDDEV_EVT_START_VOICE | - AUDDEV_EVT_END_VOICE | - AUDDEV_EVT_DEVICE_VOL_MUTE_CHG | - AUDDEV_EVT_FREQ_CHG; - - MM_DBG(" to register call back \n"); - /* register callback to auddev */ - auddev_register_evt_listner(v->device_events, AUDDEV_CLNT_VOC, - 0, voice_auddev_cb_function, v); - - /* create and start thread */ - v->task = kthread_run(voice_thread, v, "voice"); - if (IS_ERR(v->task)) { - rc = PTR_ERR(v->task); - v->task = NULL; - } else - goto done; - -err1: dalrpc_dealloc_cb(v->handle, v->cb_handle); -err: - daldevice_detach(v->handle); - v->handle = NULL; -done: - return rc; -} - -late_initcall(voice_init); diff --git a/arch/arm/mach-msm/qdsp6/Makefile b/arch/arm/mach-msm/qdsp6/Makefile deleted file mode 100644 index 9a5561261bfc..000000000000 --- a/arch/arm/mach-msm/qdsp6/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -obj-y += dal.o -obj-y += q6audio.o -obj-y += analog_audio.o -obj-y += pcm_out.o -obj-y += pcm_in.o -obj-y += auxpcm_lb_out.o -obj-y += auxpcm_lb_in.o -obj-y += aac_in.o -obj-y += qcelp_in.o -obj-y += evrc_in.o -obj-y += amrnb_in.o -obj-y += mp3.o -obj-y += dtmf.o -obj-y += routing.o -obj-y += audio_ctl.o -obj-y += msm_q6vdec.o -obj-y += msm_q6venc.o -obj-y += dsp_debug.o -obj-$(CONFIG_QSD_AUDIO) += audiov2/ diff --git a/arch/arm/mach-msm/qdsp6/aac_in.c b/arch/arm/mach-msm/qdsp6/aac_in.c deleted file mode 100644 index 6e3bf94a8a3c..000000000000 --- a/arch/arm/mach-msm/qdsp6/aac_in.c +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define AAC_FC_BUFF_CNT 10 -#define AAC_READ_TIMEOUT 2000 -struct aac_fc_buff { - struct mutex lock; - int empty; - void *data; - int size; - int actual_size; -}; - -struct aac_fc { - struct task_struct *task; - wait_queue_head_t fc_wq; - struct aac_fc_buff fc_buff[AAC_FC_BUFF_CNT]; - int buff_index; -}; -struct aac { - struct mutex lock; - struct msm_audio_aac_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; - struct msm_voicerec_mode voicerec_mode; - struct aac_fc *aac_fc; -}; - -static int q6_aac_flowcontrol(void *data) -{ - struct audio_client *ac; - struct audio_buffer *ab; - struct aac *aac = data; - int buff_index = 0; - int xfer = 0; - struct aac_fc *fc; - - - ac = aac->audio_client; - fc = aac->aac_fc; - if (!ac) { - pr_err("[%s:%s] audio_client is NULL\n", __MM_FILE__, __func__); - return 0; - } - - while (!kthread_should_stop()) { - ab = ac->buf + ac->cpu_buf; - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d\n", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = ab->actual_size; - - mutex_lock(&(fc->fc_buff[buff_index].lock)); - if (!fc->fc_buff[buff_index].empty) { - pr_err("[%s:%s] flow control buffer[%d] not read!\n", - __MM_FILE__, __func__, buff_index); - } - - if (fc->fc_buff[buff_index].size < xfer) { - pr_err("[%s:%s] buffer %d too small\n", __MM_FILE__, - __func__, buff_index); - memcpy(fc->fc_buff[buff_index].data, - ab->data, fc->fc_buff[buff_index].size); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = - fc->fc_buff[buff_index].size; - } else { - memcpy(fc->fc_buff[buff_index].data, ab->data, xfer); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = xfer; - } - mutex_unlock(&(fc->fc_buff[buff_index].lock)); - /*wake up client, if any*/ - wake_up(&fc->fc_wq); - - buff_index++; - if (buff_index >= AAC_FC_BUFF_CNT) - buff_index = 0; - - ab->used = 1; - - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - return 0; -} -static long q6_aac_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct aac *aac = file->private_data; - int rc = 0; - int i = 0; - struct aac_fc *fc; - int size = 0; - - mutex_lock(&aac->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: - break; - case AUDIO_GET_STATS: - { - struct msm_audio_stats stats; - pr_debug("[%s:%s] GET_STATS\n", __MM_FILE__, __func__); - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - case AUDIO_START: - { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else { - if (copy_from_user(&acdb_id, (void *) arg, - sizeof(acdb_id))) { - rc = -EFAULT; - break; - } - } - if (aac->audio_client) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } else { - aac->audio_client = q6audio_open_aac( - aac->str_cfg.buffer_size, - aac->cfg.sample_rate, - aac->cfg.channels, - aac->cfg.bit_rate, - aac->cfg.stream_format, - aac->voicerec_mode.rec_mode, acdb_id); - - if (aac->audio_client < 0) { - pr_err("[%s:%s] aac open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - break; - } - } - - /*allocate flow control buffers*/ - fc = aac->aac_fc; - size = ((aac->str_cfg.buffer_size < 1543) ? 1543 : - aac->str_cfg.buffer_size); - for (i = 0; i < AAC_FC_BUFF_CNT; ++i) { - mutex_init(&(fc->fc_buff[i].lock)); - fc->fc_buff[i].empty = 1; - fc->fc_buff[i].data = kmalloc(size, GFP_KERNEL); - if (fc->fc_buff[i].data == NULL) { - pr_err("[%s:%s] No memory for FC buffers\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - goto fc_fail; - } - fc->fc_buff[i].size = size; - fc->fc_buff[i].actual_size = 0; - } - - /*create flow control thread*/ - fc->task = kthread_run(q6_aac_flowcontrol, - aac, "aac_flowcontrol"); - if (IS_ERR(fc->task)) { - rc = PTR_ERR(fc->task); - pr_err("[%s:%s] error creating flow control thread\n", - __MM_FILE__, __func__); - goto fc_fail; - } - break; -fc_fail: - /*free flow control buffers*/ - --i; - for (; i >= 0; i--) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_INCALL: { - pr_debug("[%s:%s] SET_INCALL\n", __MM_FILE__, __func__); - if (copy_from_user(&aac->voicerec_mode, - (void *)arg, sizeof(struct msm_voicerec_mode))) - rc = -EFAULT; - - if (aac->voicerec_mode.rec_mode != AUDIO_FLAG_READ - && aac->voicerec_mode.rec_mode != - AUDIO_FLAG_INCALL_MIXED) { - aac->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - pr_err("[%s:%s] Invalid rec_mode\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - } - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &aac->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, aac->str_cfg.buffer_size, - aac->str_cfg.buffer_count); - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&aac->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, aac->str_cfg.buffer_size, - aac->str_cfg.buffer_count); - if (aac->str_cfg.buffer_size < 1543) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - if (aac->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - - break; - case AUDIO_SET_AAC_ENC_CONFIG: - if (copy_from_user(&aac->cfg, (void *) arg, - sizeof(struct msm_audio_aac_enc_config))) { - rc = -EFAULT; - } - pr_debug("[%s:%s] SET_AAC_ENC_CONFIG: channels=%d, rate=%d\n", - __MM_FILE__, __func__, aac->cfg.channels, - aac->cfg.sample_rate); - if (aac->cfg.channels < 1 || aac->cfg.channels > 2) { - pr_err("[%s:%s]invalid number of channels\n", - __MM_FILE__, __func__); - rc = -EINVAL; - } - if (aac->cfg.sample_rate != 48000) { - pr_err("[%s:%s] only 48KHz is supported\n", - __MM_FILE__, __func__); - rc = -EINVAL; - } - if (aac->cfg.stream_format != AUDIO_AAC_FORMAT_RAW && - aac->cfg.stream_format != AUDIO_AAC_FORMAT_ADTS) { - pr_err("[%s:%s] unsupported AAC format\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - case AUDIO_GET_AAC_ENC_CONFIG: - if (copy_to_user((void *) arg, &aac->cfg, - sizeof(struct msm_audio_aac_enc_config))) { - rc = -EFAULT; - } - pr_debug("[%s:%s] GET_AAC_ENC_CONFIG: channels=%d, rate=%d\n", - __MM_FILE__, __func__, aac->cfg.channels, - aac->cfg.sample_rate); - break; - default: - rc = -EINVAL; - } - - mutex_unlock(&aac->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int q6_aac_in_open(struct inode *inode, struct file *file) -{ - - struct aac *aac; - struct aac_fc *fc; - int i; - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - aac = kmalloc(sizeof(struct aac), GFP_KERNEL); - if (aac == NULL) { - pr_err("[%s:%s] Could not allocate memory for aac driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&aac->lock); - file->private_data = aac; - aac->audio_client = NULL; - aac->str_cfg.buffer_size = 1543; - aac->str_cfg.buffer_count = 2; - aac->cfg.channels = 1; - aac->cfg.bit_rate = 192000; - aac->cfg.stream_format = AUDIO_AAC_FORMAT_ADTS; - aac->cfg.sample_rate = 48000; - aac->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - - aac->aac_fc = kmalloc(sizeof(struct aac_fc), GFP_KERNEL); - if (aac->aac_fc == NULL) { - pr_err("[%s:%s] Could not allocate memory for aac_fc\n", - __MM_FILE__, __func__); - kfree(aac); - return -ENOMEM; - } - fc = aac->aac_fc; - fc->task = NULL; - fc->buff_index = 0; - for (i = 0; i < AAC_FC_BUFF_CNT; ++i) { - fc->fc_buff[i].data = NULL; - fc->fc_buff[i].size = 0; - fc->fc_buff[i].actual_size = 0; - } - /*initialize wait queue head*/ - init_waitqueue_head(&fc->fc_wq); - return 0; -} - -static ssize_t q6_aac_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - const char __user *start = buf; - struct aac *aac = file->private_data; - struct aac_fc *fc; - int xfer = 0; - int res = 0; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - mutex_lock(&aac->lock); - ac = aac->audio_client; - - if (!ac) { - res = -ENODEV; - goto fail; - } - fc = aac->aac_fc; - - /*wait for buffer to full*/ - if (fc->fc_buff[fc->buff_index].empty != 0) { - res = wait_event_interruptible_timeout(fc->fc_wq, - (fc->fc_buff[fc->buff_index].empty == 0), - msecs_to_jiffies(AAC_READ_TIMEOUT)); - - pr_debug("[%s:%s] buff_index = %d\n", __MM_FILE__, - __func__, fc->buff_index); - if (res == 0) { - pr_err("[%s:%s] Timeout!\n", __MM_FILE__, __func__); - res = -ETIMEDOUT; - goto fail; - } else if (res < 0) { - pr_err("[%s:%s] Returning on Interrupt\n", __MM_FILE__, - __func__); - goto fail; - } - } - /*lock the buffer*/ - mutex_lock(&(fc->fc_buff[fc->buff_index].lock)); - xfer = fc->fc_buff[fc->buff_index].actual_size; - - if (xfer > count) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] read failed! byte count too small\n", - __MM_FILE__, __func__); - res = -EINVAL; - goto fail; - } - - if (copy_to_user(buf, fc->fc_buff[fc->buff_index].data, xfer)) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] copy_to_user failed at index %d\n", - __MM_FILE__, __func__, fc->buff_index); - res = -EFAULT; - goto fail; - } - - buf += xfer; - - fc->fc_buff[fc->buff_index].empty = 1; - fc->fc_buff[fc->buff_index].actual_size = 0; - - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - ++(fc->buff_index); - if (fc->buff_index >= AAC_FC_BUFF_CNT) - fc->buff_index = 0; - - res = buf - start; -fail: - mutex_unlock(&aac->lock); - - return res; -} - -static int q6_aac_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct aac *aac = file->private_data; - int i = 0; - struct aac_fc *fc; - - mutex_lock(&aac->lock); - fc = aac->aac_fc; - kthread_stop(fc->task); - fc->task = NULL; - - /*free flow control buffers*/ - for (i = 0; i < AAC_FC_BUFF_CNT; ++i) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - kfree(fc); - if (aac->audio_client) - rc = q6audio_close(aac->audio_client); - mutex_unlock(&aac->lock); - kfree(aac); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return rc; -} - -static const struct file_operations q6_aac_in_fops = { - .owner = THIS_MODULE, - .open = q6_aac_in_open, - .read = q6_aac_in_read, - .release = q6_aac_in_release, - .unlocked_ioctl = q6_aac_in_ioctl, -}; - -struct miscdevice q6_aac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &q6_aac_in_fops, -}; - -static int __init q6_aac_in_init(void) -{ - return misc_register(&q6_aac_in_misc); -} - -device_initcall(q6_aac_in_init); diff --git a/arch/arm/mach-msm/qdsp6/amrnb_in.c b/arch/arm/mach-msm/qdsp6/amrnb_in.c deleted file mode 100644 index e20bf5beb355..000000000000 --- a/arch/arm/mach-msm/qdsp6/amrnb_in.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "dal_audio_format.h" -#include - -struct amrnb { - struct mutex lock; - struct msm_audio_amrnb_enc_config_v2 cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; - struct msm_voicerec_mode voicerec_mode; -}; - - -static long q6_amrnb_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct amrnb *amrnb = file->private_data; - int rc = 0; - - mutex_lock(&amrnb->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: - pr_debug("[%s:%s] SET_VOLUME\n", __MM_FILE__, __func__); - break; - case AUDIO_GET_STATS: - { - struct msm_audio_stats stats; - pr_debug("[%s:%s] GET_STATS\n", __MM_FILE__, __func__); - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - case AUDIO_START: - { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else { - if (copy_from_user(&acdb_id, (void *) arg, - sizeof(acdb_id))) { - rc = -EFAULT; - break; - } - } - if (amrnb->audio_client) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } else { - amrnb->audio_client = q6audio_open_amrnb( - amrnb->str_cfg.buffer_size, - amrnb->cfg.band_mode, - amrnb->cfg.dtx_enable, - amrnb->voicerec_mode.rec_mode, - acdb_id); - if (!amrnb->audio_client) { - pr_err("[%s:%s] amrnb open session failed\n", - __MM_FILE__, __func__); - kfree(amrnb); - rc = -ENOMEM; - break; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_INCALL: { - pr_debug("[%s:%s] SET_INCALL\n", __MM_FILE__, __func__); - if (copy_from_user(&amrnb->voicerec_mode, - (void *)arg, sizeof(struct msm_voicerec_mode))) - rc = -EFAULT; - - if (amrnb->voicerec_mode.rec_mode != AUDIO_FLAG_READ - && amrnb->voicerec_mode.rec_mode != - AUDIO_FLAG_INCALL_MIXED) { - amrnb->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - pr_err("[%s:%s] Invalid rec_mode\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - } - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &amrnb->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_STREAM_CONFIG: buffsz=%d, buffcnt = %d\n", - __MM_FILE__, __func__, amrnb->str_cfg.buffer_size, - amrnb->str_cfg.buffer_count); - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&amrnb->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_STREAM_CONFIG: buffsz=%d, buffcnt = %d\n", - __MM_FILE__, __func__, amrnb->str_cfg.buffer_size, - amrnb->str_cfg.buffer_count); - - if (amrnb->str_cfg.buffer_size < 768) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (amrnb->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_AMRNB_ENC_CONFIG: - if (copy_from_user(&amrnb->cfg, (void *) arg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) - rc = -EFAULT; - pr_debug("[%s:%s] SET_AMRNB_ENC_CONFIG\n", __MM_FILE__, - __func__); - break; - case AUDIO_GET_AMRNB_ENC_CONFIG: - if (copy_to_user((void *) arg, &amrnb->cfg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_AMRNB_ENC_CONFIG\n", __MM_FILE__, - __func__); - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&amrnb->lock); - pr_debug("[%s:%s] rc= %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int q6_amrnb_in_open(struct inode *inode, struct file *file) -{ - struct amrnb *amrnb; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - amrnb = kmalloc(sizeof(struct amrnb), GFP_KERNEL); - if (amrnb == NULL) { - pr_err("[%s:%s] Could not allocate memory for amrnb driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&amrnb->lock); - file->private_data = amrnb; - amrnb->audio_client = NULL; - amrnb->str_cfg.buffer_size = 768; - amrnb->str_cfg.buffer_count = 2; - amrnb->cfg.band_mode = 7; - amrnb->cfg.dtx_enable = 3; - amrnb->cfg.frame_format = ADSP_AUDIO_FORMAT_AMRNB_FS; - amrnb->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - - return 0; -} - -static ssize_t q6_amrnb_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct amrnb *amrnb = file->private_data; - int xfer = 0; - int res; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - mutex_lock(&amrnb->lock); - ac = amrnb->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > xfer) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d\n", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = ab->actual_size; - - if (copy_to_user(buf, ab->data, xfer)) { - pr_err("[%s:%s] copy_to_user failed\n", - __MM_FILE__, __func__); - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - res = buf - start; -fail: - mutex_unlock(&amrnb->lock); - - return res; -} - -static int q6_amrnb_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct amrnb *amrnb = file->private_data; - - mutex_lock(&amrnb->lock); - if (amrnb->audio_client) - rc = q6audio_close(amrnb->audio_client); - mutex_unlock(&amrnb->lock); - kfree(amrnb); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return rc; -} - -static const struct file_operations q6_amrnb_in_fops = { - .owner = THIS_MODULE, - .open = q6_amrnb_in_open, - .read = q6_amrnb_in_read, - .release = q6_amrnb_in_release, - .unlocked_ioctl = q6_amrnb_in_ioctl, -}; - -struct miscdevice q6_amrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amr_in", - .fops = &q6_amrnb_in_fops, -}; - -static int __init q6_amrnb_in_init(void) -{ - return misc_register(&q6_amrnb_in_misc); -} - -device_initcall(q6_amrnb_in_init); diff --git a/arch/arm/mach-msm/qdsp6/analog_audio.c b/arch/arm/mach-msm/qdsp6/analog_audio.c deleted file mode 100644 index d3a6baa5409c..000000000000 --- a/arch/arm/mach-msm/qdsp6/analog_audio.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define GPIO_HEADSET_AMP 157 -#define GPIO_SPEAKER_AMP 39 -#define GPIO_HEADSET_SHDN_N 48 - -void analog_init(void) -{ - /* stereo pmic init */ - pmic_spkr_set_gain(LEFT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_spkr_set_gain(RIGHT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_mic_set_volt(MIC_VOLT_1_80V); - gpio_direction_output(GPIO_HEADSET_AMP, 1); - gpio_set_value(GPIO_HEADSET_AMP, 0); -} - -void analog_headset_enable(int en) -{ - pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en); - /* enable audio amp */ - gpio_set_value(GPIO_HEADSET_AMP, !!en); -} - -void analog_speaker_enable(int en) -{ - struct spkr_config_mode scm; - memset(&scm, 0, sizeof(scm)); - - pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en); - if (en) { - scm.is_right_chan_en = 1; - scm.is_left_chan_en = 1; - scm.is_stereo_en = 1; - scm.is_hpf_en = 1; - pmic_spkr_en_mute(LEFT_SPKR, 0); - pmic_spkr_en_mute(RIGHT_SPKR, 0); - pmic_set_spkr_configuration(&scm); - pmic_spkr_en(LEFT_SPKR, 1); - pmic_spkr_en(RIGHT_SPKR, 1); - - /* unmute */ - pmic_spkr_en_mute(LEFT_SPKR, 1); - pmic_spkr_en_mute(RIGHT_SPKR, 1); - } else { - pmic_spkr_en_mute(LEFT_SPKR, 0); - pmic_spkr_en_mute(RIGHT_SPKR, 0); - - pmic_spkr_en(LEFT_SPKR, 0); - pmic_spkr_en(RIGHT_SPKR, 0); - - pmic_set_spkr_configuration(&scm); - } -} - -void analog_mic_enable(int en) -{ - pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en); - pmic_mic_en(en); -} - -static struct q6audio_analog_ops ops = { - .init = analog_init, - .speaker_enable = analog_speaker_enable, - .headset_enable = analog_headset_enable, - .int_mic_enable = analog_mic_enable, - .ext_mic_enable = analog_mic_enable, -}; - -static int __init init(void) -{ - q6audio_register_analog_ops(&ops); - return 0; -} - -device_initcall(init); diff --git a/arch/arm/mach-msm/qdsp6/audio_ctl.c b/arch/arm/mach-msm/qdsp6/audio_ctl.c deleted file mode 100644 index ab1df3992e4a..000000000000 --- a/arch/arm/mach-msm/qdsp6/audio_ctl.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include -#include - -#define BUFSZ (0) - -static DEFINE_MUTEX(voice_lock); -static int voice_started; - -static struct audio_client *voc_tx_clnt; -static struct audio_client *voc_rx_clnt; - -static int q6_voice_start(void) -{ - int rc = 0; - - mutex_lock(&voice_lock); - - if (voice_started) { - pr_err("[%s:%s] busy\n", __MM_FILE__, __func__); - rc = -EBUSY; - goto done; - } - - voc_tx_clnt = q6voice_open(AUDIO_FLAG_WRITE); - if (!voc_tx_clnt) { - pr_err("[%s:%s] open voice tx failed.\n", __MM_FILE__, - __func__); - rc = -ENOMEM; - goto done; - } - - voc_rx_clnt = q6voice_open(AUDIO_FLAG_READ); - if (!voc_rx_clnt) { - pr_err("[%s:%s] open voice rx failed.\n", __MM_FILE__, - __func__); - q6voice_close(voc_tx_clnt); - rc = -ENOMEM; - } - - voice_started = 1; -done: - mutex_unlock(&voice_lock); - return rc; -} - -static int q6_voice_stop(void) -{ - mutex_lock(&voice_lock); - if (voice_started) { - q6voice_close(voc_tx_clnt); - q6voice_close(voc_rx_clnt); - voice_started = 0; - } - mutex_unlock(&voice_lock); - return 0; -} - -static int q6_open(struct inode *inode, struct file *file) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return 0; -} - -static long q6_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - int rc; - uint32_t n; - uint32_t id[2]; - uint32_t mute_status; - - switch (cmd) { - case AUDIO_SWITCH_DEVICE: - rc = copy_from_user(&id, (void *)arg, sizeof(id)); - pr_info("[%s:%s] SWITCH_DEV: id[0] = 0x%x, id[1] = 0x%x", - __MM_FILE__, __func__, id[0], id[1]); - if (!rc) - rc = q6audio_do_routing(id[0], id[1]); - break; - case AUDIO_SET_VOLUME: - rc = copy_from_user(&n, (void *)arg, sizeof(n)); - pr_debug("[%s:%s] SET_VOLUME: vol = %d\n", __MM_FILE__, - __func__, n); - if (!rc) - rc = q6audio_set_rx_volume(n); - break; - case AUDIO_SET_MUTE: - rc = copy_from_user(&n, (void *)arg, sizeof(n)); - if (!rc) { - if (voice_started) { - if (n == 1) - mute_status = STREAM_MUTE; - else - mute_status = STREAM_UNMUTE; - } else { - if (n == 1) - mute_status = DEVICE_MUTE; - else - mute_status = DEVICE_UNMUTE; - } - - pr_debug("[%s:%s] SET_MUTE: mute_status = %d\n", - __MM_FILE__, __func__, mute_status); - rc = q6audio_set_tx_mute(mute_status); - } - break; - case AUDIO_UPDATE_ACDB: - rc = copy_from_user(&id, (void *)arg, sizeof(id)); - pr_debug("[%s:%s] UPDATE_ACDB: id[0] = 0x%x, id[1] = 0x%x\n", - __MM_FILE__, __func__, id[0], id[1]); - if (!rc) - rc = q6audio_update_acdb(id[0], 0); - break; - case AUDIO_START_VOICE: - pr_debug("[%s:%s] START_VOICE\n", __MM_FILE__, __func__); - rc = q6_voice_start(); - break; - case AUDIO_STOP_VOICE: - pr_debug("[%s:%s] STOP_VOICE\n", __MM_FILE__, __func__); - rc = q6_voice_stop(); - break; - case AUDIO_REINIT_ACDB: - pr_debug("[%s:%s] REINIT_ACDB\n", __MM_FILE__, __func__); - rc = 0; - break; - default: - rc = -EINVAL; - } - - return rc; -} - - -static int q6_release(struct inode *inode, struct file *file) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return 0; -} - -static struct file_operations q6_dev_fops = { - .owner = THIS_MODULE, - .open = q6_open, - .unlocked_ioctl = q6_ioctl, - .release = q6_release, -}; - -struct miscdevice q6_control_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_ctl", - .fops = &q6_dev_fops, -}; - - -static int __init q6_audio_ctl_init(void) { - return misc_register(&q6_control_device); -} - -device_initcall(q6_audio_ctl_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/Makefile b/arch/arm/mach-msm/qdsp6/audiov2/Makefile deleted file mode 100644 index 86ab9aeab713..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -obj-y += q6audio.o -obj-y += aac_in.o -obj-y += voice.o -obj-y += pcm_out.o -obj-y += pcm_in.o -obj-y += mp3.o -obj-y += audio_ctl.o -obj-y += analog_audio.o -obj-y += routing.o -obj-y += evrc_in.o -obj-y += qcelp_in.o -obj-y += amrnb_in.o diff --git a/arch/arm/mach-msm/qdsp6/audiov2/aac_in.c b/arch/arm/mach-msm/qdsp6/audiov2/aac_in.c deleted file mode 100644 index ef566c97cf29..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/aac_in.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include "dal_audio.h" -#include "dal_audio_format.h" - -struct aac { - struct mutex lock; - struct msm_audio_aac_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; -}; - -static long q6_aac_in_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct aac *aac = file->private_data; - struct adsp_open_command rpc; - - int sample_rate; - int audio_object_type; - int index = sizeof(u32); - int rc = 0; - u32 *aac_type = NULL; - - - mutex_lock(&aac->lock); - switch (cmd) { - - case AUDIO_START: - if (aac->audio_client) { - rc = -EBUSY; - break; - } else { - tx_clk_freq = 48000; - aac->audio_client = q6audio_open(AUDIO_FLAG_READ, - aac->str_cfg.buffer_size); - - if (aac->audio_client < 0) { - - tx_clk_freq = 8000; - rc = -ENOMEM; - break; - } - } - memset(&rpc, 0, sizeof(rpc)); - - rpc.format_block.binary.format = ADSP_AUDIO_FORMAT_MPEG4_AAC; - /* only 48k sample rate is supported */ - sample_rate = 3; - - /* AAC OBJECT LC */ - audio_object_type = 2; - - aac_type = (u32 *)rpc.format_block.binary.data; - switch (aac->cfg.stream_format) { - - case AUDIO_AAC_FORMAT_ADTS: - /* AAC Encoder expect MPEG4_ADTS media type */ - *aac_type = ADSP_AUDIO_AAC_MPEG4_ADTS; - break; - case AUDIO_AAC_FORMAT_RAW: - /* for ADIF recording */ - *aac_type = ADSP_AUDIO_AAC_RAW; - break; - } - - rpc.format_block.binary.data[index++] = (u8)( - ((audio_object_type & 0x1F) << 3) | - ((sample_rate >> 1) & 0x7)); - rpc.format_block.binary.data[index] = (u8)( - ((sample_rate & 0x1) << 7) | - ((aac->cfg.channels & 0x7) << 3)); - - rpc.format_block.binary.num_bytes = index + 1; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - rpc.buf_max_size = aac->str_cfg.buffer_size; - rpc.config.aac.bit_rate = aac->cfg.bit_rate; - rpc.config.aac.encoder_mode = ADSP_AUDIO_ENC_AAC_LC_ONLY_MODE; - q6audio_start(aac->audio_client, &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_VOLUME: - break; - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &aac->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&aac->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - if (aac->str_cfg.buffer_size < 519) { - pr_err("Buffer size too small\n"); - rc = -EINVAL; - break; - } - if (aac->str_cfg.buffer_count != 2) - pr_info("Buffer count set to 2\n"); - - break; - case AUDIO_SET_AAC_ENC_CONFIG: - if (copy_from_user(&aac->cfg, (void *) arg, - sizeof(struct msm_audio_aac_enc_config))) { - rc = -EFAULT; - } - if (aac->cfg.channels != 1) { - pr_err("only mono is supported\n"); - rc = -EINVAL; - } - if (aac->cfg.sample_rate != 48000) { - pr_err("only 48KHz is supported\n"); - rc = -EINVAL; - } - if (aac->cfg.stream_format != AUDIO_AAC_FORMAT_RAW && - aac->cfg.stream_format != AUDIO_AAC_FORMAT_ADTS) { - pr_err("unsupported AAC format\n"); - rc = -EINVAL; - } - break; - case AUDIO_GET_AAC_ENC_CONFIG: - if (copy_to_user((void *) arg, &aac->cfg, - sizeof(struct msm_audio_aac_enc_config))) { - rc = -EFAULT; - } - break; - default: - rc = -EINVAL; - } - - mutex_unlock(&aac->lock); - return rc; -} - -static int q6_aac_in_open(struct inode *inode, struct file *file) -{ - - struct aac *aac; - aac = kmalloc(sizeof(struct aac), GFP_KERNEL); - if (aac == NULL) { - pr_err("Could not allocate memory for aac driver\n"); - return -ENOMEM; - } - - mutex_init(&aac->lock); - file->private_data = aac; - aac->audio_client = NULL; - aac->str_cfg.buffer_size = 519; - aac->str_cfg.buffer_count = 2; - aac->cfg.channels = 1; - aac->cfg.bit_rate = 192000; - aac->cfg.stream_format = AUDIO_AAC_FORMAT_ADTS; - aac->cfg.sample_rate = 48000; - - return 0; -} - -static ssize_t q6_aac_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct aac *aac = file->private_data; - int xfer = 0; - int res; - - mutex_lock(&aac->lock); - ac = aac->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > xfer) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = ab->actual_size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - res = buf - start; -fail: - mutex_unlock(&aac->lock); - - return res; -} - -static int q6_aac_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct aac *aac = file->private_data; - - mutex_lock(&aac->lock); - if (aac->audio_client) - rc = q6audio_close(aac->audio_client); - mutex_unlock(&aac->lock); - kfree(aac); - tx_clk_freq = 8000; - return rc; -} - -static const struct file_operations q6_aac_in_fops = { - .owner = THIS_MODULE, - .open = q6_aac_in_open, - .read = q6_aac_in_read, - .release = q6_aac_in_release, - .unlocked_ioctl = q6_aac_in_ioctl, -}; - -struct miscdevice q6_aac_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aac_in", - .fops = &q6_aac_in_fops, -}; - -static int __init q6_aac_in_init(void) -{ - return misc_register(&q6_aac_in_misc); -} - -device_initcall(q6_aac_in_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/amrnb_in.c b/arch/arm/mach-msm/qdsp6/audiov2/amrnb_in.c deleted file mode 100644 index e552ada2ce0c..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/amrnb_in.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "dal_audio.h" -#include "dal_audio_format.h" -#include - - -struct amrnb { - struct mutex lock; - struct msm_audio_amrnb_enc_config_v2 cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; -}; - - -static long q6_amrnb_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct amrnb *amrnb = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&amrnb->lock); - switch (cmd) { - case AUDIO_START: - if (amrnb->audio_client) { - rc = -EBUSY; - break; - } else { - amrnb->audio_client = q6audio_open(AUDIO_FLAG_READ, - amrnb->str_cfg.buffer_size); - - if (!amrnb->audio_client) { - kfree(amrnb); - rc = -ENOMEM; - break; - } - } - - tx_clk_freq = 8000; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_AMRNB_FS; - rpc.format_block.standard.channels = 1; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = 8000; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - rpc.buf_max_size = amrnb->str_cfg.buffer_size; - rpc.config.amr.mode = amrnb->cfg.band_mode; - rpc.config.amr.dtx_mode = amrnb->cfg.dtx_enable; - rpc.config.amr.enable = 1; - q6audio_start(amrnb->audio_client, &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_VOLUME: - break; - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &amrnb->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&amrnb->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - - if (amrnb->str_cfg.buffer_size < 768) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (amrnb->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_AMRNB_ENC_CONFIG: - if (copy_from_user(&amrnb->cfg, (void *) arg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) - rc = -EFAULT; - break; - case AUDIO_GET_AMRNB_ENC_CONFIG: - if (copy_to_user((void *) arg, &amrnb->cfg, - sizeof(struct msm_audio_amrnb_enc_config_v2))) - rc = -EFAULT; - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&amrnb->lock); - return rc; -} - -static int q6_amrnb_in_open(struct inode *inode, struct file *file) -{ - struct amrnb *amrnb; - amrnb = kmalloc(sizeof(struct amrnb), GFP_KERNEL); - if (amrnb == NULL) { - pr_err("[%s:%s] Could not allocate memory for amrnb driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&amrnb->lock); - file->private_data = amrnb; - amrnb->audio_client = NULL; - amrnb->str_cfg.buffer_size = 768; - amrnb->str_cfg.buffer_count = 2; - amrnb->cfg.band_mode = ADSP_AUDIO_AMR_MR475; - amrnb->cfg.dtx_enable = ADSP_AUDIO_AMR_DTX_MODE_ON_AUTO; - amrnb->cfg.frame_format = ADSP_AUDIO_FORMAT_AMRNB_FS; - return 0; -} - -static ssize_t q6_amrnb_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct amrnb *amrnb = file->private_data; - int xfer = 0; - int res; - - mutex_lock(&amrnb->lock); - ac = amrnb->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > xfer) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = ab->actual_size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - res = buf - start; -fail: - mutex_unlock(&amrnb->lock); - - return res; -} - -static int q6_amrnb_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct amrnb *amrnb = file->private_data; - - mutex_lock(&amrnb->lock); - if (amrnb->audio_client) - rc = q6audio_close(amrnb->audio_client); - mutex_unlock(&amrnb->lock); - kfree(amrnb); - return rc; -} - -static const struct file_operations q6_amrnb_in_fops = { - .owner = THIS_MODULE, - .open = q6_amrnb_in_open, - .read = q6_amrnb_in_read, - .release = q6_amrnb_in_release, - .unlocked_ioctl = q6_amrnb_in_ioctl, -}; - -struct miscdevice q6_amrnb_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_amr_in", - .fops = &q6_amrnb_in_fops, -}; - -static int __init q6_amrnb_in_init(void) -{ - return misc_register(&q6_amrnb_in_misc); -} - -device_initcall(q6_amrnb_in_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/analog_audio.c b/arch/arm/mach-msm/qdsp6/audiov2/analog_audio.c deleted file mode 100644 index 5bf2cead86d4..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/analog_audio.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include - -#define GPIO_HEADSET_AMP 157 - -void analog_init(void) -{ - /* stereo pmic init */ - pmic_spkr_set_gain(LEFT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_spkr_set_gain(RIGHT_SPKR, SPKR_GAIN_PLUS12DB); - pmic_mic_set_volt(MIC_VOLT_1_80V); - - gpio_direction_output(GPIO_HEADSET_AMP, 1); - gpio_set_value(GPIO_HEADSET_AMP, 0); -} - -void analog_headset_enable(int en) -{ - /* enable audio amp */ - gpio_set_value(GPIO_HEADSET_AMP, !!en); -} - -void analog_speaker_enable(int en) -{ - struct spkr_config_mode scm; - memset(&scm, 0, sizeof(scm)); - - if (en) { - scm.is_right_chan_en = 1; - scm.is_left_chan_en = 1; - scm.is_stereo_en = 1; - scm.is_hpf_en = 1; - pmic_spkr_en_mute(LEFT_SPKR, 0); - pmic_spkr_en_mute(RIGHT_SPKR, 0); - pmic_set_spkr_configuration(&scm); - pmic_spkr_en(LEFT_SPKR, 1); - pmic_spkr_en(RIGHT_SPKR, 1); - - /* unmute */ - pmic_spkr_en_mute(LEFT_SPKR, 1); - pmic_spkr_en_mute(RIGHT_SPKR, 1); - } else { - pmic_spkr_en_mute(LEFT_SPKR, 0); - pmic_spkr_en_mute(RIGHT_SPKR, 0); - - pmic_spkr_en(LEFT_SPKR, 0); - pmic_spkr_en(RIGHT_SPKR, 0); - - pmic_set_spkr_configuration(&scm); - } -} - -void analog_mic_enable(int en) -{ - pmic_mic_en(en); -} - -static struct q6audio_analog_ops ops = { - .init = analog_init, - .speaker_enable = analog_speaker_enable, - .headset_enable = analog_headset_enable, - .int_mic_enable = analog_mic_enable, -}; - -static int __init init(void) -{ - q6audio_register_analog_ops(&ops); - return 0; -} - -device_initcall(init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/audio_ctl.c b/arch/arm/mach-msm/qdsp6/audiov2/audio_ctl.c deleted file mode 100644 index 4ebfc022fb45..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/audio_ctl.c +++ /dev/null @@ -1,140 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/audio_ctrl.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -#include - -#define BUFSZ (0) - -static DEFINE_MUTEX(voice_lock); -static int voice_started; - -static struct audio_client *voc_clnt; - -static int q6_voice_start(void) -{ - int rc = 0; - - mutex_lock(&voice_lock); - - if (voice_started) { - pr_err("voice: busy\n"); - rc = -EBUSY; - goto done; - } - - voc_clnt = q6voice_open(); - if (!voc_clnt) { - pr_err("voice: open voice failed.\n"); - rc = -ENOMEM; - goto done; - } - - voice_started = 1; -done: - mutex_unlock(&voice_lock); - return rc; -} - -static int q6_voice_stop(void) -{ - mutex_lock(&voice_lock); - if (voice_started) { - q6voice_close(voc_clnt); - voice_started = 0; - } - mutex_unlock(&voice_lock); - return 0; -} - -static int q6_open(struct inode *inode, struct file *file) -{ - return 0; -} - -static int q6_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int rc; - uint32_t n; - uint32_t id[2]; - - switch (cmd) { - case AUDIO_SWITCH_DEVICE: - rc = copy_from_user(&n, (void *)arg, sizeof(n)); - if (!rc) - rc = q6audio_do_routing(n); - break; - case AUDIO_SET_VOLUME: - rc = copy_from_user(&n, (void *)arg, sizeof(n)); - if (!rc) - rc = q6audio_set_rx_volume(n); - break; - case AUDIO_SET_MUTE: - rc = copy_from_user(&n, (void *)arg, sizeof(n)); - if (!rc) - rc = q6audio_set_tx_mute(n); - break; - case AUDIO_UPDATE_ACDB: - rc = copy_from_user(&id, (void *)arg, sizeof(id)); - if (!rc) - rc = q6audio_update_acdb(id[0], id[1]); - break; - case AUDIO_START_VOICE: - rc = q6_voice_start(); - break; - case AUDIO_STOP_VOICE: - rc = q6_voice_stop(); - break; - default: - rc = -EINVAL; - } - - return rc; -} - - -static int q6_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static const struct file_operations q6_dev_fops = { - .owner = THIS_MODULE, - .open = q6_open, - .ioctl = q6_ioctl, - .release = q6_release, -}; - -struct miscdevice q6_control_device = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_ctl", - .fops = &q6_dev_fops, -}; - - -static int __init q6_audio_ctl_init(void) -{ - return misc_register(&q6_control_device); -} - -device_initcall(q6_audio_ctl_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/dal_acdb.h b/arch/arm/mach-msm/qdsp6/audiov2/dal_acdb.h deleted file mode 100644 index b4949f9b16f7..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/dal_acdb.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#define ACDB_DAL_DEVICE 0x02000069 -#define ACDB_DAL_PORT "DAL_AM_AUD" -#define ACDB_DAL_VERSION 0x00010000 - -#define ACDB_OP_IOCTL DAL_OP_FIRST_DEVICE_API - -/* ioctls */ -#define ACDB_GET_DEVICE 0x0108bb92 -#define ACDB_SET_DEVICE 0x0108bb93 -#define ACDB_GET_STREAM 0x0108bb95 -#define ACDB_SET_STREAM 0x0108bb96 -#define ACDB_GET_DEVICE_TABLE 0x0108bb97 -#define ACDB_GET_STREAM_TABLE 0x0108bb98 - -#define ACDB_RES_SUCCESS 0 -#define ACDB_RES_FAILURE -1 -#define ACDB_RES_BADPARM -2 -#define ACDB_RES_BADSTATE -3 - -struct acdb_cmd_device { - uint32_t size; - - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; - uint32_t interface_id; - uint32_t algorithm_block_id; - - /* physical page aligned buffer */ - uint32_t total_bytes; - uint32_t unmapped_buf; -} __attribute__((packed)); - -struct acdb_cmd_device_table { - uint32_t size; - - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; - - /* physical page aligned buffer */ - uint32_t total_bytes; - uint32_t unmapped_buf; - - uint32_t res_size; -} __attribute__((packed)); - -struct acdb_result { - uint32_t dal_status; - uint32_t size; - - uint32_t total_devices; - uint32_t unmapped_buf; - uint32_t used_bytes; - uint32_t result; -} __attribute__((packed)); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/dal_adie.h b/arch/arm/mach-msm/qdsp6/audiov2/dal_adie.h deleted file mode 100644 index aac484c5732f..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/dal_adie.h +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MACH_MSM_QDSP6_ADIE_ -#define _MACH_MSM_QDSP6_ADIE_ - -#include "../dal.h" - -#define ADIE_DAL_DEVICE 0x02000029 -#define ADIE_DAL_PORT "DAL_AM_AUD" -#define ADIE_DAL_VERSION 0x00010000 - -enum { - ADIE_OP_SET_PATH = DAL_OP_FIRST_DEVICE_API, - ADIE_OP_PROCEED_TO_STAGE, - ADIE_OP_IOCTL -}; - -/* Path IDs for normal operation. */ -#define ADIE_PATH_HANDSET_TX 0x010740f6 -#define ADIE_PATH_HANDSET_RX 0x010740f7 -#define ADIE_PATH_HEADSET_MONO_TX 0x010740f8 -#define ADIE_PATH_HEADSET_STEREO_TX 0x010740f9 -#define ADIE_PATH_HEADSET_MONO_RX 0x010740fa -#define ADIE_PATH_HEADSET_STEREO_RX 0x010740fb -#define ADIE_PATH_SPEAKER_TX 0x010740fc -#define ADIE_PATH_SPEAKER_RX 0x010740fd -#define ADIE_PATH_SPEAKER_STEREO_RX 0x01074101 - -/* Path IDs used for TTY */ -#define ADIE_PATH_TTY_HEADSET_TX 0x010740fe -#define ADIE_PATH_TTY_HEADSET_RX 0x010740ff - -/* Path IDs used by Factory Test Mode. */ -#define ADIE_PATH_FTM_MIC1_TX 0x01074108 -#define ADIE_PATH_FTM_MIC2_TX 0x01074107 -#define ADIE_PATH_FTM_HPH_L_RX 0x01074106 -#define ADIE_PATH_FTM_HPH_R_RX 0x01074104 -#define ADIE_PATH_FTM_EAR_RX 0x01074103 -#define ADIE_PATH_FTM_SPKR_RX 0x01074102 - -/* Path IDs for Loopback */ -/* Path IDs used for Line in -> AuxPGA -> Line Out Stereo Mode*/ -#define ADIE_PATH_AUXPGA_LINEOUT_STEREO_LB 0x01074100 -/* Line in -> AuxPGA -> LineOut Mono */ -#define ADIE_PATH_AUXPGA_LINEOUT_MONO_LB 0x01073d82 -/* Line in -> AuxPGA -> Stereo Headphone */ -#define ADIE_PATH_AUXPGA_HDPH_STEREO_LB 0x01074109 -/* Line in -> AuxPGA -> Mono Headphone */ -#define ADIE_PATH_AUXPGA_HDPH_MONO_LB 0x01073d85 -/* Line in -> AuxPGA -> Earpiece */ -#define ADIE_PATH_AUXPGA_EAP_LB 0x01073d81 -/* Line in -> AuxPGA -> AuxOut */ -#define ADIE_PATH_AUXPGA_AUXOUT_LB 0x01073d86 - -/* Concurrency Profiles */ -#define ADIE_PATH_SPKR_STEREO_HDPH_MONO_RX 0x01073d83 -#define ADIE_PATH_SPKR_MONO_HDPH_MONO_RX 0x01073d84 -#define ADIE_PATH_SPKR_MONO_HDPH_STEREO_RX 0x01073d88 -#define ADIE_PATH_SPKR_STEREO_HDPH_STEREO_RX 0x01073d89 - -/* stages */ -#define ADIE_STAGE_PATH_OFF 0x0050 -#define ADIE_STAGE_DIGITAL_READY 0x0100 -#define ADIE_STAGE_DIGITAL_ANALOG_READY 0x1000 -#define ADIE_STAGE_ANALOG_OFF 0x0750 -#define ADIE_STAGE_DIGITAL_OFF 0x0600 - -/* path types */ -#define ADIE_PATH_RX 0 -#define ADIE_PATH_TX 1 -#define ADIE_PATH_LOOPBACK 2 - -/* mute states */ -#define ADIE_MUTE_OFF 0 -#define ADIE_MUTE_ON 1 - - -#endif diff --git a/arch/arm/mach-msm/qdsp6/audiov2/dal_audio.h b/arch/arm/mach-msm/qdsp6/audiov2/dal_audio.h deleted file mode 100644 index 2f9510bc9e33..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/dal_audio.h +++ /dev/null @@ -1,546 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __DAL_AUDIO_H__ -#define __DAL_AUDIO_H__ - -#include "../dal.h" -#include "dal_audio_format.h" - -#define AUDIO_DAL_DEVICE 0x02000028 -#define AUDIO_DAL_PORT "DAL_AQ_AUD" -#define AUDIO_DAL_VERSION 0x00030001 - -enum { - AUDIO_OP_CONTROL = DAL_OP_FIRST_DEVICE_API, - AUDIO_OP_DATA, - AUDIO_OP_INIT, -}; - -/* ---- common audio structures ---- */ - -/* This flag, if set, indicates that the beginning of the data in the*/ -/* buffer is a synchronization point or key frame, meaning no data */ -/* before it in the stream is required in order to render the stream */ -/* from this point onward. */ -#define ADSP_AUDIO_BUFFER_FLAG_SYNC_POINT 0x01 - -/* This flag, if set, indicates that the buffer object is using valid */ -/* physical address used to store the media data */ -#define ADSP_AUDIO_BUFFER_FLAG_PHYS_ADDR 0x04 - -/* This flag, if set, indicates that a media start timestamp has been */ -/* set for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_START_SET 0x08 - -/* This flag, if set, indicates that a media stop timestamp has been set */ -/* for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_STOP_SET 0x10 - -/* This flag, if set, indicates that a preroll timestamp has been set */ -/* for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_PREROLL_SET 0x20 - -/* This flag, if set, indicates that the data in the buffer is a fragment of */ -/* a larger block of data, and will be continued by the data in the next */ -/* buffer to be delivered. */ -#define ADSP_AUDIO_BUFFER_FLAG_CONTINUATION 0x40 - -struct adsp_audio_buffer { - u32 addr; /* Physical Address of buffer */ - u32 max_size; /* Maximum size of buffer */ - u32 actual_size; /* Actual size of valid data in the buffer */ - u32 offset; /* Offset to the first valid byte */ - u32 flags; /* ADSP_AUDIO_BUFFER_FLAGs that has been set */ - s64 start; /* Start timestamp, if any */ - s64 stop; /* Stop timestamp, if any */ - s64 preroll; /* Preroll timestamp, if any */ -} __attribute__ ((packed)); - - - -/* ---- audio commands ---- */ - -/* Command/event response types */ -#define ADSP_AUDIO_RESPONSE_COMMAND 0 -#define ADSP_AUDIO_RESPONSE_ASYNC 1 - -struct adsp_command_hdr { - u32 size; /* sizeof(cmd) - sizeof(u32) */ - - u32 dest; - u32 src; - u32 opcode; - u32 response_type; - u32 seq_number; - - u32 context; /* opaque to DSP */ - u32 data; - u32 padding; -} __attribute__ ((packed)); - - -#define DOMAIN_APP 0 -#define DOMAIN_MODEM 1 -#define DOMAIN_DSP 2 - - -/* adsp audio addresses are (byte order) major, minor, domain */ -#define AUDIO_ADDR(dmn, maj, min) (((maj & 0xff) << 16) \ - | ((min & 0xff) << 24) | (dmn & 0xff)) - -/* AAC Encoder modes */ -#define ADSP_AUDIO_ENC_AAC_LC_ONLY_MODE 0 -#define ADSP_AUDIO_ENC_AAC_PLUS_MODE 1 -#define ADSP_AUDIO_ENC_ENHANCED_AAC_PLUS_MODE 2 - -struct adsp_audio_aac_enc_cfg { - u32 bit_rate; /* bits per second */ - u32 encoder_mode; /* ADSP_AUDIO_ENC_* */ -} __attribute__ ((packed)); - -#define ADSP_AUDIO_ENC_SBC_ALLOCATION_METHOD_LOUNDNESS 0 -#define ADSP_AUDIO_ENC_SBC_ALLOCATION_METHOD_SNR 1 - -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_MONO 1 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_STEREO 2 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_DUAL 8 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_JOINT_STEREO 9 - -struct adsp_audio_sbc_encoder_cfg { - u32 num_subbands; - u32 block_len; - u32 channel_mode; - u32 allocation_method; - u32 bit_rate; -} __attribute__ ((packed)); - -/* AMR NB encoder modes */ -#define ADSP_AUDIO_AMR_MR475 0 -#define ADSP_AUDIO_AMR_MR515 1 -#define ADSP_AUDIO_AMR_MMR59 2 -#define ADSP_AUDIO_AMR_MMR67 3 -#define ADSP_AUDIO_AMR_MMR74 4 -#define ADSP_AUDIO_AMR_MMR795 5 -#define ADSP_AUDIO_AMR_MMR102 6 -#define ADSP_AUDIO_AMR_MMR122 7 - -/* The following are valid AMR NB DTX modes */ -#define ADSP_AUDIO_AMR_DTX_MODE_OFF 0 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_VAD1 1 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_VAD2 2 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_AUTO 3 - -/* AMR Encoder configuration */ -struct adsp_audio_amr_enc_cfg { - u32 mode; /* ADSP_AUDIO_AMR_MR* */ - u32 dtx_mode; /* ADSP_AUDIO_AMR_DTX_MODE* */ - u32 enable; /* 1 = enable, 0 = disable */ -} __attribute__ ((packed)); - -struct adsp_audio_qcelp13k_enc_cfg { - u16 min_rate; - u16 max_rate; -} __attribute__ ((packed)); - -struct adsp_audio_evrc_enc_cfg { - u16 min_rate; - u16 max_rate; -} __attribute__ ((packed)); - -union adsp_audio_codec_config { - struct adsp_audio_amr_enc_cfg amr; - struct adsp_audio_aac_enc_cfg aac; - struct adsp_audio_qcelp13k_enc_cfg qcelp13k; - struct adsp_audio_evrc_enc_cfg evrc; - struct adsp_audio_sbc_encoder_cfg sbc; -} __attribute__ ((packed)); - - -/* This is the default value. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_NONE 0x0000 - -/* This bit, if set, indicates that the AVSync mode is activated. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_AVSYNC 0x0001 - -/* This bit, if set, indicates that the Sample Rate/Channel Mode */ -/* Change Notification mode is activated. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_SR_CM_NOTIFY 0x0002 - -#define ADSP_AUDIO_OPEN_STREAM_MODE_ENABLE_SYNC_CLOCK 0x0004 - -#define ADSP_AUDIO_MAX_DEVICES 1 - -struct adsp_open_command { - struct adsp_command_hdr hdr; - u32 device; - u32 end_point; - u32 stream_context; - u32 mode; - u32 buf_max_size; - union adsp_audio_format format_block; - union adsp_audio_codec_config config; - -} __attribute__ ((packed)); - - -/* --- audio control and stream session ioctls ---- */ - -/* Opcode to open a device stream session to capture audio */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_READ 0x0108dd79 - -/* Opcode to open a device stream session to render audio */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE 0x0108dd7a - -/* Opcode to open a device session, must open a device */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_DEVICE 0x0108dd7b - -/* Close an existing stream or device */ -#define ADSP_AUDIO_IOCTL_CMD_CLOSE 0x0108d8bc - - - -/* A device switch requires three IOCTL */ -/* commands in the following sequence: PREPARE, STANDBY, COMMIT */ - -/* adsp_audio_device_switch_command structure is needed for */ -/* DEVICE_SWITCH_PREPARE */ - -/* Device switch protocol step #1. Pause old device and */ -/* generate silence for the old device. */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_PREPARE 0x010815c4 - -/* Device switch protocol step #2. Release old device, */ -/* create new device and generate silence for the new device. */ - -/* When client receives ack for this IOCTL, the client can */ -/* start sending IOCTL commands to configure, calibrate and */ -/* change filter settings on the new device. */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_STANDBY 0x010815c5 - -/* Device switch protocol step #3. Start normal operations on new device */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_COMMIT 0x01075ee7 - -struct adsp_device_switch_command { - struct adsp_command_hdr hdr; - u32 old_device; - u32 new_device; - u8 device_class; /* 0 = i.rx, 1 = i.tx, 2 = e.rx, 3 = e.tx */ - u8 device_type; /* 0 = rx, 1 = tx, 2 = both */ -} __attribute__ ((packed)); - - - -/* --- audio control session ioctls ---- */ - -#define ADSP_PATH_RX 0 -#define ADSP_PATH_TX 1 -#define ADSP_PATH_BOTH 2 - -/* These commands will affect a logical device and all its associated */ -/* streams. */ - - -/* Set device volume. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL 0x0107605c - -struct adsp_set_dev_volume_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 path; /* 0 = rx, 1 = tx, 2 = both */ - s32 volume; -} __attribute__ ((packed)); - -/* Set Device stereo volume. This command has data payload, */ -/* struct adsp_audio_set_dev_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_STEREO_VOL 0x0108df3e - -/* Set L, R cross channel gain for a Device. This command has */ -/* data payload, struct adsp_audio_set_dev_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_XCHAN_GAIN 0x0108df40 - -/* Set device mute state. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE 0x0107605f - -struct adsp_set_dev_mute_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 path; /* 0 = rx, 1 = tx, 2 = both */ - u32 mute; /* 1 = mute */ -} __attribute__ ((packed)); - -/* Configure Equalizer for a device. */ -/* This command has payload struct adsp_audio_set_dev_equalizer_command. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_EQ_CONFIG 0x0108b10e - -/* Set configuration data for an algorithm aspect of a device. */ -/* This command has payload struct adsp_audio_set_dev_cfg_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG 0x0108b6cb - -struct adsp_set_dev_cfg_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 block_id; - u32 interface_id; - u32 phys_addr; - u32 phys_size; - u32 phys_used; -} __attribute__ ((packed)); - -/* Set configuration data for all interfaces of a device. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG_TABLE 0x0108b6bf - -struct adsp_set_dev_cfg_table_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 phys_addr; - u32 phys_size; - u32 phys_used; -} __attribute__ ((packed)); - -/* ---- audio stream data commands ---- */ - -#define ADSP_AUDIO_IOCTL_CMD_DATA_TX 0x0108dd7f -#define ADSP_AUDIO_IOCTL_CMD_DATA_RX 0x0108dd80 - -struct adsp_buffer_command { - struct adsp_command_hdr hdr; - struct adsp_audio_buffer buffer; -} __attribute__ ((packed)); - - - -/* ---- audio stream ioctls (only affect a single stream in a session) ---- */ - -/* Stop stream for audio device. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_STOP 0x01075c54 - -/* End of stream reached. Client will not send any more data. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_EOS 0x0108b150 - -/* Do sample slipping/stuffing on AAC outputs. The payload of */ -/* this command is struct adsp_audio_slip_sample_command. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_SLIPSAMPLE 0x0108d40e - -/* Set stream volume. */ -/* This command has data payload, struct adsp_audio_set_volume_command. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_STREAM_VOL 0x0108c0de - -/* Set stream stereo volume. This command has data payload, */ -/* struct adsp_audio_set_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_STEREO_VOL 0x0108dd7c - -/* Set L, R cross channel gain for a Stream. This command has */ -/* data payload, struct adsp_audio_set_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_XCHAN_GAIN 0x0108dd7d - -/* Set stream mute state. */ -/* This command has data payload, struct adsp_audio_set_stream_mute. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_STREAM_MUTE 0x0108c0df - -/* Reconfigure bit rate information. This command has data */ -/* payload, struct adsp_audio_set_bit_rate_command */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_BITRATE 0x0108ccf1 - -/* Set Channel Mapping. This command has data payload, struct */ -/* This command has data payload struct adsp_audio_set_channel_map_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_CHANNELMAP 0x0108d32a - -/* Enable/disable AACPlus SBR. */ -/* This command has data payload struct adsp_audio_set_sbr_command */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_SBR 0x0108d416 - -/* Enable/disable WMA Pro Chex and Fex. This command has data payload */ -/* struct adsp_audio_stream_set_wma_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_WMAPRO 0x0108d417 - - -/* ---- audio session ioctls (affect all streams in a session) --- */ - -/* Start stream for audio device. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_START 0x010815c6 - -/* Stop all stream(s) for audio session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_STOP 0x0108dd7e - -/* Pause the data flow for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_PAUSE 0x01075ee8 - -/* Resume the data flow for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_RESUME 0x01075ee9 - -/* Drop any unprocessed data buffers for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_FLUSH 0x01075eea - -/* Start Stream DTMF tone */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_START 0x0108c0dd - -/* Stop Stream DTMF tone */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_STOP 0x01087554 - -/* Set Session volume. */ -/* This command has data payload, struct adsp_audio_set_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_VOL 0x0108d8bd - -/* Set session stereo volume. This command has data payload, */ -/* struct adsp_audio_set_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_STEREO_VOL 0x0108df3d - -/* Set L, R cross channel gain for a session. This command has */ -/* data payload, struct adsp_audio_set_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_XCHAN_GAIN 0x0108df3f - -/* Set Session mute state. */ -/* This command has data payload, struct adsp_audio_set_mute_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_MUTE 0x0108d8be - -/* Configure Equalizer for a stream. */ -/* This command has payload struct adsp_audio_set_equalizer_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_EQ_CONFIG 0x0108c0e0 - -/* Set Audio Video sync information. */ -/* This command has data payload, struct adsp_audio_set_av_sync_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_AVSYNC 0x0108d1e2 - -/* Get Audio Media Session time. */ -/* This command returns the audioTime in adsp_audio_unsigned64_event */ -#define ADSP_AUDIO_IOCTL_CMD_GET_AUDIO_TIME 0x0108c26c - - -/* these command structures are used for both STREAM and SESSION ioctls */ - -struct adsp_set_volume_command { - struct adsp_command_hdr hdr; - s32 volume; -} __attribute__ ((packed)); - -struct adsp_set_mute_command { - struct adsp_command_hdr hdr; - u32 mute; /* 1 == mute */ -} __attribute__ ((packed)); - - - -/* ---- audio events ---- */ - -/* All IOCTL commands generate an event with the IOCTL opcode as the */ -/* event id after the IOCTL command has been executed. */ - -/* This event is generated after a media stream session is opened. */ -#define ADSP_AUDIO_EVT_STATUS_OPEN 0x0108c0d6 - -/* This event is generated after a media stream session is closed. */ -#define ADSP_AUDIO_EVT_STATUS_CLOSE 0x0108c0d7 - -/* Asyncronous buffer consumption. This event is generated after a */ -/* recived buffer is consumed during rendering or filled during */ -/* capture opeartion. */ -#define ADSP_AUDIO_EVT_STATUS_BUF_DONE 0x0108c0d8 - -/* This event is generated when rendering operation is starving for */ -/* data. In order to avoid audio loss at the end of a plauback, the */ -/* client should wait for this event before issuing the close command. */ -#define ADSP_AUDIO_EVT_STATUS_BUF_UNDERRUN 0x0108c0d9 - -/* This event is generated during capture operation when there are no */ -/* buffers available to copy the captured audio data */ -#define ADSP_AUDIO_EVT_STATUS_BUF_OVERFLOW 0x0108c0da - -/* This asynchronous event is generated as a result of an input */ -/* sample rate change and/or channel mode change detected by the */ -/* decoder. The event payload data is an array of 2 uint32 */ -/* values containing the sample rate in Hz and channel mode. */ -#define ADSP_AUDIO_EVT_SR_CM_CHANGE 0x0108d329 - -struct adsp_event_hdr { - u32 evt_handle; /* DAL common header */ - u32 evt_cookie; - u32 evt_length; - - u32 dest; - u32 src; - - u32 event_id; - u32 response_type; - u32 seq_number; - - u32 context; /* opaque to DSP */ - u32 data; - - u32 status; -} __attribute__ ((packed)); - -struct adsp_buffer_event { - struct adsp_event_hdr hdr; - struct adsp_audio_buffer buffer; -} __attribute__ ((packed)); - - -/* ---- audio device IDs ---- */ - -/* Device direction Rx/Tx flag */ -#define ADSP_AUDIO_RX_DEVICE 0x00 -#define ADSP_AUDIO_TX_DEVICE 0x01 - -#define ADSP_AUDIO_DEVICE_ID_DEFAULT 0x1081679 - -/* Default RX or TX device */ - -#define ADSP_AUDIO_DEVICE_ID_HANDSET_MIC 0x107ac8d -#define ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC 0x108f9c3 -#define ADSP_AUDIO_DEVICE_ID_HEADSET_MIC 0x1081510 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC 0x1081512 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC 0x108f9c5 -#define ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC 0x1081518 -#define ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC 0x108151b -#define ADSP_AUDIO_DEVICE_ID_I2S_MIC 0x1089bf3 - -/* Special loopback pseudo device to be paired with an RX device */ -/* with usage ADSP_AUDIO_DEVICE_USAGE_MIXED_PCM_LOOPBACK */ -#define ADSP_AUDIO_DEVICE_ID_MIXED_PCM_LOOPBACK_TX 0x1089bf2 - -/* Sink (RX) devices */ -#define ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR 0x107ac88 -#define ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO 0x1081511 -#define ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO 0x107ac8a -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO 0x1081513 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET 0x108c508 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET 0x108c894 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO 0x1081514 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET 0x108c895 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET 0x108c509 -#define ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR 0x1081519 -#define ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR 0x108151c -#define ADSP_AUDIO_DEVICE_ID_I2S_SPKR 0x1089bf4 -#define ADSP_AUDIO_DEVICE_ID_NULL_SINK 0x108e512 - -/* BT A2DP playback device. */ -/* This device must be paired with */ -/* ADSP_AUDIO_DEVICE_ID_MIXED_PCM_LOOPBACK_TX using */ -/* ADSP_AUDIO_DEVICE_USAGE_MIXED_PCM_LOOPBACK mode */ -#define ADSP_AUDIO_DEVICE_ID_BT_A2DP_SPKR 0x108151a - -/* Voice Destination identifier - specifically used for */ -/* controlling Voice module from the Device Control Session */ -#define ADSP_AUDIO_DEVICE_ID_VOICE 0x0108df3c - -/* Audio device usage types. */ -/* This is a bit mask to determine which topology to use in the */ -/* device session */ -#define ADSP_AUDIO_DEVICE_CONTEXT_VOICE 0x01 -#define ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK 0x02 -#define ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD 0x10 -#define ADSP_AUDIO_DEVICE_CONTEXT_RECORD 0x20 -#define ADSP_AUDIO_DEVICE_CONTEXT_PCM_LOOPBACK 0x40 - -#endif diff --git a/arch/arm/mach-msm/qdsp6/audiov2/dal_audio_format.h b/arch/arm/mach-msm/qdsp6/audiov2/dal_audio_format.h deleted file mode 100644 index 218fa535b6c2..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/dal_audio_format.h +++ /dev/null @@ -1,284 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ADSP_AUDIO_MEDIA_FORMAT_H -#define __ADSP_AUDIO_MEDIA_FORMAT_H - -/* Supported audio media formats */ - -/* format block in shmem */ -#define ADSP_AUDIO_FORMAT_SHAREDMEMORY 0x01091a78 - -/* adsp_audio_format_raw_pcm type */ -#define ADSP_AUDIO_FORMAT_PCM 0x0103d2fd - -/* adsp_audio_format_raw_pcm type */ -#define ADSP_AUDIO_FORMAT_DTMF 0x01087725 - -/* adsp_audio_format_adpcm type */ -#define ADSP_AUDIO_FORMAT_ADPCM 0x0103d2ff - -/* Yamaha PCM format */ -#define ADSP_AUDIO_FORMAT_YADPCM 0x0108dc07 - -/* ISO/IEC 11172 */ -#define ADSP_AUDIO_FORMAT_MP3 0x0103d308 - -/* ISO/IEC 14496 */ -#define ADSP_AUDIO_FORMAT_MPEG4_AAC 0x010422f1 - -/* AMR-NB audio in FS format */ -#define ADSP_AUDIO_FORMAT_AMRNB_FS 0x0105c16c - -/* AMR-WB audio in FS format */ -#define ADSP_AUDIO_FORMAT_AMRWB_FS 0x0105c16e - -/* QCELP 13k, IS733 */ -#define ADSP_AUDIO_FORMAT_V13K_FS 0x01080b8a - -/* EVRC 8k, IS127 */ -#define ADSP_AUDIO_FORMAT_EVRC_FS 0x01080b89 - -/* EVRC-B 8k, 4GV */ -#define ADSP_AUDIO_FORMAT_EVRCB_FS 0x0108f2a3 - -/* MIDI command stream */ -#define ADSP_AUDIO_FORMAT_MIDI 0x0103d300 - -/* A2DP SBC stream */ -#define ADSP_AUDIO_FORMAT_SBC 0x0108c4d8 - -/* Version 10 Professional */ -#define ADSP_AUDIO_FORMAT_WMA_V10PRO 0x0108aa92 - -/* Version 9 Starndard */ -#define ADSP_AUDIO_FORMAT_WMA_V9 0x0108d430 - -/* AMR WideBand Plus */ -#define ADSP_AUDIO_FORMAT_AMR_WB_PLUS 0x0108f3da - -/* AC3 Decoder */ -#define ADSP_AUDIO_FORMAT_AC3_DECODER 0x0108d5f9 - -/* Not yet supported audio media formats */ - -/* ISO/IEC 13818 */ -#define ADSP_AUDIO_FORMAT_MPEG2_AAC 0x0103d309 - -/* 3GPP TS 26.101 Sec 4.0 */ -#define ADSP_AUDIO_FORMAT_AMRNB_IF1 0x0103d305 - -/* 3GPP TS 26.101 Annex A */ -#define ADSP_AUDIO_FORMAT_AMRNB_IF2 0x01057b31 - -/* 3GPP TS 26.201 */ -#define ADSP_AUDIO_FORMAT_AMRWB_IF1 0x0103d306 - -/* 3GPP TS 26.201 */ -#define ADSP_AUDIO_FORMAT_AMRWB_IF2 0x0105c16d - -/* G.711 */ -#define ADSP_AUDIO_FORMAT_G711 0x0106201d - -/* QCELP 8k, IS96A */ -#define ADSP_AUDIO_FORMAT_V8K_FS 0x01081d29 - -/* Version 1 codec */ -#define ADSP_AUDIO_FORMAT_WMA_V1 0x01055b2b - -/* Version 2, 7 & 8 codec */ -#define ADSP_AUDIO_FORMAT_WMA_V8 0x01055b2c - -/* Version 9 Professional codec */ -#define ADSP_AUDIO_FORMAT_WMA_V9PRO 0x01055b2d - -/* Version 9 Voice codec */ -#define ADSP_AUDIO_FORMAT_WMA_SP1 0x01055b2e - -/* Version 9 Lossless codec */ -#define ADSP_AUDIO_FORMAT_WMA_LOSSLESS 0x01055b2f - -/* Real Media content, low-bitrate */ -#define ADSP_AUDIO_FORMAT_RA_SIPR 0x01042a0f - -/* Real Media content */ -#define ADSP_AUDIO_FORMAT_RA_COOK 0x01042a0e - - -/* For all of the audio formats, unless specified otherwise, */ -/* the following apply: */ -/* Format block bits are arranged in bytes and words in little-endian */ -/* order, i.e., least-significant bit first and least-significant */ -/* byte first. */ - - -/* AAC Format Block. */ - -/* AAC format block consist of a format identifier followed by */ -/* AudioSpecificConfig formatted according to ISO/IEC 14496-3 */ - -/* The following AAC format identifiers are supported */ -#define ADSP_AUDIO_AAC_ADTS 0x010619cf -#define ADSP_AUDIO_AAC_MPEG4_ADTS 0x010619d0 -#define ADSP_AUDIO_AAC_LOAS 0x010619d1 -#define ADSP_AUDIO_AAC_ADIF 0x010619d2 -#define ADSP_AUDIO_AAC_RAW 0x010619d3 -#define ADSP_AUDIO_AAC_FRAMED_RAW 0x0108c1fb - -struct adsp_audio_no_payload_format { - /* Media Format Code (must always be first element) */ - u32 format; - /* no payload for this format type */ -} __attribute__ ((packed)); - -/* Maxmum number of bytes allowed in a format block */ -#define ADSP_AUDIO_FORMAT_DATA_MAX 16 - -/* For convenience, to be used as a standard format block */ -/* for various media types that don't need a unique format block */ -/* ie. PCM, DTMF, etc. */ -struct adsp_audio_standard_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 channels; - u16 bits_per_sample; - u32 sampling_rate; - u8 is_signed; - u8 is_interleaved; -} __attribute__ ((packed)); - -/* ADPCM format block */ -struct adsp_audio_adpcm_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 channels; - u16 bits_per_sample; - u32 sampling_rate; - u8 is_signed; - u8 is_interleaved; - u32 block_size; -} __attribute__ ((packed)); - -/* MIDI format block */ -struct adsp_audio_midi_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 sampling_rate; - u16 channels; - u16 mode; -} __attribute__ ((packed)); - -#define ADSP_AUDIO_COMPANDING_ALAW 0x10619cd -#define ADSP_AUDIO_COMPANDING_MLAW 0x10619ce - -/* G711 format block */ -struct adsp_audio_g711_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 companding; -} __attribute__ ((packed)); - - -struct adsp_audio_wma_pro_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 format_tag; - u16 channels; - u32 samples_per_sec; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 channel_mask; - u16 encode_opt; - u16 advanced_encode_opt; - u32 advanced_encode_opt2; - u32 drc_peak_reference; - u32 drc_peak_target; - u32 drc_average_reference; - u32 drc_average_target; -} __attribute__ ((packed)); - -struct adsp_audio_amrwb_plus_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 size; - u32 version; - u32 channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_format; - u32 amr_isf_index; -} __attribute__ ((packed)); - -/* Binary Byte Stream Format */ -/* Binary format type that defines a byte stream, */ -/* can be used to specify any format (ie. AAC) */ -struct adsp_audio_binary_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - /* number of bytes set in byte stream */ - u32 num_bytes; - /* Byte stream binary data */ - u8 data[ADSP_AUDIO_FORMAT_DATA_MAX]; -} __attribute__ ((packed)); - -struct adsp_audio_shared_memory_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* Number of bytes in shared memory */ - u32 len; - /* Phyisical address to data in shared memory */ - u32 address; -} __attribute__ ((packed)); - - -/* Union of all format types */ -union adsp_audio_format { - /* Basic format block with no payload */ - struct adsp_audio_no_payload_format no_payload; - /* Generic format block PCM, DTMF */ - struct adsp_audio_standard_format standard; - /* ADPCM format block */ - struct adsp_audio_adpcm_format adpcm; - /* MIDI format block */ - struct adsp_audio_midi_format midi; - /* G711 format block */ - struct adsp_audio_g711_format g711; - /* WmaPro format block */ - struct adsp_audio_wma_pro_format wma_pro; - /* WmaPro format block */ - struct adsp_audio_amrwb_plus_format amrwb_plus; - /* binary (byte stream) format block, used for AAC */ - struct adsp_audio_binary_format binary; - /* format block in shared memory */ - struct adsp_audio_shared_memory_format shared_mem; -}; - -#endif - - diff --git a/arch/arm/mach-msm/qdsp6/audiov2/dal_voice.h b/arch/arm/mach-msm/qdsp6/audiov2/dal_voice.h deleted file mode 100644 index 6836de4b3e92..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/dal_voice.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __DAL_VOICE_H__ -#define __DAL_VOICE_H__ - -#define VOICE_DAL_DEVICE 0x02000075 -#define VOICE_DAL_PORT "DAL_AM_AUD" -#define VOICE_DAL_VERSION 0x00010000 - -#define APR_PKTV1_TYPE_EVENT_V 0 -#define APR_UNDEFINED -1 -#define APR_PKTV1_TYPE_MASK 0x00000010 -#define APR_PKTV1_TYPE_SHFT 4 - -#define APR_SET_BITMASK(mask, shift, value) \ - (((value) << (shift)) & (mask)) - -#define APR_SET_FIELD(field, value) \ - APR_SET_BITMASK((field##_MASK), (field##_SHFT), (value)) - - -enum { - VOICE_OP_INIT = DAL_OP_FIRST_DEVICE_API, - VOICE_OP_CONTROL, -}; - -struct apr_command_pkt { - uint32_t size; - uint32_t header; - uint16_t reserved1; - uint16_t src_addr; - uint16_t dst_addr; - uint16_t ret_addr; - uint32_t src_token; - uint32_t dst_token; - uint32_t ret_token; - uint32_t context; - uint32_t opcode; -} __attribute__ ((packed)); - - -#define APR_IBASIC_RSP_RESULT 0x00010000 - -#define APR_OP_CMD_CREATE 0x0001001B - -#define APR_OP_CMD_DESTROY 0x0001001C - -#define VOICE_OP_CMD_BRINGUP 0x0001001E - -#define VOICE_OP_CMD_TEARDOWN 0x0001001F - -#define VOICE_OP_CMD_SET_NETWORK 0x0001001D - -#define VOICE_OP_CMD_STREAM_SETUP 0x00010027 - -#define VOICE_OP_CMD_STREAM_TEARDOWN 0x00010028 - -#endif diff --git a/arch/arm/mach-msm/qdsp6/audiov2/evrc_in.c b/arch/arm/mach-msm/qdsp6/audiov2/evrc_in.c deleted file mode 100644 index 9c544552382e..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/evrc_in.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "dal_audio.h" -#include "dal_audio_format.h" -#include - - -struct evrc { - struct mutex lock; - struct msm_audio_evrc_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; -}; - - -static long q6_evrc_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct evrc *evrc = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&evrc->lock); - switch (cmd) { - case AUDIO_START: - if (evrc->audio_client) { - rc = -EBUSY; - break; - } else { - evrc->audio_client = q6audio_open(AUDIO_FLAG_READ, - evrc->str_cfg.buffer_size); - - if (!evrc->audio_client) { - kfree(evrc); - rc = -ENOMEM; - break; - } - } - - tx_clk_freq = 8000; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_EVRC_FS; - rpc.format_block.standard.channels = 1; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = 8000; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - rpc.buf_max_size = evrc->str_cfg.buffer_size; - rpc.config.evrc.min_rate = evrc->cfg.min_bit_rate; - rpc.config.evrc.max_rate = evrc->cfg.max_bit_rate; - - q6audio_start(evrc->audio_client, &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_VOLUME: - break; - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &evrc->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&evrc->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - - if (evrc->str_cfg.buffer_size < 23) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (evrc->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_EVRC_ENC_CONFIG: - if (copy_from_user(&evrc->cfg, (void *) arg, - sizeof(struct msm_audio_evrc_enc_config))) - rc = -EFAULT; - - if (evrc->cfg.min_bit_rate > 4 || evrc->cfg.min_bit_rate < 1) { - pr_err("[%s:%s] invalid min bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - if (evrc->cfg.max_bit_rate > 4 || evrc->cfg.max_bit_rate < 1) { - pr_err("[%s:%s] invalid max bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - case AUDIO_GET_EVRC_ENC_CONFIG: - if (copy_to_user((void *) arg, &evrc->cfg, - sizeof(struct msm_audio_evrc_enc_config))) - rc = -EFAULT; - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&evrc->lock); - return rc; -} - -static int q6_evrc_in_open(struct inode *inode, struct file *file) -{ - struct evrc *evrc; - evrc = kmalloc(sizeof(struct evrc), GFP_KERNEL); - if (evrc == NULL) { - pr_err("[%s:%s] Could not allocate memory for evrc driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&evrc->lock); - file->private_data = evrc; - evrc->audio_client = NULL; - evrc->str_cfg.buffer_size = 23; - evrc->str_cfg.buffer_count = 2; - evrc->cfg.cdma_rate = CDMA_RATE_FULL; - evrc->cfg.min_bit_rate = 1; - evrc->cfg.max_bit_rate = 4; - - return 0; -} - -static ssize_t q6_evrc_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct evrc *evrc = file->private_data; - int xfer = 0; - int res; - - mutex_lock(&evrc->lock); - ac = evrc->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > xfer) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = ab->actual_size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - res = buf - start; - -fail: - mutex_unlock(&evrc->lock); - - return res; -} - -static int q6_evrc_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct evrc *evrc = file->private_data; - - mutex_lock(&evrc->lock); - if (evrc->audio_client) - rc = q6audio_close(evrc->audio_client); - mutex_unlock(&evrc->lock); - kfree(evrc); - return rc; -} - -static const struct file_operations q6_evrc_in_fops = { - .owner = THIS_MODULE, - .open = q6_evrc_in_open, - .read = q6_evrc_in_read, - .release = q6_evrc_in_release, - .unlocked_ioctl = q6_evrc_in_ioctl, -}; - -struct miscdevice q6_evrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &q6_evrc_in_fops, -}; - -static int __init q6_evrc_in_init(void) -{ - return misc_register(&q6_evrc_in_misc); -} - -device_initcall(q6_evrc_in_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/mp3.c b/arch/arm/mach-msm/qdsp6/audiov2/mp3.c deleted file mode 100644 index 7d9cfa2c6ca3..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/mp3.c +++ /dev/null @@ -1,205 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/mp3.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include "dal_audio.h" -#include "dal_audio_format.h" - -#define BUFSZ (8192) -#define DMASZ (BUFSZ * 2) - -struct mp3 { - struct mutex lock; - struct audio_client *ac; - struct msm_audio_config cfg; -}; - -static long mp3_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct mp3 *mp3 = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&mp3->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: - break; - case AUDIO_START: - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_MP3; - rpc.format_block.standard.channels = mp3->cfg.channel_count; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = mp3->cfg.sample_rate; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 0; - rpc.buf_max_size = BUFSZ; - q6audio_start(mp3->ac, (void *) &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: - if (copy_from_user(&mp3->cfg, (void *) arg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - break; - } - if (mp3->cfg.channel_count < 1 || mp3->cfg.channel_count > 2) { - rc = -EINVAL; - break; - } - break; - case AUDIO_GET_CONFIG: - if (copy_to_user((void *) arg, &mp3->cfg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - } - break; - default: - rc = -EINVAL; - } - mutex_unlock(&mp3->lock); - return rc; -} - -static int mp3_open(struct inode *inode, struct file *file) -{ - - struct mp3 *mp3; - mp3 = kzalloc(sizeof(struct mp3), GFP_KERNEL); - - if (!mp3) - return -ENOMEM; - - mutex_init(&mp3->lock); - file->private_data = mp3; - mp3->ac = q6audio_open(AUDIO_FLAG_WRITE, BUFSZ); - if (!mp3->ac) { - kfree(mp3); - return -ENOMEM; - } - mp3->cfg.channel_count = 2; - mp3->cfg.buffer_count = 2; - mp3->cfg.buffer_size = BUFSZ; - mp3->cfg.unused[0] = 0; - mp3->cfg.unused[1] = 0; - mp3->cfg.unused[2] = 0; - mp3->cfg.sample_rate = 48000; - - return 0; -} - -static ssize_t mp3_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct mp3 *mp3 = file->private_data; - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - int xfer; - - if (!mp3->ac) - mp3_ioctl(file, AUDIO_START, 0); - - ac = mp3->ac; - if (!ac) - return -ENODEV; - - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_from_user(ab->data, buf, xfer)) - return -EFAULT; - - buf += xfer; - count -= xfer; - - ab->used = xfer; - q6audio_write(ac, ab); - ac->cpu_buf ^= 1; - } - - return buf - start; -} - -static int mp3_fsync(struct file *f, int datasync) -{ - struct mp3 *mp3 = f->private_data; - if (mp3->ac) - return q6audio_async(mp3->ac); - return -ENODEV; -} - -static int mp3_release(struct inode *inode, struct file *file) -{ - struct mp3 *mp3 = file->private_data; - if (mp3->ac) - q6audio_close(mp3->ac); - kfree(mp3); - return 0; -} - -static const struct file_operations mp3_fops = { - .owner = THIS_MODULE, - .open = mp3_open, - .write = mp3_write, - .fsync = mp3_fsync, - .release = mp3_release, - .unlocked_ioctl = mp3_ioctl, -}; - -struct miscdevice mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &mp3_fops, -}; - -static int __init mp3_init(void) -{ - return misc_register(&mp3_misc); -} - -device_initcall(mp3_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c b/arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c deleted file mode 100644 index 4de21995a5f5..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c +++ /dev/null @@ -1,208 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/pcm_in.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include "dal_audio.h" -#include "dal_audio_format.h" - -#define BUFSZ (4096) -#define DMASZ (BUFSZ * 2) - - -struct pcm { - struct mutex lock; - struct msm_audio_config cfg; - struct audio_client *audio_client; -}; - -static long q6_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct pcm *pcm = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&pcm->lock); - switch (cmd) { - - case AUDIO_START: - tx_clk_freq = pcm->cfg.sample_rate; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format_block.standard.channels = pcm->cfg.channel_count; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = pcm->cfg.sample_rate; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 1; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - rpc.buf_max_size = BUFSZ; - q6audio_start(pcm->audio_client, &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_VOLUME: - break; - case AUDIO_SET_CONFIG: - if (copy_from_user(&pcm->cfg, (void *) arg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - break; - } - break; - case AUDIO_GET_CONFIG: - if (copy_to_user((void *) arg, &pcm->cfg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - } - break; - default: - rc = -EINVAL; - } - - mutex_unlock(&pcm->lock); - return rc; -} - -static int q6_in_open(struct inode *inode, struct file *file) -{ - - struct pcm *pcm; - pcm = kmalloc(sizeof(struct pcm), GFP_KERNEL); - if (pcm == NULL) { - pr_err("Could not allocate memory for pcm driver\n"); - return -ENOMEM; - } - mutex_init(&pcm->lock); - file->private_data = pcm; - pcm->audio_client = q6audio_open(AUDIO_FLAG_READ, BUFSZ); - if (!pcm->audio_client) { - kfree(pcm); - return -ENOMEM; - } - pcm->cfg.channel_count = 1; - pcm->cfg.buffer_count = 2; - pcm->cfg.buffer_size = BUFSZ; - pcm->cfg.unused[0] = 0; - pcm->cfg.unused[1] = 0; - pcm->cfg.unused[2] = 0; - pcm->cfg.sample_rate = 8000; - - return 0; -} - -static ssize_t q6_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct pcm *pcm = file->private_data; - int xfer; - int res; - - mutex_lock(&pcm->lock); - ac = pcm->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } -fail: - res = buf - start; - mutex_unlock(&pcm->lock); - - return res; -} - -static int q6_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct pcm *pcm = file->private_data; - - mutex_lock(&pcm->lock); - if (pcm->audio_client) - rc = q6audio_close(pcm->audio_client); - mutex_unlock(&pcm->lock); - kfree(pcm); - return rc; -} - -static const struct file_operations q6_in_fops = { - .owner = THIS_MODULE, - .open = q6_in_open, - .read = q6_in_read, - .release = q6_in_release, - .unlocked_ioctl = q6_in_ioctl, -}; - -struct miscdevice q6_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_in", - .fops = &q6_in_fops, -}; - -static int __init q6_in_init(void) -{ - return misc_register(&q6_in_misc); -} - -device_initcall(q6_in_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c b/arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c deleted file mode 100644 index effd11906dc1..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c +++ /dev/null @@ -1,196 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/pcm_out.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include "dal_audio.h" -#include "dal_audio_format.h" - -#define BUFSZ (8192) -#define DMASZ (BUFSZ * 2) - -struct pcm { - struct mutex lock; - struct audio_client *ac; - struct msm_audio_config cfg; - -}; - -static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct pcm *pcm = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&pcm->lock); - switch (cmd) { - case AUDIO_START: - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format_block.standard.channels = pcm->cfg.channel_count; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = pcm->cfg.sample_rate; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 1; - rpc.buf_max_size = BUFSZ; - q6audio_start(pcm->ac, (void *) &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: - if (copy_from_user(&pcm->cfg, (void *) arg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - break; - } - if (pcm->cfg.channel_count < 1 || pcm->cfg.channel_count > 2) { - rc = -EINVAL; - break; - } - - break; - case AUDIO_GET_CONFIG: - if (copy_to_user((void *) arg, &pcm->cfg, - sizeof(struct msm_audio_config))) { - rc = -EFAULT; - } - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&pcm->lock); - return rc; -} - -static int pcm_open(struct inode *inode, struct file *file) -{ - struct pcm *pcm; - pcm = kzalloc(sizeof(struct pcm), GFP_KERNEL); - - if (!pcm) - return -ENOMEM; - - mutex_init(&pcm->lock); - file->private_data = pcm; - pcm->ac = q6audio_open(AUDIO_FLAG_WRITE, BUFSZ); - if (!pcm->ac) { - kfree(pcm); - return -ENOMEM; - } - pcm->cfg.channel_count = 2; - pcm->cfg.buffer_count = 2; - pcm->cfg.buffer_size = BUFSZ; - pcm->cfg.unused[0] = 0; - pcm->cfg.unused[1] = 0; - pcm->cfg.unused[2] = 0; - pcm->cfg.sample_rate = 48000; - - return 0; -} - -static ssize_t pcm_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct pcm *pcm = file->private_data; - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - int xfer; - - ac = pcm->ac; - if (!ac) - return -ENODEV; - - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_from_user(ab->data, buf, xfer)) - return -EFAULT; - - buf += xfer; - count -= xfer; - - ab->used = 1; - ab->actual_size = xfer; - q6audio_write(ac, ab); - ac->cpu_buf ^= 1; - } - - return buf - start; -} - -static int pcm_release(struct inode *inode, struct file *file) -{ - struct pcm *pcm = file->private_data; - if (pcm->ac) - q6audio_close(pcm->ac); - kfree(pcm); - return 0; -} - -static const struct file_operations pcm_fops = { - .owner = THIS_MODULE, - .open = pcm_open, - .write = pcm_write, - .release = pcm_release, - .unlocked_ioctl = pcm_ioctl, -}; - -struct miscdevice pcm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_out", - .fops = &pcm_fops, -}; - -static int __init pcm_init(void) -{ - return misc_register(&pcm_misc); -} - -device_initcall(pcm_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c b/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c deleted file mode 100644 index 9143b5a3a348..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/q6audio.c +++ /dev/null @@ -1,1315 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/q6audio.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "../dal.h" -#include "dal_audio.h" -#include "dal_audio_format.h" -#include "dal_acdb.h" -#include "dal_adie.h" -#include "q6audio_devices.h" - -struct q6_hw_info { - int min_gain; - int max_gain; -}; - -/* TODO: provide mechanism to configure from board file */ - -static struct q6_hw_info q6_audio_hw[Q6_HW_COUNT] = { - [Q6_HW_HANDSET] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_HEADSET] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_SPEAKER] = { - .min_gain = -1500, - .max_gain = 0, - }, - [Q6_HW_TTY] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_BT_SCO] = { - .min_gain = -2000, - .max_gain = 0, - }, - [Q6_HW_BT_A2DP] = { - .min_gain = -2000, - .max_gain = 0, - }, -}; - -static struct pm_qos_request pm_qos_req; -static int idlecount; -static DEFINE_MUTEX(idlecount_lock); - -void audio_prevent_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (++idlecount == 1) - pm_qos_update_request(&pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - mutex_unlock(&idlecount_lock); -} - -void audio_allow_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (--idlecount == 0) - pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE); - mutex_unlock(&idlecount_lock); -} - -static struct clk *icodec_rx_clk; -static struct clk *icodec_tx_clk; -static struct clk *ecodec_clk; -static struct clk *sdac_clk; - -static struct q6audio_analog_ops default_analog_ops; -static struct q6audio_analog_ops *analog_ops = &default_analog_ops; -uint32_t tx_clk_freq = 8000; -static int tx_mute_status; - -void q6audio_register_analog_ops(struct q6audio_analog_ops *ops) -{ - analog_ops = ops; -} - -static struct q6_device_info *q6_lookup_device(uint32_t device_id) -{ - struct q6_device_info *di = q6_audio_devices; - for (;;) { - if (di->id == device_id) - return di; - if (di->id == 0) { - pr_err("q6_lookup_device: bogus id 0x%08x\n", - device_id); - return di; - } - di++; - } -} - -static uint32_t q6_device_to_codec(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - return di->codec; -} - -static uint32_t q6_device_to_dir(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - return di->dir; -} - -static uint32_t q6_device_to_cad_id(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - return di->cad_id; -} - -static uint32_t q6_device_to_path(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - return di->path; -} - -static uint32_t q6_device_to_rate(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - return di->rate; -} - -int q6_device_volume(uint32_t device_id, int level) -{ - struct q6_device_info *di = q6_lookup_device(device_id); - struct q6_hw_info *hw; - - hw = &q6_audio_hw[di->hw]; - - return hw->min_gain + ((hw->max_gain - hw->min_gain) * level) / 100; -} - -static inline int adie_open(struct dal_client *client) -{ - return dal_call_f0(client, DAL_OP_OPEN, 0); -} - -static inline int adie_close(struct dal_client *client) -{ - return dal_call_f0(client, DAL_OP_CLOSE, 0); -} - -static inline int adie_set_path(struct dal_client *client, - uint32_t *adie_params, uint32_t size) -{ - uint32_t tmp; - return dal_call(client, ADIE_OP_SET_PATH, 5, adie_params, size, - (void *)&tmp, sizeof(uint32_t)); - -} - -static inline int adie_proceed_to_stage(struct dal_client *client, - uint32_t path_type, uint32_t stage) -{ - return dal_call_f1(client, ADIE_OP_PROCEED_TO_STAGE, - path_type, stage); -} - -static int adie_refcount; - -static struct dal_client *adie; -static struct dal_client *adsp; -static struct dal_client *acdb; - -static int adie_enable(void) -{ - adie_refcount++; - if (adie_refcount == 1) - adie_open(adie); - return 0; -} - -static int adie_disable(void) -{ - adie_refcount--; - if (adie_refcount == 0) - adie_close(adie); - return 0; -} - -/* 4k DMA scratch page used for exchanging acdb device config tables - * and stream format descriptions with the DSP. - */ -char *audio_data; -int32_t audio_phys; - -#define SESSION_MIN 0 -#define SESSION_MAX 64 - -static DEFINE_MUTEX(session_lock); -static DEFINE_MUTEX(audio_lock); - -static struct audio_client *session[SESSION_MAX]; - -static int session_alloc(struct audio_client *ac) -{ - int n; - - mutex_lock(&session_lock); - for (n = SESSION_MIN; n < SESSION_MAX; n++) { - if (!session[n]) { - session[n] = ac; - mutex_unlock(&session_lock); - return n; - } - } - mutex_unlock(&session_lock); - return -ENOMEM; -} - -static void session_free(int n, struct audio_client *ac) -{ - mutex_lock(&session_lock); - if (session[n] == ac) - session[n] = 0; - mutex_unlock(&session_lock); -} - -static void audio_client_free(struct audio_client *ac) -{ - session_free(ac->session, ac); - - if (ac->buf[0].data) - pmem_kfree(ac->buf[0].phys); - if (ac->buf[1].data) - pmem_kfree(ac->buf[1].phys); - kfree(ac); -} - -static struct audio_client *audio_client_alloc(unsigned bufsz) -{ - struct audio_client *ac; - int n; - - ac = kzalloc(sizeof(*ac), GFP_KERNEL); - if (!ac) - return 0; - - n = session_alloc(ac); - if (n < 0) - goto fail_session; - ac->session = n; - - if (bufsz > 0) { - ac->buf[0].phys = pmem_kalloc(bufsz, - PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - ac->buf[0].data = ioremap(ac->buf[0].phys, bufsz); - if (!ac->buf[0].data) - goto fail; - - ac->buf[1].phys = pmem_kalloc(bufsz, - PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - ac->buf[1].data = ioremap(ac->buf[1].phys, bufsz); - if (!ac->buf[1].data) - goto fail; - - ac->buf[0].size = bufsz; - ac->buf[1].size = bufsz; - } - - init_waitqueue_head(&ac->wait); - ac->client = adsp; - - return ac; - -fail: - pr_err("pmem_kalloc failed\n"); - session_free(n, ac); -fail_session: - audio_client_free(ac); - return 0; -} - -static int audio_ioctl(struct audio_client *ac, void *ptr, uint32_t len) -{ - struct adsp_command_hdr *hdr = ptr; - uint32_t tmp; - int r; - - hdr->size = len - sizeof(u32); - hdr->dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - hdr->src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - hdr->context = ac->session; - ac->cb_status = -EBUSY; - r = dal_call(ac->client, AUDIO_OP_CONTROL, 5, ptr, len, - &tmp, sizeof(tmp)); - if (r != 4) - return -EIO; - wait_event(ac->wait, (ac->cb_status != -EBUSY)); - return tmp; -} - -static int audio_command(struct audio_client *ac, uint32_t cmd) -{ - struct adsp_command_hdr rpc; - memset(&rpc, 0, sizeof(rpc)); - rpc.opcode = cmd; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_open_control(struct audio_client *ac) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_DEVICE; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - - -static int audio_close(struct audio_client *ac) -{ - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_STREAM_STOP); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_CLOSE); - return 0; -} - -static int audio_set_table(struct audio_client *ac, - uint32_t device_id, int size) -{ - struct adsp_set_dev_cfg_table_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG_TABLE; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.device_id = device_id; - rpc.phys_addr = audio_phys; - rpc.phys_size = size; - rpc.phys_used = size; - - if (q6_device_to_dir(device_id) == Q6_TX) - rpc.hdr.data = tx_clk_freq; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -int q6audio_read(struct audio_client *ac, struct audio_buffer *ab) -{ - struct adsp_buffer_command rpc; - uint32_t res; - int r; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.size = sizeof(rpc) - sizeof(u32); - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.hdr.context = ac->session; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_TX; - rpc.buffer.addr = ab->phys; - rpc.buffer.max_size = ab->size; - rpc.buffer.actual_size = ab->actual_size; - - r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc), - &res, sizeof(res)); - - if ((r == sizeof(res))) - return 0; - - return -EIO; - -} - -int q6audio_write(struct audio_client *ac, struct audio_buffer *ab) -{ - struct adsp_buffer_command rpc; - uint32_t res; - int r; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.size = sizeof(rpc) - sizeof(u32); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.context = ac->session; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_RX; - rpc.buffer.addr = ab->phys; - rpc.buffer.max_size = ab->size; - rpc.buffer.actual_size = ab->actual_size; - - r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc), - &res, sizeof(res)); - return 0; -} - -static int audio_rx_volume(struct audio_client *ac, uint32_t dev_id, - int32_t volume) -{ - struct adsp_set_dev_volume_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_RX; - rpc.volume = volume; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_rx_mute(struct audio_client *ac, uint32_t dev_id, int mute) -{ - struct adsp_set_dev_mute_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_RX; - rpc.mute = !!mute; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_tx_volume(struct audio_client *ac, uint32_t dev_id, - int32_t volume) -{ - struct adsp_set_dev_volume_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_TX; - rpc.volume = volume; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_tx_mute(struct audio_client *ac, uint32_t dev_id, int mute) -{ - struct adsp_set_dev_mute_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_TX; - rpc.mute = !!mute; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static void callback(void *data, int len, void *cookie) -{ - struct adsp_event_hdr *e = data; - struct audio_client *ac; - struct adsp_buffer_event *abe = data; - - if (e->context >= SESSION_MAX) { - pr_err("audio callback: bogus session %d\n", - e->context); - return; - } - ac = session[e->context]; - if (!ac) { - pr_err("audio callback: unknown session %d\n", - e->context); - return; - } - - if (e->event_id == ADSP_AUDIO_IOCTL_CMD_STREAM_EOS) { - pr_info("playback done\n"); - if (e->status) - pr_err("playback status %d\n", e->status); - if (ac->cb_status == -EBUSY) { - ac->cb_status = e->status; - wake_up(&ac->wait); - } - return; - } - - if (e->event_id == ADSP_AUDIO_EVT_STATUS_BUF_DONE) { - if (e->status) - pr_err("buffer status %d\n", e->status); - - ac->buf[ac->dsp_buf].actual_size = abe->buffer.actual_size; - ac->buf[ac->dsp_buf].used = 0; - ac->dsp_buf ^= 1; - wake_up(&ac->wait); - return; - } - - if (e->status) - pr_warning("audio_cb: s=%d e=%08x status=%d\n", - e->context, e->event_id, e->status); - - if (ac->cb_status == -EBUSY) { - ac->cb_status = e->status; - wake_up(&ac->wait); - } -} - -static void audio_init(struct dal_client *client) -{ - u32 tmp[3]; - - tmp[0] = 2 * sizeof(u32); - tmp[1] = 0; - tmp[2] = 0; - dal_call(client, AUDIO_OP_INIT, 5, tmp, sizeof(tmp), - tmp, sizeof(u32)); -} - -static struct audio_client *ac_control; - -static int q6audio_init(void) -{ - struct audio_client *ac = 0; - int res = -ENODEV; - - mutex_lock(&audio_lock); - if (ac_control) { - res = 0; - goto done; - } - - icodec_rx_clk = clk_get(0, "icodec_rx_clk"); - icodec_tx_clk = clk_get(0, "icodec_tx_clk"); - ecodec_clk = clk_get(0, "ecodec_clk"); - sdac_clk = clk_get(0, "sdac_clk"); - - tx_mute_status = 0; - audio_phys = pmem_kalloc(4096, PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - audio_data = ioremap(audio_phys, 4096); - if (!audio_data) { - pr_err("pmem kalloc failed\n"); - res = -ENOMEM; - goto done; - } - - adsp = dal_attach(AUDIO_DAL_DEVICE, AUDIO_DAL_PORT, 1, - callback, 0); - if (!adsp) { - pr_err("audio_init: cannot attach to adsp\n"); - res = -ENODEV; - goto done; - } - if (check_version(adsp, AUDIO_DAL_VERSION) != 0) { - pr_err("Incompatible adsp version\n"); - res = -ENODEV; - goto done; - } - - audio_init(adsp); - - ac = audio_client_alloc(0); - if (!ac) { - pr_err("audio_init: cannot allocate client\n"); - res = -ENOMEM; - goto done; - } - - if (audio_open_control(ac)) { - pr_err("audio_init: cannot open control channel\n"); - res = -ENODEV; - goto done; - } - - acdb = dal_attach(ACDB_DAL_DEVICE, ACDB_DAL_PORT, 0, 0, 0); - if (!acdb) { - pr_err("audio_init: cannot attach to acdb channel\n"); - res = -ENODEV; - goto done; - } - if (check_version(acdb, ACDB_DAL_VERSION) != 0) { - pr_err("Incompatablie acdb version\n"); - res = -ENODEV; - goto done; - } - - - adie = dal_attach(ADIE_DAL_DEVICE, ADIE_DAL_PORT, 0, 0, 0); - if (!adie) { - pr_err("audio_init: cannot attach to adie\n"); - res = -ENODEV; - goto done; - } - if (check_version(adie, ADIE_DAL_VERSION) != 0) { - pr_err("Incompatablie adie version\n"); - res = -ENODEV; - goto done; - } - if (analog_ops->init) - analog_ops->init(); - - res = 0; - ac_control = ac; - - pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); -done: - if ((res < 0) && ac) - audio_client_free(ac); - mutex_unlock(&audio_lock); - - return res; -} - -static int acdb_get_config_table(uint32_t device_id, uint32_t sample_rate) -{ - struct acdb_cmd_device_table rpc; - struct acdb_result res; - int r; - - if (q6audio_init()) - return 0; - - memset(audio_data, 0, 4096); - memset(&rpc, 0, sizeof(rpc)); - - rpc.size = sizeof(rpc) - (2 * sizeof(uint32_t)); - rpc.command_id = ACDB_GET_DEVICE_TABLE; - rpc.device_id = q6_device_to_cad_id(device_id); - rpc.network_id = 0x00010023; - rpc.sample_rate_id = sample_rate; - rpc.total_bytes = 4096; - rpc.unmapped_buf = audio_phys; - rpc.res_size = sizeof(res) - (2 * sizeof(uint32_t)); - - r = dal_call(acdb, ACDB_OP_IOCTL, 8, &rpc, sizeof(rpc), - &res, sizeof(res)); - - if ((r == sizeof(res)) && (res.dal_status == 0)) - return res.used_bytes; - - return -EIO; -} - -static uint32_t audio_rx_path_id = ADIE_PATH_HANDSET_RX; -static uint32_t audio_rx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR; -static uint32_t audio_rx_device_group = -1; -static uint32_t audio_tx_path_id = ADIE_PATH_HANDSET_TX; -static uint32_t audio_tx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_MIC; -static uint32_t audio_tx_device_group = -1; - -static int qdsp6_devchg_notify(struct audio_client *ac, - uint32_t dev_type, uint32_t dev_id) -{ - struct adsp_device_switch_command rpc; - - if (dev_type != ADSP_AUDIO_RX_DEVICE && - dev_type != ADSP_AUDIO_TX_DEVICE) - return -EINVAL; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_PREPARE; - rpc.hdr.dest = AUDIO_ADDR(DOMAIN_DSP, ac->session, 0); - rpc.hdr.src = AUDIO_ADDR(DOMAIN_APP, ac->session, 0); - - if (dev_type == ADSP_AUDIO_RX_DEVICE) { - rpc.old_device = audio_rx_device_id; - rpc.new_device = dev_id; - } else { - rpc.old_device = audio_tx_device_id; - rpc.new_device = dev_id; - } - rpc.device_class = 0; - rpc.device_type = dev_type; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int qdsp6_standby(struct audio_client *ac) -{ - return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_STANDBY); -} - -static int qdsp6_start(struct audio_client *ac) -{ - return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_COMMIT); -} - -static void audio_rx_analog_enable(int en) -{ - switch (audio_rx_device_id) { - case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO: - case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO: - case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR: - if (analog_ops->headset_enable) - analog_ops->headset_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET: - if (analog_ops->headset_enable) - analog_ops->headset_enable(en); - if (analog_ops->speaker_enable) - analog_ops->speaker_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO: - if (analog_ops->speaker_enable) - analog_ops->speaker_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR: - if (analog_ops->bt_sco_enable) - analog_ops->bt_sco_enable(en); - break; - } -} - -static void audio_tx_analog_enable(int en) -{ - switch (audio_tx_device_id) { - case ADSP_AUDIO_DEVICE_ID_HANDSET_MIC: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC: - if (analog_ops->int_mic_enable) - analog_ops->int_mic_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_HEADSET_MIC: - case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC: - if (analog_ops->ext_mic_enable) - analog_ops->ext_mic_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC: - if (analog_ops->bt_sco_enable) - analog_ops->bt_sco_enable(en); - break; - } -} - -static void _audio_rx_path_enable(void) -{ - uint32_t adev, sample_rate; - int sz; - uint32_t adie_params[5]; - - adev = audio_rx_device_id; - sample_rate = q6_device_to_rate(adev); - - sz = acdb_get_config_table(adev, sample_rate); - audio_set_table(ac_control, adev, sz); - - adie_params[0] = 4*sizeof(uint32_t); - adie_params[1] = audio_rx_path_id; - adie_params[2] = ADIE_PATH_RX; - adie_params[3] = 48000; - adie_params[4] = 256; - /*check for errors here*/ - if (!adie_set_path(adie, adie_params, sizeof(adie_params))) - pr_err("adie set rx path failed\n"); - - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_DIGITAL_READY); - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_DIGITAL_ANALOG_READY); - - audio_rx_analog_enable(1); - - audio_rx_mute(ac_control, adev, 0); - - audio_rx_volume(ac_control, adev, q6_device_volume(adev, 100)); -} - -static void _audio_tx_path_enable(void) -{ - uint32_t adev; - int sz; - uint32_t adie_params[5]; - - adev = audio_tx_device_id; - - pr_info("audiolib: load %08x cfg table\n", adev); - - if (tx_clk_freq > 16000) { - adie_params[3] = 48000; - sz = acdb_get_config_table(adev, 48000); - - } else if (tx_clk_freq > 8000) { - adie_params[3] = 16000; - sz = acdb_get_config_table(adev, 16000); - } else { - - adie_params[3] = 8000; - sz = acdb_get_config_table(adev, 8000); - } - - pr_info("cfg table is %d bytes\n", sz); - audio_set_table(ac_control, adev, sz); - - pr_info("audiolib: set adie tx path\n"); - - adie_params[0] = 4*sizeof(uint32_t); - adie_params[1] = audio_tx_path_id; - adie_params[2] = ADIE_PATH_TX; - adie_params[4] = 256; - - if (!adie_set_path(adie, adie_params, sizeof(adie_params))) - pr_err("adie set tx path failed\n"); - - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_DIGITAL_READY); - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_DIGITAL_ANALOG_READY); - - audio_tx_analog_enable(1); - audio_tx_mute(ac_control, adev, tx_mute_status); - - if (!tx_mute_status) - audio_tx_volume(ac_control, adev, q6_device_volume(adev, 100)); -} - -static void _audio_rx_path_disable(void) -{ - audio_rx_analog_enable(0); - - adie_proceed_to_stage(adie, ADIE_PATH_RX, ADIE_STAGE_ANALOG_OFF); - adie_proceed_to_stage(adie, ADIE_PATH_RX, ADIE_STAGE_DIGITAL_OFF); -} - -static void _audio_tx_path_disable(void) -{ - audio_tx_analog_enable(0); - - adie_proceed_to_stage(adie, ADIE_PATH_TX, ADIE_STAGE_ANALOG_OFF); - adie_proceed_to_stage(adie, ADIE_PATH_TX, ADIE_STAGE_DIGITAL_OFF); -} - -static int icodec_rx_clk_refcount; -static int icodec_tx_clk_refcount; -static int ecodec_clk_refcount; -static int sdac_clk_refcount; - -static void _audio_rx_clk_enable(void) -{ - uint32_t device_group = q6_device_to_codec(audio_rx_device_id); - - switch (device_group) { - case Q6_ICODEC_RX: - icodec_rx_clk_refcount++; - if (icodec_rx_clk_refcount == 1) { - clk_set_rate(icodec_rx_clk, 12288000); - clk_enable(icodec_rx_clk); - } - break; - case Q6_ECODEC_RX: - ecodec_clk_refcount++; - if (ecodec_clk_refcount == 1) { - clk_set_rate(ecodec_clk, 2048000); - clk_enable(ecodec_clk); - } - break; - case Q6_SDAC_RX: - sdac_clk_refcount++; - if (sdac_clk_refcount == 1) { - clk_set_rate(sdac_clk, 12288000); - clk_enable(sdac_clk); - } - break; - default: - return; - } - audio_rx_device_group = device_group; -} - -static void _audio_tx_clk_enable(void) -{ - uint32_t device_group = q6_device_to_codec(audio_tx_device_id); - - switch (device_group) { - case Q6_ICODEC_TX: - icodec_tx_clk_refcount++; - if (icodec_tx_clk_refcount == 1) { - clk_set_rate(icodec_tx_clk, tx_clk_freq * 256); - clk_enable(icodec_tx_clk); - } - break; - case Q6_ECODEC_TX: - ecodec_clk_refcount++; - if (ecodec_clk_refcount == 1) { - clk_set_rate(ecodec_clk, 2048000); - clk_enable(ecodec_clk); - } - break; - case Q6_SDAC_TX: - /* TODO: In QCT BSP, clk rate was set to 20480000 */ - sdac_clk_refcount++; - if (sdac_clk_refcount == 1) { - clk_set_rate(sdac_clk, 12288000); - clk_enable(sdac_clk); - } - break; - default: - return; - } - audio_tx_device_group = device_group; -} - -static void _audio_rx_clk_disable(void) -{ - switch (audio_rx_device_group) { - case Q6_ICODEC_RX: - icodec_rx_clk_refcount--; - if (icodec_rx_clk_refcount == 0) { - clk_disable(icodec_rx_clk); - audio_rx_device_group = -1; - } - break; - case Q6_ECODEC_RX: - ecodec_clk_refcount--; - if (ecodec_clk_refcount == 0) { - clk_disable(ecodec_clk); - audio_rx_device_group = -1; - } - break; - case Q6_SDAC_RX: - sdac_clk_refcount--; - if (sdac_clk_refcount == 0) { - clk_disable(sdac_clk); - audio_rx_device_group = -1; - } - break; - default: - pr_err("audiolib: invalid rx device group %d\n", - audio_rx_device_group); - break; - } -} - -static void _audio_tx_clk_disable(void) -{ - switch (audio_tx_device_group) { - case Q6_ICODEC_TX: - icodec_tx_clk_refcount--; - if (icodec_tx_clk_refcount == 0) { - clk_disable(icodec_tx_clk); - audio_tx_device_group = -1; - } - break; - case Q6_ECODEC_TX: - ecodec_clk_refcount--; - if (ecodec_clk_refcount == 0) { - clk_disable(ecodec_clk); - audio_tx_device_group = -1; - } - break; - case Q6_SDAC_TX: - sdac_clk_refcount--; - if (sdac_clk_refcount == 0) { - clk_disable(sdac_clk); - audio_tx_device_group = -1; - } - break; - default: - pr_err("audiolib: invalid tx device group %d\n", - audio_tx_device_group); - break; - } -} - -static void _audio_rx_clk_reinit(uint32_t rx_device) -{ - uint32_t device_group = q6_device_to_codec(rx_device); - - if (device_group != audio_rx_device_group) - _audio_rx_clk_disable(); - - audio_rx_device_id = rx_device; - audio_rx_path_id = q6_device_to_path(rx_device); - - if (device_group != audio_rx_device_group) - _audio_rx_clk_enable(); - -} - -static void _audio_tx_clk_reinit(uint32_t tx_device) -{ - uint32_t device_group = q6_device_to_codec(tx_device); - - if (device_group != audio_tx_device_group) - _audio_tx_clk_disable(); - - audio_tx_device_id = tx_device; - audio_tx_path_id = q6_device_to_path(tx_device); - - if (device_group != audio_tx_device_group) - _audio_tx_clk_enable(); -} - -static DEFINE_MUTEX(audio_path_lock); -static int audio_rx_path_refcount; -static int audio_tx_path_refcount; - -static int audio_rx_path_enable(int en) -{ - mutex_lock(&audio_path_lock); - if (en) { - audio_rx_path_refcount++; - if (audio_rx_path_refcount == 1) { - adie_enable(); - _audio_rx_clk_enable(); - _audio_rx_path_enable(); - } - } else { - audio_rx_path_refcount--; - if (audio_rx_path_refcount == 0) { - _audio_rx_path_disable(); - _audio_rx_clk_disable(); - adie_disable(); - } - } - mutex_unlock(&audio_path_lock); - return 0; -} - -static int audio_tx_path_enable(int en) -{ - mutex_lock(&audio_path_lock); - if (en) { - audio_tx_path_refcount++; - if (audio_tx_path_refcount == 1) { - adie_enable(); - _audio_tx_clk_enable(); - _audio_tx_path_enable(); - } - } else { - audio_tx_path_refcount--; - if (audio_tx_path_refcount == 0) { - _audio_tx_path_disable(); - _audio_tx_clk_disable(); - adie_disable(); - } - } - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_update_acdb(uint32_t id_src, uint32_t id_dst) -{ - mutex_lock(&audio_path_lock); - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_tx_mute(int mute) -{ - uint32_t adev; - int rc; - - if (q6audio_init()) - return 0; - - mutex_lock(&audio_path_lock); - - if (mute == tx_mute_status) { - mutex_unlock(&audio_path_lock); - return 0; - } - - adev = audio_tx_device_id; - rc = audio_tx_mute(ac_control, adev, mute); - if (!rc) - tx_mute_status = mute; - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_rx_volume(int level) -{ - uint32_t adev; - int vol; - - if (q6audio_init()) - return 0; - - if (level < 0 || level > 100) - return -EINVAL; - - mutex_lock(&audio_path_lock); - adev = audio_rx_device_id; - vol = q6_device_volume(adev, level); - audio_rx_mute(ac_control, adev, 0); - audio_rx_volume(ac_control, adev, vol); - mutex_unlock(&audio_path_lock); - return 0; -} - -static void do_rx_routing(uint32_t device_id) -{ - int sz; - uint32_t sample_rate; - - if (device_id == audio_rx_device_id) - return; - - if (audio_rx_path_refcount > 0) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, - device_id); - _audio_rx_path_disable(); - _audio_rx_clk_reinit(device_id); - _audio_rx_path_enable(); - } else { - sample_rate = q6_device_to_rate(device_id); - sz = acdb_get_config_table(device_id, sample_rate); - if (sz < 0) - pr_err("could not get ACDB config table\n"); - - audio_set_table(ac_control, device_id, sz); - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, - device_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - audio_rx_device_id = device_id; - audio_rx_path_id = q6_device_to_path(device_id); - } -} - -static void do_tx_routing(uint32_t device_id) -{ - int sz; - uint32_t sample_rate; - - if (device_id == audio_tx_device_id) - return; - - if (audio_tx_path_refcount > 0) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, - device_id); - _audio_tx_path_disable(); - _audio_tx_clk_reinit(device_id); - _audio_tx_path_enable(); - } else { - sample_rate = q6_device_to_rate(device_id); - sz = acdb_get_config_table(device_id, sample_rate); - audio_set_table(ac_control, device_id, sz); - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, - device_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - audio_tx_device_id = device_id; - audio_tx_path_id = q6_device_to_path(device_id); - } -} - -int q6audio_do_routing(uint32_t device_id) -{ - if (q6audio_init()) - return 0; - - mutex_lock(&audio_path_lock); - - switch (q6_device_to_dir(device_id)) { - case Q6_RX: - do_rx_routing(device_id); - break; - case Q6_TX: - do_tx_routing(device_id); - break; - } - - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_route(const char *name) -{ - uint32_t route; - if (!strcmp(name, "speaker")) - route = ADIE_PATH_SPEAKER_STEREO_RX; - else if (!strcmp(name, "headphones")) - route = ADIE_PATH_HEADSET_STEREO_RX; - else if (!strcmp(name, "handset")) - route = ADIE_PATH_HANDSET_RX; - else - return -EINVAL; - - mutex_lock(&audio_path_lock); - if (route == audio_rx_path_id) - goto done; - - audio_rx_path_id = route; - - if (audio_rx_path_refcount > 0) { - _audio_rx_path_disable(); - _audio_rx_path_enable(); - } - if (audio_tx_path_refcount > 0) { - _audio_tx_path_disable(); - _audio_tx_path_enable(); - } -done: - mutex_unlock(&audio_path_lock); - return 0; -} - -struct audio_client *q6audio_open(uint32_t flags, uint32_t bufsz) -{ - struct audio_client *ac; - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = flags; - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(1); - else - audio_tx_path_enable(1); - - return ac; -} - -int q6audio_start(struct audio_client *ac, void *rpc, - uint32_t len) -{ - - audio_ioctl(ac, rpc, len); - - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - if (!(ac->flags & AUDIO_FLAG_WRITE)) { - ac->buf[0].used = 1; - ac->buf[1].used = 1; - q6audio_read(ac, &ac->buf[0]); - q6audio_read(ac, &ac->buf[1]); - } - - audio_prevent_sleep(); - return 0; -} - -int q6audio_close(struct audio_client *ac) -{ - audio_close(ac); - - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(0); - else - audio_tx_path_enable(0); - - audio_client_free(ac); - audio_allow_sleep(); - return 0; -} - -struct audio_client *q6voice_open(void) -{ - struct audio_client *ac; - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(0); - if (!ac) - return 0; - - return ac; -} - -int q6voice_setup(void) -{ - audio_rx_path_enable(1); - tx_clk_freq = 8000; - audio_tx_path_enable(1); - - return 0; -} - -int q6voice_teardown(void) -{ - audio_rx_path_enable(0); - audio_tx_path_enable(0); - return 0; -} - - -int q6voice_close(struct audio_client *ac) -{ - audio_client_free(ac); - return 0; -} - -int q6audio_async(struct audio_client *ac) -{ - struct adsp_command_hdr rpc; - memset(&rpc, 0, sizeof(rpc)); - rpc.opcode = ADSP_AUDIO_IOCTL_CMD_STREAM_EOS; - rpc.response_type = ADSP_AUDIO_RESPONSE_ASYNC; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} diff --git a/arch/arm/mach-msm/qdsp6/audiov2/q6audio_devices.h b/arch/arm/mach-msm/qdsp6/audiov2/q6audio_devices.h deleted file mode 100644 index 3786ccad16cb..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/q6audio_devices.h +++ /dev/null @@ -1,276 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/q6audio_devices.h - * - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -struct q6_device_info { - uint32_t id; - uint32_t cad_id; - uint32_t path; - uint32_t rate; - uint8_t dir; - uint8_t codec; - uint8_t hw; -}; - -#define Q6_ICODEC_RX 0 -#define Q6_ICODEC_TX 1 -#define Q6_ECODEC_RX 2 -#define Q6_ECODEC_TX 3 -#define Q6_SDAC_RX 6 -#define Q6_SDAC_TX 7 -#define Q6_CODEC_NONE 255 - -#define Q6_TX 1 -#define Q6_RX 2 -#define Q6_TX_RX 3 - -#define Q6_HW_HANDSET 0 -#define Q6_HW_HEADSET 1 -#define Q6_HW_SPEAKER 2 -#define Q6_HW_TTY 3 -#define Q6_HW_BT_SCO 4 -#define Q6_HW_BT_A2DP 5 - -#define Q6_HW_COUNT 6 - -#define CAD_HW_DEVICE_ID_HANDSET_MIC 0x01 -#define CAD_HW_DEVICE_ID_HANDSET_SPKR 0x02 -#define CAD_HW_DEVICE_ID_HEADSET_MIC 0x03 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO 0x04 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO 0x05 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_MIC 0x06 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_MONO 0x07 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO 0x08 -#define CAD_HW_DEVICE_ID_BT_SCO_MIC 0x09 -#define CAD_HW_DEVICE_ID_BT_SCO_SPKR 0x0A -#define CAD_HW_DEVICE_ID_BT_A2DP_SPKR 0x0B -#define CAD_HW_DEVICE_ID_TTY_HEADSET_MIC 0x0C -#define CAD_HW_DEVICE_ID_TTY_HEADSET_SPKR 0x0D - -#define CAD_HW_DEVICE_ID_DEFAULT_TX 0x0E -#define CAD_HW_DEVICE_ID_DEFAULT_RX 0x0F - -/* Logical Device to indicate A2DP routing */ -#define CAD_HW_DEVICE_ID_BT_A2DP_TX 0x10 -#define CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_STEREO_RX 0x12 -#define CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_MONO_RX 0x13 -#define CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 - -#define CAD_HW_DEVICE_ID_VOICE 0x15 - -#define CAD_HW_DEVICE_ID_I2S_RX 0x20 -#define CAD_HW_DEVICE_ID_I2S_TX 0x21 - -/* AUXPGA */ -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO_LB 0x22 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO_LB 0x23 -#define CAD_HW_DEVICE_ID_SPEAKER_SPKR_STEREO_LB 0x24 -#define CAD_HW_DEVICE_ID_SPEAKER_SPKR_MONO_LB 0x25 - -#define CAD_HW_DEVICE_ID_NULL_RX 0x2A - -#define CAD_HW_DEVICE_ID_MAX_NUM 0x2F - -#define CAD_HW_DEVICE_ID_INVALID 0xFF - -#define CAD_RX_DEVICE 0x00 -#define CAD_TX_DEVICE 0x01 - -static struct q6_device_info q6_audio_devices[] = { - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_SPKR, - .path = ADIE_PATH_HANDSET_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO, - .path = ADIE_PATH_HEADSET_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO, - .path = ADIE_PATH_HEADSET_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_MONO, - .path = ADIE_PATH_SPEAKER_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO, - .path = ADIE_PATH_SPEAKER_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX, - .path = ADIE_PATH_SPKR_MONO_HDPH_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_STEREO_RX, - .path = ADIE_PATH_SPKR_MONO_HDPH_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_MONO_RX, - .path = ADIE_PATH_SPKR_STEREO_HDPH_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX, - .path = ADIE_PATH_SPKR_STEREO_HDPH_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR, - .cad_id = CAD_HW_DEVICE_ID_TTY_HEADSET_SPKR, - .path = ADIE_PATH_TTY_HEADSET_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_TTY, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_MIC, - .path = ADIE_PATH_HANDSET_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MIC, - .path = ADIE_PATH_HEADSET_MONO_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_MIC, - .path = ADIE_PATH_SPEAKER_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_TTY_HEADSET_MIC, - .path = ADIE_PATH_TTY_HEADSET_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_SPKR, - .path = 0, /* XXX */ - .rate = 8000, - .dir = Q6_RX, - .codec = Q6_ECODEC_RX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_A2DP_SPKR, - .cad_id = CAD_HW_DEVICE_ID_BT_A2DP_SPKR, - .path = 0, /* XXX */ - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ECODEC_RX, - .hw = Q6_HW_BT_A2DP, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_MIC, - .path = 0, /* XXX */ - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ECODEC_TX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_I2S_SPKR, - .cad_id = CAD_HW_DEVICE_ID_I2S_RX, - .path = 0, /* XXX */ - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_SDAC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_I2S_MIC, - .cad_id = CAD_HW_DEVICE_ID_I2S_TX, - .path = 0, /* XXX */ - .rate = 16000, - .dir = Q6_TX, - .codec = Q6_SDAC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = 0, - .cad_id = 0, - .path = 0, - .rate = 8000, - .dir = 0, - .codec = Q6_CODEC_NONE, - .hw = 0, - }, -}; - diff --git a/arch/arm/mach-msm/qdsp6/audiov2/qcelp_in.c b/arch/arm/mach-msm/qdsp6/audiov2/qcelp_in.c deleted file mode 100644 index 40ae37dd34b4..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/qcelp_in.c +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "dal_audio.h" -#include "dal_audio_format.h" -#include - - -struct qcelp { - struct mutex lock; - struct msm_audio_qcelp_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; -}; - - -static long q6_qcelp_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct qcelp *qcelp = file->private_data; - struct adsp_open_command rpc; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&qcelp->lock); - switch (cmd) { - case AUDIO_START: - if (qcelp->audio_client) { - rc = -EBUSY; - break; - } else { - qcelp->audio_client = q6audio_open(AUDIO_FLAG_READ, - qcelp->str_cfg.buffer_size); - - if (!qcelp->audio_client) { - kfree(qcelp); - rc = -ENOMEM; - break; - } - } - - tx_clk_freq = 8000; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_V13K_FS; - rpc.format_block.standard.channels = 1; - rpc.format_block.standard.bits_per_sample = 16; - rpc.format_block.standard.sampling_rate = 8000; - rpc.format_block.standard.is_signed = 1; - rpc.format_block.standard.is_interleaved = 0; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - rpc.buf_max_size = qcelp->str_cfg.buffer_size; - rpc.config.qcelp13k.min_rate = qcelp->cfg.min_bit_rate; - rpc.config.qcelp13k.max_rate = qcelp->cfg.max_bit_rate; - - q6audio_start(qcelp->audio_client, &rpc, sizeof(rpc)); - break; - case AUDIO_STOP: - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_VOLUME: - break; - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &qcelp->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&qcelp->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - - if (qcelp->str_cfg.buffer_size < 35) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (qcelp->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_QCELP_ENC_CONFIG: - if (copy_from_user(&qcelp->cfg, (void *) arg, - sizeof(struct msm_audio_qcelp_enc_config))) - rc = -EFAULT; - - if (qcelp->cfg.min_bit_rate > 4 || - qcelp->cfg.min_bit_rate < 1) { - - pr_err("[%s:%s] invalid min bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - if (qcelp->cfg.max_bit_rate > 4 || - qcelp->cfg.max_bit_rate < 1) { - - pr_err("[%s:%s] invalid max bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - - break; - case AUDIO_GET_QCELP_ENC_CONFIG: - if (copy_to_user((void *) arg, &qcelp->cfg, - sizeof(struct msm_audio_qcelp_enc_config))) - rc = -EFAULT; - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&qcelp->lock); - return rc; -} - -static int q6_qcelp_in_open(struct inode *inode, struct file *file) -{ - struct qcelp *qcelp; - qcelp = kmalloc(sizeof(struct qcelp), GFP_KERNEL); - if (qcelp == NULL) { - pr_err("[%s:%s] Could not allocate memory for qcelp driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&qcelp->lock); - file->private_data = qcelp; - qcelp->audio_client = NULL; - qcelp->str_cfg.buffer_size = 35; - qcelp->str_cfg.buffer_count = 2; - qcelp->cfg.cdma_rate = CDMA_RATE_FULL; - qcelp->cfg.min_bit_rate = 1; - qcelp->cfg.max_bit_rate = 4; - return 0; -} - -static ssize_t q6_qcelp_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - struct qcelp *qcelp = file->private_data; - int xfer = 0; - int res; - - mutex_lock(&qcelp->lock); - ac = qcelp->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > xfer) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - xfer = ab->actual_size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - res = buf - start; - -fail: - mutex_unlock(&qcelp->lock); - - return res; -} - -static int q6_qcelp_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct qcelp *qcelp = file->private_data; - - mutex_lock(&qcelp->lock); - if (qcelp->audio_client) - rc = q6audio_close(qcelp->audio_client); - mutex_unlock(&qcelp->lock); - kfree(qcelp); - return rc; -} - -static const struct file_operations q6_qcelp_in_fops = { - .owner = THIS_MODULE, - .open = q6_qcelp_in_open, - .read = q6_qcelp_in_read, - .release = q6_qcelp_in_release, - .unlocked_ioctl = q6_qcelp_in_ioctl, -}; - -struct miscdevice q6_qcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &q6_qcelp_in_fops, -}; - -static int __init q6_qcelp_in_init(void) -{ - return misc_register(&q6_qcelp_in_misc); -} - -device_initcall(q6_qcelp_in_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/routing.c b/arch/arm/mach-msm/qdsp6/audiov2/routing.c deleted file mode 100644 index 1ba128ce8120..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/routing.c +++ /dev/null @@ -1,73 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/audiov2/routing.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -static int q6_open(struct inode *inode, struct file *file) -{ - return 0; -} - -static ssize_t q6_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - char cmd[32]; - - if (count >= sizeof(cmd)) - return -EINVAL; - if (copy_from_user(cmd, buf, count)) - return -EFAULT; - cmd[count] = 0; - - if ((count > 1) && (cmd[count-1] == '\n')) - cmd[count-1] = 0; - - q6audio_set_route(cmd); - - return count; -} - -static int q6_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static const struct file_operations q6_fops = { - .owner = THIS_MODULE, - .open = q6_open, - .write = q6_write, - .release = q6_release, -}; - -static struct miscdevice q6_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_route", - .fops = &q6_fops, -}; - - -static int __init q6_init(void) -{ - return misc_register(&q6_misc); -} - -device_initcall(q6_init); diff --git a/arch/arm/mach-msm/qdsp6/audiov2/voice.c b/arch/arm/mach-msm/qdsp6/audiov2/voice.c deleted file mode 100644 index ccb2bad4c051..000000000000 --- a/arch/arm/mach-msm/qdsp6/audiov2/voice.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../dal.h" -#include "dal_voice.h" -#include - -struct voice_struct { - struct dal_client *cvd; - struct apr_command_pkt apr_pkt; - struct completion compl; -}; - -static struct voice_struct voice; - -static int cvd_send_response(void) -{ - struct apr_command_pkt *pkt; - uint16_t src_addr; - uint16_t src_token; - uint16_t dst_token; - uint16_t dst_addr; - - pkt = &voice.apr_pkt; - src_addr = pkt->dst_addr; - dst_addr = pkt->src_addr; - src_token = pkt->dst_token; - dst_token = pkt->src_token; - - pkt->header &= ~APR_PKTV1_TYPE_MASK; - pkt->header |= APR_SET_FIELD(APR_PKTV1_TYPE, APR_PKTV1_TYPE_EVENT_V); - pkt->src_addr = src_addr; - pkt->dst_addr = dst_addr; - pkt->src_token = src_token; - pkt->dst_token = dst_token; - pkt->opcode = APR_IBASIC_RSP_RESULT; - - dal_call(voice.cvd, VOICE_OP_CONTROL, 5, pkt, - sizeof(struct apr_command_pkt), - pkt, sizeof(u32)); - return 0; -} - -static int cvd_process_voice_setup(void) -{ - q6voice_setup(); - cvd_send_response(); - return 0; -} - -static int cvd_process_voice_teardown(void) -{ - q6voice_teardown(); - cvd_send_response(); - return 0; -} - -static int cvd_process_set_network(void) -{ - cvd_send_response(); - return 0; -} - -static int voice_thread(void *data) -{ - while (!kthread_should_stop()) { - wait_for_completion(&voice.compl); - init_completion(&voice.compl); - - switch (voice.apr_pkt.opcode) { - - case APR_OP_CMD_CREATE: - cvd_send_response(); - break; - case VOICE_OP_CMD_BRINGUP: - cvd_process_voice_setup(); - break; - case APR_OP_CMD_DESTROY: - cvd_send_response(); - break; - case VOICE_OP_CMD_TEARDOWN: - cvd_process_voice_teardown(); - break; - case VOICE_OP_CMD_SET_NETWORK: - cvd_process_set_network(); - break; - default: - pr_err("[%s:%s] Undefined event\n", __MM_FILE__, - __func__); - - } - } - return 0; -} - -static void remote_cb_function(void *data, int len, void *cookie) -{ - struct apr_command_pkt *apr = data + 2*sizeof(uint32_t); - - memcpy(&voice.apr_pkt, apr, sizeof(struct apr_command_pkt)); - - if (len <= 0) { - pr_err("[%s:%s] unexpected event with length %d\n", - __MM_FILE__, __func__, len); - return; - } - - pr_debug("[%s:%s] APR = %x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n", __MM_FILE__, - __func__, - apr->header, - apr->reserved1, - apr->src_addr, - apr->dst_addr, - apr->ret_addr, - apr->src_token, - apr->dst_token, - apr->ret_token, - apr->context, - apr->opcode); - - complete(&voice.compl); -} - -static int __init voice_init(void) -{ - int res = 0; - struct task_struct *task; - u32 tmp[2]; - - tmp[0] = sizeof(u32); - tmp[1] = 0; - - voice.cvd = dal_attach(VOICE_DAL_DEVICE, VOICE_DAL_PORT, 0, - remote_cb_function, 0); - - if (!voice.cvd) { - pr_err("[%s:%s] audio_init: cannot attach to cvd\n", - __MM_FILE__, __func__); - res = -ENODEV; - goto done; - } - - if (check_version(voice.cvd, VOICE_DAL_VERSION) != 0) { - pr_err("[%s:%s] Incompatible cvd version\n", - __MM_FILE__, __func__); - res = -ENODEV; - goto done; - } - dal_call(voice.cvd, VOICE_OP_INIT, 5, tmp, sizeof(tmp), - tmp, sizeof(u32)); - - init_completion(&voice.compl); - task = kthread_run(voice_thread, &voice, "voice_thread"); - - if (IS_ERR(task)) { - pr_err("[%s:%s] Cannot start the voice thread\n", __MM_FILE__, - __func__); - res = PTR_ERR(task); - task = NULL; - } else - goto done; - -done: - return res; -} - -late_initcall(voice_init); diff --git a/arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c b/arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c deleted file mode 100644 index ff254a60ad8b..000000000000 --- a/arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c +++ /dev/null @@ -1,190 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/auxpcm_lb_in.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -struct auxpcm { - struct mutex lock; - struct audio_client *ac; - uint32_t sample_rate; - uint32_t channel_count; - int opened;; -}; - -static long auxpcmin_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct auxpcm *auxpcmin = file->private_data; - int rc = 0; - - mutex_lock(&auxpcmin->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else if (copy_from_user(&acdb_id, (void *) arg, - sizeof(acdb_id))) { - pr_info("[%s:%s] copy acdb_id from user failed\n", - __MM_FILE__, __func__); - rc = -EFAULT; - break; - } - if (auxpcmin->ac) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - } else { - auxpcmin->ac = - q6audio_open_auxpcm(auxpcmin->sample_rate, - auxpcmin->channel_count, - AUDIO_FLAG_READ, acdb_id); - if (!auxpcmin->ac) { - pr_err("[%s:%s] auxpcm open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (auxpcmin->ac) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - if (config.channel_count != 1) { - rc = -EINVAL; - pr_err("[%s:%s] invalid channelcount %d\n", - __MM_FILE__, __func__, config.channel_count); - break; - } - if (config.sample_rate != 8000) { - rc = -EINVAL; - pr_err("[%s:%s] invalid samplerate %d\n", __MM_FILE__, - __func__, config.sample_rate); - break; - } - auxpcmin->sample_rate = config.sample_rate; - auxpcmin->channel_count = config.channel_count; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = 0; - config.buffer_count = 0; - config.sample_rate = auxpcmin->sample_rate; - config.channel_count = auxpcmin->channel_count; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&auxpcmin->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static struct auxpcm the_auxpcmin; - -static int auxpcmin_open(struct inode *inode, struct file *file) -{ - struct auxpcm *auxpcmin = &the_auxpcmin; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - mutex_lock(&auxpcmin->lock); - if (auxpcmin->opened) { - pr_err("aux pcm loopback tx already open!\n"); - mutex_unlock(&auxpcmin->lock); - return -EBUSY; - } - auxpcmin->channel_count = 1; - auxpcmin->sample_rate = 8000; - auxpcmin->opened = 1; - file->private_data = auxpcmin; - mutex_unlock(&auxpcmin->lock); - return 0; -} - -static int auxpcmin_release(struct inode *inode, struct file *file) -{ - struct auxpcm *auxpcmin = file->private_data; - mutex_lock(&auxpcmin->lock); - if (auxpcmin->ac) - q6audio_auxpcm_close(auxpcmin->ac); - auxpcmin->ac = NULL; - auxpcmin->opened = 0; - mutex_unlock(&auxpcmin->lock); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return 0; -} - -static const struct file_operations auxpcmin_fops = { - .owner = THIS_MODULE, - .open = auxpcmin_open, - .release = auxpcmin_release, - .unlocked_ioctl = auxpcmin_ioctl, -}; - -struct miscdevice auxpcmin_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aux_pcm_lb_in", - .fops = &auxpcmin_fops, -}; - -static int __init auxpcmin_init(void) -{ - mutex_init(&the_auxpcmin.lock); - return misc_register(&auxpcmin_misc); -} - -device_initcall(auxpcmin_init); diff --git a/arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c b/arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c deleted file mode 100644 index bba6b94dd36b..000000000000 --- a/arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c +++ /dev/null @@ -1,191 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/auxpcm_lb_out.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -struct auxpcm { - struct mutex lock; - struct audio_client *ac; - uint32_t sample_rate; - uint32_t channel_count; - int opened;; -}; - -static long auxpcmout_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct auxpcm *auxpcmout = file->private_data; - int rc = 0; - - mutex_lock(&auxpcmout->lock); - switch (cmd) { - case AUDIO_START: { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else if (copy_from_user(&acdb_id, (void *) arg, - sizeof(acdb_id))) { - pr_info("[%s:%s] copy acdb_id from user failed\n", - __MM_FILE__, __func__); - rc = -EFAULT; - break; - } - if (auxpcmout->ac) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - } else { - auxpcmout->ac = - q6audio_open_auxpcm(auxpcmout->sample_rate, - auxpcmout->channel_count, - AUDIO_FLAG_WRITE, acdb_id); - if (!auxpcmout->ac) { - pr_err("[%s:%s] auxpcm open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (auxpcmout->ac) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } - if (copy_from_user(&config, (void *) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - if (config.channel_count != 1) { - rc = -EINVAL; - pr_err("[%s:%s] invalid channelcount %d\n", - __MM_FILE__, __func__, config.channel_count); - break; - } - if (config.sample_rate != 8000) { - rc = -EINVAL; - pr_err("[%s:%s] invalid samplerate %d\n", __MM_FILE__, - __func__, config.sample_rate); - break; - } - auxpcmout->sample_rate = config.sample_rate; - auxpcmout->channel_count = config.channel_count; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = 0; - config.buffer_count = 0; - config.sample_rate = auxpcmout->sample_rate; - config.channel_count = auxpcmout->channel_count; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void *) arg, &config, sizeof(config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_CONFIG: samplerate = %d, channels= %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&auxpcmout->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static struct auxpcm the_auxpcmout; - -static int auxpcmout_open(struct inode *inode, struct file *file) -{ - struct auxpcm *auxpcmout = &the_auxpcmout; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - - mutex_lock(&auxpcmout->lock); - - if (auxpcmout->opened) { - pr_err("aux pcm loopback rx already open!\n"); - mutex_unlock(&auxpcmout->lock); - return -EBUSY; - } - auxpcmout->channel_count = 1; - auxpcmout->sample_rate = 8000; - auxpcmout->opened = 1; - file->private_data = auxpcmout; - mutex_unlock(&auxpcmout->lock); - return 0; -} - -static int auxpcmout_release(struct inode *inode, struct file *file) -{ - struct auxpcm *auxpcmout = file->private_data; - mutex_lock(&auxpcmout->lock); - if (auxpcmout->ac) - q6audio_auxpcm_close(auxpcmout->ac); - auxpcmout->ac = NULL; - auxpcmout->opened = 0; - mutex_unlock(&auxpcmout->lock); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return 0; -} - -static const struct file_operations auxpcmout_fops = { - .owner = THIS_MODULE, - .open = auxpcmout_open, - .release = auxpcmout_release, - .unlocked_ioctl = auxpcmout_ioctl, -}; - -struct miscdevice auxpcmout_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_aux_pcm_lb_out", - .fops = &auxpcmout_fops, -}; - -static int __init auxpcmout_init(void) -{ - mutex_init(&the_auxpcmout.lock); - return misc_register(&auxpcmout_misc); -} - -device_initcall(auxpcmout_init); diff --git a/arch/arm/mach-msm/qdsp6/dal.c b/arch/arm/mach-msm/qdsp6/dal.c deleted file mode 100644 index 378432b66c07..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal.c +++ /dev/null @@ -1,727 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/dal.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "dal.h" - -#define DAL_TRACE 0 - -struct dal_hdr { - uint32_t length:16; /* message length (header inclusive) */ - uint32_t version:8; /* DAL protocol version */ - uint32_t priority:7; - uint32_t async:1; - uint32_t ddi:16; /* DDI method number */ - uint32_t prototype:8; /* DDI serialization format */ - uint32_t msgid:8; /* message id (DDI, ATTACH, DETACH, ...) */ - void *from; - void *to; -} __attribute__((packed)); - -#define TRACE_DATA_MAX 128 -#define TRACE_LOG_MAX 32 -#define TRACE_LOG_MASK (TRACE_LOG_MAX - 1) - -struct dal_trace { - unsigned timestamp; - struct dal_hdr hdr; - uint32_t data[TRACE_DATA_MAX]; -}; - -#define DAL_HDR_SIZE (sizeof(struct dal_hdr)) -#define DAL_DATA_MAX 512 -#define DAL_MSG_MAX (DAL_HDR_SIZE + DAL_DATA_MAX) - -#define DAL_VERSION 0x11 - -#define DAL_MSGID_DDI 0x00 -#define DAL_MSGID_ATTACH 0x01 -#define DAL_MSGID_DETACH 0x02 -#define DAL_MSGID_ASYNCH 0xC0 -#define DAL_MSGID_REPLY 0x80 - -struct dal_channel { - struct list_head list; - struct list_head clients; - - /* synchronization for changing channel state, - * adding/removing clients, smd callbacks, etc - */ - spinlock_t lock; - - struct smd_channel *sch; - char *name; - - /* events are delivered at IRQ context immediately, so - * we only need one assembly buffer for the entire channel - */ - struct dal_hdr hdr; - unsigned char data[DAL_DATA_MAX]; - - unsigned count; - void *ptr; - - /* client which the current inbound message is for */ - struct dal_client *active; -}; - -struct dal_client { - struct list_head list; - struct dal_channel *dch; - void *cookie; - dal_event_func_t event; - - /* opaque handle for the far side */ - void *remote; - - /* dal rpc calls are fully synchronous -- only one call may be - * active per client at a time - */ - struct mutex write_lock; - wait_queue_head_t wait; - - unsigned char data[DAL_DATA_MAX]; - - void *reply; - int reply_max; - int status; - unsigned msgid; /* msgid of expected reply */ - - spinlock_t tr_lock; - unsigned tr_head; - unsigned tr_tail; - struct dal_trace *tr_log; -}; - -static unsigned now(void) -{ - struct timespec ts; - ktime_get_ts(&ts); - return (ts.tv_nsec / 1000000) + (ts.tv_sec * 1000); -} - -void dal_trace(struct dal_client *c) -{ - if (c->tr_log) - return; - c->tr_log = kzalloc(sizeof(struct dal_trace) * TRACE_LOG_MAX, - GFP_KERNEL); -} - -void dal_trace_print(struct dal_hdr *hdr, unsigned *data, int len, unsigned when) -{ - int i; - printk("DAL %08x -> %08x L=%03x A=%d D=%04x P=%02x M=%02x T=%d", - (unsigned) hdr->from, (unsigned) hdr->to, - hdr->length, hdr->async, - hdr->ddi, hdr->prototype, hdr->msgid, - when); - len /= 4; - for (i = 0; i < len; i++) { - if (!(i & 7)) - printk("\n%03x", i * 4); - printk(" %08x", data[i]); - } - printk("\n"); -} - -void dal_trace_dump(struct dal_client *c) -{ - struct dal_trace *dt; - unsigned n, len; - - if (!c->tr_log) - return; - - for (n = c->tr_tail; n != c->tr_head; n = (n + 1) & TRACE_LOG_MASK) { - dt = c->tr_log + n; - len = dt->hdr.length - sizeof(dt->hdr); - if (len > TRACE_DATA_MAX) - len = TRACE_DATA_MAX; - dal_trace_print(&dt->hdr, dt->data, len, dt->timestamp); - } -} - -static void dal_trace_log(struct dal_client *c, - struct dal_hdr *hdr, void *data, unsigned len) -{ - unsigned long flags; - unsigned t, n; - struct dal_trace *dt; - - t = now(); - if (len > TRACE_DATA_MAX) - len = TRACE_DATA_MAX; - - spin_lock_irqsave(&c->tr_lock, flags); - n = (c->tr_head + 1) & TRACE_LOG_MASK; - if (c->tr_tail == n) - c->tr_tail = (c->tr_tail + 1) & TRACE_LOG_MASK; - dt = c->tr_log + n; - dt->timestamp = t; - memcpy(&dt->hdr, hdr, sizeof(struct dal_hdr)); - memcpy(dt->data, data, len); - c->tr_head = n; - - spin_unlock_irqrestore(&c->tr_lock, flags); -} - - -static void dal_channel_notify(void *priv, unsigned event) -{ - struct dal_channel *dch = priv; - struct dal_hdr *hdr = &dch->hdr; - struct dal_client *client; - unsigned long flags; - int len; - int r; - - spin_lock_irqsave(&dch->lock, flags); - -again: - if (dch->count == 0) { - if (smd_read_avail(dch->sch) < DAL_HDR_SIZE) - goto done; - - smd_read(dch->sch, hdr, DAL_HDR_SIZE); - - if (hdr->length < DAL_HDR_SIZE) - goto done; - - if (hdr->length > DAL_MSG_MAX) - panic("oversize message"); - - dch->count = hdr->length - DAL_HDR_SIZE; - - /* locate the client this message is targeted to */ - list_for_each_entry(client, &dch->clients, list) { - if (dch->hdr.to == client) { - dch->active = client; - dch->ptr = client->data; - goto check_data; - } - } - pr_err("[%s:%s] $$$ receiving unknown message len = %d $$$\n", - __MM_FILE__, __func__, dch->count); - dch->active = 0; - dch->ptr = dch->data; - } - -check_data: - len = dch->count; - if (len > 0) { - if (smd_read_avail(dch->sch) < len) - goto done; - - r = smd_read(dch->sch, dch->ptr, len); - if (r != len) - panic("invalid read"); - -#if DAL_TRACE - pr_info("[%s:%s] dal recv %p <- %p %02x:%04x:%02x %d\n", - __MM_FILE__, __func__, hdr->to, hdr->from, hdr->msgid, - hdr->ddi, hdr->prototype, hdr->length - sizeof(*hdr)); - print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, dch->ptr, len); -#endif - dch->count = 0; - - client = dch->active; - if (!client) { - pr_err("[%s:%s] message to %p discarded\n", - __MM_FILE__, __func__, dch->hdr.to); - goto again; - } - - if (client->tr_log) - dal_trace_log(client, hdr, dch->ptr, len); - - if (hdr->msgid == DAL_MSGID_ASYNCH) { - if (client->event) - client->event(dch->ptr, len, client->cookie); - else - pr_err("[%s:%s] client %p has no event \ - handler\n", __MM_FILE__, __func__, - client); - goto again; - } - - if (hdr->msgid == client->msgid) { - if (!client->remote) - client->remote = hdr->from; - if (len > client->reply_max) - len = client->reply_max; - memcpy(client->reply, client->data, len); - client->status = len; - wake_up(&client->wait); - goto again; - } - - pr_err("[%s:%s] cannot find client %p\n", __MM_FILE__, - __func__, dch->hdr.to); - goto again; - } - -done: - spin_unlock_irqrestore(&dch->lock, flags); -} - -static LIST_HEAD(dal_channel_list); -static DEFINE_MUTEX(dal_channel_list_lock); - -static struct dal_channel *dal_open_channel(const char *name, uint32_t cpu) -{ - struct dal_channel *dch; - - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - mutex_lock(&dal_channel_list_lock); - - list_for_each_entry(dch, &dal_channel_list, list) { - if (!strcmp(dch->name, name)) - goto found_it; - } - - dch = kzalloc(sizeof(*dch) + strlen(name) + 1, GFP_KERNEL); - if (!dch) - goto fail; - - dch->name = (char *) (dch + 1); - strcpy(dch->name, name); - spin_lock_init(&dch->lock); - INIT_LIST_HEAD(&dch->clients); - - list_add(&dch->list, &dal_channel_list); - -found_it: - if (!dch->sch) { - if (smd_named_open_on_edge(name, cpu, &dch->sch, - dch, dal_channel_notify)) { - pr_err("[%s:%s] smd open failed\n", __MM_FILE__, - __func__); - dch = NULL; - } - /* FIXME: wait for channel to open before returning */ - msleep(100); - } - -fail: - mutex_unlock(&dal_channel_list_lock); - - return dch; -} - -int dal_call_raw(struct dal_client *client, - struct dal_hdr *hdr, - void *data, int data_len, - void *reply, int reply_max) -{ - struct dal_channel *dch = client->dch; - unsigned long flags; - - client->reply = reply; - client->reply_max = reply_max; - client->msgid = hdr->msgid | DAL_MSGID_REPLY; - client->status = -EBUSY; - -#if DAL_TRACE - pr_info("[%s:%s:%x] dal send %p -> %p %02x:%04x:%02x %d\n", - __MM_FILE__, __func__, (unsigned int)client, hdr->from, hdr->to, - hdr->msgid, hdr->ddi, hdr->prototype, - hdr->length - sizeof(*hdr)); - print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, data, data_len); -#endif - - if (client->tr_log) - dal_trace_log(client, hdr, data, data_len); - - spin_lock_irqsave(&dch->lock, flags); - /* FIXME: ensure entire message is written or none. */ - smd_write(dch->sch, hdr, sizeof(*hdr)); - smd_write(dch->sch, data, data_len); - spin_unlock_irqrestore(&dch->lock, flags); - - if (!wait_event_timeout(client->wait, (client->status != -EBUSY), 5*HZ)) { - dal_trace_dump(client); - pr_err("[%s:%s] call timed out. dsp is probably dead.\n", - __MM_FILE__, __func__); - dal_trace_print(hdr, data, data_len, 0); - q6audio_dsp_not_responding(); - } - - return client->status; -} - -int dal_call(struct dal_client *client, - unsigned ddi, unsigned prototype, - void *data, int data_len, - void *reply, int reply_max) -{ - struct dal_hdr hdr; - int r; - - memset(&hdr, 0, sizeof(hdr)); - - hdr.length = data_len + sizeof(hdr); - hdr.version = DAL_VERSION; - hdr.msgid = DAL_MSGID_DDI; - hdr.ddi = ddi; - hdr.prototype = prototype; - hdr.from = client; - hdr.to = client->remote; - - if (hdr.length > DAL_MSG_MAX) - return -EINVAL; - - mutex_lock(&client->write_lock); - r = dal_call_raw(client, &hdr, data, data_len, reply, reply_max); - mutex_unlock(&client->write_lock); - - return r; -} - -struct dal_msg_attach { - uint32_t device_id; - char attach[64]; - char service_name[32]; -} __attribute__((packed)); - -struct dal_reply_attach { - uint32_t status; - char name[64]; -}; - -struct dal_client *dal_attach(uint32_t device_id, const char *name, - uint32_t cpu, dal_event_func_t func, void *cookie) -{ - struct dal_hdr hdr; - struct dal_msg_attach msg; - struct dal_reply_attach reply; - struct dal_channel *dch; - struct dal_client *client; - unsigned long flags; - int r; - - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - dch = dal_open_channel(name, cpu); - if (!dch) - return 0; - - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) - return 0; - - client->dch = dch; - client->event = func; - client->cookie = cookie; - mutex_init(&client->write_lock); - spin_lock_init(&client->tr_lock); - init_waitqueue_head(&client->wait); - - spin_lock_irqsave(&dch->lock, flags); - list_add(&client->list, &dch->clients); - spin_unlock_irqrestore(&dch->lock, flags); - - memset(&hdr, 0, sizeof(hdr)); - memset(&msg, 0, sizeof(msg)); - - hdr.length = sizeof(hdr) + sizeof(msg); - hdr.version = DAL_VERSION; - hdr.msgid = DAL_MSGID_ATTACH; - hdr.from = client; - msg.device_id = device_id; - - r = dal_call_raw(client, &hdr, &msg, sizeof(msg), - &reply, sizeof(reply)); - - if ((r == sizeof(reply)) && (reply.status == 0)) { - reply.name[63] = 0; - pr_info("[%s:%s] status = %d, name = '%s' dal_client %x\n", - __MM_FILE__, __func__, reply.status, - reply.name, (unsigned int)client); - return client; - } - - pr_err("[%s:%s] failure\n", __MM_FILE__, __func__); - - dal_detach(client); - return 0; -} - -int dal_detach(struct dal_client *client) -{ - struct dal_channel *dch; - unsigned long flags; - - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - mutex_lock(&client->write_lock); - if (client->remote) { - struct dal_hdr hdr; - uint32_t data; - - memset(&hdr, 0, sizeof(hdr)); - hdr.length = sizeof(hdr) + sizeof(data); - hdr.version = DAL_VERSION; - hdr.msgid = DAL_MSGID_DETACH; - hdr.from = client; - hdr.to = client->remote; - data = (uint32_t) client; - - dal_call_raw(client, &hdr, &data, sizeof(data), - &data, sizeof(data)); - } - - dch = client->dch; - spin_lock_irqsave(&dch->lock, flags); - if (dch->active == client) { - /* We have received a message header for this client - * but not the body of the message. Ensure that when - * the body arrives we don't write it into the now-closed - * client. In *theory* this should never happen. - */ - dch->active = 0; - dch->ptr = dch->data; - } - list_del(&client->list); - spin_unlock_irqrestore(&dch->lock, flags); - - mutex_unlock(&client->write_lock); - - kfree(client); - return 0; -} - -void *dal_get_remote_handle(struct dal_client *client) -{ - return client->remote; -} - -/* convenience wrappers */ - -int dal_call_f0(struct dal_client *client, uint32_t ddi, uint32_t arg1) -{ - uint32_t tmp = arg1; - int res; - res = dal_call(client, ddi, 0, &tmp, sizeof(tmp), &tmp, sizeof(tmp)); - if (res >= 4) - return (int) tmp; - return res; -} - -int dal_call_f1(struct dal_client *client, uint32_t ddi, uint32_t arg1, - uint32_t arg2) -{ - uint32_t tmp[2]; - int res; - tmp[0] = arg1; - tmp[1] = arg2; - res = dal_call(client, ddi, 1, tmp, sizeof(tmp), tmp, sizeof(uint32_t)); - if (res >= 4) - return (int) tmp[0]; - return res; -} - -int dal_call_f5(struct dal_client *client, uint32_t ddi, void *ibuf, uint32_t ilen) -{ - uint32_t tmp[128]; - int res; - int param_idx = 0; - - if (ilen + 4 > DAL_DATA_MAX) - return -EINVAL; - - tmp[param_idx] = ilen; - param_idx++; - - memcpy(&tmp[param_idx], ibuf, ilen); - param_idx += DIV_ROUND_UP(ilen, 4); - - res = dal_call(client, ddi, 5, tmp, param_idx * 4, tmp, sizeof(tmp)); - - if (res >= 4) - return (int) tmp[0]; - return res; -} - -int dal_call_f6(struct dal_client *client, uint32_t ddi, uint32_t s1, - void *ibuf, uint32_t ilen) -{ - uint32_t tmp[128]; - int res; - int param_idx = 0; - - if (ilen + 8 > DAL_DATA_MAX) - return -EINVAL; - - tmp[param_idx] = s1; - param_idx++; - tmp[param_idx] = ilen; - param_idx++; - memcpy(&tmp[param_idx], ibuf, ilen); - param_idx += DIV_ROUND_UP(ilen, 4); - - res = dal_call(client, ddi, 6, tmp, param_idx * 4, tmp, sizeof(tmp)); - - if (res >= 4) - return (int) tmp[0]; - - return res; -} - -int dal_call_f9(struct dal_client *client, uint32_t ddi, void *obuf, - uint32_t olen) -{ - uint32_t tmp[128]; - int res; - - if (olen > sizeof(tmp) - 8) - return -EINVAL; - tmp[0] = olen; - - res = dal_call(client, ddi, 9, tmp, sizeof(uint32_t), tmp, - sizeof(tmp)); - - if (res >= 4) - res = (int)tmp[0]; - - if (!res) { - if (tmp[1] > olen) - return -EIO; - memcpy(obuf, &tmp[2], tmp[1]); - } - return res; -} - -int dal_call_f11(struct dal_client *client, uint32_t ddi, uint32_t s1, - void *obuf, uint32_t olen) -{ - uint32_t tmp[DAL_DATA_MAX/4] = {0}; - int res; - int param_idx = 0; - int num_bytes = 4; - - num_bytes += (DIV_ROUND_UP(olen, 4)) * 4; - - if ((num_bytes > DAL_DATA_MAX - 12) || (olen > DAL_DATA_MAX - 8)) - return -EINVAL; - - tmp[param_idx] = s1; - param_idx++; - tmp[param_idx] = olen; - param_idx += DIV_ROUND_UP(olen, 4); - - res = dal_call(client, ddi, 11, tmp, param_idx * 4, tmp, sizeof(tmp)); - - if (res >= 4) - res = (int) tmp[0]; - if (!res) { - if (tmp[1] > olen) - return -EIO; - memcpy(obuf, &tmp[2], tmp[1]); - } - return res; -} - -int dal_call_f13(struct dal_client *client, uint32_t ddi, void *ibuf1, - uint32_t ilen1, void *ibuf2, uint32_t ilen2, void *obuf, - uint32_t olen) -{ - uint32_t tmp[DAL_DATA_MAX/4]; - int res; - int param_idx = 0; - int num_bytes = 0; - - num_bytes = (DIV_ROUND_UP(ilen1, 4)) * 4; - num_bytes += (DIV_ROUND_UP(ilen2, 4)) * 4; - - if ((num_bytes > DAL_DATA_MAX - 12) || (olen > DAL_DATA_MAX - 8) || - (ilen1 > DAL_DATA_MAX) || (ilen2 > DAL_DATA_MAX)) - return -EINVAL; - - tmp[param_idx] = ilen1; - param_idx++; - - memcpy(&tmp[param_idx], ibuf1, ilen1); - param_idx += DIV_ROUND_UP(ilen1, 4); - - tmp[param_idx++] = ilen2; - memcpy(&tmp[param_idx], ibuf2, ilen2); - param_idx += DIV_ROUND_UP(ilen2, 4); - - tmp[param_idx++] = olen; - res = dal_call(client, ddi, 13, tmp, param_idx * 4, tmp, - sizeof(tmp)); - - if (res >= 4) - res = (int)tmp[0]; - - if (!res) { - if (tmp[1] > olen) - return -EIO; - memcpy(obuf, &tmp[2], tmp[1]); - } - return res; -} -int dal_call_f14(struct dal_client *client, uint32_t ddi, void *ibuf, - uint32_t ilen, void *obuf1, uint32_t olen1, void *obuf2, - uint32_t olen2, uint32_t *oalen2) -{ - uint32_t tmp[128]; - int res; - int param_idx = 0; - - if (olen1 + olen2 + 8 > DAL_DATA_MAX || - ilen + 12 > DAL_DATA_MAX) - return -EINVAL; - - tmp[param_idx] = ilen; - param_idx++; - - memcpy(&tmp[param_idx], ibuf, ilen); - param_idx += DIV_ROUND_UP(ilen, 4); - - tmp[param_idx++] = olen1; - tmp[param_idx++] = olen2; - res = dal_call(client, ddi, 14, tmp, param_idx * 4, tmp, sizeof(tmp)); - - if (res >= 4) - res = (int)tmp[0]; - - if (!res) { - if (tmp[1] > olen1) - return -EIO; - param_idx = DIV_ROUND_UP(tmp[1], 4) + 2; - if (tmp[param_idx] > olen2) - return -EIO; - - memcpy(obuf1, &tmp[2], tmp[1]); - memcpy(obuf2, &tmp[param_idx+1], tmp[param_idx]); - *oalen2 = tmp[param_idx]; - } - return res; -} diff --git a/arch/arm/mach-msm/qdsp6/dal.h b/arch/arm/mach-msm/qdsp6/dal.h deleted file mode 100644 index 1176eb9c1027..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal.h +++ /dev/null @@ -1,96 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/dal.h - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MACH_MSM_DAL_ -#define _MACH_MSM_DAL_ - -struct dal_client; - -struct dal_info { - uint32_t size; - uint32_t version; - char name[32]; -}; - -typedef void (*dal_event_func_t)(void *data, int len, void *cookie); - -struct dal_client *dal_attach(uint32_t device_id, const char *name, - uint32_t cpu, dal_event_func_t func, void *cookie); - -int dal_detach(struct dal_client *client); - -int dal_call(struct dal_client *client, - unsigned ddi, unsigned prototype, - void *data, int data_len, - void *reply, int reply_max); - -void dal_trace(struct dal_client *client); -void dal_trace_dump(struct dal_client *client); - -/* function to call before panic on stalled dal calls */ -void dal_set_oops(struct dal_client *client, void (*oops)(void)); - -/* convenience wrappers */ -int dal_call_f0(struct dal_client *client, uint32_t ddi, - uint32_t arg1); -int dal_call_f1(struct dal_client *client, uint32_t ddi, - uint32_t arg1, uint32_t arg2); -int dal_call_f5(struct dal_client *client, uint32_t ddi, - void *ibuf, uint32_t ilen); -int dal_call_f6(struct dal_client *client, uint32_t ddi, - uint32_t s1, void *ibuf, uint32_t ilen); -int dal_call_f9(struct dal_client *client, uint32_t ddi, - void *obuf, uint32_t olen); -int dal_call_f11(struct dal_client *client, uint32_t ddi, - uint32_t s1, void *obuf, uint32_t olen); -int dal_call_f13(struct dal_client *client, uint32_t ddi, void *ibuf1, - uint32_t ilen1, void *ibuf2, uint32_t ilen2, void *obuf, - uint32_t olen); -int dal_call_f14(struct dal_client *client, uint32_t ddi, void *ibuf, - uint32_t ilen, void *obuf1, uint32_t olen1, void *obuf2, - uint32_t olen2, uint32_t *oalen2); - -/* common DAL operations */ -enum { - DAL_OP_ATTACH = 0, - DAL_OP_DETACH, - DAL_OP_INIT, - DAL_OP_DEINIT, - DAL_OP_OPEN, - DAL_OP_CLOSE, - DAL_OP_INFO, - DAL_OP_POWEREVENT, - DAL_OP_SYSREQUEST, - DAL_OP_FIRST_DEVICE_API, -}; - -static inline int check_version(struct dal_client *client, uint32_t version) -{ - struct dal_info info; - int res; - - res = dal_call_f9(client, DAL_OP_INFO, &info, sizeof(struct dal_info)); - if (!res) { - if (((info.version & 0xFFFF0000) != (version & 0xFFFF0000)) || - ((info.version & 0x0000FFFF) < - (version & 0x0000FFFF))) { - res = -EINVAL; - } - } - return res; -} - -#endif diff --git a/arch/arm/mach-msm/qdsp6/dal_acdb.h b/arch/arm/mach-msm/qdsp6/dal_acdb.h deleted file mode 100644 index 511879cb4968..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal_acdb.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#define ACDB_DAL_DEVICE 0x02000069 -#define ACDB_DAL_PORT "DAL_AM_AUD" - -#define ACDB_OP_IOCTL DAL_OP_FIRST_DEVICE_API - -/* ioctls */ -#define ACDB_GET_DEVICE 0x0108bb92 -#define ACDB_SET_DEVICE 0x0108bb93 -#define ACDB_GET_STREAM 0x0108bb95 -#define ACDB_SET_STREAM 0x0108bb96 -#define ACDB_GET_DEVICE_TABLE 0x0108bb97 -#define ACDB_GET_STREAM_TABLE 0x0108bb98 - -#define ACDB_RES_SUCCESS 0 -#define ACDB_RES_FAILURE -1 -#define ACDB_RES_BADPARM -2 -#define ACDB_RES_BADSTATE -3 - -struct acdb_cmd_device { - uint32_t size; - - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; - uint32_t interface_id; - uint32_t algorithm_block_id; - - /* physical page aligned buffer */ - uint32_t total_bytes; - uint32_t unmapped_buf; -} __attribute__((packed)); - -struct acdb_cmd_device_table { - uint32_t size; - - uint32_t command_id; - uint32_t device_id; - uint32_t network_id; - uint32_t sample_rate_id; - - /* physical page aligned buffer */ - uint32_t total_bytes; - uint32_t unmapped_buf; - - uint32_t res_size; -} __attribute__((packed)); - -struct acdb_result { - uint32_t dal_status; - uint32_t size; - - uint32_t unmapped_buf; - uint32_t used_bytes; - uint32_t result; -} __attribute__((packed)); diff --git a/arch/arm/mach-msm/qdsp6/dal_adie.h b/arch/arm/mach-msm/qdsp6/dal_adie.h deleted file mode 100644 index 78db05fc6027..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal_adie.h +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _MACH_MSM_QDSP6_ADIE_ -#define _MACH_MSM_QDSP6_ADIE_ - -#include "dal.h" - -#define ADIE_DAL_DEVICE 0x02000029 -#define ADIE_DAL_PORT "DAL_AM_AUD" - -enum { - ADIE_OP_GET_NUM_PATHS = DAL_OP_FIRST_DEVICE_API, - ADIE_OP_GET_ALL_PATH_IDS, - ADIE_OP_SET_PATH, - ADIE_OP_GET_NUM_PATH_FREQUENCY_PLANS, - ADIE_OP_GET_PATH_FREQUENCY_PLANS, - ADIE_OP_SET_PATH_FREQUENCY_PLAN, - ADIE_OP_PROCEED_TO_STAGE, - ADIE_OP_MUTE_PATH -}; - -/* Path IDs for normal operation. */ -#define ADIE_PATH_HANDSET_TX 0x010740f6 -#define ADIE_PATH_HANDSET_RX 0x010740f7 -#define ADIE_PATH_HEADSET_MONO_TX 0x010740f8 -#define ADIE_PATH_HEADSET_STEREO_TX 0x010740f9 -#define ADIE_PATH_HEADSET_MONO_RX 0x010740fa -#define ADIE_PATH_HEADSET_STEREO_RX 0x010740fb -#define ADIE_PATH_SPEAKER_TX 0x010740fc -#define ADIE_PATH_SPEAKER_RX 0x010740fd -#define ADIE_PATH_SPEAKER_STEREO_RX 0x01074101 - -/* Path IDs used for TTY */ -#define ADIE_PATH_TTY_HEADSET_TX 0x010740fe -#define ADIE_PATH_TTY_HEADSET_RX 0x010740ff - -/* Path IDs used by Factory Test Mode. */ -#define ADIE_PATH_FTM_MIC1_TX 0x01074108 -#define ADIE_PATH_FTM_MIC2_TX 0x01074107 -#define ADIE_PATH_FTM_HPH_L_RX 0x01074106 -#define ADIE_PATH_FTM_HPH_R_RX 0x01074104 -#define ADIE_PATH_FTM_EAR_RX 0x01074103 -#define ADIE_PATH_FTM_SPKR_RX 0x01074102 - -/* Path IDs for Loopback */ -/* Path IDs used for Line in -> AuxPGA -> Line Out Stereo Mode*/ -#define ADIE_PATH_AUXPGA_LINEOUT_STEREO_LB 0x01074100 -/* Line in -> AuxPGA -> LineOut Mono */ -#define ADIE_PATH_AUXPGA_LINEOUT_MONO_LB 0x01073d82 -/* Line in -> AuxPGA -> Stereo Headphone */ -#define ADIE_PATH_AUXPGA_HDPH_STEREO_LB 0x01074109 -/* Line in -> AuxPGA -> Mono Headphone */ -#define ADIE_PATH_AUXPGA_HDPH_MONO_LB 0x01073d85 -/* Line in -> AuxPGA -> Earpiece */ -#define ADIE_PATH_AUXPGA_EAP_LB 0x01073d81 -/* Line in -> AuxPGA -> AuxOut */ -#define ADIE_PATH_AUXPGA_AUXOUT_LB 0x01073d86 - -/* Concurrency Profiles */ -#define ADIE_PATH_SPKR_STEREO_HDPH_MONO_RX 0x01073d83 -#define ADIE_PATH_SPKR_MONO_HDPH_MONO_RX 0x01073d84 -#define ADIE_PATH_SPKR_MONO_HDPH_STEREO_RX 0x01073d88 -#define ADIE_PATH_SPKR_STEREO_HDPH_STEREO_RX 0x01073d89 - - -/** Fluence Profiles **/ - -/* Broadside/Bowsetalk profile, - * For Handset and Speaker phone Tx*/ -#define ADIE_CODEC_HANDSET_SPKR_BS_TX 0x0108fafa -/* EndFire profile, - * For Handset and Speaker phone Tx*/ -#define ADIE_CODEC_HANDSET_SPKR_EF_TX 0x0108fafb - - -/* stages */ -#define ADIE_STAGE_PATH_OFF 0x0050 -#define ADIE_STAGE_DIGITAL_READY 0x0100 -#define ADIE_STAGE_DIGITAL_ANALOG_READY 0x1000 -#define ADIE_STAGE_ANALOG_OFF 0x0750 -#define ADIE_STAGE_DIGITAL_OFF 0x0600 - -/* path types */ -#define ADIE_PATH_RX 0 -#define ADIE_PATH_TX 1 -#define ADIE_PATH_LOOPBACK 2 - -/* mute states */ -#define ADIE_MUTE_OFF 0 -#define ADIE_MUTE_ON 1 - - -#endif diff --git a/arch/arm/mach-msm/qdsp6/dal_audio.h b/arch/arm/mach-msm/qdsp6/dal_audio.h deleted file mode 100644 index 6c353db5633e..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal_audio.h +++ /dev/null @@ -1,604 +0,0 @@ -/* Copyright (c) 2009-2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __DAL_AUDIO_H__ -#define __DAL_AUDIO_H__ - -#include "dal_audio_format.h" - -#define AUDIO_DAL_DEVICE 0x02000028 -#define AUDIO_DAL_PORT "DAL_AQ_AUD" - -enum { - AUDIO_OP_CONTROL = DAL_OP_FIRST_DEVICE_API, - AUDIO_OP_DATA, - AUDIO_OP_INIT, -}; - -/* ---- common audio structures ---- */ - -/* This flag, if set, indicates that the beginning of the data in the*/ -/* buffer is a synchronization point or key frame, meaning no data */ -/* before it in the stream is required in order to render the stream */ -/* from this point onward. */ -#define ADSP_AUDIO_BUFFER_FLAG_SYNC_POINT 0x01 - -/* This flag, if set, indicates that the buffer object is using valid */ -/* physical address used to store the media data */ -#define ADSP_AUDIO_BUFFER_FLAG_PHYS_ADDR 0x04 - -/* This flag, if set, indicates that a media start timestamp has been */ -/* set for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_START_SET 0x08 - -/* This flag, if set, indicates that a media stop timestamp has been set */ -/* for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_STOP_SET 0x10 - -/* This flag, if set, indicates that a preroll timestamp has been set */ -/* for a buffer. */ -#define ADSP_AUDIO_BUFFER_FLAG_PREROLL_SET 0x20 - -/* This flag, if set, indicates that the data in the buffer is a fragment of */ -/* a larger block of data, and will be continued by the data in the next */ -/* buffer to be delivered. */ -#define ADSP_AUDIO_BUFFER_FLAG_CONTINUATION 0x40 - -struct adsp_audio_buffer { - u32 addr; /* Physical Address of buffer */ - u32 max_size; /* Maximum size of buffer */ - u32 actual_size; /* Actual size of valid data in the buffer */ - u32 offset; /* Offset to the first valid byte */ - u32 flags; /* ADSP_AUDIO_BUFFER_FLAGs that has been set */ - s64 start; /* Start timestamp, if any */ - s64 stop; /* Stop timestamp, if any */ - s64 preroll; /* Preroll timestamp, if any */ -} __attribute__ ((packed)); - - - -/* ---- audio commands ---- */ - -/* Command/event response types */ -#define ADSP_AUDIO_RESPONSE_COMMAND 0 -#define ADSP_AUDIO_RESPONSE_ASYNC 1 - -struct adsp_command_hdr { - u32 size; /* sizeof(cmd) - sizeof(u32) */ - - u32 dst; - u32 src; - - u32 opcode; - u32 response_type; - u32 seq_number; - - u32 context; /* opaque to DSP */ - u32 data; - - u32 padding; -} __attribute__ ((packed)); - - -#define AUDIO_DOMAIN_APP 0 -#define AUDIO_DOMAIN_MODEM 1 -#define AUDIO_DOMAIN_DSP 2 - -#define AUDIO_SERVICE_AUDIO 0 -#define AUDIO_SERVICE_VIDEO 1 /* really? */ - -/* adsp audio addresses are (byte order) domain, service, major, minor */ -//#define AUDIO_ADDR(maj,min) ( (((maj) & 0xff) << 16) | (((min) & 0xff) << 24) | (1) ) - -#define AUDIO_ADDR(maj,min,dom) ( (((min) & 0xff) << 24) | (((maj) & 0xff) << 16) | ((AUDIO_SERVICE_AUDIO) << 8) | (dom) ) - - -/* AAC Encoder modes */ -#define ADSP_AUDIO_ENC_AAC_LC_ONLY_MODE 0 -#define ADSP_AUDIO_ENC_AAC_PLUS_MODE 1 -#define ADSP_AUDIO_ENC_ENHANCED_AAC_PLUS_MODE 2 - -struct adsp_audio_aac_enc_cfg { - u32 bit_rate; /* bits per second */ - u32 encoder_mode; /* ADSP_AUDIO_ENC_* */ -} __attribute__ ((packed)); - -#define ADSP_AUDIO_ENC_SBC_ALLOCATION_METHOD_LOUNDNESS 0 -#define ADSP_AUDIO_ENC_SBC_ALLOCATION_METHOD_SNR 1 - -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_MONO 1 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_STEREO 2 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_DUAL 8 -#define ADSP_AUDIO_ENC_SBC_CHANNEL_MODE_JOINT_STEREO 9 - -struct adsp_audio_sbc_encoder_cfg { - u32 num_subbands; - u32 block_len; - u32 channel_mode; - u32 allocation_method; - u32 bit_rate; -} __attribute__ ((packed)); - -/* AMR NB encoder modes */ -#define ADSP_AUDIO_AMR_MR475 0 -#define ADSP_AUDIO_AMR_MR515 1 -#define ADSP_AUDIO_AMR_MMR59 2 -#define ADSP_AUDIO_AMR_MMR67 3 -#define ADSP_AUDIO_AMR_MMR74 4 -#define ADSP_AUDIO_AMR_MMR795 5 -#define ADSP_AUDIO_AMR_MMR102 6 -#define ADSP_AUDIO_AMR_MMR122 7 - -/* The following are valid AMR NB DTX modes */ -#define ADSP_AUDIO_AMR_DTX_MODE_OFF 0 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_VAD1 1 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_VAD2 2 -#define ADSP_AUDIO_AMR_DTX_MODE_ON_AUTO 3 - -/* AMR Encoder configuration */ -struct adsp_audio_amr_enc_cfg { - u32 mode; /* ADSP_AUDIO_AMR_MR* */ - u32 dtx_mode; /* ADSP_AUDIO_AMR_DTX_MODE* */ - u32 enable; /* 1 = enable, 0 = disable */ -} __attribute__ ((packed)); - -struct adsp_audio_qcelp13k_enc_cfg { - u16 min_rate; - u16 max_rate; -} __attribute__ ((packed)); - -struct adsp_audio_evrc_enc_cfg { - u16 min_rate; - u16 max_rate; -} __attribute__ ((packed)); - -union adsp_audio_codec_config { - struct adsp_audio_amr_enc_cfg amr; - struct adsp_audio_aac_enc_cfg aac; - struct adsp_audio_qcelp13k_enc_cfg qcelp13k; - struct adsp_audio_evrc_enc_cfg evrc; - struct adsp_audio_sbc_encoder_cfg sbc; -} __attribute__ ((packed)); - - -/* This is the default value. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_NONE 0x0000 - -/* This bit, if set, indicates that the AVSync mode is activated. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_AVSYNC 0x0001 - -/* This bit, if set, indicates that the Sample Rate/Channel Mode */ -/* Change Notification mode is activated. */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_SR_CM_NOTIFY 0x0002 - -/* This bit, if set, indicates that the sync clock is enabled */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_ENABLE_SYNC_CLOCK 0x0004 - -/* This bit, if set, indicates that the AUX PCM loopback is enabled */ -#define ADSP_AUDIO_OPEN_STREAM_MODE_AUX_PCM 0x0040 - -struct adsp_open_command { - struct adsp_command_hdr hdr; - - u32 device; - u32 endpoint; /* address */ - - u32 stream_context; - u32 mode; - - u32 buf_max_size; - - union adsp_audio_format format; - union adsp_audio_codec_config config; -} __attribute__ ((packed)); - - -/* --- audio control and stream session ioctls ---- */ - -/* Opcode to open a device stream session to capture audio */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_READ 0x0108dd79 - -/* Opcode to open a device stream session to render audio */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE 0x0108dd7a - -/* Opcode to open a device session, must open a device */ -#define ADSP_AUDIO_IOCTL_CMD_OPEN_DEVICE 0x0108dd7b - -/* Close an existing stream or device */ -#define ADSP_AUDIO_IOCTL_CMD_CLOSE 0x0108d8bc - - - -/* A device switch requires three IOCTL */ -/* commands in the following sequence: PREPARE, STANDBY, COMMIT */ - -/* adsp_audio_device_switch_command structure is needed for */ -/* DEVICE_SWITCH_PREPARE */ - -/* Device switch protocol step #1. Pause old device and */ -/* generate silence for the old device. */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_PREPARE 0x010815c4 - -/* Device switch protocol step #2. Release old device, */ -/* create new device and generate silence for the new device. */ - -/* When client receives ack for this IOCTL, the client can */ -/* start sending IOCTL commands to configure, calibrate and */ -/* change filter settings on the new device. */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_STANDBY 0x010815c5 - -/* Device switch protocol step #3. Start normal operations on new device */ -#define ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_COMMIT 0x01075ee7 - -struct adsp_device_switch_command { - struct adsp_command_hdr hdr; - u32 old_device; - u32 new_device; - u8 device_class; /* 0 = i.rx, 1 = i.tx, 2 = e.rx, 3 = e.tx */ - u8 device_type; /* 0 = rx, 1 = tx, 2 = both */ -} __attribute__ ((packed)); - - - -/* --- audio control session ioctls ---- */ - -#define ADSP_PATH_RX 0 -#define ADSP_PATH_TX 1 -#define ADSP_PATH_BOTH 2 -#define ADSP_PATH_TX_CNG_DIS 3 - -struct adsp_audio_dtmf_start_command { - struct adsp_command_hdr hdr; - u32 tone1_hz; - u32 tone2_hz; - u32 duration_usec; - s32 gain_mb; -} __attribute__ ((packed)); - -/* These commands will affect a logical device and all its associated */ -/* streams. */ - -#define ADSP_AUDIO_MAX_EQ_BANDS 12 - -struct adsp_audio_eq_band { - u16 band_idx; /* The band index, 0 .. 11 */ - u32 filter_type; /* Filter band type */ - u32 center_freq_hz; /* Filter band center frequency */ - s32 filter_gain; /* Filter band initial gain (dB) */ - /* Range is +12 dB to -12 dB with 1dB increments. */ - s32 q_factor; - /* Filter band quality factor expressed as q-8 number, */ - /* e.g. 3000/(2^8) */ -} __attribute__ ((packed)); - -struct adsp_audio_eq_stream_config { - uint32_t enable; /* Number of consequtive bands specified */ - uint32_t num_bands; - struct adsp_audio_eq_band eq_bands[ADSP_AUDIO_MAX_EQ_BANDS]; -} __attribute__ ((packed)); - -/* set device equalizer */ -struct adsp_set_dev_equalizer_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 enable; - u32 num_bands; - struct adsp_audio_eq_band eq_bands[ADSP_AUDIO_MAX_EQ_BANDS]; -} __attribute__ ((packed)); - -/* Set device volume. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL 0x0107605c - -struct adsp_set_dev_volume_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 path; /* 0 = rx, 1 = tx, 2 = both */ - s32 volume; -} __attribute__ ((packed)); - -/* Set Device stereo volume. This command has data payload, */ -/* struct adsp_audio_set_dev_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_STEREO_VOL 0x0108df3e - -/* Set L, R cross channel gain for a Device. This command has */ -/* data payload, struct adsp_audio_set_dev_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_XCHAN_GAIN 0x0108df40 - -/* Set device mute state. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE 0x0107605f - -struct adsp_set_dev_mute_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 path; /* 0 = rx, 1 = tx, 2 = both */ - u32 mute; /* 1 = mute */ -} __attribute__ ((packed)); - -/* Configure Equalizer for a device. */ -/* This command has payload struct adsp_audio_set_dev_equalizer_command. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_EQ_CONFIG 0x0108b10e - -/* Set configuration data for an algorithm aspect of a device. */ -/* This command has payload struct adsp_audio_set_dev_cfg_command. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG 0x0108b6cb - -struct adsp_set_dev_cfg_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 block_id; - u32 interface_id; - u32 phys_addr; - u32 phys_size; - u32 phys_used; -} __attribute__ ((packed)); - -/* Set configuration data for all interfaces of a device. */ -#define ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG_TABLE 0x0108b6bf - -struct adsp_set_dev_cfg_table_command { - struct adsp_command_hdr hdr; - u32 device_id; - u32 phys_addr; - u32 phys_size; - u32 phys_used; -} __attribute__ ((packed)); - -/* ---- audio stream data commands ---- */ - -#define ADSP_AUDIO_IOCTL_CMD_DATA_TX 0x0108dd7f -#define ADSP_AUDIO_IOCTL_CMD_DATA_RX 0x0108dd80 - -struct adsp_buffer_command { - struct adsp_command_hdr hdr; - struct adsp_audio_buffer buffer; -} __attribute__ ((packed)); - - - -/* ---- audio stream ioctls (only affect a single stream in a session) ---- */ - -/* Stop stream for audio device. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_STOP 0x01075c54 - -/* End of stream reached. Client will not send any more data. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_EOS 0x0108b150 - -/* Do sample slipping/stuffing on AAC outputs. The payload of */ -/* this command is struct adsp_audio_slip_sample_command. */ -#define ADSP_AUDIO_IOCTL_CMD_STREAM_SLIPSAMPLE 0x0108d40e - -/* Set stream volume. */ -/* This command has data payload, struct adsp_audio_set_volume_command. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_STREAM_VOL 0x0108c0de - -/* Set stream stereo volume. This command has data payload, */ -/* struct adsp_audio_set_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_STEREO_VOL 0x0108dd7c - -/* Set L, R cross channel gain for a Stream. This command has */ -/* data payload, struct adsp_audio_set_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_XCHAN_GAIN 0x0108dd7d - -/* Set stream mute state. */ -/* This command has data payload, struct adsp_audio_set_stream_mute. */ -#define ADSP_AUDIO_IOCTL_CMD_SET_STREAM_MUTE 0x0108c0df - -/* Reconfigure bit rate information. This command has data */ -/* payload, struct adsp_audio_set_bit_rate_command */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_BITRATE 0x0108ccf1 - -/* Set Channel Mapping. This command has data payload, struct */ -/* This command has data payload struct adsp_audio_set_channel_map_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_CHANNELMAP 0x0108d32a - -/* Enable/disable AACPlus SBR. */ -/* This command has data payload struct adsp_audio_set_sbr_command */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_SBR 0x0108d416 - -/* Enable/disable WMA Pro Chex and Fex. This command has data payload */ -/* struct adsp_audio_stream_set_wma_command. */ -#define ADSP_AUDIO_IOCTL_SET_STREAM_WMAPRO 0x0108d417 - - -/* ---- audio session ioctls (affect all streams in a session) --- */ - -/* Start stream for audio device. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_START 0x010815c6 - -/* Stop all stream(s) for audio session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_STOP 0x0108dd7e - -/* Pause the data flow for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_PAUSE 0x01075ee8 - -/* Resume the data flow for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_RESUME 0x01075ee9 - -/* Drop any unprocessed data buffers for a session as indicated by major id. */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_FLUSH 0x01075eea - -/* Start Stream DTMF tone */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_START 0x0108c0dd - -/* Stop Stream DTMF tone */ -#define ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_STOP 0x01087554 - -/* Set Session volume. */ -/* This command has data payload, struct adsp_audio_set_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_VOL 0x0108d8bd - -/* Set session stereo volume. This command has data payload, */ -/* struct adsp_audio_set_stereo_volume_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_STEREO_VOL 0x0108df3d - -/* Set L, R cross channel gain for a session. This command has */ -/* data payload, struct adsp_audio_set_x_chan_gain_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_XCHAN_GAIN 0x0108df3f - -/* Set Session mute state. */ -/* This command has data payload, struct adsp_audio_set_mute_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_MUTE 0x0108d8be - -/* Configure Equalizer for a stream. */ -/* This command has payload struct adsp_audio_set_equalizer_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_EQ_CONFIG 0x0108c0e0 - -/* Set Audio Video sync information. */ -/* This command has data payload, struct adsp_audio_set_av_sync_command. */ -#define ADSP_AUDIO_IOCTL_SET_SESSION_AVSYNC 0x0108d1e2 - -/* Get Audio Media Session time. */ -/* This command returns the audioTime in adsp_audio_unsigned64_event */ -#define ADSP_AUDIO_IOCTL_CMD_GET_AUDIO_TIME 0x0108c26c - - -/* these command structures are used for both STREAM and SESSION ioctls */ - -struct adsp_set_volume_command { - struct adsp_command_hdr hdr; - s32 volume; -} __attribute__ ((packed)); - -struct adsp_set_mute_command { - struct adsp_command_hdr hdr; - u32 mute; /* 1 == mute */ -} __attribute__ ((packed)); - - -struct adsp_set_equalizer_command { - struct adsp_command_hdr hdr; - u32 enable; - u32 num_bands; - struct adsp_audio_eq_band eq_bands[ADSP_AUDIO_MAX_EQ_BANDS]; -} __attribute__ ((packed)); - -/* ---- audio events ---- */ - -/* All IOCTL commands generate an event with the IOCTL opcode as the */ -/* event id after the IOCTL command has been executed. */ - -/* This event is generated after a media stream session is opened. */ -#define ADSP_AUDIO_EVT_STATUS_OPEN 0x0108c0d6 - -/* This event is generated after a media stream session is closed. */ -#define ADSP_AUDIO_EVT_STATUS_CLOSE 0x0108c0d7 - -/* Asyncronous buffer consumption. This event is generated after a */ -/* recived buffer is consumed during rendering or filled during */ -/* capture opeartion. */ -#define ADSP_AUDIO_EVT_STATUS_BUF_DONE 0x0108c0d8 - -/* This event is generated when rendering operation is starving for */ -/* data. In order to avoid audio loss at the end of a plauback, the */ -/* client should wait for this event before issuing the close command. */ -#define ADSP_AUDIO_EVT_STATUS_BUF_UNDERRUN 0x0108c0d9 - -/* This event is generated during capture operation when there are no */ -/* buffers available to copy the captured audio data */ -#define ADSP_AUDIO_EVT_STATUS_BUF_OVERFLOW 0x0108c0da - -/* This asynchronous event is generated as a result of an input */ -/* sample rate change and/or channel mode change detected by the */ -/* decoder. The event payload data is an array of 2 uint32 */ -/* values containing the sample rate in Hz and channel mode. */ -#define ADSP_AUDIO_EVT_SR_CM_CHANGE 0x0108d329 - -struct adsp_event_hdr { - u32 evt_handle; /* DAL common header */ - u32 evt_cookie; - u32 evt_length; - - u32 src; /* "source" audio address */ - u32 dst; /* "destination" audio address */ - - u32 event_id; - u32 response_type; - u32 seq_number; - - u32 context; /* opaque to DSP */ - u32 data; - - u32 status; -} __attribute__ ((packed)); - -struct adsp_buffer_event { - struct adsp_event_hdr hdr; - struct adsp_audio_buffer buffer; -} __attribute__ ((packed)); - - -/* ---- audio device IDs ---- */ - -/* Device direction Rx/Tx flag */ -#define ADSP_AUDIO_RX_DEVICE 0x00 -#define ADSP_AUDIO_TX_DEVICE 0x01 - -/* Default RX or TX device */ -#define ADSP_AUDIO_DEVICE_ID_DEFAULT 0x1081679 - -/* Source (TX) devices */ -#define ADSP_AUDIO_DEVICE_ID_HANDSET_MIC 0x107ac8d -#define ADSP_AUDIO_DEVICE_ID_HEADSET_MIC 0x1081510 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC 0x1081512 -#define ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC 0x1081518 -#define ADSP_AUDIO_DEVICE_ID_AUXPCM_TX 0x1081518 -#define ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC 0x108151b -#define ADSP_AUDIO_DEVICE_ID_I2S_MIC 0x1089bf3 - -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC 0x108f9c5 -#define ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC 0x108f9c3 - -/* Special loopback pseudo device to be paired with an RX device */ -/* with usage ADSP_AUDIO_DEVICE_USAGE_MIXED_PCM_LOOPBACK */ -#define ADSP_AUDIO_DEVICE_ID_MIXED_PCM_LOOPBACK_TX 0x1089bf2 - -/* Sink (RX) devices */ -#define ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR 0x107ac88 -#define ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO 0x1081511 -#define ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO 0x107ac8a -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO 0x1081513 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET 0x108c508 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET 0x108c894 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO 0x1081514 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET 0x108c895 -#define ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET 0x108c509 -#define ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR 0x1081519 -#define ADSP_AUDIO_DEVICE_ID_AUXPCM_RX 0x1081519 -#define ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR 0x108151c -#define ADSP_AUDIO_DEVICE_ID_I2S_SPKR 0x1089bf4 -#define ADSP_AUDIO_DEVICE_ID_NULL_SINK 0x108e512 - -/* BT A2DP playback device. */ -/* This device must be paired with */ -/* ADSP_AUDIO_DEVICE_ID_MIXED_PCM_LOOPBACK_TX using */ -/* ADSP_AUDIO_DEVICE_USAGE_MIXED_PCM_LOOPBACK mode */ -#define ADSP_AUDIO_DEVICE_ID_BT_A2DP_SPKR 0x108151a - -/* Voice Destination identifier - specifically used for */ -/* controlling Voice module from the Device Control Session */ -#define ADSP_AUDIO_DEVICE_ID_VOICE 0x0108df3c - -/* Audio device usage types. */ -/* This is a bit mask to determine which topology to use in the */ -/* device session */ -#define ADSP_AUDIO_DEVICE_CONTEXT_VOICE 0x01 -#define ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK 0x02 -#define ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD 0x10 -#define ADSP_AUDIO_DEVICE_CONTEXT_RECORD 0x20 -#define ADSP_AUDIO_DEVICE_CONTEXT_PCM_LOOPBACK 0x40 - -/* ADSP audio driver return codes */ -#define ADSP_AUDIO_STATUS_SUCCESS 0 -#define ADSP_AUDIO_STATUS_EUNSUPPORTED 20 - -#endif diff --git a/arch/arm/mach-msm/qdsp6/dal_audio_format.h b/arch/arm/mach-msm/qdsp6/dal_audio_format.h deleted file mode 100644 index 4223974b2804..000000000000 --- a/arch/arm/mach-msm/qdsp6/dal_audio_format.h +++ /dev/null @@ -1,270 +0,0 @@ -/* Copyright (c) 2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __ADSP_AUDIO_MEDIA_FORMAT_H -#define __ADSP_AUDIO_MEDIA_FORMAT_H - - - -/* Supported audio media formats */ - -/* format block in shmem */ -#define ADSP_AUDIO_FORMAT_SHAREDMEMORY 0x01091a78 -/* adsp_audio_format_raw_pcm type */ -#define ADSP_AUDIO_FORMAT_PCM 0x0103d2fd -/* adsp_audio_format_raw_pcm type */ -#define ADSP_AUDIO_FORMAT_DTMF 0x01087725 -/* adsp_audio_format_adpcm type */ -#define ADSP_AUDIO_FORMAT_ADPCM 0x0103d2ff -/* Yamaha PCM format */ -#define ADSP_AUDIO_FORMAT_YADPCM 0x0108dc07 -/* ISO/IEC 11172 */ -#define ADSP_AUDIO_FORMAT_MP3 0x0103d308 -/* ISO/IEC 14496 */ -#define ADSP_AUDIO_FORMAT_MPEG4_AAC 0x010422f1 -/* AMR-NB audio in FS format */ -#define ADSP_AUDIO_FORMAT_AMRNB_FS 0x0105c16c -/* AMR-WB audio in FS format */ -#define ADSP_AUDIO_FORMAT_AMRWB_FS 0x0105c16e -/* QCELP 13k, IS733 */ -#define ADSP_AUDIO_FORMAT_V13K_FS 0x01080b8a -/* EVRC 8k, IS127 */ -#define ADSP_AUDIO_FORMAT_EVRC_FS 0x01080b89 -/* EVRC-B 8k, 4GV */ -#define ADSP_AUDIO_FORMAT_EVRCB_FS 0x0108f2a3 -/* MIDI command stream */ -#define ADSP_AUDIO_FORMAT_MIDI 0x0103d300 -/* A2DP SBC stream */ -#define ADSP_AUDIO_FORMAT_SBC 0x0108c4d8 -/* Version 10 Professional */ -#define ADSP_AUDIO_FORMAT_WMA_V10PRO 0x0108aa92 -/* Version 9 Starndard */ -#define ADSP_AUDIO_FORMAT_WMA_V9 0x0108d430 -/* AMR WideBand Plus */ -#define ADSP_AUDIO_FORMAT_AMR_WB_PLUS 0x0108f3da -/* AC3 Decoder */ -#define ADSP_AUDIO_FORMAT_AC3_DECODER 0x0108d5f9 - - -/* Not yet supported audio media formats */ - - - -/* ISO/IEC 13818 */ -#define ADSP_AUDIO_FORMAT_MPEG2_AAC 0x0103d309 -/* 3GPP TS 26.101 Sec 4.0 */ -#define ADSP_AUDIO_FORMAT_AMRNB_IF1 0x0103d305 -/* 3GPP TS 26.101 Annex A */ -#define ADSP_AUDIO_FORMAT_AMRNB_IF2 0x01057b31 -/* 3GPP TS 26.201 */ -#define ADSP_AUDIO_FORMAT_AMRWB_IF1 0x0103d306 -/* 3GPP TS 26.201 */ -#define ADSP_AUDIO_FORMAT_AMRWB_IF2 0x0105c16d -/* G.711 */ -#define ADSP_AUDIO_FORMAT_G711 0x0106201d -/* QCELP 8k, IS96A */ -#define ADSP_AUDIO_FORMAT_V8K_FS 0x01081d29 -/* Version 1 codec */ -#define ADSP_AUDIO_FORMAT_WMA_V1 0x01055b2b -/* Version 2, 7 & 8 codec */ -#define ADSP_AUDIO_FORMAT_WMA_V8 0x01055b2c -/* Version 9 Professional codec */ -#define ADSP_AUDIO_FORMAT_WMA_V9PRO 0x01055b2d -/* Version 9 Voice codec */ -#define ADSP_AUDIO_FORMAT_WMA_SP1 0x01055b2e -/* Version 9 Lossless codec */ -#define ADSP_AUDIO_FORMAT_WMA_LOSSLESS 0x01055b2f -/* Real Media content, low-bitrate */ -#define ADSP_AUDIO_FORMAT_RA_SIPR 0x01042a0f -/* Real Media content */ -#define ADSP_AUDIO_FORMAT_RA_COOK 0x01042a0e - - -/* For all of the audio formats, unless specified otherwise, */ -/* the following apply: */ -/* Format block bits are arranged in bytes and words in little-endian */ -/* order, i.e., least-significant bit first and least-significant */ -/* byte first. */ - - - -/* AAC Format Block. */ - -/* AAC format block consist of a format identifier followed by */ -/* AudioSpecificConfig formatted according to ISO/IEC 14496-3 */ - -/* The following AAC format identifiers are supported */ -#define ADSP_AUDIO_AAC_ADTS 0x010619cf -#define ADSP_AUDIO_AAC_MPEG4_ADTS 0x010619d0 -#define ADSP_AUDIO_AAC_LOAS 0x010619d1 -#define ADSP_AUDIO_AAC_ADIF 0x010619d2 -#define ADSP_AUDIO_AAC_RAW 0x010619d3 -#define ADSP_AUDIO_AAC_FRAMED_RAW 0x0108c1fb - - -#define ADSP_AUDIO_COMPANDING_ALAW 0x10619cd -#define ADSP_AUDIO_COMPANDING_MLAW 0x10619ce - -/* Maxmum number of bytes allowed in a format block */ -#define ADSP_AUDIO_FORMAT_DATA_MAX 16 - - -struct adsp_audio_no_payload_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* no payload for this format type */ -} __attribute__ ((packed)); - - -/* For convenience, to be used as a standard format block */ -/* for various media types that don't need a unique format block */ -/* ie. PCM, DTMF, etc. */ -struct adsp_audio_standard_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 channels; - u16 bits_per_sample; - u32 sampling_rate; - u8 is_signed; - u8 is_interleaved; -} __attribute__ ((packed)); - - - -/* ADPCM format block */ -struct adsp_audio_adpcm_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 channels; - u16 bits_per_sample; - u32 sampling_rate; - u8 is_signed; - u8 is_interleaved; - u32 block_size; -} __attribute__ ((packed)); - - -/* MIDI format block */ -struct adsp_audio_midi_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 sampling_rate; - u16 channels; - u16 mode; -} __attribute__ ((packed)); - - -/* G711 format block */ -struct adsp_audio_g711_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 companding; -} __attribute__ ((packed)); - - -struct adsp_audio_wma_pro_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u16 format_tag; - u16 channels; - u32 samples_per_sec; - u32 avg_bytes_per_sec; - u16 block_align; - u16 valid_bits_per_sample; - u32 channel_mask; - u16 encode_opt; - u16 advanced_encode_opt; - u32 advanced_encode_opt2; - u32 drc_peak_reference; - u32 drc_peak_target; - u32 drc_average_reference; - u32 drc_average_target; -} __attribute__ ((packed)); - - -struct adsp_audio_amrwb_plus_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - u32 size; - u32 version; - u32 channels; - u32 amr_band_mode; - u32 amr_dtx_mode; - u32 amr_frame_format; - u32 amr_isf_index; -} __attribute__ ((packed)); - - -/* Binary Byte Stream Format */ -/* Binary format type that defines a byte stream, */ -/* can be used to specify any format (ie. AAC) */ -struct adsp_audio_binary_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* payload */ - /* number of bytes set in byte stream */ - u32 num_bytes; - /* Byte stream binary data */ - u8 data[ADSP_AUDIO_FORMAT_DATA_MAX]; -} __attribute__ ((packed)); - - -struct adsp_audio_shared_memory_format { - /* Media Format Code (must always be first element) */ - u32 format; - - /* Number of bytes in shared memory */ - u32 len; - /* Phyisical address to data in shared memory */ - u32 address; -} __attribute__ ((packed)); - - -/* Union of all format types */ -union adsp_audio_format { - /* Basic format block with no payload */ - struct adsp_audio_no_payload_format no_payload; - /* Generic format block PCM, DTMF */ - struct adsp_audio_standard_format standard; - /* ADPCM format block */ - struct adsp_audio_adpcm_format adpcm; - /* MIDI format block */ - struct adsp_audio_midi_format midi; - /* G711 format block */ - struct adsp_audio_g711_format g711; - /* WmaPro format block */ - struct adsp_audio_wma_pro_format wma_pro; - /* WmaPro format block */ - struct adsp_audio_amrwb_plus_format amrwb_plus; - /* binary (byte stream) format block, used for AAC */ - struct adsp_audio_binary_format binary; - /* format block in shared memory */ - struct adsp_audio_shared_memory_format shared_mem; -}; - -#endif - diff --git a/arch/arm/mach-msm/qdsp6/dsp_debug.c b/arch/arm/mach-msm/qdsp6/dsp_debug.c deleted file mode 100644 index 922f8cd39cdc..000000000000 --- a/arch/arm/mach-msm/qdsp6/dsp_debug.c +++ /dev/null @@ -1,179 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/dsp_dump.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -static wait_queue_head_t dsp_wait; -static int dsp_has_crashed; -static int dsp_wait_count; - -static atomic_t dsp_crash_count = ATOMIC_INIT(0); - -void q6audio_dsp_not_responding(void) -{ - - if (atomic_add_return(1, &dsp_crash_count) != 1) { - pr_err("q6audio_dsp_not_responding() - parking additional crasher...\n"); - for (;;) - msleep(1000); - } - if (dsp_wait_count) { - dsp_has_crashed = 1; - wake_up(&dsp_wait); - - while (dsp_has_crashed != 2) - wait_event(dsp_wait, dsp_has_crashed == 2); - } else { - pr_err("q6audio_dsp_not_responding() - no waiter?\n"); - } - BUG(); -} - -static int dsp_open(struct inode *inode, struct file *file) -{ - return 0; -} - -static ssize_t dsp_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - char cmd[32]; - - if (count >= sizeof(cmd)) - return -EINVAL; - if (copy_from_user(cmd, buf, count)) - return -EFAULT; - cmd[count] = 0; - - if ((count > 1) && (cmd[count-1] == '\n')) - cmd[count-1] = 0; - - if (!strcmp(cmd, "wait-for-crash")) { - while (!dsp_has_crashed) { - int res; - dsp_wait_count++; - res = wait_event_interruptible(dsp_wait, dsp_has_crashed); - if (res < 0) { - dsp_wait_count--; - return res; - } - } -#if defined(CONFIG_MACH_MAHIMAHI) - /* assert DSP NMI */ - msm_proc_comm(PCOM_CUSTOMER_CMD1, 0, 0); - msleep(250); -#endif - } else if (!strcmp(cmd, "boom")) { - q6audio_dsp_not_responding(); - } else if (!strcmp(cmd, "continue-crash")) { - dsp_has_crashed = 2; - wake_up(&dsp_wait); - } else { - pr_err("[%s:%s] unknown dsp_debug command: %s\n", __MM_FILE__, - __func__, cmd); - } - - return count; -} - -#define DSP_RAM_BASE 0x2E800000 -#define DSP_RAM_SIZE 0x01800000 - -static unsigned copy_ok_count; - -static ssize_t dsp_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - size_t actual = 0; - size_t mapsize = PAGE_SIZE; - unsigned addr; - void __iomem *ptr; - - if (*pos >= DSP_RAM_SIZE) - return 0; - - if (*pos & (PAGE_SIZE - 1)) - return -EINVAL; - - addr = (*pos + DSP_RAM_BASE); - - /* don't blow up if we're unaligned */ - if (addr & (PAGE_SIZE - 1)) - mapsize *= 2; - - while (count >= PAGE_SIZE) { - ptr = ioremap(addr, mapsize); - if (!ptr) { - pr_err("[%s:%s] map error @ %x\n", __MM_FILE__, - __func__, addr); - return -EFAULT; - } - if (copy_to_user(buf, ptr, PAGE_SIZE)) { - iounmap(ptr); - pr_err("[%s:%s] copy error @ %p\n", __MM_FILE__, - __func__, buf); - return -EFAULT; - } - copy_ok_count += PAGE_SIZE; - iounmap(ptr); - addr += PAGE_SIZE; - buf += PAGE_SIZE; - actual += PAGE_SIZE; - count -= PAGE_SIZE; - } - - *pos += actual; - return actual; -} - -static int dsp_release(struct inode *inode, struct file *file) -{ - return 0; -} - -static const struct file_operations dsp_fops = { - .owner = THIS_MODULE, - .open = dsp_open, - .read = dsp_read, - .write = dsp_write, - .release = dsp_release, -}; - -static struct miscdevice dsp_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "dsp_debug", - .fops = &dsp_fops, -}; - - -static int __init dsp_init(void) -{ - init_waitqueue_head(&dsp_wait); - return misc_register(&dsp_misc); -} - -device_initcall(dsp_init); diff --git a/arch/arm/mach-msm/qdsp6/dtmf.c b/arch/arm/mach-msm/qdsp6/dtmf.c deleted file mode 100644 index 30978df9b97d..000000000000 --- a/arch/arm/mach-msm/qdsp6/dtmf.c +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -struct dtmf { - struct mutex lock; - struct audio_client *ac; - struct msm_dtmf_config cfg; -}; - -static long dtmf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct dtmf *dtmf = file->private_data; - int rc = 0; - - mutex_lock(&dtmf->lock); - switch (cmd) { - - case AUDIO_START: { - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (dtmf->ac) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - } else { - dtmf->ac = q6audio_open_dtmf(48000, 2, 0); - if (!dtmf->ac) - rc = -ENOMEM; - } - break; - } - case AUDIO_PLAY_DTMF: { - rc = copy_from_user((void *)&dtmf->cfg, (void *)arg, - sizeof(struct msm_dtmf_config)); - - pr_debug("[%s:%s] PLAY_DTMF: high = %d, low = %d\n", - __MM_FILE__, __func__, dtmf->cfg.dtmf_hi, - dtmf->cfg.dtmf_low); - rc = q6audio_play_dtmf(dtmf->ac, dtmf->cfg.dtmf_hi, - dtmf->cfg.dtmf_low, dtmf->cfg.duration, - dtmf->cfg.rx_gain); - if (rc) { - pr_err("[%s:%s] DTMF_START failed\n", __MM_FILE__, - __func__); - break; - } - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&dtmf->lock); - - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc) ; - return rc; -} - -static int dtmf_open(struct inode *inode, struct file *file) -{ - int rc = 0; - - struct dtmf *dtmf; - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - dtmf = kzalloc(sizeof(struct dtmf), GFP_KERNEL); - - if (!dtmf) - return -ENOMEM; - - mutex_init(&dtmf->lock); - - file->private_data = dtmf; - return rc; -} - -static int dtmf_release(struct inode *inode, struct file *file) -{ - struct dtmf *dtmf = file->private_data; - if (dtmf->ac) - q6audio_close(dtmf->ac); - kfree(dtmf); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return 0; -} - -static const struct file_operations dtmf_fops = { - .owner = THIS_MODULE, - .open = dtmf_open, - .release = dtmf_release, - .unlocked_ioctl = dtmf_ioctl, -}; - -struct miscdevice dtmf_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_dtmf", - .fops = &dtmf_fops, -}; - -static int __init dtmf_init(void) -{ - return misc_register(&dtmf_misc); -} - -device_initcall(dtmf_init); diff --git a/arch/arm/mach-msm/qdsp6/evrc_in.c b/arch/arm/mach-msm/qdsp6/evrc_in.c deleted file mode 100644 index e059efaefa5c..000000000000 --- a/arch/arm/mach-msm/qdsp6/evrc_in.c +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "dal_audio_format.h" -#include - -#define EVRC_FC_BUFF_CNT 10 -#define EVRC_READ_TIMEOUT 2000 -struct evrc_fc_buff { - struct mutex lock; - int empty; - void *data; - int size; - int actual_size; -}; - -struct evrc_fc { - struct task_struct *task; - wait_queue_head_t fc_wq; - struct evrc_fc_buff fc_buff[EVRC_FC_BUFF_CNT]; - int buff_index; -}; - -struct evrc { - struct mutex lock; - struct msm_audio_evrc_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; - struct msm_voicerec_mode voicerec_mode; - struct evrc_fc *evrc_fc; -}; - - -static int q6_evrc_flowcontrol(void *data) -{ - struct audio_client *ac; - struct audio_buffer *ab; - struct evrc *evrc = data; - int buff_index = 0; - int xfer = 0; - struct evrc_fc *fc; - - - ac = evrc->audio_client; - fc = evrc->evrc_fc; - if (!ac) { - pr_err("[%s:%s] audio_client is NULL\n", __MM_FILE__, __func__); - return 0; - } - - while (!kthread_should_stop()) { - ab = ac->buf + ac->cpu_buf; - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d\n", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = ab->actual_size; - - - mutex_lock(&(fc->fc_buff[buff_index].lock)); - if (!fc->fc_buff[buff_index].empty) { - pr_err("[%s:%s] flow control buffer[%d] not read!\n", - __MM_FILE__, __func__, buff_index); - } - - if (fc->fc_buff[buff_index].size < xfer) { - pr_err("[%s:%s] buffer %d too small\n", __MM_FILE__, - __func__, buff_index); - memcpy(fc->fc_buff[buff_index].data, ab->data, - fc->fc_buff[buff_index].size); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = - fc->fc_buff[buff_index].size; - } else { - memcpy(fc->fc_buff[buff_index].data, ab->data, xfer); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = xfer; - } - mutex_unlock(&(fc->fc_buff[buff_index].lock)); - /*wake up client, if any*/ - wake_up(&fc->fc_wq); - - buff_index++; - if (buff_index >= EVRC_FC_BUFF_CNT) - buff_index = 0; - - ab->used = 1; - - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - return 0; -} -static long q6_evrc_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct evrc *evrc = file->private_data; - int rc = 0; - int i = 0; - struct evrc_fc *fc; - int size = 0; - - mutex_lock(&evrc->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: - pr_debug("[%s:%s] SET_VOLUME\n", __MM_FILE__, __func__); - break; - case AUDIO_GET_STATS: - { - struct msm_audio_stats stats; - pr_debug("[%s:%s] GET_STATS\n", __MM_FILE__, __func__); - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - case AUDIO_START: - { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else { - if (copy_from_user(&acdb_id, (void *) arg, - sizeof(acdb_id))) { - rc = -EFAULT; - break; - } - } - if (evrc->audio_client) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } else { - evrc->audio_client = q6audio_open_qcp( - evrc->str_cfg.buffer_size, - evrc->cfg.min_bit_rate, - evrc->cfg.max_bit_rate, - evrc->voicerec_mode.rec_mode, - ADSP_AUDIO_FORMAT_EVRC_FS, - acdb_id); - - if (!evrc->audio_client) { - pr_err("[%s:%s] evrc open session failed\n", - __MM_FILE__, __func__); - kfree(evrc); - rc = -ENOMEM; - break; - } - } - - /*allocate flow control buffers*/ - fc = evrc->evrc_fc; - size = evrc->str_cfg.buffer_size; - for (i = 0; i < EVRC_FC_BUFF_CNT; ++i) { - mutex_init(&(fc->fc_buff[i].lock)); - fc->fc_buff[i].empty = 1; - fc->fc_buff[i].data = kmalloc(size, GFP_KERNEL); - if (fc->fc_buff[i].data == NULL) { - pr_err("[%s:%s] No memory for FC buffers\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - goto fc_fail; - } - fc->fc_buff[i].size = size; - fc->fc_buff[i].actual_size = 0; - } - - /*create flow control thread*/ - fc->task = kthread_run(q6_evrc_flowcontrol, - evrc, "evrc_flowcontrol"); - if (IS_ERR(fc->task)) { - rc = PTR_ERR(fc->task); - pr_err("[%s:%s] error creating flow control thread\n", - __MM_FILE__, __func__); - goto fc_fail; - } - break; -fc_fail: - /*free flow control buffers*/ - --i; - for (; i >= 0; i--) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_INCALL: { - pr_debug("[%s:%s] SET_INCALL\n", __MM_FILE__, __func__); - if (copy_from_user(&evrc->voicerec_mode, - (void *)arg, sizeof(struct msm_voicerec_mode))) - rc = -EFAULT; - - if (evrc->voicerec_mode.rec_mode != AUDIO_FLAG_READ - && evrc->voicerec_mode.rec_mode != - AUDIO_FLAG_INCALL_MIXED) { - evrc->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - pr_err("[%s:%s] Invalid rec_mode\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - } - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &evrc->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - - pr_debug("[%s:%s] GET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, evrc->str_cfg.buffer_size, - evrc->str_cfg.buffer_count); - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&evrc->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - - pr_debug("[%s:%s] SET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, evrc->str_cfg.buffer_size, - evrc->str_cfg.buffer_count); - - if (evrc->str_cfg.buffer_size < 23) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (evrc->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_EVRC_ENC_CONFIG: - if (copy_from_user(&evrc->cfg, (void *) arg, - sizeof(struct msm_audio_evrc_enc_config))) - rc = -EFAULT; - pr_debug("[%s:%s] SET_EVRC_ENC_CONFIG\n", __MM_FILE__, - __func__); - - if (evrc->cfg.min_bit_rate > 4 || evrc->cfg.min_bit_rate < 1) { - pr_err("[%s:%s] invalid min bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - if (evrc->cfg.max_bit_rate > 4 || evrc->cfg.max_bit_rate < 1) { - pr_err("[%s:%s] invalid max bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - case AUDIO_GET_EVRC_ENC_CONFIG: - if (copy_to_user((void *) arg, &evrc->cfg, - sizeof(struct msm_audio_evrc_enc_config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_EVRC_ENC_CONFIG\n", __MM_FILE__, - __func__); - break; - - default: - rc = -EINVAL; - } - - mutex_unlock(&evrc->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int q6_evrc_in_open(struct inode *inode, struct file *file) -{ - struct evrc *evrc; - struct evrc_fc *fc; - int i; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - evrc = kmalloc(sizeof(struct evrc), GFP_KERNEL); - if (evrc == NULL) { - pr_err("[%s:%s] Could not allocate memory for evrc driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&evrc->lock); - file->private_data = evrc; - evrc->audio_client = NULL; - evrc->str_cfg.buffer_size = 23; - evrc->str_cfg.buffer_count = 2; - evrc->cfg.cdma_rate = CDMA_RATE_FULL; - evrc->cfg.min_bit_rate = 1; - evrc->cfg.max_bit_rate = 4; - evrc->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - - evrc->evrc_fc = kmalloc(sizeof(struct evrc_fc), GFP_KERNEL); - if (evrc->evrc_fc == NULL) { - pr_err("[%s:%s] Could not allocate memory for evrc_fc\n", - __MM_FILE__, __func__); - kfree(evrc); - return -ENOMEM; - } - fc = evrc->evrc_fc; - fc->task = NULL; - fc->buff_index = 0; - for (i = 0; i < EVRC_FC_BUFF_CNT; ++i) { - fc->fc_buff[i].data = NULL; - fc->fc_buff[i].size = 0; - fc->fc_buff[i].actual_size = 0; - } - /*initialize wait queue head*/ - init_waitqueue_head(&fc->fc_wq); - return 0; -} - -static ssize_t q6_evrc_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - const char __user *start = buf; - struct evrc *evrc = file->private_data; - struct evrc_fc *fc; - int xfer = 0; - int res = 0; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - mutex_lock(&evrc->lock); - ac = evrc->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - fc = evrc->evrc_fc; - while (count > xfer) { - /*wait for buffer to full*/ - if (fc->fc_buff[fc->buff_index].empty != 0) { - res = wait_event_interruptible_timeout(fc->fc_wq, - (fc->fc_buff[fc->buff_index].empty == 0), - msecs_to_jiffies(EVRC_READ_TIMEOUT)); - - pr_debug("[%s:%s] buff_index = %d\n", __MM_FILE__, - __func__, fc->buff_index); - if (res == 0) { - pr_err("[%s:%s] Timeout!\n", __MM_FILE__, - __func__); - res = -ETIMEDOUT; - goto fail; - } else if (res < 0) { - pr_err("[%s:%s] Returning on Interrupt\n", - __MM_FILE__, __func__); - goto fail; - } - } - /*lock the buffer*/ - mutex_lock(&(fc->fc_buff[fc->buff_index].lock)); - xfer = fc->fc_buff[fc->buff_index].actual_size; - - if (xfer > count) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] read failed! byte count too small\n", - __MM_FILE__, __func__); - res = -EINVAL; - goto fail; - } - - if (copy_to_user(buf, fc->fc_buff[fc->buff_index].data, xfer)) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] copy_to_user failed at index %d\n", - __MM_FILE__, __func__, fc->buff_index); - res = -EFAULT; - goto fail; - } - buf += xfer; - count -= xfer; - - fc->fc_buff[fc->buff_index].empty = 1; - fc->fc_buff[fc->buff_index].actual_size = 0; - - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - ++(fc->buff_index); - if (fc->buff_index >= EVRC_FC_BUFF_CNT) - fc->buff_index = 0; - } - res = buf - start; - -fail: - mutex_unlock(&evrc->lock); - - return res; -} - -static int q6_evrc_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct evrc *evrc = file->private_data; - int i = 0; - struct evrc_fc *fc; - - mutex_lock(&evrc->lock); - fc = evrc->evrc_fc; - kthread_stop(fc->task); - fc->task = NULL; - /*free flow control buffers*/ - for (i = 0; i < EVRC_FC_BUFF_CNT; ++i) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - kfree(fc); - if (evrc->audio_client) - rc = q6audio_close(evrc->audio_client); - mutex_unlock(&evrc->lock); - kfree(evrc); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return rc; -} - -static const struct file_operations q6_evrc_in_fops = { - .owner = THIS_MODULE, - .open = q6_evrc_in_open, - .read = q6_evrc_in_read, - .release = q6_evrc_in_release, - .unlocked_ioctl = q6_evrc_in_ioctl, -}; - -struct miscdevice q6_evrc_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_evrc_in", - .fops = &q6_evrc_in_fops, -}; - -static int __init q6_evrc_in_init(void) -{ - return misc_register(&q6_evrc_in_misc); -} - -device_initcall(q6_evrc_in_init); diff --git a/arch/arm/mach-msm/qdsp6/mp3.c b/arch/arm/mach-msm/qdsp6/mp3.c deleted file mode 100644 index 16f6204febb7..000000000000 --- a/arch/arm/mach-msm/qdsp6/mp3.c +++ /dev/null @@ -1,249 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/mp3.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#define BUFSZ (8192) -#define DMASZ (BUFSZ * 2) - -struct mp3 { - struct mutex lock; - struct audio_client *ac; - uint32_t sample_rate; - uint32_t channel_count; -}; - -static long mp3_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct mp3 *mp3 = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void*) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&mp3->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: { - int vol; - pr_debug("[%s:%s] SET_VOLUME = %d\n", __MM_FILE__, - __func__, vol); - if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { - rc = -EFAULT; - break; - } - rc = q6audio_set_stream_volume(mp3->ac, vol); - break; - } - case AUDIO_START: { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { - pr_info("[%s:%s] copy acdb_id from user failed\n", - __MM_FILE__, __func__); - rc = -EFAULT; - break; - } - if (mp3->ac) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - } else { - mp3->ac = q6audio_open_mp3(BUFSZ, - mp3->sample_rate, mp3->channel_count, acdb_id); - if (!mp3->ac) { - pr_err("[%s:%s] mp3 open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (mp3->ac) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } - if (copy_from_user(&config, (void*) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_CONFIG: buffsize = %d, samplerate = %d, \ - channelcount = %d\n", __MM_FILE__, __func__, - config.buffer_size, config.sample_rate, - config.channel_count); - if (config.channel_count < 1 || config.channel_count > 2) { - rc = -EINVAL; - pr_err("[%s:%s] invalid channelcount\n", __MM_FILE__, - __func__); - break; - } - mp3->sample_rate = config.sample_rate; - mp3->channel_count = config.channel_count; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = BUFSZ; - config.buffer_count = 2; - config.sample_rate = mp3->sample_rate; - config.channel_count = mp3->channel_count; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void*) arg, &config, sizeof(config))) { - rc = -EFAULT; - } - pr_debug("[%s:%s] GET_CONFIG: buffsize = %d, samplerate = %d, \ - channelcount = %d\n", __MM_FILE__, __func__, - config.buffer_size, config.sample_rate, - config.channel_count); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&mp3->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int mp3_open(struct inode *inode, struct file *file) -{ - int rc = 0; - - struct mp3 *mp3; - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - mp3 = kzalloc(sizeof(struct mp3), GFP_KERNEL); - - if (!mp3) - return -ENOMEM; - - mutex_init(&mp3->lock); - mp3->channel_count = 2; - mp3->sample_rate = 44100; - - file->private_data = mp3; - return rc; -} - -static ssize_t mp3_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct mp3 *mp3 = file->private_data; - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - int xfer; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - if (!mp3->ac) - mp3_ioctl(file, AUDIO_START, 0); - - ac = mp3->ac; - if (!ac) - return -ENODEV; - - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - pr_debug("[%s:%s] ab->data = %p, ac->cpu_buf = %d\n", - __MM_FILE__, __func__, ab->data, ac->cpu_buf); - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_from_user(ab->data, buf, xfer)) - return -EFAULT; - - buf += xfer; - count -= xfer; - - ab->used = xfer; - q6audio_write(ac, ab); - ac->cpu_buf ^= 1; - } - - return buf - start; -} - -static int mp3_fsync(struct file *f, int datasync) -{ - struct mp3 *mp3 = f->private_data; - if (mp3->ac) - return q6audio_async(mp3->ac); - return -ENODEV; -} - -static int mp3_release(struct inode *inode, struct file *file) -{ - struct mp3 *mp3 = file->private_data; - if (mp3->ac) - q6audio_mp3_close(mp3->ac); - kfree(mp3); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return 0; -} - -static struct file_operations mp3_fops = { - .owner = THIS_MODULE, - .open = mp3_open, - .write = mp3_write, - .fsync = mp3_fsync, - .release = mp3_release, - .unlocked_ioctl = mp3_ioctl, -}; - -struct miscdevice mp3_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_mp3", - .fops = &mp3_fops, -}; - -static int __init mp3_init(void) { - return misc_register(&mp3_misc); -} - -device_initcall(mp3_init); diff --git a/arch/arm/mach-msm/qdsp6/msm_q6vdec.c b/arch/arm/mach-msm/qdsp6/msm_q6vdec.c deleted file mode 100644 index 1cb9775cc803..000000000000 --- a/arch/arm/mach-msm/qdsp6/msm_q6vdec.c +++ /dev/null @@ -1,1509 +0,0 @@ -/* Copyright (c) 2008-2010, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* -#define DEBUG_TRACE_VDEC -#define DEBUG -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include "dal.h" - -#define DALDEVICEID_VDEC_DEVICE 0x02000026 -#define DALDEVICEID_VDEC_PORTNAME "DAL_AQ_VID" - -#define VDEC_INTERFACE_VERSION 0x00020000 - -#define MAJOR_MASK 0xFFFF0000 -#define MINOR_MASK 0x0000FFFF - -#define VDEC_GET_MAJOR_VERSION(version) (((version)&MAJOR_MASK)>>16) - -#define VDEC_GET_MINOR_VERSION(version) ((version)&MINOR_MASK) - -#ifdef DEBUG_TRACE_VDEC -#define TRACE(fmt,x...) \ - do { pr_debug("%s:%d " fmt, __func__, __LINE__, ##x); } while (0) -#else -#define TRACE(fmt,x...) do { } while (0) -#endif - -#define YAMATO_COLOR_FORMAT 0x02 -#define MAX_Q6_LOAD ((720*1280)/256) /* 720p */ -#define MAX_Q6_LOAD_YAMATO ((736*1280)/256) -#define MAX_Q6_LOAD_VP6 ((800*480)/256) - -#define VDEC_MAX_PORTS 4 - -/* - *why magic number 300? - - *the Maximum size of the DAL payload is 512 bytes according to DAL protocol - *Initialize call to QDSP6 from scorpion need to send sequence header as part of - *the DAL payload. DAL payload to initialize contains the following - - *1) configuration data- 52 bytes 2) length field of config data - 4 bytes - *3) sequence header data ( that is from the bit stream) - *4) length field for sequence header - 4 bytes - *5) length field for output structure - 4 bytes - - *that left with 512 - 68 = 448 bytes. It is unusual that we get a sequence - *header with such a big length unless the bit stream has multiple sequence - *headers.We estimated 300 is good enough which gives enough room for rest - *of the payload and even reserves some space for future payload. - */ - -#define VDEC_MAX_SEQ_HEADER_SIZE 300 - -char *Q6Portnames[] = { -"DAL_AQ_VID_0", -"DAL_AQ_VID_1", -"DAL_AQ_VID_2", -"DAL_AQ_VID_3" -}; - - - -#define DALDEVICEID_VDEC_DEVICE_0 0x020000D2 -#define DALDEVICEID_VDEC_DEVICE_1 0x020000D3 -#define DALDEVICEID_VDEC_DEVICE_2 0x020000D4 -#define DALDEVICEID_VDEC_DEVICE_3 0x020000D5 -#define DALDEVICEID_VDEC_DEVICE_4 0x020000D6 -#define DALDEVICEID_VDEC_DEVICE_5 0x020000D7 -#define DALDEVICEID_VDEC_DEVICE_6 0x020000D8 -#define DALDEVICEID_VDEC_DEVICE_7 0x020000D9 -#define DALDEVICEID_VDEC_DEVICE_8 0x020000DA -#define DALDEVICEID_VDEC_DEVICE_9 0x020000DB -#define DALDEVICEID_VDEC_DEVICE_10 0x020000DC -#define DALDEVICEID_VDEC_DEVICE_11 0x020000DD -#define DALDEVICEID_VDEC_DEVICE_12 0x020000DE -#define DALDEVICEID_VDEC_DEVICE_13 0x020000DF -#define DALDEVICEID_VDEC_DEVICE_14 0x020000E0 -#define DALDEVICEID_VDEC_DEVICE_15 0x020000E1 -#define DALDEVICEID_VDEC_DEVICE_16 0x020000E2 -#define DALDEVICEID_VDEC_DEVICE_17 0x020000E3 -#define DALDEVICEID_VDEC_DEVICE_18 0x020000E4 -#define DALDEVICEID_VDEC_DEVICE_19 0x020000E5 -#define DALDEVICEID_VDEC_DEVICE_20 0x020000E6 -#define DALDEVICEID_VDEC_DEVICE_21 0x020000E7 -#define DALDEVICEID_VDEC_DEVICE_22 0x020000E8 -#define DALDEVICEID_VDEC_DEVICE_23 0x020000E9 -#define DALDEVICEID_VDEC_DEVICE_24 0x020000EA -#define DALDEVICEID_VDEC_DEVICE_25 0x020000EB -#define DALDEVICEID_VDEC_DEVICE_26 0x020000EC -#define DALDEVICEID_VDEC_DEVICE_27 0x020000ED -#define DALDEVICEID_VDEC_DEVICE_28 0x020000EE -#define DALDEVICEID_VDEC_DEVICE_29 0x020000EF -#define DALDEVICEID_VDEC_DEVICE_30 0x020000F0 -#define DALDEVICEID_VDEC_DEVICE_31 0x020000F1 - -#define DALVDEC_MAX_DEVICE_IDS 32 - - -static int numOfPorts; - - -static char loadOnPorts[VDEC_MAX_PORTS]; - -static char deviceIdRegistry[DALVDEC_MAX_DEVICE_IDS]; - - -#define VDEC_DEVID_FREE 0 -#define VDEC_DEVID_OCCUPIED 1 - -#define MAX_SUPPORTED_INSTANCES 6 - -#define MAKEFOURCC(ch0, ch1, ch2, ch3) ((unsigned int)(unsigned char)(ch0) | \ - ((unsigned int)(unsigned char)(ch1) << 8) | \ - ((unsigned int)(unsigned char)(ch2) << 16) | \ - ((unsigned int)(unsigned char)(ch3) << 24)) - -#define FOURCC_MPEG4 MAKEFOURCC('m', 'p', '4', 'v') -#define FOURCC_H263 MAKEFOURCC('h', '2', '6', '3') -#define FOURCC_H264 MAKEFOURCC('h', '2', '6', '4') -#define FOURCC_VC1 MAKEFOURCC('w', 'm', 'v', '3') -#define FOURCC_DIVX MAKEFOURCC('D', 'I', 'V', 'X') -#define FOURCC_SPARK MAKEFOURCC('F', 'L', 'V', '1') -#define FOURCC_VP6 MAKEFOURCC('V', 'P', '6', '0') - -/* static struct vdec_data *multiInstances[MAX_SUPPORTED_INSTANCES];*/ - -static int totalPlaybackQ6load; -static int totalTnailQ6load; - -#define FLAG_THUMBNAIL_MODE 0x8 -#define MAX_TNAILS 3 - -#define TRUE 1 -#define FALSE 0 - -enum { - VDEC_DALRPC_INITIALIZE = DAL_OP_FIRST_DEVICE_API, - VDEC_DALRPC_SETBUFFERS, - VDEC_DALRPC_FREEBUFFERS, - VDEC_DALRPC_QUEUE, - VDEC_DALRPC_SIGEOFSTREAM, - VDEC_DALRPC_FLUSH, - VDEC_DALRPC_REUSEFRAMEBUFFER, - VDEC_DALRPC_GETDECATTRIBUTES, - VDEC_DALRPC_SUSPEND, - VDEC_DALRPC_RESUME, - VDEC_DALRPC_INITIALIZE_00, - VDEC_DALRPC_GETINTERNALBUFFERREQ, - VDEC_DALRPC_SETBUFFERS_00, - VDEC_DALRPC_FREEBUFFERS_00, - VDEC_DALRPC_GETPROPERTY, - VDEC_DALRPC_SETPROPERTY, - VDEC_DALRPC_GETDECATTRIBUTES_00, - VDEC_DALRPC_PERFORMANCE_CHANGE_REQUEST -}; - -enum { - VDEC_ASYNCMSG_DECODE_DONE = 0xdec0de00, - VDEC_ASYNCMSG_REUSE_FRAME, -}; - -struct vdec_init_cfg { - u32 decode_done_evt; - u32 reuse_frame_evt; - struct vdec_config cfg; -}; - -struct vdec_buffer_status { - u32 data; - u32 status; -}; - -#define VDEC_MSG_MAX 128 - -struct vdec_msg_list { - struct list_head list; - struct vdec_msg vdec_msg; -}; - -struct vdec_mem_info { - u32 buf_type; - u32 id; - unsigned long phys_addr; - unsigned long len; - struct file *file; -}; - -struct vdec_mem_list { - struct list_head list; - struct vdec_mem_info mem; -}; - -struct videoStreamDetails{ - int height; - int width; - unsigned int fourcc; - int Q6usage; - bool isThisTnail; - bool isTnailGranted; -}; - -struct vdec_data { - struct dal_client *vdec_handle; - unsigned int Q6deviceId; - struct videoStreamDetails streamDetails; - struct list_head vdec_msg_list_head; - struct list_head vdec_msg_list_free; - wait_queue_head_t vdec_msg_evt; - spinlock_t vdec_list_lock; - struct list_head vdec_mem_list_head; - spinlock_t vdec_mem_list_lock; - int mem_initialized; - int running; - int close_decode; -}; - -static struct class *driver_class; -static dev_t vdec_device_no; -static struct cdev vdec_cdev; -static int ref_cnt; -static DEFINE_MUTEX(vdec_ref_lock); - -static DEFINE_MUTEX(idlecount_lock); - -static DEFINE_MUTEX(vdec_rm_lock); - -static int idlecount; -static struct wake_lock wakelock; -static struct pm_qos_request pm_qos_req; - -static void prevent_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (++idlecount == 1) { - pm_qos_update_request(&pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - wake_lock(&wakelock); - } - mutex_unlock(&idlecount_lock); -} - -static void allow_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (--idlecount == 0) { - wake_unlock(&wakelock); - pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE); - } - mutex_unlock(&idlecount_lock); -} - -static inline int vdec_check_version(u32 client, u32 server) -{ - int ret = -EINVAL; - if ((VDEC_GET_MAJOR_VERSION(client) == VDEC_GET_MAJOR_VERSION(server)) - && (VDEC_GET_MINOR_VERSION(client) <= - VDEC_GET_MINOR_VERSION(server))) - ret = 0; - return ret; -} - -static int vdec_get_msg(struct vdec_data *vd, void *msg) -{ - struct vdec_msg_list *l; - unsigned long flags; - int ret = 0; - - if (!vd->running) - return -EPERM; - - spin_lock_irqsave(&vd->vdec_list_lock, flags); - list_for_each_entry_reverse(l, &vd->vdec_msg_list_head, list) { - if (copy_to_user(msg, &l->vdec_msg, sizeof(struct vdec_msg))) - pr_err("vdec_get_msg failed to copy_to_user!\n"); - if (l->vdec_msg.id == VDEC_MSG_REUSEINPUTBUFFER) - TRACE("reuse_input_buffer %d\n", l->vdec_msg.buf_id); - else if (l->vdec_msg.id == VDEC_MSG_FRAMEDONE) - TRACE("frame_done (stat=%d)\n", - l->vdec_msg.vfr_info.status); - else - TRACE("unknown msg (msgid=%d)\n", l->vdec_msg.id); - list_del(&l->list); - list_add(&l->list, &vd->vdec_msg_list_free); - ret = 1; - break; - } - spin_unlock_irqrestore(&vd->vdec_list_lock, flags); - - if (vd->close_decode) - ret = 1; - - return ret; -} - -static void vdec_put_msg(struct vdec_data *vd, struct vdec_msg *msg) -{ - struct vdec_msg_list *l; - unsigned long flags; - int found = 0; - - spin_lock_irqsave(&vd->vdec_list_lock, flags); - list_for_each_entry(l, &vd->vdec_msg_list_free, list) { - memcpy(&l->vdec_msg, msg, sizeof(struct vdec_msg)); - list_del(&l->list); - list_add(&l->list, &vd->vdec_msg_list_head); - found = 1; - break; - } - spin_unlock_irqrestore(&vd->vdec_list_lock, flags); - - if (found) - wake_up(&vd->vdec_msg_evt); - else - pr_err("vdec_put_msg can't find free list!\n"); -} - -static struct vdec_mem_list *vdec_get_mem_from_list(struct vdec_data *vd, - u32 pmem_id, u32 buf_type) -{ - struct vdec_mem_list *l; - unsigned long flags; - int found = 0; - - spin_lock_irqsave(&vd->vdec_mem_list_lock, flags); - list_for_each_entry(l, &vd->vdec_mem_list_head, list) { - if (l->mem.buf_type == buf_type && l->mem.id == pmem_id) { - found = 1; - break; - } - } - spin_unlock_irqrestore(&vd->vdec_mem_list_lock, flags); - - if (found) - return l; - else - return NULL; - -} -static int vdec_setproperty(struct vdec_data *vd, void *argp) -{ - struct vdec_property_info property; - int res; - - if (copy_from_user(&property, argp, sizeof(struct vdec_property_info))) - return -1; - - res = dal_call_f6(vd->vdec_handle, VDEC_DALRPC_SETPROPERTY, - property.id, &(property.property), sizeof(union vdec_property)); - if (res) - TRACE("Set Property failed"); - else - TRACE("Set Property succeeded"); - return res; -} -static int vdec_getproperty(struct vdec_data *vd, void *argp) -{ - int res; - union vdec_property property = {0}; - - res = dal_call_f11(vd->vdec_handle, VDEC_DALRPC_GETPROPERTY, - ((struct vdec_property_info *)argp)->id, &property, - sizeof(union vdec_property)); - - if (res) - TRACE("get Property failed"); - else - TRACE("get Property succeeded"); - - res = copy_to_user( - (&((struct vdec_property_info *)argp)->property), - &property, sizeof(property)); - - return res; -} -static int vdec_performance_change_request(struct vdec_data *vd, void* argp) -{ - u32 request_type; - int ret; - - ret = copy_from_user(&request_type, argp, sizeof(request_type)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - ret = dal_call_f0(vd->vdec_handle, - VDEC_DALRPC_PERFORMANCE_CHANGE_REQUEST, - request_type); - if (ret) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - return ret; - } - return ret; -} - -#ifdef TRACE_PORTS -static void printportsanddeviceids(void) -{ - int i; - - pr_err("\n\n%s:loadOnPorts", __func__); - for (i = 0; i < numOfPorts; i++) - pr_err("\t%d", loadOnPorts[i]); - - pr_err("\n\n"); - - pr_err("\n\n%s:Devids", __func__); - for (i = 0; i < DALVDEC_MAX_DEVICE_IDS; i++) - pr_err("Devid[%d]:%d\n", i, deviceIdRegistry[i]); - - - pr_err("\n\n"); -} -#endif /*TRACE_PORTS*/ - - -/* - * - * This method is used to get the number of ports supported on the Q6 - * - */ -static int vdec_get_numberofq6ports(void) -{ - struct dal_client *vdec_handle = NULL; - int retval = 0; - union vdec_property property = {0}; - - vdec_handle = dal_attach(DALDEVICEID_VDEC_DEVICE, - DALDEVICEID_VDEC_PORTNAME, 1, NULL, NULL); - if (!vdec_handle) { - pr_err("%s: failed to attach\n", __func__); - return 1;/* default setting */ - } - - retval = dal_call_f6(vdec_handle, VDEC_DALRPC_GETPROPERTY, - VDEC_NUM_DAL_PORTS, (void *)&property, sizeof(union vdec_property)); - if (retval) { - pr_err("%s: Q6get prperty failed\n", __func__); - return 1;/* default setting */ - } - - dal_detach(vdec_handle); - return property.num_dal_ports ; -} - - -/** - * This method is used to get the find the least loaded port and a corresponding - * free device id in that port. - * - * Prerequisite: vdec_open should have been called. - * - * @param[in] deviceid - * device id will be populated here. - * - * @param[in] portname - * portname will be populated here. - */ -static void vdec_get_next_portanddevid(int *deviceid, char **portname) -{ - - int i = 0; - int leastLoad = 0; - int leastLoadedIndex = 0; - - if (0 == numOfPorts) { - numOfPorts = vdec_get_numberofq6ports(); - pr_err("%s: Q6get numOfPorts %d\n", __func__, numOfPorts); - numOfPorts = 4; - /*fix: me currently hard coded to 4 as - *the Q6 getproperty is failing - */ - } - - if ((NULL == deviceid) || (NULL == portname)) - return; - else - *deviceid = 0; /* init value */ - - if (numOfPorts > 1) { - /* multi ports mode*/ - - /* find the least loaded port*/ - for (i = 1, leastLoad = loadOnPorts[0], leastLoadedIndex = 0; - i < numOfPorts; i++) { - if (leastLoad > loadOnPorts[i]) { - leastLoadedIndex = i; - leastLoad = loadOnPorts[i]; - } - } - - /* register the load */ - loadOnPorts[leastLoadedIndex]++; - *portname = Q6Portnames[leastLoadedIndex]; - - /* find a free device id corresponding to the port*/ - for (i = leastLoadedIndex; i < DALVDEC_MAX_DEVICE_IDS; - i += numOfPorts) { - if (VDEC_DEVID_FREE == deviceIdRegistry[i]) { - deviceIdRegistry[i] = VDEC_DEVID_OCCUPIED; - *deviceid = DALDEVICEID_VDEC_DEVICE_0 + i; - break; - } - } - -#ifdef TRACE_PORTS - printportsanddeviceids(); -#endif /*TRACE_PORTS*/ - } else if (1 == numOfPorts) { - /* single port mode */ - *deviceid = DALDEVICEID_VDEC_DEVICE; - *portname = DALDEVICEID_VDEC_PORTNAME; - } else if (numOfPorts <= 0) { - pr_err("%s: FATAL error numOfPorts cannot be \ - less than or equal to zero\n", __func__); - } - - -} - - -/** - * This method frees up the used dev id and decrements the port load. - * - */ - -static void vdec_freeup_portanddevid(int deviceid) -{ - - if (numOfPorts > 1) { - /* multi ports mode*/ - if (VDEC_DEVID_FREE == - deviceIdRegistry[deviceid - DALDEVICEID_VDEC_DEVICE_0]) - pr_err("device id cannot be already free\n"); - deviceIdRegistry[deviceid - DALDEVICEID_VDEC_DEVICE_0] = - VDEC_DEVID_FREE; - - loadOnPorts[(deviceid - DALDEVICEID_VDEC_DEVICE_0) - % numOfPorts]--; - - if (loadOnPorts[(deviceid - DALDEVICEID_VDEC_DEVICE_0) - % numOfPorts] < 0) - pr_err("Warning:load cannot be negative\n"); - - pr_err("dettaching on deviceid %x portname %s\n", deviceid, - Q6Portnames[(deviceid - DALDEVICEID_VDEC_DEVICE_0) - % numOfPorts]); - -#ifdef TRACE_PORTS - printportsanddeviceids(); -#endif /*TRACE_PORTS*/ - } else { - /*single port mode, nothing to be done here*/ - } - -} - - -/** - * This method validates whether a new instance can be houred or not. - * - */ -static int vdec_rm_checkWithRm(struct vdec_data *vdecInstance, - unsigned int color_format) -{ - - unsigned int maxQ6load = 0;/* in the units of macro blocks per second */ - unsigned int currentq6load = 0; - struct videoStreamDetails *streamDetails = &vdecInstance->streamDetails; - - - - if (streamDetails->isThisTnail) { - if (totalTnailQ6load < MAX_TNAILS) { - - totalTnailQ6load++; - streamDetails->isTnailGranted = TRUE; - pr_info("%s: thumbnail granted %d\n", __func__, - totalTnailQ6load); - return 0; - - } else { - - pr_err("%s: thumbnails load max this instance cannot \ - be supported\n", __func__); - streamDetails->isTnailGranted = FALSE; - return -ENOSPC; - - } - } - - /* calculate the Q6 percentage instance would need */ - if ((streamDetails->fourcc == FOURCC_MPEG4) || - (streamDetails->fourcc == FOURCC_H264) || - (streamDetails->fourcc == FOURCC_DIVX) || - (streamDetails->fourcc == FOURCC_VC1) || - (streamDetails->fourcc == FOURCC_SPARK) || - (streamDetails->fourcc == FOURCC_H263) - ){ - - /* is yamato color format, - Rounds the H & W --> mutiple of 32 */ - if (color_format == YAMATO_COLOR_FORMAT) - maxQ6load = MAX_Q6_LOAD_YAMATO; - else - maxQ6load = MAX_Q6_LOAD; /* 720p */ - - } else if (streamDetails->fourcc == FOURCC_VP6) { - - maxQ6load = MAX_Q6_LOAD_VP6; /* FWVGA */ - - } else { - - pr_err("%s: unknown fourcc %d maxQ6load %u\n", __func__, - streamDetails->fourcc, maxQ6load); - return -EINVAL; - - } - - currentq6load = ((streamDetails->height)*(streamDetails->width) / 256); - currentq6load = ((currentq6load * 100)/maxQ6load); - if ((currentq6load+totalPlaybackQ6load) > 100) { - /* reject this instance */ - pr_err("%s: too much Q6load [cur+tot] = [%d + %d] = %d", - __func__, currentq6load, totalPlaybackQ6load, - (currentq6load+totalPlaybackQ6load)); - pr_err("rejecting the instance,[WxH] = [%d x %d],color_fmt=0x%x\n", - streamDetails->width, streamDetails->height, color_format); - pr_err("VDEC_fmt=%s\n", (char *)(&streamDetails->fourcc)); - streamDetails->Q6usage = 0; - return -ENOSPC; - } - - totalPlaybackQ6load += currentq6load; - streamDetails->Q6usage = currentq6load; - - pr_info("%s: adding a load [%d%%] bringing total Q6load to [%d%%]\n", - __func__, currentq6load, totalPlaybackQ6load); - - return 0; -} - - -static int vdec_initialize(struct vdec_data *vd, void *argp) -{ - struct vdec_config_sps vdec_cfg_sps; - struct vdec_init_cfg vi_cfg; - struct vdec_buf_req vdec_buf_req; - struct u8 *header; - int ret = 0; - - ret = copy_from_user(&vdec_cfg_sps, - &((struct vdec_init *)argp)->sps_cfg, - sizeof(vdec_cfg_sps)); - - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - vi_cfg.decode_done_evt = VDEC_ASYNCMSG_DECODE_DONE; - vi_cfg.reuse_frame_evt = VDEC_ASYNCMSG_REUSE_FRAME; - memcpy(&vi_cfg.cfg, &vdec_cfg_sps.cfg, sizeof(struct vdec_config)); - - /* - * restricting the max value of the seq header - */ - if (vdec_cfg_sps.seq.len > VDEC_MAX_SEQ_HEADER_SIZE) - vdec_cfg_sps.seq.len = VDEC_MAX_SEQ_HEADER_SIZE; - - header = kmalloc(vdec_cfg_sps.seq.len, GFP_KERNEL); - if (!header) { - pr_err("%s: kmalloc failed\n", __func__); - return -ENOMEM; - } - - ret = copy_from_user(header, - ((struct vdec_init *)argp)->sps_cfg.seq.header, - vdec_cfg_sps.seq.len); - - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - kfree(header); - return ret; - } - - TRACE("vi_cfg: handle=%p fourcc=0x%x w=%d h=%d order=%d notify_en=%d " - "vc1_rb=%d h264_sd=%d h264_nls=%d pp_flag=%d fruc_en=%d\n", - vd->vdec_handle, vi_cfg.cfg.fourcc, vi_cfg.cfg.width, - vi_cfg.cfg.height, vi_cfg.cfg.order, vi_cfg.cfg.notify_enable, - vi_cfg.cfg.vc1_rowbase, vi_cfg.cfg.h264_startcode_detect, - vi_cfg.cfg.h264_nal_len_size, vi_cfg.cfg.postproc_flag, - vi_cfg.cfg.fruc_enable); - - vd->streamDetails.height = vi_cfg.cfg.height; - vd->streamDetails.width = vi_cfg.cfg.width; - vd->streamDetails.fourcc = vi_cfg.cfg.fourcc; - if (FLAG_THUMBNAIL_MODE == vi_cfg.cfg.postproc_flag) - vd->streamDetails.isThisTnail = TRUE; - else - vd->streamDetails.isThisTnail = FALSE; - - mutex_lock(&vdec_rm_lock); - ret = vdec_rm_checkWithRm(vd, vi_cfg.cfg.color_format); - mutex_unlock(&vdec_rm_lock); - if (ret) - return ret; - - ret = dal_call_f13(vd->vdec_handle, VDEC_DALRPC_INITIALIZE, - &vi_cfg, sizeof(vi_cfg), - header, vdec_cfg_sps.seq.len, - &vdec_buf_req, sizeof(vdec_buf_req)); - - kfree(header); - - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, ret); - else - ret = copy_to_user(((struct vdec_init *)argp)->buf_req, - &vdec_buf_req, sizeof(vdec_buf_req)); - - vd->close_decode = 0; - return ret; -} - -static void vdec_rm_freeupResources(struct vdec_data *vdecInstance) -{ - struct videoStreamDetails *streamDetails = &vdecInstance->streamDetails; - - - - if ((streamDetails->isThisTnail) && - (streamDetails->isTnailGranted)) { - - totalTnailQ6load--; - pr_info("%s: Thumbnail released %d\n", __func__, - totalTnailQ6load); - - } else if (streamDetails->Q6usage > 0) { - - totalPlaybackQ6load -= streamDetails->Q6usage; - if (totalPlaybackQ6load < 0) - pr_err("Warning:Q6load cannot be negative\n"); - - pr_info("%s:Releasing [%d%%] of Q6load from a total of [%d%%]\n" - , __func__, streamDetails->Q6usage, - (streamDetails->Q6usage+totalPlaybackQ6load)); - } - -} - -static int vdec_setbuffers(struct vdec_data *vd, void *argp) -{ - struct vdec_buffer vmem; - struct vdec_mem_list *l; - unsigned long vstart; - unsigned long flags; - struct { - uint32_t size; - struct vdec_buf_info buf; - } rpc; - uint32_t res; - - int ret = 0; - - vd->mem_initialized = 0; - - ret = copy_from_user(&vmem, argp, sizeof(vmem)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - l = kzalloc(sizeof(struct vdec_mem_list), GFP_KERNEL); - if (!l) { - pr_err("%s: kzalloc failed!\n", __func__); - return -ENOMEM; - } - - l->mem.id = vmem.pmem_id; - l->mem.buf_type = vmem.buf.buf_type; - - ret = get_pmem_file(l->mem.id, &l->mem.phys_addr, &vstart, - &l->mem.len, &l->mem.file); - if (ret) { - pr_err("%s: get_pmem_fd failed\n", __func__); - goto err_get_pmem_file; - } - - TRACE("pmem_id=%d (phys=0x%08lx len=0x%lx) buftype=%d num_buf=%d " - "islast=%d src_id=%d offset=0x%08x size=0x%x\n", - vmem.pmem_id, l->mem.phys_addr, l->mem.len, - vmem.buf.buf_type, vmem.buf.num_buf, vmem.buf.islast, - vmem.buf.region.src_id, vmem.buf.region.offset, - vmem.buf.region.size); - - /* input buffers */ - if ((vmem.buf.region.offset + vmem.buf.region.size) > l->mem.len) { - pr_err("%s: invalid input buffer offset!\n", __func__); - ret = -EINVAL; - goto err_bad_offset; - - } - vmem.buf.region.offset += l->mem.phys_addr; - - rpc.size = sizeof(vmem.buf); - memcpy(&rpc.buf, &vmem.buf, sizeof(struct vdec_buf_info)); - - - ret = dal_call(vd->vdec_handle, VDEC_DALRPC_SETBUFFERS, 5, - &rpc, sizeof(rpc), &res, sizeof(res)); - - if (ret < 4) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - ret = -EIO; - goto err_dal_call; - } - - spin_lock_irqsave(&vd->vdec_mem_list_lock, flags); - list_add(&l->list, &vd->vdec_mem_list_head); - spin_unlock_irqrestore(&vd->vdec_mem_list_lock, flags); - - vd->mem_initialized = 1; - return ret; - -err_dal_call: -err_bad_offset: - put_pmem_file(l->mem.file); -err_get_pmem_file: - kfree(l); - return ret; -} - -static int vdec_queue(struct vdec_data *vd, void *argp) -{ - struct { - uint32_t size; - struct vdec_input_buf_info buf_info; - uint32_t osize; - } rpc; - struct vdec_mem_list *l; - struct { - uint32_t result; - uint32_t size; - struct vdec_queue_status status; - } rpc_res; - - u32 pmem_id; - int ret = 0; - - if (!vd->mem_initialized) { - pr_err("%s: memory is not being initialized!\n", __func__); - return -EPERM; - } - - ret = copy_from_user(&rpc.buf_info, - &((struct vdec_input_buf *)argp)->buffer, - sizeof(rpc.buf_info)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - ret = copy_from_user(&pmem_id, - &((struct vdec_input_buf *)argp)->pmem_id, - sizeof(u32)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - l = vdec_get_mem_from_list(vd, pmem_id, VDEC_BUFFER_TYPE_INPUT); - - if (NULL == l) { - pr_err("%s: not able to find the buffer from list\n", __func__); - return -EPERM; - } - - if ((rpc.buf_info.size + rpc.buf_info.offset) >= l->mem.len) { - pr_err("%s: invalid queue buffer offset!\n", __func__); - return -EINVAL; - } - - rpc.buf_info.offset += l->mem.phys_addr; - rpc.size = sizeof(struct vdec_input_buf_info); - rpc.osize = sizeof(struct vdec_queue_status); - - /* complete the writes to the buffer */ - wmb(); - ret = dal_call(vd->vdec_handle, VDEC_DALRPC_QUEUE, 8, - &rpc, sizeof(rpc), &rpc_res, sizeof(rpc_res)); - if (ret < 4) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - ret = -EIO; - } - return ret; -} - -static int vdec_reuse_framebuffer(struct vdec_data *vd, void *argp) -{ - u32 buf_id; - int ret = 0; - - ret = copy_from_user(&buf_id, argp, sizeof(buf_id)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - ret = dal_call_f0(vd->vdec_handle, VDEC_DALRPC_REUSEFRAMEBUFFER, - buf_id); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, ret); - - return ret; -} - -static int vdec_flush(struct vdec_data *vd, void *argp) -{ - u32 flush_type; - int ret = 0; - - if (!vd->mem_initialized) { - pr_err("%s: memory is not being initialized!\n", __func__); - return -EPERM; - } - - ret = copy_from_user(&flush_type, argp, sizeof(flush_type)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - TRACE("flush_type=%d\n", flush_type); - ret = dal_call_f0(vd->vdec_handle, VDEC_DALRPC_FLUSH, flush_type); - if (ret) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - return ret; - } - - return ret; -} - -static int vdec_close(struct vdec_data *vd, void *argp) -{ - struct vdec_mem_list *l; - int ret = 0; - - pr_info("q6vdec_close()\n"); - vd->close_decode = 1; - wake_up(&vd->vdec_msg_evt); - - ret = dal_call_f0(vd->vdec_handle, DAL_OP_CLOSE, 0); - if (ret) - pr_err("%s: failed to close daldevice (%d)\n", __func__, ret); - - if (vd->mem_initialized) { - list_for_each_entry(l, &vd->vdec_mem_list_head, list) - put_pmem_file(l->mem.file); - } - - return ret; -} -static int vdec_getdecattributes(struct vdec_data *vd, void *argp) -{ - struct { - uint32_t status; - uint32_t size; - struct vdec_dec_attributes dec_attr; - } rpc; - uint32_t inp; - int ret = 0; - inp = sizeof(struct vdec_dec_attributes); - - ret = dal_call(vd->vdec_handle, VDEC_DALRPC_GETDECATTRIBUTES, 9, - &inp, sizeof(inp), &rpc, sizeof(rpc)); - if (ret < 4 || rpc.size != sizeof(struct vdec_dec_attributes)) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - ret = -EIO; - } else - ret = - copy_to_user(((struct vdec_dec_attributes *)argp), - &rpc.dec_attr, sizeof(rpc.dec_attr)); - return ret; -} - -static int vdec_freebuffers(struct vdec_data *vd, void *argp) -{ - struct vdec_buffer vmem; - struct vdec_mem_list *l; - struct { - uint32_t size; - struct vdec_buf_info buf; - } rpc; - uint32_t res; - - int ret = 0; - - if (!vd->mem_initialized) { - pr_err("%s: memory is not being initialized!\n", __func__); - return -EPERM; - } - - ret = copy_from_user(&vmem, argp, sizeof(vmem)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - l = vdec_get_mem_from_list(vd, vmem.pmem_id, vmem.buf.buf_type); - - if (NULL == l) { - pr_err("%s: not able to find the buffer from list\n", __func__); - return -EPERM; - } - - /* input buffers */ - if ((vmem.buf.region.offset + vmem.buf.region.size) > l->mem.len) { - pr_err("%s: invalid input buffer offset!\n", __func__); - return -EINVAL; - - } - vmem.buf.region.offset += l->mem.phys_addr; - - rpc.size = sizeof(vmem.buf); - memcpy(&rpc.buf, &vmem.buf, sizeof(struct vdec_buf_info)); - - ret = dal_call(vd->vdec_handle, VDEC_DALRPC_FREEBUFFERS, 5, - &rpc, sizeof(rpc), &res, sizeof(res)); - if (ret < 4) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - } - - return ret; -} - -static int vdec_getversion(struct vdec_data *vd, void *argp) -{ - struct vdec_version ver_info; - int ret = 0; - - ver_info.major = VDEC_GET_MAJOR_VERSION(VDEC_INTERFACE_VERSION); - ver_info.minor = VDEC_GET_MINOR_VERSION(VDEC_INTERFACE_VERSION); - - ret = copy_to_user(((struct vdec_version *)argp), - &ver_info, sizeof(ver_info)); - - return ret; - -} - -static long vdec_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct vdec_data *vd = file->private_data; - void __user *argp = (void __user *)arg; - int ret = 0; - - if (!vd->running) - return -EPERM; - - switch (cmd) { - case VDEC_IOCTL_INITIALIZE: - ret = vdec_initialize(vd, argp); - break; - - case VDEC_IOCTL_SETBUFFERS: - ret = vdec_setbuffers(vd, argp); - break; - - case VDEC_IOCTL_QUEUE: - TRACE("VDEC_IOCTL_QUEUE (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_queue(vd, argp); - break; - - case VDEC_IOCTL_REUSEFRAMEBUFFER: - TRACE("VDEC_IOCTL_REUSEFRAMEBUFFER (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_reuse_framebuffer(vd, argp); - break; - - case VDEC_IOCTL_FLUSH: - TRACE("IOCTL flush\n"); - ret = vdec_flush(vd, argp); - break; - - case VDEC_IOCTL_EOS: - TRACE("VDEC_IOCTL_EOS (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = dal_call_f0(vd->vdec_handle, VDEC_DALRPC_SIGEOFSTREAM, 0); - if (ret) - pr_err("%s: remote function failed (%d)\n", - __func__, ret); - break; - - case VDEC_IOCTL_GETMSG: - TRACE("VDEC_IOCTL_GETMSG (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - wait_event_interruptible(vd->vdec_msg_evt, - vdec_get_msg(vd, argp)); - - if (vd->close_decode) - ret = -EINTR; - else - /* order the reads from the buffer */ - rmb(); - break; - - case VDEC_IOCTL_CLOSE: - ret = vdec_close(vd, argp); - break; - - case VDEC_IOCTL_GETDECATTRIBUTES: - TRACE("VDEC_IOCTL_GETDECATTRIBUTES (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_getdecattributes(vd, argp); - - if (ret) - pr_err("%s: remote function failed (%d)\n", - __func__, ret); - break; - - case VDEC_IOCTL_FREEBUFFERS: - TRACE("VDEC_IOCTL_FREEBUFFERS (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_freebuffers(vd, argp); - - if (ret) - pr_err("%s: remote function failed (%d)\n", - __func__, ret); - break; - case VDEC_IOCTL_GETVERSION: - TRACE("VDEC_IOCTL_GETVERSION (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_getversion(vd, argp); - - if (ret) - pr_err("%s: remote function failed (%d)\n", - __func__, ret); - break; - case VDEC_IOCTL_GETPROPERTY: - TRACE("VDEC_IOCTL_GETPROPERTY (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_getproperty(vd, argp); - break; - case VDEC_IOCTL_SETPROPERTY: - TRACE("VDEC_IOCTL_SETPROPERTY (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - ret = vdec_setproperty(vd, argp); - break; - case VDEC_IOCTL_PERFORMANCE_CHANGE_REQ: - ret = vdec_performance_change_request(vd, argp); - break; - default: - pr_err("%s: invalid ioctl!\n", __func__); - ret = -EINVAL; - break; - } - - TRACE("ioctl done (pid=%d tid=%d)\n", - current->group_leader->pid, current->pid); - - return ret; -} - -static void vdec_dcdone_handler(struct vdec_data *vd, void *frame, - uint32_t frame_size) -{ - struct vdec_msg msg; - struct vdec_mem_list *l; - unsigned long flags; - int found = 0; - - if (frame_size < sizeof(struct vdec_frame_info)) { - pr_warning("%s: msg size mismatch %d != %d\n", __func__, - frame_size, sizeof(struct vdec_frame_info)); - return; - } - - memcpy(&msg.vfr_info, (struct vdec_frame_info *)frame, - sizeof(struct vdec_frame_info)); - - if (msg.vfr_info.status == VDEC_FRAME_DECODE_OK) { - spin_lock_irqsave(&vd->vdec_mem_list_lock, flags); - list_for_each_entry(l, &vd->vdec_mem_list_head, list) { - if ((l->mem.buf_type == VDEC_BUFFER_TYPE_OUTPUT) && - (msg.vfr_info.offset >= l->mem.phys_addr) && - (msg.vfr_info.offset < - (l->mem.phys_addr + l->mem.len))) { - found = 1; - msg.vfr_info.offset -= l->mem.phys_addr; - msg.vfr_info.data2 = l->mem.id; - break; - } - } - spin_unlock_irqrestore(&vd->vdec_mem_list_lock, flags); - } - - if (found || (msg.vfr_info.status != VDEC_FRAME_DECODE_OK)) { - msg.id = VDEC_MSG_FRAMEDONE; - vdec_put_msg(vd, &msg); - } else { - pr_err("%s: invalid phys addr = 0x%x\n", - __func__, msg.vfr_info.offset); - } - -} - -static void vdec_reuseibuf_handler(struct vdec_data *vd, void *bufstat, - uint32_t bufstat_size) -{ - struct vdec_buffer_status *vdec_bufstat; - struct vdec_msg msg; - - /* TODO: how do we signal the client? If they are waiting on a - * message in an ioctl, they may block forever */ - if (bufstat_size != sizeof(struct vdec_buffer_status)) { - pr_warning("%s: msg size mismatch %d != %d\n", __func__, - bufstat_size, sizeof(struct vdec_buffer_status)); - return; - } - vdec_bufstat = (struct vdec_buffer_status *)bufstat; - msg.id = VDEC_MSG_REUSEINPUTBUFFER; - msg.buf_id = vdec_bufstat->data; - vdec_put_msg(vd, &msg); -} - -static void callback(void *data, int len, void *cookie) -{ - struct vdec_data *vd = (struct vdec_data *)cookie; - uint32_t *tmp = (uint32_t *) data; - - if (!vd->mem_initialized) { - pr_err("%s:memory not initialize but callback called!\n", - __func__); - return; - } - - TRACE("vdec_async: tmp=0x%08x 0x%08x 0x%08x\n", tmp[0], tmp[1], tmp[2]); - switch (tmp[0]) { - case VDEC_ASYNCMSG_DECODE_DONE: - vdec_dcdone_handler(vd, &tmp[3], tmp[2]); - break; - case VDEC_ASYNCMSG_REUSE_FRAME: - vdec_reuseibuf_handler(vd, &tmp[3], tmp[2]); - break; - default: - pr_err("%s: Unknown async message from DSP id=0x%08x sz=%u\n", - __func__, tmp[0], tmp[2]); - } -} - -static int vdec_open(struct inode *inode, struct file *file) -{ - int ret; - int i; - struct vdec_msg_list *l; - struct vdec_data *vd; - struct dal_info version_info; - char *portname = NULL; - - pr_info("q6vdec_open()\n"); - mutex_lock(&vdec_ref_lock); - if (ref_cnt >= MAX_SUPPORTED_INSTANCES) { - pr_err("%s: Max allowed instances exceeded \n", __func__); - mutex_unlock(&vdec_ref_lock); - return -EBUSY; - } - ref_cnt++; - mutex_unlock(&vdec_ref_lock); - - vd = kmalloc(sizeof(struct vdec_data), GFP_KERNEL); - if (!vd) { - pr_err("%s: kmalloc failed\n", __func__); - ret = -ENOMEM; - goto vdec_open_err_handle_vd; - } - file->private_data = vd; - - vd->mem_initialized = 0; - INIT_LIST_HEAD(&vd->vdec_msg_list_head); - INIT_LIST_HEAD(&vd->vdec_msg_list_free); - INIT_LIST_HEAD(&vd->vdec_mem_list_head); - init_waitqueue_head(&vd->vdec_msg_evt); - - spin_lock_init(&vd->vdec_list_lock); - spin_lock_init(&vd->vdec_mem_list_lock); - for (i = 0; i < VDEC_MSG_MAX; i++) { - l = kzalloc(sizeof(struct vdec_msg_list), GFP_KERNEL); - if (!l) { - pr_err("%s: kzalloc failed!\n", __func__); - ret = -ENOMEM; - goto vdec_open_err_handle_list; - } - list_add(&l->list, &vd->vdec_msg_list_free); - } - - memset(&vd->streamDetails, 0, sizeof(struct videoStreamDetails)); - - mutex_lock(&vdec_ref_lock); - vdec_get_next_portanddevid(&vd->Q6deviceId, &portname); - mutex_unlock(&vdec_ref_lock); - - if ((0 == vd->Q6deviceId) || (NULL == portname)) { - pr_err("%s: FATAL error portname %s or deviceId %d not picked properly\n", - __func__, portname, vd->Q6deviceId); - ret = -EIO; - goto vdec_open_err_handle_list; - } else { - pr_err("attaching on deviceid %x portname %s\n", - vd->Q6deviceId, portname); - vd->vdec_handle = dal_attach(vd->Q6deviceId, - portname, 1, callback, vd); - } - - if (!vd->vdec_handle) { - pr_err("%s: failed to attach\n", __func__); - ret = -EIO; - goto vdec_open_err_handle_list; - } - ret = dal_call_f9(vd->vdec_handle, DAL_OP_INFO, - &version_info, sizeof(struct dal_info)); - - if (ret) { - pr_err("%s: failed to get version \n", __func__); - goto vdec_open_err_handle_version; - } - - TRACE("q6vdec_open() interface version 0x%x\n", version_info.version); - if (vdec_check_version(VDEC_INTERFACE_VERSION, - version_info.version)) { - pr_err("%s: driver version mismatch !\n", __func__); - goto vdec_open_err_handle_version; - } - - vd->running = 1; - prevent_sleep(); - - return 0; -vdec_open_err_handle_version: - dal_detach(vd->vdec_handle); -vdec_open_err_handle_list: - { - struct vdec_msg_list *l, *n; - list_for_each_entry_safe(l, n, &vd->vdec_msg_list_free, list) { - list_del(&l->list); - kfree(l); - } - } -vdec_open_err_handle_vd: - mutex_lock(&vdec_ref_lock); - vdec_freeup_portanddevid(vd->Q6deviceId); - ref_cnt--; - mutex_unlock(&vdec_ref_lock); - kfree(vd); - return ret; -} - -static int vdec_release(struct inode *inode, struct file *file) -{ - int ret; - struct vdec_msg_list *l, *n; - struct vdec_mem_list *m, *k; - struct vdec_data *vd = file->private_data; - - vd->running = 0; - wake_up_all(&vd->vdec_msg_evt); - - if (!vd->close_decode) - vdec_close(vd, NULL); - - ret = dal_detach(vd->vdec_handle); - if (ret) - printk(KERN_INFO "%s: failed to detach (%d)\n", __func__, ret); - - list_for_each_entry_safe(l, n, &vd->vdec_msg_list_free, list) { - list_del(&l->list); - kfree(l); - } - - list_for_each_entry_safe(l, n, &vd->vdec_msg_list_head, list) { - list_del(&l->list); - kfree(l); - } - - list_for_each_entry_safe(m, k, &vd->vdec_mem_list_head, list) { - list_del(&m->list); - kfree(m); - } - mutex_lock(&vdec_ref_lock); - BUG_ON(ref_cnt <= 0); - ref_cnt--; - vdec_freeup_portanddevid(vd->Q6deviceId); - mutex_unlock(&vdec_ref_lock); - - mutex_lock(&vdec_rm_lock); - vdec_rm_freeupResources(vd); - mutex_unlock(&vdec_rm_lock); - - - kfree(vd); - allow_sleep(); - return 0; -} - -static const struct file_operations vdec_fops = { - .owner = THIS_MODULE, - .open = vdec_open, - .release = vdec_release, - .unlocked_ioctl = vdec_ioctl, -}; - -static int __init vdec_init(void) -{ - struct device *class_dev; - int rc = 0; - - pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "vdec_suspend"); - - rc = alloc_chrdev_region(&vdec_device_no, 0, 1, "vdec"); - if (rc < 0) { - pr_err("%s: alloc_chrdev_region failed %d\n", __func__, rc); - return rc; - } - - driver_class = class_create(THIS_MODULE, "vdec"); - if (IS_ERR(driver_class)) { - rc = -ENOMEM; - pr_err("%s: class_create failed %d\n", __func__, rc); - goto vdec_init_err_unregister_chrdev_region; - } - class_dev = device_create(driver_class, NULL, - vdec_device_no, NULL, "vdec"); - if (!class_dev) { - pr_err("%s: class_device_create failed %d\n", __func__, rc); - rc = -ENOMEM; - goto vdec_init_err_class_destroy; - } - - cdev_init(&vdec_cdev, &vdec_fops); - vdec_cdev.owner = THIS_MODULE; - rc = cdev_add(&vdec_cdev, MKDEV(MAJOR(vdec_device_no), 0), 1); - - if (rc < 0) { - pr_err("%s: cdev_add failed %d\n", __func__, rc); - goto vdec_init_err_class_device_destroy; - } - - memset(&deviceIdRegistry, 0, sizeof(deviceIdRegistry)); - memset(&loadOnPorts, 0, sizeof(loadOnPorts)); - numOfPorts = 0; - - return 0; - -vdec_init_err_class_device_destroy: - device_destroy(driver_class, vdec_device_no); -vdec_init_err_class_destroy: - class_destroy(driver_class); -vdec_init_err_unregister_chrdev_region: - unregister_chrdev_region(vdec_device_no, 1); - return rc; -} - -static void __exit vdec_exit(void) -{ - device_destroy(driver_class, vdec_device_no); - class_destroy(driver_class); - unregister_chrdev_region(vdec_device_no, 1); -} - -MODULE_DESCRIPTION("video decoder driver for QSD platform"); -MODULE_VERSION("2.00"); - -module_init(vdec_init); -module_exit(vdec_exit); diff --git a/arch/arm/mach-msm/qdsp6/msm_q6venc.c b/arch/arm/mach-msm/qdsp6/msm_q6venc.c deleted file mode 100644 index a2b4b6e70049..000000000000 --- a/arch/arm/mach-msm/qdsp6/msm_q6venc.c +++ /dev/null @@ -1,1200 +0,0 @@ -/* Copyright (c) 2008-2009, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "dal.h" - -#define DALDEVICEID_VENC_DEVICE 0x0200002D -#define DALDEVICEID_VENC_PORTNAME "DAL_AQ_VID" - -#define VENC_NAME "q6venc" -#define VENC_MSG_MAX 128 - -#define VENC_INTERFACE_VERSION 0x00020000 -#define MAJOR_MASK 0xFFFF0000 -#define MINOR_MASK 0x0000FFFF -#define VENC_GET_MAJOR_VERSION(version) ((version & MAJOR_MASK)>>16) -#define VENC_GET_MINOR_VERSION(version) (version & MINOR_MASK) - -enum { - VENC_BUFFER_TYPE_INPUT, - VENC_BUFFER_TYPE_OUTPUT, - VENC_BUFFER_TYPE_QDSP6, - VENC_BUFFER_TYPE_HDR -}; -enum { - VENC_DALRPC_GET_SYNTAX_HEADER = DAL_OP_FIRST_DEVICE_API, - VENC_DALRPC_UPDATE_INTRA_REFRESH, - VENC_DALRPC_UPDATE_FRAME_RATE, - VENC_DALRPC_UPDATE_BITRATE, - VENC_DALRPC_UPDATE_QP_RANGE, - VENC_DALRPC_UPDATE_INTRA_PERIOD, - VENC_DALRPC_REQUEST_IFRAME, - VENC_DALRPC_START, - VENC_DALRPC_STOP, - VENC_DALRPC_SUSPEND, - VENC_DALRPC_RESUME, - VENC_DALRPC_FLUSH, - VENC_DALRPC_QUEUE_INPUT, - VENC_DALRPC_QUEUE_OUTPUT -}; -struct venc_input_payload { - u32 data; -}; -struct venc_output_payload { - u32 size; - long long time_stamp; - u32 flags; - u32 data; - u32 client_data_from_input; -}; -union venc_payload { - struct venc_input_payload input_payload; - struct venc_output_payload output_payload; -}; -struct venc_msg_type { - u32 event; - u32 status; - union venc_payload payload; -}; -struct venc_input_buf { - struct venc_buf_type yuv_buf; - u32 data_size; - long long time_stamp; - u32 flags; - u32 dvs_offsetx; - u32 dvs_offsety; - u32 client_data; - u32 op_client_data; -}; -struct venc_output_buf { - struct venc_buf_type bit_stream_buf; - u32 client_data; -}; - -struct venc_msg_list { - struct list_head list; - struct venc_msg msg_data; -}; -struct venc_buf { - int fd; - u32 src; - u32 offset; - u32 size; - u32 btype; - unsigned long paddr; - struct file *file; -}; -struct venc_pmem_list { - struct list_head list; - struct venc_buf buf; -}; -struct venc_dev { - bool is_active; - bool pmem_freed; - enum venc_state_type state; - struct list_head venc_msg_list_head; - struct list_head venc_msg_list_free; - spinlock_t venc_msg_list_lock; - struct list_head venc_pmem_list_head; - spinlock_t venc_pmem_list_lock; - struct dal_client *q6_handle; - wait_queue_head_t venc_msg_evt; - struct device *class_devp; -}; - -#define DEBUG_VENC 0 -#if DEBUG_VENC -#define TRACE(fmt, x...) \ - do { pr_debug("%s:%d " fmt, __func__, __LINE__, ##x); } while (0) -#else -#define TRACE(fmt, x...) do { } while (0) -#endif - -static struct cdev cdev; -static dev_t venc_dev_num; -static struct class *venc_class; -static struct venc_dev *venc_device_p; -static int venc_ref; - -static DEFINE_MUTEX(idlecount_lock); -static int idlecount; -static struct wake_lock wakelock; -static struct pm_qos_request pm_qos_req; - -static void prevent_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (++idlecount == 1) { - pm_qos_update_request(&pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - wake_lock(&wakelock); - } - mutex_unlock(&idlecount_lock); -} - -static void allow_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (--idlecount == 0) { - wake_unlock(&wakelock); - pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE); - } - mutex_unlock(&idlecount_lock); -} - -static inline int venc_check_version(u32 client, u32 server) -{ - int ret = -EINVAL; - - if ((VENC_GET_MAJOR_VERSION(client) == VENC_GET_MAJOR_VERSION(server)) - && (VENC_GET_MINOR_VERSION(client) <= - VENC_GET_MINOR_VERSION(server))) - ret = 0; - - return ret; -} - -static int venc_get_msg(struct venc_dev *dvenc, void *msg) -{ - struct venc_msg_list *l; - unsigned long flags; - int ret = 0; - struct venc_msg qdsp_msg; - - if (!dvenc->is_active) - return -EPERM; - spin_lock_irqsave(&dvenc->venc_msg_list_lock, flags); - list_for_each_entry_reverse(l, &dvenc->venc_msg_list_head, list) { - memcpy(&qdsp_msg, &l->msg_data, sizeof(struct venc_msg)); - list_del(&l->list); - list_add(&l->list, &dvenc->venc_msg_list_free); - ret = 1; - break; - } - spin_unlock_irqrestore(&dvenc->venc_msg_list_lock, flags); - if (copy_to_user(msg, &qdsp_msg, sizeof(struct venc_msg))) - pr_err("%s failed to copy_to_user\n", __func__); - return ret; -} - -static void venc_put_msg(struct venc_dev *dvenc, struct venc_msg *msg) -{ - struct venc_msg_list *l; - unsigned long flags; - int found = 0; - - spin_lock_irqsave(&dvenc->venc_msg_list_lock, flags); - list_for_each_entry(l, &dvenc->venc_msg_list_free, list) { - memcpy(&l->msg_data, msg, sizeof(struct venc_msg)); - list_del(&l->list); - list_add(&l->list, &dvenc->venc_msg_list_head); - found = 1; - break; - } - spin_unlock_irqrestore(&dvenc->venc_msg_list_lock, flags); - if (found) - wake_up(&dvenc->venc_msg_evt); - else - pr_err("%s: failed to find a free node\n", __func__); - -} - -static struct venc_pmem_list *venc_add_pmem_to_list(struct venc_dev *dvenc, - struct venc_pmem *mptr, - u32 btype) -{ - int ret = 0; - unsigned long flags; - unsigned long len; - unsigned long vaddr; - struct venc_pmem_list *plist = NULL; - - plist = kzalloc(sizeof(struct venc_pmem_list), GFP_KERNEL); - if (!plist) { - pr_err("%s: kzalloc failed\n", __func__); - return NULL; - } - - ret = get_pmem_file(mptr->fd, &(plist->buf.paddr), - &vaddr, &len, &(plist->buf.file)); - if (ret) { - pr_err("%s: get_pmem_file failed for fd=%d offset=%d\n", - __func__, mptr->fd, mptr->offset); - goto err_venc_add_pmem; - } else if (mptr->offset >= len) { - pr_err("%s: invalid offset (%d > %ld) for fd=%d\n", - __func__, mptr->offset, len, mptr->fd); - ret = -EINVAL; - goto err_venc_get_pmem; - } - - plist->buf.fd = mptr->fd; - plist->buf.paddr += mptr->offset; - plist->buf.size = mptr->size; - plist->buf.btype = btype; - plist->buf.offset = mptr->offset; - plist->buf.src = mptr->src; - - spin_lock_irqsave(&dvenc->venc_pmem_list_lock, flags); - list_add(&plist->list, &dvenc->venc_pmem_list_head); - spin_unlock_irqrestore(&dvenc->venc_pmem_list_lock, flags); - return plist; - -err_venc_get_pmem: - put_pmem_file(plist->buf.file); -err_venc_add_pmem: - kfree(plist); - return NULL; -} - -static struct venc_pmem_list *venc_get_pmem_from_list( - struct venc_dev *dvenc, u32 pmem_fd, - u32 offset, u32 btype) -{ - struct venc_pmem_list *plist; - unsigned long flags; - struct file *file; - int found = 0; - - file = fget(pmem_fd); - if (!file) { - pr_err("%s: invalid encoder buffer fd(%d)\n", __func__, - pmem_fd); - return NULL; - } - spin_lock_irqsave(&dvenc->venc_pmem_list_lock, flags); - list_for_each_entry(plist, &dvenc->venc_pmem_list_head, list) { - if (plist->buf.btype == btype && plist->buf.file == file && - plist->buf.offset == offset) { - found = 1; - break; - } - } - spin_unlock_irqrestore(&dvenc->venc_pmem_list_lock, flags); - fput(file); - if (found) - return plist; - - else - return NULL; -} - -static int venc_set_buffer(struct venc_dev *dvenc, void *argp, - u32 btype) -{ - struct venc_pmem pmem; - struct venc_pmem_list *plist; - int ret = 0; - - ret = copy_from_user(&pmem, argp, sizeof(pmem)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - plist = venc_add_pmem_to_list(dvenc, &pmem, btype); - if (plist == NULL) { - pr_err("%s: buffer add_to_pmem_list failed\n", - __func__); - return -EPERM; - } - return ret; -} - -static int venc_assign_q6_buffers(struct venc_dev *dvenc, - struct venc_buffers *pbufs, - struct venc_nonio_buf_config *pcfg) -{ - int ret = 0; - struct venc_pmem_list *plist; - - plist = venc_add_pmem_to_list(dvenc, &(pbufs->recon_buf[0]), - VENC_BUFFER_TYPE_QDSP6); - if (plist == NULL) { - pr_err("%s: recon_buf0 failed to add_to_pmem_list\n", - __func__); - return -EPERM; - } - pcfg->recon_buf1.region = pbufs->recon_buf[0].src; - pcfg->recon_buf1.phys = plist->buf.paddr; - pcfg->recon_buf1.size = plist->buf.size; - pcfg->recon_buf1.offset = 0; - - plist = venc_add_pmem_to_list(dvenc, &(pbufs->recon_buf[1]), - VENC_BUFFER_TYPE_QDSP6); - if (plist == NULL) { - pr_err("%s: recons_buf1 failed to add_to_pmem_list\n", - __func__); - return -EPERM; - } - pcfg->recon_buf2.region = pbufs->recon_buf[1].src; - pcfg->recon_buf2.phys = plist->buf.paddr; - pcfg->recon_buf2.size = plist->buf.size; - pcfg->recon_buf2.offset = 0; - - plist = venc_add_pmem_to_list(dvenc, &(pbufs->wb_buf), - VENC_BUFFER_TYPE_QDSP6); - if (plist == NULL) { - pr_err("%s: wb_buf failed to add_to_pmem_list\n", - __func__); - return -EPERM; - } - pcfg->wb_buf.region = pbufs->wb_buf.src; - pcfg->wb_buf.phys = plist->buf.paddr; - pcfg->wb_buf.size = plist->buf.size; - pcfg->wb_buf.offset = 0; - - plist = venc_add_pmem_to_list(dvenc, &(pbufs->cmd_buf), - VENC_BUFFER_TYPE_QDSP6); - if (plist == NULL) { - pr_err("%s: cmd_buf failed to add_to_pmem_list\n", - __func__); - return -EPERM; - } - pcfg->cmd_buf.region = pbufs->cmd_buf.src; - pcfg->cmd_buf.phys = plist->buf.paddr; - pcfg->cmd_buf.size = plist->buf.size; - pcfg->cmd_buf.offset = 0; - - plist = venc_add_pmem_to_list(dvenc, &(pbufs->vlc_buf), - VENC_BUFFER_TYPE_QDSP6); - if (plist == NULL) { - pr_err("%s: vlc_buf failed to add_to_pmem_list" - " failed\n", __func__); - return -EPERM; - } - pcfg->vlc_buf.region = pbufs->vlc_buf.src; - pcfg->vlc_buf.phys = plist->buf.paddr; - pcfg->vlc_buf.size = plist->buf.size; - pcfg->vlc_buf.offset = 0; - - return ret; -} - -static int venc_start(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_q6_config q6_config; - struct venc_init_config vconfig; - - dvenc->state = VENC_STATE_START; - ret = copy_from_user(&vconfig, argp, sizeof(struct venc_init_config)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - memcpy(&q6_config, &(vconfig.q6_config), sizeof(q6_config)); - ret = venc_assign_q6_buffers(dvenc, &(vconfig.q6_bufs), - &(q6_config.buf_params)); - if (ret != 0) { - pr_err("%s: assign_q6_buffers failed\n", __func__); - return -EPERM; - } - - q6_config.callback_event = dvenc->q6_handle; - TRACE("%s: parameters: handle:%p, config:%p, callback:%p \n", __func__, - dvenc->q6_handle, &q6_config, q6_config.callback_event); - TRACE("%s: parameters:recon1:0x%x, recon2:0x%x," - " wb_buf:0x%x, cmd:0x%x, vlc:0x%x\n", __func__, - q6_config.buf_params.recon_buf1.phys, - q6_config.buf_params.recon_buf2.phys, - q6_config.buf_params.wb_buf.phys, - q6_config.buf_params.cmd_buf.phys, - q6_config.buf_params.vlc_buf.phys); - TRACE("%s: size of param:%d \n", __func__, sizeof(q6_config)); - ret = dal_call_f5(dvenc->q6_handle, VENC_DALRPC_START, &q6_config, - sizeof(q6_config)); - if (ret != 0) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - return ret; - } - return ret; -} - -static int venc_encode_frame(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_pmem buf; - struct venc_input_buf q6_input; - struct venc_pmem_list *plist; - struct venc_buffer input; - - ret = copy_from_user(&input, argp, sizeof(struct venc_buffer)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - ret = copy_from_user(&buf, - ((struct venc_buffer *)argp)->ptr_buffer, - sizeof(struct venc_pmem)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - plist = venc_get_pmem_from_list(dvenc, buf.fd, buf.offset, - VENC_BUFFER_TYPE_INPUT); - if (NULL == plist) { - plist = venc_add_pmem_to_list(dvenc, &buf, - VENC_BUFFER_TYPE_INPUT); - if (plist == NULL) { - pr_err("%s: buffer add_to_pmem_list failed\n", - __func__); - return -EPERM; - } - } - - q6_input.flags = 0; - if (input.flags & VENC_FLAG_EOS) - q6_input.flags |= 0x00000001; - q6_input.yuv_buf.region = plist->buf.src; - q6_input.yuv_buf.phys = plist->buf.paddr; - q6_input.yuv_buf.size = plist->buf.size; - q6_input.yuv_buf.offset = 0; - q6_input.data_size = plist->buf.size; - q6_input.client_data = (u32)input.client_data; - q6_input.time_stamp = input.time_stamp; - q6_input.dvs_offsetx = 0; - q6_input.dvs_offsety = 0; - - TRACE("Pushing down input phys=0x%x fd= %d, client_data: 0x%x," - " time_stamp:%lld \n", q6_input.yuv_buf.phys, plist->buf.fd, - input.client_data, input.time_stamp); - ret = dal_call_f5(dvenc->q6_handle, VENC_DALRPC_QUEUE_INPUT, - &q6_input, sizeof(q6_input)); - - if (ret != 0) - pr_err("%s: Q6 queue_input failed (%d)\n", __func__, - (int)ret); - return ret; -} - -static int venc_fill_output(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_pmem buf; - struct venc_output_buf q6_output; - struct venc_pmem_list *plist; - struct venc_buffer output; - - ret = copy_from_user(&output, argp, sizeof(struct venc_buffer)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - ret = copy_from_user(&buf, - ((struct venc_buffer *)argp)->ptr_buffer, - sizeof(struct venc_pmem)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - plist = venc_get_pmem_from_list(dvenc, buf.fd, buf.offset, - VENC_BUFFER_TYPE_OUTPUT); - if (NULL == plist) { - plist = venc_add_pmem_to_list(dvenc, &buf, - VENC_BUFFER_TYPE_OUTPUT); - if (NULL == plist) { - pr_err("%s: output buffer failed to add_to_pmem_list" - "\n", __func__); - return -EPERM; - } - } - q6_output.bit_stream_buf.region = plist->buf.src; - q6_output.bit_stream_buf.phys = (u32)plist->buf.paddr; - q6_output.bit_stream_buf.size = plist->buf.size; - q6_output.bit_stream_buf.offset = 0; - q6_output.client_data = (u32)output.client_data; - ret = - dal_call_f5(dvenc->q6_handle, VENC_DALRPC_QUEUE_OUTPUT, &q6_output, - sizeof(q6_output)); - if (ret != 0) - pr_err("%s: remote function failed (%d)\n", __func__, ret); - return ret; -} - -static int venc_stop(struct venc_dev *dvenc) -{ - int ret = 0; - struct venc_msg msg; - - ret = dal_call_f0(dvenc->q6_handle, VENC_DALRPC_STOP, 1); - if (ret) { - pr_err("%s: remote runction failed (%d)\n", __func__, ret); - msg.msg_code = VENC_MSG_STOP; - msg.msg_data_size = 0; - msg.status_code = VENC_S_EFAIL; - venc_put_msg(dvenc, &msg); - } - return ret; -} - -static int venc_pause(struct venc_dev *dvenc) -{ - int ret = 0; - struct venc_msg msg; - - ret = dal_call_f0(dvenc->q6_handle, VENC_DALRPC_SUSPEND, 1); - if (ret) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - msg.msg_code = VENC_MSG_PAUSE; - msg.status_code = VENC_S_EFAIL; - msg.msg_data_size = 0; - venc_put_msg(dvenc, &msg); - } - return ret; -} - -static int venc_resume(struct venc_dev *dvenc) -{ - int ret = 0; - struct venc_msg msg; - - ret = dal_call_f0(dvenc->q6_handle, VENC_DALRPC_RESUME, 1); - if (ret) { - pr_err("%s: remote function failed (%d)\n", __func__, ret); - msg.msg_code = VENC_MSG_RESUME; - msg.msg_data_size = 0; - msg.status_code = VENC_S_EFAIL; - venc_put_msg(dvenc, &msg); - } - return ret; -} - -static int venc_flush(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_msg msg; - union venc_msg_data smsg; - int status = VENC_S_SUCCESS; - struct venc_buffer_flush flush; - - if (copy_from_user(&flush, argp, sizeof(struct venc_buffer_flush))) - return -EFAULT; - if (flush.flush_mode == VENC_FLUSH_ALL) { - ret = dal_call_f0(dvenc->q6_handle, VENC_DALRPC_FLUSH, 1); - if (ret) - status = VENC_S_EFAIL; - } else - status = VENC_S_ENOTSUPP; - - if (status != VENC_S_SUCCESS) { - if ((flush.flush_mode == VENC_FLUSH_INPUT) || - (flush.flush_mode == VENC_FLUSH_ALL)) { - smsg.flush_ret.flush_mode = VENC_FLUSH_INPUT; - msg.msg_data = smsg; - msg.status_code = status; - msg.msg_code = VENC_MSG_FLUSH; - msg.msg_data_size = sizeof(union venc_msg_data); - venc_put_msg(dvenc, &msg); - } - if (flush.flush_mode == VENC_FLUSH_OUTPUT || - (flush.flush_mode == VENC_FLUSH_ALL)) { - smsg.flush_ret.flush_mode = VENC_FLUSH_OUTPUT; - msg.msg_data = smsg; - msg.status_code = status; - msg.msg_code = VENC_MSG_FLUSH; - msg.msg_data_size = sizeof(union venc_msg_data); - venc_put_msg(dvenc, &msg); - } - return -EIO; - } - return ret; -} - -static int venc_get_sequence_hdr(struct venc_dev *dvenc, void *argp) -{ - pr_err("%s not supported\n", __func__); - return -EIO; -} - -static int venc_set_qp_range(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_qp_range qp; - - ret = copy_from_user(&qp, argp, sizeof(struct venc_qp_range)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - - if (dvenc->state == VENC_STATE_START || - dvenc->state == VENC_STATE_PAUSE) { - ret = - dal_call_f5(dvenc->q6_handle, VENC_DALRPC_UPDATE_QP_RANGE, - &qp, sizeof(struct venc_qp_range)); - if (ret) { - pr_err("%s: remote function failed (%d) \n", __func__, - ret); - return ret; - } - } - return ret; -} - -static int venc_set_intra_period(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - u32 pnum = 0; - - ret = copy_from_user(&pnum, argp, sizeof(int)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - if (dvenc->state == VENC_STATE_START || - dvenc->state == VENC_STATE_PAUSE) { - ret = dal_call_f0(dvenc->q6_handle, - VENC_DALRPC_UPDATE_INTRA_PERIOD, pnum); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, - ret); - } - return ret; -} - -static int venc_set_intra_refresh(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - u32 mb_num = 0; - - ret = copy_from_user(&mb_num, argp, sizeof(int)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - if (dvenc->state == VENC_STATE_START || - dvenc->state == VENC_STATE_PAUSE) { - ret = dal_call_f0(dvenc->q6_handle, - VENC_DALRPC_UPDATE_INTRA_REFRESH, mb_num); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, - ret); - } - return ret; -} - -static int venc_set_frame_rate(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - struct venc_frame_rate pdata; - ret = copy_from_user(&pdata, argp, sizeof(struct venc_frame_rate)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - if (dvenc->state == VENC_STATE_START || - dvenc->state == VENC_STATE_PAUSE) { - ret = dal_call_f5(dvenc->q6_handle, - VENC_DALRPC_UPDATE_FRAME_RATE, - (void *)&(pdata), - sizeof(struct venc_frame_rate)); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, - ret); - } - return ret; -} - -static int venc_set_target_bitrate(struct venc_dev *dvenc, void *argp) -{ - int ret = 0; - u32 pdata = 0; - - ret = copy_from_user(&pdata, argp, sizeof(int)); - if (ret) { - pr_err("%s: copy_from_user failed\n", __func__); - return ret; - } - if (dvenc->state == VENC_STATE_START || - dvenc->state == VENC_STATE_PAUSE) { - ret = dal_call_f0(dvenc->q6_handle, - VENC_DALRPC_UPDATE_BITRATE, pdata); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, - ret); - } - return ret; -} - -static int venc_request_iframe(struct venc_dev *dvenc) -{ - int ret = 0; - - if (dvenc->state != VENC_STATE_START) - return -EINVAL; - - ret = dal_call_f0(dvenc->q6_handle, VENC_DALRPC_REQUEST_IFRAME, 1); - if (ret) - pr_err("%s: remote function failed (%d)\n", __func__, ret); - return ret; -} - -static int venc_stop_read_msg(struct venc_dev *dvenc) -{ - struct venc_msg msg; - int ret = 0; - - msg.status_code = 0; - msg.msg_code = VENC_MSG_STOP_READING_MSG; - msg.msg_data_size = 0; - venc_put_msg(dvenc, &msg); - return ret; -} - -static int venc_q6_stop(struct venc_dev *dvenc) -{ - int ret = 0; - struct venc_pmem_list *plist; - unsigned long flags; - - wake_up(&dvenc->venc_msg_evt); - spin_lock_irqsave(&dvenc->venc_pmem_list_lock, flags); - if (!dvenc->pmem_freed) { - list_for_each_entry(plist, &dvenc->venc_pmem_list_head, list) - put_pmem_file(plist->buf.file); - dvenc->pmem_freed = 1; - } - spin_unlock_irqrestore(&dvenc->venc_pmem_list_lock, flags); - - dvenc->state = VENC_STATE_STOP; - return ret; -} - -static int venc_translate_error(enum venc_status_code q6_status) -{ - int ret = 0; - - switch (q6_status) { - case VENC_STATUS_SUCCESS: - ret = VENC_S_SUCCESS; - break; - case VENC_STATUS_ERROR: - ret = VENC_S_EFAIL; - break; - case VENC_STATUS_INVALID_STATE: - ret = VENC_S_EINVALSTATE; - break; - case VENC_STATUS_FLUSHING: - ret = VENC_S_EFLUSHED; - break; - case VENC_STATUS_INVALID_PARAM: - ret = VENC_S_EBADPARAM; - break; - case VENC_STATUS_CMD_QUEUE_FULL: - ret = VENC_S_ECMDQFULL; - break; - case VENC_STATUS_CRITICAL: - ret = VENC_S_EFATAL; - break; - case VENC_STATUS_INSUFFICIENT_RESOURCES: - ret = VENC_S_ENOHWRES; - break; - case VENC_STATUS_TIMEOUT: - ret = VENC_S_ETIMEOUT; - break; - } - if (q6_status != VENC_STATUS_SUCCESS) - pr_err("%s: Q6 failed (%d)", __func__, (int)q6_status); - return ret; -} - -static void venc_q6_callback(void *data, int len, void *cookie) -{ - int status = 0; - struct venc_dev *dvenc = (struct venc_dev *)cookie; - struct venc_msg_type *q6_msg = NULL; - struct venc_msg msg, msg1; - union venc_msg_data smsg1, smsg2; - unsigned long msg_code = 0; - struct venc_input_payload *pload1; - struct venc_output_payload *pload2; - uint32_t * tmp = (uint32_t *) data; - - if (dvenc == NULL) { - pr_err("%s: empty driver parameter\n", __func__); - return; - } - if (tmp[2] == sizeof(struct venc_msg_type)) { - q6_msg = (struct venc_msg_type *)&tmp[3]; - } else { - pr_err("%s: callback with empty message (%d, %d)\n", - __func__, tmp[2], sizeof(struct venc_msg_type)); - return; - } - msg.msg_data_size = 0; - status = venc_translate_error(q6_msg->status); - switch ((enum venc_event_type_enum)q6_msg->event) { - case VENC_EVENT_START_STATUS: - dvenc->state = VENC_STATE_START; - msg_code = VENC_MSG_START; - break; - case VENC_EVENT_STOP_STATUS: - venc_q6_stop(dvenc); - msg_code = VENC_MSG_STOP; - break; - case VENC_EVENT_SUSPEND_STATUS: - dvenc->state = VENC_STATE_PAUSE; - msg_code = VENC_MSG_PAUSE; - break; - case VENC_EVENT_RESUME_STATUS: - dvenc->state = VENC_STATE_START; - msg_code = VENC_MSG_RESUME; - break; - case VENC_EVENT_FLUSH_STATUS: - smsg1.flush_ret.flush_mode = VENC_FLUSH_INPUT; - msg1.status_code = status; - msg1.msg_code = VENC_MSG_FLUSH; - msg1.msg_data = smsg1; - msg1.msg_data_size = sizeof(union venc_msg_data); - venc_put_msg(dvenc, &msg1); - smsg2.flush_ret.flush_mode = VENC_FLUSH_OUTPUT; - msg_code = VENC_MSG_FLUSH; - msg.msg_data = smsg2; - msg.msg_data_size = sizeof(union venc_msg_data); - break; - case VENC_EVENT_RELEASE_INPUT: - pload1 = &((q6_msg->payload).input_payload); - TRACE("Release_input: data: 0x%x \n", pload1->data); - if (pload1 != NULL) { - msg.msg_data.buf.client_data = pload1->data; - msg_code = VENC_MSG_INPUT_BUFFER_DONE; - msg.msg_data_size = sizeof(union venc_msg_data); - } - break; - case VENC_EVENT_DELIVER_OUTPUT: - pload2 = &((q6_msg->payload).output_payload); - smsg1.buf.flags = 0; - if (pload2->flags & VENC_FLAG_SYNC_FRAME) - smsg1.buf.flags |= VENC_FLAG_SYNC_FRAME; - if (pload2->flags & VENC_FLAG_CODEC_CONFIG) - smsg1.buf.flags |= VENC_FLAG_CODEC_CONFIG; - if (pload2->flags & VENC_FLAG_END_OF_FRAME) - smsg1.buf.flags |= VENC_FLAG_END_OF_FRAME; - if (pload2->flags & VENC_FLAG_EOS) - smsg1.buf.flags |= VENC_FLAG_EOS; - smsg1.buf.len = pload2->size; - smsg1.buf.offset = 0; - smsg1.buf.time_stamp = pload2->time_stamp; - smsg1.buf.client_data = pload2->data; - msg_code = VENC_MSG_OUTPUT_BUFFER_DONE; - msg.msg_data = smsg1; - msg.msg_data_size = sizeof(union venc_msg_data); - break; - default: - pr_err("%s: invalid response from Q6 (%d)\n", __func__, - (int)q6_msg->event); - return; - } - msg.status_code = status; - msg.msg_code = msg_code; - venc_put_msg(dvenc, &msg); - return; -} - -static int venc_get_version(struct venc_dev *dvenc, void *argp) -{ - struct venc_version ver_info; - int ret = 0; - - ver_info.major = VENC_GET_MAJOR_VERSION(VENC_INTERFACE_VERSION); - ver_info.minor = VENC_GET_MINOR_VERSION(VENC_INTERFACE_VERSION); - - ret = copy_to_user(((struct venc_version *)argp), - &ver_info, sizeof(ver_info)); - if (ret) - pr_err("%s failed to copy_to_user\n", __func__); - - return ret; - -} - -static long q6venc_ioctl(struct file *file, u32 cmd, - unsigned long arg) -{ - long ret = 0; - void __user *argp = (void __user *)arg; - struct venc_dev *dvenc = file->private_data; - - if (!dvenc || !dvenc->is_active) - return -EPERM; - - switch (cmd) { - case VENC_IOCTL_SET_INPUT_BUFFER: - ret = venc_set_buffer(dvenc, argp, VENC_BUFFER_TYPE_INPUT); - break; - case VENC_IOCTL_SET_OUTPUT_BUFFER: - ret = venc_set_buffer(dvenc, argp, VENC_BUFFER_TYPE_OUTPUT); - break; - case VENC_IOCTL_GET_SEQUENCE_HDR: - ret = venc_get_sequence_hdr(dvenc, argp); - break; - case VENC_IOCTL_SET_QP_RANGE: - ret = venc_set_qp_range(dvenc, argp); - break; - case VENC_IOCTL_SET_INTRA_PERIOD: - ret = venc_set_intra_period(dvenc, argp); - break; - case VENC_IOCTL_SET_INTRA_REFRESH: - ret = venc_set_intra_refresh(dvenc, argp); - break; - case VENC_IOCTL_SET_FRAME_RATE: - ret = venc_set_frame_rate(dvenc, argp); - break; - case VENC_IOCTL_SET_TARGET_BITRATE: - ret = venc_set_target_bitrate(dvenc, argp); - break; - case VENC_IOCTL_CMD_REQUEST_IFRAME: - if (dvenc->state == VENC_STATE_START) - ret = venc_request_iframe(dvenc); - break; - case VENC_IOCTL_CMD_START: - ret = venc_start(dvenc, argp); - break; - case VENC_IOCTL_CMD_STOP: - ret = venc_stop(dvenc); - break; - case VENC_IOCTL_CMD_PAUSE: - ret = venc_pause(dvenc); - break; - case VENC_IOCTL_CMD_RESUME: - ret = venc_resume(dvenc); - break; - case VENC_IOCTL_CMD_ENCODE_FRAME: - ret = venc_encode_frame(dvenc, argp); - break; - case VENC_IOCTL_CMD_FILL_OUTPUT_BUFFER: - ret = venc_fill_output(dvenc, argp); - break; - case VENC_IOCTL_CMD_FLUSH: - ret = venc_flush(dvenc, argp); - break; - case VENC_IOCTL_CMD_READ_NEXT_MSG: - wait_event_interruptible(dvenc->venc_msg_evt, - venc_get_msg(dvenc, argp)); - break; - case VENC_IOCTL_CMD_STOP_READ_MSG: - ret = venc_stop_read_msg(dvenc); - break; - case VENC_IOCTL_GET_VERSION: - ret = venc_get_version(dvenc, argp); - break; - default: - pr_err("%s: invalid ioctl code (%d)\n", __func__, cmd); - ret = -ENOTTY; - break; - } - return ret; -} - -static int q6venc_open(struct inode *inode, struct file *file) -{ - int i; - int ret = 0; - struct venc_dev *dvenc; - struct venc_msg_list *plist, *tmp; - struct dal_info version_info; - - dvenc = kzalloc(sizeof(struct venc_dev), GFP_KERNEL); - if (!dvenc) { - pr_err("%s: unable to allocate memory for struct venc_dev\n", - __func__); - return -ENOMEM; - } - file->private_data = dvenc; - INIT_LIST_HEAD(&dvenc->venc_msg_list_head); - INIT_LIST_HEAD(&dvenc->venc_msg_list_free); - INIT_LIST_HEAD(&dvenc->venc_pmem_list_head); - init_waitqueue_head(&dvenc->venc_msg_evt); - spin_lock_init(&dvenc->venc_msg_list_lock); - spin_lock_init(&dvenc->venc_pmem_list_lock); - venc_ref++; - for (i = 0; i < VENC_MSG_MAX; i++) { - plist = kzalloc(sizeof(struct venc_msg_list), GFP_KERNEL); - if (!plist) { - pr_err("%s: kzalloc failed\n", __func__); - ret = -ENOMEM; - goto err_venc_create_msg_list; - } - list_add(&plist->list, &dvenc->venc_msg_list_free); - } - dvenc->q6_handle = - dal_attach(DALDEVICEID_VENC_DEVICE, DALDEVICEID_VENC_PORTNAME, 1, - venc_q6_callback, (void *)dvenc); - if (!(dvenc->q6_handle)) { - pr_err("%s: daldevice_attach failed (%d)\n", __func__, ret); - goto err_venc_dal_attach; - } - ret = dal_call_f9(dvenc->q6_handle, DAL_OP_INFO, &version_info, - sizeof(struct dal_info)); - if (ret) { - pr_err("%s: failed to get version\n", __func__); - goto err_venc_dal_open; - } - if (venc_check_version(VENC_INTERFACE_VERSION, version_info.version)) { - pr_err("%s: driver version mismatch\n", __func__); - goto err_venc_dal_open; - } - ret = dal_call_f0(dvenc->q6_handle, DAL_OP_OPEN, 1); - if (ret) { - pr_err("%s: dal_call_open failed (%d)\n", __func__, ret); - goto err_venc_dal_open; - } - dvenc->state = VENC_STATE_STOP; - dvenc->is_active = 1; - prevent_sleep(); - return ret; -err_venc_dal_open: - dal_detach(dvenc->q6_handle); -err_venc_dal_attach: - list_for_each_entry_safe(plist, tmp, &dvenc->venc_msg_list_free, list) { - list_del(&plist->list); - kfree(plist); - } -err_venc_create_msg_list: - kfree(dvenc); - venc_ref--; - return ret; -} - -static int q6venc_release(struct inode *inode, struct file *file) -{ - int ret = 0; - struct venc_msg_list *l, *n; - struct venc_pmem_list *plist, *m; - struct venc_dev *dvenc; - unsigned long flags; - - venc_ref--; - dvenc = file->private_data; - dvenc->is_active = 0; - wake_up_all(&dvenc->venc_msg_evt); - dal_call_f0(dvenc->q6_handle, VENC_DALRPC_STOP, 1); - dal_call_f0(dvenc->q6_handle, DAL_OP_CLOSE, 1); - dal_detach(dvenc->q6_handle); - list_for_each_entry_safe(l, n, &dvenc->venc_msg_list_free, list) { - list_del(&l->list); - kfree(l); - } - list_for_each_entry_safe(l, n, &dvenc->venc_msg_list_head, list) { - list_del(&l->list); - kfree(l); - } - spin_lock_irqsave(&dvenc->venc_pmem_list_lock, flags); - if (!dvenc->pmem_freed) { - list_for_each_entry(plist, &dvenc->venc_pmem_list_head, list) - put_pmem_file(plist->buf.file); - dvenc->pmem_freed = 1; - } - spin_unlock_irqrestore(&dvenc->venc_pmem_list_lock, flags); - - list_for_each_entry_safe(plist, m, &dvenc->venc_pmem_list_head, list) { - list_del(&plist->list); - kfree(plist); - } - kfree(dvenc); - allow_sleep(); - return ret; -} - -const struct file_operations q6venc_fops = { - .owner = THIS_MODULE, - .open = q6venc_open, - .release = q6venc_release, - .unlocked_ioctl = q6venc_ioctl, -}; - -static int __init q6venc_init(void) -{ - int ret = 0; - - pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "venc_suspend"); - - venc_device_p = kzalloc(sizeof(struct venc_dev), GFP_KERNEL); - if (!venc_device_p) { - pr_err("%s: unable to allocate memory for venc_device_p\n", - __func__); - return -ENOMEM; - } - ret = alloc_chrdev_region(&venc_dev_num, 0, 1, VENC_NAME); - if (ret < 0) { - pr_err("%s: alloc_chrdev_region failed (%d)\n", __func__, - ret); - return ret; - } - venc_class = class_create(THIS_MODULE, VENC_NAME); - if (IS_ERR(venc_class)) { - ret = PTR_ERR(venc_class); - pr_err("%s: failed to create venc_class (%d)\n", - __func__, ret); - goto err_venc_class_create; - } - venc_device_p->class_devp = - device_create(venc_class, NULL, venc_dev_num, NULL, - VENC_NAME); - if (IS_ERR(venc_device_p->class_devp)) { - ret = PTR_ERR(venc_device_p->class_devp); - pr_err("%s: failed to create class_device (%d)\n", __func__, - ret); - goto err_venc_class_device_create; - } - cdev_init(&cdev, &q6venc_fops); - cdev.owner = THIS_MODULE; - ret = cdev_add(&cdev, venc_dev_num, 1); - if (ret < 0) { - pr_err("%s: cdev_add failed (%d)\n", __func__, ret); - goto err_venc_cdev_add; - } - init_waitqueue_head(&venc_device_p->venc_msg_evt); - return ret; - -err_venc_cdev_add: - device_destroy(venc_class, venc_dev_num); -err_venc_class_device_create: - class_destroy(venc_class); -err_venc_class_create: - unregister_chrdev_region(venc_dev_num, 1); - return ret; -} - -static void __exit q6venc_exit(void) -{ - cdev_del(&(cdev)); - device_destroy(venc_class, venc_dev_num); - class_destroy(venc_class); - unregister_chrdev_region(venc_dev_num, 1); -} - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Video encoder driver for QDSP6"); -MODULE_VERSION("2.0"); -module_init(q6venc_init); -module_exit(q6venc_exit); diff --git a/arch/arm/mach-msm/qdsp6/pcm_in.c b/arch/arm/mach-msm/qdsp6/pcm_in.c deleted file mode 100644 index 288e1dccfa3f..000000000000 --- a/arch/arm/mach-msm/qdsp6/pcm_in.c +++ /dev/null @@ -1,264 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/pcm_in.c - * - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -struct pcm { - struct audio_client *ac; - uint32_t sample_rate; - uint32_t channel_count; - uint32_t buffer_size; - uint32_t rec_mode; -}; - -#define BUFSZ (256) - -void audio_client_dump(struct audio_client *ac); - -static long q6_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct pcm *pcm = file->private_data; - int rc = 0; - - switch (cmd) { - case AUDIO_SET_VOLUME: - pr_debug("[%s:%s] SET_VOLUME\n", __MM_FILE__, __func__); - break; - case AUDIO_GET_STATS: { - struct msm_audio_stats stats; - pr_debug("[%s:%s] GET_STATS\n", __MM_FILE__, __func__); - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void*) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - case AUDIO_START: { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - rc = 0; - - if (arg == 0) { - acdb_id = 0; - } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { - rc = -EFAULT; - break; - } - - if (pcm->ac) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - } else { - pcm->ac = q6audio_open_pcm(pcm->buffer_size, - pcm->sample_rate, pcm->channel_count, - pcm->rec_mode, acdb_id); - if (!pcm->ac) { - pr_err("[%s:%s] pcm open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (copy_from_user(&config, (void*) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - if (!config.channel_count || config.channel_count > 2) { - rc = -EINVAL; - pr_err("[%s:%s] invalid channelcount %d\n", - __MM_FILE__, __func__, config.channel_count); - break; - } - if (config.sample_rate < 8000 || config.sample_rate > 48000) { - rc = -EINVAL; - pr_err("[%s:%s] invalid samplerate %d\n", __MM_FILE__, - __func__, config.sample_rate); - break; - } - if (config.buffer_size < 128 || config.buffer_size > 8192) { - rc = -EINVAL; - pr_err("[%s:%s] invalid buffsize %d\n", __MM_FILE__, - __func__, config.buffer_size); - break; - } - - pcm->sample_rate = config.sample_rate; - pcm->channel_count = config.channel_count; - pcm->buffer_size = config.buffer_size; - break; - } - case AUDIO_SET_INCALL: { - struct msm_voicerec_mode voicerec_mode; - pr_debug("[%s:%s] SET_INCALL\n", __MM_FILE__, __func__); - if (copy_from_user(&voicerec_mode, (void *)arg, - sizeof(struct msm_voicerec_mode))) - return -EFAULT; - if (voicerec_mode.rec_mode != AUDIO_FLAG_READ && - voicerec_mode.rec_mode != AUDIO_FLAG_INCALL_MIXED) { - pcm->rec_mode = AUDIO_FLAG_READ; - pr_err("[%s:%s] invalid rec_mode\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } else - pcm->rec_mode = voicerec_mode.rec_mode; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - memset(&config, 0, sizeof(config)); - config.buffer_size = pcm->buffer_size; - config.buffer_count = 2; - config.sample_rate = pcm->sample_rate; - config.channel_count = pcm->channel_count; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void*) arg, &config, sizeof(config))) { - rc = -EFAULT; - } - pr_debug("[%s:%s] GET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - break; - } - default: - rc = -EINVAL; - } - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int q6_in_open(struct inode *inode, struct file *file) -{ - struct pcm *pcm; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - pcm = kzalloc(sizeof(struct pcm), GFP_KERNEL); - - if (!pcm) - return -ENOMEM; - - pcm->channel_count = 1; - pcm->sample_rate = 8000; - pcm->buffer_size = BUFSZ; - pcm->rec_mode = AUDIO_FLAG_READ; - file->private_data = pcm; - return 0; -} - -static ssize_t q6_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct pcm *pcm = file->private_data; - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - int xfer; - int res; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - ac = pcm->ac; - if (!ac) { - res = -ENODEV; - goto fail; - } - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - if (!wait_event_timeout(ac->wait, (ab->used == 0), 5*HZ)) { - audio_client_dump(ac); - pr_err("[%s:%s] timeout. dsp dead?\n", - __MM_FILE__, __func__); - q6audio_dsp_not_responding(); - } - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_to_user(buf, ab->data, xfer)) { - res = -EFAULT; - goto fail; - } - - buf += xfer; - count -= xfer; - - ab->used = 1; - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } -fail: - res = buf - start; - return res; -} - -static int q6_in_release(struct inode *inode, struct file *file) -{ - - int rc = 0; - struct pcm *pcm = file->private_data; - if (pcm->ac) - rc = q6audio_close(pcm->ac); - kfree(pcm); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return rc; -} - -static struct file_operations q6_in_fops = { - .owner = THIS_MODULE, - .open = q6_in_open, - .read = q6_in_read, - .release = q6_in_release, - .unlocked_ioctl = q6_in_ioctl, -}; - -struct miscdevice q6_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_in", - .fops = &q6_in_fops, -}; - -static int __init q6_in_init(void) { - return misc_register(&q6_in_misc); -} - -device_initcall(q6_in_init); diff --git a/arch/arm/mach-msm/qdsp6/pcm_out.c b/arch/arm/mach-msm/qdsp6/pcm_out.c deleted file mode 100644 index 2e91cb2fed86..000000000000 --- a/arch/arm/mach-msm/qdsp6/pcm_out.c +++ /dev/null @@ -1,276 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/pcm_out.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -void audio_client_dump(struct audio_client *ac); - -#define BUFSZ (3072) - -struct pcm { - struct mutex lock; - struct audio_client *ac; - uint32_t sample_rate; - uint32_t channel_count; - size_t buffer_size; -}; - -static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct pcm *pcm = file->private_data; - int rc = 0; - - if (cmd == AUDIO_GET_STATS) { - struct msm_audio_stats stats; - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void*) arg, &stats, sizeof(stats))) - return -EFAULT; - return 0; - } - - mutex_lock(&pcm->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: { - int vol; - if (!pcm->ac) { - pr_err("%s: cannot set volume before AUDIO_START!\n", - __func__); - rc = -EINVAL; - break; - } - if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_VOLUME: vol = %d\n", __MM_FILE__, - __func__, vol); - rc = q6audio_set_stream_volume(pcm->ac, vol); - break; - } - case AUDIO_START: { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { - pr_info("[%s:%s] copy acdb_id from user failed\n", - __MM_FILE__, __func__); - rc = -EFAULT; - break; - } - if (pcm->ac) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - } else { - pcm->ac = q6audio_open_pcm(pcm->buffer_size, - pcm->sample_rate, - pcm->channel_count, - AUDIO_FLAG_WRITE, acdb_id); - if (!pcm->ac) { - pr_err("[%s:%s] pcm open session failed\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - } - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_CONFIG: { - struct msm_audio_config config; - if (pcm->ac) { - rc = -EBUSY; - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - break; - } - if (copy_from_user(&config, (void*) arg, sizeof(config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - if (config.channel_count < 1 || config.channel_count > 2) { - rc = -EINVAL; - pr_err("[%s:%s] invalid channelcount %d\n", - __MM_FILE__, __func__, config.channel_count); - break; - } - if (config.sample_rate < 8000 || config.sample_rate > 48000) { - rc = -EINVAL; - pr_err("[%s:%s] invalid samplerate %d\n", __MM_FILE__, - __func__, config.sample_rate); - break; - } - if (config.buffer_size < 128 || config.buffer_size > 8192) { - rc = -EINVAL; - pr_err("[%s:%s] invalid buffsize %d\n", __MM_FILE__, - __func__, config.buffer_size); - break; - } - pcm->sample_rate = config.sample_rate; - pcm->channel_count = config.channel_count; - pcm->buffer_size = config.buffer_size; - break; - } - case AUDIO_GET_CONFIG: { - struct msm_audio_config config; - config.buffer_size = pcm->buffer_size; - config.buffer_count = 2; - config.sample_rate = pcm->sample_rate; - config.channel_count = pcm->channel_count; - config.unused[0] = 0; - config.unused[1] = 0; - config.unused[2] = 0; - if (copy_to_user((void*) arg, &config, sizeof(config))) { - rc = -EFAULT; - } - pr_debug("[%s:%s] GET_CONFIG: samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, config.sample_rate, - config.channel_count); - break; - } - case AUDIO_SET_EQ: { - struct msm_audio_eq_stream_config eq_config; - pr_debug("[%s:%s] SET_EQ\n", __MM_FILE__, __func__); - if (copy_from_user(&eq_config, (void *) arg, - sizeof(eq_config))) { - rc = -EFAULT; - break; - } - rc = q6audio_set_stream_eq_pcm(pcm->ac, (void *) &eq_config); - break; - } - default: - rc = -EINVAL; - } - mutex_unlock(&pcm->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int pcm_open(struct inode *inode, struct file *file) -{ - struct pcm *pcm; - - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - pcm = kzalloc(sizeof(struct pcm), GFP_KERNEL); - - if (!pcm) - return -ENOMEM; - - mutex_init(&pcm->lock); - pcm->channel_count = 2; - pcm->sample_rate = 44100; - pcm->buffer_size = BUFSZ; - file->private_data = pcm; - return 0; -} - -static ssize_t pcm_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - struct pcm *pcm = file->private_data; - struct audio_client *ac; - struct audio_buffer *ab; - const char __user *start = buf; - int xfer; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - if (!pcm->ac) - pcm_ioctl(file, AUDIO_START, 0); - - ac = pcm->ac; - if (!ac) - return -ENODEV; - - while (count > 0) { - ab = ac->buf + ac->cpu_buf; - - if (ab->used) - if (!wait_event_timeout(ac->wait, (ab->used == 0), 5*HZ)) { - audio_client_dump(ac); - pr_err("[%s:%s] timeout. dsp dead?\n", - __MM_FILE__, __func__); - q6audio_dsp_not_responding(); - } - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = count; - if (xfer > ab->size) - xfer = ab->size; - - if (copy_from_user(ab->data, buf, xfer)) - return -EFAULT; - - buf += xfer; - count -= xfer; - - ab->used = 1; - ab->actual_size = xfer; - q6audio_write(ac, ab); - ac->cpu_buf ^= 1; - } - - return buf - start; -} - -static int pcm_release(struct inode *inode, struct file *file) -{ - struct pcm *pcm = file->private_data; - if (pcm->ac) - q6audio_close(pcm->ac); - kfree(pcm); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return 0; -} - -static struct file_operations pcm_fops = { - .owner = THIS_MODULE, - .open = pcm_open, - .write = pcm_write, - .release = pcm_release, - .unlocked_ioctl = pcm_ioctl, -}; - -struct miscdevice pcm_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_pcm_out", - .fops = &pcm_fops, -}; - -static int __init pcm_init(void) { - return misc_register(&pcm_misc); -} - -device_initcall(pcm_init); diff --git a/arch/arm/mach-msm/qdsp6/q6audio.c b/arch/arm/mach-msm/qdsp6/q6audio.c deleted file mode 100644 index 9404c3d7d602..000000000000 --- a/arch/arm/mach-msm/qdsp6/q6audio.c +++ /dev/null @@ -1,2157 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dal.h" -#include "dal_audio.h" -#include "dal_audio_format.h" -#include "dal_acdb.h" -#include "dal_adie.h" -#include -#include - -#include - -#include - -#include "q6audio_devices.h" -#include - - -struct q6_hw_info { - int min_gain; - int max_gain; -}; - -/* TODO: provide mechanism to configure from board file */ - -static struct q6_hw_info q6_audio_hw[Q6_HW_COUNT] = { - [Q6_HW_HANDSET] = { - .min_gain = -400, - .max_gain = 1100, - }, - [Q6_HW_HEADSET] = { - .min_gain = -1100, - .max_gain = 400, - }, - [Q6_HW_SPEAKER] = { - .min_gain = -1000, - .max_gain = 500, - }, - [Q6_HW_TTY] = { - .min_gain = 0, - .max_gain = 0, - }, - [Q6_HW_BT_SCO] = { - .min_gain = -1100, - .max_gain = 400, - }, - [Q6_HW_BT_A2DP] = { - .min_gain = -1100, - .max_gain = 400, - }, -}; - -static struct wake_lock wakelock; -static struct pm_qos_request pm_qos_req; -static int idlecount; -static DEFINE_MUTEX(idlecount_lock); - -void audio_prevent_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (++idlecount == 1) { - wake_lock(&wakelock); - pm_qos_update_request(&pm_qos_req, - msm_cpuidle_get_deep_idle_latency()); - } - mutex_unlock(&idlecount_lock); -} - -void audio_allow_sleep(void) -{ - mutex_lock(&idlecount_lock); - if (--idlecount == 0) { - pm_qos_update_request(&pm_qos_req, PM_QOS_DEFAULT_VALUE); - wake_unlock(&wakelock); - } - mutex_unlock(&idlecount_lock); -} - -static struct clk *icodec_rx_clk; -static struct clk *icodec_tx_clk; -static struct clk *ecodec_clk; -static struct clk *sdac_clk; - -static struct q6audio_analog_ops default_analog_ops; -static struct q6audio_analog_ops *analog_ops = &default_analog_ops; -static uint32_t tx_clk_freq = 8000; -static int tx_mute_status = 0; -static int rx_vol_level = 100; -static uint32_t tx_acdb = 0; -static uint32_t rx_acdb = 0; - -void q6audio_register_analog_ops(struct q6audio_analog_ops *ops) -{ - analog_ops = ops; -} - -static struct q6_device_info *q6_lookup_device(uint32_t device_id, - uint32_t acdb_id) -{ - struct q6_device_info *di = q6_audio_devices; - - pr_debug("[%s:%s] device_id = 0x%x, acdb_id = %d\n", __MM_FILE__, - __func__, device_id, acdb_id); - if (acdb_id) { - for (;;) { - if (di->cad_id == acdb_id && di->id == device_id) - return di; - if (di->id == 0) { - pr_err("[%s:%s] bogus id 0x%08x\n", - __MM_FILE__, __func__, device_id); - return di; - } - di++; - } - } else { - for (;;) { - if (di->id == device_id) - return di; - if (di->id == 0) { - pr_err("[%s:%s] bogus id 0x%08x\n", - __MM_FILE__, __func__, device_id); - return di; - } - di++; - } - } -} - -static uint32_t q6_device_to_codec(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id, 0); - return di->codec; -} - -static uint32_t q6_device_to_dir(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id, 0); - return di->dir; -} - -static uint32_t q6_device_to_cad_id(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id, 0); - return di->cad_id; -} - -static uint32_t q6_device_to_path(uint32_t device_id, uint32_t acdb_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id, acdb_id); - return di->path; -} - -static uint32_t q6_device_to_rate(uint32_t device_id) -{ - struct q6_device_info *di = q6_lookup_device(device_id, 0); - return di->rate; -} - -int q6_device_volume(uint32_t device_id, int level) -{ - struct q6_device_info *di = q6_lookup_device(device_id, 0); - struct q6_hw_info *hw; - - hw = &q6_audio_hw[di->hw]; - - return hw->min_gain + ((hw->max_gain - hw->min_gain) * level) / 100; -} - -static inline int adie_open(struct dal_client *client) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return dal_call_f0(client, DAL_OP_OPEN, 0); -} - -static inline int adie_close(struct dal_client *client) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return dal_call_f0(client, DAL_OP_CLOSE, 0); -} - -static inline int adie_set_path(struct dal_client *client, - uint32_t id, uint32_t path_type) -{ - pr_debug("[%s:%s] id = 0x%x, path_type = %d\n", __MM_FILE__, - __func__, id, path_type); - return dal_call_f1(client, ADIE_OP_SET_PATH, id, path_type); -} - -static inline int adie_set_path_freq_plan(struct dal_client *client, - uint32_t path_type, uint32_t plan) -{ - pr_debug("[%s:%s] path_type = %d, plan = %d\n", __MM_FILE__, - __func__, path_type, plan); - return dal_call_f1(client, ADIE_OP_SET_PATH_FREQUENCY_PLAN, - path_type, plan); -} - -static inline int adie_proceed_to_stage(struct dal_client *client, - uint32_t path_type, uint32_t stage) -{ - pr_debug("[%s:%s] path_type = %d, stage = 0x%x\n", __MM_FILE__, - __func__, path_type, stage); - return dal_call_f1(client, ADIE_OP_PROCEED_TO_STAGE, - path_type, stage); -} - -static inline int adie_mute_path(struct dal_client *client, - uint32_t path_type, uint32_t mute_state) -{ - pr_debug("[%s:%s] path_type = %d, mute = %d\n", __MM_FILE__, __func__, - path_type, mute_state); - return dal_call_f1(client, ADIE_OP_MUTE_PATH, path_type, mute_state); -} - -static int adie_refcount; - -static struct dal_client *adie; -static struct dal_client *adsp; -static struct dal_client *acdb; - -static int adie_enable(void) -{ - adie_refcount++; - if (adie_refcount == 1) - adie_open(adie); - return 0; -} - -static int adie_disable(void) -{ - adie_refcount--; - if (adie_refcount == 0) - adie_close(adie); - return 0; -} - -/* 4k PMEM used for exchanging acdb device config tables - * and stream format descriptions with the DSP. - */ -static char *audio_data; -static int32_t audio_phys; - -#define SESSION_MIN 0 -#define SESSION_MAX 64 - -static DEFINE_MUTEX(session_lock); -static DEFINE_MUTEX(audio_lock); - -static struct audio_client *session[SESSION_MAX]; - -static int session_alloc(struct audio_client *ac) -{ - int n; - - mutex_lock(&session_lock); - for (n = SESSION_MIN; n < SESSION_MAX; n++) { - if (!session[n]) { - session[n] = ac; - mutex_unlock(&session_lock); - pr_debug("[%s:%s] session = %d\n", __MM_FILE__, - __func__, n); - return n; - } - } - mutex_unlock(&session_lock); - return -ENOMEM; -} - -static void session_free(int n, struct audio_client *ac) -{ - mutex_lock(&session_lock); - if (session[n] == ac) { - session[n] = 0; - pr_debug("[%s:%s] session = %d\n", __MM_FILE__, __func__, n); - } - mutex_unlock(&session_lock); -} - -static void audio_client_free(struct audio_client *ac) -{ - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - session_free(ac->session, ac); - - if (ac->buf[0].data) { - iounmap(ac->buf[0].data); - pmem_kfree(ac->buf[0].phys); - } - if (ac->buf[1].data) { - iounmap(ac->buf[1].data); - pmem_kfree(ac->buf[1].phys); - } - kfree(ac); -} - -static struct audio_client *audio_client_alloc(unsigned bufsz) -{ - struct audio_client *ac; - int n; - - pr_debug("[%s:%s] bufsz = %d\n", __MM_FILE__, __func__, bufsz); - ac = kzalloc(sizeof(*ac), GFP_KERNEL); - if (!ac) - return 0; - - n = session_alloc(ac); - if (n < 0) - goto fail_session; - ac->session = n; - - if (bufsz > 0) { - ac->buf[0].phys = pmem_kalloc(bufsz, - PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - ac->buf[0].data = ioremap(ac->buf[0].phys, bufsz); - if (!ac->buf[0].data) - goto fail; - ac->buf[1].phys = pmem_kalloc(bufsz, - PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - ac->buf[1].data = ioremap(ac->buf[1].phys, bufsz); - if (!ac->buf[1].data) - goto fail; - - ac->buf[0].size = bufsz; - ac->buf[1].size = bufsz; - } - - init_waitqueue_head(&ac->wait); - ac->client = adsp; - - return ac; - -fail: - session_free(n, ac); -fail_session: - audio_client_free(ac); - return 0; -} - -void audio_client_dump(struct audio_client *ac) -{ - dal_trace_dump(ac->client); -} - -static int audio_ioctl(struct audio_client *ac, void *ptr, uint32_t len) -{ - struct adsp_command_hdr *hdr = ptr; - uint32_t tmp; - int r; - - hdr->size = len - sizeof(u32); - hdr->dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP); - hdr->src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP); - hdr->context = ac->session; - ac->cb_status = -EBUSY; - r = dal_call(ac->client, AUDIO_OP_CONTROL, 5, ptr, len, &tmp, sizeof(tmp)); - if (r != 4) - return -EIO; - if (!wait_event_timeout(ac->wait, (ac->cb_status != -EBUSY), 5*HZ)) { - dal_trace_dump(ac->client); - pr_err("[%s:%s] timeout. dsp dead?\n", __MM_FILE__, __func__); - q6audio_dsp_not_responding(); - } - return ac->cb_status; -} - -static int audio_command(struct audio_client *ac, uint32_t cmd) -{ - struct adsp_command_hdr rpc; - memset(&rpc, 0, sizeof(rpc)); - rpc.opcode = cmd; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_open_control(struct audio_client *ac) -{ - struct adsp_open_command rpc; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_DEVICE; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_out_open(struct audio_client *ac, uint32_t bufsz, - uint32_t rate, uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 1; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - rpc.buf_max_size = bufsz; - - pr_debug("[%s:%s]ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_in_open(struct audio_client *ac, uint32_t bufsz, - uint32_t flags, uint32_t rate, uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 1; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - if (flags == AUDIO_FLAG_READ) - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - else - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD; - - rpc.buf_max_size = bufsz; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_auxpcm_out_open(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 1; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.mode = ADSP_AUDIO_OPEN_STREAM_MODE_AUX_PCM; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_auxpcm_in_open(struct audio_client *ac, uint32_t rate, - uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 1; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.mode = ADSP_AUDIO_OPEN_STREAM_MODE_AUX_PCM; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_mp3_open(struct audio_client *ac, uint32_t bufsz, - uint32_t rate, uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_MP3; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - rpc.buf_max_size = bufsz; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_dtmf_open(struct audio_client *ac, - uint32_t rate, uint32_t channels) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_DTMF; - rpc.format.standard.channels = channels; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = rate; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_aac_open(struct audio_client *ac, uint32_t bufsz, - uint32_t sample_rate, uint32_t channels, - uint32_t bit_rate, uint32_t flags, - uint32_t stream_format) -{ - struct adsp_open_command rpc; - int audio_object_type; - int index = sizeof(u32); - u32 *aac_type = NULL; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.binary.format = ADSP_AUDIO_FORMAT_MPEG4_AAC; - /* only 48k sample rate is supported */ - sample_rate = 3; - /* AAC OBJECT LC */ - audio_object_type = 2; - - aac_type = (u32 *)rpc.format.binary.data; - switch (stream_format) { - case AUDIO_AAC_FORMAT_ADTS: - /* AAC Encoder expect MPEG4_ADTS media type */ - *aac_type = ADSP_AUDIO_AAC_MPEG4_ADTS; - break; - case AUDIO_AAC_FORMAT_RAW: - /* for ADIF recording */ - *aac_type = ADSP_AUDIO_AAC_RAW; - break; - } - - rpc.format.binary.data[index++] = (u8)( - ((audio_object_type & 0x1F) << 3) | - ((sample_rate >> 1) & 0x7)); - rpc.format.binary.data[index] = (u8)( - ((sample_rate & 0x1) << 7) | - ((channels & 0x7) << 3)); - rpc.format.binary.num_bytes = index + 1; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - - if (flags == AUDIO_FLAG_READ) - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - else - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD; - - rpc.buf_max_size = bufsz; - rpc.config.aac.bit_rate = bit_rate; - rpc.config.aac.encoder_mode = ADSP_AUDIO_ENC_AAC_LC_ONLY_MODE; - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_qcp_open(struct audio_client *ac, uint32_t bufsz, - uint32_t min_rate, uint32_t max_rate, - uint32_t flags, uint32_t format) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = format; - rpc.format.standard.channels = 1; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = 8000; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - - if (flags == AUDIO_FLAG_READ) - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - else - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD; - rpc.buf_max_size = bufsz; - rpc.config.evrc.min_rate = min_rate; - rpc.config.evrc.max_rate = max_rate; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_amrnb_open(struct audio_client *ac, uint32_t bufsz, - uint32_t enc_mode, uint32_t flags, - uint32_t dtx_enable) -{ - struct adsp_open_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.format.standard.format = ADSP_AUDIO_FORMAT_AMRNB_FS; - rpc.format.standard.channels = 1; - rpc.format.standard.bits_per_sample = 16; - rpc.format.standard.sampling_rate = 8000; - rpc.format.standard.is_signed = 1; - rpc.format.standard.is_interleaved = 0; - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; - rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; - - if (flags == AUDIO_FLAG_READ) - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; - else - rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD; - - rpc.buf_max_size = bufsz; - rpc.config.amr.mode = enc_mode; - rpc.config.amr.dtx_mode = dtx_enable; - rpc.config.amr.enable = 1; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - - - -static int audio_close(struct audio_client *ac) -{ - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_STREAM_STOP); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_CLOSE); - return 0; -} - -static int audio_set_table(struct audio_client *ac, - uint32_t device_id, int size) -{ - struct adsp_set_dev_cfg_table_command rpc; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG_TABLE; - if (q6_device_to_dir(device_id) == Q6_TX) { - if (tx_clk_freq > 16000) - rpc.hdr.data = 48000; - else if (tx_clk_freq > 8000) - rpc.hdr.data = 16000; - else - rpc.hdr.data = 8000; - } - rpc.device_id = device_id; - rpc.phys_addr = audio_phys; - rpc.phys_size = size; - rpc.phys_used = size; - - pr_debug("[%s:%s] ac = %p, device_id = 0x%x, size = %d\n", __MM_FILE__, - __func__, ac, device_id, size); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -int q6audio_read(struct audio_client *ac, struct audio_buffer *ab) -{ - struct adsp_buffer_command rpc; - uint32_t res; - int r; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.size = sizeof(rpc) - sizeof(u32); - rpc.hdr.dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP); - rpc.hdr.src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP); - rpc.hdr.context = ac->session; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_TX; - rpc.buffer.addr = ab->phys; - rpc.buffer.max_size = ab->size; - rpc.buffer.actual_size = ab->actual_size; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc), - &res, sizeof(res)); - return 0; -} - -int q6audio_write(struct audio_client *ac, struct audio_buffer *ab) -{ - struct adsp_buffer_command rpc; - uint32_t res; - int r; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.size = sizeof(rpc) - sizeof(u32); - rpc.hdr.dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP); - rpc.hdr.src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP); - rpc.hdr.context = ac->session; - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_RX; - rpc.buffer.addr = ab->phys; - rpc.buffer.max_size = ab->size; - rpc.buffer.actual_size = ab->actual_size; - - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc), - &res, sizeof(res)); - return 0; -} - -static int audio_rx_volume(struct audio_client *ac, uint32_t dev_id, int32_t volume) -{ - struct adsp_set_dev_volume_command rpc; - - pr_debug("[%s:%s] volume = %d\n", __MM_FILE__, __func__, volume); - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL; - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_RX; - rpc.volume = volume; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_rx_mute(struct audio_client *ac, uint32_t dev_id, int mute) -{ - struct adsp_set_dev_mute_command rpc; - - pr_debug("[%s:%s] mute = %d, dev_id = 0x%x\n", __MM_FILE__, - __func__, mute, dev_id); - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE; - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_RX; - rpc.mute = !!mute; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_tx_mute(struct audio_client *ac, uint32_t dev_id, int mute) -{ - struct adsp_set_dev_mute_command rpc; - - pr_debug("[%s:%s] mute = %d\n", __MM_FILE__, __func__, mute); - if (mute < 0 || mute > 3) { - pr_err("[%s:%s] invalid mute status %d\n", __MM_FILE__, - __func__, mute); - return -EINVAL; - } - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE; - if ((mute == STREAM_UNMUTE) || (mute == STREAM_MUTE)) { - rpc.device_id = ADSP_AUDIO_DEVICE_ID_VOICE; - rpc.path = ADSP_PATH_TX_CNG_DIS; - } else { - rpc.device_id = dev_id; - rpc.path = ADSP_PATH_TX; - } - mute &= 0x01; - rpc.mute = !!mute; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int audio_stream_volume(struct audio_client *ac, int volume) -{ - struct adsp_set_volume_command rpc; - int rc; - - pr_debug("[%s:%s] volume = %d\n", __MM_FILE__, __func__, volume); - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_STREAM_VOL; - rpc.volume = volume; - rc = audio_ioctl(ac, &rpc, sizeof(rpc)); - return rc; -} - -static int audio_stream_mute(struct audio_client *ac, int mute) -{ - struct adsp_set_mute_command rpc; - int rc; - - pr_debug("[%s:%s] mute = %d\n", __MM_FILE__, __func__, mute); - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_STREAM_MUTE; - rpc.mute = mute; - rc = audio_ioctl(ac, &rpc, sizeof(rpc)); - return rc; -} - -static void callback(void *data, int len, void *cookie) -{ - struct adsp_event_hdr *e = data; - struct audio_client *ac; - struct adsp_buffer_event *abe = data; - - if (e->context >= SESSION_MAX) { - pr_err("[%s:%s] bogus session %d\n", __MM_FILE__, __func__, - e->context); - return; - } - ac = session[e->context]; - if (!ac) { - pr_err("[%s:%s] unknown session %d\n", __MM_FILE__, __func__, - e->context); - return; - } - - if (e->event_id == ADSP_AUDIO_IOCTL_CMD_STREAM_EOS) { - pr_debug("[%s:%s] CB Stream eos, ac = %p\n", - __MM_FILE__, __func__, ac); - if (e->status) - pr_err("[%s:%s] playback status %d\n", __MM_FILE__, - __func__, e->status); - if (ac->cb_status == -EBUSY) { - ac->cb_status = e->status; - wake_up(&ac->wait); - } - return; - } - - if (e->event_id == ADSP_AUDIO_EVT_STATUS_BUF_DONE) { - pr_debug("[%s:%s] CB done, ac = %p, status = %d\n", - __MM_FILE__, __func__, ac, e->status); - if (e->status) - pr_err("[%s:%s] buffer status %d\n", __MM_FILE__, - __func__, e->status); - - ac->buf[ac->dsp_buf].actual_size = abe->buffer.actual_size; - ac->buf[ac->dsp_buf].used = 0; - ac->dsp_buf ^= 1; - wake_up(&ac->wait); - return; - } - - pr_debug("[%s:%s] ac = %p, event_id = 0x%x, status = %d\n", - __MM_FILE__, __func__, ac, e->event_id, e->status); - if (e->status) - pr_warning("audio_cb: s=%d e=%08x status=%d\n", - e->context, e->event_id, e->status); - if (ac->cb_status == -EBUSY) { - ac->cb_status = e->status; - wake_up(&ac->wait); - } -} - -static void audio_init(struct dal_client *client) -{ - u32 tmp[3]; - - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - tmp[0] = 2 * sizeof(u32); - tmp[1] = 0; - tmp[2] = 0; - dal_call(client, AUDIO_OP_INIT, 5, tmp, sizeof(tmp), - tmp, sizeof(u32)); -} - -static struct audio_client *ac_control; - -static int q6audio_init(void) -{ - struct audio_client *ac = 0; - int res; - - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - mutex_lock(&audio_lock); - if (ac_control) { - res = 0; - goto done; - } - - pr_info("[%s:%s] codecs\n", __MM_FILE__, __func__); - icodec_rx_clk = clk_get(0, "icodec_rx_clk"); - icodec_tx_clk = clk_get(0, "icodec_tx_clk"); - ecodec_clk = clk_get(0, "ecodec_clk"); - sdac_clk = clk_get(0, "sdac_clk"); - audio_phys = pmem_kalloc(4096, PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K); - audio_data = ioremap(audio_phys, 4096); - - pr_info("[%s:%s] attach ADSP\n", __MM_FILE__, __func__); - adsp = dal_attach(AUDIO_DAL_DEVICE, AUDIO_DAL_PORT, 1, - callback, 0); - if (!adsp) { - pr_err("[%s:%s] cannot attach to adsp\n", __MM_FILE__, - __func__); - res = -ENODEV; - goto done; - } - pr_info("[%s:%s] INIT\n", __MM_FILE__, __func__); - audio_init(adsp); - dal_trace(adsp); - - ac = audio_client_alloc(0); - if (!ac) { - pr_err("[%s:%s] cannot allocate client\n", - __MM_FILE__, __func__); - res = -ENOMEM; - goto done; - } - - pr_info("[%s:%s] OPEN control\n", __MM_FILE__, __func__); - if (audio_open_control(ac)) { - pr_err("[%s:%s] cannot open control channel\n", - __MM_FILE__, __func__); - res = -ENODEV; - goto done; - } - - pr_info("[%s:%s] attach ACDB\n", __MM_FILE__, __func__); - acdb = dal_attach(ACDB_DAL_DEVICE, ACDB_DAL_PORT, 0, 0, 0); - if (!acdb) { - pr_err("[%s:%s] cannot attach to acdb channel\n", - __MM_FILE__, __func__); - res = -ENODEV; - goto done; - } - - pr_info("[%s:%s] attach ADIE\n", __MM_FILE__, __func__); - adie = dal_attach(ADIE_DAL_DEVICE, ADIE_DAL_PORT, 0, 0, 0); - if (!adie) { - pr_err("[%s:%s] cannot attach to adie\n", - __MM_FILE__, __func__); - res = -ENODEV; - goto done; - } - if (analog_ops->init) - analog_ops->init(); - - res = 0; - ac_control = ac; - - pm_qos_add_request(&pm_qos_req, PM_QOS_CPU_DMA_LATENCY, - PM_QOS_DEFAULT_VALUE); - wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "audio_pcm_suspend"); -done: - if ((res < 0) && ac) - audio_client_free(ac); - mutex_unlock(&audio_lock); - - pr_debug("[%s:%s] res = %d\n", __MM_FILE__, __func__, res); - return res; -} - -struct audio_config_data { - uint32_t device_id; - uint32_t sample_rate; - uint32_t offset; - uint32_t length; -}; - -struct audio_config_database { - uint8_t magic[8]; - uint32_t entry_count; - uint32_t unused; - struct audio_config_data entry[0]; -}; - -void *acdb_data; -const struct firmware *acdb_fw; -extern struct miscdevice q6_control_device; - -static int acdb_get_config_table(uint32_t device_id, uint32_t sample_rate) -{ - struct acdb_cmd_device_table rpc; - struct acdb_result res; - int r; - - pr_debug("[%s:%s] device_id = 0x%x, samplerate = %d\n", __MM_FILE__, - __func__, device_id, sample_rate); - if (q6audio_init()) - return 0; - - memset(audio_data, 0, 4096); - memset(&rpc, 0, sizeof(rpc)); - - rpc.size = sizeof(rpc) - (2 * sizeof(uint32_t)); - rpc.command_id = ACDB_GET_DEVICE_TABLE; - rpc.device_id = device_id; - rpc.sample_rate_id = sample_rate; - rpc.total_bytes = 4096; - rpc.unmapped_buf = audio_phys; - rpc.res_size = sizeof(res) - (2 * sizeof(uint32_t)); - - r = dal_call(acdb, ACDB_OP_IOCTL, 8, &rpc, sizeof(rpc), - &res, sizeof(res)); - - if ((r == sizeof(res)) && (res.dal_status == 0)) - return res.used_bytes; - - return -EIO; -} - -static uint32_t audio_rx_path_id = ADIE_PATH_HANDSET_RX; -static uint32_t audio_rx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR; -static uint32_t audio_rx_device_group = -1; -static uint32_t audio_tx_path_id = ADIE_PATH_HANDSET_TX; -static uint32_t audio_tx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_MIC; -static uint32_t audio_tx_device_group = -1; - -static int qdsp6_devchg_notify(struct audio_client *ac, - uint32_t dev_type, uint32_t dev_id) -{ - struct adsp_device_switch_command rpc; - - if (dev_type != ADSP_AUDIO_RX_DEVICE && - dev_type != ADSP_AUDIO_TX_DEVICE) - return -EINVAL; - - memset(&rpc, 0, sizeof(rpc)); - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_PREPARE; - if (dev_type == ADSP_AUDIO_RX_DEVICE) { - rpc.old_device = audio_rx_device_id; - rpc.new_device = dev_id; - } else { - rpc.old_device = audio_tx_device_id; - rpc.new_device = dev_id; - } - rpc.device_class = 0; - rpc.device_type = dev_type; - pr_debug("[%s:%s] dev_id = 0x%x\n", __MM_FILE__, __func__, dev_id); - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -static int qdsp6_standby(struct audio_client *ac) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_STANDBY); -} - -static int qdsp6_start(struct audio_client *ac) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_COMMIT); -} - -static void audio_rx_analog_enable(int en) -{ - pr_debug("[%s:%s] audio_rx_device_id = 0x%x, en = %d\n", __MM_FILE__, - __func__, audio_rx_device_id, en); - switch (audio_rx_device_id) { - case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO: - case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO: - case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR: - if (analog_ops->headset_enable) - analog_ops->headset_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET: - if (analog_ops->headset_enable) - analog_ops->headset_enable(en); - if (analog_ops->speaker_enable) - analog_ops->speaker_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO: - if (analog_ops->speaker_enable) - analog_ops->speaker_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR: - if (analog_ops->bt_sco_enable) - analog_ops->bt_sco_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR: - if (analog_ops->receiver_enable) - analog_ops->receiver_enable(en); - break; - } -} - -static void audio_tx_analog_enable(int en) -{ - pr_debug("[%s:%s] audio_tx_device_id = 0x%x, en = %d\n", __MM_FILE__, - __func__, audio_tx_device_id, en); - switch (audio_tx_device_id) { - case ADSP_AUDIO_DEVICE_ID_HANDSET_MIC: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC: - if (analog_ops->int_mic_enable) - analog_ops->int_mic_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_HEADSET_MIC: - case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC: - case ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC: - case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC: - if (analog_ops->ext_mic_enable) - analog_ops->ext_mic_enable(en); - break; - case ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC: - if (analog_ops->bt_sco_enable) - analog_ops->bt_sco_enable(en); - break; - } -} - -static int audio_update_acdb(uint32_t adev, uint32_t acdb_id) -{ - uint32_t sample_rate; - int sz; - - pr_debug("[%s:%s] adev = 0x%x, acdb_id = 0x%x\n", __MM_FILE__, - __func__, adev, acdb_id); - if (q6_device_to_dir(adev) == Q6_RX) { - rx_acdb = acdb_id; - sample_rate = q6_device_to_rate(adev); - } else { - - tx_acdb = acdb_id; - if (tx_clk_freq > 16000) - sample_rate = 48000; - else if (tx_clk_freq > 8000) - sample_rate = 16000; - else - sample_rate = 8000; - } - - if (acdb_id == 0) - acdb_id = q6_device_to_cad_id(adev); - - sz = acdb_get_config_table(acdb_id, sample_rate); - audio_set_table(ac_control, adev, sz); - - return 0; -} - -static void adie_rx_path_enable(uint32_t acdb_id) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - if (audio_rx_path_id) { - adie_enable(); - adie_set_path(adie, audio_rx_path_id, ADIE_PATH_RX); - adie_set_path_freq_plan(adie, ADIE_PATH_RX, 48000); - - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_DIGITAL_READY); - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_DIGITAL_ANALOG_READY); - } -} - -static void q6_rx_path_enable(int reconf, uint32_t acdb_id) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - if (!reconf) - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, audio_rx_device_id); - audio_update_acdb(audio_rx_device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); -} - -static void _audio_rx_path_enable(int reconf, uint32_t acdb_id) -{ - pr_debug("[%s:%s] reconf = %d\n", __MM_FILE__, __func__, reconf); - q6_rx_path_enable(reconf, acdb_id); - if (audio_rx_path_id) - adie_rx_path_enable(acdb_id); - audio_rx_analog_enable(1); -} - -static void _audio_tx_path_enable(int reconf, uint32_t acdb_id) -{ - pr_debug("[%s:%s] reconf = %d, tx_clk_freq = %d\n", __MM_FILE__, - __func__, reconf, tx_clk_freq); - audio_tx_analog_enable(1); - - if (audio_tx_path_id) { - adie_enable(); - adie_set_path(adie, audio_tx_path_id, ADIE_PATH_TX); - - if (tx_clk_freq > 16000) - adie_set_path_freq_plan(adie, ADIE_PATH_TX, 48000); - else if (tx_clk_freq > 8000) - adie_set_path_freq_plan(adie, ADIE_PATH_TX, 16000); - else - adie_set_path_freq_plan(adie, ADIE_PATH_TX, 8000); - - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_DIGITAL_READY); - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_DIGITAL_ANALOG_READY); - } - - - if (!reconf) - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, - audio_tx_device_id); - audio_update_acdb(audio_tx_device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - - audio_tx_mute(ac_control, audio_tx_device_id, tx_mute_status); -} - -static void _audio_rx_path_disable(void) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - audio_rx_analog_enable(0); - - if (audio_rx_path_id) { - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_ANALOG_OFF); - adie_proceed_to_stage(adie, ADIE_PATH_RX, - ADIE_STAGE_DIGITAL_OFF); - adie_disable(); - } -} - -static void _audio_tx_path_disable(void) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - audio_tx_analog_enable(0); - - if (audio_tx_path_id) { - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_ANALOG_OFF); - adie_proceed_to_stage(adie, ADIE_PATH_TX, - ADIE_STAGE_DIGITAL_OFF); - adie_disable(); - } -} - -static int icodec_rx_clk_refcount; -static int icodec_tx_clk_refcount; -static int ecodec_clk_refcount; -static int sdac_clk_refcount; - -static void ecodec_clk_enable(void) -{ - ecodec_clk_refcount++; - if (ecodec_clk_refcount == 1) { - clk_set_rate(ecodec_clk, 2048000); - clk_enable(ecodec_clk); - } -} -static void ecodec_clk_disable(int group_reset, int path) -{ - ecodec_clk_refcount--; - if (ecodec_clk_refcount == 0) { - clk_disable(ecodec_clk); - if (group_reset) { - if (path == ADSP_PATH_TX) - audio_tx_device_group = -1; - else - audio_rx_device_group = -1; - } - } -} -static void _audio_rx_clk_enable(void) -{ - uint32_t device_group = q6_device_to_codec(audio_rx_device_id); - - pr_debug("[%s:%s] rx_clk_refcount = %d\n", __MM_FILE__, __func__, - icodec_rx_clk_refcount); - switch(device_group) { - case Q6_ICODEC_RX: - icodec_rx_clk_refcount++; - if (icodec_rx_clk_refcount == 1) { - clk_set_rate(icodec_rx_clk, 12288000); - clk_enable(icodec_rx_clk); - } - break; - case Q6_ECODEC_RX: - ecodec_clk_enable(); - break; - case Q6_SDAC_RX: - sdac_clk_refcount++; - if (sdac_clk_refcount == 1) { - clk_set_rate(sdac_clk, 12288000); - clk_enable(sdac_clk); - } - break; - default: - return; - } - audio_rx_device_group = device_group; -} - -static void _audio_tx_clk_enable(void) -{ - uint32_t device_group = q6_device_to_codec(audio_tx_device_id); - uint32_t icodec_tx_clk_rate; - - pr_debug("[%s:%s] tx_clk_refcount = %d\n", __MM_FILE__, __func__, - icodec_tx_clk_refcount); - switch (device_group) { - case Q6_ICODEC_TX: - icodec_tx_clk_refcount++; - if (icodec_tx_clk_refcount == 1) { - if (tx_clk_freq > 16000) - icodec_tx_clk_rate = 48000; - else if (tx_clk_freq > 8000) - icodec_tx_clk_rate = 16000; - else - icodec_tx_clk_rate = 8000; - - clk_set_rate(icodec_tx_clk, icodec_tx_clk_rate * 256); - clk_enable(icodec_tx_clk); - } - break; - case Q6_ECODEC_TX: - ecodec_clk_enable(); - break; - case Q6_SDAC_TX: - /* TODO: In QCT BSP, clk rate was set to 20480000 */ - sdac_clk_refcount++; - if (sdac_clk_refcount == 1) { - clk_set_rate(sdac_clk, 12288000); - clk_enable(sdac_clk); - } - break; - default: - return; - } - audio_tx_device_group = device_group; -} - -static void _audio_rx_clk_disable(void) -{ - pr_debug("[%s:%s] rx_clk_refcount = %d\n", __MM_FILE__, __func__, - icodec_rx_clk_refcount); - switch (audio_rx_device_group) { - case Q6_ICODEC_RX: - icodec_rx_clk_refcount--; - if (icodec_rx_clk_refcount == 0) { - clk_disable(icodec_rx_clk); - audio_rx_device_group = -1; - } - break; - case Q6_ECODEC_RX: - ecodec_clk_disable(1, ADSP_PATH_RX); - break; - case Q6_SDAC_RX: - sdac_clk_refcount--; - if (sdac_clk_refcount == 0) { - clk_disable(sdac_clk); - audio_rx_device_group = -1; - } - break; - default: - pr_err("[%s:%s] invalid rx device group %d\n", __MM_FILE__, - __func__, audio_rx_device_group); - break; - } -} - -static void _audio_tx_clk_disable(void) -{ - pr_debug("[%s:%s] tx_clk_refcount = %d\n", __MM_FILE__, __func__, - icodec_tx_clk_refcount); - switch (audio_tx_device_group) { - case Q6_ICODEC_TX: - icodec_tx_clk_refcount--; - if (icodec_tx_clk_refcount == 0) { - clk_disable(icodec_tx_clk); - audio_tx_device_group = -1; - } - break; - case Q6_ECODEC_TX: - ecodec_clk_disable(1, ADSP_PATH_TX); - break; - case Q6_SDAC_TX: - sdac_clk_refcount--; - if (sdac_clk_refcount == 0) { - clk_disable(sdac_clk); - audio_tx_device_group = -1; - } - break; - default: - pr_err("[%s:%s] invalid tx device group %d\n", - __MM_FILE__, __func__, audio_tx_device_group); - break; - } -} - -static void _audio_rx_clk_reinit(uint32_t rx_device, uint32_t acdb_id) -{ - uint32_t device_group = q6_device_to_codec(rx_device); - - pr_debug("[%s:%s] rx_device = 0x%x\n", __MM_FILE__, __func__, - rx_device); - if (device_group != audio_rx_device_group) - _audio_rx_clk_disable(); - - audio_rx_device_id = rx_device; - audio_rx_path_id = q6_device_to_path(rx_device, acdb_id); - - if (device_group != audio_rx_device_group) - _audio_rx_clk_enable(); - -} - -static void _audio_tx_clk_reinit(uint32_t tx_device, uint32_t acdb_id) -{ - uint32_t device_group = q6_device_to_codec(tx_device); - - pr_debug("[%s:%s] tx_device = 0x%x\n", __MM_FILE__, __func__, - tx_device); - if (device_group != audio_tx_device_group) - _audio_tx_clk_disable(); - - audio_tx_device_id = tx_device; - audio_tx_path_id = q6_device_to_path(tx_device, acdb_id); - - if (device_group != audio_tx_device_group) - _audio_tx_clk_enable(); -} - -static DEFINE_MUTEX(audio_path_lock); -static int audio_rx_path_refcount; -static int audio_tx_path_refcount; - -static int audio_rx_path_enable(int en, uint32_t acdb_id) -{ - pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en); - mutex_lock(&audio_path_lock); - if (en) { - audio_rx_path_refcount++; - if (audio_rx_path_refcount == 1) { - _audio_rx_clk_enable(); - _audio_rx_path_enable(0, acdb_id); - } - } else { - audio_rx_path_refcount--; - if (audio_rx_path_refcount == 0) { - _audio_rx_path_disable(); - _audio_rx_clk_disable(); - } - } - mutex_unlock(&audio_path_lock); - return 0; -} - -static int audio_tx_path_enable(int en, uint32_t acdb_id) -{ - pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en); - mutex_lock(&audio_path_lock); - if (en) { - audio_tx_path_refcount++; - if (audio_tx_path_refcount == 1) { - _audio_tx_clk_enable(); - _audio_tx_path_enable(0, acdb_id); - } - } else { - audio_tx_path_refcount--; - if (audio_tx_path_refcount == 0) { - _audio_tx_path_disable(); - _audio_tx_clk_disable(); - } - } - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_update_acdb(uint32_t id_src, uint32_t id_dst) -{ - int res; - - pr_debug("[%s:%s] id_src = 0x%x\n, id_dst = 0x%x\n", __MM_FILE__, - __func__, id_src, id_dst); - if (q6audio_init()) - return 0; - - mutex_lock(&audio_path_lock); - - if (q6_device_to_dir(id_dst) == Q6_RX) - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, id_dst); - else - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, id_dst); - res = audio_update_acdb(id_dst, id_src); - if (res) - goto done; - - qdsp6_standby(ac_control); - qdsp6_start(ac_control); -done: - mutex_unlock(&audio_path_lock); - return res; -} - -int q6audio_set_tx_mute(int mute) -{ - uint32_t adev; - int rc; - - if (q6audio_init()) - return 0; - - mutex_lock(&audio_path_lock); - - if (mute == tx_mute_status) { - mutex_unlock(&audio_path_lock); - return 0; - } - - adev = audio_tx_device_id; - rc = audio_tx_mute(ac_control, adev, mute); - - /* DSP caches the requested MUTE state when it cannot apply the state - immediately. In that case, it returns EUNSUPPORTED and applies the - cached state later */ - if ((rc == ADSP_AUDIO_STATUS_SUCCESS) || - (rc == ADSP_AUDIO_STATUS_EUNSUPPORTED)) { - pr_debug("[%s:%s] return status = %d\n", - __MM_FILE__, __func__, rc); - tx_mute_status = mute; - } - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_stream_volume(struct audio_client *ac, int vol) -{ - if (vol > 1200 || vol < -4000) { - pr_err("[%s:%s] unsupported volume level %d\n", __MM_FILE__, - __func__, vol); - return -EINVAL; - } - mutex_lock(&audio_path_lock); - audio_stream_mute(ac, 0); - audio_stream_volume(ac, vol); - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_rx_volume(int level) -{ - uint32_t adev; - int vol; - - pr_debug("[%s:%s] level = %d\n", __MM_FILE__, __func__, level); - if (q6audio_init()) - return 0; - - if (level < 0 || level > 100) - return -EINVAL; - - mutex_lock(&audio_path_lock); - adev = ADSP_AUDIO_DEVICE_ID_VOICE; - - if (level) { - vol = q6_device_volume(audio_rx_device_id, level); - audio_rx_mute(ac_control, adev, 0); - audio_rx_volume(ac_control, adev, vol); - } else - audio_rx_mute(ac_control, adev, 1); - - rx_vol_level = level; - mutex_unlock(&audio_path_lock); - return 0; -} - -static void do_rx_routing(uint32_t device_id, uint32_t acdb_id) -{ - pr_debug("[%s:%s] device_id = 0x%x, acdb_id = 0x%x\n", __MM_FILE__, - __func__, device_id, acdb_id); - if (device_id == audio_rx_device_id && - audio_rx_path_id == q6_device_to_path(device_id, acdb_id)) { - if (acdb_id != rx_acdb) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, device_id); - audio_update_acdb(device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - } - return; - } - - if (audio_rx_path_refcount > 0) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, device_id); - _audio_rx_path_disable(); - _audio_rx_clk_reinit(device_id, acdb_id); - _audio_rx_path_enable(1, acdb_id); - } else { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, - device_id); - audio_update_acdb(device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - audio_rx_device_id = device_id; - audio_rx_path_id = q6_device_to_path(device_id, acdb_id); - } -} - -static void do_tx_routing(uint32_t device_id, uint32_t acdb_id) -{ - pr_debug("[%s:%s] device_id = 0x%x, acdb_id = 0x%x\n", __MM_FILE__, - __func__, device_id, acdb_id); - if (device_id == audio_tx_device_id && - audio_tx_path_id == q6_device_to_path(device_id, acdb_id)) { - if (acdb_id != tx_acdb) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, - device_id); - audio_update_acdb(device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - } - return; - } - - if (audio_tx_path_refcount > 0) { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, device_id); - _audio_tx_path_disable(); - _audio_tx_clk_reinit(device_id, acdb_id); - _audio_tx_path_enable(1, acdb_id); - } else { - qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, - device_id); - audio_update_acdb(device_id, acdb_id); - qdsp6_standby(ac_control); - qdsp6_start(ac_control); - audio_tx_device_id = device_id; - audio_tx_path_id = q6_device_to_path(device_id, acdb_id); - tx_acdb = acdb_id; - } -} - -int q6audio_do_routing(uint32_t device_id, uint32_t acdb_id) -{ - if (q6audio_init()) - return 0; - - mutex_lock(&audio_path_lock); - - switch(q6_device_to_dir(device_id)) { - case Q6_RX: - do_rx_routing(device_id, acdb_id); - break; - case Q6_TX: - do_tx_routing(device_id, acdb_id); - break; - } - - mutex_unlock(&audio_path_lock); - return 0; -} - -int q6audio_set_route(const char *name) -{ - uint32_t route; - if (!strcmp(name, "speaker")) { - route = ADIE_PATH_SPEAKER_STEREO_RX; - } else if (!strcmp(name, "headphones")) { - route = ADIE_PATH_HEADSET_STEREO_RX; - } else if (!strcmp(name, "handset")) { - route = ADIE_PATH_HANDSET_RX; - } else { - return -EINVAL; - } - - mutex_lock(&audio_path_lock); - if (route == audio_rx_path_id) - goto done; - - audio_rx_path_id = route; - - if (audio_rx_path_refcount > 0) { - _audio_rx_path_disable(); - _audio_rx_path_enable(1, 0); - } - if (audio_tx_path_refcount > 0) { - _audio_tx_path_disable(); - _audio_tx_path_enable(1, 0); - } -done: - mutex_unlock(&audio_path_lock); - return 0; -} - -static int audio_stream_equalizer(struct audio_client *ac, void *eq_config) -{ - int i; - struct adsp_set_equalizer_command rpc; - struct adsp_audio_eq_stream_config *eq_cfg; - eq_cfg = (struct adsp_audio_eq_stream_config *) eq_config; - - memset(&rpc, 0, sizeof(rpc)); - - rpc.hdr.opcode = ADSP_AUDIO_IOCTL_SET_SESSION_EQ_CONFIG; - rpc.enable = eq_cfg->enable; - rpc.num_bands = eq_cfg->num_bands; - for (i = 0; i < eq_cfg->num_bands; i++) { - rpc.eq_bands[i].band_idx = eq_cfg->eq_bands[i].band_idx; - rpc.eq_bands[i].filter_type = eq_cfg->eq_bands[i].filter_type; - rpc.eq_bands[i].center_freq_hz = - eq_cfg->eq_bands[i].center_freq_hz; - rpc.eq_bands[i].filter_gain = eq_cfg->eq_bands[i].filter_gain; - rpc.eq_bands[i].q_factor = eq_cfg->eq_bands[i].q_factor; - } - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} - -int q6audio_set_stream_eq_pcm(struct audio_client *ac, void *eq_config) -{ - int rc = 0; - mutex_lock(&audio_path_lock); - rc = audio_stream_equalizer(ac, eq_config); - mutex_unlock(&audio_path_lock); - return rc; -} - -struct audio_client *q6audio_open_auxpcm(uint32_t rate, - uint32_t channels, uint32_t flags, uint32_t acdb_id) -{ - int rc, retry = 5; - struct audio_client *ac; - - pr_debug("[%s:%s] rate = %d, channels = %d\n", __MM_FILE__, __func__, - rate, channels); - if (q6audio_init()) - return NULL; - ac = audio_client_alloc(0); - if (!ac) - return NULL; - - ac->flags = flags; - - mutex_lock(&audio_path_lock); - - if (ac->flags & AUDIO_FLAG_WRITE) { - audio_tx_path_refcount++; - if (audio_tx_path_refcount == 1) { - tx_clk_freq = rate; - _audio_tx_clk_enable(); - _audio_tx_path_enable(0, acdb_id); - } - } else { - audio_rx_path_refcount++; - if (audio_rx_path_refcount == 1) { - _audio_rx_clk_enable(); - _audio_rx_path_enable(0, acdb_id); - } - } - - ecodec_clk_enable(); - - for (retry = 5;; retry--) { - if (ac->flags & AUDIO_FLAG_WRITE) - rc = audio_auxpcm_out_open(ac, rate, channels); - else - rc = audio_auxpcm_in_open(ac, rate, channels); - if (rc == 0) - break; - if (retry == 0) - q6audio_dsp_not_responding(); - - pr_err("[%s:%s] open pcm error %d, retrying\n", - __MM_FILE__, __func__, rc); - msleep(1); - } - - mutex_unlock(&audio_path_lock); - - for (retry = 5;; retry--) { - rc = audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - if (rc == 0) - break; - if (retry == 0) - q6audio_dsp_not_responding(); - - pr_err("[%s:%s] stream start error %d, retrying\n", - __MM_FILE__, __func__, rc); - } - audio_prevent_sleep(); - return ac; - -} - -struct audio_client *q6audio_open_pcm(uint32_t bufsz, uint32_t rate, - uint32_t channels, uint32_t flags, uint32_t acdb_id) -{ - int rc, retry = 5; - struct audio_client *ac; - - pr_debug("[%s:%s] bufsz = %d, rate = %d, channels = %d\n", __MM_FILE__, - __func__, bufsz, rate, channels); - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = flags; - - mutex_lock(&audio_path_lock); - - if (ac->flags & AUDIO_FLAG_WRITE) { - audio_rx_path_refcount++; - if (audio_rx_path_refcount == 1) { - _audio_rx_clk_enable(); - q6_rx_path_enable(0, acdb_id); - adie_rx_path_enable(acdb_id); - } - } else { - /* TODO: consider concurrency with voice call */ - audio_tx_path_refcount++; - if (audio_tx_path_refcount == 1) { - tx_clk_freq = rate; - _audio_tx_clk_enable(); - _audio_tx_path_enable(0, acdb_id); - } - } - - for (retry = 5;;retry--) { - if (ac->flags & AUDIO_FLAG_WRITE) - rc = audio_out_open(ac, bufsz, rate, channels); - else - rc = audio_in_open(ac, bufsz, flags, rate, channels); - if (rc == 0) - break; - if (retry == 0) - q6audio_dsp_not_responding(); - - pr_err("[%s:%s] open pcm error %d, retrying\n", - __MM_FILE__, __func__, rc); - msleep(1); - } - - if (ac->flags & AUDIO_FLAG_WRITE) { - if (audio_rx_path_refcount == 1) - audio_rx_analog_enable(1); - } - mutex_unlock(&audio_path_lock); - - for (retry = 5;;retry--) { - rc = audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - if (rc == 0) - break; - if (retry == 0) - q6audio_dsp_not_responding(); - - pr_err("[%s:%s] stream start error %d, retrying\n", - __MM_FILE__, __func__, rc); - } - - if (!(ac->flags & AUDIO_FLAG_WRITE)) { - ac->buf[0].used = 1; - ac->buf[1].used = 1; - q6audio_read(ac, &ac->buf[0]); - q6audio_read(ac, &ac->buf[1]); - } - - audio_prevent_sleep(); - return ac; -} - -int q6audio_close(struct audio_client *ac) -{ - audio_close(ac); - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(0, 0); - else - audio_tx_path_enable(0, 0); - audio_client_free(ac); - audio_allow_sleep(); - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return 0; -} - -int q6audio_auxpcm_close(struct audio_client *ac) -{ - audio_close(ac); - if (ac->flags & AUDIO_FLAG_WRITE) { - audio_tx_path_enable(0, 0); - ecodec_clk_disable(0, ADSP_PATH_RX); - } else { - audio_rx_path_enable(0, 0); - ecodec_clk_disable(0, ADSP_PATH_TX); - } - - audio_client_free(ac); - audio_allow_sleep(); - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - return 0; -} -struct audio_client *q6voice_open(uint32_t flags) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] flags = %d\n", __MM_FILE__, __func__, flags); - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(0); - if (!ac) - return 0; - - ac->flags = flags; - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(1, rx_acdb); - else { - if (!audio_tx_path_refcount) - tx_clk_freq = 8000; - audio_tx_path_enable(1, tx_acdb); - } - - return ac; -} - -int q6voice_close(struct audio_client *ac) -{ - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(0, 0); - else - audio_tx_path_enable(0, 0); - - tx_mute_status = 0; - audio_client_free(ac); - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return 0; -} - -struct audio_client *q6audio_open_mp3(uint32_t bufsz, uint32_t rate, - uint32_t channels, uint32_t acdb_id) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] bufsz = %d, rate = %d\n, channels = %d", - __MM_FILE__, __func__, bufsz, rate, channels); - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = AUDIO_FLAG_WRITE; - audio_rx_path_enable(1, acdb_id); - - audio_mp3_open(ac, bufsz, rate, channels); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - mutex_lock(&audio_path_lock); - audio_rx_mute(ac_control, audio_rx_device_id, 0); - audio_rx_volume(ac_control, audio_rx_device_id, - q6_device_volume(audio_rx_device_id, rx_vol_level)); - mutex_unlock(&audio_path_lock); - return ac; -} - -struct audio_client *q6audio_open_dtmf(uint32_t rate, - uint32_t channels, uint32_t acdb_id) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] rate = %d\n, channels = %d", __MM_FILE__, __func__, - rate, channels); - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(0); - if (!ac) - return 0; - - ac->flags = AUDIO_FLAG_WRITE; - audio_rx_path_enable(1, acdb_id); - - audio_dtmf_open(ac, rate, channels); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - mutex_lock(&audio_path_lock); - audio_rx_mute(ac_control, audio_rx_device_id, 0); - audio_rx_volume(ac_control, audio_rx_device_id, - q6_device_volume(audio_rx_device_id, rx_vol_level)); - mutex_unlock(&audio_path_lock); - - return ac; -} - -int q6audio_play_dtmf(struct audio_client *ac, uint16_t dtmf_hi, - uint16_t dtmf_low, uint16_t duration, uint16_t rx_gain) -{ - struct adsp_audio_dtmf_start_command dtmf_cmd; - - pr_debug("[%s:%s] high = %d, low = %d\n", __MM_FILE__, __func__, - dtmf_hi, dtmf_low); - - dtmf_cmd.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_START; - dtmf_cmd.hdr.response_type = ADSP_AUDIO_RESPONSE_COMMAND; - dtmf_cmd.tone1_hz = dtmf_hi; - dtmf_cmd.tone2_hz = dtmf_low; - dtmf_cmd.duration_usec = duration * 1000; - dtmf_cmd.gain_mb = rx_gain; - - return audio_ioctl(ac, &dtmf_cmd, - sizeof(struct adsp_audio_dtmf_start_command)); - -} - -int q6audio_mp3_close(struct audio_client *ac) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - audio_close(ac); - audio_rx_path_enable(0, 0); - audio_client_free(ac); - return 0; -} - - -struct audio_client *q6audio_open_aac(uint32_t bufsz, uint32_t samplerate, - uint32_t channels, uint32_t bitrate, - uint32_t stream_format, uint32_t flags, - uint32_t acdb_id) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] bufsz = %d, samplerate = %d, channels = %d\n", - __MM_FILE__, __func__, bufsz, samplerate, channels); - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = flags; - - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(1, acdb_id); - else{ - if (!audio_tx_path_refcount) - tx_clk_freq = 48000; - audio_tx_path_enable(1, acdb_id); - } - - audio_aac_open(ac, bufsz, samplerate, channels, bitrate, flags, - stream_format); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - if (!(ac->flags & AUDIO_FLAG_WRITE)) { - ac->buf[0].used = 1; - ac->buf[1].used = 1; - q6audio_read(ac, &ac->buf[0]); - q6audio_read(ac, &ac->buf[1]); - } - audio_prevent_sleep(); - return ac; -} - - -struct audio_client *q6audio_open_qcp(uint32_t bufsz, uint32_t min_rate, - uint32_t max_rate, uint32_t flags, - uint32_t format, uint32_t acdb_id) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] bufsz = %d\n", __MM_FILE__, __func__, bufsz); - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = flags; - - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(1, acdb_id); - else{ - if (!audio_tx_path_refcount) - tx_clk_freq = 8000; - audio_tx_path_enable(1, acdb_id); - } - - audio_qcp_open(ac, bufsz, min_rate, max_rate, flags, format); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - if (!(ac->flags & AUDIO_FLAG_WRITE)) { - ac->buf[0].used = 1; - ac->buf[1].used = 1; - q6audio_read(ac, &ac->buf[0]); - q6audio_read(ac, &ac->buf[1]); - } - audio_prevent_sleep(); - return ac; -} - -struct audio_client *q6audio_open_amrnb(uint32_t bufsz, uint32_t enc_mode, - uint32_t dtx_mode_enable, - uint32_t flags, uint32_t acdb_id) -{ - struct audio_client *ac; - - pr_debug("[%s:%s] bufsz = %d, dtx_mode = %d\n", __MM_FILE__, - __func__, bufsz, dtx_mode_enable); - - if (q6audio_init()) - return 0; - - ac = audio_client_alloc(bufsz); - if (!ac) - return 0; - - ac->flags = flags; - if (ac->flags & AUDIO_FLAG_WRITE) - audio_rx_path_enable(1, acdb_id); - else{ - if (!audio_tx_path_refcount) - tx_clk_freq = 8000; - audio_tx_path_enable(1, acdb_id); - } - - audio_amrnb_open(ac, bufsz, enc_mode, flags, dtx_mode_enable); - audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START); - - if (!(ac->flags & AUDIO_FLAG_WRITE)) { - ac->buf[0].used = 1; - ac->buf[1].used = 1; - q6audio_read(ac, &ac->buf[0]); - q6audio_read(ac, &ac->buf[1]); - } - audio_prevent_sleep(); - return ac; -} - -int q6audio_async(struct audio_client *ac) -{ - struct adsp_command_hdr rpc; - pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac); - memset(&rpc, 0, sizeof(rpc)); - rpc.opcode = ADSP_AUDIO_IOCTL_CMD_STREAM_EOS; - rpc.response_type = ADSP_AUDIO_RESPONSE_ASYNC; - return audio_ioctl(ac, &rpc, sizeof(rpc)); -} diff --git a/arch/arm/mach-msm/qdsp6/q6audio_devices.h b/arch/arm/mach-msm/qdsp6/q6audio_devices.h deleted file mode 100644 index d316ab0e0de9..000000000000 --- a/arch/arm/mach-msm/qdsp6/q6audio_devices.h +++ /dev/null @@ -1,334 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/q6audio_devices.h - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -struct q6_device_info { - uint32_t id; - uint32_t cad_id; - uint32_t path; - uint32_t rate; - uint8_t dir; - uint8_t codec; - uint8_t hw; -}; - -#define Q6_ICODEC_RX 0 -#define Q6_ICODEC_TX 1 -#define Q6_ECODEC_RX 2 -#define Q6_ECODEC_TX 3 -#define Q6_SDAC_RX 6 -#define Q6_SDAC_TX 7 -#define Q6_CODEC_NONE 255 - -#define Q6_TX 1 -#define Q6_RX 2 -#define Q6_TX_RX 3 - -#define Q6_HW_HANDSET 0 -#define Q6_HW_HEADSET 1 -#define Q6_HW_SPEAKER 2 -#define Q6_HW_TTY 3 -#define Q6_HW_BT_SCO 4 -#define Q6_HW_BT_A2DP 5 - -#define Q6_HW_COUNT 6 - -#define CAD_HW_DEVICE_ID_HANDSET_MIC 0x01 -#define CAD_HW_DEVICE_ID_HANDSET_SPKR 0x02 -#define CAD_HW_DEVICE_ID_HEADSET_MIC 0x03 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO 0x04 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO 0x05 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_MIC 0x06 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_MONO 0x07 -#define CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO 0x08 -#define CAD_HW_DEVICE_ID_BT_SCO_MIC 0x09 -#define CAD_HW_DEVICE_ID_BT_SCO_SPKR 0x0A -#define CAD_HW_DEVICE_ID_BT_A2DP_SPKR 0x0B -#define CAD_HW_DEVICE_ID_TTY_HEADSET_MIC 0x0C -#define CAD_HW_DEVICE_ID_TTY_HEADSET_SPKR 0x0D - -#define CAD_HW_DEVICE_ID_DEFAULT_TX 0x0E -#define CAD_HW_DEVICE_ID_DEFAULT_RX 0x0F - - -#define CAD_HW_DEVICE_ID_SPKR_PHONE_DUAL_MIC_BROADSIDE 0x2B -#define CAD_HW_DEVICE_ID_SPKR_PHONE_DUAL_MIC_ENDFIRE 0x2D -#define CAD_HW_DEVICE_ID_HANDSET_DUAL_MIC_BROADSIDE 0x2C -#define CAD_HW_DEVICE_ID_HANDSET_DUAL_MIC_ENDFIRE 0x2E - -/* Logical Device to indicate A2DP routing */ -#define CAD_HW_DEVICE_ID_BT_A2DP_TX 0x10 -#define CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX 0x11 -#define CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_STEREO_RX 0x12 -#define CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_MONO_RX 0x13 -#define CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX 0x14 - -#define CAD_HW_DEVICE_ID_VOICE 0x15 - -#define CAD_HW_DEVICE_ID_I2S_RX 0x20 -#define CAD_HW_DEVICE_ID_I2S_TX 0x21 - -/* AUXPGA */ -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO_LB 0x22 -#define CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO_LB 0x23 -#define CAD_HW_DEVICE_ID_SPEAKER_SPKR_STEREO_LB 0x24 -#define CAD_HW_DEVICE_ID_SPEAKER_SPKR_MONO_LB 0x25 - -#define CAD_HW_DEVICE_ID_NULL_RX 0x2A - -#define CAD_HW_DEVICE_ID_MAX_NUM 0x2F - -#define CAD_HW_DEVICE_ID_INVALID 0xFF - -#define CAD_RX_DEVICE 0x00 -#define CAD_TX_DEVICE 0x01 - -static struct q6_device_info q6_audio_devices[] = { - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_SPKR, - .path = ADIE_PATH_HANDSET_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_SPKR_MONO, - .path = ADIE_PATH_HEADSET_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_SPKR_STEREO, - .path = ADIE_PATH_HEADSET_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_MONO, - .path = ADIE_PATH_SPEAKER_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_STEREO, - .path = ADIE_PATH_SPEAKER_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_MONO_RX, - .path = ADIE_PATH_SPKR_MONO_HDPH_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_MONO_RX, - .path = ADIE_PATH_SPKR_MONO_HDPH_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MONO_PLUS_SPKR_STEREO_RX, - .path = ADIE_PATH_SPKR_STEREO_HDPH_MONO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_STEREO_PLUS_SPKR_STEREO_RX, - .path = ADIE_PATH_SPKR_STEREO_HDPH_STEREO_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR, - .cad_id = CAD_HW_DEVICE_ID_TTY_HEADSET_SPKR, - .path = ADIE_PATH_TTY_HEADSET_RX, - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ICODEC_RX, - .hw = Q6_HW_TTY, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_MIC, - .path = ADIE_PATH_HANDSET_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HEADSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_HEADSET_MIC, - .path = ADIE_PATH_HEADSET_MONO_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_MIC, - .path = ADIE_PATH_SPEAKER_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_DUAL_MIC_ENDFIRE, - .path = ADIE_CODEC_HANDSET_SPKR_EF_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC, - .cad_id = CAD_HW_DEVICE_ID_HANDSET_DUAL_MIC_BROADSIDE, - .path = ADIE_CODEC_HANDSET_SPKR_BS_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HANDSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_DUAL_MIC_ENDFIRE, - .path = ADIE_CODEC_HANDSET_SPKR_EF_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC, - .cad_id = CAD_HW_DEVICE_ID_SPKR_PHONE_DUAL_MIC_BROADSIDE, - .path = ADIE_CODEC_HANDSET_SPKR_BS_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC, - .cad_id = CAD_HW_DEVICE_ID_TTY_HEADSET_MIC, - .path = ADIE_PATH_TTY_HEADSET_TX, - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ICODEC_TX, - .hw = Q6_HW_HEADSET, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_SPKR, - .path = 0, /* XXX */ - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ECODEC_RX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_A2DP_SPKR, - .cad_id = CAD_HW_DEVICE_ID_BT_A2DP_SPKR, - .path = 0, /* XXX */ - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_ECODEC_RX, - .hw = Q6_HW_BT_A2DP, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_MIC, - .path = 0, /* XXX */ - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ECODEC_TX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_I2S_SPKR, - .cad_id = CAD_HW_DEVICE_ID_I2S_RX, - .path = 0, /* XXX */ - .rate = 48000, - .dir = Q6_RX, - .codec = Q6_SDAC_RX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_I2S_MIC, - .cad_id = CAD_HW_DEVICE_ID_I2S_TX, - .path = 0, /* XXX */ - .rate = 16000, - .dir = Q6_TX, - .codec = Q6_SDAC_TX, - .hw = Q6_HW_SPEAKER, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_AUXPCM_RX, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_SPKR, - .path = 0, /* XXX */ - .rate = 8000, - .dir = Q6_RX, - .codec = Q6_ECODEC_RX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = ADSP_AUDIO_DEVICE_ID_AUXPCM_TX, - .cad_id = CAD_HW_DEVICE_ID_BT_SCO_MIC, - .path = 0, /* XXX */ - .rate = 8000, - .dir = Q6_TX, - .codec = Q6_ECODEC_TX, - .hw = Q6_HW_BT_SCO, - }, - { - .id = 0, - .cad_id = 0, - .path = 0, - .rate = 8000, - .dir = 0, - .codec = Q6_CODEC_NONE, - .hw = 0, - }, -}; - diff --git a/arch/arm/mach-msm/qdsp6/qcelp_in.c b/arch/arm/mach-msm/qdsp6/qcelp_in.c deleted file mode 100644 index 42896123a332..000000000000 --- a/arch/arm/mach-msm/qdsp6/qcelp_in.c +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright (C) 2009 Google, Inc. - * Copyright (C) 2009 HTC Corporation - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "dal_audio_format.h" -#include - -#define QCELP_FC_BUFF_CNT 10 -#define QCELP_READ_TIMEOUT 2000 -struct qcelp_fc_buff { - struct mutex lock; - int empty; - void *data; - int size; - int actual_size; -}; - -struct qcelp_fc { - struct task_struct *task; - wait_queue_head_t fc_wq; - struct qcelp_fc_buff fc_buff[QCELP_FC_BUFF_CNT]; - int buff_index; -}; - -struct qcelp { - struct mutex lock; - struct msm_audio_qcelp_enc_config cfg; - struct msm_audio_stream_config str_cfg; - struct audio_client *audio_client; - struct msm_voicerec_mode voicerec_mode; - struct qcelp_fc *qcelp_fc; -}; - - -static int q6_qcelp_flowcontrol(void *data) -{ - struct audio_client *ac; - struct audio_buffer *ab; - struct qcelp *qcelp = data; - int buff_index = 0; - int xfer = 0; - struct qcelp_fc *fc; - - - ac = qcelp->audio_client; - fc = qcelp->qcelp_fc; - if (!ac) { - pr_err("[%s:%s] audio_client is NULL\n", __MM_FILE__, __func__); - return 0; - } - - while (!kthread_should_stop()) { - ab = ac->buf + ac->cpu_buf; - if (ab->used) - wait_event(ac->wait, (ab->used == 0)); - - pr_debug("[%s:%s] ab->data = %p, cpu_buf = %d", __MM_FILE__, - __func__, ab->data, ac->cpu_buf); - xfer = ab->actual_size; - - - mutex_lock(&(fc->fc_buff[buff_index].lock)); - if (!fc->fc_buff[buff_index].empty) { - pr_err("[%s:%s] flow control buffer[%d] not read!\n", - __MM_FILE__, __func__, buff_index); - } - - if (fc->fc_buff[buff_index].size < xfer) { - pr_err("[%s:%s] buffer %d too small\n", __MM_FILE__, - __func__, buff_index); - memcpy(fc->fc_buff[buff_index].data, ab->data, - fc->fc_buff[buff_index].size); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = - fc->fc_buff[buff_index].size; - } else { - memcpy(fc->fc_buff[buff_index].data, ab->data, xfer); - fc->fc_buff[buff_index].empty = 0; - fc->fc_buff[buff_index].actual_size = xfer; - } - mutex_unlock(&(fc->fc_buff[buff_index].lock)); - /*wake up client, if any*/ - wake_up(&fc->fc_wq); - - buff_index++; - if (buff_index >= QCELP_FC_BUFF_CNT) - buff_index = 0; - - ab->used = 1; - - q6audio_read(ac, ab); - ac->cpu_buf ^= 1; - } - - return 0; -} -static long q6_qcelp_in_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct qcelp *qcelp = file->private_data; - int rc = 0; - int i = 0; - struct qcelp_fc *fc; - int size = 0; - - mutex_lock(&qcelp->lock); - switch (cmd) { - case AUDIO_SET_VOLUME: - pr_debug("[%s:%s] SET_VOLUME\n", __MM_FILE__, __func__); - break; - case AUDIO_GET_STATS: - { - struct msm_audio_stats stats; - pr_debug("[%s:%s] GET_STATS\n", __MM_FILE__, __func__); - memset(&stats, 0, sizeof(stats)); - if (copy_to_user((void *) arg, &stats, - sizeof(stats))) - return -EFAULT; - return 0; - } - case AUDIO_START: - { - uint32_t acdb_id; - pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); - if (arg == 0) { - acdb_id = 0; - } else { - if (copy_from_user(&acdb_id, - (void *) arg, sizeof(acdb_id))) { - rc = -EFAULT; - break; - } - } - if (qcelp->audio_client) { - pr_err("[%s:%s] active session already existing\n", - __MM_FILE__, __func__); - rc = -EBUSY; - break; - } else { - qcelp->audio_client = q6audio_open_qcp( - qcelp->str_cfg.buffer_size, - qcelp->cfg.min_bit_rate, - qcelp->cfg.max_bit_rate, - qcelp->voicerec_mode.rec_mode, - ADSP_AUDIO_FORMAT_V13K_FS, - acdb_id); - - if (!qcelp->audio_client) { - pr_err("[%s:%s] qcelp open session failed\n", - __MM_FILE__, __func__); - kfree(qcelp); - rc = -ENOMEM; - break; - } - } - - /*allocate flow control buffers*/ - fc = qcelp->qcelp_fc; - size = qcelp->str_cfg.buffer_size; - for (i = 0; i < QCELP_FC_BUFF_CNT; ++i) { - mutex_init(&(fc->fc_buff[i].lock)); - fc->fc_buff[i].empty = 1; - fc->fc_buff[i].data = kmalloc(size, GFP_KERNEL); - if (fc->fc_buff[i].data == NULL) { - pr_err("[%s:%s] No memory for FC buffers\n", - __MM_FILE__, __func__); - rc = -ENOMEM; - goto fc_fail; - } - fc->fc_buff[i].size = size; - fc->fc_buff[i].actual_size = 0; - } - - /*create flow control thread*/ - fc->task = kthread_run(q6_qcelp_flowcontrol, - qcelp, "qcelp_flowcontrol"); - if (IS_ERR(fc->task)) { - rc = PTR_ERR(fc->task); - pr_err("[%s:%s] error creating flow control thread\n", - __MM_FILE__, __func__); - goto fc_fail; - } - break; -fc_fail: - /*free flow control buffers*/ - --i; - for (; i >= 0; i--) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - break; - } - case AUDIO_STOP: - pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); - break; - case AUDIO_FLUSH: - break; - case AUDIO_SET_INCALL: { - pr_debug("[%s:%s] SET_INCALL\n", __MM_FILE__, __func__); - if (copy_from_user(&qcelp->voicerec_mode, - (void *)arg, sizeof(struct msm_voicerec_mode))) - rc = -EFAULT; - - if (qcelp->voicerec_mode.rec_mode != AUDIO_FLAG_READ - && qcelp->voicerec_mode.rec_mode != - AUDIO_FLAG_INCALL_MIXED) { - qcelp->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - pr_err("[%s:%s] Invalid rec_mode\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - break; - } - case AUDIO_GET_STREAM_CONFIG: - if (copy_to_user((void *)arg, &qcelp->str_cfg, - sizeof(struct msm_audio_stream_config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, qcelp->str_cfg.buffer_size, - qcelp->str_cfg.buffer_count); - break; - case AUDIO_SET_STREAM_CONFIG: - if (copy_from_user(&qcelp->str_cfg, (void *)arg, - sizeof(struct msm_audio_stream_config))) { - rc = -EFAULT; - break; - } - pr_debug("[%s:%s] SET_STREAM_CONFIG: buffsz=%d, buffcnt=%d\n", - __MM_FILE__, __func__, qcelp->str_cfg.buffer_size, - qcelp->str_cfg.buffer_count); - - if (qcelp->str_cfg.buffer_size < 35) { - pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, - __func__); - rc = -EINVAL; - break; - } - - if (qcelp->str_cfg.buffer_count != 2) - pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, - __func__); - break; - case AUDIO_SET_QCELP_ENC_CONFIG: - if (copy_from_user(&qcelp->cfg, (void *) arg, - sizeof(struct msm_audio_qcelp_enc_config))) - rc = -EFAULT; - pr_debug("[%s:%s] SET_QCELP_ENC_CONFIG\n", __MM_FILE__, - __func__); - - if (qcelp->cfg.min_bit_rate > 4 || - qcelp->cfg.min_bit_rate < 1) { - - pr_err("[%s:%s] invalid min bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - if (qcelp->cfg.max_bit_rate > 4 || - qcelp->cfg.max_bit_rate < 1) { - - pr_err("[%s:%s] invalid max bitrate\n", __MM_FILE__, - __func__); - rc = -EINVAL; - } - - break; - case AUDIO_GET_QCELP_ENC_CONFIG: - if (copy_to_user((void *) arg, &qcelp->cfg, - sizeof(struct msm_audio_qcelp_enc_config))) - rc = -EFAULT; - pr_debug("[%s:%s] GET_QCELP_ENC_CONFIG\n", __MM_FILE__, - __func__); - break; - - default: - rc = -EINVAL; - } - mutex_unlock(&qcelp->lock); - pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); - return rc; -} - -static int q6_qcelp_in_open(struct inode *inode, struct file *file) -{ - struct qcelp *qcelp; - struct qcelp_fc *fc; - int i; - pr_info("[%s:%s] open\n", __MM_FILE__, __func__); - qcelp = kmalloc(sizeof(struct qcelp), GFP_KERNEL); - if (qcelp == NULL) { - pr_err("[%s:%s] Could not allocate memory for qcelp driver\n", - __MM_FILE__, __func__); - return -ENOMEM; - } - - mutex_init(&qcelp->lock); - file->private_data = qcelp; - qcelp->audio_client = NULL; - qcelp->str_cfg.buffer_size = 35; - qcelp->str_cfg.buffer_count = 2; - qcelp->cfg.cdma_rate = CDMA_RATE_FULL; - qcelp->cfg.min_bit_rate = 1; - qcelp->cfg.max_bit_rate = 4; - qcelp->voicerec_mode.rec_mode = AUDIO_FLAG_READ; - - qcelp->qcelp_fc = kmalloc(sizeof(struct qcelp_fc), GFP_KERNEL); - if (qcelp->qcelp_fc == NULL) { - pr_err("[%s:%s] Could not allocate memory for qcelp_fc\n", - __MM_FILE__, __func__); - kfree(qcelp); - return -ENOMEM; - } - fc = qcelp->qcelp_fc; - fc->task = NULL; - fc->buff_index = 0; - for (i = 0; i < QCELP_FC_BUFF_CNT; ++i) { - fc->fc_buff[i].data = NULL; - fc->fc_buff[i].size = 0; - fc->fc_buff[i].actual_size = 0; - } - /*initialize wait queue head*/ - init_waitqueue_head(&fc->fc_wq); - return 0; -} - -static ssize_t q6_qcelp_in_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - struct audio_client *ac; - const char __user *start = buf; - struct qcelp *qcelp = file->private_data; - struct qcelp_fc *fc; - int xfer = 0; - int res = 0; - - pr_debug("[%s:%s] count = %d\n", __MM_FILE__, __func__, count); - mutex_lock(&qcelp->lock); - ac = qcelp->audio_client; - if (!ac) { - res = -ENODEV; - goto fail; - } - fc = qcelp->qcelp_fc; - while (count > xfer) { - /*wait for buffer to full*/ - if (fc->fc_buff[fc->buff_index].empty != 0) { - res = wait_event_interruptible_timeout(fc->fc_wq, - (fc->fc_buff[fc->buff_index].empty == 0), - msecs_to_jiffies(QCELP_READ_TIMEOUT)); - - pr_debug("[%s:%s] buff_index = %d\n", __MM_FILE__, - __func__, fc->buff_index); - if (res == 0) { - pr_err("[%s:%s] Timeout!\n", __MM_FILE__, - __func__); - res = -ETIMEDOUT; - goto fail; - } else if (res < 0) { - pr_err("[%s:%s] Returning on Interrupt\n", - __MM_FILE__, __func__); - goto fail; - } - } - /*lock the buffer*/ - mutex_lock(&(fc->fc_buff[fc->buff_index].lock)); - xfer = fc->fc_buff[fc->buff_index].actual_size; - - if (xfer > count) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] read failed! byte count too small\n", - __MM_FILE__, __func__); - res = -EINVAL; - goto fail; - } - - if (copy_to_user(buf, fc->fc_buff[fc->buff_index].data, xfer)) { - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - pr_err("[%s:%s] copy_to_user failed at index %d\n", - __MM_FILE__, __func__, fc->buff_index); - res = -EFAULT; - goto fail; - } - buf += xfer; - count -= xfer; - - fc->fc_buff[fc->buff_index].empty = 1; - fc->fc_buff[fc->buff_index].actual_size = 0; - - mutex_unlock(&(fc->fc_buff[fc->buff_index].lock)); - ++(fc->buff_index); - if (fc->buff_index >= QCELP_FC_BUFF_CNT) - fc->buff_index = 0; - } - res = buf - start; - -fail: - mutex_unlock(&qcelp->lock); - - return res; -} - -static int q6_qcelp_in_release(struct inode *inode, struct file *file) -{ - int rc = 0; - struct qcelp *qcelp = file->private_data; - int i = 0; - struct qcelp_fc *fc; - - mutex_lock(&qcelp->lock); - fc = qcelp->qcelp_fc; - kthread_stop(fc->task); - fc->task = NULL; - - /*free flow control buffers*/ - for (i = 0; i < QCELP_FC_BUFF_CNT; ++i) { - kfree(fc->fc_buff[i].data); - fc->fc_buff[i].data = NULL; - } - kfree(fc); - - if (qcelp->audio_client) - rc = q6audio_close(qcelp->audio_client); - mutex_unlock(&qcelp->lock); - kfree(qcelp); - pr_info("[%s:%s] release\n", __MM_FILE__, __func__); - return rc; -} - -static const struct file_operations q6_qcelp_in_fops = { - .owner = THIS_MODULE, - .open = q6_qcelp_in_open, - .read = q6_qcelp_in_read, - .release = q6_qcelp_in_release, - .unlocked_ioctl = q6_qcelp_in_ioctl, -}; - -struct miscdevice q6_qcelp_in_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_qcelp_in", - .fops = &q6_qcelp_in_fops, -}; - -static int __init q6_qcelp_in_init(void) -{ - return misc_register(&q6_qcelp_in_misc); -} - -device_initcall(q6_qcelp_in_init); diff --git a/arch/arm/mach-msm/qdsp6/routing.c b/arch/arm/mach-msm/qdsp6/routing.c deleted file mode 100644 index f6533a40c2bf..000000000000 --- a/arch/arm/mach-msm/qdsp6/routing.c +++ /dev/null @@ -1,78 +0,0 @@ -/* arch/arm/mach-msm/qdsp6/routing.c - * - * Copyright (C) 2009 Google, Inc. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include - -extern int q6audio_set_route(const char *name); - -static int q6_open(struct inode *inode, struct file *file) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return 0; -} - -static ssize_t q6_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - char cmd[32]; - - pr_debug("[%s:%s] count = %d", __MM_FILE__, __func__, count); - if (count >= sizeof(cmd)) { - pr_err("[%s:%s] invalid count %d\n", __MM_FILE__, - __func__, count); - return -EINVAL; - } - if (copy_from_user(cmd, buf, count)) - return -EFAULT; - cmd[count] = 0; - - if ((count > 1) && (cmd[count-1] == '\n')) - cmd[count-1] = 0; - - q6audio_set_route(cmd); - - return count; -} - -static int q6_release(struct inode *inode, struct file *file) -{ - pr_debug("[%s:%s]\n", __MM_FILE__, __func__); - return 0; -} - -static struct file_operations q6_fops = { - .owner = THIS_MODULE, - .open = q6_open, - .write = q6_write, - .release = q6_release, -}; - -static struct miscdevice q6_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_audio_route", - .fops = &q6_fops, -}; - - -static int __init q6_init(void) { - return misc_register(&q6_misc); -} - -device_initcall(q6_init); diff --git a/arch/arm/mach-msm/qdsp6v2/apr_v1.c b/arch/arm/mach-msm/qdsp6v2/apr_v1.c deleted file mode 100644 index d7ed9194260e..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/apr_v1.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -static const char *lpass_subsys_name = "lpass"; - -struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn, - uint32_t src_port, void *priv) -{ - struct apr_client *client; - int client_id = 0; - int svc_idx = 0; - int svc_id = 0; - int dest_id = 0; - int temp_port = 0; - struct apr_svc *svc = NULL; - int rc = 0; - - if (!dest || !svc_name || !svc_fn) - return NULL; - - if (!strncmp(dest, "ADSP", 4)) - dest_id = APR_DEST_QDSP6; - else if (!strncmp(dest, "MODEM", 5)) { - dest_id = APR_DEST_MODEM; - } else { - pr_err("APR: wrong destination\n"); - goto done; - } - - if (dest_id == APR_DEST_QDSP6 && - apr_get_q6_state() == APR_SUBSYS_DOWN) { - pr_info("%s: Wait for Lpass to bootup\n", __func__); - rc = apr_wait_for_device_up(dest_id); - if (rc == 0) { - pr_err("%s: DSP is not Up\n", __func__); - return NULL; - } - pr_info("%s: Lpass Up\n", __func__); - } else if (dest_id == APR_DEST_MODEM && - (apr_get_modem_state() == APR_SUBSYS_DOWN)) { - pr_info("%s: Wait for modem to bootup\n", __func__); - rc = apr_wait_for_device_up(dest_id); - if (rc == 0) { - pr_err("%s: Modem is not Up\n", __func__); - return NULL; - } - pr_info("%s: modem Up\n", __func__); - } - - if (apr_get_svc(svc_name, dest_id, &client_id, &svc_idx, &svc_id)) { - pr_err("%s: apr_get_svc failed\n", __func__); - goto done; - } - - /* APRv1 loads ADSP image automatically */ - apr_load_adsp_image(); - - client = apr_get_client(dest_id, client_id); - mutex_lock(&client->m_lock); - if (!client->handle) { - client->handle = apr_tal_open(client_id, dest_id, APR_DL_SMD, - apr_cb_func, NULL); - if (!client->handle) { - svc = NULL; - pr_err("APR: Unable to open handle\n"); - mutex_unlock(&client->m_lock); - goto done; - } - } - mutex_unlock(&client->m_lock); - svc = &client->svc[svc_idx]; - mutex_lock(&svc->m_lock); - client->id = client_id; - if (svc->need_reset) { - mutex_unlock(&svc->m_lock); - pr_err("APR: Service needs reset\n"); - goto done; - } - svc->priv = priv; - svc->id = svc_id; - svc->dest_id = dest_id; - svc->client_id = client_id; - if (src_port != 0xFFFFFFFF) { - temp_port = ((src_port >> 8) * 8) + (src_port & 0xFF); - pr_debug("port = %d t_port = %d\n", src_port, temp_port); - if (temp_port >= APR_MAX_PORTS || temp_port < 0) { - pr_err("APR: temp_port out of bounds\n"); - mutex_unlock(&svc->m_lock); - return NULL; - } - if (!svc->port_cnt && !svc->svc_cnt) - client->svc_cnt++; - svc->port_cnt++; - svc->port_fn[temp_port] = svc_fn; - svc->port_priv[temp_port] = priv; - } else { - if (!svc->fn) { - if (!svc->port_cnt && !svc->svc_cnt) - client->svc_cnt++; - svc->fn = svc_fn; - if (svc->port_cnt) - svc->svc_cnt++; - } - } - - mutex_unlock(&svc->m_lock); -done: - return svc; -} - -void apr_set_subsys_state(void) -{ - apr_set_q6_state(APR_SUBSYS_UP); - apr_set_modem_state(APR_SUBSYS_UP); -} - -const char *apr_get_lpass_subsys_name(void) -{ - return lpass_subsys_name; -} diff --git a/arch/arm/mach-msm/qdsp6v2/audio_acdb.c b/arch/arm/mach-msm/qdsp6v2/audio_acdb.c deleted file mode 100644 index 0218e2fcaf5b..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/audio_acdb.c +++ /dev/null @@ -1,964 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define MAX_NETWORKS 15 -#define MAX_IOCTL_DATA (MAX_NETWORKS * 2) -#define MAX_COL_SIZE 324 - -#define ACDB_BLOCK_SIZE 4096 -#define NUM_VOCPROC_BLOCKS (6 * MAX_NETWORKS) -#define ACDB_TOTAL_VOICE_ALLOCATION (ACDB_BLOCK_SIZE * NUM_VOCPROC_BLOCKS) - - -struct sidetone_atomic_cal { - atomic_t enable; - atomic_t gain; -}; - - -struct acdb_data { - struct mutex acdb_mutex; - - /* ANC Cal */ - struct acdb_atomic_cal_block anc_cal; - - /* AudProc Cal */ - atomic_t asm_topology; - atomic_t adm_topology[MAX_AUDPROC_TYPES]; - struct acdb_atomic_cal_block audproc_cal[MAX_AUDPROC_TYPES]; - struct acdb_atomic_cal_block audstrm_cal[MAX_AUDPROC_TYPES]; - struct acdb_atomic_cal_block audvol_cal[MAX_AUDPROC_TYPES]; - - /* VocProc Cal */ - atomic_t voice_rx_topology; - atomic_t voice_tx_topology; - struct acdb_atomic_cal_block vocproc_cal[MAX_NETWORKS]; - struct acdb_atomic_cal_block vocstrm_cal[MAX_NETWORKS]; - struct acdb_atomic_cal_block vocvol_cal[MAX_NETWORKS]; - /* size of cal block tables above*/ - atomic_t vocproc_cal_size; - atomic_t vocstrm_cal_size; - atomic_t vocvol_cal_size; - /* Total size of cal data for all networks */ - atomic_t vocproc_total_cal_size; - atomic_t vocstrm_total_cal_size; - atomic_t vocvol_total_cal_size; - - /* AFE cal */ - struct acdb_atomic_cal_block afe_cal[MAX_AUDPROC_TYPES]; - - /* Sidetone Cal */ - struct sidetone_atomic_cal sidetone_cal; - - /* Allocation information */ - struct ion_client *ion_client; - struct ion_handle *ion_handle; - atomic_t map_handle; - atomic64_t paddr; - atomic64_t kvaddr; - atomic64_t mem_len; -}; - -static struct acdb_data acdb_data; -static atomic_t usage_count; - -uint32_t get_voice_rx_topology(void) -{ - return atomic_read(&acdb_data.voice_rx_topology); -} - -void store_voice_rx_topology(uint32_t topology) -{ - atomic_set(&acdb_data.voice_rx_topology, topology); -} - -uint32_t get_voice_tx_topology(void) -{ - return atomic_read(&acdb_data.voice_tx_topology); -} - -void store_voice_tx_topology(uint32_t topology) -{ - atomic_set(&acdb_data.voice_tx_topology, topology); -} - -uint32_t get_adm_rx_topology(void) -{ - return atomic_read(&acdb_data.adm_topology[RX_CAL]); -} - -void store_adm_rx_topology(uint32_t topology) -{ - atomic_set(&acdb_data.adm_topology[RX_CAL], topology); -} - -uint32_t get_adm_tx_topology(void) -{ - return atomic_read(&acdb_data.adm_topology[TX_CAL]); -} - -void store_adm_tx_topology(uint32_t topology) -{ - atomic_set(&acdb_data.adm_topology[TX_CAL], topology); -} - -uint32_t get_asm_topology(void) -{ - return atomic_read(&acdb_data.asm_topology); -} - -void store_asm_topology(uint32_t topology) -{ - atomic_set(&acdb_data.asm_topology, topology); -} - -void get_voice_cal_allocation(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_paddr); - cal_block->cal_size = ACDB_TOTAL_VOICE_ALLOCATION; -} - -void get_all_voice_cal(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.vocproc_total_cal_size) + - atomic_read(&acdb_data.vocstrm_total_cal_size) + - atomic_read(&acdb_data.vocvol_total_cal_size); -} - -void get_all_cvp_cal(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.vocproc_total_cal_size) + - atomic_read(&acdb_data.vocvol_total_cal_size); -} - -void get_all_vocproc_cal(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocproc_cal[0].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.vocproc_total_cal_size); -} - -void get_all_vocstrm_cal(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocstrm_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocstrm_cal[0].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.vocstrm_total_cal_size); -} - -void get_all_vocvol_cal(struct acdb_cal_block *cal_block) -{ - cal_block->cal_kvaddr = - atomic_read(&acdb_data.vocvol_cal[0].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.vocvol_cal[0].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.vocvol_total_cal_size); -} - -void get_anc_cal(struct acdb_cal_block *cal_block) -{ - pr_debug("%s\n", __func__); - - if (cal_block == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - - cal_block->cal_kvaddr = - atomic_read(&acdb_data.anc_cal.cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.anc_cal.cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.anc_cal.cal_size); -done: - return; -} - -void store_anc_cal(struct cal_block *cal_block) -{ - pr_debug("%s,\n", __func__); - - if (cal_block->cal_offset > atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_block->cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - goto done; - } - - atomic_set(&acdb_data.anc_cal.cal_kvaddr, - cal_block->cal_offset + atomic64_read(&acdb_data.kvaddr)); - atomic_set(&acdb_data.anc_cal.cal_paddr, - cal_block->cal_offset + atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.anc_cal.cal_size, - cal_block->cal_size); -done: - return; -} - -void store_afe_cal(int32_t path, struct cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block->cal_offset > atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_block->cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - goto done; - } - if ((path >= MAX_AUDPROC_TYPES) || (path < 0)) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - atomic_set(&acdb_data.afe_cal[path].cal_kvaddr, - cal_block->cal_offset + atomic64_read(&acdb_data.kvaddr)); - atomic_set(&acdb_data.afe_cal[path].cal_paddr, - cal_block->cal_offset + atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.afe_cal[path].cal_size, - cal_block->cal_size); -done: - return; -} - -void get_afe_cal(int32_t path, struct acdb_cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - if ((path >= MAX_AUDPROC_TYPES) || (path < 0)) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - cal_block->cal_kvaddr = - atomic_read(&acdb_data.afe_cal[path].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.afe_cal[path].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.afe_cal[path].cal_size); -done: - return; -} - -void store_audproc_cal(int32_t path, struct cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block->cal_offset > atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_block->cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - goto done; - } - if (path >= MAX_AUDPROC_TYPES) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - atomic_set(&acdb_data.audproc_cal[path].cal_kvaddr, - cal_block->cal_offset + atomic64_read(&acdb_data.kvaddr)); - atomic_set(&acdb_data.audproc_cal[path].cal_paddr, - cal_block->cal_offset + atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.audproc_cal[path].cal_size, - cal_block->cal_size); -done: - return; -} - -void get_audproc_cal(int32_t path, struct acdb_cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - if (path >= MAX_AUDPROC_TYPES) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - cal_block->cal_kvaddr = - atomic_read(&acdb_data.audproc_cal[path].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.audproc_cal[path].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.audproc_cal[path].cal_size); -done: - return; -} - -void store_audstrm_cal(int32_t path, struct cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block->cal_offset > atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_block->cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - goto done; - } - if (path >= MAX_AUDPROC_TYPES) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - atomic_set(&acdb_data.audstrm_cal[path].cal_kvaddr, - cal_block->cal_offset + atomic64_read(&acdb_data.kvaddr)); - atomic_set(&acdb_data.audstrm_cal[path].cal_paddr, - cal_block->cal_offset + atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.audstrm_cal[path].cal_size, - cal_block->cal_size); -done: - return; -} - -void get_audstrm_cal(int32_t path, struct acdb_cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - if (path >= MAX_AUDPROC_TYPES) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - cal_block->cal_kvaddr = - atomic_read(&acdb_data.audstrm_cal[path].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.audstrm_cal[path].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.audstrm_cal[path].cal_size); -done: - return; -} - -void store_audvol_cal(int32_t path, struct cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block->cal_offset > atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_block->cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - goto done; - } - if (path >= MAX_AUDPROC_TYPES) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - atomic_set(&acdb_data.audvol_cal[path].cal_kvaddr, - cal_block->cal_offset + atomic64_read(&acdb_data.kvaddr)); - atomic_set(&acdb_data.audvol_cal[path].cal_paddr, - cal_block->cal_offset + atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.audvol_cal[path].cal_size, - cal_block->cal_size); -done: - return; -} - -void get_audvol_cal(int32_t path, struct acdb_cal_block *cal_block) -{ - pr_debug("%s, path = %d\n", __func__, path); - - if (cal_block == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - if (path >= MAX_AUDPROC_TYPES || path < 0) { - pr_err("ACDB=> Bad path sent to %s, path: %d\n", - __func__, path); - goto done; - } - - cal_block->cal_kvaddr = - atomic_read(&acdb_data.audvol_cal[path].cal_kvaddr); - cal_block->cal_paddr = - atomic_read(&acdb_data.audvol_cal[path].cal_paddr); - cal_block->cal_size = - atomic_read(&acdb_data.audvol_cal[path].cal_size); -done: - return; -} - -void store_vocproc_cal(int32_t len, struct cal_block *cal_blocks) -{ - int i; - pr_debug("%s\n", __func__); - - if (len > MAX_NETWORKS) { - pr_err("%s: Calibration sent for %d networks, only %d are supported!\n", - __func__, len, MAX_NETWORKS); - goto done; - } - - atomic_set(&acdb_data.vocproc_total_cal_size, 0); - for (i = 0; i < len; i++) { - if (cal_blocks[i].cal_offset > - atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_blocks[i].cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - atomic_set(&acdb_data.vocproc_cal[i].cal_size, 0); - } else { - atomic_add(cal_blocks[i].cal_size, - &acdb_data.vocproc_total_cal_size); - atomic_set(&acdb_data.vocproc_cal[i].cal_size, - cal_blocks[i].cal_size); - atomic_set(&acdb_data.vocproc_cal[i].cal_paddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.vocproc_cal[i].cal_kvaddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.kvaddr)); - } - } - atomic_set(&acdb_data.vocproc_cal_size, len); -done: - return; -} - -void get_vocproc_cal(struct acdb_cal_data *cal_data) -{ - pr_debug("%s\n", __func__); - - if (cal_data == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - - cal_data->num_cal_blocks = atomic_read(&acdb_data.vocproc_cal_size); - cal_data->cal_blocks = &acdb_data.vocproc_cal[0]; -done: - return; -} - -void store_vocstrm_cal(int32_t len, struct cal_block *cal_blocks) -{ - int i; - pr_debug("%s\n", __func__); - - if (len > MAX_NETWORKS) { - pr_err("%s: Calibration sent for %d networks, only %d are supported!\n", - __func__, len, MAX_NETWORKS); - goto done; - } - - atomic_set(&acdb_data.vocstrm_total_cal_size, 0); - for (i = 0; i < len; i++) { - if (cal_blocks[i].cal_offset > - atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_blocks[i].cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - atomic_set(&acdb_data.vocstrm_cal[i].cal_size, 0); - } else { - atomic_add(cal_blocks[i].cal_size, - &acdb_data.vocstrm_total_cal_size); - atomic_set(&acdb_data.vocstrm_cal[i].cal_size, - cal_blocks[i].cal_size); - atomic_set(&acdb_data.vocstrm_cal[i].cal_paddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.vocstrm_cal[i].cal_kvaddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.kvaddr)); - } - } - atomic_set(&acdb_data.vocstrm_cal_size, len); -done: - return; -} - -void get_vocstrm_cal(struct acdb_cal_data *cal_data) -{ - pr_debug("%s\n", __func__); - - if (cal_data == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - - cal_data->num_cal_blocks = atomic_read(&acdb_data.vocstrm_cal_size); - cal_data->cal_blocks = &acdb_data.vocstrm_cal[0]; -done: - return; -} - -void store_vocvol_cal(int32_t len, struct cal_block *cal_blocks) -{ - int i; - pr_debug("%s\n", __func__); - - if (len > MAX_NETWORKS) { - pr_err("%s: Calibration sent for %d networks, only %d are supported!\n", - __func__, len, MAX_NETWORKS); - goto done; - } - - atomic_set(&acdb_data.vocvol_total_cal_size, 0); - for (i = 0; i < len; i++) { - if (cal_blocks[i].cal_offset > - atomic64_read(&acdb_data.mem_len)) { - pr_err("%s: offset %d is > mem_len %ld\n", - __func__, cal_blocks[i].cal_offset, - (long)atomic64_read(&acdb_data.mem_len)); - atomic_set(&acdb_data.vocvol_cal[i].cal_size, 0); - } else { - atomic_add(cal_blocks[i].cal_size, - &acdb_data.vocvol_total_cal_size); - atomic_set(&acdb_data.vocvol_cal[i].cal_size, - cal_blocks[i].cal_size); - atomic_set(&acdb_data.vocvol_cal[i].cal_paddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.paddr)); - atomic_set(&acdb_data.vocvol_cal[i].cal_kvaddr, - cal_blocks[i].cal_offset + - atomic64_read(&acdb_data.kvaddr)); - } - } - atomic_set(&acdb_data.vocvol_cal_size, len); -done: - return; -} - -void get_vocvol_cal(struct acdb_cal_data *cal_data) -{ - pr_debug("%s\n", __func__); - - if (cal_data == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - - cal_data->num_cal_blocks = atomic_read(&acdb_data.vocvol_cal_size); - cal_data->cal_blocks = &acdb_data.vocvol_cal[0]; -done: - return; -} - -void store_sidetone_cal(struct sidetone_cal *cal_data) -{ - pr_debug("%s\n", __func__); - - atomic_set(&acdb_data.sidetone_cal.enable, cal_data->enable); - atomic_set(&acdb_data.sidetone_cal.gain, cal_data->gain); -} - - -void get_sidetone_cal(struct sidetone_cal *cal_data) -{ - pr_debug("%s\n", __func__); - - if (cal_data == NULL) { - pr_err("ACDB=> NULL pointer sent to %s\n", __func__); - goto done; - } - - cal_data->enable = atomic_read(&acdb_data.sidetone_cal.enable); - cal_data->gain = atomic_read(&acdb_data.sidetone_cal.gain); -done: - return; -} - -static int acdb_open(struct inode *inode, struct file *f) -{ - s32 result = 0; - pr_debug("%s\n", __func__); - - if (atomic64_read(&acdb_data.mem_len)) { - pr_debug("%s: ACDB opened but memory allocated, using existing allocation!\n", - __func__); - } - - atomic_inc(&usage_count); - return result; -} - -static int deregister_memory(void) -{ - if (atomic64_read(&acdb_data.mem_len)) { - mutex_lock(&acdb_data.acdb_mutex); - atomic64_set(&acdb_data.mem_len, 0); - atomic_set(&acdb_data.vocstrm_total_cal_size, 0); - atomic_set(&acdb_data.vocproc_total_cal_size, 0); - atomic_set(&acdb_data.vocvol_total_cal_size, 0); - ion_unmap_kernel(acdb_data.ion_client, acdb_data.ion_handle); - ion_free(acdb_data.ion_client, acdb_data.ion_handle); - ion_client_destroy(acdb_data.ion_client); - mutex_unlock(&acdb_data.acdb_mutex); - } - return 0; -} - -static int register_memory(void) -{ - int result; - dma_addr_t paddr; - void *kvptr; - unsigned long kvaddr; - unsigned long mem_len; - - mutex_lock(&acdb_data.acdb_mutex); - - acdb_data.ion_client = - msm_ion_client_create(UINT_MAX, "audio_acdb_client"); - if (IS_ERR_OR_NULL(acdb_data.ion_client)) { - pr_err("%s: Could not register ION client!!!\n", __func__); - result = PTR_ERR(acdb_data.ion_client); - goto err; - } - - acdb_data.ion_handle = ion_import_dma_buf(acdb_data.ion_client, - atomic_read(&acdb_data.map_handle)); - if (IS_ERR_OR_NULL(acdb_data.ion_handle)) { - pr_err("%s: Could not import map handle!!!\n", __func__); - result = PTR_ERR(acdb_data.ion_handle); - goto err_ion_client; - } - - result = ion_phys(acdb_data.ion_client, acdb_data.ion_handle, - &paddr, (size_t *)&mem_len); - if (result != 0) { - pr_err("%s: Could not get phys addr!!!\n", __func__); - goto err_ion_handle; - } - - kvptr = ion_map_kernel(acdb_data.ion_client, - acdb_data.ion_handle); - if (IS_ERR_OR_NULL(kvptr)) { - pr_err("%s: Could not get kernel virt addr!!!\n", __func__); - result = PTR_ERR(kvptr); - goto err_ion_handle; - } - kvaddr = (unsigned long)kvptr; - atomic64_set(&acdb_data.paddr, paddr); - atomic64_set(&acdb_data.kvaddr, kvaddr); - atomic64_set(&acdb_data.mem_len, mem_len); - mutex_unlock(&acdb_data.acdb_mutex); - - pr_debug("%s done! paddr = 0x%lx, kvaddr = 0x%lx, len = x%lx\n", - __func__, - (long)atomic64_read(&acdb_data.paddr), - (long)atomic64_read(&acdb_data.kvaddr), - (long)atomic64_read(&acdb_data.mem_len)); - - return result; -err_ion_handle: - ion_free(acdb_data.ion_client, acdb_data.ion_handle); -err_ion_client: - ion_client_destroy(acdb_data.ion_client); -err: - atomic64_set(&acdb_data.mem_len, 0); - mutex_unlock(&acdb_data.acdb_mutex); - return result; -} - -static long acdb_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - int32_t result = 0; - int32_t size; - int32_t map_fd; - uint32_t topology; - uint32_t data[MAX_IOCTL_DATA]; - pr_debug("%s\n", __func__); - - switch (cmd) { - case AUDIO_REGISTER_PMEM: - pr_debug("AUDIO_REGISTER_PMEM\n"); - if (atomic_read(&acdb_data.mem_len)) { - deregister_memory(); - pr_debug("Remove the existing memory\n"); - } - - if (copy_from_user(&map_fd, (void *)arg, sizeof(map_fd))) { - pr_err("%s: fail to copy memory handle!\n", __func__); - result = -EFAULT; - } else { - atomic_set(&acdb_data.map_handle, map_fd); - result = register_memory(); - } - goto done; - - case AUDIO_DEREGISTER_PMEM: - pr_debug("AUDIO_DEREGISTER_PMEM\n"); - deregister_memory(); - goto done; - case AUDIO_SET_VOICE_RX_TOPOLOGY: - if (copy_from_user(&topology, (void *)arg, - sizeof(topology))) { - pr_err("%s: fail to copy topology!\n", __func__); - result = -EFAULT; - } - store_voice_rx_topology(topology); - goto done; - case AUDIO_SET_VOICE_TX_TOPOLOGY: - if (copy_from_user(&topology, (void *)arg, - sizeof(topology))) { - pr_err("%s: fail to copy topology!\n", __func__); - result = -EFAULT; - } - store_voice_tx_topology(topology); - goto done; - case AUDIO_SET_ADM_RX_TOPOLOGY: - if (copy_from_user(&topology, (void *)arg, - sizeof(topology))) { - pr_err("%s: fail to copy topology!\n", __func__); - result = -EFAULT; - } - store_adm_rx_topology(topology); - goto done; - case AUDIO_SET_ADM_TX_TOPOLOGY: - if (copy_from_user(&topology, (void *)arg, - sizeof(topology))) { - pr_err("%s: fail to copy topology!\n", __func__); - result = -EFAULT; - } - store_adm_tx_topology(topology); - goto done; - case AUDIO_SET_ASM_TOPOLOGY: - if (copy_from_user(&topology, (void *)arg, - sizeof(topology))) { - pr_err("%s: fail to copy topology!\n", __func__); - result = -EFAULT; - } - store_asm_topology(topology); - goto done; - } - - if (copy_from_user(&size, (void *) arg, sizeof(size))) { - - result = -EFAULT; - goto done; - } - - if ((size <= 0) || (size > sizeof(data))) { - pr_err("%s: Invalid size sent to driver: %d\n", - __func__, size); - result = -EFAULT; - goto done; - } - - if (copy_from_user(data, (void *)(arg + sizeof(size)), size)) { - - pr_err("%s: fail to copy table size %d\n", __func__, size); - result = -EFAULT; - goto done; - } - - if (data == NULL) { - pr_err("%s: NULL pointer sent to driver!\n", __func__); - result = -EFAULT; - goto done; - } - - switch (cmd) { - case AUDIO_SET_AUDPROC_TX_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audproc_cal(TX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AUDPROC_RX_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audproc_cal(RX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AUDPROC_TX_STREAM_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audstrm_cal(TX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AUDPROC_RX_STREAM_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audstrm_cal(RX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AUDPROC_TX_VOL_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audvol_cal(TX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AUDPROC_RX_VOL_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More Audproc Cal then expected, size received: %d\n", - __func__, size); - store_audvol_cal(RX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AFE_TX_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More AFE Cal then expected, size received: %d\n", - __func__, size); - store_afe_cal(TX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_AFE_RX_CAL: - if (size > sizeof(struct cal_block)) - pr_err("%s: More AFE Cal then expected, size received: %d\n", - __func__, size); - store_afe_cal(RX_CAL, (struct cal_block *)data); - break; - case AUDIO_SET_VOCPROC_CAL: - store_vocproc_cal(size / sizeof(struct cal_block), - (struct cal_block *)data); - break; - case AUDIO_SET_VOCPROC_STREAM_CAL: - store_vocstrm_cal(size / sizeof(struct cal_block), - (struct cal_block *)data); - break; - case AUDIO_SET_VOCPROC_VOL_CAL: - store_vocvol_cal(size / sizeof(struct cal_block), - (struct cal_block *)data); - break; - case AUDIO_SET_SIDETONE_CAL: - if (size > sizeof(struct sidetone_cal)) - pr_err("%s: More sidetone cal then expected, size received: %d\n", - __func__, size); - store_sidetone_cal((struct sidetone_cal *)data); - break; - case AUDIO_SET_ANC_CAL: - store_anc_cal((struct cal_block *)data); - break; - default: - pr_err("ACDB=> ACDB ioctl not found!\n"); - } - -done: - return result; -} - -static int acdb_mmap(struct file *file, struct vm_area_struct *vma) -{ - int result = 0; - uint32_t size = vma->vm_end - vma->vm_start; - - pr_debug("%s\n", __func__); - - if (atomic64_read(&acdb_data.mem_len)) { - if (size <= atomic64_read(&acdb_data.mem_len)) { - vma->vm_page_prot = pgprot_noncached( - vma->vm_page_prot); - result = remap_pfn_range(vma, - vma->vm_start, - atomic64_read(&acdb_data.paddr) >> PAGE_SHIFT, - size, - vma->vm_page_prot); - } else { - pr_err("%s: Not enough memory!\n", __func__); - result = -ENOMEM; - } - } else { - pr_err("%s: memory is not allocated, yet!\n", __func__); - result = -ENODEV; - } - - return result; -} - -static int acdb_release(struct inode *inode, struct file *f) -{ - s32 result = 0; - - atomic_dec(&usage_count); - atomic_read(&usage_count); - - pr_debug("%s: ref count %d!\n", __func__, - atomic_read(&usage_count)); - - if (atomic_read(&usage_count) >= 1) - result = -EBUSY; - else - result = deregister_memory(); - - return result; -} - -static const struct file_operations acdb_fops = { - .owner = THIS_MODULE, - .open = acdb_open, - .release = acdb_release, - .unlocked_ioctl = acdb_ioctl, - .mmap = acdb_mmap, -}; - -struct miscdevice acdb_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_acdb", - .fops = &acdb_fops, -}; - -static int __init acdb_init(void) -{ - memset(&acdb_data, 0, sizeof(acdb_data)); - mutex_init(&acdb_data.acdb_mutex); - atomic_set(&usage_count, 0); - - return misc_register(&acdb_misc); -} - -static void __exit acdb_exit(void) -{ -} - -module_init(acdb_init); -module_exit(acdb_exit); - -MODULE_DESCRIPTION("MSM 8x60 Audio ACDB driver"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/qdsp6v2/board-msm8x60-audio.c b/arch/arm/mach-msm/qdsp6v2/board-msm8x60-audio.c deleted file mode 100644 index 0f35d1dfc269..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/board-msm8x60-audio.c +++ /dev/null @@ -1,2718 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "snddev_icodec.h" -#include "snddev_ecodec.h" -#include "timpani_profile_8x60.h" -#include "snddev_hdmi.h" -#include "snddev_mi2s.h" -#include "snddev_virtual.h" - -#ifdef CONFIG_DEBUG_FS -static struct dentry *debugfs_hsed_config; -static void snddev_hsed_config_modify_setting(int type); -static void snddev_hsed_config_restore_setting(void); -#endif - -/* GPIO_CLASS_D0_EN */ -#define SNDDEV_GPIO_CLASS_D0_EN 227 - -/* GPIO_CLASS_D1_EN */ -#define SNDDEV_GPIO_CLASS_D1_EN 229 - -#define SNDDEV_GPIO_MIC2_ANCR_SEL 294 -#define SNDDEV_GPIO_MIC1_ANCL_SEL 295 -#define SNDDEV_GPIO_HS_MIC4_SEL 296 - -#define DSP_RAM_BASE_8x60 0x46700000 -#define DSP_RAM_SIZE_8x60 0x2000000 -static int dspcrashd_pdata_8x60 = 0xDEADDEAD; - -static struct resource resources_dspcrashd_8x60[] = { - { - .name = "msm_dspcrashd", - .start = DSP_RAM_BASE_8x60, - .end = DSP_RAM_BASE_8x60 + DSP_RAM_SIZE_8x60, - .flags = IORESOURCE_DMA, - }, -}; - -struct platform_device msm_device_dspcrashd_8x60 = { - .name = "msm_dspcrashd", - .num_resources = ARRAY_SIZE(resources_dspcrashd_8x60), - .resource = resources_dspcrashd_8x60, - .dev = { .platform_data = &dspcrashd_pdata_8x60 }, -}; - -static struct resource msm_cdcclk_ctl_resources[] = { - { - .name = "msm_snddev_tx_mclk", - .start = 108, - .end = 108, - .flags = IORESOURCE_IO, - }, - { - .name = "msm_snddev_rx_mclk", - .start = 109, - .end = 109, - .flags = IORESOURCE_IO, - }, -}; - -static struct platform_device msm_cdcclk_ctl_device = { - .name = "msm_cdcclk_ctl", - .num_resources = ARRAY_SIZE(msm_cdcclk_ctl_resources), - .resource = msm_cdcclk_ctl_resources, -}; - -static struct resource msm_aux_pcm_resources[] = { - - { - .name = "aux_pcm_dout", - .start = 111, - .end = 111, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_din", - .start = 112, - .end = 112, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_syncout", - .start = 113, - .end = 113, - .flags = IORESOURCE_IO, - }, - { - .name = "aux_pcm_clkin_a", - .start = 114, - .end = 114, - .flags = IORESOURCE_IO, - }, -}; - -static struct platform_device msm_aux_pcm_device = { - .name = "msm_aux_pcm", - .num_resources = ARRAY_SIZE(msm_aux_pcm_resources), - .resource = msm_aux_pcm_resources, -}; - -static struct resource msm_mi2s_gpio_resources[] = { - - { - .name = "mi2s_ws", - .start = 101, - .end = 101, - .flags = IORESOURCE_IO, - }, - { - .name = "mi2s_sclk", - .start = 102, - .end = 102, - .flags = IORESOURCE_IO, - }, - { - .name = "mi2s_mclk", - .start = 103, - .end = 103, - .flags = IORESOURCE_IO, - }, - { - .name = "fm_mi2s_sd", - .start = 107, - .end = 107, - .flags = IORESOURCE_IO, - }, -}; - -static struct platform_device msm_mi2s_device = { - .name = "msm_mi2s", - .num_resources = ARRAY_SIZE(msm_mi2s_gpio_resources), - .resource = msm_mi2s_gpio_resources, -}; - -/* Must be same size as msm_icodec_gpio_resources */ -static int msm_icodec_gpio_defaults[] = { - 0, - 0, -}; - -static struct resource msm_icodec_gpio_resources[] = { - { - .name = "msm_icodec_speaker_left", - .start = SNDDEV_GPIO_CLASS_D0_EN, - .end = SNDDEV_GPIO_CLASS_D0_EN, - .flags = IORESOURCE_IO, - }, - { - .name = "msm_icodec_speaker_right", - .start = SNDDEV_GPIO_CLASS_D1_EN, - .end = SNDDEV_GPIO_CLASS_D1_EN, - .flags = IORESOURCE_IO, - }, -}; - -static struct platform_device msm_icodec_gpio_device = { - .name = "msm_icodec_gpio", - .num_resources = ARRAY_SIZE(msm_icodec_gpio_resources), - .resource = msm_icodec_gpio_resources, - .dev = { .platform_data = &msm_icodec_gpio_defaults }, -}; - -static struct regulator *s3; -static struct regulator *mvs; - -static int msm_snddev_enable_dmic_power(void) -{ - int ret; - - s3 = regulator_get(NULL, "8058_s3"); - if (IS_ERR(s3)) { - ret = -EBUSY; - goto fail_get_s3; - } - - ret = regulator_set_voltage(s3, 1800000, 1800000); - if (ret) { - pr_err("%s: error setting voltage\n", __func__); - goto fail_s3; - } - - ret = regulator_enable(s3); - if (ret) { - pr_err("%s: error enabling regulator\n", __func__); - goto fail_s3; - } - - mvs = regulator_get(NULL, "8901_mvs0"); - if (IS_ERR(mvs)) - goto fail_mvs0_get; - - ret = regulator_enable(mvs); - if (ret) { - pr_err("%s: error setting regulator\n", __func__); - goto fail_mvs0_enable; - } - return ret; - -fail_mvs0_enable: - regulator_put(mvs); - mvs = NULL; -fail_mvs0_get: - regulator_disable(s3); -fail_s3: - regulator_put(s3); - s3 = NULL; -fail_get_s3: - return ret; -} - -static void msm_snddev_disable_dmic_power(void) -{ - int ret; - - if (mvs) { - ret = regulator_disable(mvs); - if (ret < 0) - pr_err("%s: error disabling vreg mvs\n", __func__); - regulator_put(mvs); - mvs = NULL; - } - - if (s3) { - ret = regulator_disable(s3); - if (ret < 0) - pr_err("%s: error disabling regulator s3\n", __func__); - regulator_put(s3); - s3 = NULL; - } -} - -#define PM8901_MPP_3 (2) /* PM8901 MPP starts from 0 */ - -static int config_class_d0_gpio(int enable) -{ - int rc; - - struct pm8xxx_mpp_config_data class_d0_mpp = { - .type = PM8XXX_MPP_TYPE_D_OUTPUT, - .level = PM8901_MPP_DIG_LEVEL_MSMIO, - }; - - if (enable) { - class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_HIGH; - rc = pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3), - &class_d0_mpp); - if (rc) { - pr_err("%s: CLASS_D0_EN failed\n", __func__); - return rc; - } - - rc = gpio_request(SNDDEV_GPIO_CLASS_D0_EN, "CLASSD0_EN"); - - if (rc) { - pr_err("%s: spkr pamp gpio pm8901 mpp3 request" - "failed\n", __func__); - class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_LOW; - pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3), - &class_d0_mpp); - return rc; - } - - gpio_direction_output(SNDDEV_GPIO_CLASS_D0_EN, 1); - gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D0_EN, 1); - - } else { - class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_LOW; - pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3), - &class_d0_mpp); - gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D0_EN, 0); - gpio_free(SNDDEV_GPIO_CLASS_D0_EN); - } - return 0; -} - -static int config_class_d1_gpio(int enable) -{ - int rc; - - if (enable) { - rc = gpio_request(SNDDEV_GPIO_CLASS_D1_EN, "CLASSD1_EN"); - - if (rc) { - pr_err("%s: Right Channel spkr gpio request" - " failed\n", __func__); - return rc; - } - - gpio_direction_output(SNDDEV_GPIO_CLASS_D1_EN, 1); - gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D1_EN, 1); - - } else { - gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D1_EN, 0); - gpio_free(SNDDEV_GPIO_CLASS_D1_EN); - } - return 0; -} - -static atomic_t pamp_ref_cnt; - -static int msm_snddev_poweramp_on(void) -{ - int rc; - - if (atomic_inc_return(&pamp_ref_cnt) > 1) - return 0; - - pr_debug("%s: enable stereo spkr amp\n", __func__); - rc = config_class_d0_gpio(1); - if (rc) { - pr_err("%s: d0 gpio configuration failed\n", __func__); - goto config_gpio_fail; - } - rc = config_class_d1_gpio(1); - if (rc) { - pr_err("%s: d1 gpio configuration failed\n", __func__); - goto config_gpio_fail; - } -config_gpio_fail: - return rc; -} - -static void msm_snddev_poweramp_off(void) -{ - if (atomic_dec_return(&pamp_ref_cnt) == 0) { - pr_debug("%s: disable stereo spkr amp\n", __func__); - config_class_d0_gpio(0); - config_class_d1_gpio(0); - msleep(30); - } -} - -/* Regulator 8058_l10 supplies regulator 8058_ncp. */ -static struct regulator *snddev_reg_ncp; -static struct regulator *snddev_reg_l10; - -static atomic_t preg_ref_cnt; - -static int msm_snddev_voltage_on(void) -{ - int rc; - pr_debug("%s\n", __func__); - - if (atomic_inc_return(&preg_ref_cnt) > 1) - return 0; - - snddev_reg_l10 = regulator_get(NULL, "8058_l10"); - if (IS_ERR(snddev_reg_l10)) { - pr_err("%s: regulator_get(%s) failed (%ld)\n", __func__, - "l10", PTR_ERR(snddev_reg_l10)); - return -EBUSY; - } - - rc = regulator_set_voltage(snddev_reg_l10, 2600000, 2600000); - if (rc < 0) - pr_err("%s: regulator_set_voltage(l10) failed (%d)\n", - __func__, rc); - - rc = regulator_enable(snddev_reg_l10); - if (rc < 0) - pr_err("%s: regulator_enable(l10) failed (%d)\n", __func__, rc); - - snddev_reg_ncp = regulator_get(NULL, "8058_ncp"); - if (IS_ERR(snddev_reg_ncp)) { - pr_err("%s: regulator_get(%s) failed (%ld)\n", __func__, - "ncp", PTR_ERR(snddev_reg_ncp)); - return -EBUSY; - } - - rc = regulator_set_voltage(snddev_reg_ncp, 1800000, 1800000); - if (rc < 0) { - pr_err("%s: regulator_set_voltage(ncp) failed (%d)\n", - __func__, rc); - goto regulator_fail; - } - - rc = regulator_enable(snddev_reg_ncp); - if (rc < 0) { - pr_err("%s: regulator_enable(ncp) failed (%d)\n", __func__, rc); - goto regulator_fail; - } - - return rc; - -regulator_fail: - regulator_put(snddev_reg_ncp); - snddev_reg_ncp = NULL; - return rc; -} - -static void msm_snddev_voltage_off(void) -{ - int rc; - pr_debug("%s\n", __func__); - - if (!snddev_reg_ncp) - goto done; - - if (atomic_dec_return(&preg_ref_cnt) == 0) { - rc = regulator_disable(snddev_reg_ncp); - if (rc < 0) - pr_err("%s: regulator_disable(ncp) failed (%d)\n", - __func__, rc); - regulator_put(snddev_reg_ncp); - - snddev_reg_ncp = NULL; - } - -done: - if (!snddev_reg_l10) - return; - - rc = regulator_disable(snddev_reg_l10); - if (rc < 0) - pr_err("%s: regulator_disable(l10) failed (%d)\n", - __func__, rc); - - regulator_put(snddev_reg_l10); - - snddev_reg_l10 = NULL; -} - -static int msm_snddev_enable_amic_power(void) -{ - int ret = 0; -#ifdef CONFIG_PMIC8058_OTHC - - if (machine_is_msm8x60_fluid()) { - - ret = pm8058_micbias_enable(OTHC_MICBIAS_0, - OTHC_SIGNAL_ALWAYS_ON); - if (ret) - pr_err("%s: Enabling amic power failed\n", __func__); - - ret = gpio_request(SNDDEV_GPIO_MIC2_ANCR_SEL, "MIC2_ANCR_SEL"); - if (ret) { - pr_err("%s: spkr pamp gpio %d request failed\n", - __func__, SNDDEV_GPIO_MIC2_ANCR_SEL); - return ret; - } - gpio_direction_output(SNDDEV_GPIO_MIC2_ANCR_SEL, 0); - - ret = gpio_request(SNDDEV_GPIO_MIC1_ANCL_SEL, "MIC1_ANCL_SEL"); - if (ret) { - pr_err("%s: mic1 ancl gpio %d request failed\n", - __func__, SNDDEV_GPIO_MIC1_ANCL_SEL); - gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL); - return ret; - } - gpio_direction_output(SNDDEV_GPIO_MIC1_ANCL_SEL, 0); - - } else { - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, - OTHC_SIGNAL_ALWAYS_ON); - if (ret) - pr_err("%s: Enabling amic power failed\n", __func__); - } -#endif - return ret; -} - -static void msm_snddev_disable_amic_power(void) -{ -#ifdef CONFIG_PMIC8058_OTHC - int ret; - if (machine_is_msm8x60_fluid()) { - ret = pm8058_micbias_enable(OTHC_MICBIAS_0, - OTHC_SIGNAL_OFF); - gpio_free(SNDDEV_GPIO_MIC1_ANCL_SEL); - gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL); - } else - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF); - - if (ret) - pr_err("%s: Disabling amic power failed\n", __func__); -#endif -} - -static int msm_snddev_enable_anc_power(void) -{ - int ret = 0; -#ifdef CONFIG_PMIC8058_OTHC - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, - OTHC_SIGNAL_ALWAYS_ON); - if (ret) - pr_err("%s: Enabling anc micbias 2 failed\n", __func__); - - if (machine_is_msm8x60_fluid()) { - - ret = pm8058_micbias_enable(OTHC_MICBIAS_0, - OTHC_SIGNAL_ALWAYS_ON); - if (ret) - pr_err("%s: Enabling anc micbias 0 failed\n", __func__); - - ret = gpio_request(SNDDEV_GPIO_MIC2_ANCR_SEL, "MIC2_ANCR_SEL"); - if (ret) { - pr_err("%s: mic2 ancr gpio %d request failed\n", - __func__, SNDDEV_GPIO_MIC2_ANCR_SEL); - return ret; - } - gpio_direction_output(SNDDEV_GPIO_MIC2_ANCR_SEL, 1); - - ret = gpio_request(SNDDEV_GPIO_MIC1_ANCL_SEL, "MIC1_ANCL_SEL"); - if (ret) { - pr_err("%s: mic1 ancl gpio %d request failed\n", - __func__, SNDDEV_GPIO_MIC1_ANCL_SEL); - gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL); - return ret; - } - gpio_direction_output(SNDDEV_GPIO_MIC1_ANCL_SEL, 1); - - } -#endif - return ret; -} - -static void msm_snddev_disable_anc_power(void) -{ -#ifdef CONFIG_PMIC8058_OTHC - int ret; - - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF); - - if (machine_is_msm8x60_fluid()) { - ret |= pm8058_micbias_enable(OTHC_MICBIAS_0, - OTHC_SIGNAL_OFF); - gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL); - gpio_free(SNDDEV_GPIO_MIC1_ANCL_SEL); - } - - if (ret) - pr_err("%s: Disabling anc power failed\n", __func__); -#endif -} - -static int msm_snddev_enable_amic_sec_power(void) -{ -#ifdef CONFIG_PMIC8058_OTHC - int ret; - - if (machine_is_msm8x60_fluid()) { - - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, - OTHC_SIGNAL_ALWAYS_ON); - if (ret) - pr_err("%s: Enabling amic2 power failed\n", __func__); - - ret = gpio_request(SNDDEV_GPIO_HS_MIC4_SEL, - "HS_MIC4_SEL"); - if (ret) { - pr_err("%s: spkr pamp gpio %d request failed\n", - __func__, SNDDEV_GPIO_HS_MIC4_SEL); - return ret; - } - gpio_direction_output(SNDDEV_GPIO_HS_MIC4_SEL, 1); - } -#endif - - msm_snddev_enable_amic_power(); - return 0; -} - -static void msm_snddev_disable_amic_sec_power(void) -{ -#ifdef CONFIG_PMIC8058_OTHC - int ret; - if (machine_is_msm8x60_fluid()) { - - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, - OTHC_SIGNAL_OFF); - if (ret) - pr_err("%s: Disabling amic2 power failed\n", __func__); - - gpio_free(SNDDEV_GPIO_HS_MIC4_SEL); - } -#endif - - msm_snddev_disable_amic_power(); -} - -static int msm_snddev_enable_dmic_sec_power(void) -{ - int ret; - - ret = msm_snddev_enable_dmic_power(); - if (ret) { - pr_err("%s: Error: Enabling dmic power failed\n", __func__); - return ret; - } -#ifdef CONFIG_PMIC8058_OTHC - ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_ALWAYS_ON); - if (ret) { - pr_err("%s: Error: Enabling micbias failed\n", __func__); - msm_snddev_disable_dmic_power(); - return ret; - } -#endif - return 0; -} - -static void msm_snddev_disable_dmic_sec_power(void) -{ - msm_snddev_disable_dmic_power(); - -#ifdef CONFIG_PMIC8058_OTHC - pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF); -#endif -} - -static struct adie_codec_action_unit iearpiece_48KHz_osr256_actions[] = - EAR_PRI_MONO_8000_OSR_256; - -static struct adie_codec_hwsetting_entry iearpiece_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iearpiece_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(iearpiece_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iearpiece_profile = { - .path_type = ADIE_CODEC_RX, - .settings = iearpiece_settings, - .setting_sz = ARRAY_SIZE(iearpiece_settings), -}; - -static struct snddev_icodec_data snddev_iearpiece_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .profile = &iearpiece_profile, - .channel_mode = 1, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_iearpiece_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_iearpiece_data }, -}; - -static struct adie_codec_action_unit imic_48KHz_osr256_actions[] = - AMIC_PRI_MONO_OSR_256; - -static struct adie_codec_hwsetting_entry imic_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = imic_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(imic_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile imic_profile = { - .path_type = ADIE_CODEC_TX, - .settings = imic_settings, - .setting_sz = ARRAY_SIZE(imic_settings), -}; - -static struct snddev_icodec_data snddev_imic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = 1, - .profile = &imic_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, -}; - -static struct platform_device msm_imic_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_imic_data }, -}; - -static struct snddev_icodec_data snddev_fluid_ispkr_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_mono_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &imic_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, -}; - -static struct platform_device msm_fluid_ispkr_mic_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_fluid_ispkr_mic_data }, -}; - - -static struct adie_codec_action_unit headset_ab_cpls_48KHz_osr256_actions[] = - HEADSET_AB_CPLS_48000_OSR_256; - -static struct adie_codec_hwsetting_entry headset_ab_cpls_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = headset_ab_cpls_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(headset_ab_cpls_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile headset_ab_cpls_profile = { - .path_type = ADIE_CODEC_RX, - .settings = headset_ab_cpls_settings, - .setting_sz = ARRAY_SIZE(headset_ab_cpls_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_rx", - .copp_id = 0, - .profile = &headset_ab_cpls_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, -}; - -static struct platform_device msm_headset_stereo_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_ihs_stereo_rx_data }, -}; - -static struct adie_codec_action_unit headset_anc_48KHz_osr256_actions[] = - ANC_HEADSET_CPLS_AMIC1_AUXL_RX1_48000_OSR_256; - -static struct adie_codec_hwsetting_entry headset_anc_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = headset_anc_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(headset_anc_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile headset_anc_profile = { - .path_type = ADIE_CODEC_RX, - .settings = headset_anc_settings, - .setting_sz = ARRAY_SIZE(headset_anc_settings), -}; - -static struct snddev_icodec_data snddev_anc_headset_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_ANC), - .name = "anc_headset_stereo_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &headset_anc_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_anc_power, - .pamp_off = msm_snddev_disable_anc_power, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, -}; - -static struct platform_device msm_anc_headset_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_anc_headset_data }, -}; - -static struct adie_codec_action_unit ispkr_stereo_48KHz_osr256_actions[] = - SPEAKER_PRI_STEREO_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ispkr_stereo_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ispkr_stereo_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(ispkr_stereo_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ispkr_stereo_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ispkr_stereo_settings, - .setting_sz = ARRAY_SIZE(ispkr_stereo_settings), -}; - -static struct snddev_icodec_data snddev_ispkr_stereo_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "speaker_stereo_rx", - .copp_id = 0, - .profile = &ispkr_stereo_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, -}; - -static struct platform_device msm_ispkr_stereo_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_ispkr_stereo_data }, -}; - -static struct adie_codec_action_unit idmic_mono_48KHz_osr256_actions[] = - DMIC1_PRI_MONO_OSR_256; - -static struct adie_codec_hwsetting_entry idmic_mono_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = idmic_mono_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(idmic_mono_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile idmic_mono_profile = { - .path_type = ADIE_CODEC_TX, - .settings = idmic_mono_settings, - .setting_sz = ARRAY_SIZE(idmic_mono_settings), -}; - -static struct snddev_icodec_data snddev_ispkr_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_mono_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &idmic_mono_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, -}; - -static struct platform_device msm_ispkr_mic_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_ispkr_mic_data }, -}; - -static struct adie_codec_action_unit iearpiece_ffa_48KHz_osr256_actions[] = - EAR_PRI_MONO_8000_OSR_256; - -static struct adie_codec_hwsetting_entry iearpiece_ffa_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iearpiece_ffa_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE(iearpiece_ffa_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iearpiece_ffa_profile = { - .path_type = ADIE_CODEC_RX, - .settings = iearpiece_ffa_settings, - .setting_sz = ARRAY_SIZE(iearpiece_ffa_settings), -}; - -static struct snddev_icodec_data snddev_iearpiece_ffa_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "handset_rx", - .copp_id = 0, - .profile = &iearpiece_ffa_profile, - .channel_mode = 1, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_iearpiece_ffa_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_iearpiece_ffa_data }, -}; - -static struct snddev_icodec_data snddev_imic_ffa_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &idmic_mono_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, -}; - -static struct platform_device msm_imic_ffa_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_imic_ffa_data }, -}; - -static struct adie_codec_action_unit dual_mic_endfire_8KHz_osr256_actions[] = - DMIC1_PRI_STEREO_OSR_256; - -static struct adie_codec_hwsetting_entry dual_mic_endfire_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = dual_mic_endfire_8KHz_osr256_actions, - .action_sz = ARRAY_SIZE(dual_mic_endfire_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile dual_mic_endfire_profile = { - .path_type = ADIE_CODEC_TX, - .settings = dual_mic_endfire_settings, - .setting_sz = ARRAY_SIZE(dual_mic_endfire_settings), -}; - -static struct snddev_icodec_data snddev_dual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &dual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, -}; - -static struct platform_device msm_hs_dual_mic_endfire_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_dual_mic_endfire_data }, -}; - -static struct snddev_icodec_data snddev_dual_mic_spkr_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_endfire_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &dual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, -}; - -static struct platform_device msm_spkr_dual_mic_endfire_device = { - .name = "snddev_icodec", - .id = 15, - .dev = { .platform_data = &snddev_dual_mic_spkr_endfire_data }, -}; - -static struct adie_codec_action_unit dual_mic_broadside_8osr256_actions[] = - HS_DMIC2_STEREO_OSR_256; - -static struct adie_codec_hwsetting_entry dual_mic_broadside_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = dual_mic_broadside_8osr256_actions, - .action_sz = ARRAY_SIZE(dual_mic_broadside_8osr256_actions), - } -}; - -static struct adie_codec_dev_profile dual_mic_broadside_profile = { - .path_type = ADIE_CODEC_TX, - .settings = dual_mic_broadside_settings, - .setting_sz = ARRAY_SIZE(dual_mic_broadside_settings), -}; - -static struct snddev_icodec_data snddev_hs_dual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_broadside_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &dual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_sec_power, - .pamp_off = msm_snddev_disable_dmic_sec_power, -}; - -static struct platform_device msm_hs_dual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 21, - .dev = { .platform_data = &snddev_hs_dual_mic_broadside_data }, -}; - -static struct snddev_icodec_data snddev_spkr_dual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_broadside_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &dual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_sec_power, - .pamp_off = msm_snddev_disable_dmic_sec_power, -}; - -static struct platform_device msm_spkr_dual_mic_broadside_device = { - .name = "snddev_icodec", - .id = 18, - .dev = { .platform_data = &snddev_spkr_dual_mic_broadside_data }, -}; - -static struct adie_codec_action_unit - fluid_dual_mic_endfire_8KHz_osr256_actions[] = - FLUID_AMIC_DUAL_8000_OSR_256; - -static struct adie_codec_hwsetting_entry fluid_dual_mic_endfire_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = fluid_dual_mic_endfire_8KHz_osr256_actions, - .action_sz = - ARRAY_SIZE(fluid_dual_mic_endfire_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile fluid_dual_mic_endfire_profile = { - .path_type = ADIE_CODEC_TX, - .settings = fluid_dual_mic_endfire_settings, - .setting_sz = ARRAY_SIZE(fluid_dual_mic_endfire_settings), -}; - -static struct snddev_icodec_data snddev_fluid_dual_mic_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_endfire_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &fluid_dual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_sec_power, - .pamp_off = msm_snddev_disable_amic_sec_power, -}; - -static struct platform_device msm_fluid_hs_dual_mic_endfire_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_fluid_dual_mic_endfire_data }, -}; - -static struct snddev_icodec_data snddev_fluid_dual_mic_spkr_endfire_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_endfire_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &fluid_dual_mic_endfire_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_sec_power, - .pamp_off = msm_snddev_disable_amic_sec_power, -}; - -static struct platform_device msm_fluid_spkr_dual_mic_endfire_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_fluid_dual_mic_spkr_endfire_data }, -}; - -static struct adie_codec_action_unit - fluid_dual_mic_broadside_8KHz_osr256_actions[] = - FLUID_AMIC_DUAL_BROADSIDE_8000_OSR_256; - -static struct adie_codec_hwsetting_entry fluid_dual_mic_broadside_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = fluid_dual_mic_broadside_8KHz_osr256_actions, - .action_sz = - ARRAY_SIZE(fluid_dual_mic_broadside_8KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile fluid_dual_mic_broadside_profile = { - .path_type = ADIE_CODEC_TX, - .settings = fluid_dual_mic_broadside_settings, - .setting_sz = ARRAY_SIZE(fluid_dual_mic_broadside_settings), -}; - -static struct snddev_icodec_data snddev_fluid_dual_mic_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_dual_mic_broadside_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &fluid_dual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, -}; - -static struct platform_device msm_fluid_hs_dual_mic_broadside_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_fluid_dual_mic_broadside_data }, -}; - -static struct snddev_icodec_data snddev_fluid_dual_mic_spkr_broadside_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "speaker_dual_mic_broadside_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &fluid_dual_mic_broadside_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, -}; - -static struct platform_device msm_fluid_spkr_dual_mic_broadside_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_fluid_dual_mic_spkr_broadside_data }, -}; - -static struct snddev_hdmi_data snddev_hdmi_stereo_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "hdmi_stereo_rx", - .copp_id = HDMI_RX, - .channel_mode = 0, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_snddev_hdmi_stereo_rx_device = { - .name = "snddev_hdmi", - .dev = { .platform_data = &snddev_hdmi_stereo_rx_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_fm_tx_data = { - .capability = SNDDEV_CAP_TX , - .name = "fmradio_stereo_tx", - .copp_id = MI2S_TX, - .channel_mode = 2, /* stereo */ - .sd_lines = MI2S_SD3, /* sd3 */ - .sample_rate = 48000, -}; - -static struct platform_device msm_mi2s_fm_tx_device = { - .name = "snddev_mi2s", - .dev = { .platform_data = &snddev_mi2s_fm_tx_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_fm_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "fmradio_stereo_rx", - .copp_id = MI2S_RX, - .channel_mode = 2, /* stereo */ - .sd_lines = MI2S_SD3, /* sd3 */ - .sample_rate = 48000, -}; - -static struct platform_device msm_mi2s_fm_rx_device = { - .name = "snddev_mi2s", - .id = 1, - .dev = { .platform_data = &snddev_mi2s_fm_rx_data }, -}; - -static struct adie_codec_action_unit iheadset_mic_tx_osr256_actions[] = - HEADSET_AMIC2_TX_MONO_PRI_OSR_256; - -static struct adie_codec_hwsetting_entry iheadset_mic_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = iheadset_mic_tx_osr256_actions, - .action_sz = ARRAY_SIZE(iheadset_mic_tx_osr256_actions), - } -}; - -static struct adie_codec_dev_profile iheadset_mic_profile = { - .path_type = ADIE_CODEC_TX, - .settings = iheadset_mic_tx_settings, - .setting_sz = ARRAY_SIZE(iheadset_mic_tx_settings), -}; - -static struct snddev_icodec_data snddev_headset_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "headset_mono_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &iheadset_mic_profile, - .channel_mode = 1, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_headset_mic_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_headset_mic_data }, -}; - -static struct adie_codec_action_unit - ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions[] = - SPEAKER_HPH_AB_CPL_PRI_STEREO_48000_OSR_256; - -static struct adie_codec_hwsetting_entry - ihs_stereo_speaker_stereo_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions, - .action_sz = - ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions), - } -}; - -static struct adie_codec_dev_profile ihs_stereo_speaker_stereo_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ihs_stereo_speaker_stereo_rx_settings, - .setting_sz = ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_settings), -}; - -static struct snddev_icodec_data snddev_ihs_stereo_speaker_stereo_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "headset_stereo_speaker_stereo_rx", - .copp_id = 0, - .profile = &ihs_stereo_speaker_stereo_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, -}; - -static struct platform_device msm_ihs_stereo_speaker_stereo_rx_device = { - .name = "snddev_icodec", - .id = 22, - .dev = { .platform_data = &snddev_ihs_stereo_speaker_stereo_rx_data }, -}; - -/* define the value for BT_SCO */ - -static struct snddev_ecodec_data snddev_bt_sco_earpiece_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "bt_sco_rx", - .copp_id = PCM_RX, - .channel_mode = 1, -}; - -static struct snddev_ecodec_data snddev_bt_sco_mic_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "bt_sco_tx", - .copp_id = PCM_TX, - .channel_mode = 1, -}; - -struct platform_device msm_bt_sco_earpiece_device = { - .name = "msm_snddev_ecodec", - .dev = { .platform_data = &snddev_bt_sco_earpiece_data }, -}; - -struct platform_device msm_bt_sco_mic_device = { - .name = "msm_snddev_ecodec", - .dev = { .platform_data = &snddev_bt_sco_mic_data }, -}; - -static struct adie_codec_action_unit itty_mono_tx_actions[] = - TTY_HEADSET_MONO_TX_OSR_256; - -static struct adie_codec_hwsetting_entry itty_mono_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_mono_tx_actions, - .action_sz = ARRAY_SIZE(itty_mono_tx_actions), - }, -}; - -static struct adie_codec_dev_profile itty_mono_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = itty_mono_tx_settings, - .setting_sz = ARRAY_SIZE(itty_mono_tx_settings), -}; - -static struct snddev_icodec_data snddev_itty_mono_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &itty_mono_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, -}; - -static struct platform_device msm_itty_mono_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_itty_mono_tx_data }, -}; - -static struct adie_codec_action_unit itty_mono_rx_actions[] = - TTY_HEADSET_MONO_RX_8000_OSR_256; - -static struct adie_codec_hwsetting_entry itty_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = itty_mono_rx_actions, - .action_sz = ARRAY_SIZE(itty_mono_rx_actions), - }, -}; - -static struct adie_codec_dev_profile itty_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = itty_mono_rx_settings, - .setting_sz = ARRAY_SIZE(itty_mono_rx_settings), -}; - -static struct snddev_icodec_data snddev_itty_mono_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY), - .name = "tty_headset_mono_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &itty_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, -}; - -static struct platform_device msm_itty_mono_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_itty_mono_rx_data }, -}; - -static struct adie_codec_action_unit linein_pri_actions[] = - LINEIN_PRI_STEREO_OSR_256; - -static struct adie_codec_hwsetting_entry linein_pri_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = linein_pri_actions, - .action_sz = ARRAY_SIZE(linein_pri_actions), - }, -}; - -static struct adie_codec_dev_profile linein_pri_profile = { - .path_type = ADIE_CODEC_TX, - .settings = linein_pri_settings, - .setting_sz = ARRAY_SIZE(linein_pri_settings), -}; - -static struct snddev_icodec_data snddev_linein_pri_data = { - .capability = SNDDEV_CAP_TX, - .name = "linein_pri_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &linein_pri_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, -}; - -static struct platform_device msm_linein_pri_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_linein_pri_data }, -}; - -static struct adie_codec_action_unit auxpga_lp_lo_actions[] = - LB_AUXPGA_LO_STEREO; - -static struct adie_codec_hwsetting_entry auxpga_lp_lo_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = auxpga_lp_lo_actions, - .action_sz = ARRAY_SIZE(auxpga_lp_lo_actions), - }, -}; - -static struct adie_codec_dev_profile auxpga_lp_lo_profile = { - .path_type = ADIE_CODEC_LB, - .settings = auxpga_lp_lo_settings, - .setting_sz = ARRAY_SIZE(auxpga_lp_lo_settings), -}; - -static struct snddev_icodec_data snddev_auxpga_lp_lo_data = { - .capability = SNDDEV_CAP_LB, - .name = "speaker_stereo_lb", - .copp_id = PRIMARY_I2S_RX, - .profile = &auxpga_lp_lo_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_ANALOG, -}; - -static struct platform_device msm_auxpga_lp_lo_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_auxpga_lp_lo_data }, -}; - -static struct adie_codec_action_unit auxpga_lp_hs_actions[] = - LB_AUXPGA_HPH_AB_CPLS_STEREO; - -static struct adie_codec_hwsetting_entry auxpga_lp_hs_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = auxpga_lp_hs_actions, - .action_sz = ARRAY_SIZE(auxpga_lp_hs_actions), - }, -}; - -static struct adie_codec_dev_profile auxpga_lp_hs_profile = { - .path_type = ADIE_CODEC_LB, - .settings = auxpga_lp_hs_settings, - .setting_sz = ARRAY_SIZE(auxpga_lp_hs_settings), -}; - -static struct snddev_icodec_data snddev_auxpga_lp_hs_data = { - .capability = SNDDEV_CAP_LB, - .name = "hs_stereo_lb", - .copp_id = PRIMARY_I2S_RX, - .profile = &auxpga_lp_hs_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_ANALOG, -}; - -static struct platform_device msm_auxpga_lp_hs_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &snddev_auxpga_lp_hs_data }, -}; - -#ifdef CONFIG_MSM8X60_FTM_AUDIO_DEVICES -static struct adie_codec_action_unit ftm_headset_mono_rx_actions[] = - HPH_PRI_AB_CPLS_MONO; - -static struct adie_codec_hwsetting_entry ftm_headset_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_mono_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_mono_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_mono_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_mono_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_mono_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_mono_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_mono_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_mono_rx_data}, -}; - -static struct adie_codec_action_unit ftm_headset_mono_diff_rx_actions[] = - HEADSET_MONO_DIFF_RX; - -static struct adie_codec_hwsetting_entry ftm_headset_mono_diff_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_mono_diff_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_mono_diff_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_mono_diff_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_mono_diff_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_mono_diff_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_mono_diff_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_mono_diff_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_mono_diff_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_mono_diff_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_mono_diff_rx_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_mono_rx_actions[] = - SPEAKER_PRI_STEREO_48000_OSR_256; - -static struct adie_codec_hwsetting_entry ftm_spkr_mono_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_mono_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_mono_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_mono_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_mono_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_mono_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_mono_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spkr_mono_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_mono_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spkr_mono_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_mono_rx_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_l_rx_actions[] = - FTM_SPKR_L_RX; - -static struct adie_codec_hwsetting_entry ftm_spkr_l_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_l_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_l_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_l_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_l_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_l_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_l_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spkr_l_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_l_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spkr_l_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_l_rx_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_r_rx_actions[] = - SPKR_R_RX; - -static struct adie_codec_hwsetting_entry ftm_spkr_r_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_r_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_r_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_r_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_r_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_r_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_r_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spkr_r_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_r_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spkr_r_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_r_rx_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_mono_diff_rx_actions[] = - SPKR_MONO_DIFF_RX; - -static struct adie_codec_hwsetting_entry ftm_spkr_mono_diff_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_mono_diff_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_mono_diff_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_mono_diff_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_mono_diff_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_mono_diff_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_mono_diff_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spkr_mono_diff_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_mono_diff_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spkr_mono_diff_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_mono_diff_rx_data}, -}; - -static struct adie_codec_action_unit ftm_headset_mono_l_rx_actions[] = - HPH_PRI_AB_CPLS_MONO_LEFT; - -static struct adie_codec_hwsetting_entry ftm_headset_mono_l_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_mono_l_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_mono_l_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_mono_l_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_mono_l_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_mono_l_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_mono_l_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_mono_l_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_mono_l_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_mono_l_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_mono_l_rx_data}, -}; - -static struct adie_codec_action_unit ftm_headset_mono_r_rx_actions[] = - HPH_PRI_AB_CPLS_MONO_RIGHT; - -static struct adie_codec_hwsetting_entry ftm_headset_mono_r_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_mono_r_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_mono_r_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_mono_r_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_mono_r_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_mono_r_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_mono_r_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_mono_r_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_mono_r_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_mono_r_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_mono_r_rx_data}, -}; - -static struct adie_codec_action_unit ftm_linein_l_tx_actions[] = - LINEIN_MONO_L_TX; - -static struct adie_codec_hwsetting_entry ftm_linein_l_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_linein_l_tx_actions, - .action_sz = ARRAY_SIZE(ftm_linein_l_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_linein_l_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_linein_l_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_linein_l_tx_settings), -}; - -static struct snddev_icodec_data ftm_linein_l_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_linein_l_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_linein_l_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_linein_l_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_linein_l_tx_data }, -}; - -static struct adie_codec_action_unit ftm_linein_r_tx_actions[] = - LINEIN_MONO_R_TX; - -static struct adie_codec_hwsetting_entry ftm_linein_r_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_linein_r_tx_actions, - .action_sz = ARRAY_SIZE(ftm_linein_r_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_linein_r_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_linein_r_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_linein_r_tx_settings), -}; - -static struct snddev_icodec_data ftm_linein_r_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_linein_r_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_linein_r_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_linein_r_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_linein_r_tx_data }, -}; - -static struct adie_codec_action_unit ftm_aux_out_rx_actions[] = - AUX_OUT_RX; - -static struct adie_codec_hwsetting_entry ftm_aux_out_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_aux_out_rx_actions, - .action_sz = ARRAY_SIZE(ftm_aux_out_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_aux_out_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_aux_out_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_aux_out_rx_settings), -}; - -static struct snddev_icodec_data ftm_aux_out_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_aux_out_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_aux_out_rx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_aux_out_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_aux_out_rx_data}, -}; - -static struct adie_codec_action_unit ftm_dmic1_left_tx_actions[] = - DMIC1_LEFT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic1_left_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic1_left_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic1_left_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic1_left_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic1_left_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic1_left_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic1_left_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic1_left_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic1_left_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic1_left_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic1_left_tx_data}, -}; - -static struct adie_codec_action_unit ftm_dmic1_right_tx_actions[] = - DMIC1_RIGHT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic1_right_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic1_right_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic1_right_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic1_right_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic1_right_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic1_right_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic1_right_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic1_right_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic1_right_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic1_right_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic1_right_tx_data}, -}; - -static struct adie_codec_action_unit ftm_dmic1_l_and_r_tx_actions[] = - DMIC1_LEFT_AND_RIGHT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic1_l_and_r_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic1_l_and_r_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic1_l_and_r_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic1_l_and_r_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic1_l_and_r_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic1_l_and_r_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic1_l_and_r_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic1_l_and_r_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic1_l_and_r_tx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic1_l_and_r_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic1_l_and_r_tx_data}, -}; - -static struct adie_codec_action_unit ftm_dmic2_left_tx_actions[] = - DMIC2_LEFT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic2_left_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic2_left_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic2_left_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic2_left_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic2_left_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic2_left_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic2_left_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic2_left_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic2_left_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic2_left_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic2_left_tx_data }, -}; - -static struct adie_codec_action_unit ftm_dmic2_right_tx_actions[] = - DMIC2_RIGHT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic2_right_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic2_right_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic2_right_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic2_right_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic2_right_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic2_right_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic2_right_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic2_right_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic2_right_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic2_right_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic2_right_tx_data }, -}; - -static struct adie_codec_action_unit ftm_dmic2_l_and_r_tx_actions[] = - DMIC2_LEFT_AND_RIGHT_TX; - -static struct adie_codec_hwsetting_entry ftm_dmic2_l_and_r_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_dmic2_l_and_r_tx_actions, - .action_sz = ARRAY_SIZE(ftm_dmic2_l_and_r_tx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_dmic2_l_and_r_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_dmic2_l_and_r_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_dmic2_l_and_r_tx_settings), -}; - -static struct snddev_icodec_data ftm_dmic2_l_and_r_tx_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_dmic2_l_and_r_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_dmic2_l_and_r_tx_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_dmic_power, - .pamp_off = msm_snddev_disable_dmic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_dmic2_l_and_r_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_dmic2_l_and_r_tx_data}, -}; - -static struct adie_codec_action_unit ftm_handset_mic1_aux_in_actions[] = - HANDSET_MIC1_AUX_IN; - -static struct adie_codec_hwsetting_entry ftm_handset_mic1_aux_in_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_handset_mic1_aux_in_actions, - .action_sz = ARRAY_SIZE(ftm_handset_mic1_aux_in_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_handset_mic1_aux_in_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_handset_mic1_aux_in_settings, - .setting_sz = ARRAY_SIZE(ftm_handset_mic1_aux_in_settings), -}; - -static struct snddev_icodec_data ftm_handset_mic1_aux_in_data = { - .capability = SNDDEV_CAP_TX, - .name = "ftm_handset_mic1_aux_in", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_handset_mic1_aux_in_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - /* Assumption is that inputs are not tied to analog mic, so - * no need to enable mic bias. - */ - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_handset_mic1_aux_in_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_handset_mic1_aux_in_data}, -}; - -static struct snddev_mi2s_data snddev_mi2s_sd0_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "mi2s_sd0_rx", - .copp_id = MI2S_RX, - .channel_mode = 2, /* stereo */ - .sd_lines = MI2S_SD0, /* sd0 */ - .sample_rate = 48000, -}; - -static struct platform_device ftm_mi2s_sd0_rx_device = { - .name = "snddev_mi2s", - .dev = { .platform_data = &snddev_mi2s_sd0_rx_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_sd1_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "mi2s_sd1_rx", - .copp_id = MI2S_RX, - .channel_mode = 2, /* stereo */ - .sd_lines = MI2S_SD1, /* sd1 */ - .sample_rate = 48000, -}; - -static struct platform_device ftm_mi2s_sd1_rx_device = { - .name = "snddev_mi2s", - .dev = { .platform_data = &snddev_mi2s_sd1_rx_data }, -}; - -static struct snddev_mi2s_data snddev_mi2s_sd2_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "mi2s_sd2_rx", - .copp_id = MI2S_RX, - .channel_mode = 2, /* stereo */ - .sd_lines = MI2S_SD2, /* sd2 */ - .sample_rate = 48000, -}; - -static struct platform_device ftm_mi2s_sd2_rx_device = { - .name = "snddev_mi2s", - .dev = { .platform_data = &snddev_mi2s_sd2_rx_data }, -}; - -/* earpiece */ -static struct adie_codec_action_unit ftm_handset_adie_lp_rx_actions[] = - EAR_PRI_MONO_LB; - -static struct adie_codec_hwsetting_entry ftm_handset_adie_lp_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_handset_adie_lp_rx_actions, - .action_sz = ARRAY_SIZE(ftm_handset_adie_lp_rx_actions), - } -}; - -static struct adie_codec_dev_profile ftm_handset_adie_lp_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_handset_adie_lp_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_handset_adie_lp_rx_settings), -}; - -static struct snddev_icodec_data ftm_handset_adie_lp_rx_data = { - .capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE), - .name = "ftm_handset_adie_lp_rx", - .copp_id = 0, - .profile = &ftm_handset_adie_lp_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_handset_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_handset_adie_lp_rx_data }, -}; - -static struct adie_codec_action_unit ftm_headset_l_adie_lp_rx_actions[] = - FTM_HPH_PRI_AB_CPLS_MONO_LB_LEFT; - -static struct adie_codec_hwsetting_entry ftm_headset_l_adie_lp_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_l_adie_lp_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_l_adie_lp_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_l_adie_lp_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_l_adie_lp_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_l_adie_lp_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_l_adie_lp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_l_adie_lp_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_l_adie_lp_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_l_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_l_adie_lp_rx_data }, -}; - -static struct adie_codec_action_unit ftm_headset_r_adie_lp_rx_actions[] = - FTM_HPH_PRI_AB_CPLS_MONO_LB_RIGHT; - -static struct adie_codec_hwsetting_entry ftm_headset_r_adie_lp_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_r_adie_lp_rx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_r_adie_lp_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_headset_r_adie_lp_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_headset_r_adie_lp_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_r_adie_lp_rx_settings), -}; - -static struct snddev_icodec_data ftm_headset_r_adie_lp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_headset_r_adie_lp_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_headset_r_adie_lp_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .voltage_on = msm_snddev_voltage_on, - .voltage_off = msm_snddev_voltage_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_r_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_r_adie_lp_rx_data }, -}; - -static struct adie_codec_action_unit ftm_spkr_l_rx_lp_actions[] = - FTM_SPKR_L_RX; - -static struct adie_codec_hwsetting_entry ftm_spkr_l_rx_lp_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_l_rx_lp_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_l_rx_lp_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_l_rx_lp_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_l_rx_lp_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_l_rx_lp_settings), -}; - -static struct snddev_icodec_data ftm_spkr_l_rx_lp_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spk_l_adie_lp_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_l_rx_lp_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spk_l_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_l_rx_lp_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_r_adie_lp_rx_actions[] = - SPKR_R_RX; - -static struct adie_codec_hwsetting_entry ftm_spkr_r_adie_lp_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_r_adie_lp_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_r_adie_lp_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_r_adie_lp_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_r_adie_lp_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_r_adie_lp_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_r_adie_lp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spk_r_adie_lp_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_r_adie_lp_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spk_r_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_r_adie_lp_rx_data}, -}; - -static struct adie_codec_action_unit ftm_spkr_adie_lp_rx_actions[] = - FTM_SPKR_RX_LB; - -static struct adie_codec_hwsetting_entry ftm_spkr_adie_lp_rx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_spkr_adie_lp_rx_actions, - .action_sz = ARRAY_SIZE(ftm_spkr_adie_lp_rx_actions), - }, -}; - -static struct adie_codec_dev_profile ftm_spkr_adie_lp_rx_profile = { - .path_type = ADIE_CODEC_RX, - .settings = ftm_spkr_adie_lp_rx_settings, - .setting_sz = ARRAY_SIZE(ftm_spkr_adie_lp_rx_settings), -}; - -static struct snddev_icodec_data ftm_spkr_adie_lp_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "ftm_spk_adie_lp_rx", - .copp_id = PRIMARY_I2S_RX, - .profile = &ftm_spkr_adie_lp_rx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_poweramp_on, - .pamp_off = msm_snddev_poweramp_off, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_spk_adie_lp_rx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_spkr_adie_lp_rx_data}, -}; - -static struct adie_codec_action_unit ftm_handset_dual_tx_lp_actions[] = - FTM_AMIC_DUAL_HANDSET_TX_LB; - -static struct adie_codec_hwsetting_entry ftm_handset_dual_tx_lp_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_handset_dual_tx_lp_actions, - .action_sz = ARRAY_SIZE(ftm_handset_dual_tx_lp_actions), - } -}; - -static struct adie_codec_dev_profile ftm_handset_dual_tx_lp_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_handset_dual_tx_lp_settings, - .setting_sz = ARRAY_SIZE(ftm_handset_dual_tx_lp_settings), -}; - -static struct snddev_icodec_data ftm_handset_dual_tx_lp_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "handset_mic1_handset_mic2", - .copp_id = 1, - .profile = &ftm_handset_dual_tx_lp_profile, - .channel_mode = 2, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_handset_dual_tx_lp_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_handset_dual_tx_lp_data }, -}; - -static struct adie_codec_action_unit ftm_handset_mic_adie_lp_tx_actions[] = - FTM_HANDSET_LB_TX; - -static struct adie_codec_hwsetting_entry - ftm_handset_mic_adie_lp_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_handset_mic_adie_lp_tx_actions, - .action_sz = ARRAY_SIZE(ftm_handset_mic_adie_lp_tx_actions), - } -}; - -static struct adie_codec_dev_profile ftm_handset_mic_adie_lp_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_handset_mic_adie_lp_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_handset_mic_adie_lp_tx_settings), -}; - -static struct snddev_icodec_data ftm_handset_mic_adie_lp_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "ftm_handset_mic_adie_lp_tx", - .copp_id = 1, - .profile = &ftm_handset_mic_adie_lp_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .pamp_on = msm_snddev_enable_amic_power, - .pamp_off = msm_snddev_disable_amic_power, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_handset_mic_adie_lp_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_handset_mic_adie_lp_tx_data }, -}; - -static struct adie_codec_action_unit ftm_headset_mic_adie_lp_tx_actions[] = - FTM_HEADSET_LB_TX; - -static struct adie_codec_hwsetting_entry - ftm_headset_mic_adie_lp_tx_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = ftm_headset_mic_adie_lp_tx_actions, - .action_sz = ARRAY_SIZE(ftm_headset_mic_adie_lp_tx_actions), - } -}; - -static struct adie_codec_dev_profile ftm_headset_mic_adie_lp_tx_profile = { - .path_type = ADIE_CODEC_TX, - .settings = ftm_headset_mic_adie_lp_tx_settings, - .setting_sz = ARRAY_SIZE(ftm_headset_mic_adie_lp_tx_settings), -}; - -static struct snddev_icodec_data ftm_headset_mic_adie_lp_tx_data = { - .capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE), - .name = "ftm_headset_mic_adie_lp_tx", - .copp_id = PRIMARY_I2S_TX, - .profile = &ftm_headset_mic_adie_lp_tx_profile, - .channel_mode = 1, - .default_sample_rate = 48000, - .dev_vol_type = SNDDEV_DEV_VOL_DIGITAL, -}; - -static struct platform_device ftm_headset_mic_adie_lp_tx_device = { - .name = "snddev_icodec", - .dev = { .platform_data = &ftm_headset_mic_adie_lp_tx_data }, -}; -#endif /* CONFIG_MSM8X60_FTM_AUDIO_DEVICES */ - -static struct snddev_virtual_data snddev_uplink_rx_data = { - .capability = SNDDEV_CAP_RX, - .name = "uplink_rx", - .copp_id = VOICE_PLAYBACK_TX, -}; - -static struct platform_device msm_uplink_rx_device = { - .name = "snddev_virtual", - .dev = { .platform_data = &snddev_uplink_rx_data }, -}; - -static struct snddev_hdmi_data snddev_hdmi_non_linear_pcm_rx_data = { - .capability = SNDDEV_CAP_RX , - .name = "hdmi_pass_through", - .default_sample_rate = 48000, - .on_apps = 1, -}; - -static struct platform_device msm_snddev_hdmi_non_linear_pcm_rx_device = { - .name = "snddev_hdmi", - .dev = { .platform_data = &snddev_hdmi_non_linear_pcm_rx_data }, -}; - - -#ifdef CONFIG_DEBUG_FS -static struct adie_codec_action_unit - ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions[] = - HPH_PRI_D_LEG_STEREO; - -static struct adie_codec_hwsetting_entry - ihs_stereo_rx_class_d_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions), - } -}; - -static struct adie_codec_action_unit - ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions[] = - HPH_PRI_AB_LEG_STEREO; - -static struct adie_codec_hwsetting_entry - ihs_stereo_rx_class_ab_legacy_settings[] = { - { - .freq_plan = 48000, - .osr = 256, - .actions = - ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions, - .action_sz = ARRAY_SIZE - (ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions), - } -}; - -static void snddev_hsed_config_modify_setting(int type) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_headset_stereo_device; - icodec_data = (struct snddev_icodec_data *)device->dev.platform_data; - - if (icodec_data) { - if (type == 1) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_stereo_rx_class_d_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_stereo_rx_class_d_legacy_settings); - } else if (type == 2) { - icodec_data->voltage_on = NULL; - icodec_data->voltage_off = NULL; - icodec_data->profile->settings = - ihs_stereo_rx_class_ab_legacy_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(ihs_stereo_rx_class_ab_legacy_settings); - } - } -} - -static void snddev_hsed_config_restore_setting(void) -{ - struct platform_device *device; - struct snddev_icodec_data *icodec_data; - - device = &msm_headset_stereo_device; - icodec_data = (struct snddev_icodec_data *)device->dev.platform_data; - - if (icodec_data) { - icodec_data->voltage_on = msm_snddev_voltage_on; - icodec_data->voltage_off = msm_snddev_voltage_off; - icodec_data->profile->settings = headset_ab_cpls_settings; - icodec_data->profile->setting_sz = - ARRAY_SIZE(headset_ab_cpls_settings); - } -} - -static ssize_t snddev_hsed_config_debug_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - char *lb_str = filp->private_data; - char cmd; - - if (get_user(cmd, ubuf)) - return -EFAULT; - - if (!strcmp(lb_str, "msm_hsed_config")) { - switch (cmd) { - case '0': - snddev_hsed_config_restore_setting(); - break; - - case '1': - snddev_hsed_config_modify_setting(1); - break; - - case '2': - snddev_hsed_config_modify_setting(2); - break; - - default: - break; - } - } - return cnt; -} - -static int snddev_hsed_config_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static const struct file_operations snddev_hsed_config_debug_fops = { - .open = snddev_hsed_config_debug_open, - .write = snddev_hsed_config_debug_write -}; -#endif - -static struct platform_device *snd_devices_ffa[] __initdata = { - &msm_iearpiece_ffa_device, - &msm_imic_ffa_device, - &msm_ispkr_stereo_device, - &msm_snddev_hdmi_stereo_rx_device, - &msm_headset_mic_device, - &msm_ispkr_mic_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_headset_stereo_device, - &msm_itty_mono_tx_device, - &msm_itty_mono_rx_device, - &msm_mi2s_fm_tx_device, - &msm_mi2s_fm_rx_device, - &msm_hs_dual_mic_endfire_device, - &msm_spkr_dual_mic_endfire_device, - &msm_hs_dual_mic_broadside_device, - &msm_spkr_dual_mic_broadside_device, - &msm_ihs_stereo_speaker_stereo_rx_device, - &msm_anc_headset_device, - &msm_auxpga_lp_hs_device, - &msm_auxpga_lp_lo_device, - &msm_linein_pri_device, - &msm_icodec_gpio_device, - &msm_snddev_hdmi_non_linear_pcm_rx_device, -}; - -static struct platform_device *snd_devices_surf[] __initdata = { - &msm_iearpiece_device, - &msm_imic_device, - &msm_ispkr_stereo_device, - &msm_snddev_hdmi_stereo_rx_device, - &msm_headset_mic_device, - &msm_ispkr_mic_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_headset_stereo_device, - &msm_itty_mono_tx_device, - &msm_itty_mono_rx_device, - &msm_mi2s_fm_tx_device, - &msm_mi2s_fm_rx_device, - &msm_ihs_stereo_speaker_stereo_rx_device, - &msm_auxpga_lp_hs_device, - &msm_auxpga_lp_lo_device, - &msm_linein_pri_device, - &msm_icodec_gpio_device, - &msm_snddev_hdmi_non_linear_pcm_rx_device, -}; - -static struct platform_device *snd_devices_fluid[] __initdata = { - &msm_iearpiece_device, - &msm_imic_device, - &msm_ispkr_stereo_device, - &msm_snddev_hdmi_stereo_rx_device, - &msm_headset_stereo_device, - &msm_headset_mic_device, - &msm_fluid_ispkr_mic_device, - &msm_bt_sco_earpiece_device, - &msm_bt_sco_mic_device, - &msm_mi2s_fm_tx_device, - &msm_mi2s_fm_rx_device, - &msm_fluid_hs_dual_mic_endfire_device, - &msm_fluid_spkr_dual_mic_endfire_device, - &msm_fluid_hs_dual_mic_broadside_device, - &msm_fluid_spkr_dual_mic_broadside_device, - &msm_anc_headset_device, - &msm_auxpga_lp_hs_device, - &msm_auxpga_lp_lo_device, - &msm_icodec_gpio_device, - &msm_snddev_hdmi_non_linear_pcm_rx_device, -}; - -static struct platform_device *snd_devices_common[] __initdata = { - &msm_aux_pcm_device, - &msm_cdcclk_ctl_device, - &msm_mi2s_device, - &msm_uplink_rx_device, - &msm_device_dspcrashd_8x60, -}; - -#ifdef CONFIG_MSM8X60_FTM_AUDIO_DEVICES -static struct platform_device *snd_devices_ftm[] __initdata = { - &ftm_headset_mono_rx_device, - &ftm_headset_mono_l_rx_device, - &ftm_headset_mono_r_rx_device, - &ftm_headset_mono_diff_rx_device, - &ftm_spkr_mono_rx_device, - &ftm_spkr_l_rx_device, - &ftm_spkr_r_rx_device, - &ftm_spkr_mono_diff_rx_device, - &ftm_linein_l_tx_device, - &ftm_linein_r_tx_device, - &ftm_aux_out_rx_device, - &ftm_dmic1_left_tx_device, - &ftm_dmic1_right_tx_device, - &ftm_dmic1_l_and_r_tx_device, - &ftm_dmic2_left_tx_device, - &ftm_dmic2_right_tx_device, - &ftm_dmic2_l_and_r_tx_device, - &ftm_handset_mic1_aux_in_device, - &ftm_mi2s_sd0_rx_device, - &ftm_mi2s_sd1_rx_device, - &ftm_mi2s_sd2_rx_device, - &ftm_handset_mic_adie_lp_tx_device, - &ftm_headset_mic_adie_lp_tx_device, - &ftm_handset_adie_lp_rx_device, - &ftm_headset_l_adie_lp_rx_device, - &ftm_headset_r_adie_lp_rx_device, - &ftm_spk_l_adie_lp_rx_device, - &ftm_spk_r_adie_lp_rx_device, - &ftm_spk_adie_lp_rx_device, - &ftm_handset_dual_tx_lp_device, -}; -#else -static struct platform_device *snd_devices_ftm[] __initdata = {}; -#endif - - -void __init msm_snddev_init(void) -{ - int i; - int dev_id; - - atomic_set(&pamp_ref_cnt, 0); - atomic_set(&preg_ref_cnt, 0); - - for (i = 0, dev_id = 0; i < ARRAY_SIZE(snd_devices_common); i++) - snd_devices_common[i]->id = dev_id++; - - platform_add_devices(snd_devices_common, - ARRAY_SIZE(snd_devices_common)); - - /* Auto detect device base on machine info */ - if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) { - for (i = 0; i < ARRAY_SIZE(snd_devices_surf); i++) - snd_devices_surf[i]->id = dev_id++; - - platform_add_devices(snd_devices_surf, - ARRAY_SIZE(snd_devices_surf)); - } else if (machine_is_msm8x60_ffa() || - machine_is_msm8x60_fusn_ffa()) { - for (i = 0; i < ARRAY_SIZE(snd_devices_ffa); i++) - snd_devices_ffa[i]->id = dev_id++; - - platform_add_devices(snd_devices_ffa, - ARRAY_SIZE(snd_devices_ffa)); - } else if (machine_is_msm8x60_fluid()) { - for (i = 0; i < ARRAY_SIZE(snd_devices_fluid); i++) - snd_devices_fluid[i]->id = dev_id++; - - platform_add_devices(snd_devices_fluid, - ARRAY_SIZE(snd_devices_fluid)); - } - if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() - || machine_is_msm8x60_fusion() - || machine_is_msm8x60_fusn_ffa()) { - for (i = 0; i < ARRAY_SIZE(snd_devices_ftm); i++) - snd_devices_ftm[i]->id = dev_id++; - - platform_add_devices(snd_devices_ftm, - ARRAY_SIZE(snd_devices_ftm)); - } - -#ifdef CONFIG_DEBUG_FS - debugfs_hsed_config = debugfs_create_file("msm_hsed_config", - S_IFREG | S_IRUGO, NULL, - (void *) "msm_hsed_config", &snddev_hsed_config_debug_fops); -#endif -} diff --git a/arch/arm/mach-msm/qdsp6v2/q6audio_v1.c b/arch/arm/mach-msm/qdsp6v2/q6audio_v1.c deleted file mode 100644 index c36d5a94054e..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/q6audio_v1.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils.h" - -void q6asm_in_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_in * audio = (struct q6audio_in *)priv; - unsigned long flags; - - pr_debug("%s:session id %d: opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - - spin_lock_irqsave(&audio->dsp_lock, flags); - switch (opcode) { - case ASM_DATA_EVENT_READ_DONE: - audio_in_get_dsp_frames(audio, token, payload); - break; - case ASM_DATA_EVENT_WRITE_DONE: - atomic_inc(&audio->in_count); - wake_up(&audio->write_wait); - break; - case ASM_DATA_CMDRSP_EOS: - audio->eos_rsp = 1; - wake_up(&audio->read_wait); - break; - case ASM_STREAM_CMDRSP_GET_ENCDEC_PARAM: - break; - case ASM_STREAM_CMDRSP_GET_PP_PARAMS: - break; - case ASM_SESSION_EVENT_TX_OVERFLOW: - pr_err("%s:session id %d: ASM_SESSION_EVENT_TX_OVERFLOW\n", - __func__, audio->ac->session); - break; - default: - pr_debug("%s:session id %d: Ignore opcode[0x%x]\n", __func__, - audio->ac->session, opcode); - break; - } - spin_unlock_irqrestore(&audio->dsp_lock, flags); -} - -void audio_in_get_dsp_frames(/*struct q6audio_in *audio,*/void *aud, - uint32_t token, uint32_t *payload) -{ - struct q6audio_in *audio = (struct q6audio_in *)aud; - uint32_t index; - - index = token; - pr_debug("%s:session id %d: index=%d nr frames=%d offset[%d]\n", - __func__, audio->ac->session, token, payload[7], - payload[3]); - pr_debug("%s:session id %d: timemsw=%d lsw=%d\n", __func__, - audio->ac->session, payload[4], payload[5]); - pr_debug("%s:session id %d: uflags=0x%8x uid=0x%8x\n", __func__, - audio->ac->session, payload[6], payload[8]); - pr_debug("%s:session id %d: enc frame size=0x%8x\n", __func__, - audio->ac->session, payload[2]); - - audio->out_frame_info[index][0] = payload[7]; - audio->out_frame_info[index][1] = payload[3]; - - /* statistics of read */ - atomic_add(payload[2], &audio->in_bytes); - atomic_add(payload[7], &audio->in_samples); - - if (atomic_read(&audio->out_count) <= audio->str_cfg.buffer_count) { - atomic_inc(&audio->out_count); - wake_up(&audio->read_wait); - } -} diff --git a/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c b/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c deleted file mode 100644 index ffd14bd2c2ee..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "audio_utils_aio.h" - -void q6_audio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - - pr_debug("%s:opcode = %x token = 0x%x\n", __func__, opcode, token); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE: - case ASM_DATA_EVENT_READ_DONE: - case ASM_DATA_CMDRSP_EOS: - case ASM_DATA_CMD_MEDIA_FORMAT_UPDATE: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_NOTIFY: - audio_aio_cb(opcode, token, payload, audio); - break; - case APR_BASIC_RSP_RESULT: - audio_aio_cb(opcode, token, payload, audio); - break; - default: - pr_debug("%s:Unhandled event = 0x%8x\n", __func__, opcode); - break; - } -} - -void audio_aio_cb(uint32_t opcode, uint32_t token, - uint32_t *payload, void *priv) -{ - union msm_audio_event_payload e_payload; - struct q6audio_aio *audio = (struct q6audio_aio *)priv; - - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE: - pr_debug("%s[%p]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_write_ack(audio, token, payload); - break; - case ASM_DATA_EVENT_READ_DONE: - pr_debug("%s[%p]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", - __func__, audio, token); - audio_aio_async_read_ack(audio, token, payload); - break; - case ASM_DATA_CMDRSP_EOS: - /* EOS Handle */ - pr_debug("%s[%p]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); - if (audio->feedback) { /* Non-Tunnel mode */ - audio->eos_rsp = 1; - /* propagate input EOS i/p buffer, - after receiving DSP acknowledgement */ - if (audio->eos_flag && - (audio->eos_write_payload.aio_buf.buf_addr)) { - audio_aio_post_event(audio, - AUDIO_EVENT_WRITE_DONE, - audio->eos_write_payload); - memset(&audio->eos_write_payload , 0, - sizeof(union msm_audio_event_payload)); - audio->eos_flag = 0; - } - } else { /* Tunnel mode */ - audio->eos_rsp = 1; - wake_up(&audio->write_wait); - wake_up(&audio->cmd_wait); - } - break; - case ASM_DATA_CMD_MEDIA_FORMAT_UPDATE: - case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - pr_debug("%s[%p]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", - __func__, audio, payload[0], payload[1], opcode); - break; - case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: - case ASM_DATA_EVENT_ENC_SR_CM_NOTIFY: - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, " - - "payload[0]-sr = %d, payload[1]-chl = %d, " - "payload[2] = %d, payload[3] = %d\n", __func__, - audio, payload[0], payload[1], payload[2], - payload[3]); - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", - __func__, audio, audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); - audio->pcm_cfg.sample_rate = payload[0]; - audio->pcm_cfg.channel_count = payload[1] & 0xFFFF; - e_payload.stream_info.chan_info = audio->pcm_cfg.channel_count; - e_payload.stream_info.sample_rate = audio->pcm_cfg.sample_rate; - audio_aio_post_event(audio, AUDIO_EVENT_STREAM_INFO, e_payload); - break; - case APR_BASIC_RSP_RESULT: - switch (payload[0]) { - case ASM_STREAM_CMD_FLUSH: - if (payload[1] == ADSP_EOK) { - pr_debug("%s: FLUSH CMD success\n", __func__); - audio_aio_ioport_reset(audio); - audio->wflush = 0; - audio->rflush = 0; - } else { - pr_err("%s: FLUSH CMD failed with status:%d\n", - __func__, payload[1]); - audio_aio_ioport_reset(audio); - audio->wflush = 0; - audio->rflush = 0; - } - break; - default: - pr_debug("%s: cmd%x cmd_status:%d\n", - __func__, payload[0], payload[1]); - } - default: - break; - } -} - -void extract_meta_out_info(struct q6audio_aio *audio, - struct audio_aio_buffer_node *buf_node, int dir) -{ - struct dec_meta_out *meta_data = buf_node->kvaddr; - if (dir) { /* input buffer - Write */ - if (audio->buf_cfg.meta_info_enable) - memcpy(&buf_node->meta_info.meta_in, - (char *)buf_node->kvaddr, sizeof(struct dec_meta_in)); - else - memset(&buf_node->meta_info.meta_in, - 0, sizeof(struct dec_meta_in)); - pr_debug("%s[%p]:i/p: msw_ts 0x%lx lsw_ts 0x%lx nflags 0x%8x\n", - __func__, audio, - buf_node->meta_info.meta_in.ntimestamp.highpart, - buf_node->meta_info.meta_in.ntimestamp.lowpart, - buf_node->meta_info.meta_in.nflags); - } else { /* output buffer - Read */ - memcpy((char *)buf_node->kvaddr, - &buf_node->meta_info.meta_out, - sizeof(struct dec_meta_out)); - meta_data->meta_out_dsp[0].nflags = 0x00000000; - pr_debug("%s[%p]:o/p: msw_ts 0x%8x lsw_ts 0x%8x nflags 0x%8x, num_frames = %d\n", - __func__, audio, - ((struct dec_meta_out *)buf_node->kvaddr)->\ - meta_out_dsp[0].msw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)->\ - meta_out_dsp[0].lsw_ts, - ((struct dec_meta_out *)buf_node->kvaddr)->\ - meta_out_dsp[0].nflags, - ((struct dec_meta_out *)buf_node->kvaddr)->num_of_frames); - } -} - -/* Read buffer from DSP / Handle Ack from DSP */ -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *filled_buf; - - /* No active flush in progress */ - if (audio->rflush) - return; - - /* Statistics of read */ - atomic_add(payload[2], &audio->in_bytes); - atomic_add(payload[7], &audio->in_samples); - - spin_lock_irqsave(&audio->dsp_lock, flags); - BUG_ON(list_empty(&audio->in_queue)); - filled_buf = list_first_entry(&audio->in_queue, - struct audio_aio_buffer_node, list); - if (token == (filled_buf->token)) { - list_del(&filled_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - event_payload.aio_buf = filled_buf->buf; - /* Read done Buffer due to flush/normal condition - after EOS event, so append EOS buffer */ - if (audio->eos_rsp == 0x1) { - event_payload.aio_buf.data_len = - insert_eos_buf(audio, filled_buf); - /* Reset flag back to indicate eos intimated */ - audio->eos_rsp = 0; - } else { - filled_buf->meta_info.meta_out.num_of_frames = - payload[7]; - event_payload.aio_buf.data_len = payload[2] + \ - payload[3] + \ - sizeof(struct dec_meta_out); - pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", - __func__, audio, - filled_buf->meta_info.meta_out.num_of_frames, - event_payload.aio_buf.data_len); - extract_meta_out_info(audio, filled_buf, 0); - audio->eos_rsp = 0; - } - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - pr_err("%s[%p]:expected=%lx ret=%x\n", - __func__, audio, filled_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} diff --git a/arch/arm/mach-msm/qdsp6v2/q6core.c b/arch/arm/mach-msm/qdsp6v2/q6core.c deleted file mode 100644 index fd699dfe5db0..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/q6core.c +++ /dev/null @@ -1,439 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define TIMEOUT_MS 1000 - -static struct apr_svc *apr_handle_q; -static struct apr_svc *apr_handle_m; -static struct apr_svc *core_handle_q; - -static int32_t query_adsp_ver; -static wait_queue_head_t adsp_version_wait; -static uint32_t adsp_version; - -static wait_queue_head_t bus_bw_req_wait; -static u32 bus_bw_resp_received; - -static struct dentry *dentry; -static char l_buf[4096]; - -static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) -{ - struct adsp_get_version *payload; - uint32_t *payload1; - struct adsp_service_info *svc_info; - int i; - - pr_info("core msg: payload len = %u, apr resp opcode = 0x%X\n", - data->payload_size, data->opcode); - - switch (data->opcode) { - - case APR_BASIC_RSP_RESULT:{ - - if (data->payload_size == 0) { - pr_err("%s: APR_BASIC_RSP_RESULT No Payload ", - __func__); - return 0; - } - - payload1 = data->payload; - - switch (payload1[0]) { - - case ADSP_CMD_SET_POWER_COLLAPSE_STATE: - pr_info("Cmd = ADSP_CMD_SET_POWER_COLLAPSE_STATE status[0x%x]\n", - payload1[1]); - break; - case ADSP_CMD_REMOTE_BUS_BW_REQUEST: - pr_info("%s: cmd = ADSP_CMD_REMOTE_BUS_BW_REQUEST status = 0x%x\n", - __func__, payload1[1]); - - bus_bw_resp_received = 1; - wake_up(&bus_bw_req_wait); - break; - case ADSP_CMD_SET_DTS_MODEL_ID: - pr_debug("ADSP_CMD_SET_DTS_MODEL_ID status[0x%x]\n", - payload1[1]); - break; - default: - pr_err("Invalid cmd rsp[0x%x][0x%x]\n", - payload1[0], payload1[1]); - break; - } - break; - } - case ADSP_GET_VERSION_RSP:{ - if (data->payload_size) { - payload = data->payload; - if (query_adsp_ver == 1) { - query_adsp_ver = 0; - adsp_version = payload->build_id; - wake_up(&adsp_version_wait); - } - svc_info = (struct adsp_service_info *) - ((char *)payload + sizeof(struct adsp_get_version)); - pr_info("----------------------------------------\n"); - pr_info("Build id = %x\n", payload->build_id); - pr_info("Number of services= %x\n", payload->svc_cnt); - pr_info("----------------------------------------\n"); - for (i = 0; i < payload->svc_cnt; i++) { - pr_info("svc-id[%d]\tver[%x.%x]\n", - svc_info[i].svc_id, - (svc_info[i].svc_ver & 0xFFFF0000) - >> 16, - (svc_info[i].svc_ver & 0xFFFF)); - } - pr_info("-----------------------------------------\n"); - } else - pr_info("zero payload for ADSP_GET_VERSION_RSP\n"); - break; - } - case RESET_EVENTS:{ - pr_debug("Reset event received in Core service"); - apr_reset(core_handle_q); - core_handle_q = NULL; - break; - } - - default: - pr_err("Message id from adsp core svc: %d\n", data->opcode); - break; - } - - return 0; -} - -static int32_t aprv2_debug_fn_q(struct apr_client_data *data, void *priv) -{ - pr_debug("Q6_Payload Length = %d\n", data->payload_size); - if (memcmp(data->payload, l_buf + 20, data->payload_size)) - pr_info("FAIL: %d\n", data->payload_size); - else - pr_info("SUCCESS: %d\n", data->payload_size); - return 0; -} - -static int32_t aprv2_debug_fn_m(struct apr_client_data *data, void *priv) -{ - pr_info("M_Payload Length = %d\n", data->payload_size); - return 0; -} - -static ssize_t apr_debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - pr_debug("apr debugfs opened\n"); - return 0; -} - -void core_open(void) -{ - if (core_handle_q == NULL) { - core_handle_q = apr_register("ADSP", "CORE", - aprv2_core_fn_q, 0xFFFFFFFF, NULL); - } - pr_debug("Open_q %p\n", core_handle_q); - if (core_handle_q == NULL) - pr_err("%s: Unable to register CORE\n", __func__); -} - -int core_req_bus_bandwith(u16 bus_id, u32 ab_bps, u32 ib_bps) -{ - struct adsp_cmd_remote_bus_bw_request bus_bw_req; - int ret; - - pr_debug("%s: bus_id %u ab_bps %u ib_bps %u\n", - __func__, bus_id, ab_bps, ib_bps); - - core_open(); - if (core_handle_q == NULL) { - pr_info("%s: apr registration for CORE failed\n", __func__); - return -ENODEV; - } - - bus_bw_req.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - bus_bw_req.hdr.pkt_size = sizeof(struct adsp_cmd_remote_bus_bw_request); - - bus_bw_req.hdr.src_port = 0; - bus_bw_req.hdr.dest_port = 0; - bus_bw_req.hdr.token = 0; - bus_bw_req.hdr.opcode = ADSP_CMD_REMOTE_BUS_BW_REQUEST; - - bus_bw_req.bus_identifier = bus_id; - bus_bw_req.reserved = 0; - bus_bw_req.ab_bps = ab_bps; - bus_bw_req.ib_bps = ib_bps; - - bus_bw_resp_received = 0; - ret = apr_send_pkt(core_handle_q, (uint32_t *) &bus_bw_req); - if (ret < 0) { - pr_err("%s: CORE bus bw request failed\n", __func__); - goto fail_cmd; - } - - ret = wait_event_timeout(bus_bw_req_wait, (bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - ret = -ETIME; - goto fail_cmd; - } - - return 0; - -fail_cmd: - return ret; -} - -uint32_t core_get_adsp_version(void) -{ - struct apr_hdr *hdr; - int32_t rc = 0, ret = 0; - core_open(); - if (core_handle_q) { - hdr = (struct apr_hdr *)l_buf; - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, 0); - hdr->src_port = 0; - hdr->dest_port = 0; - hdr->token = 0; - hdr->opcode = ADSP_GET_VERSION; - - apr_send_pkt(core_handle_q, (uint32_t *)l_buf); - query_adsp_ver = 1; - pr_info("Write_q\n"); - ret = wait_event_timeout(adsp_version_wait, - (query_adsp_ver == 0), - msecs_to_jiffies(TIMEOUT_MS)); - rc = adsp_version; - if (!ret) { - pr_err("%s: wait_event timeout\n", __func__); - rc = -ENODEV; - } - } else - pr_info("apr registration failed\n"); - return rc; -} -EXPORT_SYMBOL(core_get_adsp_version); - -static ssize_t apr_debug_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - int len; - static int t_len; - - len = count > 63 ? 63 : count; - if (copy_from_user(l_buf + 20 , buf, len)) { - pr_info("Unable to copy data from user space\n"); - return -EFAULT; - } - l_buf[len + 20] = 0; - if (l_buf[len + 20 - 1] == '\n') { - l_buf[len + 20 - 1] = 0; - len--; - } - if (!strncmp(l_buf + 20, "open_q", 64)) { - apr_handle_q = apr_register("ADSP", "TEST", aprv2_debug_fn_q, - 0xFFFFFFFF, NULL); - pr_info("Open_q %p\n", apr_handle_q); - } else if (!strncmp(l_buf + 20, "open_m", 64)) { - apr_handle_m = apr_register("MODEM", "TEST", aprv2_debug_fn_m, - 0xFFFFFFFF, NULL); - pr_info("Open_m %p\n", apr_handle_m); - } else if (!strncmp(l_buf + 20, "write_q", 64)) { - struct apr_hdr *hdr; - - t_len++; - t_len = t_len % 450; - if (!t_len % 99) - msleep(2000); - hdr = (struct apr_hdr *)l_buf; - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(20), APR_PKT_VER); - hdr->pkt_size = APR_PKT_SIZE(20, t_len); - hdr->src_port = 0; - hdr->dest_port = 0; - hdr->token = 0; - hdr->opcode = 0x12345678; - memset(l_buf + 20, 9, 4060); - - apr_send_pkt(apr_handle_q, (uint32_t *)l_buf); - pr_debug("Write_q\n"); - } else if (!strncmp(l_buf + 20, "write_m", 64)) { - struct apr_hdr *hdr; - - hdr = (struct apr_hdr *)l_buf; - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(20), APR_PKT_VER); - hdr->pkt_size = APR_PKT_SIZE(20, 8); - hdr->src_port = 0; - hdr->dest_port = 0; - hdr->token = 0; - hdr->opcode = 0x12345678; - memset(l_buf + 30, 9, 4060); - - apr_send_pkt(apr_handle_m, (uint32_t *)l_buf); - pr_info("Write_m\n"); - } else if (!strncmp(l_buf + 20, "write_q4", 64)) { - struct apr_hdr *hdr; - - hdr = (struct apr_hdr *)l_buf; - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(20), APR_PKT_VER); - hdr->pkt_size = APR_PKT_SIZE(20, 4076); - hdr->src_port = 0; - hdr->dest_port = 0; - hdr->token = 0; - hdr->opcode = 0x12345678; - memset(l_buf + 30, 9, 4060); - - apr_send_pkt(apr_handle_q, (uint32_t *)l_buf); - pr_info("Write_q\n"); - } else if (!strncmp(l_buf + 20, "write_m4", 64)) { - struct apr_hdr *hdr; - - hdr = (struct apr_hdr *)l_buf; - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(20), APR_PKT_VER); - hdr->pkt_size = APR_PKT_SIZE(20, 4076); - hdr->src_port = 0; - hdr->dest_port = 0; - hdr->token = 0; - hdr->opcode = 0x12345678; - memset(l_buf + 30, 9, 4060); - - apr_send_pkt(apr_handle_m, (uint32_t *)l_buf); - pr_info("Write_m\n"); - } else if (!strncmp(l_buf + 20, "close", 64)) { - if (apr_handle_q) - apr_deregister(apr_handle_q); - } else if (!strncmp(l_buf + 20, "loaded", 64)) { - apr_set_q6_state(APR_SUBSYS_LOADED); - } else if (!strncmp(l_buf + 20, "boom", 64)) { - q6audio_dsp_not_responding(); - } else if (!strncmp(l_buf + 20, "dsp_ver", 64)) { - core_get_adsp_version(); - } else if (!strncmp(l_buf + 20, "en_pwr_col", 64)) { - struct adsp_power_collapse pc; - - core_open(); - if (core_handle_q) { - pc.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - pc.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(uint32_t)); - pc.hdr.src_port = 0; - pc.hdr.dest_port = 0; - pc.hdr.token = 0; - pc.hdr.opcode = ADSP_CMD_SET_POWER_COLLAPSE_STATE; - pc.power_collapse = 0x00000000; - apr_send_pkt(core_handle_q, (uint32_t *)&pc); - pr_info("Write_q :enable power collapse\n"); - } - } else if (!strncmp(l_buf + 20, "dis_pwr_col", 64)) { - struct adsp_power_collapse pc; - - core_open(); - if (core_handle_q) { - pc.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - pc.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(uint32_t)); - pc.hdr.src_port = 0; - pc.hdr.dest_port = 0; - pc.hdr.token = 0; - pc.hdr.opcode = ADSP_CMD_SET_POWER_COLLAPSE_STATE; - pc.power_collapse = 0x00000001; - apr_send_pkt(core_handle_q, (uint32_t *)&pc); - pr_info("Write_q:disable power collapse\n"); - } - } else - pr_info("Unknown Command\n"); - - return count; -} - -uint32_t core_set_dts_model_id(uint32_t id_size, uint8_t *id) -{ - struct adsp_dts_modelid payload; - int rc = 0; - pr_debug("core_set_dts_model_id(): Enter\n"); - core_open(); - if (core_handle_q) { - payload.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - payload.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - sizeof(uint32_t)+id_size); - payload.hdr.src_port = 0; - payload.hdr.dest_port = 0; - payload.hdr.token = 0; - payload.hdr.opcode = ADSP_CMD_SET_DTS_MODEL_ID; - payload.model_ID_size = id_size; - memcpy(payload.model_ID, id, id_size+1); - pr_debug("Send DTS sec opcode=%x modelID = %s, size=%d\n", - payload.hdr.opcode, (char *)payload.model_ID, - payload.model_ID_size); - rc = apr_send_pkt(core_handle_q, (uint32_t *)&payload); - if (rc < 0) - pr_err("%s: SET_DTS_DTS_MODEL_ID failed op[0x%x]rc[%d]\n", - __func__, payload.hdr.opcode, rc); - } - pr_debug("core_set_dts_model_id(): Exit\n"); - return rc; -} - -static const struct file_operations apr_debug_fops = { - .write = apr_debug_write, - .open = apr_debug_open, -}; - -static int __init core_init(void) -{ - init_waitqueue_head(&bus_bw_req_wait); - bus_bw_resp_received = 0; - - query_adsp_ver = 0; - init_waitqueue_head(&adsp_version_wait); - adsp_version = 0; - - core_handle_q = NULL; - -#ifdef CONFIG_DEBUG_FS - dentry = debugfs_create_file("apr", S_IFREG | S_IRUGO | S_IWUSR - | S_IWGRP, NULL, (void *) NULL, &apr_debug_fops); -#endif /* CONFIG_DEBUG_FS */ - - return 0; -} - -device_initcall(core_init); diff --git a/arch/arm/mach-msm/qdsp6v2/rtac.c b/arch/arm/mach-msm/qdsp6v2/rtac.c deleted file mode 100644 index 65543a447730..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/rtac.c +++ /dev/null @@ -1,1049 +0,0 @@ -/* Copyright (c) 2011, 2013 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6audio_common.h" -#include - -#ifndef CONFIG_RTAC - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id) {} -void rtac_remove_adm_device(u32 port_id) {} -void rtac_remove_popp_from_adm_devices(u32 popp_id) {} -void rtac_set_adm_handle(void *handle) {} -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size) - {return false; } -void rtac_set_asm_handle(u32 session_id, void *handle) {} -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size) {return false; } -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 session_id) {} -void rtac_remove_voice(u32 cvs_handle) {} -void rtac_set_voice_handle(u32 mode, void *handle) {} -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, - u32 payload_size) {return false; } -int rtac_clear_mapping(uint32_t cal_type) {return false; } - -#else - -#define VOICE_CMD_SET_PARAM 0x00011006 -#define VOICE_CMD_GET_PARAM 0x00011007 -#define VOICE_EVT_GET_PARAM_ACK 0x00011008 - -/* Max size of payload (buf size - apr header) */ -#define MAX_PAYLOAD_SIZE 4076 -#define RTAC_MAX_ACTIVE_DEVICES 4 -#define RTAC_MAX_ACTIVE_VOICE_COMBOS 2 -#define RTAC_MAX_ACTIVE_POPP 8 -#define RTAC_BUF_SIZE 4096 - -#define TIMEOUT_MS 1000 - -/* APR data */ -struct rtac_apr_data { - void *apr_handle; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; -}; - -static struct rtac_apr_data rtac_adm_apr_data; -static struct rtac_apr_data rtac_asm_apr_data[SESSION_MAX+1]; -static struct rtac_apr_data rtac_voice_apr_data[RTAC_VOICE_MODES]; - - -/* ADM info & APR */ -struct rtac_adm_data { - uint32_t topology_id; - uint32_t afe_port; - uint32_t copp; - uint32_t num_of_popp; - uint32_t popp[RTAC_MAX_ACTIVE_POPP]; -}; - -struct rtac_adm { - uint32_t num_of_dev; - struct rtac_adm_data device[RTAC_MAX_ACTIVE_DEVICES]; -}; -static struct rtac_adm rtac_adm_data; -static u32 rtac_adm_payload_size; -static u32 rtac_adm_user_buf_size; -static u8 *rtac_adm_buffer; - - -/* ASM APR */ -static u32 rtac_asm_payload_size; -static u32 rtac_asm_user_buf_size; -static u8 *rtac_asm_buffer; - - -/* Voice info & APR */ -struct rtac_voice_data { - uint32_t tx_topology_id; - uint32_t rx_topology_id; - uint32_t tx_afe_port; - uint32_t rx_afe_port; - uint16_t cvs_handle; - uint16_t cvp_handle; -}; - -struct rtac_voice { - uint32_t num_of_voice_combos; - struct rtac_voice_data voice[RTAC_MAX_ACTIVE_VOICE_COMBOS]; -}; - -static struct rtac_voice rtac_voice_data; -static u32 rtac_voice_payload_size; -static u32 rtac_voice_user_buf_size; -static u8 *rtac_voice_buffer; -static u32 voice_session_id[RTAC_MAX_ACTIVE_VOICE_COMBOS]; - - -struct mutex rtac_adm_mutex; -struct mutex rtac_adm_apr_mutex; -struct mutex rtac_asm_apr_mutex; -struct mutex rtac_voice_mutex; -struct mutex rtac_voice_apr_mutex; - -int rtac_clear_mapping(uint32_t cal_type) {return false; } - -static int rtac_open(struct inode *inode, struct file *f) -{ - pr_debug("%s\n", __func__); - return 0; -} - -static int rtac_release(struct inode *inode, struct file *f) -{ - pr_debug("%s\n", __func__); - return 0; -} - -/* ADM Info */ -void add_popp(u32 dev_idx, u32 port_id, u32 popp_id) -{ - u32 i = 0; - - for (; i < rtac_adm_data.device[dev_idx].num_of_popp; i++) - if (rtac_adm_data.device[dev_idx].popp[i] == popp_id) - goto done; - - if (rtac_adm_data.device[dev_idx].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - rtac_adm_data.device[dev_idx].popp[ - rtac_adm_data.device[dev_idx].num_of_popp++] = popp_id; -done: - return; -} - -void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id) -{ - u32 i = 0; - pr_debug("%s: port_id = %d, popp_id = %d\n", __func__, port_id, - popp_id); - - mutex_lock(&rtac_adm_mutex); - if (rtac_adm_data.num_of_dev == RTAC_MAX_ACTIVE_DEVICES) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_adm_data.num_of_dev != 0) { - for (; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id) { - add_popp(i, port_id, popp_id); - goto done; - } - if (rtac_adm_data.device[i].num_of_popp == - RTAC_MAX_ACTIVE_POPP) { - pr_err("%s, Max POPP!\n", __func__); - goto done; - } - } - } - - /* Add device */ - rtac_adm_data.num_of_dev++; - - if (path_id == ADM_PATH_PLAYBACK) - rtac_adm_data.device[i].topology_id = - get_adm_rx_topology(); - else - rtac_adm_data.device[i].topology_id = - get_adm_tx_topology(); - rtac_adm_data.device[i].afe_port = port_id; - rtac_adm_data.device[i].copp = copp_id; - rtac_adm_data.device[i].popp[ - rtac_adm_data.device[i].num_of_popp++] = popp_id; -done: - mutex_unlock(&rtac_adm_mutex); - return; -} - -static void shift_adm_devices(u32 dev_idx) -{ - for (; dev_idx < rtac_adm_data.num_of_dev; dev_idx++) { - memcpy(&rtac_adm_data.device[dev_idx], - &rtac_adm_data.device[dev_idx + 1], - sizeof(rtac_adm_data.device[dev_idx])); - memset(&rtac_adm_data.device[dev_idx + 1], 0, - sizeof(rtac_adm_data.device[dev_idx])); - } -} - -static void shift_popp(u32 copp_idx, u32 popp_idx) -{ - for (; popp_idx < rtac_adm_data.device[copp_idx].num_of_popp; - popp_idx++) { - memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx], - &rtac_adm_data.device[copp_idx].popp[popp_idx + 1], - sizeof(uint32_t)); - memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1], 0, - sizeof(uint32_t)); - } -} - -void rtac_remove_adm_device(u32 port_id) -{ - s32 i; - pr_debug("%s: port_id = %d\n", __func__, port_id); - - mutex_lock(&rtac_adm_mutex); - /* look for device */ - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - if (rtac_adm_data.device[i].afe_port == port_id) { - memset(&rtac_adm_data.device[i], 0, - sizeof(rtac_adm_data.device[i])); - rtac_adm_data.num_of_dev--; - - if (rtac_adm_data.num_of_dev >= 1) { - shift_adm_devices(i); - break; - } - } - } - - mutex_unlock(&rtac_adm_mutex); - return; -} - -void rtac_remove_popp_from_adm_devices(u32 popp_id) -{ - s32 i, j; - pr_debug("%s: popp_id = %d\n", __func__, popp_id); - - mutex_lock(&rtac_adm_mutex); - - for (i = 0; i < rtac_adm_data.num_of_dev; i++) { - for (j = 0; j < rtac_adm_data.device[i].num_of_popp; j++) { - if (rtac_adm_data.device[i].popp[j] == popp_id) { - rtac_adm_data.device[i].popp[j] = 0; - rtac_adm_data.device[i].num_of_popp--; - shift_popp(i, j); - } - } - } - - mutex_unlock(&rtac_adm_mutex); -} - -/* Voice Info */ -static void set_rtac_voice_data(int idx, u32 cvs_handle, u32 cvp_handle, - u32 rx_afe_port, u32 tx_afe_port, - u32 session_id) -{ - rtac_voice_data.voice[idx].tx_topology_id = get_voice_tx_topology(); - rtac_voice_data.voice[idx].rx_topology_id = get_voice_rx_topology(); - rtac_voice_data.voice[idx].tx_afe_port = tx_afe_port; - rtac_voice_data.voice[idx].rx_afe_port = rx_afe_port; - rtac_voice_data.voice[idx].cvs_handle = cvs_handle; - rtac_voice_data.voice[idx].cvp_handle = cvp_handle; - - /* Store session ID for voice RTAC */ - voice_session_id[idx] = session_id; -} - -void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port, - u32 tx_afe_port, u32 session_id) -{ - u32 i = 0; - pr_debug("%s\n", __func__); - mutex_lock(&rtac_voice_mutex); - - if (rtac_voice_data.num_of_voice_combos == - RTAC_MAX_ACTIVE_VOICE_COMBOS) { - pr_err("%s, Can't add anymore RTAC devices!\n", __func__); - goto done; - } - - /* Check if device already added */ - if (rtac_voice_data.num_of_voice_combos != 0) { - for (; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == - cvs_handle) { - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, - session_id); - goto done; - } - } - } - - /* Add device */ - rtac_voice_data.num_of_voice_combos++; - set_rtac_voice_data(i, cvs_handle, cvp_handle, - rx_afe_port, tx_afe_port, - session_id); -done: - mutex_unlock(&rtac_voice_mutex); - return; -} - -static void shift_voice_devices(u32 idx) -{ - for (; idx < rtac_voice_data.num_of_voice_combos - 1; idx++) { - memcpy(&rtac_voice_data.voice[idx], - &rtac_voice_data.voice[idx + 1], - sizeof(rtac_voice_data.voice[idx])); - voice_session_id[idx] = voice_session_id[idx + 1]; - } -} - -void rtac_remove_voice(u32 cvs_handle) -{ - u32 i = 0; - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_voice_mutex); - /* look for device */ - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) { - shift_voice_devices(i); - rtac_voice_data.num_of_voice_combos--; - memset(&rtac_voice_data.voice[ - rtac_voice_data.num_of_voice_combos], 0, - sizeof(rtac_voice_data.voice - [rtac_voice_data.num_of_voice_combos])); - voice_session_id[rtac_voice_data.num_of_voice_combos] - = 0; - break; - } - } - mutex_unlock(&rtac_voice_mutex); - return; -} - -static int get_voice_index_cvs(u32 cvs_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) - return i; - } - - pr_err("%s: No voice index for CVS handle %d found returning 0\n", - __func__, cvs_handle); - return 0; -} - -static int get_voice_index_cvp(u32 cvp_handle) -{ - u32 i; - - for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) { - if (rtac_voice_data.voice[i].cvp_handle == cvp_handle) - return i; - } - - pr_err("%s: No voice index for CVP handle %d found returning 0\n", - __func__, cvp_handle); - return 0; -} - -static int get_voice_index(u32 mode, u32 handle) -{ - if (mode == RTAC_CVP) - return get_voice_index_cvp(handle); - if (mode == RTAC_CVS) - return get_voice_index_cvs(handle); - - pr_err("%s: Invalid mode %d, returning 0\n", - __func__, mode); - return 0; -} - - -/* ADM APR */ -void rtac_set_adm_handle(void *handle) -{ - pr_debug("%s: handle = %d\n", __func__, (unsigned int)handle); - - mutex_lock(&rtac_adm_apr_mutex); - rtac_adm_apr_data.apr_handle = handle; - mutex_unlock(&rtac_adm_apr_mutex); -} - -bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size) -{ - pr_debug("%s:cmd_state = %d\n", __func__, - atomic_read(&rtac_adm_apr_data.cmd_state)); - if (atomic_read(&rtac_adm_apr_data.cmd_state) != 1) - return false; - - /* Offset data for in-band payload */ - rtac_copy_adm_payload_to_user(payload, payload_size); - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - wake_up(&rtac_adm_apr_data.cmd_wait); - return true; -} - -void rtac_copy_adm_payload_to_user(void *payload, u32 payload_size) -{ - pr_debug("%s\n", __func__); - rtac_adm_payload_size = payload_size; - - memcpy(rtac_adm_buffer, &payload_size, sizeof(u32)); - if (payload_size != 0) { - if (payload_size > rtac_adm_user_buf_size) { - pr_err("%s: Buffer set not big enough for returned data, buf size = %d,ret data = %d\n", - __func__, rtac_adm_user_buf_size, payload_size); - goto done; - } - memcpy(rtac_adm_buffer + sizeof(u32), payload, payload_size); - } -done: - return; -} - -u32 send_adm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 count = 0; - u32 bytes_returned = 0; - u32 port_index = 0; - u32 copp_id; - u32 payload_size; - struct apr_hdr adm_params; - pr_debug("%s\n", __func__); - - if (copy_from_user(&count, (void *)buf, sizeof(count))) { - pr_err("%s: Copy to user failed! buf = 0x%x\n", - __func__, (unsigned int)buf); - result = -EFAULT; - goto done; - } - - if (count <= 0) { - pr_err("%s: Invalid buffer size = %d\n", __func__, count); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - goto done; - } - - if (copy_from_user(&copp_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - for (port_index = 0; port_index < AFE_MAX_PORTS; port_index++) { - if (adm_get_copp_id(port_index) == copp_id) - break; - } - if (port_index >= AFE_MAX_PORTS) { - pr_err("%s: Could not find port index for copp = %d\n", - __func__, copp_id); - goto done; - } - - mutex_lock(&rtac_adm_apr_mutex); - if (rtac_adm_apr_data.apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - goto err; - } - - /* Set globals for copy of returned payload */ - rtac_adm_user_buf_size = count; - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_adm_buffer + sizeof(adm_params), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - goto err; - } - - /* Pack header */ - adm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - adm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - adm_params.src_svc = APR_SVC_ADM; - adm_params.src_domain = APR_DOMAIN_APPS; - adm_params.src_port = copp_id; - adm_params.dest_svc = APR_SVC_ADM; - adm_params.dest_domain = APR_DOMAIN_ADSP; - adm_params.dest_port = copp_id; - adm_params.token = copp_id; - adm_params.opcode = opcode; - - memcpy(rtac_adm_buffer, &adm_params, sizeof(adm_params)); - atomic_set(&rtac_adm_apr_data.cmd_state, 1); - - pr_debug("%s: Sending RTAC command size = %d\n", - __func__, adm_params.pkt_size); - - result = apr_send_pkt(rtac_adm_apr_data.apr_handle, - (uint32_t *)rtac_adm_buffer); - if (result < 0) { - pr_err("%s: Set params failed port = %d, copp = %d\n", - __func__, port_index, copp_id); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_adm_apr_data.cmd_wait, - (atomic_read(&rtac_adm_apr_data.cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - mutex_unlock(&rtac_adm_apr_mutex); - if (!result) { - pr_err("%s: Set params timed out port = %d, copp = %d\n", - __func__, port_index, copp_id); - goto done; - } - - if (rtac_adm_payload_size != 0) { - if (copy_to_user(buf, rtac_adm_buffer, - rtac_adm_payload_size + sizeof(u32))) { - pr_err("%s: Could not copy buffer to user, size = %d\n", - __func__, payload_size); - goto done; - } - } - - /* Return data written for SET & data read for GET */ - if (opcode == ADM_CMD_GET_PARAMS) - bytes_returned = rtac_adm_payload_size; - else - bytes_returned = payload_size; -done: - return bytes_returned; -err: - mutex_unlock(&rtac_adm_apr_mutex); - return bytes_returned; -} - - -/* ASM APR */ -void rtac_set_asm_handle(u32 session_id, void *handle) -{ - pr_debug("%s\n", __func__); - - mutex_lock(&rtac_asm_apr_mutex); - rtac_asm_apr_data[session_id].apr_handle = handle; - mutex_unlock(&rtac_asm_apr_mutex); -} - -bool rtac_make_asm_callback(u32 session_id, uint32_t *payload, - u32 payload_size) -{ - if (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) != 1) - return false; - - pr_debug("%s\n", __func__); - /* Offset data for in-band payload */ - rtac_copy_asm_payload_to_user(payload, payload_size); - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 0); - wake_up(&rtac_asm_apr_data[session_id].cmd_wait); - return true; -} - -void rtac_copy_asm_payload_to_user(void *payload, u32 payload_size) -{ - pr_debug("%s\n", __func__); - rtac_asm_payload_size = payload_size; - - memcpy(rtac_asm_buffer, &payload_size, sizeof(u32)); - if (payload_size) { - if (payload_size > rtac_asm_user_buf_size) { - pr_err("%s: Buffer set not big enough for returned data, buf size = %d, ret data = %d\n", - __func__, rtac_asm_user_buf_size, payload_size); - goto done; - } - memcpy(rtac_asm_buffer + sizeof(u32), payload, payload_size); - } -done: - return; -} - -u32 send_rtac_asm_apr(void *buf, u32 opcode) -{ - s32 result; - u32 count = 0; - u32 bytes_returned = 0; - u32 session_id = 0; - u32 payload_size; - struct apr_hdr asm_params; - pr_debug("%s\n", __func__); - - if (copy_from_user(&count, (void *)buf, sizeof(count))) { - pr_err("%s: Copy to user failed! buf = 0x%x\n", - __func__, (unsigned int)buf); - result = -EFAULT; - goto done; - } - - if (count <= 0) { - pr_err("%s: Invalid buffer size = %d\n", __func__, count); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - goto done; - } - - if (copy_from_user(&session_id, buf + 2 * sizeof(u32), sizeof(u32))) { - pr_err("%s: Could not copy session id from user buffer\n", - __func__); - goto done; - } - if (session_id > (SESSION_MAX + 1)) { - pr_err("%s: Invalid Session = %d\n", __func__, session_id); - goto done; - } - - mutex_lock(&rtac_asm_apr_mutex); - if (session_id < SESSION_MAX+1) { - if (rtac_asm_apr_data[session_id].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - goto err; - } - } - - /* Set globals for copy of returned payload */ - rtac_asm_user_buf_size = count; - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_asm_buffer + sizeof(asm_params), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - goto err; - } - - /* Pack header */ - asm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - asm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - asm_params.src_svc = q6asm_get_apr_service_id(session_id); - asm_params.src_domain = APR_DOMAIN_APPS; - asm_params.src_port = (session_id << 8) | 0x0001; - asm_params.dest_svc = APR_SVC_ASM; - asm_params.dest_domain = APR_DOMAIN_ADSP; - asm_params.dest_port = (session_id << 8) | 0x0001; - asm_params.token = session_id; - asm_params.opcode = opcode; - - memcpy(rtac_asm_buffer, &asm_params, sizeof(asm_params)); - if (session_id < SESSION_MAX+1) - atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 1); - - pr_debug("%s: Sending RTAC command size = %d, session_id=%d\n", - __func__, asm_params.pkt_size, session_id); - - result = apr_send_pkt(rtac_asm_apr_data[session_id].apr_handle, - (uint32_t *)rtac_asm_buffer); - if (result < 0) { - pr_err("%s: Set params failed session = %d\n", - __func__, session_id); - goto err; - } - - /* Wait for the callback */ - result = wait_event_timeout(rtac_asm_apr_data[session_id].cmd_wait, - (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) == 0), - 5 * HZ); - mutex_unlock(&rtac_asm_apr_mutex); - if (!result) { - pr_err("%s: Set params timed out session = %d\n", - __func__, session_id); - goto done; - } - - if (rtac_asm_payload_size != 0) { - if (copy_to_user(buf, rtac_asm_buffer, - rtac_asm_payload_size + sizeof(u32))) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, payload_size); - goto done; - } - } - - /* Return data written for SET & data read for GET */ - if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS) - bytes_returned = rtac_asm_payload_size; - else - bytes_returned = payload_size; -done: - return bytes_returned; -err: - mutex_unlock(&rtac_asm_apr_mutex); - return bytes_returned; -} - - -/* Voice APR */ -void rtac_set_voice_handle(u32 mode, void *handle) -{ - pr_debug("%s\n", __func__); - mutex_lock(&rtac_voice_apr_mutex); - rtac_voice_apr_data[mode].apr_handle = handle; - mutex_unlock(&rtac_voice_apr_mutex); -} - -bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size) -{ - if ((atomic_read(&rtac_voice_apr_data[mode].cmd_state) != 1) || - (mode >= RTAC_VOICE_MODES)) - return false; - - pr_debug("%s\n", __func__); - /* Offset data for in-band payload */ - rtac_copy_voice_payload_to_user(payload, payload_size); - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 0); - wake_up(&rtac_voice_apr_data[mode].cmd_wait); - return true; -} - -void rtac_copy_voice_payload_to_user(void *payload, u32 payload_size) -{ - pr_debug("%s\n", __func__); - rtac_voice_payload_size = payload_size; - - memcpy(rtac_voice_buffer, &payload_size, sizeof(u32)); - if (payload_size) { - if (payload_size > rtac_voice_user_buf_size) { - pr_err("%s: Buffer set not big enough for returned data, buf size = %d, ret data = %d\n", - __func__, rtac_voice_user_buf_size, payload_size); - goto done; - } - memcpy(rtac_voice_buffer + sizeof(u32), payload, payload_size); - } -done: - return; -} - -u32 send_voice_apr(u32 mode, void *buf, u32 opcode) -{ - s32 result; - u32 count = 0; - u32 bytes_returned = 0; - u32 payload_size; - u32 dest_port; - struct apr_hdr voice_params; - pr_debug("%s\n", __func__); - - if (copy_from_user(&count, (void *)buf, sizeof(count))) { - pr_err("%s: Copy to user failed! buf = 0x%x\n", - __func__, (unsigned int)buf); - result = -EFAULT; - goto done; - } - - if (count <= 0) { - pr_err("%s: Invalid buffer size = %d\n", __func__, count); - goto done; - } - - if (copy_from_user(&payload_size, buf + sizeof(payload_size), - sizeof(payload_size))) { - pr_err("%s: Could not copy payload size from user buffer\n", - __func__); - goto done; - } - - if (payload_size > MAX_PAYLOAD_SIZE) { - pr_err("%s: Invalid payload size = %d\n", - __func__, payload_size); - goto done; - } - - if (copy_from_user(&dest_port, buf + 2 * sizeof(dest_port), - sizeof(dest_port))) { - pr_err("%s: Could not copy port id from user buffer\n", - __func__); - goto done; - } - - if ((mode != RTAC_CVP) && (mode != RTAC_CVS)) { - pr_err("%s: Invalid Mode for APR, mode = %d\n", - __func__, mode); - goto done; - } - - mutex_lock(&rtac_voice_apr_mutex); - if (rtac_voice_apr_data[mode].apr_handle == NULL) { - pr_err("%s: APR not initialized\n", __func__); - goto err; - } - - /* Set globals for copy of returned payload */ - rtac_voice_user_buf_size = count; - - /* Copy buffer to in-band payload */ - if (copy_from_user(rtac_voice_buffer + sizeof(voice_params), - buf + 3 * sizeof(u32), payload_size)) { - pr_err("%s: Could not copy payload from user buffer\n", - __func__); - goto err; - } - - /* Pack header */ - voice_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(20), APR_PKT_VER); - voice_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, - payload_size); - voice_params.src_svc = 0; - voice_params.src_domain = APR_DOMAIN_APPS; - voice_params.src_port = voice_session_id[ - get_voice_index(mode, dest_port)]; - voice_params.dest_svc = 0; - voice_params.dest_domain = APR_DOMAIN_MODEM; - voice_params.dest_port = (u16)dest_port; - voice_params.token = 0; - voice_params.opcode = opcode; - - memcpy(rtac_voice_buffer, &voice_params, sizeof(voice_params)); - atomic_set(&rtac_voice_apr_data[mode].cmd_state, 1); - - pr_debug("%s: Sending RTAC command size = %d, opcode = %x\n", - __func__, voice_params.pkt_size, opcode); - - result = apr_send_pkt(rtac_voice_apr_data[mode].apr_handle, - (uint32_t *)rtac_voice_buffer); - if (result < 0) { - pr_err("%s: apr_send_pkt failed opcode = %x\n", - __func__, opcode); - goto err; - } - /* Wait for the callback */ - result = wait_event_timeout(rtac_voice_apr_data[mode].cmd_wait, - (atomic_read(&rtac_voice_apr_data[mode].cmd_state) == 0), - msecs_to_jiffies(TIMEOUT_MS)); - mutex_unlock(&rtac_voice_apr_mutex); - if (!result) { - pr_err("%s: apr_send_pkt timed out opcode = %x\n", - __func__, opcode); - goto done; - } - - if (rtac_voice_payload_size != 0) { - if (copy_to_user(buf, rtac_voice_buffer, - rtac_voice_payload_size + sizeof(u32))) { - pr_err("%s: Could not copy buffer to user,size = %d\n", - __func__, payload_size); - goto done; - } - } - - /* Return data written for SET & data read for GET */ - if (opcode == VOICE_CMD_GET_PARAM) - bytes_returned = rtac_voice_payload_size; - else - bytes_returned = payload_size; -done: - return bytes_returned; -err: - mutex_unlock(&rtac_voice_apr_mutex); - return bytes_returned; -} - - - -static long rtac_ioctl(struct file *f, - unsigned int cmd, unsigned long arg) -{ - s32 result = 0; - pr_debug("%s\n", __func__); - - if (arg == 0) { - pr_err("%s: No data sent to driver!\n", __func__); - result = -EFAULT; - goto done; - } - - switch (cmd) { - case AUDIO_GET_RTAC_ADM_INFO: - if (copy_to_user((void *)arg, &rtac_adm_data, - sizeof(rtac_adm_data))) - pr_err("%s: Could not copy to userspace!\n", __func__); - else - result = sizeof(rtac_adm_data); - break; - case AUDIO_GET_RTAC_VOICE_INFO: - if (copy_to_user((void *)arg, &rtac_voice_data, - sizeof(rtac_voice_data))) - pr_err("%s: Could not copy to userspace!\n", __func__); - else - result = sizeof(rtac_voice_data); - break; - case AUDIO_GET_RTAC_ADM_CAL: - result = send_adm_apr((void *)arg, ADM_CMD_GET_PARAMS); - break; - case AUDIO_SET_RTAC_ADM_CAL: - result = send_adm_apr((void *)arg, ADM_CMD_SET_PARAMS); - break; - case AUDIO_GET_RTAC_ASM_CAL: - result = send_rtac_asm_apr((void *)arg, - ASM_STREAM_CMD_GET_PP_PARAMS); - break; - case AUDIO_SET_RTAC_ASM_CAL: - result = send_rtac_asm_apr((void *)arg, - ASM_STREAM_CMD_SET_PP_PARAMS); - break; - case AUDIO_GET_RTAC_CVS_CAL: - result = send_voice_apr(RTAC_CVS, (void *)arg, - VOICE_CMD_GET_PARAM); - break; - case AUDIO_SET_RTAC_CVS_CAL: - result = send_voice_apr(RTAC_CVS, (void *)arg, - VOICE_CMD_SET_PARAM); - break; - case AUDIO_GET_RTAC_CVP_CAL: - result = send_voice_apr(RTAC_CVP, (void *)arg, - VOICE_CMD_GET_PARAM); - break; - case AUDIO_SET_RTAC_CVP_CAL: - result = send_voice_apr(RTAC_CVP, (void *)arg, - VOICE_CMD_SET_PARAM); - break; - default: - pr_err("%s: Invalid IOCTL, command = %d!\n", - __func__, cmd); - } -done: - return result; -} - - -static const struct file_operations rtac_fops = { - .owner = THIS_MODULE, - .open = rtac_open, - .release = rtac_release, - .unlocked_ioctl = rtac_ioctl, -}; - -struct miscdevice rtac_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = "msm_rtac", - .fops = &rtac_fops, -}; - -static int __init rtac_init(void) -{ - int i = 0; - pr_debug("%s\n", __func__); - - /* ADM */ - memset(&rtac_adm_data, 0, sizeof(rtac_adm_data)); - rtac_adm_apr_data.apr_handle = NULL; - atomic_set(&rtac_adm_apr_data.cmd_state, 0); - init_waitqueue_head(&rtac_adm_apr_data.cmd_wait); - mutex_init(&rtac_adm_mutex); - mutex_init(&rtac_adm_apr_mutex); - - rtac_adm_buffer = kzalloc(RTAC_BUF_SIZE, GFP_KERNEL); - if (rtac_adm_buffer == NULL) { - pr_err("%s: Could not allocate payload of size = %d\n", - __func__, RTAC_BUF_SIZE); - goto nomem; - } - - /* ASM */ - for (i = 0; i < SESSION_MAX+1; i++) { - rtac_asm_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_asm_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_asm_apr_data[i].cmd_wait); - } - mutex_init(&rtac_asm_apr_mutex); - - rtac_asm_buffer = kzalloc(RTAC_BUF_SIZE, GFP_KERNEL); - if (rtac_asm_buffer == NULL) { - pr_err("%s: Could not allocate payload of size = %d\n", - __func__, RTAC_BUF_SIZE); - kzfree(rtac_adm_buffer); - goto nomem; - } - - /* Voice */ - memset(&rtac_voice_data, 0, sizeof(rtac_voice_data)); - for (i = 0; i < RTAC_VOICE_MODES; i++) { - rtac_voice_apr_data[i].apr_handle = NULL; - atomic_set(&rtac_voice_apr_data[i].cmd_state, 0); - init_waitqueue_head(&rtac_voice_apr_data[i].cmd_wait); - } - mutex_init(&rtac_voice_mutex); - mutex_init(&rtac_voice_apr_mutex); - - rtac_voice_buffer = kzalloc(RTAC_BUF_SIZE, GFP_KERNEL); - if (rtac_voice_buffer == NULL) { - pr_err("%s: Could not allocate payload of size = %d\n", - __func__, RTAC_BUF_SIZE); - kzfree(rtac_adm_buffer); - kzfree(rtac_asm_buffer); - goto nomem; - } - - return misc_register(&rtac_misc); -nomem: - return -ENOMEM; -} - -module_init(rtac_init); - -MODULE_DESCRIPTION("MSM 8x60 Real-Time Audio Calibration driver"); -MODULE_LICENSE("GPL v2"); - -#endif diff --git a/arch/arm/mach-msm/qdsp6v2/ultrasound/q6usm_a.c b/arch/arm/mach-msm/qdsp6v2/ultrasound/q6usm_a.c deleted file mode 100644 index 80b1aaaed85d..000000000000 --- a/arch/arm/mach-msm/qdsp6v2/ultrasound/q6usm_a.c +++ /dev/null @@ -1,1168 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "q6usm.h" - -#define SESSION_MAX 0x02 /* aDSP:USM limit */ - -#define READDONE_IDX_STATUS 0 -#define READDONE_IDX_BUFFER 1 -#define READDONE_IDX_SIZE 2 -#define READDONE_IDX_OFFSET 3 -#define READDONE_IDX_MSW_TS 4 -#define READDONE_IDX_LSW_TS 5 -#define READDONE_IDX_FLAGS 6 -#define READDONE_IDX_NUMFRAMES 7 -#define READDONE_IDX_ID 8 - -#define WRITEDONE_IDX_STATUS 0 - -/* Standard timeout in the asynchronous ops */ -#define Q6USM_TIMEOUT_JIFFIES (1*HZ) /* 1 sec */ - -static DEFINE_MUTEX(session_lock); - -static struct us_client *session[SESSION_MAX]; -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv); -static int32_t q6usm_callback(struct apr_client_data *data, void *priv); -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg); - -struct usm_mmap { - atomic_t ref_cnt; - atomic_t cmd_state; - wait_queue_head_t cmd_wait; - void *apr; -}; - -static struct usm_mmap this_mmap; - -static void q6usm_add_mmaphdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, \ - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - hdr->src_port = 0; - hdr->dest_port = 0; - if (cmd_flg) { - hdr->token = 0; - atomic_set(&this_mmap.cmd_state, 1); - } - hdr->pkt_size = pkt_size; - return; -} - -static int q6usm_memory_map(struct us_client *usc, uint32_t buf_add, int dir, - uint32_t bufsz, uint32_t bufcnt) -{ - struct usm_stream_cmd_memory_map mem_map; - int rc = 0; - - if ((usc == NULL) || (usc->apr == NULL) || (this_mmap.apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(usc, &mem_map.hdr, - sizeof(struct usm_stream_cmd_memory_map), true); - mem_map.hdr.opcode = USM_SESSION_CMD_MEMORY_MAP; - - mem_map.buf_add = buf_add; - mem_map.buf_size = bufsz * bufcnt; - mem_map.mempool_id = 0; - - pr_debug("%s: buf add[%x] buf_add_parameter[%x]\n", - __func__, mem_map.buf_add, buf_add); - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_map); - if (rc < 0) { - pr_err("%s: mem_map op[0x%x]rc[%d]\n", - __func__, mem_map.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_map\n", __func__); - } else - rc = 0; -fail_cmd: - return rc; -} - -int q6usm_memory_unmap(struct us_client *usc, uint32_t buf_add, int dir) -{ - struct usm_stream_cmd_memory_unmap mem_unmap; - int rc = 0; - - if ((usc == NULL) || (usc->apr == NULL) || (this_mmap.apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_mmaphdr(usc, &mem_unmap.hdr, - sizeof(struct usm_stream_cmd_memory_unmap), true); - mem_unmap.hdr.opcode = USM_SESSION_CMD_MEMORY_UNMAP; - mem_unmap.buf_add = buf_add; - - rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_unmap); - if (rc < 0) { - pr_err("%s:mem_unmap op[0x%x]rc[%d]\n", - __func__, mem_unmap.hdr.opcode, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(this_mmap.cmd_wait, - (atomic_read(&this_mmap.cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for memory_map\n", __func__); - } else - rc = 0; -fail_cmd: - return rc; -} - -static int q6usm_session_alloc(struct us_client *usc) -{ - int ind = 0; - - mutex_lock(&session_lock); - for (ind = 0; ind < SESSION_MAX; ++ind) { - if (!session[ind]) { - session[ind] = usc; - mutex_unlock(&session_lock); - ++ind; /* session id: 0 reserved */ - pr_debug("%s: session[%d] was allocated\n", - __func__, ind); - return ind; - } - } - mutex_unlock(&session_lock); - return -ENOMEM; -} - -static void q6usm_session_free(struct us_client *usc) -{ - /* Session index was incremented during allocation */ - uint16_t ind = (uint16_t)usc->session - 1; - - pr_debug("%s: to free session[%d]\n", __func__, ind); - if (ind < SESSION_MAX) { - mutex_lock(&session_lock); - session[ind] = 0; - mutex_unlock(&session_lock); - } -} - -int q6usm_us_client_buf_free(unsigned int dir, - struct us_client *usc) -{ - struct us_port_data *port; - int rc = 0; - uint32_t size = 0; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT))) - return -EINVAL; - - mutex_lock(&usc->cmd_lock); - port = &usc->port[dir]; - if (port == NULL) { - mutex_unlock(&usc->cmd_lock); - return -EINVAL; - } - - if (port->data == NULL) { - mutex_unlock(&usc->cmd_lock); - return 0; - } - - rc = q6usm_memory_unmap(usc, port->phys, dir); - if (rc) - pr_err("%s: CMD Memory_unmap* failed\n", __func__); - - pr_debug("%s: data[%p]phys[%p][%p]\n", __func__, - (void *)port->data, (void *)port->phys, (void *)&port->phys); - size = port->buf_size * port->buf_cnt; - dma_free_coherent(NULL, size, port->data, port->phys); - port->data = NULL; - port->phys = 0; - port->buf_size = 0; - port->buf_cnt = 0; - - mutex_unlock(&usc->cmd_lock); - return 0; -} - -void q6usm_us_client_free(struct us_client *usc) -{ - int loopcnt = 0; - struct us_port_data *port; - - if ((usc == NULL) || - !(usc->session)) - return; - - for (loopcnt = 0; loopcnt <= OUT; ++loopcnt) { - port = &usc->port[loopcnt]; - if (port->data == NULL) - continue; - pr_debug("%s: loopcnt = %d\n", __func__, loopcnt); - q6usm_us_client_buf_free(loopcnt, usc); - } - q6usm_session_free(usc); - apr_deregister(usc->apr); - - pr_debug("%s: APR De-Register\n", __func__); - - if (atomic_read(&this_mmap.ref_cnt) <= 0) { - pr_err("%s: APR Common Port Already Closed\n", __func__); - goto done; - } - - atomic_dec(&this_mmap.ref_cnt); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - apr_deregister(this_mmap.apr); - pr_debug("%s: APR De-Register common port\n", __func__); - } -done: - kfree(usc); - pr_debug("%s:\n", __func__); - return; -} - -struct us_client *q6usm_us_client_alloc( - void (*cb)(uint32_t, uint32_t, uint32_t *, void *), - void *priv) -{ - struct us_client *usc; - int n; - int lcnt = 0; - - usc = kzalloc(sizeof(struct us_client), GFP_KERNEL); - if (usc == NULL) - return NULL; - n = q6usm_session_alloc(usc); - if (n <= 0) - goto fail_session; - usc->session = n; - usc->cb = cb; - usc->priv = priv; - usc->apr = apr_register("ADSP", "USM", \ - (apr_fn)q6usm_callback,\ - ((usc->session) << 8 | 0x0001),\ - usc); - - if (usc->apr == NULL) { - pr_err("%s: Registration with APR failed\n", __func__); - goto fail; - } - pr_debug("%s: Registering the common port with APR\n", __func__); - if (atomic_read(&this_mmap.ref_cnt) == 0) { - this_mmap.apr = apr_register("ADSP", "USM", - (apr_fn)q6usm_mmapcallback, - 0x0FFFFFFFF, &this_mmap); - if (this_mmap.apr == NULL) { - pr_err("%s: USM port registration failed\n", - __func__); - goto fail; - } - } - - atomic_inc(&this_mmap.ref_cnt); - init_waitqueue_head(&usc->cmd_wait); - mutex_init(&usc->cmd_lock); - for (lcnt = 0; lcnt <= OUT; ++lcnt) { - mutex_init(&usc->port[lcnt].lock); - spin_lock_init(&usc->port[lcnt].dsp_lock); - } - atomic_set(&usc->cmd_state, 0); - - return usc; -fail: - q6usm_us_client_free(usc); - return NULL; -fail_session: - kfree(usc); - return NULL; -} - -int q6usm_us_client_buf_alloc(unsigned int dir, - struct us_client *usc, - unsigned int bufsz, - unsigned int bufcnt) -{ - int rc = 0; - struct us_port_data *port = NULL; - unsigned int size = bufsz*bufcnt; - - if ((usc == NULL) || - ((dir != IN) && (dir != OUT)) || (size == 0) || - (usc->session <= 0 || usc->session > SESSION_MAX)) { - pr_err("%s: wrong parameters: size=%d; bufcnt=%d\n", - __func__, size, bufcnt); - return -EINVAL; - } - - mutex_lock(&usc->cmd_lock); - - port = &usc->port[dir]; - - port->data = dma_alloc_coherent(NULL, size, &(port->phys), GFP_KERNEL); - if (port->data == NULL) { - pr_err("%s: US region allocation failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - return -ENOMEM; - } - - port->buf_cnt = bufcnt; - port->buf_size = bufsz; - pr_debug("%s: data[%p]; phys[%p]; [%p]\n", __func__, - (void *)port->data, - (void *)port->phys, - (void *)&port->phys); - - rc = q6usm_memory_map(usc, port->phys, dir, size, 1); - if (rc < 0) { - pr_err("%s: CMD Memory_map failed\n", __func__); - mutex_unlock(&usc->cmd_lock); - q6usm_us_client_buf_free(dir, usc); - } else { - mutex_unlock(&usc->cmd_lock); - rc = 0; - } - - return rc; -} - -static int32_t q6usm_mmapcallback(struct apr_client_data *data, void *priv) -{ - uint32_t token; - uint32_t *payload = data->payload; - - pr_debug("%s: ptr0[0x%x]; ptr1[0x%x]; opcode[0x%x]\n", - __func__, payload[0], payload[1], data->opcode); - pr_debug("%s: token[0x%x]; payload_size[%d]; src[%d]; dest[%d];\n", - __func__, data->token, data->payload_size, - data->src_port, data->dest_port); - - if (data->opcode == APR_BASIC_RSP_RESULT) { - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - } else { - token = data->token; - switch (payload[0]) { - case USM_SESSION_CMD_MEMORY_MAP: - case USM_SESSION_CMD_MEMORY_UNMAP: - pr_debug("%s: cmd[0x%x]; result[0x%x]\n", - __func__, payload[0], payload[1]); - if (atomic_read(&this_mmap.cmd_state)) { - atomic_set(&this_mmap.cmd_state, 0); - wake_up(&this_mmap.cmd_wait); - } - break; - default: - pr_debug("%s: wrong command[0x%x]\n", - __func__, payload[0]); - break; - } - } - } - return 0; -} - - -static int32_t q6usm_callback(struct apr_client_data *data, void *priv) -{ - struct us_client *usc = (struct us_client *)priv; - unsigned long dsp_flags; - uint32_t *payload = data->payload; - uint32_t token = data->token; - uint32_t opcode = Q6USM_EVENT_UNDEF; - - if (usc == NULL) { - pr_err("%s: client info is NULL\n", __func__); - return -EINVAL; - } - - if (data->opcode == APR_BASIC_RSP_RESULT) { - /* status field check */ - if (payload[1]) { - pr_err("%s: wrong response[%d] on cmd [%d]\n", - __func__, payload[1], payload[0]); - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, usc->priv); - } else { - switch (payload[0]) { - case USM_SESSION_CMD_RUN: - case USM_STREAM_CMD_CLOSE: - if (token != usc->session) { - pr_err("%s: wrong token[%d]", - __func__, token); - break; - } - case USM_STREAM_CMD_OPEN_READ: - case USM_STREAM_CMD_OPEN_WRITE: - case USM_STREAM_CMD_SET_ENC_PARAM: - case USM_DATA_CMD_MEDIA_FORMAT_UPDATE: - case USM_SESSION_CMD_SIGNAL_DETECT_MODE: - if (atomic_read(&usc->cmd_state)) { - atomic_set(&usc->cmd_state, 0); - wake_up(&usc->cmd_wait); - } - if (usc->cb) - usc->cb(data->opcode, token, - (uint32_t *)data->payload, - usc->priv); - break; - default: - break; - } - } - return 0; - } - - switch (data->opcode) { - case USM_DATA_EVENT_READ_DONE: { - struct us_port_data *port = &usc->port[OUT]; - - opcode = Q6USM_EVENT_READ_DONE; - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - if (payload[READDONE_IDX_STATUS]) { - pr_err("%s: wrong READDONE[%d]; token[%d]\n", - __func__, - payload[READDONE_IDX_STATUS], - token); - token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } - - if (port->expected_token != token) { - u32 cpu_buf = port->cpu_buf; - pr_err("%s: expected[%d] != token[%d]\n", - __func__, port->expected_token, token); - pr_debug("%s: dsp_buf=%d; cpu_buf=%d;\n", - __func__, port->dsp_buf, cpu_buf); - - token = USM_WRONG_TOKEN; - /* To prevent data handle continiue */ - port->expected_token = USM_WRONG_TOKEN; - spin_unlock_irqrestore(&port->dsp_lock, - dsp_flags); - break; - } /* port->expected_token != data->token */ - - port->expected_token = token + 1; - if (port->expected_token == port->buf_cnt) - port->expected_token = 0; - - /* gap support */ - if (port->expected_token != port->cpu_buf) { - port->dsp_buf = port->expected_token; - token = port->dsp_buf; /* for callback */ - } else - port->dsp_buf = token; - - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - break; - } /* case USM_DATA_EVENT_READ_DONE */ - - case USM_DATA_EVENT_WRITE_DONE: { - struct us_port_data *port = &usc->port[IN]; - - opcode = Q6USM_EVENT_WRITE_DONE; - if (payload[WRITEDONE_IDX_STATUS]) { - pr_err("%s: wrong WRITEDONE_IDX_STATUS[%d]\n", - __func__, - payload[WRITEDONE_IDX_STATUS]); - break; - } - - spin_lock_irqsave(&port->dsp_lock, dsp_flags); - port->dsp_buf = token + 1; - if (port->dsp_buf == port->buf_cnt) - port->dsp_buf = 0; - spin_unlock_irqrestore(&port->dsp_lock, dsp_flags); - - break; - } /* case USM_DATA_EVENT_WRITE_DONE */ - - case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT: { - pr_debug("%s: US detect result: result=%d", - __func__, - payload[0]); - opcode = Q6USM_EVENT_SIGNAL_DETECT_RESULT; - - break; - } /* case USM_SESSION_EVENT_SIGNAL_DETECT_RESULT */ - - default: - return 0; - - } /* switch */ - - if (usc->cb) - usc->cb(opcode, token, - data->payload, usc->priv); - - return 0; -} - -uint32_t q6usm_get_virtual_address(int dir, - struct us_client *usc, - struct vm_area_struct *vms) -{ - uint32_t ret = 0xffffffff; - - if (vms && (usc != NULL) && ((dir == IN) || (dir == OUT))) { - struct us_port_data *port = &usc->port[dir]; - ret = dma_mmap_coherent(NULL, vms, - port->data, port->phys, - port->buf_size * port->buf_cnt); - } - return ret; -} - -static void q6usm_add_hdr(struct us_client *usc, struct apr_hdr *hdr, - uint32_t pkt_size, bool cmd_flg) -{ - mutex_lock(&usc->cmd_lock); - hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, \ - APR_HDR_LEN(sizeof(struct apr_hdr)),\ - APR_PKT_VER); - hdr->src_svc = ((struct apr_svc *)usc->apr)->id; - hdr->src_domain = APR_DOMAIN_APPS; - hdr->dest_svc = APR_SVC_USM; - hdr->dest_domain = APR_DOMAIN_ADSP; - hdr->src_port = (usc->session << 8) | 0x0001; - hdr->dest_port = (usc->session << 8) | 0x0001; - if (cmd_flg) { - hdr->token = usc->session; - atomic_set(&usc->cmd_state, 1); - } - hdr->pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, pkt_size); - mutex_unlock(&usc->cmd_lock); - return; -} - -static uint32_t q6usm_ext2int_format(uint32_t ext_format) -{ - uint32_t int_format = INVALID_FORMAT; - switch (ext_format) { - case FORMAT_USPS_EPOS: - int_format = US_POINT_EPOS_FORMAT; - break; - case FORMAT_USRAW: - int_format = US_RAW_FORMAT; - break; - case FORMAT_USPROX: - int_format = US_PROX_FORMAT; - break; - default: - pr_err("%s: Invalid format[%d]\n", __func__, ext_format); - break; - } - - return int_format; -} - -int q6usm_open_read(struct us_client *usc, - uint32_t format) -{ - uint32_t int_format = INVALID_FORMAT; - int rc = 0x00; - struct usm_stream_cmd_open_read open; - - pr_debug("%s: session[%d]", __func__, usc->session); - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: client or its apr is NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_READ; - open.src_endpoint = 0; /* AFE */ - open.pre_proc_top = 0; /* No preprocessing required */ - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) - return -EINVAL; - - open.uMode = STREAM_PRIORITY_NORMAL; - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s: open failed op[0x%x]rc[%d]\n", - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout, waited for OPEN_READ rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; -fail_cmd: - return rc; -} - - -int q6usm_enc_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_encdec_cfg_blk enc_cfg_obj; - struct usm_stream_cmd_encdec_cfg_blk *enc_cfg = &enc_cfg_obj; - int rc = 0; - uint32_t total_cfg_size = - sizeof(struct usm_stream_cmd_encdec_cfg_blk); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - size_t min_common_size; - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is requred */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - enc_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (enc_cfg == NULL) { - pr_err("%s: enc_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else - round_params_size = 0; - - q6usm_add_hdr(usc, &enc_cfg->hdr, total_cfg_size - APR_HDR_SIZE, true); - - enc_cfg->hdr.opcode = USM_STREAM_CMD_SET_ENC_PARAM; - enc_cfg->param_id = USM_PARAM_ID_ENCDEC_ENC_CFG_BLK; - enc_cfg->param_size = sizeof(struct usm_encode_cfg_blk)+ - round_params_size; - enc_cfg->enc_blk.frames_per_buf = 1; - enc_cfg->enc_blk.format_id = int_format; - min_common_size = min(sizeof(struct usm_cfg_common), - sizeof(struct usm_cfg_common_a)); - enc_cfg->enc_blk.cfg_size = min_common_size + - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(enc_cfg->enc_blk.cfg_common), &(us_cfg->cfg_common), - min_common_size); - /* Transparent data copy */ - memcpy(enc_cfg->enc_blk.transp_data, us_cfg->params, - us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]\n", - __func__, - enc_cfg->enc_blk.cfg_size, - us_cfg->params_size); - pr_debug("%s: params[%d,%d,%d,%d, %d,%d,%d,%d]\n", - __func__, - enc_cfg->enc_blk.transp_data[0], - enc_cfg->enc_blk.transp_data[1], - enc_cfg->enc_blk.transp_data[2], - enc_cfg->enc_blk.transp_data[3], - enc_cfg->enc_blk.transp_data[4], - enc_cfg->enc_blk.transp_data[5], - enc_cfg->enc_blk.transp_data[6], - enc_cfg->enc_blk.transp_data[7] - ); - pr_debug("%s: srate:%d, ch=%d, bps= %d; dmap:[0x%x,0x%x,0x%x,0x%x];\n", - __func__, enc_cfg->enc_blk.cfg_common.sample_rate, - enc_cfg->enc_blk.cfg_common.ch_cfg, - enc_cfg->enc_blk.cfg_common.bits_per_sample, - enc_cfg->enc_blk.cfg_common.data_map[0], - enc_cfg->enc_blk.cfg_common.data_map[1], - enc_cfg->enc_blk.cfg_common.data_map[2], - enc_cfg->enc_blk.cfg_common.data_map[3]); - pr_debug("dev_id=0x%x\n", - enc_cfg->enc_blk.cfg_common.dev_id); - - rc = apr_send_pkt(usc->apr, (uint32_t *) enc_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, enc_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(enc_cfg); - - return rc; -} - -int q6usm_dec_cfg_blk(struct us_client *usc, struct us_encdec_cfg *us_cfg) -{ - - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_media_format_update dec_cfg_obj; - struct usm_stream_media_format_update *dec_cfg = &dec_cfg_obj; - - int rc = 0; - uint32_t total_cfg_size = sizeof(struct usm_stream_media_format_update); - uint32_t round_params_size = 0; - uint8_t is_allocated = 0; - size_t min_common_size; - - if ((usc == NULL) || (us_cfg == NULL)) { - pr_err("%s: wrong input", __func__); - return -EINVAL; - } - - int_format = q6usm_ext2int_format(us_cfg->format_id); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong input format[%d]", - __func__, us_cfg->format_id); - return -EINVAL; - } - - /* Transparent configuration data is after enc_cfg */ - /* Integer number of u32s is requred */ - round_params_size = ((us_cfg->params_size + 3)/4) * 4; - if (round_params_size > USM_MAX_CFG_DATA_SIZE) { - /* Dynamic allocated encdec_cfg_blk is required */ - /* static part use */ - round_params_size -= USM_MAX_CFG_DATA_SIZE; - total_cfg_size += round_params_size; - dec_cfg = kzalloc(total_cfg_size, GFP_KERNEL); - if (dec_cfg == NULL) { - pr_err("%s:dec_cfg[%d] allocation failed\n", - __func__, total_cfg_size); - return -ENOMEM; - } - is_allocated = 1; - } else { /* static transp_data is enough */ - round_params_size = 0; - } - - q6usm_add_hdr(usc, &dec_cfg->hdr, total_cfg_size - APR_HDR_SIZE, true); - - dec_cfg->hdr.opcode = USM_DATA_CMD_MEDIA_FORMAT_UPDATE; - dec_cfg->format_id = int_format; - min_common_size = min(sizeof(struct usm_cfg_common), - sizeof(struct usm_cfg_common_a)); - dec_cfg->cfg_size = min_common_size + - USM_MAX_CFG_DATA_SIZE + - round_params_size; - memcpy(&(dec_cfg->cfg_common), &(us_cfg->cfg_common), - min_common_size); - /* Transparent data copy */ - memcpy(dec_cfg->transp_data, us_cfg->params, us_cfg->params_size); - pr_debug("%s: cfg_size[%d], params_size[%d]; parambytes[%d,%d,%d,%d]\n", - __func__, - dec_cfg->cfg_size, - us_cfg->params_size, - dec_cfg->transp_data[0], - dec_cfg->transp_data[1], - dec_cfg->transp_data[2], - dec_cfg->transp_data[3] - ); - - rc = apr_send_pkt(usc->apr, (uint32_t *) dec_cfg); - if (rc < 0) { - pr_err("%s:Comamnd open failed\n", __func__); - rc = -EINVAL; - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout opcode[0x%x]\n", - __func__, dec_cfg->hdr.opcode); - } else - rc = 0; - -fail_cmd: - if (is_allocated == 1) - kfree(dec_cfg); - - return rc; -} - -int q6usm_open_write(struct us_client *usc, - uint32_t format) -{ - int rc = 0; - uint32_t int_format = INVALID_FORMAT; - struct usm_stream_cmd_open_write open; - - pr_debug("%s: session[%d]", __func__, usc->session); - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - - q6usm_add_hdr(usc, &open.hdr, sizeof(open), true); - open.hdr.opcode = USM_STREAM_CMD_OPEN_WRITE; - - int_format = q6usm_ext2int_format(format); - if (int_format == INVALID_FORMAT) { - pr_err("%s: wrong format[%d]", __func__, format); - return -EINVAL; - } - - open.format = int_format; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &open); - if (rc < 0) { - pr_err("%s:open failed op[0x%x]rc[%d]\n", \ - __func__, open.hdr.opcode, rc); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for OPEN_WRITR rc[%d]\n", - __func__, rc); - goto fail_cmd; - } else - rc = 0; - -fail_cmd: - return rc; -} - -int q6usm_run(struct us_client *usc, uint32_t flags, - uint32_t msw_ts, uint32_t lsw_ts) -{ - struct usm_stream_cmd_run run; - int rc = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &run.hdr, sizeof(run), true); - - run.hdr.opcode = USM_SESSION_CMD_RUN; - run.flags = flags; - run.msw_ts = msw_ts; - run.lsw_ts = lsw_ts; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &run); - if (rc < 0) { - pr_err("%s: Commmand run failed[%d]\n", __func__, rc); - goto fail_cmd; - } - - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: timeout. waited for run success rc[%d]\n", - __func__, rc); - } else - rc = 0; - -fail_cmd: - return rc; -} - - - -int q6usm_read(struct us_client *usc, uint32_t read_ind) -{ - struct usm_stream_cmd_read read; - struct us_port_data *port = NULL; - int rc = 0; - u32 read_counter = 0; - u32 loop_ind = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[OUT]; - - if (read_ind > port->buf_cnt) { - pr_err("%s: wrong read_ind[%d]\n", - __func__, read_ind); - return -EINVAL; - } - if (read_ind == port->cpu_buf) { - pr_err("%s: no free region\n", __func__); - return 0; - } - - if (read_ind > port->cpu_buf) { /* 1 range */ - read_counter = read_ind - port->cpu_buf; - } else { /* 2 ranges */ - read_counter = (port->buf_cnt - port->cpu_buf) + read_ind; - } - - q6usm_add_hdr(usc, &read.hdr, (sizeof(read) - APR_HDR_SIZE), false); - - read.hdr.opcode = USM_DATA_CMD_READ; - read.buf_size = port->buf_size; - - for (loop_ind = 0; loop_ind < read_counter; ++loop_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - read.buf_add = (uint32_t)(port->phys) + - port->buf_size * (port->cpu_buf); - read.uid = port->cpu_buf; - read.hdr.token = port->cpu_buf; - read.counter = 1; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &read); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - - pr_err("%s:read op[0x%x]rc[%d]\n", - __func__, read.hdr.opcode, rc); - break; - } else - rc = 0; - } /* bufs loop */ - - return rc; -} - -int q6usm_write(struct us_client *usc, uint32_t write_ind) -{ - int rc = 0; - struct usm_stream_cmd_write cmd_write; - struct us_port_data *port = NULL; - u32 current_dsp_buf = 0; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - port = &usc->port[IN]; - - current_dsp_buf = port->dsp_buf; - /* free region, caused by new dsp_buf report from DSP, */ - /* can be only extended */ - if (port->cpu_buf >= current_dsp_buf) { - /* 2 -part free region, including empty buffer */ - if ((write_ind <= port->cpu_buf) && - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } else { - /* 1 -part free region */ - if ((write_ind <= port->cpu_buf) || - (write_ind > current_dsp_buf)) { - pr_err("%s: wrong w_ind[%d]; d_buf=%d; c_buf=%d\n", - __func__, write_ind, - current_dsp_buf, port->cpu_buf); - return -EINVAL; - } - } - - q6usm_add_hdr(usc, &cmd_write.hdr, - (sizeof(cmd_write) - APR_HDR_SIZE), false); - - cmd_write.hdr.opcode = USM_DATA_CMD_WRITE; - cmd_write.buf_size = port->buf_size; - - while (port->cpu_buf != write_ind) { - u32 temp_cpu_buf = port->cpu_buf; - - cmd_write.buf_add = (uint32_t)(port->phys) + - port->buf_size * (port->cpu_buf); - cmd_write.uid = port->cpu_buf; - cmd_write.hdr.token = port->cpu_buf; - - ++(port->cpu_buf); - if (port->cpu_buf == port->buf_cnt) - port->cpu_buf = 0; - - rc = apr_send_pkt(usc->apr, (uint32_t *) &cmd_write); - - if (rc < 0) { - port->cpu_buf = temp_cpu_buf; - pr_err("%s:write op[0x%x];rc[%d];cpu_buf[%d]\n", - __func__, cmd_write.hdr.opcode, - rc, port->cpu_buf); - break; - } - - rc = 0; - } - - return rc; -} - -bool q6usm_is_write_buf_full(struct us_client *usc, uint32_t *free_region) -{ - struct us_port_data *port = NULL; - u32 cpu_buf = 0; - - if ((usc == NULL) || !free_region) { - pr_err("%s: input data wrong\n", __func__); - return false; - } - port = &usc->port[IN]; - cpu_buf = port->cpu_buf + 1; - if (cpu_buf == port->buf_cnt) - cpu_buf = 0; - - *free_region = port->dsp_buf; - - return cpu_buf == *free_region; -} - -int q6usm_cmd(struct us_client *usc, int cmd) -{ - struct apr_hdr hdr; - int rc = 0; - atomic_t *state; - - if ((usc == NULL) || (usc->apr == NULL)) { - pr_err("%s: APR handle NULL\n", __func__); - return -EINVAL; - } - q6usm_add_hdr(usc, &hdr, (sizeof(hdr) - APR_HDR_SIZE), true); - switch (cmd) { - case CMD_CLOSE: - hdr.opcode = USM_STREAM_CMD_CLOSE; - state = &usc->cmd_state; - break; - - default: - pr_err("%s:Invalid format[%d]\n", __func__, cmd); - goto fail_cmd; - } - - rc = apr_send_pkt(usc->apr, (uint32_t *) &hdr); - if (rc < 0) { - pr_err("%s: Command 0x%x failed\n", __func__, hdr.opcode); - goto fail_cmd; - } - rc = wait_event_timeout(usc->cmd_wait, (atomic_read(state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s:timeout. waited for response opcode[0x%x]\n", - __func__, hdr.opcode); - } else - rc = 0; -fail_cmd: - return rc; -} - -int q6usm_set_us_detection(struct us_client *usc, - struct usm_session_cmd_detect_info *detect_info, - uint16_t detect_info_size) -{ - int rc = 0; - - if ((usc == NULL) || - (detect_info_size == 0) || - (detect_info == NULL)) { - pr_err("%s: wrong input: usc=0x%p, inf_size=%d; info=0x%p", - __func__, - usc, - detect_info_size, - detect_info); - return -EINVAL; - } - - q6usm_add_hdr(usc, &detect_info->hdr, - detect_info_size - APR_HDR_SIZE, true); - - detect_info->hdr.opcode = USM_SESSION_CMD_SIGNAL_DETECT_MODE; - - rc = apr_send_pkt(usc->apr, (uint32_t *)detect_info); - if (rc < 0) { - pr_err("%s:Comamnd signal detect failed\n", __func__); - return -EINVAL; - } - rc = wait_event_timeout(usc->cmd_wait, - (atomic_read(&usc->cmd_state) == 0), - Q6USM_TIMEOUT_JIFFIES); - if (!rc) { - rc = -ETIME; - pr_err("%s: CMD_SIGNAL_DETECT_MODE: timeout=%d\n", - __func__, Q6USM_TIMEOUT_JIFFIES); - } else - rc = 0; - - return rc; -} - -static int __init q6usm_init(void) -{ - pr_debug("%s\n", __func__); - init_waitqueue_head(&this_mmap.cmd_wait); - memset(session, 0, sizeof(session)); - return 0; -} - -device_initcall(q6usm_init); diff --git a/arch/arm/mach-msm/restart-fsm9xxx.c b/arch/arm/mach-msm/restart-fsm9xxx.c deleted file mode 100644 index d65756f8bfa4..000000000000 --- a/arch/arm/mach-msm/restart-fsm9xxx.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2011, 2013 The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define FEMTO_GPIO_PS_HOLD 161 - -void fsm_restart(char mode, const char *cmd) -{ - pr_notice("Going down for restart now\n"); - mdelay(3000); - - /* Configure FEMTO_GPIO_PS_HOLD as a general purpose output */ - if (gpio_tlmm_config(GPIO_CFG(FEMTO_GPIO_PS_HOLD, 0, - GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, - GPIO_CFG_2MA), GPIO_CFG_ENABLE)) - pr_err("%s: gpio_tlmm_config (gpio=%d) failed\n", - __func__, FEMTO_GPIO_PS_HOLD); - - /* Now set it low to power cycle the entire board */ - gpio_set_value(FEMTO_GPIO_PS_HOLD, 0); - - mdelay(10000); - pr_err("Restarting has failed\n"); -} diff --git a/arch/arm/mach-msm/restart_7k.c b/arch/arm/mach-msm/restart_7k.c deleted file mode 100644 index 14f55f8cbf77..000000000000 --- a/arch/arm/mach-msm/restart_7k.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "devices-msm7x2xa.h" - -static uint32_t restart_reason = 0x776655AA; - -static void msm_pm_power_off(void) -{ - msm_proc_comm(PCOM_POWER_DOWN, 0, 0); - for (;;) - ; -} - -static void msm_pm_restart(char str, const char *cmd) -{ - pr_debug("The reset reason is %x\n", restart_reason); - - /* Disable interrupts */ - local_irq_disable(); - local_fiq_disable(); - - /* - * Take out a flat memory mapping and will - * insert a 1:1 mapping in place of - * the user-mode pages to ensure predictable results - * This function takes care of flushing the caches - * and flushing the TLB. - */ - setup_mm_for_reboot(); - - msm_proc_comm(PCOM_RESET_CHIP, &restart_reason, 0); - - for (;;) - ; -} - -static int msm_reboot_call - (struct notifier_block *this, unsigned long code, void *_cmd) -{ - if ((code == SYS_RESTART) && _cmd) { - char *cmd = _cmd; - if (!strncmp(cmd, "bootloader", 10)) { - restart_reason = 0x77665500; - } else if (!strncmp(cmd, "recovery", 8)) { - restart_reason = 0x77665502; - } else if (!strncmp(cmd, "eraseflash", 10)) { - restart_reason = 0x776655EF; - } else if (!strncmp(cmd, "oem-", 4)) { - unsigned long code; - int res; - res = kstrtoul(cmd + 4, 16, &code); - code &= 0xff; - restart_reason = 0x6f656d00 | code; - } else { - restart_reason = 0x77665501; - } - } - return NOTIFY_DONE; -} - -static struct notifier_block msm_reboot_notifier = { - .notifier_call = msm_reboot_call, -}; - -static int __init msm_pm_restart_init(void) -{ - int ret; - - pm_power_off = msm_pm_power_off; - arm_pm_restart = msm_pm_restart; - - ret = register_reboot_notifier(&msm_reboot_notifier); - if (ret) - pr_err("Failed to register reboot notifier\n"); - - return ret; -} -late_initcall(msm_pm_restart_init); diff --git a/arch/arm/mach-msm/rfic-fsm9xxx.c b/arch/arm/mach-msm/rfic-fsm9xxx.c deleted file mode 100644 index ef13631d53a0..000000000000 --- a/arch/arm/mach-msm/rfic-fsm9xxx.c +++ /dev/null @@ -1,397 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* - * FTR8700 RFIC - */ - -#define RFIC_FTR_DEVICE_NUM 2 -#define RFIC_GRFC_REG_NUM 6 - -#define ANY_BUS 0x0 -#define TX1_BUS 0x0 -#define TX2_BUS 0x1 -#define MISC_BUS 0x2 -#define RX_BUS 0x3 -#define BUS_BITS 0x3 - -/* - * Device private information per device node - */ - -static struct ftr_dev_node_info { - void *grfcCtrlAddr; - void *grfcMaskAddr; - unsigned int busSelect[4]; - struct i2c_adapter *ssbi_adap; - - /* lock */ - struct mutex lock; -} ftr_dev_info[RFIC_FTR_DEVICE_NUM]; - -/* - * Device private information per file - */ - -struct ftr_dev_file_info { - int ftrId; -}; - -/* - * File interface - */ - -static int ftr_find_id(int minor); - -static int ftr_open(struct inode *inode, struct file *file) -{ - struct ftr_dev_file_info *pdfi; - - /* private data allocation */ - pdfi = kmalloc(sizeof(*pdfi), GFP_KERNEL); - if (pdfi == NULL) - return -ENOMEM; - file->private_data = pdfi; - - /* FTR ID */ - pdfi->ftrId = ftr_find_id(MINOR(inode->i_rdev)); - - return 0; -} - -static int ftr_release(struct inode *inode, struct file *file) -{ - struct ftr_dev_file_info *pdfi; - - pdfi = (struct ftr_dev_file_info *) file->private_data; - - kfree(file->private_data); - file->private_data = NULL; - - return 0; -} - -static ssize_t ftr_read(struct file *filp, char __user *buf, size_t count, - loff_t *f_pos) -{ - return 0; -} - -static ssize_t ftr_write(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) -{ - return 0; -} - -static int ftr_ssbi_read( - struct ftr_dev_node_info *pdev, - unsigned int addr, - u8 *buf, - size_t len) -{ - int ret; - struct i2c_msg msg = { - .addr = addr, - .flags = I2C_M_RD, - .buf = buf, - .len = len, - }; - - ret = i2c_transfer(pdev->ssbi_adap, &msg, 1); - - return (ret == 1) ? 0 : ret; -} - -static int ftr_ssbi_write( - struct ftr_dev_node_info *pdev, - unsigned int addr, - u8 *buf, - size_t len) -{ - int ret; - struct i2c_msg msg = { - .addr = addr, - .flags = 0x0, - .buf = (u8 *) buf, - .len = len, - }; - - ret = i2c_transfer(pdev->ssbi_adap, &msg, 1); - - return (ret == 1) ? 0 : ret; -} - -static long ftr_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - unsigned int __user *argp = (unsigned int __user *) arg; - struct ftr_dev_file_info *pdfi = - (struct ftr_dev_file_info *) file->private_data; - struct ftr_dev_node_info *pdev; - - if (pdfi->ftrId < 0 || pdfi->ftrId >= RFIC_FTR_DEVICE_NUM) - return -EINVAL; - - pdev = ftr_dev_info + pdfi->ftrId; - - switch (cmd) { - case RFIC_IOCTL_READ_REGISTER: - { - int ret; - unsigned int rficAddr; - u8 value; - - if (get_user(rficAddr, argp)) - return -EFAULT; - - mutex_lock(&pdev->lock); - mb(); - /* Need to write twice due to bug in hardware */ - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - mb(); - ret = ftr_ssbi_read(pdev, RFIC_FTR_GET_ADDR(rficAddr), - &value, 1); - mutex_unlock(&pdev->lock); - - if (ret) - return ret; - - if (put_user(value, argp)) - return -EFAULT; - } - break; - - case RFIC_IOCTL_WRITE_REGISTER: - { - int ret; - struct rfic_write_register_param param; - unsigned int rficAddr; - u8 value; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - rficAddr = param.rficAddr; - value = (u8) param.value; - - mutex_lock(&pdev->lock); - mb(); - /* Need to write twice due to bug in hardware */ - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - mb(); - ret = ftr_ssbi_write(pdev, RFIC_FTR_GET_ADDR(rficAddr), - &value, 1); - mutex_unlock(&pdev->lock); - - if (ret) - return ret; - } - break; - - case RFIC_IOCTL_WRITE_REGISTER_WITH_MASK: - { - int ret; - struct rfic_write_register_mask_param param; - unsigned int rficAddr; - u8 value; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - rficAddr = param.rficAddr; - - mutex_lock(&pdev->lock); - mb(); - /* Need to write twice due to bug in hardware */ - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - __raw_writel( - pdev->busSelect[RFIC_FTR_GET_BUS(rficAddr)], - pdev->grfcCtrlAddr); - mb(); - ret = ftr_ssbi_read(pdev, RFIC_FTR_GET_ADDR(rficAddr), - &value, 1); - value &= (u8) ~param.mask; - value |= (u8) (param.value & param.mask); - ret = ftr_ssbi_write(pdev, RFIC_FTR_GET_ADDR(rficAddr), - &value, 1); - mutex_unlock(&pdev->lock); - - if (ret) - return ret; - } - break; - - case RFIC_IOCTL_GET_GRFC: - { - struct rfic_grfc_param param; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - - if (param.grfcId >= RFIC_GRFC_REG_NUM) - return -EINVAL; - - param.maskValue = __raw_readl( - MSM_GRFC_BASE + 0x18 + param.grfcId * 4); - param.ctrlValue = __raw_readl( - MSM_GRFC_BASE + 0x00 + param.grfcId * 4); - - if (copy_to_user(argp, ¶m, sizeof param)) - return -EFAULT; - } - break; - - case RFIC_IOCTL_SET_GRFC: - { - struct rfic_grfc_param param; - - if (copy_from_user(¶m, argp, sizeof param)) - return -EFAULT; - - if (param.grfcId >= RFIC_GRFC_REG_NUM) - return -EINVAL; - - __raw_writel(param.maskValue, - MSM_GRFC_BASE + 0x18 + param.grfcId * 4); - /* Need to write twice due to bug in hardware */ - __raw_writel(param.ctrlValue, - MSM_GRFC_BASE + 0x00 + param.grfcId * 4); - __raw_writel(param.ctrlValue, - MSM_GRFC_BASE + 0x00 + param.grfcId * 4); - mb(); - } - break; - - default: - return -EINVAL; - } - - return 0; -} - -static const struct file_operations ftr_fops = { - .owner = THIS_MODULE, - .open = ftr_open, - .release = ftr_release, - .read = ftr_read, - .write = ftr_write, - .unlocked_ioctl = ftr_ioctl, -}; - -/* - * Driver initialization & cleanup - */ - -struct miscdevice ftr_misc_dev[RFIC_FTR_DEVICE_NUM] = { - { - .minor = MISC_DYNAMIC_MINOR, - .name = RFIC_FTR_DEVICE_NAME "0", - .fops = &ftr_fops, - }, - { - .minor = MISC_DYNAMIC_MINOR, - .name = RFIC_FTR_DEVICE_NAME "1", - .fops = &ftr_fops, - }, -}; - -int ftr_find_id(int minor) -{ - int i; - - for (i = 0; i < RFIC_FTR_DEVICE_NUM; ++i) - if (ftr_misc_dev[i].minor == minor) - break; - - return i; -} - -static int __init ftr_init(void) -{ - int i, ret; - struct ftr_dev_node_info *pdev; - - for (i = 0; i < RFIC_FTR_DEVICE_NUM; ++i) { - pdev = ftr_dev_info + i; - - if (i == 0) { - pdev->grfcCtrlAddr = MSM_GRFC_BASE + 0x00; - pdev->grfcMaskAddr = MSM_GRFC_BASE + 0x18; - __raw_writel(0x300000, pdev->grfcMaskAddr); - pdev->busSelect[TX1_BUS] = 0x000000; - pdev->busSelect[TX2_BUS] = 0x100000; - pdev->busSelect[MISC_BUS] = 0x200000; - pdev->busSelect[RX_BUS] = 0x300000; - pdev->ssbi_adap = i2c_get_adapter(1); - } else { - pdev->grfcCtrlAddr = MSM_GRFC_BASE + 0x04; - pdev->grfcMaskAddr = MSM_GRFC_BASE + 0x1c; - __raw_writel(0x480000, pdev->grfcMaskAddr); - pdev->busSelect[TX1_BUS] = 0x000000; - pdev->busSelect[TX2_BUS] = 0x400000; - pdev->busSelect[MISC_BUS] = 0x080000; - pdev->busSelect[RX_BUS] = 0x480000; - pdev->ssbi_adap = i2c_get_adapter(2); - } - - mutex_init(&pdev->lock); - ret = misc_register(ftr_misc_dev + i); - - if (ret < 0) { - while (--i >= 0) - misc_deregister(ftr_misc_dev + i); - return ret; - } - } - - return 0; -} - -static void __exit ftr_exit(void) -{ - int i; - - for (i = 0; i < RFIC_FTR_DEVICE_NUM; ++i) - misc_deregister(ftr_misc_dev + i); -} - -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Rohit Vaswani "); -MODULE_DESCRIPTION("Qualcomm FSM RFIC driver"); -MODULE_VERSION("1.0"); - -module_init(ftr_init); -module_exit(ftr_exit); diff --git a/arch/arm/mach-msm/rpcrouter_sdio_xprt.c b/arch/arm/mach-msm/rpcrouter_sdio_xprt.c deleted file mode 100644 index e9818e51ac7c..000000000000 --- a/arch/arm/mach-msm/rpcrouter_sdio_xprt.c +++ /dev/null @@ -1,655 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * RPCROUTER SDIO XPRT module. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "smd_rpcrouter.h" - -enum { - MSM_SDIO_XPRT_DEBUG = 1U << 0, - MSM_SDIO_XPRT_INFO = 1U << 1, -}; - -static int msm_sdio_xprt_debug_mask; -module_param_named(debug_mask, msm_sdio_xprt_debug_mask, - int, S_IRUGO | S_IWUSR | S_IWGRP); - -#if defined(CONFIG_MSM_RPC_SDIO_DEBUG) -#define SDIO_XPRT_DBG(x...) do { \ - if (msm_sdio_xprt_debug_mask & MSM_SDIO_XPRT_DEBUG) \ - printk(KERN_DEBUG x); \ - } while (0) - -#define SDIO_XPRT_INFO(x...) do { \ - if (msm_sdio_xprt_debug_mask & MSM_SDIO_XPRT_INFO) \ - printk(KERN_INFO x); \ - } while (0) -#else -#define SDIO_XPRT_DBG(x...) do { } while (0) -#define SDIO_XPRT_INFO(x...) do { } while (0) -#endif - -#define MAX_SDIO_WRITE_RETRY 5 -#define SDIO_BUF_SIZE (RPCROUTER_MSGSIZE_MAX + sizeof(struct rr_header) - 8) -#define NUM_SDIO_BUFS 20 -#define MAX_TX_BUFS 10 -#define MAX_RX_BUFS 10 - -struct sdio_xprt { - struct sdio_channel *handle; - - struct list_head write_list; - spinlock_t write_list_lock; - - struct list_head read_list; - spinlock_t read_list_lock; - - struct list_head free_list; - spinlock_t free_list_lock; - - struct wake_lock read_wakelock; -}; - -struct rpcrouter_sdio_xprt { - struct rpcrouter_xprt xprt; - struct sdio_xprt *channel; -}; - -static struct rpcrouter_sdio_xprt sdio_remote_xprt; - -static void sdio_xprt_read_data(struct work_struct *work); -static DECLARE_DELAYED_WORK(work_read_data, sdio_xprt_read_data); -static struct workqueue_struct *sdio_xprt_read_workqueue; - -struct sdio_buf_struct { - struct list_head list; - uint32_t size; - uint32_t read_index; - uint32_t write_index; - unsigned char data[SDIO_BUF_SIZE]; -}; - -static void sdio_xprt_write_data(struct work_struct *work); -static DECLARE_WORK(work_write_data, sdio_xprt_write_data); -static wait_queue_head_t write_avail_wait_q; -static uint32_t num_free_bufs; -static uint32_t num_tx_bufs; -static uint32_t num_rx_bufs; - -static DEFINE_MUTEX(modem_reset_lock); -static uint32_t modem_reset; - -static void free_sdio_xprt(struct sdio_xprt *chnl) -{ - struct sdio_buf_struct *buf; - unsigned long flags; - - if (!chnl) { - printk(KERN_ERR "Invalid chnl to free\n"); - return; - } - - spin_lock_irqsave(&chnl->free_list_lock, flags); - while (!list_empty(&chnl->free_list)) { - buf = list_first_entry(&chnl->free_list, - struct sdio_buf_struct, list); - list_del(&buf->list); - kfree(buf); - } - num_free_bufs = 0; - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - - spin_lock_irqsave(&chnl->write_list_lock, flags); - while (!list_empty(&chnl->write_list)) { - buf = list_first_entry(&chnl->write_list, - struct sdio_buf_struct, list); - list_del(&buf->list); - kfree(buf); - } - num_tx_bufs = 0; - spin_unlock_irqrestore(&chnl->write_list_lock, flags); - - spin_lock_irqsave(&chnl->read_list_lock, flags); - while (!list_empty(&chnl->read_list)) { - buf = list_first_entry(&chnl->read_list, - struct sdio_buf_struct, list); - list_del(&buf->list); - kfree(buf); - } - num_rx_bufs = 0; - spin_unlock_irqrestore(&chnl->read_list_lock, flags); - wake_unlock(&chnl->read_wakelock); -} - -static struct sdio_buf_struct *alloc_from_free_list(struct sdio_xprt *chnl) -{ - struct sdio_buf_struct *buf; - unsigned long flags; - - spin_lock_irqsave(&chnl->free_list_lock, flags); - if (list_empty(&chnl->free_list)) { - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - SDIO_XPRT_DBG("%s: Free list empty\n", __func__); - return NULL; - } - buf = list_first_entry(&chnl->free_list, struct sdio_buf_struct, list); - list_del(&buf->list); - num_free_bufs--; - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - - buf->size = 0; - buf->read_index = 0; - buf->write_index = 0; - - return buf; -} - -static void return_to_free_list(struct sdio_xprt *chnl, - struct sdio_buf_struct *buf) -{ - unsigned long flags; - - if (!chnl || !buf) { - pr_err("%s: Invalid chnl or buf\n", __func__); - return; - } - - buf->size = 0; - buf->read_index = 0; - buf->write_index = 0; - - spin_lock_irqsave(&chnl->free_list_lock, flags); - list_add_tail(&buf->list, &chnl->free_list); - num_free_bufs++; - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - -} - -static int rpcrouter_sdio_remote_read_avail(void) -{ - int read_avail = 0; - unsigned long flags; - struct sdio_buf_struct *buf; - - spin_lock_irqsave(&sdio_remote_xprt.channel->read_list_lock, flags); - list_for_each_entry(buf, &sdio_remote_xprt.channel->read_list, list) { - read_avail += buf->size; - } - spin_unlock_irqrestore(&sdio_remote_xprt.channel->read_list_lock, - flags); - return read_avail; -} - -static int rpcrouter_sdio_remote_read(void *data, uint32_t len) -{ - struct sdio_buf_struct *buf; - unsigned char *buf_data; - unsigned long flags; - - SDIO_XPRT_DBG("sdio_xprt Called %s\n", __func__); - if (len < 0 || !data) - return -EINVAL; - else if (len == 0) - return 0; - - spin_lock_irqsave(&sdio_remote_xprt.channel->read_list_lock, flags); - if (list_empty(&sdio_remote_xprt.channel->read_list)) { - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->read_list_lock, flags); - return -EINVAL; - } - - buf = list_first_entry(&sdio_remote_xprt.channel->read_list, - struct sdio_buf_struct, list); - if (buf->size < len) { - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->read_list_lock, flags); - return -EINVAL; - } - - buf_data = buf->data + buf->read_index; - memcpy(data, buf_data, len); - buf->read_index += len; - buf->size -= len; - if (buf->size == 0) { - list_del(&buf->list); - num_rx_bufs--; - return_to_free_list(sdio_remote_xprt.channel, buf); - } - - if (list_empty(&sdio_remote_xprt.channel->read_list)) - wake_unlock(&sdio_remote_xprt.channel->read_wakelock); - spin_unlock_irqrestore(&sdio_remote_xprt.channel->read_list_lock, - flags); - return len; -} - -static int rpcrouter_sdio_remote_write_avail(void) -{ - uint32_t write_avail = 0; - unsigned long flags; - - SDIO_XPRT_DBG("sdio_xprt Called %s\n", __func__); - spin_lock_irqsave(&sdio_remote_xprt.channel->write_list_lock, flags); - write_avail = (MAX_TX_BUFS - num_tx_bufs) * SDIO_BUF_SIZE; - spin_unlock_irqrestore(&sdio_remote_xprt.channel->write_list_lock, - flags); - return write_avail; -} - -static int rpcrouter_sdio_remote_write(void *data, uint32_t len, - enum write_data_type type) -{ - unsigned long flags; - static struct sdio_buf_struct *buf; - unsigned char *buf_data; - - switch (type) { - case HEADER: - spin_lock_irqsave(&sdio_remote_xprt.channel->write_list_lock, - flags); - if (num_tx_bufs == MAX_TX_BUFS) { - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->write_list_lock, - flags); - return -ENOMEM; - } - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->write_list_lock, flags); - - SDIO_XPRT_DBG("sdio_xprt WRITE HEADER %s\n", __func__); - buf = alloc_from_free_list(sdio_remote_xprt.channel); - if (!buf) { - pr_err("%s: alloc_from_free_list failed\n", __func__); - return -ENOMEM; - } - buf_data = buf->data + buf->write_index; - memcpy(buf_data, data, len); - buf->write_index += len; - buf->size += len; - return len; - case PACKMARK: - SDIO_XPRT_DBG("sdio_xprt WRITE PACKMARK %s\n", __func__); - if (!buf) { - pr_err("%s: HEADER not written or alloc failed\n", - __func__); - return -ENOMEM; - } - buf_data = buf->data + buf->write_index; - memcpy(buf_data, data, len); - buf->write_index += len; - buf->size += len; - return len; - case PAYLOAD: - SDIO_XPRT_DBG("sdio_xprt WRITE PAYLOAD %s\n", __func__); - if (!buf) { - pr_err("%s: HEADER not written or alloc failed\n", - __func__); - return -ENOMEM; - } - buf_data = buf->data + buf->write_index; - memcpy(buf_data, data, len); - buf->write_index += len; - buf->size += len; - - SDIO_XPRT_DBG("sdio_xprt flush %d bytes\n", buf->size); - spin_lock_irqsave(&sdio_remote_xprt.channel->write_list_lock, - flags); - list_add_tail(&buf->list, - &sdio_remote_xprt.channel->write_list); - num_tx_bufs++; - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->write_list_lock, flags); - queue_work(sdio_xprt_read_workqueue, &work_write_data); - buf = NULL; - return len; - default: - return -EINVAL; - } -} - -static void sdio_xprt_write_data(struct work_struct *work) -{ - int rc = 0, sdio_write_retry = 0; - unsigned long flags; - struct sdio_buf_struct *buf; - - mutex_lock(&modem_reset_lock); - if (modem_reset) { - mutex_unlock(&modem_reset_lock); - return; - } - - spin_lock_irqsave(&sdio_remote_xprt.channel->write_list_lock, flags); - while (!list_empty(&sdio_remote_xprt.channel->write_list)) { - buf = list_first_entry(&sdio_remote_xprt.channel->write_list, - struct sdio_buf_struct, list); - list_del(&buf->list); - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->write_list_lock, flags); - mutex_unlock(&modem_reset_lock); - - wait_event(write_avail_wait_q, - (!(modem_reset) && (sdio_write_avail( - sdio_remote_xprt.channel->handle) >= - buf->size))); - - mutex_lock(&modem_reset_lock); - while (!(modem_reset) && - ((rc = sdio_write(sdio_remote_xprt.channel->handle, - buf->data, buf->size)) < 0) && - (sdio_write_retry++ < MAX_SDIO_WRITE_RETRY)) { - printk(KERN_ERR "sdio_write failed with RC %d\n", rc); - mutex_unlock(&modem_reset_lock); - msleep(250); - mutex_lock(&modem_reset_lock); - } - if (modem_reset) { - mutex_unlock(&modem_reset_lock); - kfree(buf); - return; - } else { - return_to_free_list(sdio_remote_xprt.channel, buf); - } - - if (!rc) - SDIO_XPRT_DBG("sdio_write %d bytes completed\n", - buf->size); - - spin_lock_irqsave(&sdio_remote_xprt.channel->write_list_lock, - flags); - num_tx_bufs--; - } - spin_unlock_irqrestore(&sdio_remote_xprt.channel->write_list_lock, - flags); - mutex_unlock(&modem_reset_lock); -} - -static int rpcrouter_sdio_remote_close(void) -{ - SDIO_XPRT_DBG("sdio_xprt Called %s\n", __func__); - flush_workqueue(sdio_xprt_read_workqueue); - sdio_close(sdio_remote_xprt.channel->handle); - free_sdio_xprt(sdio_remote_xprt.channel); - return 0; -} - -static void sdio_xprt_read_data(struct work_struct *work) -{ - int size = 0, read_avail; - unsigned long flags; - struct sdio_buf_struct *buf; - SDIO_XPRT_DBG("sdio_xprt Called %s\n", __func__); - - mutex_lock(&modem_reset_lock); - while (!(modem_reset) && - ((read_avail = - sdio_read_avail(sdio_remote_xprt.channel->handle)) > 0)) { - spin_lock_irqsave(&sdio_remote_xprt.channel->read_list_lock, - flags); - if (num_rx_bufs == MAX_RX_BUFS) { - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->read_list_lock, - flags); - queue_delayed_work(sdio_xprt_read_workqueue, - &work_read_data, - msecs_to_jiffies(100)); - break; - } - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->read_list_lock, flags); - - buf = alloc_from_free_list(sdio_remote_xprt.channel); - if (!buf) { - SDIO_XPRT_DBG("%s: Failed to alloc_from_free_list" - " Try again later\n", __func__); - queue_delayed_work(sdio_xprt_read_workqueue, - &work_read_data, - msecs_to_jiffies(100)); - break; - } - - size = sdio_read(sdio_remote_xprt.channel->handle, - buf->data, read_avail); - if (size < 0) { - printk(KERN_ERR "sdio_read failed," - " read %d bytes, expected %d\n", - size, read_avail); - return_to_free_list(sdio_remote_xprt.channel, buf); - queue_delayed_work(sdio_xprt_read_workqueue, - &work_read_data, - msecs_to_jiffies(100)); - break; - } - - if (size == 0) - size = read_avail; - - buf->size = size; - buf->write_index = size; - spin_lock_irqsave(&sdio_remote_xprt.channel->read_list_lock, - flags); - list_add_tail(&buf->list, - &sdio_remote_xprt.channel->read_list); - num_rx_bufs++; - spin_unlock_irqrestore( - &sdio_remote_xprt.channel->read_list_lock, flags); - wake_lock(&sdio_remote_xprt.channel->read_wakelock); - } - - if (!modem_reset && !list_empty(&sdio_remote_xprt.channel->read_list)) - msm_rpcrouter_xprt_notify(&sdio_remote_xprt.xprt, - RPCROUTER_XPRT_EVENT_DATA); - mutex_unlock(&modem_reset_lock); -} - -static void rpcrouter_sdio_remote_notify(void *_dev, unsigned event) -{ - if (event == SDIO_EVENT_DATA_READ_AVAIL) { - SDIO_XPRT_DBG("%s Received Notify" - "SDIO_EVENT_DATA_READ_AVAIL\n", __func__); - queue_delayed_work(sdio_xprt_read_workqueue, - &work_read_data, 0); - } - if (event == SDIO_EVENT_DATA_WRITE_AVAIL) { - SDIO_XPRT_DBG("%s Received Notify" - "SDIO_EVENT_DATA_WRITE_AVAIL\n", __func__); - wake_up(&write_avail_wait_q); - } -} - -static int allocate_sdio_xprt(struct sdio_xprt **sdio_xprt_chnl) -{ - struct sdio_buf_struct *buf; - struct sdio_xprt *chnl; - int i; - unsigned long flags; - int rc = -ENOMEM; - - if (!(*sdio_xprt_chnl)) { - chnl = kmalloc(sizeof(struct sdio_xprt), GFP_KERNEL); - if (!chnl) { - printk(KERN_ERR "sdio_xprt channel" - " allocation failed\n"); - return rc; - } - - spin_lock_init(&chnl->write_list_lock); - spin_lock_init(&chnl->read_list_lock); - spin_lock_init(&chnl->free_list_lock); - - INIT_LIST_HEAD(&chnl->write_list); - INIT_LIST_HEAD(&chnl->read_list); - INIT_LIST_HEAD(&chnl->free_list); - wake_lock_init(&chnl->read_wakelock, - WAKE_LOCK_SUSPEND, "rpc_sdio_xprt_read"); - } else { - chnl = *sdio_xprt_chnl; - } - - for (i = 0; i < NUM_SDIO_BUFS; i++) { - buf = kzalloc(sizeof(struct sdio_buf_struct), GFP_KERNEL); - if (!buf) { - printk(KERN_ERR "sdio_buf_struct alloc failed\n"); - goto alloc_failure; - } - spin_lock_irqsave(&chnl->free_list_lock, flags); - list_add_tail(&buf->list, &chnl->free_list); - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - } - num_free_bufs = NUM_SDIO_BUFS; - - *sdio_xprt_chnl = chnl; - return 0; - -alloc_failure: - spin_lock_irqsave(&chnl->free_list_lock, flags); - while (!list_empty(&chnl->free_list)) { - buf = list_first_entry(&chnl->free_list, - struct sdio_buf_struct, - list); - list_del(&buf->list); - kfree(buf); - } - spin_unlock_irqrestore(&chnl->free_list_lock, flags); - wake_lock_destroy(&chnl->read_wakelock); - - kfree(chnl); - *sdio_xprt_chnl = NULL; - return rc; -} - -static int rpcrouter_sdio_remote_probe(struct platform_device *pdev) -{ - int rc; - - SDIO_XPRT_INFO("%s Called\n", __func__); - - mutex_lock(&modem_reset_lock); - if (!modem_reset) { - sdio_xprt_read_workqueue = - create_singlethread_workqueue("sdio_xprt"); - if (!sdio_xprt_read_workqueue) { - mutex_unlock(&modem_reset_lock); - return -ENOMEM; - } - - sdio_remote_xprt.xprt.name = "rpcrotuer_sdio_xprt"; - sdio_remote_xprt.xprt.read_avail = - rpcrouter_sdio_remote_read_avail; - sdio_remote_xprt.xprt.read = rpcrouter_sdio_remote_read; - sdio_remote_xprt.xprt.write_avail = - rpcrouter_sdio_remote_write_avail; - sdio_remote_xprt.xprt.write = rpcrouter_sdio_remote_write; - sdio_remote_xprt.xprt.close = rpcrouter_sdio_remote_close; - sdio_remote_xprt.xprt.priv = NULL; - - init_waitqueue_head(&write_avail_wait_q); - } - modem_reset = 0; - - rc = allocate_sdio_xprt(&sdio_remote_xprt.channel); - if (rc) { - destroy_workqueue(sdio_xprt_read_workqueue); - mutex_unlock(&modem_reset_lock); - return rc; - } - - /* Open up SDIO channel */ - rc = sdio_open("SDIO_RPC", &sdio_remote_xprt.channel->handle, NULL, - rpcrouter_sdio_remote_notify); - - if (rc < 0) { - free_sdio_xprt(sdio_remote_xprt.channel); - destroy_workqueue(sdio_xprt_read_workqueue); - mutex_unlock(&modem_reset_lock); - return rc; - } - mutex_unlock(&modem_reset_lock); - - msm_rpcrouter_xprt_notify(&sdio_remote_xprt.xprt, - RPCROUTER_XPRT_EVENT_OPEN); - - SDIO_XPRT_INFO("%s Completed\n", __func__); - - return 0; -} - -static int rpcrouter_sdio_remote_remove(struct platform_device *pdev) -{ - SDIO_XPRT_INFO("%s Called\n", __func__); - - mutex_lock(&modem_reset_lock); - modem_reset = 1; - wake_up(&write_avail_wait_q); - free_sdio_xprt(sdio_remote_xprt.channel); - mutex_unlock(&modem_reset_lock); - - msm_rpcrouter_xprt_notify(&sdio_remote_xprt.xprt, - RPCROUTER_XPRT_EVENT_CLOSE); - - SDIO_XPRT_INFO("%s Completed\n", __func__); - - return 0; -} - -/*Remove this platform driver after mainline of SDIO_AL update*/ -static struct platform_driver rpcrouter_sdio_remote_driver = { - .probe = rpcrouter_sdio_remote_probe, - .driver = { - .name = "SDIO_AL", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver rpcrouter_sdio_driver = { - .probe = rpcrouter_sdio_remote_probe, - .remove = rpcrouter_sdio_remote_remove, - .driver = { - .name = "SDIO_RPC", - .owner = THIS_MODULE, - }, -}; - -static int __init rpcrouter_sdio_init(void) -{ - int rc; - msm_sdio_xprt_debug_mask = 0x2; - rc = platform_driver_register(&rpcrouter_sdio_remote_driver); - if (rc < 0) - return rc; - return platform_driver_register(&rpcrouter_sdio_driver); -} - -module_init(rpcrouter_sdio_init); -MODULE_DESCRIPTION("RPC Router SDIO XPRT"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/rpm-regulator-8660.c b/arch/arm/mach-msm/rpm-regulator-8660.c deleted file mode 100644 index 5ba6ee622c66..000000000000 --- a/arch/arm/mach-msm/rpm-regulator-8660.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include "rpm-regulator-private.h" - -/* RPM regulator request formats */ -static struct rpm_vreg_parts ldo_parts = { - .request_len = 2, - .mV = REQUEST_MEMBER(0, 0x00000FFF, 0), - .ip = REQUEST_MEMBER(0, 0x00FFF000, 12), - .fm = REQUEST_MEMBER(0, 0x03000000, 24), - .pc = REQUEST_MEMBER(0, 0x3C000000, 26), - .pf = REQUEST_MEMBER(0, 0xC0000000, 30), - .pd = REQUEST_MEMBER(1, 0x00000001, 0), - .ia = REQUEST_MEMBER(1, 0x00001FFE, 1), -}; - -static struct rpm_vreg_parts smps_parts = { - .request_len = 2, - .mV = REQUEST_MEMBER(0, 0x00000FFF, 0), - .ip = REQUEST_MEMBER(0, 0x00FFF000, 12), - .fm = REQUEST_MEMBER(0, 0x03000000, 24), - .pc = REQUEST_MEMBER(0, 0x3C000000, 26), - .pf = REQUEST_MEMBER(0, 0xC0000000, 30), - .pd = REQUEST_MEMBER(1, 0x00000001, 0), - .ia = REQUEST_MEMBER(1, 0x00001FFE, 1), - .freq = REQUEST_MEMBER(1, 0x001FE000, 13), - .freq_clk_src = REQUEST_MEMBER(1, 0x00600000, 21), -}; - -static struct rpm_vreg_parts switch_parts = { - .request_len = 1, - .enable_state = REQUEST_MEMBER(0, 0x00000001, 0), - .pd = REQUEST_MEMBER(0, 0x00000002, 1), - .pc = REQUEST_MEMBER(0, 0x0000003C, 2), - .pf = REQUEST_MEMBER(0, 0x000000C0, 6), - .hpm = REQUEST_MEMBER(0, 0x00000300, 8), -}; - -static struct rpm_vreg_parts ncp_parts = { - .request_len = 1, - .mV = REQUEST_MEMBER(0, 0x00000FFF, 0), - .enable_state = REQUEST_MEMBER(0, 0x00001000, 12), - .comp_mode = REQUEST_MEMBER(0, 0x00002000, 13), - .freq = REQUEST_MEMBER(0, 0x003FC000, 14), -}; - -/* Physically available PMIC regulator voltage setpoint ranges */ -static struct vreg_range pldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), - VOLTAGE_RANGE(3100000, 4900000, 50000), -}; - -static struct vreg_range nldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range smps_ranges[] = { - VOLTAGE_RANGE( 375000, 737500, 12500), - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), -}; - -static struct vreg_range ftsmps_ranges[] = { - VOLTAGE_RANGE( 350000, 650000, 50000), - VOLTAGE_RANGE( 700000, 1400000, 12500), - VOLTAGE_RANGE(1500000, 3300000, 50000), -}; - -static struct vreg_range ncp_ranges[] = { - VOLTAGE_RANGE(1500000, 3050000, 50000), -}; - -static struct vreg_set_points pldo_set_points = SET_POINTS(pldo_ranges); -static struct vreg_set_points nldo_set_points = SET_POINTS(nldo_ranges); -static struct vreg_set_points smps_set_points = SET_POINTS(smps_ranges); -static struct vreg_set_points ftsmps_set_points = SET_POINTS(ftsmps_ranges); -static struct vreg_set_points ncp_set_points = SET_POINTS(ncp_ranges); - -static struct vreg_set_points *all_set_points[] = { - &pldo_set_points, - &nldo_set_points, - &smps_set_points, - &ftsmps_set_points, - &ncp_set_points, -}; - -#define LDO(_vreg_id, _rpm_id, _name, _name_pc, _ranges, _hpm_min_load, \ - _requires_cxo) \ - [RPM_VREG_ID_##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_##_rpm_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8660_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_LDO, \ - .set_points = &_ranges##_set_points, \ - .part = &ldo_parts, \ - .id = RPM_VREG_ID_##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - .requires_cxo = _requires_cxo, \ - } - -#define SMPS(_vreg_id, _rpm_id, _name, _name_pc, _ranges, _hpm_min_load) \ - [RPM_VREG_ID_##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_##_rpm_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8660_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_SMPS, \ - .set_points = &_ranges##_set_points, \ - .part = &smps_parts, \ - .id = RPM_VREG_ID_##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define LVS(_vreg_id, _rpm_id, _name, _name_pc) \ - [RPM_VREG_ID_##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define MVS(_vreg_id, _rpm_id, _name, _name_pc) \ - LVS(_vreg_id, _rpm_id, _name, _name_pc) - -#define NCP(_vreg_id, _rpm_id, _name, _name_pc) \ - [RPM_VREG_ID_##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_##_rpm_id##_1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_NCP, \ - .set_points = &ncp_set_points, \ - .part = &ncp_parts, \ - .id = RPM_VREG_ID_##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -static struct vreg vregs[] = { - LDO(PM8058_L0, LDO0, "8058_l0", "8058_l0_pc", nldo, LDO_150, 1), - LDO(PM8058_L1, LDO1, "8058_l1", "8058_l1_pc", nldo, LDO_300, 1), - LDO(PM8058_L2, LDO2, "8058_l2", "8058_l2_pc", pldo, LDO_300, 0), - LDO(PM8058_L3, LDO3, "8058_l3", "8058_l3_pc", pldo, LDO_150, 0), - LDO(PM8058_L4, LDO4, "8058_l4", "8058_l4_pc", pldo, LDO_50, 0), - LDO(PM8058_L5, LDO5, "8058_l5", "8058_l5_pc", pldo, LDO_300, 0), - LDO(PM8058_L6, LDO6, "8058_l6", "8058_l6_pc", pldo, LDO_50, 0), - LDO(PM8058_L7, LDO7, "8058_l7", "8058_l7_pc", pldo, LDO_50, 0), - LDO(PM8058_L8, LDO8, "8058_l8", "8058_l8_pc", pldo, LDO_300, 0), - LDO(PM8058_L9, LDO9, "8058_l9", "8058_l9_pc", pldo, LDO_300, 0), - LDO(PM8058_L10, LDO10, "8058_l10", "8058_l10_pc", pldo, LDO_300, 0), - LDO(PM8058_L11, LDO11, "8058_l11", "8058_l11_pc", pldo, LDO_150, 0), - LDO(PM8058_L12, LDO12, "8058_l12", "8058_l12_pc", pldo, LDO_150, 0), - LDO(PM8058_L13, LDO13, "8058_l13", "8058_l13_pc", pldo, LDO_300, 0), - LDO(PM8058_L14, LDO14, "8058_l14", "8058_l14_pc", pldo, LDO_300, 0), - LDO(PM8058_L15, LDO15, "8058_l15", "8058_l15_pc", pldo, LDO_300, 0), - LDO(PM8058_L16, LDO16, "8058_l16", "8058_l16_pc", pldo, LDO_300, 0), - LDO(PM8058_L17, LDO17, "8058_l17", "8058_l17_pc", pldo, LDO_150, 0), - LDO(PM8058_L18, LDO18, "8058_l18", "8058_l18_pc", pldo, LDO_150, 0), - LDO(PM8058_L19, LDO19, "8058_l19", "8058_l19_pc", pldo, LDO_150, 0), - LDO(PM8058_L20, LDO20, "8058_l20", "8058_l20_pc", pldo, LDO_150, 0), - LDO(PM8058_L21, LDO21, "8058_l21", "8058_l21_pc", nldo, LDO_150, 1), - LDO(PM8058_L22, LDO22, "8058_l22", "8058_l22_pc", nldo, LDO_300, 1), - LDO(PM8058_L23, LDO23, "8058_l23", "8058_l23_pc", nldo, LDO_300, 1), - LDO(PM8058_L24, LDO24, "8058_l24", "8058_l24_pc", nldo, LDO_150, 1), - LDO(PM8058_L25, LDO25, "8058_l25", "8058_l25_pc", nldo, LDO_150, 1), - - SMPS(PM8058_S0, SMPS0, "8058_s0", "8058_s0_pc", smps, SMPS), - SMPS(PM8058_S1, SMPS1, "8058_s1", "8058_s1_pc", smps, SMPS), - SMPS(PM8058_S2, SMPS2, "8058_s2", "8058_s2_pc", smps, SMPS), - SMPS(PM8058_S3, SMPS3, "8058_s3", "8058_s3_pc", smps, SMPS), - SMPS(PM8058_S4, SMPS4, "8058_s4", "8058_s4_pc", smps, SMPS), - - LVS(PM8058_LVS0, LVS0, "8058_lvs0", "8058_lvs0_pc"), - LVS(PM8058_LVS1, LVS1, "8058_lvs1", "8058_lvs1_pc"), - - NCP(PM8058_NCP, NCP, "8058_ncp", NULL), - - LDO(PM8901_L0, LDO0B, "8901_l0", "8901_l0_pc", nldo, LDO_300, 1), - LDO(PM8901_L1, LDO1B, "8901_l1", "8901_l1_pc", pldo, LDO_300, 0), - LDO(PM8901_L2, LDO2B, "8901_l2", "8901_l2_pc", pldo, LDO_300, 0), - LDO(PM8901_L3, LDO3B, "8901_l3", "8901_l3_pc", pldo, LDO_300, 0), - LDO(PM8901_L4, LDO4B, "8901_l4", "8901_l4_pc", pldo, LDO_300, 0), - LDO(PM8901_L5, LDO5B, "8901_l5", "8901_l5_pc", pldo, LDO_300, 0), - LDO(PM8901_L6, LDO6B, "8901_l6", "8901_l6_pc", pldo, LDO_300, 0), - - SMPS(PM8901_S0, SMPS0B, "8901_s0", "8901_s0_pc", ftsmps, FTSMPS), - SMPS(PM8901_S1, SMPS1B, "8901_s1", "8901_s1_pc", ftsmps, FTSMPS), - SMPS(PM8901_S2, SMPS2B, "8901_s2", "8901_s2_pc", ftsmps, FTSMPS), - SMPS(PM8901_S3, SMPS3B, "8901_s3", "8901_s3_pc", ftsmps, FTSMPS), - SMPS(PM8901_S4, SMPS4B, "8901_s4", "8901_s4_pc", ftsmps, FTSMPS), - - LVS(PM8901_LVS0, LVS0B, "8901_lvs0", "8901_lvs0_pc"), - LVS(PM8901_LVS1, LVS1B, "8901_lvs1", "8901_lvs1_pc"), - LVS(PM8901_LVS2, LVS2B, "8901_lvs2", "8901_lvs2_pc"), - LVS(PM8901_LVS3, LVS3B, "8901_lvs3", "8901_lvs3_pc"), - - MVS(PM8901_MVS0, MVS, "8901_mvs0", "8901_mvs0_pc"), -}; - -static const char *pin_func_label[] = { - [RPM_VREG_PIN_FN_8660_ENABLE] = "on/off", - [RPM_VREG_PIN_FN_8660_MODE] = "HPM/LPM", - [RPM_VREG_PIN_FN_8660_SLEEP_B] = "sleep_b", - [RPM_VREG_PIN_FN_8660_NONE] = "none", -}; - -static const char *force_mode_label[] = { - [RPM_VREG_FORCE_MODE_8660_NONE] = "none", - [RPM_VREG_FORCE_MODE_8660_LPM] = "LPM", - [RPM_VREG_FORCE_MODE_8660_HPM] = "HPM", -}; - -static const char *pin_control_label[] = { - " A0", - " A1", - " D0", - " D1", -}; - -static int is_real_id(int id) -{ - return (id >= 0) && (id <= RPM_VREG_ID_8660_MAX_REAL); -} - -static int pc_id_to_real_id(int id) -{ - int real_id; - - if (id >= RPM_VREG_ID_PM8058_L0_PC && id <= RPM_VREG_ID_PM8058_LVS1_PC) - real_id = id - RPM_VREG_ID_PM8058_L0_PC + RPM_VREG_ID_PM8058_L0; - else - real_id = id - RPM_VREG_ID_PM8901_L0_PC + RPM_VREG_ID_PM8901_L0; - - return real_id; -} - -static struct vreg_config config = { - .vregs = vregs, - .vregs_len = ARRAY_SIZE(vregs), - - .vreg_id_min = RPM_VREG_ID_PM8058_L0, - .vreg_id_max = RPM_VREG_ID_8660_MAX, - - .pin_func_none = RPM_VREG_PIN_FN_8660_NONE, - .pin_func_sleep_b = RPM_VREG_PIN_FN_8660_SLEEP_B, - - .mode_lpm = REGULATOR_MODE_IDLE, - .mode_hpm = REGULATOR_MODE_NORMAL, - - .set_points = all_set_points, - .set_points_len = ARRAY_SIZE(all_set_points), - - .label_pin_ctrl = pin_control_label, - .label_pin_ctrl_len = ARRAY_SIZE(pin_control_label), - .label_pin_func = pin_func_label, - .label_pin_func_len = ARRAY_SIZE(pin_func_label), - .label_force_mode = force_mode_label, - .label_force_mode_len = ARRAY_SIZE(force_mode_label), - - .is_real_id = is_real_id, - .pc_id_to_real_id = pc_id_to_real_id, - - .use_legacy_optimum_mode = 1, - .ia_follows_ip = 1, -}; - -struct vreg_config *get_config_8660(void) -{ - return &config; -} diff --git a/arch/arm/mach-msm/rpm-regulator-8930.c b/arch/arm/mach-msm/rpm-regulator-8930.c deleted file mode 100644 index d7ba67b1f1e5..000000000000 --- a/arch/arm/mach-msm/rpm-regulator-8930.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include "rpm-regulator-private.h" - -/* RPM regulator request formats */ -static struct rpm_vreg_parts ldo_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), -}; - -static struct rpm_vreg_parts smps_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), - .pm = REQUEST_MEMBER(1, 0x00800000, 23), - .freq = REQUEST_MEMBER(1, 0x1F000000, 24), - .freq_clk_src = REQUEST_MEMBER(1, 0x60000000, 29), -}; - -static struct rpm_vreg_parts switch_parts = { - .request_len = 1, - .enable_state = REQUEST_MEMBER(0, 0x00000001, 0), - .pd = REQUEST_MEMBER(0, 0x00000002, 1), - .pc = REQUEST_MEMBER(0, 0x0000003C, 2), - .pf = REQUEST_MEMBER(0, 0x000003C0, 6), - .hpm = REQUEST_MEMBER(0, 0x00000C00, 10), -}; - -static struct rpm_vreg_parts corner_parts = { - .request_len = 1, - .uV = REQUEST_MEMBER(0, 0x00000003, 0), -}; - -/* Physically available PMIC regulator voltage setpoint ranges */ -static struct vreg_range pldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), - VOLTAGE_RANGE(3100000, 4900000, 50000), -}; - -static struct vreg_range nldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range nldo1200_ranges[] = { - VOLTAGE_RANGE( 375000, 743750, 6250), - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range ln_ldo_ranges[] = { - VOLTAGE_RANGE( 690000, 1110000, 60000), - VOLTAGE_RANGE(1380000, 2220000, 120000), -}; - -static struct vreg_range smps_ranges[] = { - VOLTAGE_RANGE( 375000, 737500, 12500), - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), -}; - -static struct vreg_range ftsmps_ranges[] = { - VOLTAGE_RANGE( 350000, 650000, 50000), - VOLTAGE_RANGE( 700000, 1400000, 12500), - VOLTAGE_RANGE(1500000, 3300000, 50000), -}; - -static struct vreg_range corner_ranges[] = { - VOLTAGE_RANGE(RPM_VREG_CORNER_NONE, RPM_VREG_CORNER_HIGH, 1), -}; - -static struct vreg_set_points pldo_set_points = SET_POINTS(pldo_ranges); -static struct vreg_set_points nldo_set_points = SET_POINTS(nldo_ranges); -static struct vreg_set_points nldo1200_set_points = SET_POINTS(nldo1200_ranges); -static struct vreg_set_points ln_ldo_set_points = SET_POINTS(ln_ldo_ranges); -static struct vreg_set_points smps_set_points = SET_POINTS(smps_ranges); -static struct vreg_set_points ftsmps_set_points = SET_POINTS(ftsmps_ranges); -static struct vreg_set_points corner_set_points = SET_POINTS(corner_ranges); - -static struct vreg_set_points *all_set_points[] = { - &pldo_set_points, - &nldo_set_points, - &nldo1200_set_points, - &ln_ldo_set_points, - &smps_set_points, - &ftsmps_set_points, - &corner_set_points, -}; - -#define LDO(_id, _name, _name_pc, _ranges, _hpm_min_load, _requires_cxo) \ - [RPM_VREG_ID_PM##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8930_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_LDO, \ - .set_points = &_ranges##_set_points, \ - .part = &ldo_parts, \ - .id = RPM_VREG_ID_PM##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - .requires_cxo = _requires_cxo, \ - } - -#define SMPS(_id, _name, _name_pc, _ranges, _hpm_min_load) \ - [RPM_VREG_ID_PM##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8930_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_SMPS, \ - .set_points = &_ranges##_set_points, \ - .part = &smps_parts, \ - .id = RPM_VREG_ID_PM##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define LVS(_id, _name, _name_pc) \ - [RPM_VREG_ID_PM##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM##_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_PM##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define MVS(_vreg_id, _name, _name_pc, _rpm_id) \ - [RPM_VREG_ID_PM##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_PM##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define CORNER(_id, _rpm_id, _name, _ranges) \ - [RPM_VREG_ID_PM##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_CORNER, \ - .set_points = &_ranges##_set_points, \ - .part = &corner_parts, \ - .id = RPM_VREG_ID_PM##_id, \ - .rdesc.name = _name, \ - } - -static struct vreg vregs_msm8930_pm8038[] = { - LDO(8038_L1, "8038_l1", NULL, nldo1200, LDO_1200, 1), - LDO(8038_L2, "8038_l2", "8038_l2_pc", nldo, LDO_150, 1), - LDO(8038_L3, "8038_l3", "8038_l3_pc", pldo, LDO_50, 0), - LDO(8038_L4, "8038_l4", "8038_l4_pc", pldo, LDO_50, 0), - LDO(8038_L5, "8038_l5", "8038_l5_pc", pldo, LDO_600, 0), - LDO(8038_L6, "8038_l6", "8038_l6_pc", pldo, LDO_600, 0), - LDO(8038_L7, "8038_l7", "8038_l7_pc", pldo, LDO_600, 0), - LDO(8038_L8, "8038_l8", "8038_l8_pc", pldo, LDO_300, 0), - LDO(8038_L9, "8038_l9", "8038_l9_pc", pldo, LDO_300, 0), - LDO(8038_L10, "8038_l10", "8038_l10_pc", pldo, LDO_600, 0), - LDO(8038_L11, "8038_l11", "8038_l11_pc", pldo, LDO_600, 0), - LDO(8038_L12, "8038_l12", "8038_l12_pc", nldo, LDO_300, 1), - LDO(8038_L13, "8038_l13", NULL, ln_ldo, LDO_5, 0), - LDO(8038_L14, "8038_l14", "8038_l14_pc", pldo, LDO_50, 0), - LDO(8038_L15, "8038_l15", "8038_l15_pc", pldo, LDO_150, 0), - LDO(8038_L16, "8038_l16", NULL, nldo1200, LDO_1200, 1), - LDO(8038_L17, "8038_l17", "8038_l17_pc", pldo, LDO_150, 0), - LDO(8038_L18, "8038_l18", "8038_l18_pc", pldo, LDO_50, 0), - LDO(8038_L19, "8038_l19", NULL, nldo1200, LDO_1200, 1), - LDO(8038_L20, "8038_l20", NULL, nldo1200, LDO_1200, 1), - LDO(8038_L21, "8038_l21", "8038_l21_pc", pldo, LDO_150, 0), - LDO(8038_L22, "8038_l22", "8038_l22_pc", pldo, LDO_50, 0), - LDO(8038_L23, "8038_l23", "8038_l23_pc", pldo, LDO_50, 0), - LDO(8038_L24, "8038_l24", NULL, nldo1200, LDO_1200, 1), - LDO(8038_L25, "8038_l25", NULL, ln_ldo, LDO_5, 0), - LDO(8038_L26, "8038_l26", "8038_l26_pc", nldo, LDO_150, 1), - LDO(8038_L27, "8038_l27", NULL, nldo1200, LDO_1200, 1), - - SMPS(8038_S1, "8038_s1", "8038_s1_pc", smps, SMPS_1500), - SMPS(8038_S2, "8038_s2", "8038_s2_pc", smps, SMPS_1500), - SMPS(8038_S3, "8038_s3", "8038_s3_pc", smps, SMPS_1500), - SMPS(8038_S4, "8038_s4", "8038_s4_pc", smps, SMPS_1500), - SMPS(8038_S5, "8038_s5", NULL, ftsmps, SMPS_2000), - SMPS(8038_S6, "8038_s6", NULL, ftsmps, SMPS_2000), - - LVS(8038_LVS1, "8038_lvs1", "8038_lvs1_pc"), - LVS(8038_LVS2, "8038_lvs2", "8038_lvs2_pc"), - - CORNER(8038_VDD_DIG_CORNER, VOLTAGE_CORNER, "vdd_dig_corner", corner), -}; - -static struct vreg vregs_msm8930_pm8917[] = { - LDO(8917_L1, "8917_l1", "8917_l1_pc", nldo, LDO_150, 1), - LDO(8917_L2, "8917_l2", "8917_l2_pc", nldo, LDO_150, 1), - LDO(8917_L3, "8917_l3", "8917_l3_pc", pldo, LDO_150, 0), - LDO(8917_L4, "8917_l4", "8917_l4_pc", pldo, LDO_50, 0), - LDO(8917_L5, "8917_l5", "8917_l5_pc", pldo, LDO_300, 0), - LDO(8917_L6, "8917_l6", "8917_l6_pc", pldo, LDO_600, 0), - LDO(8917_L7, "8917_l7", "8917_l7_pc", pldo, LDO_150, 0), - LDO(8917_L8, "8917_l8", "8917_l8_pc", pldo, LDO_300, 0), - LDO(8917_L9, "8917_l9", "8917_l9_pc", pldo, LDO_300, 0), - LDO(8917_L10, "8917_l10", "8917_l10_pc", pldo, LDO_600, 0), - LDO(8917_L11, "8917_l11", "8917_l11_pc", pldo, LDO_150, 0), - LDO(8917_L12, "8917_l12", "8917_l12_pc", nldo, LDO_150, 1), - LDO(8917_L14, "8917_l14", "8917_l14_pc", pldo, LDO_50, 0), - LDO(8917_L15, "8917_l15", "8917_l15_pc", pldo, LDO_150, 0), - LDO(8917_L16, "8917_l16", "8917_l16_pc", pldo, LDO_300, 0), - LDO(8917_L17, "8917_l17", "8917_l17_pc", pldo, LDO_150, 0), - LDO(8917_L18, "8917_l18", "8917_l18_pc", nldo, LDO_150, 1), - LDO(8917_L21, "8917_l21", "8917_l21_pc", pldo, LDO_150, 0), - LDO(8917_L22, "8917_l22", "8917_l22_pc", pldo, LDO_150, 0), - LDO(8917_L23, "8917_l23", "8917_l23_pc", pldo, LDO_150, 0), - LDO(8917_L24, "8917_l24", NULL, nldo1200, LDO_1200, 0), - LDO(8917_L25, "8917_l25", NULL, nldo1200, LDO_1200, 0), - LDO(8917_L26, "8917_l26", NULL, nldo1200, LDO_1200, 0), - LDO(8917_L27, "8917_l27", NULL, nldo1200, LDO_1200, 0), - LDO(8917_L28, "8917_l28", NULL, nldo1200, LDO_1200, 0), - LDO(8917_L29, "8917_l29", "8917_l29_pc", pldo, LDO_150, 0), - LDO(8917_L30, "8917_l30", "8917_l30_pc", pldo, LDO_150, 0), - LDO(8917_L31, "8917_l31", "8917_l31_pc", pldo, LDO_150, 0), - LDO(8917_L32, "8917_l32", "8917_l32_pc", pldo, LDO_150, 0), - LDO(8917_L33, "8917_l33", "8917_l33_pc", pldo, LDO_150, 0), - LDO(8917_L34, "8917_l34", "8917_l34_pc", pldo, LDO_150, 0), - LDO(8917_L35, "8917_l35", "8917_l35_pc", pldo, LDO_300, 0), - LDO(8917_L36, "8917_l36", "8917_l36_pc", pldo, LDO_50, 0), - - SMPS(8917_S1, "8917_s1", "8917_s1_pc", smps, SMPS_1500), - SMPS(8917_S2, "8917_s2", "8917_s2_pc", smps, SMPS_1500), - SMPS(8917_S3, "8917_s3", "8917_s3_pc", smps, SMPS_1500), - SMPS(8917_S4, "8917_s4", "8917_s4_pc", smps, SMPS_1500), - SMPS(8917_S5, "8917_s5", NULL, ftsmps, SMPS_2000), - SMPS(8917_S6, "8917_s6", NULL, ftsmps, SMPS_2000), - SMPS(8917_S7, "8917_s7", "8917_s7_pc", smps, SMPS_1500), - SMPS(8917_S8, "8917_s8", "8917_s8_pc", smps, SMPS_1500), - - LVS(8917_LVS1, "8917_lvs1", "8917_lvs1_pc"), - LVS(8917_LVS3, "8917_lvs3", "8917_lvs3_pc"), - LVS(8917_LVS4, "8917_lvs4", "8917_lvs4_pc"), - LVS(8917_LVS5, "8917_lvs5", "8917_lvs5_pc"), - LVS(8917_LVS6, "8917_lvs6", "8917_lvs6_pc"), - LVS(8917_LVS7, "8917_lvs7", "8917_lvs7_pc"), - MVS(8917_USB_OTG, "8917_usb_otg", NULL, USB_OTG_SWITCH), - - CORNER(8917_VDD_DIG_CORNER, VOLTAGE_CORNER, "vdd_dig_corner", corner), -}; - -static const char *pin_func_label[] = { - [RPM_VREG_PIN_FN_8930_DONT_CARE] = "don't care", - [RPM_VREG_PIN_FN_8930_ENABLE] = "on/off", - [RPM_VREG_PIN_FN_8930_MODE] = "HPM/LPM", - [RPM_VREG_PIN_FN_8930_SLEEP_B] = "sleep_b", - [RPM_VREG_PIN_FN_8930_NONE] = "none", -}; - -static const char *force_mode_label[] = { - [RPM_VREG_FORCE_MODE_8930_NONE] = "none", - [RPM_VREG_FORCE_MODE_8930_LPM] = "LPM", - [RPM_VREG_FORCE_MODE_8930_AUTO] = "auto", - [RPM_VREG_FORCE_MODE_8930_HPM] = "HPM", - [RPM_VREG_FORCE_MODE_8930_BYPASS] = "BYP", -}; - -static const char *power_mode_label[] = { - [RPM_VREG_POWER_MODE_8930_HYSTERETIC] = "HYS", - [RPM_VREG_POWER_MODE_8930_PWM] = "PWM", -}; - -static const char *pin_control_label[] = { - " D1", - " A0", - " A1", - " A2", -}; - -static int is_real_id_msm8930_pm8038(int id) -{ - return (id >= 0) && (id <= RPM_VREG_ID_PM8038_MAX_REAL); -} - -static int pc_id_to_real_id_msm8930_pm8038(int id) -{ - int real_id = 0; - - if (id >= RPM_VREG_ID_PM8038_L2_PC && id <= RPM_VREG_ID_PM8038_L12_PC) - real_id = id - RPM_VREG_ID_PM8038_L2_PC - + RPM_VREG_ID_PM8038_L2; - else if (id >= RPM_VREG_ID_PM8038_L14_PC - && id <= RPM_VREG_ID_PM8038_L15_PC) - real_id = id - RPM_VREG_ID_PM8038_L14_PC - + RPM_VREG_ID_PM8038_L14; - else if (id >= RPM_VREG_ID_PM8038_L17_PC - && id <= RPM_VREG_ID_PM8038_L18_PC) - real_id = id - RPM_VREG_ID_PM8038_L17_PC - + RPM_VREG_ID_PM8038_L17; - else if (id >= RPM_VREG_ID_PM8038_L21_PC - && id <= RPM_VREG_ID_PM8038_L23_PC) - real_id = id - RPM_VREG_ID_PM8038_L21_PC - + RPM_VREG_ID_PM8038_L21; - else if (id == RPM_VREG_ID_PM8038_L26_PC) - real_id = RPM_VREG_ID_PM8038_L26; - else if (id >= RPM_VREG_ID_PM8038_S1_PC - && id <= RPM_VREG_ID_PM8038_S4_PC) - real_id = id - RPM_VREG_ID_PM8038_S1_PC - + RPM_VREG_ID_PM8038_S1; - else if (id >= RPM_VREG_ID_PM8038_LVS1_PC - && id <= RPM_VREG_ID_PM8038_LVS2_PC) - real_id = id - RPM_VREG_ID_PM8038_LVS1_PC - + RPM_VREG_ID_PM8038_LVS1; - - return real_id; -} - -static int is_real_id_msm8930_pm8917(int id) -{ - return (id >= 0) && (id <= RPM_VREG_ID_PM8917_MAX_REAL); -} - -static int pc_id_to_real_id_msm8930_pm8917(int id) -{ - int real_id = 0; - - if (id >= RPM_VREG_ID_PM8917_L1_PC && id <= RPM_VREG_ID_PM8917_L23_PC) - real_id = id - RPM_VREG_ID_PM8917_L1_PC - + RPM_VREG_ID_PM8917_L1; - else if (id >= RPM_VREG_ID_PM8917_L29_PC - && id <= RPM_VREG_ID_PM8917_S4_PC) - real_id = id - RPM_VREG_ID_PM8917_L29_PC - + RPM_VREG_ID_PM8917_L29; - else if (id >= RPM_VREG_ID_PM8917_S7_PC - && id <= RPM_VREG_ID_PM8917_LVS7_PC) - real_id = id - RPM_VREG_ID_PM8917_S7_PC - + RPM_VREG_ID_PM8917_S7; - - return real_id; -} - -static struct vreg_config config_msm8930_pm8038 = { - .vregs = vregs_msm8930_pm8038, - .vregs_len = ARRAY_SIZE(vregs_msm8930_pm8038), - - .vreg_id_min = RPM_VREG_ID_PM8038_L1, - .vreg_id_max = RPM_VREG_ID_PM8038_MAX, - - .pin_func_none = RPM_VREG_PIN_FN_8930_NONE, - .pin_func_sleep_b = RPM_VREG_PIN_FN_8930_SLEEP_B, - - .mode_lpm = REGULATOR_MODE_IDLE, - .mode_hpm = REGULATOR_MODE_NORMAL, - - .set_points = all_set_points, - .set_points_len = ARRAY_SIZE(all_set_points), - - .label_pin_ctrl = pin_control_label, - .label_pin_ctrl_len = ARRAY_SIZE(pin_control_label), - .label_pin_func = pin_func_label, - .label_pin_func_len = ARRAY_SIZE(pin_func_label), - .label_force_mode = force_mode_label, - .label_force_mode_len = ARRAY_SIZE(force_mode_label), - .label_power_mode = power_mode_label, - .label_power_mode_len = ARRAY_SIZE(power_mode_label), - - .is_real_id = is_real_id_msm8930_pm8038, - .pc_id_to_real_id = pc_id_to_real_id_msm8930_pm8038, -}; - -static struct vreg_config config_msm8930_pm8917 = { - .vregs = vregs_msm8930_pm8917, - .vregs_len = ARRAY_SIZE(vregs_msm8930_pm8917), - - .vreg_id_min = RPM_VREG_ID_PM8917_L1, - .vreg_id_max = RPM_VREG_ID_PM8917_MAX, - - .pin_func_none = RPM_VREG_PIN_FN_8930_NONE, - .pin_func_sleep_b = RPM_VREG_PIN_FN_8930_SLEEP_B, - - .mode_lpm = REGULATOR_MODE_IDLE, - .mode_hpm = REGULATOR_MODE_NORMAL, - - .set_points = all_set_points, - .set_points_len = ARRAY_SIZE(all_set_points), - - .label_pin_ctrl = pin_control_label, - .label_pin_ctrl_len = ARRAY_SIZE(pin_control_label), - .label_pin_func = pin_func_label, - .label_pin_func_len = ARRAY_SIZE(pin_func_label), - .label_force_mode = force_mode_label, - .label_force_mode_len = ARRAY_SIZE(force_mode_label), - .label_power_mode = power_mode_label, - .label_power_mode_len = ARRAY_SIZE(power_mode_label), - - .is_real_id = is_real_id_msm8930_pm8917, - .pc_id_to_real_id = pc_id_to_real_id_msm8930_pm8917, -}; - -struct vreg_config *get_config_8930(void) -{ - return &config_msm8930_pm8038; -} - -struct vreg_config *get_config_8930_pm8917(void) -{ - return &config_msm8930_pm8917; -} diff --git a/arch/arm/mach-msm/rpm-regulator-8960.c b/arch/arm/mach-msm/rpm-regulator-8960.c deleted file mode 100644 index 745cfe7c8d5c..000000000000 --- a/arch/arm/mach-msm/rpm-regulator-8960.c +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include "rpm-regulator-private.h" - -/* RPM regulator request formats */ -static struct rpm_vreg_parts ldo_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), -}; - -static struct rpm_vreg_parts smps_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), - .pm = REQUEST_MEMBER(1, 0x00800000, 23), - .freq = REQUEST_MEMBER(1, 0x1F000000, 24), - .freq_clk_src = REQUEST_MEMBER(1, 0x60000000, 29), -}; - -static struct rpm_vreg_parts switch_parts = { - .request_len = 1, - .enable_state = REQUEST_MEMBER(0, 0x00000001, 0), - .pd = REQUEST_MEMBER(0, 0x00000002, 1), - .pc = REQUEST_MEMBER(0, 0x0000003C, 2), - .pf = REQUEST_MEMBER(0, 0x000003C0, 6), - .hpm = REQUEST_MEMBER(0, 0x00000C00, 10), -}; - -static struct rpm_vreg_parts ncp_parts = { - .request_len = 1, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .enable_state = REQUEST_MEMBER(0, 0x00800000, 23), - .comp_mode = REQUEST_MEMBER(0, 0x01000000, 24), - .freq = REQUEST_MEMBER(0, 0x3E000000, 25), -}; - -/* Physically available PMIC regulator voltage setpoint ranges */ -static struct vreg_range pldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), - VOLTAGE_RANGE(3100000, 4900000, 50000), -}; - -static struct vreg_range nldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range nldo1200_ranges[] = { - VOLTAGE_RANGE( 375000, 743750, 6250), - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range ln_ldo_ranges[] = { - VOLTAGE_RANGE( 690000, 1110000, 60000), - VOLTAGE_RANGE(1380000, 2220000, 120000), -}; - -static struct vreg_range smps_ranges[] = { - VOLTAGE_RANGE( 375000, 737500, 12500), - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), -}; - -static struct vreg_range ftsmps_ranges[] = { - VOLTAGE_RANGE( 350000, 650000, 50000), - VOLTAGE_RANGE( 700000, 1400000, 12500), - VOLTAGE_RANGE(1500000, 3300000, 50000), -}; - -static struct vreg_range ncp_ranges[] = { - VOLTAGE_RANGE(1500000, 3050000, 50000), -}; - -static struct vreg_set_points pldo_set_points = SET_POINTS(pldo_ranges); -static struct vreg_set_points nldo_set_points = SET_POINTS(nldo_ranges); -static struct vreg_set_points nldo1200_set_points = SET_POINTS(nldo1200_ranges); -static struct vreg_set_points ln_ldo_set_points = SET_POINTS(ln_ldo_ranges); -static struct vreg_set_points smps_set_points = SET_POINTS(smps_ranges); -static struct vreg_set_points ftsmps_set_points = SET_POINTS(ftsmps_ranges); -static struct vreg_set_points ncp_set_points = SET_POINTS(ncp_ranges); - -static struct vreg_set_points *all_set_points[] = { - &pldo_set_points, - &nldo_set_points, - &nldo1200_set_points, - &ln_ldo_set_points, - &smps_set_points, - &ftsmps_set_points, - &ncp_set_points, -}; - -#define LDO(_id, _name, _name_pc, _ranges, _hpm_min_load, _requires_cxo) \ - [RPM_VREG_ID_PM8921_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8921_##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM8921_##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8960_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_LDO, \ - .set_points = &_ranges##_set_points, \ - .part = &ldo_parts, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - .requires_cxo = _requires_cxo, \ - } - -#define SMPS(_id, _name, _name_pc, _ranges, _hpm_min_load) \ - [RPM_VREG_ID_PM8921_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8921_##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM8921_##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_8960_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_SMPS, \ - .set_points = &_ranges##_set_points, \ - .part = &smps_parts, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define LVS(_id, _name, _name_pc) \ - [RPM_VREG_ID_PM8921_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8921_##_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define MVS(_vreg_id, _name, _name_pc, _rpm_id) \ - [RPM_VREG_ID_PM8921_##_vreg_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_PM8921_##_vreg_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define NCP(_id, _name, _name_pc) \ - [RPM_VREG_ID_PM8921_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_##_id##_1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_NCP, \ - .set_points = &ncp_set_points, \ - .part = &ncp_parts, \ - .id = RPM_VREG_ID_PM8921_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -static struct vreg vregs[] = { - LDO(L1, "8921_l1", "8921_l1_pc", nldo, LDO_150, 1), - LDO(L2, "8921_l2", "8921_l2_pc", nldo, LDO_150, 1), - LDO(L3, "8921_l3", "8921_l3_pc", pldo, LDO_150, 0), - LDO(L4, "8921_l4", "8921_l4_pc", pldo, LDO_50, 0), - LDO(L5, "8921_l5", "8921_l5_pc", pldo, LDO_300, 0), - LDO(L6, "8921_l6", "8921_l6_pc", pldo, LDO_600, 0), - LDO(L7, "8921_l7", "8921_l7_pc", pldo, LDO_150, 0), - LDO(L8, "8921_l8", "8921_l8_pc", pldo, LDO_300, 0), - LDO(L9, "8921_l9", "8921_l9_pc", pldo, LDO_300, 0), - LDO(L10, "8921_l10", "8921_l10_pc", pldo, LDO_600, 0), - LDO(L11, "8921_l11", "8921_l11_pc", pldo, LDO_150, 0), - LDO(L12, "8921_l12", "8921_l12_pc", nldo, LDO_150, 1), - LDO(L13, "8921_l13", NULL, ln_ldo, LDO_5, 0), - LDO(L14, "8921_l14", "8921_l14_pc", pldo, LDO_50, 0), - LDO(L15, "8921_l15", "8921_l15_pc", pldo, LDO_150, 0), - LDO(L16, "8921_l16", "8921_l16_pc", pldo, LDO_300, 0), - LDO(L17, "8921_l17", "8921_l17_pc", pldo, LDO_150, 0), - LDO(L18, "8921_l18", "8921_l18_pc", nldo, LDO_150, 1), - LDO(L21, "8921_l21", "8921_l21_pc", pldo, LDO_150, 0), - LDO(L22, "8921_l22", "8921_l22_pc", pldo, LDO_150, 0), - LDO(L23, "8921_l23", "8921_l23_pc", pldo, LDO_150, 0), - LDO(L24, "8921_l24", NULL, nldo1200, LDO_1200, 0), - LDO(L25, "8921_l25", NULL, nldo1200, LDO_1200, 0), - LDO(L26, "8921_l26", NULL, nldo1200, LDO_1200, 0), - LDO(L27, "8921_l27", NULL, nldo1200, LDO_1200, 0), - LDO(L28, "8921_l28", NULL, nldo1200, LDO_1200, 0), - LDO(L29, "8921_l29", "8921_l29_pc", pldo, LDO_150, 0), - - SMPS(S1, "8921_s1", "8921_s1_pc", smps, SMPS_1500), - SMPS(S2, "8921_s2", "8921_s2_pc", smps, SMPS_1500), - SMPS(S3, "8921_s3", "8921_s3_pc", smps, SMPS_1500), - SMPS(S4, "8921_s4", "8921_s4_pc", smps, SMPS_1500), - SMPS(S5, "8921_s5", NULL, ftsmps, SMPS_2000), - SMPS(S6, "8921_s6", NULL, ftsmps, SMPS_2000), - SMPS(S7, "8921_s7", "8921_s7_pc", smps, SMPS_1500), - SMPS(S8, "8921_s8", "8921_s8_pc", smps, SMPS_1500), - - LVS(LVS1, "8921_lvs1", "8921_lvs1_pc"), - LVS(LVS2, "8921_lvs2", NULL), - LVS(LVS3, "8921_lvs3", "8921_lvs3_pc"), - LVS(LVS4, "8921_lvs4", "8921_lvs4_pc"), - LVS(LVS5, "8921_lvs5", "8921_lvs5_pc"), - LVS(LVS6, "8921_lvs6", "8921_lvs6_pc"), - LVS(LVS7, "8921_lvs7", "8921_lvs7_pc"), - MVS(USB_OTG, "8921_usb_otg", NULL, USB_OTG_SWITCH), - MVS(HDMI_MVS, "8921_hdmi_mvs", NULL, HDMI_SWITCH), - - NCP(NCP, "8921_ncp", NULL), -}; - -static const char *pin_func_label[] = { - [RPM_VREG_PIN_FN_8960_DONT_CARE] = "don't care", - [RPM_VREG_PIN_FN_8960_ENABLE] = "on/off", - [RPM_VREG_PIN_FN_8960_MODE] = "HPM/LPM", - [RPM_VREG_PIN_FN_8960_SLEEP_B] = "sleep_b", - [RPM_VREG_PIN_FN_8960_NONE] = "none", -}; - -static const char *force_mode_label[] = { - [RPM_VREG_FORCE_MODE_8960_NONE] = "none", - [RPM_VREG_FORCE_MODE_8960_LPM] = "LPM", - [RPM_VREG_FORCE_MODE_8960_AUTO] = "auto", - [RPM_VREG_FORCE_MODE_8960_HPM] = "HPM", - [RPM_VREG_FORCE_MODE_8960_BYPASS] = "BYP", -}; - -static const char *power_mode_label[] = { - [RPM_VREG_POWER_MODE_8960_HYSTERETIC] = "HYS", - [RPM_VREG_POWER_MODE_8960_PWM] = "PWM", -}; - -static const char *pin_control_label[] = { - " D1", - " A0", - " A1", - " A2", -}; - -static int is_real_id(int id) -{ - return (id >= 0) && (id <= RPM_VREG_ID_PM8921_MAX_REAL); -} - -static int pc_id_to_real_id(int id) -{ - int real_id; - - if (id >= RPM_VREG_ID_PM8921_L1_PC && id <= RPM_VREG_ID_PM8921_L12_PC) - real_id = id - RPM_VREG_ID_PM8921_L1_PC; - else if (id >= RPM_VREG_ID_PM8921_L14_PC - && id <= RPM_VREG_ID_PM8921_L23_PC) - real_id = id - RPM_VREG_ID_PM8921_L14_PC - + RPM_VREG_ID_PM8921_L14; - else if (id >= RPM_VREG_ID_PM8921_L29_PC - && id <= RPM_VREG_ID_PM8921_S4_PC) - real_id = id - RPM_VREG_ID_PM8921_L29_PC - + RPM_VREG_ID_PM8921_L29; - else if (id >= RPM_VREG_ID_PM8921_S7_PC - && id <= RPM_VREG_ID_PM8921_LVS1_PC) - real_id = id - RPM_VREG_ID_PM8921_S7_PC + RPM_VREG_ID_PM8921_S7; - else - real_id = id - RPM_VREG_ID_PM8921_LVS3_PC - + RPM_VREG_ID_PM8921_LVS3; - - return real_id; -} - -static struct vreg_config config = { - .vregs = vregs, - .vregs_len = ARRAY_SIZE(vregs), - - .vreg_id_min = RPM_VREG_ID_PM8921_L1, - .vreg_id_max = RPM_VREG_ID_PM8921_MAX, - - .pin_func_none = RPM_VREG_PIN_FN_8960_NONE, - .pin_func_sleep_b = RPM_VREG_PIN_FN_8960_SLEEP_B, - - .mode_lpm = REGULATOR_MODE_IDLE, - .mode_hpm = REGULATOR_MODE_NORMAL, - - .set_points = all_set_points, - .set_points_len = ARRAY_SIZE(all_set_points), - - .label_pin_ctrl = pin_control_label, - .label_pin_ctrl_len = ARRAY_SIZE(pin_control_label), - .label_pin_func = pin_func_label, - .label_pin_func_len = ARRAY_SIZE(pin_func_label), - .label_force_mode = force_mode_label, - .label_force_mode_len = ARRAY_SIZE(force_mode_label), - .label_power_mode = power_mode_label, - .label_power_mode_len = ARRAY_SIZE(power_mode_label), - - .is_real_id = is_real_id, - .pc_id_to_real_id = pc_id_to_real_id, -}; - -struct vreg_config *get_config_8960(void) -{ - return &config; -} - -struct vreg_config *get_config_8960_pm8917(void) -{ - int i; - - /* - * PM8917 regulators L24, L25, L26, L27, and L28 require CXO to be ON - * while they are enabled. These same regulators on PM8921 do not - * require CXO to be ON. Therefore, set the require_cxo flag for these - * regulators only when using PM8917. - * - * Do not apply the workaround to L24 (VDD_MX) because it is always on - * and using the TCXO workaround with it would result in additional - * latency during every Krait upscaling event. - */ - for (i = 0; i < ARRAY_SIZE(vregs); i++) { - switch (vregs[i].id) { - case RPM_VREG_ID_PM8921_L25: - case RPM_VREG_ID_PM8921_L26: - case RPM_VREG_ID_PM8921_L27: - case RPM_VREG_ID_PM8921_L28: - vregs[i].requires_cxo = true; - default: - break; - } - } - - return &config; -} diff --git a/arch/arm/mach-msm/rpm-regulator-9615.c b/arch/arm/mach-msm/rpm-regulator-9615.c deleted file mode 100644 index 1c2e817911c2..000000000000 --- a/arch/arm/mach-msm/rpm-regulator-9615.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include "rpm-regulator-private.h" - -/* RPM regulator request formats */ -static struct rpm_vreg_parts ldo_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), -}; - -static struct rpm_vreg_parts smps_parts = { - .request_len = 2, - .uV = REQUEST_MEMBER(0, 0x007FFFFF, 0), - .pd = REQUEST_MEMBER(0, 0x00800000, 23), - .pc = REQUEST_MEMBER(0, 0x0F000000, 24), - .pf = REQUEST_MEMBER(0, 0xF0000000, 28), - .ip = REQUEST_MEMBER(1, 0x000003FF, 0), - .ia = REQUEST_MEMBER(1, 0x000FFC00, 10), - .fm = REQUEST_MEMBER(1, 0x00700000, 20), - .pm = REQUEST_MEMBER(1, 0x00800000, 23), - .freq = REQUEST_MEMBER(1, 0x1F000000, 24), - .freq_clk_src = REQUEST_MEMBER(1, 0x60000000, 29), -}; - -static struct rpm_vreg_parts switch_parts = { - .request_len = 1, - .enable_state = REQUEST_MEMBER(0, 0x00000001, 0), - .pd = REQUEST_MEMBER(0, 0x00000002, 1), - .pc = REQUEST_MEMBER(0, 0x0000003C, 2), - .pf = REQUEST_MEMBER(0, 0x000003C0, 6), - .hpm = REQUEST_MEMBER(0, 0x00000C00, 10), -}; - -static struct rpm_vreg_parts corner_parts = { - .request_len = 1, - .uV = REQUEST_MEMBER(0, 0x00000003, 0), -}; - -/* Physically available PMIC regulator voltage setpoint ranges */ -static struct vreg_range pldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), - VOLTAGE_RANGE(3100000, 4900000, 50000), -}; - -static struct vreg_range nldo_ranges[] = { - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range nldo1200_ranges[] = { - VOLTAGE_RANGE( 375000, 743750, 6250), - VOLTAGE_RANGE( 750000, 1537500, 12500), -}; - -static struct vreg_range smps_ranges[] = { - VOLTAGE_RANGE( 375000, 737500, 12500), - VOLTAGE_RANGE( 750000, 1487500, 12500), - VOLTAGE_RANGE(1500000, 3075000, 25000), -}; - -static struct vreg_range corner_ranges[] = { - VOLTAGE_RANGE(RPM_VREG_CORNER_NONE, RPM_VREG_CORNER_HIGH, 1), -}; - -static struct vreg_set_points pldo_set_points = SET_POINTS(pldo_ranges); -static struct vreg_set_points nldo_set_points = SET_POINTS(nldo_ranges); -static struct vreg_set_points nldo1200_set_points = SET_POINTS(nldo1200_ranges); -static struct vreg_set_points smps_set_points = SET_POINTS(smps_ranges); -static struct vreg_set_points corner_set_points = SET_POINTS(corner_ranges); - -static struct vreg_set_points *all_set_points[] = { - &pldo_set_points, - &nldo_set_points, - &nldo1200_set_points, - &smps_set_points, - &corner_set_points, -}; - -#define LDO(_id, _name, _name_pc, _ranges, _hpm_min_load, _requires_cxo) \ - [RPM_VREG_ID_PM8018_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8018_##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM8018_##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_9615_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_LDO, \ - .set_points = &_ranges##_set_points, \ - .part = &ldo_parts, \ - .id = RPM_VREG_ID_PM8018_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - .requires_cxo = _requires_cxo, \ - } - -#define SMPS(_id, _name, _name_pc, _ranges, _hpm_min_load) \ - [RPM_VREG_ID_PM8018_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8018_##_id##_0, }, \ - [1] = { .id = MSM_RPM_ID_PM8018_##_id##_1, }, \ - }, \ - .hpm_min_load = RPM_VREG_9615_##_hpm_min_load##_HPM_MIN_LOAD, \ - .type = RPM_REGULATOR_TYPE_SMPS, \ - .set_points = &_ranges##_set_points, \ - .part = &smps_parts, \ - .id = RPM_VREG_ID_PM8018_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define LVS(_id, _name, _name_pc) \ - [RPM_VREG_ID_PM8018_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_PM8018_##_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_VS, \ - .part = &switch_parts, \ - .id = RPM_VREG_ID_PM8018_##_id, \ - .rdesc.name = _name, \ - .rdesc_pc.name = _name_pc, \ - } - -#define CORNER(_id, _rpm_id, _name, _ranges) \ - [RPM_VREG_ID_PM8018_##_id] = { \ - .req = { \ - [0] = { .id = MSM_RPM_ID_##_rpm_id, }, \ - [1] = { .id = -1, }, \ - }, \ - .type = RPM_REGULATOR_TYPE_CORNER, \ - .set_points = &_ranges##_set_points, \ - .part = &corner_parts, \ - .id = RPM_VREG_ID_PM8018_##_id, \ - .rdesc.name = _name, \ - } - -static struct vreg vregs[] = { - LDO(L2, "8018_l2", "8018_l2_pc", pldo, LDO_50, 0), - LDO(L3, "8018_l3", "8018_l3_pc", pldo, LDO_50, 0), - LDO(L4, "8018_l4", "8018_l4_pc", pldo, LDO_300, 0), - LDO(L5, "8018_l5", "8018_l5_pc", pldo, LDO_150, 0), - LDO(L6, "8018_l6", "8018_l6_pc", pldo, LDO_150, 0), - LDO(L7, "8018_l7", "8018_l7_pc", pldo, LDO_300, 0), - LDO(L8, "8018_l8", "8018_l8_pc", nldo, LDO_150, 1), - LDO(L9, "8018_l9", NULL, nldo1200, LDO_1200, 0), - LDO(L10, "8018_l10", NULL, nldo1200, LDO_1200, 0), - LDO(L11, "8018_l11", NULL, nldo1200, LDO_1200, 0), - LDO(L12, "8018_l12", NULL, nldo1200, LDO_1200, 0), - LDO(L13, "8018_l13", "8018_l13_pc", pldo, LDO_50, 0), - LDO(L14, "8018_l14", "8018_l14_pc", pldo, LDO_50, 0), - - SMPS(S1, "8018_s1", "8018_s1_pc", smps, SMPS_1500), - SMPS(S2, "8018_s2", "8018_s2_pc", smps, SMPS_1500), - SMPS(S3, "8018_s3", "8018_s3_pc", smps, SMPS_1500), - SMPS(S4, "8018_s4", "8018_s4_pc", smps, SMPS_1500), - SMPS(S5, "8018_s5", "8018_s5_pc", smps, SMPS_1500), - - LVS(LVS1, "8018_lvs1", "8018_lvs1_pc"), - - CORNER(VDD_DIG_CORNER, VOLTAGE_CORNER, "vdd_dig_corner", corner), -}; - -static const char *pin_control_label[] = { - " D1", - " A0", - " A1", - " A2", -}; - -static const char *pin_func_label[] = { - [RPM_VREG_PIN_FN_9615_DONT_CARE] = "don't care", - [RPM_VREG_PIN_FN_9615_ENABLE] = "on/off", - [RPM_VREG_PIN_FN_9615_MODE] = "HPM/LPM", - [RPM_VREG_PIN_FN_9615_SLEEP_B] = "sleep_b", - [RPM_VREG_PIN_FN_9615_NONE] = "none", -}; - -static const char *force_mode_label[] = { - [RPM_VREG_FORCE_MODE_9615_NONE] = "none", - [RPM_VREG_FORCE_MODE_9615_LPM] = "LPM", - [RPM_VREG_FORCE_MODE_9615_AUTO] = "auto", - [RPM_VREG_FORCE_MODE_9615_HPM] = "HPM", - [RPM_VREG_FORCE_MODE_9615_BYPASS] = "BYP", -}; - -static const char *power_mode_label[] = { - [RPM_VREG_POWER_MODE_9615_HYSTERETIC] = "HYS", - [RPM_VREG_POWER_MODE_9615_PWM] = "PWM", -}; - -static int is_real_id(int id) -{ - return (id >= 0) && (id <= RPM_VREG_ID_PM8018_MAX_REAL); -} - -static int pc_id_to_real_id(int id) -{ - int real_id; - - if (id >= RPM_VREG_ID_PM8018_L2_PC && id <= RPM_VREG_ID_PM8018_L8_PC) - real_id = id - RPM_VREG_ID_PM8018_L2_PC + RPM_VREG_ID_PM8018_L2; - else - real_id = id - RPM_VREG_ID_PM8018_L13_PC - + RPM_VREG_ID_PM8018_L13; - - return real_id; -} - -static struct vreg_config config = { - .vregs = vregs, - .vregs_len = ARRAY_SIZE(vregs), - - .vreg_id_min = RPM_VREG_ID_PM8018_L2, - .vreg_id_max = RPM_VREG_ID_PM8018_MAX, - - .pin_func_none = RPM_VREG_PIN_FN_9615_NONE, - .pin_func_sleep_b = RPM_VREG_PIN_FN_9615_SLEEP_B, - - .mode_lpm = REGULATOR_MODE_IDLE, - .mode_hpm = REGULATOR_MODE_NORMAL, - - .set_points = all_set_points, - .set_points_len = ARRAY_SIZE(all_set_points), - - .label_pin_ctrl = pin_control_label, - .label_pin_ctrl_len = ARRAY_SIZE(pin_control_label), - .label_pin_func = pin_func_label, - .label_pin_func_len = ARRAY_SIZE(pin_func_label), - .label_force_mode = force_mode_label, - .label_force_mode_len = ARRAY_SIZE(force_mode_label), - .label_power_mode = power_mode_label, - .label_power_mode_len = ARRAY_SIZE(power_mode_label), - - .is_real_id = is_real_id, - .pc_id_to_real_id = pc_id_to_real_id, -}; - -struct vreg_config *get_config_9615(void) -{ - return &config; -} diff --git a/arch/arm/mach-msm/rpm-regulator.c b/arch/arm/mach-msm/rpm-regulator.c deleted file mode 100644 index 2e00e697aa6e..000000000000 --- a/arch/arm/mach-msm/rpm-regulator.c +++ /dev/null @@ -1,1940 +0,0 @@ -/* - * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "rpm_resources.h" -#include "rpm-regulator-private.h" - -/* Debug Definitions */ - -enum { - MSM_RPM_VREG_DEBUG_REQUEST = BIT(0), - MSM_RPM_VREG_DEBUG_VOTE = BIT(1), - MSM_RPM_VREG_DEBUG_DUPLICATE = BIT(2), - MSM_RPM_VREG_DEBUG_IGNORE_VDD_MEM_DIG = BIT(3), -}; - -static int msm_rpm_vreg_debug_mask; -module_param_named( - debug_mask, msm_rpm_vreg_debug_mask, int, S_IRUSR | S_IWUSR -); - -/* Used for access via the rpm_regulator_* API. */ -struct rpm_regulator { - int vreg_id; - enum rpm_vreg_voter voter; - int sleep_also; - int min_uV; - int max_uV; -}; - -struct vreg_config *(*get_config[])(void) = { - [RPM_VREG_VERSION_8660] = get_config_8660, - [RPM_VREG_VERSION_8960] = get_config_8960, - [RPM_VREG_VERSION_9615] = get_config_9615, - [RPM_VREG_VERSION_8930] = get_config_8930, - [RPM_VREG_VERSION_8930_PM8917] = get_config_8930_pm8917, - [RPM_VREG_VERSION_8960_PM8917] = get_config_8960_pm8917, -}; - -static struct rpm_regulator_consumer_mapping *consumer_map; -static int consumer_map_len; - -#define SET_PART(_vreg, _part, _val) \ - _vreg->req[_vreg->part->_part.word].value \ - = (_vreg->req[_vreg->part->_part.word].value \ - & ~_vreg->part->_part.mask) \ - | (((_val) << _vreg->part->_part.shift) \ - & _vreg->part->_part.mask) - -#define GET_PART(_vreg, _part) \ - ((_vreg->req[_vreg->part->_part.word].value & _vreg->part->_part.mask) \ - >> _vreg->part->_part.shift) - -#define GET_PART_PREV_ACT(_vreg, _part) \ - ((_vreg->prev_active_req[_vreg->part->_part.word].value \ - & _vreg->part->_part.mask) \ - >> _vreg->part->_part.shift) - -#define USES_PART(_vreg, _part) (_vreg->part->_part.mask) - -#define vreg_err(vreg, fmt, ...) \ - pr_err("%s: " fmt, vreg->rdesc.name, ##__VA_ARGS__) - -#define RPM_VREG_PIN_CTRL_EN0 0x01 -#define RPM_VREG_PIN_CTRL_EN1 0x02 -#define RPM_VREG_PIN_CTRL_EN2 0x04 -#define RPM_VREG_PIN_CTRL_EN3 0x08 -#define RPM_VREG_PIN_CTRL_ALL 0x0F - -static const char *label_freq[] = { - [RPM_VREG_FREQ_NONE] = " N/A", - [RPM_VREG_FREQ_19p20] = "19.2", - [RPM_VREG_FREQ_9p60] = "9.60", - [RPM_VREG_FREQ_6p40] = "6.40", - [RPM_VREG_FREQ_4p80] = "4.80", - [RPM_VREG_FREQ_3p84] = "3.84", - [RPM_VREG_FREQ_3p20] = "3.20", - [RPM_VREG_FREQ_2p74] = "2.74", - [RPM_VREG_FREQ_2p40] = "2.40", - [RPM_VREG_FREQ_2p13] = "2.13", - [RPM_VREG_FREQ_1p92] = "1.92", - [RPM_VREG_FREQ_1p75] = "1.75", - [RPM_VREG_FREQ_1p60] = "1.60", - [RPM_VREG_FREQ_1p48] = "1.48", - [RPM_VREG_FREQ_1p37] = "1.37", - [RPM_VREG_FREQ_1p28] = "1.28", - [RPM_VREG_FREQ_1p20] = "1.20", -}; - -static const char *label_corner[] = { - [RPM_VREG_CORNER_NONE] = "NONE", - [RPM_VREG_CORNER_LOW] = "LOW", - [RPM_VREG_CORNER_NOMINAL] = "NOM", - [RPM_VREG_CORNER_HIGH] = "HIGH", -}; - -/* - * This is used when voting for LPM or HPM by subtracting or adding to the - * hpm_min_load of a regulator. It has units of uA. - */ -#define LOAD_THRESHOLD_STEP 1000 - -/* rpm_version keeps track of the version for the currently running driver. */ -enum rpm_vreg_version rpm_version = -1; - -/* config holds all configuration data of the currently running driver. */ -static struct vreg_config *config; - -/* These regulator ID values are specified in the board file. */ -static int vreg_id_vdd_mem, vreg_id_vdd_dig; - -static inline int vreg_id_is_vdd_mem_or_dig(int id) -{ - return id == vreg_id_vdd_mem || id == vreg_id_vdd_dig; -} - -#define DEBUG_PRINT_BUFFER_SIZE 512 - -static void rpm_regulator_req(struct vreg *vreg, int set) -{ - int uV, mV, fm, pm, pc, pf, pd, freq, state, i; - const char *pf_label = "", *fm_label = "", *pc_total = ""; - const char *pc_en[4] = {"", "", "", ""}; - const char *pm_label = "", *freq_label = "", *corner_label = ""; - char buf[DEBUG_PRINT_BUFFER_SIZE]; - size_t buflen = DEBUG_PRINT_BUFFER_SIZE; - int pos = 0; - - /* Suppress VDD_MEM and VDD_DIG printing. */ - if ((msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_IGNORE_VDD_MEM_DIG) - && vreg_id_is_vdd_mem_or_dig(vreg->id)) - return; - - uV = GET_PART(vreg, uV); - mV = GET_PART(vreg, mV); - if (vreg->type == RPM_REGULATOR_TYPE_NCP) { - uV = -uV; - mV = -mV; - } - - fm = GET_PART(vreg, fm); - pm = GET_PART(vreg, pm); - pc = GET_PART(vreg, pc); - pf = GET_PART(vreg, pf); - pd = GET_PART(vreg, pd); - freq = GET_PART(vreg, freq); - state = GET_PART(vreg, enable_state); - - if (pf >= 0 && pf < config->label_pin_func_len) - pf_label = config->label_pin_func[pf]; - - if (fm >= 0 && fm < config->label_force_mode_len) - fm_label = config->label_force_mode[fm]; - - if (pm >= 0 && pm < config->label_power_mode_len) - pm_label = config->label_power_mode[pm]; - - if (freq >= 0 && freq < ARRAY_SIZE(label_freq)) - freq_label = label_freq[freq]; - - for (i = 0; i < config->label_pin_ctrl_len; i++) - if (pc & (1 << i)) - pc_en[i] = config->label_pin_ctrl[i]; - - if (pc == RPM_VREG_PIN_CTRL_NONE) - pc_total = " none"; - - pos += scnprintf(buf + pos, buflen - pos, "%s%s: ", - KERN_INFO, __func__); - - pos += scnprintf(buf + pos, buflen - pos, "%s %-9s: s=%c", - (set == MSM_RPM_CTX_SET_0 ? "sending " : "buffered"), - vreg->rdesc.name, - (set == MSM_RPM_CTX_SET_0 ? 'A' : 'S')); - - if (USES_PART(vreg, uV) && vreg->type != RPM_REGULATOR_TYPE_CORNER) - pos += scnprintf(buf + pos, buflen - pos, ", v=%7d uV", uV); - if (USES_PART(vreg, mV)) - pos += scnprintf(buf + pos, buflen - pos, ", v=%4d mV", mV); - if (USES_PART(vreg, enable_state)) - pos += scnprintf(buf + pos, buflen - pos, ", state=%s (%d)", - (state == 1 ? "on" : "off"), state); - if (USES_PART(vreg, ip)) - pos += scnprintf(buf + pos, buflen - pos, - ", ip=%4d mA", GET_PART(vreg, ip)); - if (USES_PART(vreg, fm)) - pos += scnprintf(buf + pos, buflen - pos, - ", fm=%s (%d)", fm_label, fm); - if (USES_PART(vreg, pc)) - pos += scnprintf(buf + pos, buflen - pos, - ", pc=%s%s%s%s%s (%X)", pc_en[0], pc_en[1], - pc_en[2], pc_en[3], pc_total, pc); - if (USES_PART(vreg, pf)) - pos += scnprintf(buf + pos, buflen - pos, - ", pf=%s (%d)", pf_label, pf); - if (USES_PART(vreg, pd)) - pos += scnprintf(buf + pos, buflen - pos, - ", pd=%s (%d)", (pd == 1 ? "Y" : "N"), pd); - if (USES_PART(vreg, ia)) - pos += scnprintf(buf + pos, buflen - pos, - ", ia=%4d mA", GET_PART(vreg, ia)); - if (USES_PART(vreg, freq)) { - if (vreg->type == RPM_REGULATOR_TYPE_NCP) - pos += scnprintf(buf + pos, buflen - pos, - ", freq=%2d", freq); - else - pos += scnprintf(buf + pos, buflen - pos, - ", freq=%s MHz (%2d)", freq_label, freq); - } - if (USES_PART(vreg, pm)) - pos += scnprintf(buf + pos, buflen - pos, - ", pm=%s (%d)", pm_label, pm); - if (USES_PART(vreg, freq_clk_src)) - pos += scnprintf(buf + pos, buflen - pos, - ", clk_src=%d", GET_PART(vreg, freq_clk_src)); - if (USES_PART(vreg, comp_mode)) - pos += scnprintf(buf + pos, buflen - pos, - ", comp=%d", GET_PART(vreg, comp_mode)); - if (USES_PART(vreg, hpm)) - pos += scnprintf(buf + pos, buflen - pos, - ", hpm=%d", GET_PART(vreg, hpm)); - if (USES_PART(vreg, uV) && vreg->type == RPM_REGULATOR_TYPE_CORNER) { - if (uV >= 0 && uV < (ARRAY_SIZE(label_corner) - 1)) - corner_label = label_corner[uV+1]; - pos += scnprintf(buf + pos, buflen - pos, ", corner=%s (%d)", - corner_label, uV); - } - - pos += scnprintf(buf + pos, buflen - pos, "; req[0]={%d, 0x%08X}", - vreg->req[0].id, vreg->req[0].value); - if (vreg->part->request_len > 1) - pos += scnprintf(buf + pos, buflen - pos, - ", req[1]={%d, 0x%08X}", vreg->req[1].id, - vreg->req[1].value); - - pos += scnprintf(buf + pos, buflen - pos, "\n"); - printk(buf); -} - -static void rpm_regulator_vote(struct vreg *vreg, enum rpm_vreg_voter voter, - int set, int voter_uV, int aggregate_uV) -{ - /* Suppress VDD_MEM and VDD_DIG printing. */ - if ((msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_IGNORE_VDD_MEM_DIG) - && vreg_id_is_vdd_mem_or_dig(vreg->id)) - return; - - pr_info("vote received %-9s: voter=%d, set=%c, v_voter=%7d uV, " - "v_aggregate=%7d uV\n", vreg->rdesc.name, voter, - (set == 0 ? 'A' : 'S'), voter_uV, aggregate_uV); -} - -static void rpm_regulator_duplicate(struct vreg *vreg, int set, int cnt) -{ - /* Suppress VDD_MEM and VDD_DIG printing. */ - if ((msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_IGNORE_VDD_MEM_DIG) - && vreg_id_is_vdd_mem_or_dig(vreg->id)) - return; - - if (cnt == 2) - pr_info("ignored request %-9s: set=%c; req[0]={%d, 0x%08X}, " - "req[1]={%d, 0x%08X}\n", vreg->rdesc.name, - (set == 0 ? 'A' : 'S'), - vreg->req[0].id, vreg->req[0].value, - vreg->req[1].id, vreg->req[1].value); - else if (cnt == 1) - pr_info("ignored request %-9s: set=%c; req[0]={%d, 0x%08X}\n", - vreg->rdesc.name, (set == 0 ? 'A' : 'S'), - vreg->req[0].id, vreg->req[0].value); -} - -static bool requires_tcxo_workaround; -static struct clk *tcxo_handle; -static struct wake_lock tcxo_wake_lock; -static DEFINE_MUTEX(tcxo_mutex); -static bool tcxo_is_enabled; -/* - * TCXO must be kept on for at least the duration of its warmup (4 ms); - * otherwise, it will stay on when hardware disabling is attempted. - */ -#define TCXO_WARMUP_TIME_MS 4 - -static void tcxo_get_handle(void) -{ - if (!tcxo_handle) { - tcxo_handle = clk_get_sys("rpm-regulator", "vref_buff"); - if (IS_ERR(tcxo_handle)) - tcxo_handle = NULL; - } -} - -/* - * Perform best effort enable of CXO. Since the MSM clock drivers depend upon - * the rpm-regulator driver, any rpm-regulator devices that are configured with - * always_on == 1 will not be able to enable CXO during probe. This does not - * cause a problem though since CXO will be enabled by the boot loaders before - * Apps boots up. - */ -static bool tcxo_enable(void) -{ - int rc; - - if (tcxo_handle && !tcxo_is_enabled) { - rc = clk_prepare_enable(tcxo_handle); - if (!rc) { - tcxo_is_enabled = true; - wake_lock(&tcxo_wake_lock); - return true; - } - } - - return false; -} - -static void tcxo_delayed_disable_work(struct work_struct *work) -{ - mutex_lock(&tcxo_mutex); - - clk_disable_unprepare(tcxo_handle); - tcxo_is_enabled = false; - wake_unlock(&tcxo_wake_lock); - - mutex_unlock(&tcxo_mutex); -} - -static DECLARE_DELAYED_WORK(tcxo_disable_work, tcxo_delayed_disable_work); - -static void tcxo_delayed_disable(void) -{ - /* - * The delay in jiffies has 1 added to it to ensure that at least - * one jiffy takes place before the work is enqueued. Without this, - * the work would be scheduled to run in the very next jiffy which could - * result in too little delay and TCXO being stuck on. - */ - if (tcxo_handle) - schedule_delayed_work(&tcxo_disable_work, - msecs_to_jiffies(TCXO_WARMUP_TIME_MS) + 1); -} - -/* Mutex lock needed for sleep-selectable regulators. */ -static DEFINE_MUTEX(rpm_sleep_sel_lock); - -static int voltage_from_req(struct vreg *vreg) -{ - int uV = 0; - - if (vreg->part->uV.mask) - uV = GET_PART(vreg, uV); - else if (vreg->part->mV.mask) - uV = MILLI_TO_MICRO(GET_PART(vreg, mV)); - else if (vreg->part->enable_state.mask) - uV = GET_PART(vreg, enable_state); - - return uV; -} - -static void voltage_to_req(int uV, struct vreg *vreg) -{ - if (vreg->part->uV.mask) - SET_PART(vreg, uV, uV); - else if (vreg->part->mV.mask) - SET_PART(vreg, mV, MICRO_TO_MILLI(uV)); - else if (vreg->part->enable_state.mask) - SET_PART(vreg, enable_state, uV); -} - -static int vreg_send_request(struct vreg *vreg, enum rpm_vreg_voter voter, - int set, unsigned mask0, unsigned val0, - unsigned mask1, unsigned val1, unsigned cnt, - int update_voltage) -{ - struct msm_rpm_iv_pair *prev_req; - int rc = 0, max_uV_vote = 0; - bool tcxo_enabled = false; - bool voltage_increased = false; - unsigned prev0, prev1; - int *min_uV_vote; - int i; - - if (set == MSM_RPM_CTX_SET_0) { - min_uV_vote = vreg->active_min_uV_vote; - prev_req = vreg->prev_active_req; - } else { - min_uV_vote = vreg->sleep_min_uV_vote; - prev_req = vreg->prev_sleep_req; - } - - prev0 = vreg->req[0].value; - vreg->req[0].value &= ~mask0; - vreg->req[0].value |= val0 & mask0; - - prev1 = vreg->req[1].value; - vreg->req[1].value &= ~mask1; - vreg->req[1].value |= val1 & mask1; - - /* Set the force mode field based on which set is being requested. */ - if (set == MSM_RPM_CTX_SET_0) - SET_PART(vreg, fm, vreg->pdata.force_mode); - else - SET_PART(vreg, fm, vreg->pdata.sleep_set_force_mode); - - if (update_voltage) - min_uV_vote[voter] = voltage_from_req(vreg); - - /* Find the highest voltage voted for and use it. */ - for (i = 0; i < RPM_VREG_VOTER_COUNT; i++) - max_uV_vote = max(max_uV_vote, min_uV_vote[i]); - voltage_to_req(max_uV_vote, vreg); - - if (msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_VOTE) - rpm_regulator_vote(vreg, voter, set, min_uV_vote[voter], - max_uV_vote); - - /* Ignore duplicate requests */ - if (vreg->req[0].value != prev_req[0].value || - vreg->req[1].value != prev_req[1].value) { - - /* Enable CXO clock if necessary for TCXO workaround. */ - if (requires_tcxo_workaround && vreg->requires_cxo - && (set == MSM_RPM_CTX_SET_0) - && (GET_PART(vreg, uV) > GET_PART_PREV_ACT(vreg, uV))) { - mutex_lock(&tcxo_mutex); - if (!tcxo_handle) - tcxo_get_handle(); - voltage_increased = true; - tcxo_enabled = tcxo_enable(); - } - - rc = msm_rpmrs_set(set, vreg->req, cnt); - if (rc) { - vreg->req[0].value = prev0; - vreg->req[1].value = prev1; - - vreg_err(vreg, "msm_rpmrs_set failed - " - "set=%s, id=%d, rc=%d\n", - (set == MSM_RPM_CTX_SET_0 ? "active" : "sleep"), - vreg->req[0].id, rc); - } else { - /* Only save if nonzero and active set. */ - if (max_uV_vote && (set == MSM_RPM_CTX_SET_0)) - vreg->save_uV = max_uV_vote; - if (msm_rpm_vreg_debug_mask - & MSM_RPM_VREG_DEBUG_REQUEST) - rpm_regulator_req(vreg, set); - prev_req[0].value = vreg->req[0].value; - prev_req[1].value = vreg->req[1].value; - } - - /* - * Schedule CXO clock to be disabled after TCXO warmup time if - * TCXO workaround is applicable for this regulator. - */ - if (voltage_increased) { - if (tcxo_enabled) - tcxo_delayed_disable(); - mutex_unlock(&tcxo_mutex); - } - } else if (msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_DUPLICATE) { - rpm_regulator_duplicate(vreg, set, cnt); - } - - return rc; -} - -static int vreg_set_sleep_sel(struct vreg *vreg, enum rpm_vreg_voter voter, - int sleep, unsigned mask0, unsigned val0, - unsigned mask1, unsigned val1, unsigned cnt, - int update_voltage) -{ - unsigned int s_mask[2] = {mask0, mask1}, s_val[2] = {val0, val1}; - int rc; - - if (voter < 0 || voter >= RPM_VREG_VOTER_COUNT) - return -EINVAL; - - mutex_lock(&rpm_sleep_sel_lock); - - /* - * Send sleep set request first so that subsequent set_mode, etc calls - * use the voltage from the active set. - */ - if (sleep) - rc = vreg_send_request(vreg, voter, MSM_RPM_CTX_SET_SLEEP, - mask0, val0, mask1, val1, cnt, update_voltage); - else { - /* - * Vote for 0 V in the sleep set when active set-only is - * specified. This ensures that a disable vote will be issued - * at some point for the sleep set of the regulator. - */ - if (vreg->part->uV.mask) { - s_val[vreg->part->uV.word] = 0 << vreg->part->uV.shift; - s_mask[vreg->part->uV.word] = vreg->part->uV.mask; - } else if (vreg->part->mV.mask) { - s_val[vreg->part->mV.word] = 0 << vreg->part->mV.shift; - s_mask[vreg->part->mV.word] = vreg->part->mV.mask; - } else if (vreg->part->enable_state.mask) { - s_val[vreg->part->enable_state.word] - = 0 << vreg->part->enable_state.shift; - s_mask[vreg->part->enable_state.word] - = vreg->part->enable_state.mask; - } - - rc = vreg_send_request(vreg, voter, MSM_RPM_CTX_SET_SLEEP, - s_mask[0], s_val[0], s_mask[1], s_val[1], - cnt, update_voltage); - } - - rc = vreg_send_request(vreg, voter, MSM_RPM_CTX_SET_0, mask0, val0, - mask1, val1, cnt, update_voltage); - - mutex_unlock(&rpm_sleep_sel_lock); - - return rc; -} - -/** - * rpm_vreg_set_voltage - vote for a min_uV value of specified regualtor - * @vreg: ID for regulator - * @voter: ID for the voter - * @min_uV: minimum acceptable voltage (in uV) that is voted for - * @max_uV: maximum acceptable voltage (in uV) that is voted for - * @sleep_also: 0 for active set only, non-0 for active set and sleep set - * - * Returns 0 on success or errno. - * - * This function is used to vote for the voltage of a regulator without - * using the regulator framework. It is needed for consumers which wish to only - * vote for active set regulator voltage. - * - * If sleep_also == 0, then a sleep-set value of 0V will be voted for. - * - * This function may only be called for regulators which have the sleep flag - * specified in their private data. - * - * Consumers can vote to disable a regulator with this function by passing - * min_uV = 0 and max_uV = 0. - * - * Voltage switch type regulators may be controlled via rpm_vreg_set_voltage - * as well. For this type of regulator, max_uV > 0 is treated as an enable - * request and max_uV == 0 is treated as a disable request. - */ -int rpm_vreg_set_voltage(int vreg_id, enum rpm_vreg_voter voter, int min_uV, - int max_uV, int sleep_also) -{ - unsigned int mask[2] = {0}, val[2] = {0}; - struct vreg_range *range; - struct vreg *vreg; - int uV = min_uV; - int lim_min_uV, lim_max_uV, i, rc; - - if (!config) { - pr_err("rpm-regulator driver has not probed yet.\n"); - return -ENODEV; - } - - if (vreg_id < config->vreg_id_min || vreg_id > config->vreg_id_max) { - pr_err("invalid regulator id=%d\n", vreg_id); - return -EINVAL; - } - - vreg = &config->vregs[vreg_id]; - - if (!vreg->pdata.sleep_selectable) { - vreg_err(vreg, "regulator is not marked sleep selectable\n"); - return -EINVAL; - } - - /* Allow min_uV == max_uV == 0 to represent a disable request. */ - if ((min_uV != 0 || max_uV != 0) - && (vreg->part->uV.mask || vreg->part->mV.mask)) { - /* - * Check if request voltage is outside of allowed range. The - * regulator core has already checked that constraint range - * is inside of the physically allowed range. - */ - lim_min_uV = vreg->pdata.init_data.constraints.min_uV; - lim_max_uV = vreg->pdata.init_data.constraints.max_uV; - - if (uV < lim_min_uV && max_uV >= lim_min_uV) - uV = lim_min_uV; - - if (uV < lim_min_uV || uV > lim_max_uV) { - vreg_err(vreg, "request v=[%d, %d] is outside allowed " - "v=[%d, %d]\n", min_uV, max_uV, lim_min_uV, - lim_max_uV); - return -EINVAL; - } - - range = &vreg->set_points->range[0]; - /* Find the range which uV is inside of. */ - for (i = vreg->set_points->count - 1; i > 0; i--) { - if (uV > vreg->set_points->range[i - 1].max_uV) { - range = &vreg->set_points->range[i]; - break; - } - } - - /* - * Force uV to be an allowed set point and apply a ceiling - * function to non-set point values. - */ - uV = (uV - range->min_uV + range->step_uV - 1) / range->step_uV; - uV = uV * range->step_uV + range->min_uV; - - if (uV > max_uV) { - vreg_err(vreg, - "request v=[%d, %d] cannot be met by any set point; " - "next set point: %d\n", - min_uV, max_uV, uV); - return -EINVAL; - } - } - - if (vreg->type == RPM_REGULATOR_TYPE_CORNER) { - /* - * Translate from enum values which work as inputs in the - * rpm_vreg_set_voltage function to the actual corner values - * sent to the RPM. - */ - if (uV > 0) - uV -= RPM_VREG_CORNER_NONE; - } - - if (vreg->part->uV.mask) { - val[vreg->part->uV.word] = uV << vreg->part->uV.shift; - mask[vreg->part->uV.word] = vreg->part->uV.mask; - } else if (vreg->part->mV.mask) { - val[vreg->part->mV.word] - = MICRO_TO_MILLI(uV) << vreg->part->mV.shift; - mask[vreg->part->mV.word] = vreg->part->mV.mask; - } else if (vreg->part->enable_state.mask) { - /* - * Translate max_uV > 0 into an enable request for regulator - * types which to not support voltage setting, e.g. voltage - * switches. - */ - val[vreg->part->enable_state.word] - = (max_uV > 0 ? 1 : 0) << vreg->part->enable_state.shift; - mask[vreg->part->enable_state.word] - = vreg->part->enable_state.mask; - } - - rc = vreg_set_sleep_sel(vreg, voter, sleep_also, mask[0], val[0], - mask[1], val[1], vreg->part->request_len, 1); - if (rc) - vreg_err(vreg, "vreg_set_sleep_sel failed, rc=%d\n", rc); - - return rc; -} -EXPORT_SYMBOL_GPL(rpm_vreg_set_voltage); - -/** - * rpm_vreg_set_frequency - sets the frequency of a switching regulator - * @vreg: ID for regulator - * @freq: enum corresponding to desired frequency - * - * Returns 0 on success or errno. - */ -int rpm_vreg_set_frequency(int vreg_id, enum rpm_vreg_freq freq) -{ - unsigned int mask[2] = {0}, val[2] = {0}; - struct vreg *vreg; - int rc; - - if (!config) { - pr_err("rpm-regulator driver has not probed yet.\n"); - return -ENODEV; - } - - if (vreg_id < config->vreg_id_min || vreg_id > config->vreg_id_max) { - pr_err("invalid regulator id=%d\n", vreg_id); - return -EINVAL; - } - - vreg = &config->vregs[vreg_id]; - - if (freq < 0 || freq > RPM_VREG_FREQ_1p20) { - vreg_err(vreg, "invalid frequency=%d\n", freq); - return -EINVAL; - } - if (!vreg->pdata.sleep_selectable) { - vreg_err(vreg, "regulator is not marked sleep selectable\n"); - return -EINVAL; - } - if (!vreg->part->freq.mask) { - vreg_err(vreg, "frequency not supported\n"); - return -EINVAL; - } - - val[vreg->part->freq.word] = freq << vreg->part->freq.shift; - mask[vreg->part->freq.word] = vreg->part->freq.mask; - - rc = vreg_set_sleep_sel(vreg, RPM_VREG_VOTER_REG_FRAMEWORK, 1, mask[0], - val[0], mask[1], val[1], vreg->part->request_len, 0); - if (rc) - vreg_err(vreg, "vreg_set_sleep_sel failed, rc=%d\n", rc); - - return rc; -} -EXPORT_SYMBOL_GPL(rpm_vreg_set_frequency); - -#define MAX_NAME_LEN 64 -/** - * rpm_regulator_get() - lookup and obtain a handle to an RPM regulator - * @dev: device for regulator consumer - * @supply: supply name - * - * Returns a struct rpm_regulator corresponding to the regulator producer, - * or ERR_PTR() containing errno. - * - * This function may only be called from nonatomic context. The mapping between - * tuples and rpm_regulators struct pointers is specified via - * rpm-regulator platform data. - */ -struct rpm_regulator *rpm_regulator_get(struct device *dev, const char *supply) -{ - struct rpm_regulator_consumer_mapping *mapping = NULL; - const char *devname = NULL; - struct rpm_regulator *regulator; - int i; - - if (!config) { - pr_err("rpm-regulator driver has not probed yet.\n"); - return ERR_PTR(-ENODEV); - } - - if (consumer_map == NULL || consumer_map_len == 0) { - pr_err("No private consumer mapping has been specified.\n"); - return ERR_PTR(-ENODEV); - } - - if (supply == NULL) { - pr_err("supply name must be specified\n"); - return ERR_PTR(-EINVAL); - } - - if (dev) - devname = dev_name(dev); - - for (i = 0; i < consumer_map_len; i++) { - /* If the mapping has a device set up it must match */ - if (consumer_map[i].dev_name && - (!devname || strncmp(consumer_map[i].dev_name, devname, - MAX_NAME_LEN))) - continue; - - if (strncmp(consumer_map[i].supply, supply, MAX_NAME_LEN) - == 0) { - mapping = &consumer_map[i]; - break; - } - } - - if (mapping == NULL) { - pr_err("could not find mapping for dev=%s, supply=%s\n", - (devname ? devname : "(null)"), supply); - return ERR_PTR(-ENODEV); - } - - regulator = kzalloc(sizeof(struct rpm_regulator), GFP_KERNEL); - if (regulator == NULL) { - pr_err("could not allocate memory for regulator\n"); - return ERR_PTR(-ENOMEM); - } - - regulator->vreg_id = mapping->vreg_id; - regulator->voter = mapping->voter; - regulator->sleep_also = mapping->sleep_also; - - return regulator; -} -EXPORT_SYMBOL_GPL(rpm_regulator_get); - -static int rpm_regulator_check_input(struct rpm_regulator *regulator) -{ - int rc = 0; - - if (regulator == NULL) { - rc = -EINVAL; - pr_err("invalid (null) rpm_regulator pointer\n"); - } else if (IS_ERR(regulator)) { - rc = PTR_ERR(regulator); - pr_err("invalid rpm_regulator pointer, rc=%d\n", rc); - } - - return rc; -} - -/** - * rpm_regulator_put() - free the RPM regulator handle - * @regulator: RPM regulator handle - * - * Parameter reaggregation does not take place when rpm_regulator_put is called. - * Therefore, regulator enable state and voltage must be configured - * appropriately before calling rpm_regulator_put. - * - * This function may be called from either atomic or nonatomic context. - */ -void rpm_regulator_put(struct rpm_regulator *regulator) -{ - kfree(regulator); -} -EXPORT_SYMBOL_GPL(rpm_regulator_put); - -/** - * rpm_regulator_enable() - enable regulator output - * @regulator: RPM regulator handle - * - * Returns 0 on success or errno on failure. - * - * This function may be called from either atomic or nonatomic context. This - * function may only be called for regulators which have the sleep_selectable - * flag set in their configuration data. - * - * rpm_regulator_set_voltage must be called before rpm_regulator_enable because - * enabling is defined by the RPM interface to be requesting the desired - * non-zero regulator output voltage. - */ -int rpm_regulator_enable(struct rpm_regulator *regulator) -{ - int rc = rpm_regulator_check_input(regulator); - struct vreg *vreg; - - if (rc) - return rc; - - if (regulator->vreg_id < config->vreg_id_min - || regulator->vreg_id > config->vreg_id_max) { - pr_err("invalid regulator id=%d\n", regulator->vreg_id); - return -EINVAL; - } - - vreg = &config->vregs[regulator->vreg_id]; - - /* - * Handle voltage switches which can be enabled without - * rpm_regulator_set_voltage ever being called. - */ - if (regulator->min_uV == 0 && regulator->max_uV == 0 - && vreg->part->uV.mask == 0 && vreg->part->mV.mask == 0) { - regulator->min_uV = 1; - regulator->max_uV = 1; - } - - if (regulator->min_uV == 0 && regulator->max_uV == 0) { - pr_err("Voltage must be set with rpm_regulator_set_voltage " - "before calling rpm_regulator_enable; vreg_id=%d, " - "voter=%d\n", regulator->vreg_id, regulator->voter); - return -EINVAL; - } - - rc = rpm_vreg_set_voltage(regulator->vreg_id, regulator->voter, - regulator->min_uV, regulator->max_uV, regulator->sleep_also); - - if (rc) - pr_err("rpm_vreg_set_voltage failed, rc=%d\n", rc); - - return rc; -} -EXPORT_SYMBOL_GPL(rpm_regulator_enable); - -/** - * rpm_regulator_disable() - disable regulator output - * @regulator: RPM regulator handle - * - * Returns 0 on success or errno on failure. - * - * The enable state of the regulator is determined by aggregating the requests - * of all consumers. Therefore, it is possible that the regulator will remain - * enabled even after rpm_regulator_disable is called. - * - * This function may be called from either atomic or nonatomic context. This - * function may only be called for regulators which have the sleep_selectable - * flag set in their configuration data. - */ -int rpm_regulator_disable(struct rpm_regulator *regulator) -{ - int rc = rpm_regulator_check_input(regulator); - - if (rc) - return rc; - - rc = rpm_vreg_set_voltage(regulator->vreg_id, regulator->voter, 0, 0, - regulator->sleep_also); - - if (rc) - pr_err("rpm_vreg_set_voltage failed, rc=%d\n", rc); - - return rc; -} -EXPORT_SYMBOL_GPL(rpm_regulator_disable); - -/** - * rpm_regulator_set_voltage() - set regulator output voltage - * @regulator: RPM regulator handle - * @min_uV: minimum required voltage in uV - * @max_uV: maximum acceptable voltage in uV - * - * Sets a voltage regulator to the desired output voltage. This can be set - * while the regulator is disabled or enabled. If the regulator is disabled, - * then rpm_regulator_set_voltage will both enable the regulator and set it to - * output at the requested voltage. - * - * The min_uV to max_uV voltage range requested must intersect with the - * voltage constraint range configured for the regulator. - * - * Returns 0 on success or errno on failure. - * - * The final voltage value that is sent to the RPM is aggregated based upon the - * values requested by all consumers of the regulator. This corresponds to the - * maximum min_uV value. - * - * This function may be called from either atomic or nonatomic context. This - * function may only be called for regulators which have the sleep_selectable - * flag set in their configuration data. - */ -int rpm_regulator_set_voltage(struct rpm_regulator *regulator, int min_uV, - int max_uV) -{ - int rc = rpm_regulator_check_input(regulator); - - if (rc) - return rc; - - rc = rpm_vreg_set_voltage(regulator->vreg_id, regulator->voter, min_uV, - max_uV, regulator->sleep_also); - - if (rc) { - pr_err("rpm_vreg_set_voltage failed, rc=%d\n", rc); - } else { - regulator->min_uV = min_uV; - regulator->max_uV = max_uV; - } - - return rc; -} -EXPORT_SYMBOL_GPL(rpm_regulator_set_voltage); - -static inline int vreg_hpm_min_uA(struct vreg *vreg) -{ - return vreg->hpm_min_load; -} - -static inline int vreg_lpm_max_uA(struct vreg *vreg) -{ - return vreg->hpm_min_load - LOAD_THRESHOLD_STEP; -} - -static inline unsigned saturate_peak_load(struct vreg *vreg, unsigned load_uA) -{ - unsigned load_max - = MILLI_TO_MICRO(vreg->part->ip.mask >> vreg->part->ip.shift); - - return (load_uA > load_max ? load_max : load_uA); -} - -static inline unsigned saturate_avg_load(struct vreg *vreg, unsigned load_uA) -{ - unsigned load_max - = MILLI_TO_MICRO(vreg->part->ia.mask >> vreg->part->ia.shift); - return (load_uA > load_max ? load_max : load_uA); -} - -/* Change vreg->req, but do not send it to the RPM. */ -static int vreg_store(struct vreg *vreg, unsigned mask0, unsigned val0, - unsigned mask1, unsigned val1) -{ - if (vreg->pdata.sleep_selectable) - mutex_lock(&rpm_sleep_sel_lock); - - vreg->req[0].value &= ~mask0; - vreg->req[0].value |= val0 & mask0; - - vreg->req[1].value &= ~mask1; - vreg->req[1].value |= val1 & mask1; - - if (vreg->pdata.sleep_selectable) - mutex_unlock(&rpm_sleep_sel_lock); - - return 0; -} - -static int vreg_set(struct vreg *vreg, unsigned mask0, unsigned val0, - unsigned mask1, unsigned val1, unsigned cnt) -{ - unsigned prev0 = 0, prev1 = 0; - bool tcxo_enabled = false; - bool voltage_increased = false; - int rc; - - /* - * Bypass the normal route for regulators that can be called to change - * just the active set values. - */ - if (vreg->pdata.sleep_selectable) - return vreg_set_sleep_sel(vreg, RPM_VREG_VOTER_REG_FRAMEWORK, 1, - mask0, val0, mask1, val1, cnt, 1); - - prev0 = vreg->req[0].value; - vreg->req[0].value &= ~mask0; - vreg->req[0].value |= val0 & mask0; - - prev1 = vreg->req[1].value; - vreg->req[1].value &= ~mask1; - vreg->req[1].value |= val1 & mask1; - - /* Ignore duplicate requests */ - if (vreg->req[0].value == vreg->prev_active_req[0].value && - vreg->req[1].value == vreg->prev_active_req[1].value) { - if (msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_DUPLICATE) - rpm_regulator_duplicate(vreg, MSM_RPM_CTX_SET_0, cnt); - return 0; - } - - /* Enable CXO clock if necessary for TCXO workaround. */ - if (requires_tcxo_workaround && vreg->requires_cxo - && (GET_PART(vreg, uV) > GET_PART_PREV_ACT(vreg, uV))) { - mutex_lock(&tcxo_mutex); - if (!tcxo_handle) - tcxo_get_handle(); - voltage_increased = true; - tcxo_enabled = tcxo_enable(); - } - - rc = msm_rpm_set(MSM_RPM_CTX_SET_0, vreg->req, cnt); - - if (rc) { - vreg->req[0].value = prev0; - vreg->req[1].value = prev1; - - vreg_err(vreg, "msm_rpm_set failed, set=active, id=%d, rc=%d\n", - vreg->req[0].id, rc); - } else { - if (msm_rpm_vreg_debug_mask & MSM_RPM_VREG_DEBUG_REQUEST) - rpm_regulator_req(vreg, MSM_RPM_CTX_SET_0); - vreg->prev_active_req[0].value = vreg->req[0].value; - vreg->prev_active_req[1].value = vreg->req[1].value; - } - - /* - * Schedule CXO clock to be disabled after TCXO warmup time if TCXO - * workaround is applicable for this regulator. - */ - if (voltage_increased) { - if (tcxo_enabled) - tcxo_delayed_disable(); - mutex_unlock(&tcxo_mutex); - } - - return rc; -} - -static int vreg_is_enabled(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - int enabled; - - mutex_lock(&vreg->pc_lock); - enabled = vreg->is_enabled; - mutex_unlock(&vreg->pc_lock); - - return enabled; -} - -static void set_enable(struct vreg *vreg, unsigned int *mask, unsigned int *val) -{ - switch (vreg->type) { - case RPM_REGULATOR_TYPE_LDO: - case RPM_REGULATOR_TYPE_SMPS: - case RPM_REGULATOR_TYPE_CORNER: - /* Enable by setting a voltage. */ - if (vreg->part->uV.mask) { - val[vreg->part->uV.word] - |= vreg->save_uV << vreg->part->uV.shift; - mask[vreg->part->uV.word] |= vreg->part->uV.mask; - } else { - val[vreg->part->mV.word] - |= MICRO_TO_MILLI(vreg->save_uV) - << vreg->part->mV.shift; - mask[vreg->part->mV.word] |= vreg->part->mV.mask; - } - break; - case RPM_REGULATOR_TYPE_VS: - case RPM_REGULATOR_TYPE_NCP: - /* Enable by setting enable_state. */ - val[vreg->part->enable_state.word] - |= RPM_VREG_STATE_ON << vreg->part->enable_state.shift; - mask[vreg->part->enable_state.word] - |= vreg->part->enable_state.mask; - } -} - -static int rpm_vreg_enable(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mask[2] = {0}, val[2] = {0}; - int rc = 0; - - set_enable(vreg, mask, val); - - mutex_lock(&vreg->pc_lock); - - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - if (!rc) - vreg->is_enabled = true; - - mutex_unlock(&vreg->pc_lock); - - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - - return rc; -} - -static void set_disable(struct vreg *vreg, unsigned int *mask, - unsigned int *val) -{ - switch (vreg->type) { - case RPM_REGULATOR_TYPE_LDO: - case RPM_REGULATOR_TYPE_SMPS: - case RPM_REGULATOR_TYPE_CORNER: - /* Disable by setting a voltage of 0 uV. */ - if (vreg->part->uV.mask) { - val[vreg->part->uV.word] |= 0 << vreg->part->uV.shift; - mask[vreg->part->uV.word] |= vreg->part->uV.mask; - } else { - val[vreg->part->mV.word] |= 0 << vreg->part->mV.shift; - mask[vreg->part->mV.word] |= vreg->part->mV.mask; - } - break; - case RPM_REGULATOR_TYPE_VS: - case RPM_REGULATOR_TYPE_NCP: - /* Disable by setting enable_state. */ - val[vreg->part->enable_state.word] - |= RPM_VREG_STATE_OFF << vreg->part->enable_state.shift; - mask[vreg->part->enable_state.word] - |= vreg->part->enable_state.mask; - } -} - -static int rpm_vreg_disable(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mask[2] = {0}, val[2] = {0}; - int rc = 0; - - set_disable(vreg, mask, val); - - mutex_lock(&vreg->pc_lock); - - /* Only disable if pin control is not in use. */ - if (!vreg->is_enabled_pc) - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - - if (!rc) - vreg->is_enabled = false; - - mutex_unlock(&vreg->pc_lock); - - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - - return rc; -} - -static int vreg_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, - unsigned *selector) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - struct vreg_range *range = &vreg->set_points->range[0]; - unsigned int mask[2] = {0}, val[2] = {0}; - int rc = 0, uV = min_uV; - int lim_min_uV, lim_max_uV, i; - - /* Check if request voltage is outside of physically settable range. */ - lim_min_uV = vreg->set_points->range[0].min_uV; - lim_max_uV = - vreg->set_points->range[vreg->set_points->count - 1].max_uV; - - if (uV < lim_min_uV && max_uV >= lim_min_uV) - uV = lim_min_uV; - - if (uV < lim_min_uV || uV > lim_max_uV) { - vreg_err(vreg, - "request v=[%d, %d] is outside possible v=[%d, %d]\n", - min_uV, max_uV, lim_min_uV, lim_max_uV); - return -EINVAL; - } - - /* Find the range which uV is inside of. */ - for (i = vreg->set_points->count - 1; i > 0; i--) { - if (uV > vreg->set_points->range[i - 1].max_uV) { - range = &vreg->set_points->range[i]; - break; - } - } - - /* - * Force uV to be an allowed set point and apply a ceiling function - * to non-set point values. - */ - uV = (uV - range->min_uV + range->step_uV - 1) / range->step_uV; - uV = uV * range->step_uV + range->min_uV; - - if (uV > max_uV) { - vreg_err(vreg, - "request v=[%d, %d] cannot be met by any set point; " - "next set point: %d\n", - min_uV, max_uV, uV); - return -EINVAL; - } - - if (vreg->type == RPM_REGULATOR_TYPE_CORNER) { - /* - * Translate from enum values which work as inputs in the - * regulator_set_voltage function to the actual corner values - * sent to the RPM. - */ - uV -= RPM_VREG_CORNER_NONE; - } - - if (vreg->part->uV.mask) { - val[vreg->part->uV.word] = uV << vreg->part->uV.shift; - mask[vreg->part->uV.word] = vreg->part->uV.mask; - } else { - val[vreg->part->mV.word] - = MICRO_TO_MILLI(uV) << vreg->part->mV.shift; - mask[vreg->part->mV.word] = vreg->part->mV.mask; - } - - mutex_lock(&vreg->pc_lock); - - /* - * Only send a request for a new voltage if the regulator is currently - * enabled. This will ensure that LDO and SMPS regulators are not - * inadvertently turned on because voltage > 0 is equivalent to - * enabling. For NCP, this just removes unnecessary RPM requests. - */ - if (vreg->is_enabled) { - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - } else if (vreg->type == RPM_REGULATOR_TYPE_NCP) { - /* Regulator is disabled; store but don't send new request. */ - rc = vreg_store(vreg, mask[0], val[0], mask[1], val[1]); - } - - if (!rc && (!vreg->pdata.sleep_selectable || !vreg->is_enabled)) - vreg->save_uV = uV; - - mutex_unlock(&vreg->pc_lock); - - return rc; -} - -static int vreg_get_voltage(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->save_uV; -} - -static int vreg_list_voltage(struct regulator_dev *rdev, unsigned selector) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - int uV = 0; - int i; - - if (!vreg->set_points) { - vreg_err(vreg, "no voltages available\n"); - return -EINVAL; - } - - if (selector >= vreg->set_points->n_voltages) - return 0; - - for (i = 0; i < vreg->set_points->count; i++) { - if (selector < vreg->set_points->range[i].n_voltages) { - uV = selector * vreg->set_points->range[i].step_uV - + vreg->set_points->range[i].min_uV; - break; - } else { - selector -= vreg->set_points->range[i].n_voltages; - } - } - - return uV; -} - -static int vreg_set_mode(struct regulator_dev *rdev, unsigned int mode) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mask[2] = {0}, val[2] = {0}; - int rc = 0; - int peak_uA; - - mutex_lock(&vreg->pc_lock); - - peak_uA = MILLI_TO_MICRO((vreg->req[vreg->part->ip.word].value - & vreg->part->ip.mask) >> vreg->part->ip.shift); - - if (mode == config->mode_hpm) { - /* Make sure that request currents are in HPM range. */ - if (peak_uA < vreg_hpm_min_uA(vreg)) { - val[vreg->part->ip.word] - = MICRO_TO_MILLI(vreg_hpm_min_uA(vreg)) - << vreg->part->ip.shift; - mask[vreg->part->ip.word] = vreg->part->ip.mask; - - if (config->ia_follows_ip) { - val[vreg->part->ia.word] - |= MICRO_TO_MILLI(vreg_hpm_min_uA(vreg)) - << vreg->part->ia.shift; - mask[vreg->part->ia.word] - |= vreg->part->ia.mask; - } - } - } else if (mode == config->mode_lpm) { - /* Make sure that request currents are in LPM range. */ - if (peak_uA > vreg_lpm_max_uA(vreg)) { - val[vreg->part->ip.word] - = MICRO_TO_MILLI(vreg_lpm_max_uA(vreg)) - << vreg->part->ip.shift; - mask[vreg->part->ip.word] = vreg->part->ip.mask; - - if (config->ia_follows_ip) { - val[vreg->part->ia.word] - |= MICRO_TO_MILLI(vreg_lpm_max_uA(vreg)) - << vreg->part->ia.shift; - mask[vreg->part->ia.word] - |= vreg->part->ia.mask; - } - } - } else { - vreg_err(vreg, "invalid mode: %u\n", mode); - mutex_unlock(&vreg->pc_lock); - return -EINVAL; - } - - if (vreg->is_enabled) { - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - } else { - /* Regulator is disabled; store but don't send new request. */ - rc = vreg_store(vreg, mask[0], val[0], mask[1], val[1]); - } - - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - else - vreg->mode = mode; - - mutex_unlock(&vreg->pc_lock); - - return rc; -} - -static unsigned int vreg_get_mode(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->mode; -} - -static unsigned int vreg_get_optimum_mode(struct regulator_dev *rdev, - int input_uV, int output_uV, int load_uA) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mode; - - load_uA += vreg->pdata.system_uA; - - mutex_lock(&vreg->pc_lock); - SET_PART(vreg, ip, MICRO_TO_MILLI(saturate_peak_load(vreg, load_uA))); - if (config->ia_follows_ip) - SET_PART(vreg, ia, - MICRO_TO_MILLI(saturate_avg_load(vreg, load_uA))); - mutex_unlock(&vreg->pc_lock); - - if (load_uA >= vreg->hpm_min_load) - mode = config->mode_hpm; - else - mode = config->mode_lpm; - - return mode; -} - -static unsigned int vreg_legacy_get_optimum_mode(struct regulator_dev *rdev, - int input_uV, int output_uV, int load_uA) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - - if (MICRO_TO_MILLI(load_uA) <= 0) { - /* - * vreg_legacy_get_optimum_mode is being called before consumers - * have specified their load currents via - * regulator_set_optimum_mode. Return whatever the existing mode - * is. - */ - return vreg->mode; - } - - return vreg_get_optimum_mode(rdev, input_uV, output_uV, load_uA); -} - -/* - * Returns the logical pin control enable state because the pin control options - * present in the hardware out of restart could be different from those desired - * by the consumer. - */ -static int vreg_pin_control_is_enabled(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->is_enabled_pc; -} - -static int vreg_pin_control_enable(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mask[2] = {0}, val[2] = {0}; - int rc; - - mutex_lock(&vreg->pc_lock); - - val[vreg->part->pc.word] - |= vreg->pdata.pin_ctrl << vreg->part->pc.shift; - mask[vreg->part->pc.word] |= vreg->part->pc.mask; - - val[vreg->part->pf.word] |= vreg->pdata.pin_fn << vreg->part->pf.shift; - mask[vreg->part->pf.word] |= vreg->part->pf.mask; - - if (!vreg->is_enabled) - set_enable(vreg, mask, val); - - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - - if (!rc) - vreg->is_enabled_pc = true; - - mutex_unlock(&vreg->pc_lock); - - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - - return rc; -} - -static int vreg_pin_control_disable(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - unsigned int mask[2] = {0}, val[2] = {0}; - int pin_fn, rc; - - mutex_lock(&vreg->pc_lock); - - val[vreg->part->pc.word] - |= RPM_VREG_PIN_CTRL_NONE << vreg->part->pc.shift; - mask[vreg->part->pc.word] |= vreg->part->pc.mask; - - pin_fn = config->pin_func_none; - if (vreg->pdata.pin_fn == config->pin_func_sleep_b) - pin_fn = config->pin_func_sleep_b; - val[vreg->part->pf.word] |= pin_fn << vreg->part->pf.shift; - mask[vreg->part->pf.word] |= vreg->part->pf.mask; - - if (!vreg->is_enabled) - set_disable(vreg, mask, val); - - rc = vreg_set(vreg, mask[0], val[0], mask[1], val[1], - vreg->part->request_len); - - if (!rc) - vreg->is_enabled_pc = false; - - mutex_unlock(&vreg->pc_lock); - - if (rc) - vreg_err(vreg, "vreg_set failed, rc=%d\n", rc); - - return rc; -} - -static int vreg_enable_time(struct regulator_dev *rdev) -{ - struct vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->pdata.enable_time; -} - -/* Real regulator operations. */ -static struct regulator_ops ldo_ops = { - .enable = rpm_vreg_enable, - .disable = rpm_vreg_disable, - .is_enabled = vreg_is_enabled, - .set_voltage = vreg_set_voltage, - .get_voltage = vreg_get_voltage, - .list_voltage = vreg_list_voltage, - .set_mode = vreg_set_mode, - .get_mode = vreg_get_mode, - .get_optimum_mode = vreg_get_optimum_mode, - .enable_time = vreg_enable_time, -}; - -static struct regulator_ops smps_ops = { - .enable = rpm_vreg_enable, - .disable = rpm_vreg_disable, - .is_enabled = vreg_is_enabled, - .set_voltage = vreg_set_voltage, - .get_voltage = vreg_get_voltage, - .list_voltage = vreg_list_voltage, - .set_mode = vreg_set_mode, - .get_mode = vreg_get_mode, - .get_optimum_mode = vreg_get_optimum_mode, - .enable_time = vreg_enable_time, -}; - -static struct regulator_ops switch_ops = { - .enable = rpm_vreg_enable, - .disable = rpm_vreg_disable, - .is_enabled = vreg_is_enabled, - .enable_time = vreg_enable_time, -}; - -static struct regulator_ops ncp_ops = { - .enable = rpm_vreg_enable, - .disable = rpm_vreg_disable, - .is_enabled = vreg_is_enabled, - .set_voltage = vreg_set_voltage, - .get_voltage = vreg_get_voltage, - .list_voltage = vreg_list_voltage, - .enable_time = vreg_enable_time, -}; - -static struct regulator_ops corner_ops = { - .enable = rpm_vreg_enable, - .disable = rpm_vreg_disable, - .is_enabled = vreg_is_enabled, - .set_voltage = vreg_set_voltage, - .get_voltage = vreg_get_voltage, - .list_voltage = vreg_list_voltage, - .enable_time = vreg_enable_time, -}; - -/* Pin control regulator operations. */ -static struct regulator_ops pin_control_ops = { - .enable = vreg_pin_control_enable, - .disable = vreg_pin_control_disable, - .is_enabled = vreg_pin_control_is_enabled, -}; - -struct regulator_ops *vreg_ops[] = { - [RPM_REGULATOR_TYPE_LDO] = &ldo_ops, - [RPM_REGULATOR_TYPE_SMPS] = &smps_ops, - [RPM_REGULATOR_TYPE_VS] = &switch_ops, - [RPM_REGULATOR_TYPE_NCP] = &ncp_ops, - [RPM_REGULATOR_TYPE_CORNER] = &corner_ops, -}; - -static struct vreg *rpm_vreg_get_vreg(int id) -{ - struct vreg *vreg; - - if (id < config->vreg_id_min || id > config->vreg_id_max) - return NULL; - - if (!config->is_real_id(id)) - id = config->pc_id_to_real_id(id); - vreg = &config->vregs[id]; - - return vreg; -} - -static int -rpm_vreg_init_regulator(const struct rpm_regulator_init_data *pdata, - struct device *dev) -{ - struct regulator_config reg_config = {}; - struct regulator_desc *rdesc = NULL; - struct regulator_dev *rdev; - struct vreg *vreg; - unsigned pin_ctrl; - int pin_fn; - int rc = 0; - - if (!pdata) { - pr_err("platform data missing\n"); - return -EINVAL; - } - - vreg = rpm_vreg_get_vreg(pdata->id); - if (!vreg) { - pr_err("invalid regulator id: %d\n", pdata->id); - return -ENODEV; - } - - if (config->is_real_id(pdata->id)) - rdesc = &vreg->rdesc; - else - rdesc = &vreg->rdesc_pc; - - if (vreg->type < 0 || vreg->type > RPM_REGULATOR_TYPE_MAX) { - pr_err("%s: invalid regulator type: %d\n", - vreg->rdesc.name, vreg->type); - return -EINVAL; - } - - mutex_lock(&vreg->pc_lock); - - if (vreg->set_points) - rdesc->n_voltages = vreg->set_points->n_voltages; - else - rdesc->n_voltages = 0; - - rdesc->id = pdata->id; - rdesc->owner = THIS_MODULE; - rdesc->type = REGULATOR_VOLTAGE; - - if (config->is_real_id(pdata->id)) { - /* - * Real regulator; do not modify pin control and pin function - * values. - */ - rdesc->ops = vreg_ops[vreg->type]; - pin_ctrl = vreg->pdata.pin_ctrl; - pin_fn = vreg->pdata.pin_fn; - memcpy(&(vreg->pdata), pdata, - sizeof(struct rpm_regulator_init_data)); - vreg->pdata.pin_ctrl = pin_ctrl; - vreg->pdata.pin_fn = pin_fn; - - vreg->save_uV = vreg->pdata.default_uV; - if (vreg->pdata.peak_uA >= vreg->hpm_min_load) - vreg->mode = config->mode_hpm; - else - vreg->mode = config->mode_lpm; - - /* Initialize the RPM request. */ - SET_PART(vreg, ip, - MICRO_TO_MILLI(saturate_peak_load(vreg, vreg->pdata.peak_uA))); - SET_PART(vreg, fm, vreg->pdata.force_mode); - SET_PART(vreg, pm, vreg->pdata.power_mode); - SET_PART(vreg, pd, vreg->pdata.pull_down_enable); - SET_PART(vreg, ia, - MICRO_TO_MILLI(saturate_avg_load(vreg, vreg->pdata.avg_uA))); - SET_PART(vreg, freq, vreg->pdata.freq); - SET_PART(vreg, freq_clk_src, 0); - SET_PART(vreg, comp_mode, 0); - SET_PART(vreg, hpm, 0); - if (!vreg->is_enabled_pc) { - SET_PART(vreg, pf, config->pin_func_none); - SET_PART(vreg, pc, RPM_VREG_PIN_CTRL_NONE); - } - } else { - if ((pdata->pin_ctrl & RPM_VREG_PIN_CTRL_ALL) - == RPM_VREG_PIN_CTRL_NONE - && pdata->pin_fn != config->pin_func_sleep_b) { - pr_err("%s: no pin control input specified\n", - vreg->rdesc.name); - mutex_unlock(&vreg->pc_lock); - return -EINVAL; - } - rdesc->ops = &pin_control_ops; - vreg->pdata.pin_ctrl = pdata->pin_ctrl; - vreg->pdata.pin_fn = pdata->pin_fn; - - /* Initialize the RPM request. */ - pin_fn = config->pin_func_none; - /* Allow pf=sleep_b to be specified by platform data. */ - if (vreg->pdata.pin_fn == config->pin_func_sleep_b) - pin_fn = config->pin_func_sleep_b; - SET_PART(vreg, pf, pin_fn); - SET_PART(vreg, pc, RPM_VREG_PIN_CTRL_NONE); - } - - mutex_unlock(&vreg->pc_lock); - - if (rc) - goto bail; - - reg_config.dev = dev; - reg_config.init_data = &pdata->init_data; - reg_config.driver_data = vreg; - rdev = regulator_register(rdesc, ®_config); - if (IS_ERR(rdev)) { - rc = PTR_ERR(rdev); - pr_err("regulator_register failed: %s, rc=%d\n", - vreg->rdesc.name, rc); - return rc; - } else { - if (config->is_real_id(pdata->id)) - vreg->rdev = rdev; - else - vreg->rdev_pc = rdev; - } - -bail: - if (rc) - pr_err("error for %s, rc=%d\n", vreg->rdesc.name, rc); - - return rc; -} - -static void rpm_vreg_set_point_init(void) -{ - struct vreg_set_points **set_points; - int i, j, temp; - - set_points = config->set_points; - - /* Calculate the number of set points available for each regulator. */ - for (i = 0; i < config->set_points_len; i++) { - temp = 0; - for (j = 0; j < set_points[i]->count; j++) { - set_points[i]->range[j].n_voltages - = (set_points[i]->range[j].max_uV - - set_points[i]->range[j].min_uV) - / set_points[i]->range[j].step_uV + 1; - temp += set_points[i]->range[j].n_voltages; - } - set_points[i]->n_voltages = temp; - } -} - -static int rpm_vreg_probe(struct platform_device *pdev) -{ - struct rpm_regulator_platform_data *platform_data; - static struct rpm_regulator_consumer_mapping *prev_consumer_map; - static int prev_consumer_map_len; - int rc = 0; - int i, id; - - platform_data = pdev->dev.platform_data; - if (!platform_data) { - pr_err("rpm-regulator requires platform data\n"); - return -EINVAL; - } - - if (rpm_version >= 0 && rpm_version <= RPM_VREG_VERSION_MAX - && platform_data->version != rpm_version) { - pr_err("rpm version %d does not match previous version %d\n", - platform_data->version, rpm_version); - return -EINVAL; - } - - if (platform_data->version < 0 - || platform_data->version > RPM_VREG_VERSION_MAX) { - pr_err("rpm version %d is invalid\n", platform_data->version); - return -EINVAL; - } - - if (rpm_version < 0 || rpm_version > RPM_VREG_VERSION_MAX) { - rpm_version = platform_data->version; - config = get_config[platform_data->version](); - vreg_id_vdd_mem = platform_data->vreg_id_vdd_mem; - vreg_id_vdd_dig = platform_data->vreg_id_vdd_dig; - if (!config) { - pr_err("rpm version %d is not available\n", - platform_data->version); - return -ENODEV; - } - if (config->use_legacy_optimum_mode) - for (i = 0; i < ARRAY_SIZE(vreg_ops); i++) - vreg_ops[i]->get_optimum_mode - = vreg_legacy_get_optimum_mode; - rpm_vreg_set_point_init(); - /* First time probed; initialize pin control mutexes. */ - for (i = 0; i < config->vregs_len; i++) - mutex_init(&config->vregs[i].pc_lock); - } - - /* Copy the list of private API consumers. */ - if (platform_data->consumer_map_len > 0) { - if (consumer_map_len == 0) { - consumer_map_len = platform_data->consumer_map_len; - consumer_map = kmemdup(platform_data->consumer_map, - sizeof(struct rpm_regulator_consumer_mapping) - * consumer_map_len, GFP_KERNEL); - if (consumer_map == NULL) { - pr_err("memory allocation failed\n"); - consumer_map_len = 0; - return -ENOMEM; - } - } else { - /* Concatenate new map with the existing one. */ - prev_consumer_map = consumer_map; - prev_consumer_map_len = consumer_map_len; - consumer_map_len += platform_data->consumer_map_len; - consumer_map = kmalloc( - sizeof(struct rpm_regulator_consumer_mapping) - * consumer_map_len, GFP_KERNEL); - if (consumer_map == NULL) { - pr_err("memory allocation failed\n"); - consumer_map_len = 0; - return -ENOMEM; - } - memcpy(consumer_map, prev_consumer_map, - sizeof(struct rpm_regulator_consumer_mapping) - * prev_consumer_map_len); - memcpy(&consumer_map[prev_consumer_map_len], - platform_data->consumer_map, - sizeof(struct rpm_regulator_consumer_mapping) - * platform_data->consumer_map_len); - } - - } - - if (platform_data->requires_tcxo_workaround - && !requires_tcxo_workaround) { - requires_tcxo_workaround = true; - wake_lock_init(&tcxo_wake_lock, WAKE_LOCK_SUSPEND, - "rpm_regulator_tcxo"); - } - - /* Initialize all of the regulators listed in the platform data. */ - for (i = 0; i < platform_data->num_regulators; i++) { - rc = rpm_vreg_init_regulator(&platform_data->init_data[i], - &pdev->dev); - if (rc) { - pr_err("rpm_vreg_init_regulator failed, rc=%d\n", rc); - goto remove_regulators; - } - } - - platform_set_drvdata(pdev, platform_data); - - return rc; - -remove_regulators: - /* Unregister all regulators added before the erroring one. */ - for (; i >= 0; i--) { - id = platform_data->init_data[i].id; - if (config->is_real_id(id)) { - regulator_unregister(config->vregs[id].rdev); - config->vregs[id].rdev = NULL; - } else { - regulator_unregister(config->vregs[ - config->pc_id_to_real_id(id)].rdev_pc); - config->vregs[id].rdev_pc = NULL; - } - } - - return rc; -} - -static int rpm_vreg_remove(struct platform_device *pdev) -{ - struct rpm_regulator_platform_data *platform_data; - int i, id; - - platform_data = platform_get_drvdata(pdev); - platform_set_drvdata(pdev, NULL); - - if (platform_data) { - for (i = 0; i < platform_data->num_regulators; i++) { - id = platform_data->init_data[i].id; - if (config->is_real_id(id)) { - regulator_unregister(config->vregs[id].rdev); - config->vregs[id].rdev = NULL; - } else { - regulator_unregister(config->vregs[ - config->pc_id_to_real_id(id)].rdev_pc); - config->vregs[id].rdev_pc = NULL; - } - } - } - - return 0; -} - -static struct platform_driver rpm_vreg_driver = { - .probe = rpm_vreg_probe, - .remove = rpm_vreg_remove, - .driver = { - .name = RPM_REGULATOR_DEV_NAME, - .owner = THIS_MODULE, - }, -}; - -static int __init rpm_vreg_init(void) -{ - return platform_driver_register(&rpm_vreg_driver); -} - -static void __exit rpm_vreg_exit(void) -{ - int i; - - platform_driver_unregister(&rpm_vreg_driver); - - kfree(consumer_map); - - for (i = 0; i < config->vregs_len; i++) - mutex_destroy(&config->vregs[i].pc_lock); - - if (tcxo_handle) - clk_put(tcxo_handle); -} - -postcore_initcall(rpm_vreg_init); -module_exit(rpm_vreg_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MSM RPM regulator driver"); -MODULE_VERSION("1.0"); -MODULE_ALIAS("platform:" RPM_REGULATOR_DEV_NAME); diff --git a/arch/arm/mach-msm/saw-regulator.c b/arch/arm/mach-msm/saw-regulator.c deleted file mode 100644 index 94c0b57a3f82..000000000000 --- a/arch/arm/mach-msm/saw-regulator.c +++ /dev/null @@ -1,294 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "spm.h" - -#define FTSMPS_VCTRL_BAND_MASK 0xC0 -#define FTSMPS_VCTRL_BAND_1 0x40 -#define FTSMPS_VCTRL_BAND_2 0x80 -#define FTSMPS_VCTRL_BAND_3 0xC0 -#define FTSMPS_VCTRL_VPROG_MASK 0x3F - -#define FTSMPS_BAND1_UV_MIN 350000 -#define FTSMPS_BAND1_UV_MAX 650000 -/* 3 LSB's of program voltage must be 0 in band 1. */ -/* Logical step size */ -#define FTSMPS_BAND1_UV_LOG_STEP 50000 -/* Physical step size */ -#define FTSMPS_BAND1_UV_PHYS_STEP 6250 - -#define FTSMPS_BAND2_UV_MIN 700000 -#define FTSMPS_BAND2_UV_MAX 1400000 -#define FTSMPS_BAND2_UV_STEP 12500 - -#define FTSMPS_BAND3_UV_MIN 1400000 -#define FTSMPS_BAND3_UV_SET_POINT_MIN 1500000 -#define FTSMPS_BAND3_UV_MAX 3300000 -#define FTSMPS_BAND3_UV_STEP 50000 - -struct saw_vreg { - struct regulator_desc desc; - struct regulator_dev *rdev; - char *name; - int uV; - int last_set_uV; - unsigned vlevel; - bool online; -}; - -/* Minimum core operating voltage */ -#define MIN_CORE_VOLTAGE 950000 - -/* Specifies an uninitialized voltage */ -#define INVALID_VOLTAGE -1 - -/* Specifies the PMIC internal slew rate in uV/us. */ -#define REGULATOR_SLEW_RATE 1250 - -static int saw_get_voltage(struct regulator_dev *rdev) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->uV; -} - -static int _set_voltage(struct regulator_dev *rdev) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - int rc; - - rc = msm_spm_set_vdd(rdev_get_id(rdev), vreg->vlevel); - if (!rc) { - if (vreg->uV > vreg->last_set_uV) { - /* Wait for voltage to stabalize. */ - udelay((vreg->uV - vreg->last_set_uV) / - REGULATOR_SLEW_RATE); - } - vreg->last_set_uV = vreg->uV; - } else { - pr_err("%s: msm_spm_set_vdd failed %d\n", vreg->name, rc); - vreg->uV = vreg->last_set_uV; - } - - return rc; -} - -static int saw_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, - unsigned *selector) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - int uV = min_uV; - u8 vprog, band; - - if (uV < FTSMPS_BAND1_UV_MIN && max_uV >= FTSMPS_BAND1_UV_MIN) - uV = FTSMPS_BAND1_UV_MIN; - - if (uV < FTSMPS_BAND1_UV_MIN || uV > FTSMPS_BAND3_UV_MAX) { - pr_err("%s: request v=[%d, %d] is outside possible " - "v=[%d, %d]\n", vreg->name, min_uV, max_uV, - FTSMPS_BAND1_UV_MIN, FTSMPS_BAND3_UV_MAX); - return -EINVAL; - } - - /* Round up for set points in the gaps between bands. */ - if (uV > FTSMPS_BAND1_UV_MAX && uV < FTSMPS_BAND2_UV_MIN) - uV = FTSMPS_BAND2_UV_MIN; - else if (uV > FTSMPS_BAND2_UV_MAX - && uV < FTSMPS_BAND3_UV_SET_POINT_MIN) - uV = FTSMPS_BAND3_UV_SET_POINT_MIN; - - if (uV > FTSMPS_BAND2_UV_MAX) { - vprog = (uV - FTSMPS_BAND3_UV_MIN + FTSMPS_BAND3_UV_STEP - 1) - / FTSMPS_BAND3_UV_STEP; - band = FTSMPS_VCTRL_BAND_3; - uV = FTSMPS_BAND3_UV_MIN + vprog * FTSMPS_BAND3_UV_STEP; - } else if (uV > FTSMPS_BAND1_UV_MAX) { - vprog = (uV - FTSMPS_BAND2_UV_MIN + FTSMPS_BAND2_UV_STEP - 1) - / FTSMPS_BAND2_UV_STEP; - band = FTSMPS_VCTRL_BAND_2; - uV = FTSMPS_BAND2_UV_MIN + vprog * FTSMPS_BAND2_UV_STEP; - } else { - vprog = (uV - FTSMPS_BAND1_UV_MIN - + FTSMPS_BAND1_UV_LOG_STEP - 1) - / FTSMPS_BAND1_UV_LOG_STEP; - uV = FTSMPS_BAND1_UV_MIN + vprog * FTSMPS_BAND1_UV_LOG_STEP; - vprog *= FTSMPS_BAND1_UV_LOG_STEP / FTSMPS_BAND1_UV_PHYS_STEP; - band = FTSMPS_VCTRL_BAND_1; - } - - if (uV > max_uV) { - pr_err("%s: request v=[%d, %d] cannot be met by any setpoint\n", - vreg->name, min_uV, max_uV); - return -EINVAL; - } - - vreg->vlevel = band | vprog; - vreg->uV = uV; - - if (!vreg->online) - return 0; - - return _set_voltage(rdev); -} - -static int saw_enable(struct regulator_dev *rdev) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - int rc = 0; - - if (vreg->uV != vreg->last_set_uV) - rc = _set_voltage(rdev); - - if (!rc) - vreg->online = true; - - return rc; -} - -static int saw_disable(struct regulator_dev *rdev) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - - vreg->online = false; - - return 0; -} - -static int saw_is_enabled(struct regulator_dev *rdev) -{ - struct saw_vreg *vreg = rdev_get_drvdata(rdev); - - return vreg->online; -} - -static struct regulator_ops saw_ops = { - .get_voltage = saw_get_voltage, - .set_voltage = saw_set_voltage, - .enable = saw_enable, - .disable = saw_disable, - .is_enabled = saw_is_enabled, -}; - -static int saw_probe(struct platform_device *pdev) -{ - struct regulator_config reg_config = {}; - struct regulator_init_data *init_data; - struct saw_vreg *vreg; - int rc = 0; - - if (!pdev->dev.platform_data) { - pr_err("platform data required.\n"); - return -EINVAL; - } - - init_data = pdev->dev.platform_data; - if (!init_data->constraints.name) { - pr_err("regulator name must be specified in constraints.\n"); - return -EINVAL; - } - - vreg = kzalloc(sizeof(struct saw_vreg), GFP_KERNEL); - if (!vreg) { - pr_err("kzalloc failed.\n"); - return -ENOMEM; - } - - vreg->name = kstrdup(init_data->constraints.name, GFP_KERNEL); - if (!vreg->name) { - pr_err("kzalloc failed.\n"); - rc = -ENOMEM; - goto free_vreg; - } - - vreg->desc.name = vreg->name; - vreg->desc.id = pdev->id; - vreg->desc.ops = &saw_ops; - vreg->desc.type = REGULATOR_VOLTAGE; - vreg->desc.owner = THIS_MODULE; - vreg->uV = INVALID_VOLTAGE; - vreg->last_set_uV = MIN_CORE_VOLTAGE; - - reg_config.dev = &pdev->dev; - reg_config.init_data = init_data; - reg_config.driver_data = vreg; - vreg->rdev = regulator_register(&vreg->desc, ®_config); - if (IS_ERR(vreg->rdev)) { - rc = PTR_ERR(vreg->rdev); - pr_err("regulator_register failed, rc=%d.\n", rc); - goto free_name; - } - - platform_set_drvdata(pdev, vreg); - - pr_info("id=%d, name=%s\n", pdev->id, vreg->name); - - return rc; - -free_name: - kfree(vreg->name); -free_vreg: - kfree(vreg); - - return rc; -} - -static int saw_remove(struct platform_device *pdev) -{ - struct saw_vreg *vreg = platform_get_drvdata(pdev); - - regulator_unregister(vreg->rdev); - kfree(vreg->name); - kfree(vreg); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver saw_driver = { - .probe = saw_probe, - .remove = saw_remove, - .driver = { - .name = "saw-regulator", - .owner = THIS_MODULE, - }, -}; - -static int __init saw_init(void) -{ - return platform_driver_register(&saw_driver); -} - -static void __exit saw_exit(void) -{ - platform_driver_unregister(&saw_driver); -} - -postcore_initcall(saw_init); -module_exit(saw_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SAW regulator driver"); -MODULE_ALIAS("platform:saw-regulator"); diff --git a/arch/arm/mach-msm/sdio_al.c b/arch/arm/mach-msm/sdio_al.c deleted file mode 100644 index 6e1612b6f30f..000000000000 --- a/arch/arm/mach-msm/sdio_al.c +++ /dev/null @@ -1,4365 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * SDIO-Abstraction-Layer Module. - * - * To be used with Qualcomm's SDIO-Client connected to this host. - */ -#include "sdio_al_private.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "../../../drivers/mmc/host/msm_sdcc.h" - -/** - * Func#0 has SDIO standard registers - * Func#1 is for Mailbox. - * Functions 2..7 are for channels. - * Currently only functions 2..5 are active due to SDIO-Client - * number of pipes. - * - */ -#define SDIO_AL_MAX_CHANNELS 6 - -/** Func 1..5 */ -#define SDIO_AL_MAX_FUNCS (SDIO_AL_MAX_CHANNELS+1) -#define SDIO_AL_WAKEUP_FUNC 6 - -/** Number of SDIO-Client pipes */ -#define SDIO_AL_MAX_PIPES 16 -#define SDIO_AL_ACTIVE_PIPES 8 - -/** CMD53/CMD54 Block size */ -#define SDIO_AL_BLOCK_SIZE 256 - -/** Func#1 hardware Mailbox base address */ -#define HW_MAILBOX_ADDR 0x1000 - -/** Func#1 peer sdioc software version. - * The header is duplicated also to the mailbox of the other - * functions. It can be used before other functions are enabled. */ -#define SDIOC_SW_HEADER_ADDR 0x0400 - -/** Func#2..7 software Mailbox base address at 16K */ -#define SDIOC_SW_MAILBOX_ADDR 0x4000 - -/** Some Mailbox registers address, written by host for - control */ -#define PIPES_THRESHOLD_ADDR 0x01000 - -#define PIPES_0_7_IRQ_MASK_ADDR 0x01048 - -#define PIPES_8_15_IRQ_MASK_ADDR 0x0104C - -#define FUNC_1_4_MASK_IRQ_ADDR 0x01040 -#define FUNC_5_7_MASK_IRQ_ADDR 0x01044 -#define FUNC_1_4_USER_IRQ_ADDR 0x01050 -#define FUNC_5_7_USER_IRQ_ADDR 0x01054 - -#define EOT_PIPES_ENABLE 0x00 - -/** Maximum read/write data available is SDIO-Client limitation */ -#define MAX_DATA_AVAILABLE (16*1024) -#define INVALID_DATA_AVAILABLE (0x8000) - -/** SDIO-Client HW threshold to generate interrupt to the - * SDIO-Host on write available bytes. - */ -#define DEFAULT_WRITE_THRESHOLD (1024) - -/** SDIO-Client HW threshold to generate interrupt to the - * SDIO-Host on read available bytes, for streaming (non - * packet) rx data. - */ -#define DEFAULT_READ_THRESHOLD (1024) -#define LOW_LATENCY_THRESHOLD (1) - -/* Extra bytes to ensure getting the rx threshold interrupt on stream channels - when restoring the threshold after sleep */ -#define THRESHOLD_CHANGE_EXTRA_BYTES (100) - -/** SW threshold to trigger reading the mailbox. */ -#define DEFAULT_MIN_WRITE_THRESHOLD (1024) -#define DEFAULT_MIN_WRITE_THRESHOLD_STREAMING (1600) - -#define THRESHOLD_DISABLE_VAL (0xFFFFFFFF) - -/** Mailbox polling time for packet channels */ -#define DEFAULT_POLL_DELAY_MSEC 10 -/** Mailbox polling time for streaming channels */ -#define DEFAULT_POLL_DELAY_NOPACKET_MSEC 30 - -/** The SDIO-Client prepares N buffers of size X per Tx pipe. - * Even when the transfer fills a partial buffer, - * that buffer becomes unusable for the next transfer. */ -#define DEFAULT_PEER_TX_BUF_SIZE (128) - -#define ROUND_UP(x, n) (((x + n - 1) / n) * n) - -/** Func#2..7 FIFOs are r/w via - sdio_readsb() & sdio_writesb(),when inc_addr=0 */ -#define PIPE_RX_FIFO_ADDR 0x00 -#define PIPE_TX_FIFO_ADDR 0x00 - -/** Inactivity time to go to sleep in mseconds */ -#define INACTIVITY_TIME_MSEC 30 -#define INITIAL_INACTIVITY_TIME_MSEC 5000 - -/** Context validity check */ -#define SDIO_AL_SIGNATURE 0xAABBCCDD - -/* Vendor Specific Command */ -#define SD_IO_RW_EXTENDED_QCOM 54 - -#define TIME_TO_WAIT_US 500 -#define SDIO_CLOSE_FLUSH_TIMEOUT_MSEC (10000) -#define RX_FLUSH_BUFFER_SIZE (16*1024) - -#define SDIO_TEST_POSTFIX "_TEST" - -#define DATA_DEBUG(x, y...) \ - do { \ - if (sdio_al->debug.debug_data_on) \ - pr_info(y); \ - sdio_al_log(x, y); \ - } while (0) - -#define LPM_DEBUG(x, y...) \ - do { \ - if (sdio_al->debug.debug_lpm_on) \ - pr_info(y); \ - sdio_al_log(x, y); \ - } while (0) - -#define sdio_al_loge(x, y...) \ - do { \ - pr_err(y); \ - sdio_al_log(x, y); \ - } while (0) - -#define sdio_al_logi(x, y...) \ - do { \ - pr_info(y); \ - sdio_al_log(x, y); \ - } while (0) - -#define CLOSE_DEBUG(x, y...) \ - do { \ - if (sdio_al->debug.debug_close_on) \ - pr_info(y); \ - sdio_al_log(x, y); \ - } while (0) - -/* The index of the SDIO card used for the sdio_al_dloader */ -#define SDIO_BOOTLOADER_CARD_INDEX 1 - - -/* SDIO card state machine */ -enum sdio_al_device_state { - CARD_INSERTED, - CARD_REMOVED, - MODEM_RESTART -}; - -struct sdio_al_debug { - u8 debug_lpm_on; - u8 debug_data_on; - u8 debug_close_on; - struct dentry *sdio_al_debug_root; - struct dentry *sdio_al_debug_lpm_on; - struct dentry *sdio_al_debug_data_on; - struct dentry *sdio_al_debug_close_on; - struct dentry *sdio_al_debug_info; - struct dentry *sdio_al_debug_log_buffers[MAX_NUM_OF_SDIO_DEVICES + 1]; -}; - -/* Polling time for the inactivity timer for devices that doesn't have - * a streaming channel - */ -#define SDIO_AL_POLL_TIME_NO_STREAMING 30 - -#define CHAN_TO_FUNC(x) ((x) + 2 - 1) - -/** - * Mailbox structure. - * The Mailbox is located on the SDIO-Client Function#1. - * The mailbox size is 128 bytes, which is one block. - * The mailbox allows the host ton: - * 1. Get the number of available bytes on the pipes. - * 2. Enable/Disable SDIO-Client interrupt, related to pipes. - * 3. Set the Threshold for generating interrupt. - * - */ -struct sdio_mailbox { - u32 pipe_bytes_threshold[SDIO_AL_MAX_PIPES]; /* Addr 0x1000 */ - - /* Mask USER interrupts generated towards host - Addr 0x1040 */ - u32 mask_irq_func_1:8; /* LSB */ - u32 mask_irq_func_2:8; - u32 mask_irq_func_3:8; - u32 mask_irq_func_4:8; - - u32 mask_irq_func_5:8; - u32 mask_irq_func_6:8; - u32 mask_irq_func_7:8; - u32 mask_mutex_irq:8; - - /* Mask PIPE interrupts generated towards host - Addr 0x1048 */ - u32 mask_eot_pipe_0_7:8; - u32 mask_thresh_above_limit_pipe_0_7:8; - u32 mask_overflow_pipe_0_7:8; - u32 mask_underflow_pipe_0_7:8; - - u32 mask_eot_pipe_8_15:8; - u32 mask_thresh_above_limit_pipe_8_15:8; - u32 mask_overflow_pipe_8_15:8; - u32 mask_underflow_pipe_8_15:8; - - /* Status of User interrupts generated towards host - Addr 0x1050 */ - u32 user_irq_func_1:8; - u32 user_irq_func_2:8; - u32 user_irq_func_3:8; - u32 user_irq_func_4:8; - - u32 user_irq_func_5:8; - u32 user_irq_func_6:8; - u32 user_irq_func_7:8; - u32 user_mutex_irq:8; - - /* Status of PIPE interrupts generated towards host */ - /* Note: All sources are cleared once they read. - Addr 0x1058 */ - u32 eot_pipe_0_7:8; - u32 thresh_above_limit_pipe_0_7:8; - u32 overflow_pipe_0_7:8; - u32 underflow_pipe_0_7:8; - - u32 eot_pipe_8_15:8; - u32 thresh_above_limit_pipe_8_15:8; - u32 overflow_pipe_8_15:8; - u32 underflow_pipe_8_15:8; - - u16 pipe_bytes_avail[SDIO_AL_MAX_PIPES]; -}; - -/** Track pending Rx Packet size */ -struct rx_packet_size { - u32 size; /* in bytes */ - struct list_head list; -}; - -#define PEER_SDIOC_SW_MAILBOX_SIGNATURE 0xFACECAFE -#define PEER_SDIOC_SW_MAILBOX_UT_SIGNATURE 0x5D107E57 -#define PEER_SDIOC_SW_MAILBOX_BOOT_SIGNATURE 0xDEADBEEF - -/* Allow support in old sdio version */ -#define PEER_SDIOC_OLD_VERSION_MAJOR 0x0002 -#define INVALID_SDIO_CHAN 0xFF - -/** - * Peer SDIO-Client software header. - */ -struct peer_sdioc_sw_header { - u32 signature; - u32 version; - u32 max_channels; - char channel_names[SDIO_AL_MAX_CHANNELS][PEER_CHANNEL_NAME_SIZE]; - u32 reserved[23]; -}; - -struct peer_sdioc_boot_sw_header { - u32 signature; - u32 version; - u32 boot_ch_num; - u32 reserved[29]; /* 32 - previous fields */ -}; - -/** - * Peer SDIO-Client software mailbox. - */ -struct peer_sdioc_sw_mailbox { - struct peer_sdioc_sw_header sw_header; - struct peer_sdioc_channel_config ch_config[SDIO_AL_MAX_CHANNELS]; -}; - -#define SDIO_AL_DEBUG_LOG_SIZE 3000 -struct sdio_al_local_log { - char buffer[SDIO_AL_DEBUG_LOG_SIZE]; - unsigned int buf_cur_pos; - spinlock_t log_lock; -}; - -#define SDIO_AL_DEBUG_TMP_LOG_SIZE 250 -static int sdio_al_log(struct sdio_al_local_log *, const char *fmt, ...); - -/** - * SDIO Abstraction Layer driver context. - * - * @pdata - - * @debug - - * @devices - an array of the the devices claimed by sdio_al - * @unittest_mode - a flag to indicate if sdio_al is in - * unittest mode - * @bootloader_dev - the device which is used for the - * bootloader - * @subsys_notif_handle - handle for modem restart - * notifications - * - */ -struct sdio_al { - struct sdio_al_local_log gen_log; - struct sdio_al_local_log device_log[MAX_NUM_OF_SDIO_DEVICES]; - struct sdio_al_platform_data *pdata; - struct sdio_al_debug debug; - struct sdio_al_device *devices[MAX_NUM_OF_SDIO_DEVICES]; - int unittest_mode; - struct sdio_al_device *bootloader_dev; - void *subsys_notif_handle; - int sdioc_major; - int skip_print_info; -}; - -struct sdio_al_work { - struct work_struct work; - struct sdio_al_device *sdio_al_dev; -}; - - -/** - * SDIO Abstraction Layer device context. - * - * @card - card claimed. - * - * @mailbox - A shadow of the SDIO-Client mailbox. - * - * @channel - Channels context. - * - * @workqueue - workqueue to read the mailbox and handle - * pending requests. Reading the mailbox should not happen - * in interrupt context. - * - * @work - work to submit to workqueue. - * - * @is_ready - driver is ready. - * - * @ask_mbox - Flag to request reading the mailbox, - * for different reasons. - * - * @wake_lock - Lock when can't sleep. - * - * @lpm_chan - Channel to use for LPM (low power mode) - * communication. - * - * @is_ok_to_sleep - Mark if driver is OK with going to sleep - * (no pending transactions). - * - * @inactivity_time - time allowed to be in inactivity before - * going to sleep - * - * @timer - timer to use for polling the mailbox. - * - * @poll_delay_msec - timer delay for polling the mailbox. - * - * @is_err - error detected. - * - * @signature - Context Validity Check. - * - * @flashless_boot_on - flag to indicate if sdio_al is in - * flshless boot mode - * - */ -struct sdio_al_device { - struct sdio_al_local_log *dev_log; - struct mmc_card *card; - struct mmc_host *host; - struct sdio_mailbox *mailbox; - struct sdio_channel channel[SDIO_AL_MAX_CHANNELS]; - - struct peer_sdioc_sw_header *sdioc_sw_header; - struct peer_sdioc_boot_sw_header *sdioc_boot_sw_header; - - struct workqueue_struct *workqueue; - struct sdio_al_work sdio_al_work; - struct sdio_al_work boot_work; - - int is_ready; - - wait_queue_head_t wait_mbox; - int ask_mbox; - int bootloader_done; - - struct wake_lock wake_lock; - int lpm_chan; - int is_ok_to_sleep; - unsigned long inactivity_time; - - struct timer_list timer; - u32 poll_delay_msec; - int is_timer_initialized; - - int is_err; - - u32 signature; - - unsigned int is_suspended; - - int flashless_boot_on; - int ch_close_supported; - int state; - int (*lpm_callback)(void *, int); - - int print_after_interrupt; - - u8 *rx_flush_buf; -}; - -/* - * Host operation: - * lower 16bits are operation code - * upper 16bits are operation state - */ -#define PEER_OPERATION(op_code , op_state) ((op_code) | ((op_state) << 16)) -#define GET_PEER_OPERATION_CODE(op) ((op) & 0xffff) -#define GET_PEER_OPERATION_STATE(op) ((op) >> 16) - -enum peer_op_code { - PEER_OP_CODE_CLOSE = 1 -}; - -enum peer_op_state { - PEER_OP_STATE_INIT = 0, - PEER_OP_STATE_START = 1 -}; - - -/* - * On the kernel command line specify - * sdio_al.debug_lpm_on=1 to enable the LPM debug messages - * By default the LPM debug messages are turned off - */ -static int debug_lpm_on; -module_param(debug_lpm_on, int, 0); - -/* - * On the kernel command line specify - * sdio_al.debug_data_on=1 to enable the DATA debug messages - * By default the DATA debug messages are turned off - */ -static int debug_data_on; -module_param(debug_data_on, int, 0); - -/* - * Enables / disables open close debug messages - */ -static int debug_close_on = 1; -module_param(debug_close_on, int, 0); - -/** The driver context */ -static struct sdio_al *sdio_al; - -/* Static functions declaration */ -static int enable_eot_interrupt(struct sdio_al_device *sdio_al_dev, - int pipe_index, int enable); -static int enable_threshold_interrupt(struct sdio_al_device *sdio_al_dev, - int pipe_index, int enable); -static void sdio_func_irq(struct sdio_func *func); -static void sdio_al_timer_handler(unsigned long data); -static int get_min_poll_time_msec(struct sdio_al_device *sdio_al_dev); -static u32 check_pending_rx_packet(struct sdio_channel *ch, u32 eot); -static u32 remove_handled_rx_packet(struct sdio_channel *ch); -static int set_pipe_threshold(struct sdio_al_device *sdio_al_dev, - int pipe_index, int threshold); -static int sdio_al_wake_up(struct sdio_al_device *sdio_al_dev, - u32 not_from_int, struct sdio_channel *ch); -static int sdio_al_client_setup(struct sdio_al_device *sdio_al_dev); -static int enable_mask_irq(struct sdio_al_device *sdio_al_dev, - int func_num, int enable, u8 bit_offset); -static int sdio_al_enable_func_retry(struct sdio_func *func, const char *name); -static void sdio_al_print_info(void); -static int sdio_read_internal(struct sdio_channel *ch, void *data, int len); -static int sdio_read_from_closed_ch(struct sdio_channel *ch, int len); -static void stop_and_del_timer(struct sdio_al_device *sdio_al_dev); - -#define SDIO_AL_ERR(func) \ - do { \ - printk_once(KERN_ERR MODULE_NAME \ - ":In Error state, ignore %s\n", \ - func); \ - sdio_al_print_info(); \ - } while (0) - -#ifdef CONFIG_DEBUG_FS -static int debug_info_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t debug_info_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - sdio_al_print_info(); - return 1; -} - -const struct file_operations debug_info_ops = { - .open = debug_info_open, - .write = debug_info_write, -}; - -struct debugfs_blob_wrapper sdio_al_dbgfs_log[MAX_NUM_OF_SDIO_DEVICES + 1]; - -/* -* -* Trigger on/off for debug messages -* for trigger off the data messages debug level use: -* echo 0 > /sys/kernel/debugfs/sdio_al/debug_data_on -* for trigger on the data messages debug level use: -* echo 1 > /sys/kernel/debugfs/sdio_al/debug_data_on -* for trigger off the lpm messages debug level use: -* echo 0 > /sys/kernel/debugfs/sdio_al/debug_lpm_on -* for trigger on the lpm messages debug level use: -* echo 1 > /sys/kernel/debugfs/sdio_al/debug_lpm_on -*/ -static int sdio_al_debugfs_init(void) -{ - int i, blob_errs = 0; - - sdio_al->debug.sdio_al_debug_root = debugfs_create_dir("sdio_al", NULL); - if (!sdio_al->debug.sdio_al_debug_root) - return -ENOENT; - - sdio_al->debug.sdio_al_debug_lpm_on = debugfs_create_u8("debug_lpm_on", - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - &sdio_al->debug.debug_lpm_on); - - sdio_al->debug.sdio_al_debug_data_on = debugfs_create_u8( - "debug_data_on", - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - &sdio_al->debug.debug_data_on); - - sdio_al->debug.sdio_al_debug_close_on = debugfs_create_u8( - "debug_close_on", - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - &sdio_al->debug.debug_close_on); - - sdio_al->debug.sdio_al_debug_info = debugfs_create_file( - "sdio_debug_info", - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - NULL, - &debug_info_ops); - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; ++i) { - char temp[18]; - - scnprintf(temp, 18, "sdio_al_log_dev_%d", i + 1); - sdio_al->debug.sdio_al_debug_log_buffers[i] = - debugfs_create_blob(temp, - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - &sdio_al_dbgfs_log[i]); - } - - sdio_al->debug.sdio_al_debug_log_buffers[MAX_NUM_OF_SDIO_DEVICES] = - debugfs_create_blob("sdio_al_gen_log", - S_IRUGO | S_IWUGO, - sdio_al->debug.sdio_al_debug_root, - &sdio_al_dbgfs_log[MAX_NUM_OF_SDIO_DEVICES]); - - for (i = 0; i < (MAX_NUM_OF_SDIO_DEVICES + 1); ++i) { - if (!sdio_al->debug.sdio_al_debug_log_buffers[i]) { - pr_err(MODULE_NAME ": Failed to create debugfs buffer" - " entry for " - "sdio_al->debug.sdio_al_debug_log_buffers[%d]", - i); - blob_errs = 1; - } - } - - if (blob_errs) { - for (i = 0; i < (MAX_NUM_OF_SDIO_DEVICES + 1); ++i) - if (sdio_al->debug.sdio_al_debug_log_buffers[i]) - debugfs_remove( - sdio_al-> - debug.sdio_al_debug_log_buffers[i]); - } - - - if ((!sdio_al->debug.sdio_al_debug_data_on) && - (!sdio_al->debug.sdio_al_debug_lpm_on) && - (!sdio_al->debug.sdio_al_debug_close_on) && - (!sdio_al->debug.sdio_al_debug_info) && - blob_errs) { - debugfs_remove(sdio_al->debug.sdio_al_debug_root); - sdio_al->debug.sdio_al_debug_root = NULL; - return -ENOENT; - } - - sdio_al_dbgfs_log[MAX_NUM_OF_SDIO_DEVICES].data = - sdio_al->gen_log.buffer; - sdio_al_dbgfs_log[MAX_NUM_OF_SDIO_DEVICES].size = - SDIO_AL_DEBUG_LOG_SIZE; - - return 0; -} - -static void sdio_al_debugfs_cleanup(void) -{ - int i; - - debugfs_remove(sdio_al->debug.sdio_al_debug_lpm_on); - debugfs_remove(sdio_al->debug.sdio_al_debug_data_on); - debugfs_remove(sdio_al->debug.sdio_al_debug_close_on); - debugfs_remove(sdio_al->debug.sdio_al_debug_info); - - for (i = 0; i < (MAX_NUM_OF_SDIO_DEVICES + 1); ++i) - debugfs_remove(sdio_al->debug.sdio_al_debug_log_buffers[i]); - - debugfs_remove(sdio_al->debug.sdio_al_debug_root); -} -#endif - -static int sdio_al_log(struct sdio_al_local_log *log, const char *fmt, ...) -{ - va_list args; - int r; - char *tp, *log_buf; - unsigned int *log_cur_pos; - struct timeval kt; - unsigned long flags; - static char sdio_al_log_tmp[SDIO_AL_DEBUG_TMP_LOG_SIZE]; - - spin_lock_irqsave(&log->log_lock, flags); - - kt = ktime_to_timeval(ktime_get()); - r = scnprintf(sdio_al_log_tmp, SDIO_AL_DEBUG_TMP_LOG_SIZE, - "[%8ld.%6ld] ", kt.tv_sec, kt.tv_usec); - - va_start(args, fmt); - r += vscnprintf(&sdio_al_log_tmp[r], (SDIO_AL_DEBUG_TMP_LOG_SIZE - r), - fmt, args); - va_end(args); - - log_buf = log->buffer; - log_cur_pos = &(log->buf_cur_pos); - - for (tp = sdio_al_log_tmp; tp < (sdio_al_log_tmp + r); tp++) { - log_buf[(*log_cur_pos)++] = *tp; - if ((*log_cur_pos) == SDIO_AL_DEBUG_LOG_SIZE) - *log_cur_pos = 0; - } - - spin_unlock_irqrestore(&log->log_lock, flags); - - return r; -} - -static int sdio_al_verify_func1(struct sdio_al_device *sdio_al_dev, - char const *func) -{ - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "sdio_al_dev\n", func); - return -ENODEV; - } - - if (sdio_al_dev->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: Invalid " - "signature\n", func); - return -ENODEV; - } - - if (!sdio_al_dev->card) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: NULL " - "card\n", func); - return -ENODEV; - } - if (!sdio_al_dev->card->sdio_func[0]) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: NULL " - "func1\n", func); - return -ENODEV; - } - return 0; -} - -static int sdio_al_claim_mutex(struct sdio_al_device *sdio_al_dev, - char const *func) -{ - if (!sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "device\n", func); - return -ENODEV; - } - - if (sdio_al_dev->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: Invalid " - "device signature\n", func); - return -ENODEV; - } - - if (!sdio_al_dev->host) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: NULL " - "host\n", func); - return -ENODEV; - } - - mmc_claim_host(sdio_al_dev->host); - - return 0; -} - -static int sdio_al_release_mutex(struct sdio_al_device *sdio_al_dev, - char const *func) -{ - if (!sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "device\n", func); - return -ENODEV; - } - - if (sdio_al_dev->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: Invalid " - "device signature\n", func); - return -ENODEV; - } - - if (!sdio_al_dev->host) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: NULL " - "host\n", func); - return -ENODEV; - } - - mmc_release_host(sdio_al_dev->host); - - return 0; -} - -static int sdio_al_claim_mutex_and_verify_dev( - struct sdio_al_device *sdio_al_dev, - char const *func) -{ - if (sdio_al_claim_mutex(sdio_al_dev, __func__)) - return -ENODEV; - - if (sdio_al_dev->state != CARD_INSERTED) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": %s: Invalid " - "device state %d\n", func, sdio_al_dev->state); - sdio_al_release_mutex(sdio_al_dev, __func__); - return -ENODEV; - } - - return 0; -} - -static void sdio_al_get_into_err_state(struct sdio_al_device *sdio_al_dev) -{ - if ((!sdio_al) || (!sdio_al_dev)) - return; - - sdio_al_dev->is_err = true; - sdio_al->debug.debug_data_on = 0; - sdio_al->debug.debug_lpm_on = 0; - sdio_al_print_info(); -} - -void sdio_al_register_lpm_cb(void *device_handle, - int(*lpm_callback)(void *, int)) -{ - struct sdio_al_device *sdio_al_dev = - (struct sdio_al_device *) device_handle; - - if (!sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s - " - "device_handle is NULL\n", __func__); - return; - } - - if (lpm_callback) { - sdio_al_dev->lpm_callback = lpm_callback; - lpm_callback((void *)sdio_al_dev, - sdio_al_dev->is_ok_to_sleep); - } - - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": %s - device %d " - "registered for wakeup callback\n", __func__, - sdio_al_dev->host->index); -} - -void sdio_al_unregister_lpm_cb(void *device_handle) -{ - struct sdio_al_device *sdio_al_dev = - (struct sdio_al_device *) device_handle; - - if (!sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s - " - "device_handle is NULL\n", __func__); - return; - } - - sdio_al_dev->lpm_callback = NULL; - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": %s - device %d " - "unregister for wakeup callback\n", __func__, - sdio_al_dev->host->index); -} - -static void sdio_al_vote_for_sleep(struct sdio_al_device *sdio_al_dev, - int is_vote_for_sleep) -{ - pr_debug(MODULE_NAME ": %s()", __func__); - - if (!sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s - sdio_al_dev" - " is NULL\n", __func__); - return; - } - - if (is_vote_for_sleep) { - pr_debug(MODULE_NAME ": %s - sdio vote for Sleep", __func__); - wake_unlock(&sdio_al_dev->wake_lock); - } else { - pr_debug(MODULE_NAME ": %s - sdio vote against sleep", - __func__); - wake_lock(&sdio_al_dev->wake_lock); - } - - if (sdio_al_dev->lpm_callback != NULL) { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": %s - " - "is_vote_for_sleep=%d for card#%d, " - "calling callback...", __func__, - is_vote_for_sleep, - sdio_al_dev->host->index); - sdio_al_dev->lpm_callback((void *)sdio_al_dev, - is_vote_for_sleep); - } -} - -/** - * Write SDIO-Client lpm information - * Should only be called with host claimed. - */ -static int write_lpm_info(struct sdio_al_device *sdio_al_dev) -{ - struct sdio_func *lpm_func = NULL; - int offset = offsetof(struct peer_sdioc_sw_mailbox, ch_config)+ - sizeof(struct peer_sdioc_channel_config) * - sdio_al_dev->lpm_chan+ - offsetof(struct peer_sdioc_channel_config, is_host_ok_to_sleep); - int ret; - - if (sdio_al_dev->lpm_chan == INVALID_SDIO_CHAN) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Invalid " - "lpm_chan for card %d\n", - sdio_al_dev->host->index); - return -EINVAL; - } - - if (!sdio_al_dev->card || - !sdio_al_dev->card->sdio_func[sdio_al_dev->lpm_chan+1]) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": NULL card or lpm_func\n"); - return -ENODEV; - } - lpm_func = sdio_al_dev->card->sdio_func[sdio_al_dev->lpm_chan+1]; - - pr_debug(MODULE_NAME ":write_lpm_info is_ok_to_sleep=%d, device %d\n", - sdio_al_dev->is_ok_to_sleep, - sdio_al_dev->host->index); - - ret = sdio_memcpy_toio(lpm_func, SDIOC_SW_MAILBOX_ADDR+offset, - &sdio_al_dev->is_ok_to_sleep, sizeof(u32)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":failed to " - "write lpm info for card %d\n", - sdio_al_dev->host->index); - return ret; - } - - return 0; -} - -/* Set inactivity counter to intial value to allow clients come up */ -static inline void start_inactive_time(struct sdio_al_device *sdio_al_dev) -{ - sdio_al_dev->inactivity_time = jiffies + - msecs_to_jiffies(INITIAL_INACTIVITY_TIME_MSEC); -} - -static inline void restart_inactive_time(struct sdio_al_device *sdio_al_dev) -{ - sdio_al_dev->inactivity_time = jiffies + - msecs_to_jiffies(INACTIVITY_TIME_MSEC); -} - -static inline int is_inactive_time_expired(struct sdio_al_device *sdio_al_dev) -{ - return time_after(jiffies, sdio_al_dev->inactivity_time); -} - - -static int is_user_irq_enabled(struct sdio_al_device *sdio_al_dev, - int func_num) -{ - int ret = 0; - struct sdio_func *func1; - u32 user_irq = 0; - u32 addr = 0; - u32 offset = 0; - u32 masked_user_irq = 0; - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return 0; - func1 = sdio_al_dev->card->sdio_func[0]; - - if (func_num < 4) { - addr = FUNC_1_4_USER_IRQ_ADDR; - offset = func_num * 8; - } else { - addr = FUNC_5_7_USER_IRQ_ADDR; - offset = (func_num - 4) * 8; - } - - user_irq = sdio_readl(func1, addr, &ret); - if (ret) { - pr_debug(MODULE_NAME ":read_user_irq fail\n"); - return 0; - } - - masked_user_irq = (user_irq >> offset) && 0xFF; - if (masked_user_irq == 0x1) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":user_irq " - "enabled\n"); - return 1; - } - - return 0; -} - -static void sdio_al_sleep(struct sdio_al_device *sdio_al_dev, - struct mmc_host *host) -{ - int i; - - /* Go to sleep */ - pr_debug(MODULE_NAME ":Inactivity timer expired." - " Going to sleep\n"); - /* Stop mailbox timer */ - stop_and_del_timer(sdio_al_dev); - /* Make sure we get interrupt for non-packet-mode right away */ - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - if ((ch->state != SDIO_CHANNEL_STATE_OPEN) && - (ch->state != SDIO_CHANNEL_STATE_CLOSED)) { - pr_debug(MODULE_NAME ":continue for channel %s in" - " state %d\n", ch->name, ch->state); - continue; - } - if (ch->is_packet_mode == false) { - ch->read_threshold = LOW_LATENCY_THRESHOLD; - set_pipe_threshold(sdio_al_dev, - ch->rx_pipe_index, - ch->read_threshold); - } - } - /* Prevent modem to go to sleep until we get the PROG_DONE on - the dummy CMD52 */ - msmsdcc_set_pwrsave(sdio_al_dev->host, 0); - /* Mark HOST_OK_TOSLEEP */ - sdio_al_dev->is_ok_to_sleep = 1; - write_lpm_info(sdio_al_dev); - - msmsdcc_lpm_enable(host); - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":Finished sleep sequence" - " for card %d. Sleep now.\n", - sdio_al_dev->host->index); - /* Release wakelock */ - sdio_al_vote_for_sleep(sdio_al_dev, 1); -} - - -/** - * Read SDIO-Client Mailbox from Function#1.thresh_pipe - * - * The mailbox contain the bytes available per pipe, - * and the End-Of-Transfer indication per pipe (if available). - * - * WARNING: Each time the Mailbox is read from the client, the - * read_bytes_avail is incremented with another pending - * transfer. Therefore, a pending rx-packet should be added to a - * list before the next read of the mailbox. - * - * This function should run from a workqueue context since it - * notifies the clients. - * - * This function assumes that sdio_al_claim_mutex was called before - * calling it. - * - */ -static int read_mailbox(struct sdio_al_device *sdio_al_dev, int from_isr) -{ - int ret; - struct sdio_func *func1 = NULL; - struct sdio_mailbox *mailbox = sdio_al_dev->mailbox; - struct mmc_host *host = sdio_al_dev->host; - u32 new_write_avail = 0; - u32 old_write_avail = 0; - u32 any_read_avail = 0; - u32 any_write_pending = 0; - int i; - u32 rx_notify_bitmask = 0; - u32 tx_notify_bitmask = 0; - u32 eot_pipe = 0; - u32 thresh_pipe = 0; - u32 overflow_pipe = 0; - u32 underflow_pipe = 0; - u32 thresh_intr_mask = 0; - int is_closing = 0; - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - return 0; - } - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return -ENODEV; - func1 = sdio_al_dev->card->sdio_func[0]; - - pr_debug(MODULE_NAME ":start %s from_isr = %d for card %d.\n" - , __func__, from_isr, sdio_al_dev->host->index); - - pr_debug(MODULE_NAME ":before sdio_memcpy_fromio.\n"); - memset(mailbox, 0, sizeof(struct sdio_mailbox)); - ret = sdio_memcpy_fromio(func1, mailbox, - HW_MAILBOX_ADDR, sizeof(*mailbox)); - pr_debug(MODULE_NAME ":after sdio_memcpy_fromio.\n"); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to read " - "Mailbox for card %d, goto error state\n", - sdio_al_dev->host->index); - sdio_al_get_into_err_state(sdio_al_dev); - goto exit_err; - } - - eot_pipe = (mailbox->eot_pipe_0_7) | - (mailbox->eot_pipe_8_15<<8); - thresh_pipe = (mailbox->thresh_above_limit_pipe_0_7) | - (mailbox->thresh_above_limit_pipe_8_15<<8); - - overflow_pipe = (mailbox->overflow_pipe_0_7) | - (mailbox->overflow_pipe_8_15<<8); - underflow_pipe = mailbox->underflow_pipe_0_7 | - (mailbox->underflow_pipe_8_15<<8); - thresh_intr_mask = - (mailbox->mask_thresh_above_limit_pipe_0_7) | - (mailbox->mask_thresh_above_limit_pipe_8_15<<8); - - if (overflow_pipe || underflow_pipe) - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Mailbox ERROR " - "overflow=0x%x, underflow=0x%x\n", - overflow_pipe, underflow_pipe); - - /* In case of modem reset we would like to read the daya from the modem - to clear the interrupts but do not process it */ - if (sdio_al_dev->state != CARD_INSERTED) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":sdio_al_device" - " (card %d) is in invalid state %d\n", - sdio_al_dev->host->index, - sdio_al_dev->state); - return -ENODEV; - } - - pr_debug(MODULE_NAME ":card %d: eot=0x%x, thresh=0x%x\n", - sdio_al_dev->host->index, - eot_pipe, thresh_pipe); - - /* Scan for Rx Packets available and update read available bytes */ - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - u32 old_read_avail; - u32 read_avail; - u32 new_packet_size = 0; - - if (ch->state == SDIO_CHANNEL_STATE_CLOSING) - is_closing = true; /* used to prevent sleep */ - - old_read_avail = ch->read_avail; - read_avail = mailbox->pipe_bytes_avail[ch->rx_pipe_index]; - - if ((ch->state == SDIO_CHANNEL_STATE_CLOSED) && - (read_avail > 0)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":%s: Invalid read_avail 0x%x, for CLOSED ch %s\n", - __func__, read_avail, ch->name); - sdio_read_from_closed_ch(ch, read_avail); - } - if ((ch->state != SDIO_CHANNEL_STATE_OPEN) && - (ch->state != SDIO_CHANNEL_STATE_CLOSING)) - continue; - - if (read_avail > INVALID_DATA_AVAILABLE) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":Invalid read_avail 0x%x for pipe %d\n", - read_avail, ch->rx_pipe_index); - continue; - } - any_read_avail |= read_avail | old_read_avail; - ch->statistics.last_any_read_avail = any_read_avail; - ch->statistics.last_read_avail = read_avail; - ch->statistics.last_old_read_avail = old_read_avail; - - if (ch->is_packet_mode) { - if ((eot_pipe & (1<rx_pipe_index)) && - sdio_al_dev->print_after_interrupt) { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME - ":Interrupt on ch %s, " - "card %d", ch->name, - sdio_al_dev->host->index); - } - new_packet_size = check_pending_rx_packet(ch, eot_pipe); - } else { - if ((thresh_pipe & (1<rx_pipe_index)) && - sdio_al_dev->print_after_interrupt) { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME - ":Interrupt on ch %s, " - "card %d", ch->name, - sdio_al_dev->host->index); - } - ch->read_avail = read_avail; - - /* - * Restore default thresh for non packet channels. - * in case it IS low latency channel then read_threshold - * and def_read_threshold are both - * LOW_LATENCY_THRESHOLD - */ - if ((ch->read_threshold != ch->def_read_threshold) && - (read_avail >= ch->threshold_change_cnt)) { - if (!ch->is_low_latency_ch) { - ch->read_threshold = - ch->def_read_threshold; - set_pipe_threshold(sdio_al_dev, - ch->rx_pipe_index, - ch->read_threshold); - } - } - } - - if ((ch->is_packet_mode) && (new_packet_size > 0)) { - rx_notify_bitmask |= (1<num); - ch->statistics.total_notifs++; - } - - if ((!ch->is_packet_mode) && (ch->read_avail > 0) && - (old_read_avail == 0)) { - rx_notify_bitmask |= (1<num); - ch->statistics.total_notifs++; - } - } - sdio_al_dev->print_after_interrupt = 0; - - /* Update Write available */ - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - - if ((ch->state != SDIO_CHANNEL_STATE_OPEN) && - (ch->state != SDIO_CHANNEL_STATE_CLOSING)) - continue; - - new_write_avail = mailbox->pipe_bytes_avail[ch->tx_pipe_index]; - - if (new_write_avail > INVALID_DATA_AVAILABLE) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":Invalid write_avail 0x%x for pipe %d\n", - new_write_avail, ch->tx_pipe_index); - continue; - } - - old_write_avail = ch->write_avail; - ch->write_avail = new_write_avail; - - if ((old_write_avail <= ch->min_write_avail) && - (new_write_avail >= ch->min_write_avail)) - tx_notify_bitmask |= (1<num); - - /* There is not enough write avail for this channel. - We need to keep reading mailbox to wait for the appropriate - write avail and cannot sleep. Ignore SMEM channel that has - only one direction. */ - if (strncmp(ch->name, "SDIO_SMEM", CHANNEL_NAME_SIZE)) - any_write_pending |= - (new_write_avail < ch->ch_config.max_tx_threshold); - } - /* notify clients */ - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - - if ((ch->state != SDIO_CHANNEL_STATE_OPEN) || - (ch->notify == NULL)) - continue; - - if (rx_notify_bitmask & (1<num)) - ch->notify(ch->priv, - SDIO_EVENT_DATA_READ_AVAIL); - - if (tx_notify_bitmask & (1<num)) - ch->notify(ch->priv, - SDIO_EVENT_DATA_WRITE_AVAIL); - } - - - if ((rx_notify_bitmask == 0) && (tx_notify_bitmask == 0) && - !any_read_avail && !any_write_pending) { - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":Nothing to " - "Notify for card %d, is_closing=%d\n", - sdio_al_dev->host->index, is_closing); - if (is_closing) - restart_inactive_time(sdio_al_dev); - else if (is_inactive_time_expired(sdio_al_dev)) - sdio_al_sleep(sdio_al_dev, host); - } else { - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":Notify bitmask" - " for card %d rx=0x%x, tx=0x%x.\n", - sdio_al_dev->host->index, - rx_notify_bitmask, tx_notify_bitmask); - /* Restart inactivity timer if any activity on the channel */ - restart_inactive_time(sdio_al_dev); - } - - pr_debug(MODULE_NAME ":end %s.\n", __func__); - -exit_err: - return ret; -} - -/** - * Check pending rx packet when reading the mailbox. - */ -static u32 check_pending_rx_packet(struct sdio_channel *ch, u32 eot) -{ - u32 rx_pending; - u32 rx_avail; - u32 new_packet_size = 0; - struct sdio_al_device *sdio_al_dev = ch->sdio_al_dev; - - - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": NULL sdio_al_dev" - " for channel %s\n", ch->name); - return -EINVAL; - } - - mutex_lock(&ch->ch_lock); - - rx_pending = ch->rx_pending_bytes; - rx_avail = sdio_al_dev->mailbox->pipe_bytes_avail[ch->rx_pipe_index]; - - pr_debug(MODULE_NAME ":pipe %d of card %d rx_avail=0x%x, " - "rx_pending=0x%x\n", - ch->rx_pipe_index, sdio_al_dev->host->index, rx_avail, - rx_pending); - - - /* new packet detected */ - if (eot & (1<rx_pipe_index)) { - struct rx_packet_size *p = NULL; - new_packet_size = rx_avail - rx_pending; - - if ((rx_avail <= rx_pending)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": Invalid new packet size." - " rx_avail=%d.\n", rx_avail); - new_packet_size = 0; - goto exit_err; - } - - p = kzalloc(sizeof(*p), GFP_KERNEL); - if (p == NULL) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": failed to allocate item for " - "rx_pending list. rx_avail=%d, " - "rx_pending=%d.\n", - rx_avail, rx_pending); - new_packet_size = 0; - goto exit_err; - } - p->size = new_packet_size; - /* Add new packet as last */ - list_add_tail(&p->list, &ch->rx_size_list_head); - ch->rx_pending_bytes += new_packet_size; - - if (ch->read_avail == 0) - ch->read_avail = new_packet_size; - } - -exit_err: - mutex_unlock(&ch->ch_lock); - - return new_packet_size; -} - - - -/** - * Remove first pending packet from the list. - */ -static u32 remove_handled_rx_packet(struct sdio_channel *ch) -{ - struct rx_packet_size *p = NULL; - - mutex_lock(&ch->ch_lock); - - ch->rx_pending_bytes -= ch->read_avail; - - if (!list_empty(&ch->rx_size_list_head)) { - p = list_first_entry(&ch->rx_size_list_head, - struct rx_packet_size, list); - list_del(&p->list); - kfree(p); - } else { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME ":%s: ch " - "%s: unexpected empty list!!\n", - __func__, ch->name); - } - - if (list_empty(&ch->rx_size_list_head)) { - ch->read_avail = 0; - } else { - p = list_first_entry(&ch->rx_size_list_head, - struct rx_packet_size, list); - ch->read_avail = p->size; - } - - mutex_unlock(&ch->ch_lock); - - return ch->read_avail; -} - - -/** - * Bootloader worker function. - * - * @note: clear the bootloader_done flag only after reading the - * mailbox, to ignore more requests while reading the mailbox. - */ -static void boot_worker(struct work_struct *work) -{ - int ret = 0; - int func_num = 0; - int i; - struct sdio_al_device *sdio_al_dev = NULL; - struct sdio_al_work *sdio_al_work = container_of(work, - struct sdio_al_work, - work); - - if (sdio_al_work == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "sdio_al_work\n", __func__); - return; - } - - sdio_al_dev = sdio_al_work->sdio_al_dev; - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "sdio_al_dev\n", __func__); - return; - } - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":Bootloader Worker Started" - ", wait for bootloader_done event..\n"); - wait_event(sdio_al_dev->wait_mbox, - sdio_al_dev->bootloader_done); - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":Got bootloader_done " - "event..\n"); - /* Do polling until MDM is up */ - for (i = 0; i < 5000; ++i) { - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return; - if (is_user_irq_enabled(sdio_al_dev, func_num)) { - sdio_al_release_mutex(sdio_al_dev, __func__); - sdio_al_dev->bootloader_done = 0; - ret = sdio_al_client_setup(sdio_al_dev); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": sdio_al_client_setup failed, " - "for card %d ret=%d\n", - sdio_al_dev->host->index, ret); - sdio_al_get_into_err_state(sdio_al_dev); - } - goto done; - } - sdio_al_release_mutex(sdio_al_dev, __func__); - msleep(100); - } - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Timeout waiting for " - "user_irq for card %d\n", - sdio_al_dev->host->index); - sdio_al_get_into_err_state(sdio_al_dev); - -done: - pr_debug(MODULE_NAME ":Boot Worker for card %d Exit!\n", - sdio_al_dev->host->index); -} - -/** - * Worker function. - * - * @note: clear the ask_mbox flag only after - * reading the mailbox, to ignore more requests while - * reading the mailbox. - */ -static void worker(struct work_struct *work) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = NULL; - struct sdio_al_work *sdio_al_work = container_of(work, - struct sdio_al_work, - work); - if (sdio_al_work == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": worker: NULL " - "sdio_al_work\n"); - return; - } - - sdio_al_dev = sdio_al_work->sdio_al_dev; - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": worker: NULL " - "sdio_al_dev\n"); - return; - } - pr_debug(MODULE_NAME ":Worker Started..\n"); - while ((sdio_al_dev->is_ready) && (ret == 0)) { - pr_debug(MODULE_NAME ":Wait for read mailbox request..\n"); - wait_event(sdio_al_dev->wait_mbox, sdio_al_dev->ask_mbox); - if (!sdio_al_dev->is_ready) - break; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - break; - if (sdio_al_dev->is_ok_to_sleep) { - ret = sdio_al_wake_up(sdio_al_dev, 1, NULL); - if (ret) { - sdio_al_release_mutex(sdio_al_dev, __func__); - return; - } - } - ret = read_mailbox(sdio_al_dev, false); - sdio_al_release_mutex(sdio_al_dev, __func__); - sdio_al_dev->ask_mbox = false; - } - - pr_debug(MODULE_NAME ":Worker Exit!\n"); -} - -/** - * Write command using CMD54 rather than CMD53. - * Writing with CMD54 generate EOT interrupt at the - * SDIO-Client. - * Based on mmc_io_rw_extended() - */ -static int sdio_write_cmd54(struct mmc_card *card, unsigned fn, - unsigned addr, const u8 *buf, - unsigned blocks, unsigned blksz) -{ - struct mmc_request mrq; - struct mmc_command cmd; - struct mmc_data data; - struct scatterlist sg; - int incr_addr = 1; /* MUST */ - int write = 1; - - BUG_ON(!card); - BUG_ON(fn > 7); - BUG_ON(blocks == 1 && blksz > 512); - WARN_ON(blocks == 0); - WARN_ON(blksz == 0); - - write = true; - pr_debug(MODULE_NAME ":sdio_write_cmd54()" - "fn=%d,buf=0x%x,blocks=%d,blksz=%d\n", - fn, (u32) buf, blocks, blksz); - - memset(&mrq, 0, sizeof(struct mmc_request)); - memset(&cmd, 0, sizeof(struct mmc_command)); - memset(&data, 0, sizeof(struct mmc_data)); - - mrq.cmd = &cmd; - mrq.data = &data; - - cmd.opcode = SD_IO_RW_EXTENDED_QCOM; - - cmd.arg = write ? 0x80000000 : 0x00000000; - cmd.arg |= fn << 28; - cmd.arg |= incr_addr ? 0x04000000 : 0x00000000; - cmd.arg |= addr << 9; - if (blocks == 1 && blksz <= 512) - cmd.arg |= (blksz == 512) ? 0 : blksz; /* byte mode */ - else - cmd.arg |= 0x08000000 | blocks; /* block mode */ - cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC; - - data.blksz = blksz; - data.blocks = blocks; - data.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ; - data.sg = &sg; - data.sg_len = 1; - - sg_init_one(&sg, buf, blksz * blocks); - - mmc_set_data_timeout(&data, card); - - mmc_wait_for_req(card->host, &mrq); - - if (cmd.error) - return cmd.error; - if (data.error) - return data.error; - - if (mmc_host_is_spi(card->host)) { - /* host driver already reported errors */ - } else { - if (cmd.resp[0] & R5_ERROR) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME - ":%s: R5_ERROR for card %d", - __func__, card->host->index); - return -EIO; - } - if (cmd.resp[0] & R5_FUNCTION_NUMBER) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME - ":%s: R5_FUNCTION_NUMBER for card %d", - __func__, card->host->index); - return -EINVAL; - } - if (cmd.resp[0] & R5_OUT_OF_RANGE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME - ":%s: R5_OUT_OF_RANGE for card %d", - __func__, card->host->index); - return -ERANGE; - } - } - - return 0; -} - - -/** - * Write data to channel. - * Handle different data size types. - * - */ -static int sdio_ch_write(struct sdio_channel *ch, const u8 *buf, u32 len) -{ - int ret = 0; - unsigned blksz = ch->func->cur_blksize; - int blocks = len / blksz; - int remain_bytes = len % blksz; - struct mmc_card *card = NULL; - u32 fn = ch->func->num; - - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "channel\n", __func__); - return -ENODEV; - } - - if (!ch->sdio_al_dev) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "sdio_al_dev\n", __func__); - return -ENODEV; - } - - if (len == 0) { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME ":channel " - "%s trying to write 0 bytes\n", ch->name); - return -EINVAL; - } - - card = ch->func->card; - - if (remain_bytes) { - /* CMD53 */ - if (blocks) { - ret = sdio_memcpy_toio(ch->func, PIPE_TX_FIFO_ADDR, - (void *) buf, blocks*blksz); - if (ret != 0) { - sdio_al_loge(ch->sdio_al_dev->dev_log, - MODULE_NAME ":%s: sdio_memcpy_toio " - "failed for channel %s\n", - __func__, ch->name); - sdio_al_get_into_err_state(ch->sdio_al_dev); - return ret; - } - } - - buf += (blocks*blksz); - - ret = sdio_write_cmd54(card, fn, PIPE_TX_FIFO_ADDR, - buf, 1, remain_bytes); - } else { - ret = sdio_write_cmd54(card, fn, PIPE_TX_FIFO_ADDR, - buf, blocks, blksz); - } - - if (ret != 0) { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME ":%s: " - "sdio_write_cmd54 failed for channel %s\n", - __func__, ch->name); - ch->sdio_al_dev->is_err = true; - return ret; - } - - return ret; -} - -static int sdio_al_bootloader_completed(void) -{ - int i; - - pr_debug(MODULE_NAME ":sdio_al_bootloader_completed was called\n"); - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; ++i) { - struct sdio_al_device *dev = NULL; - if (sdio_al->devices[i] == NULL) - continue; - dev = sdio_al->devices[i]; - dev->bootloader_done = 1; - wake_up(&dev->wait_mbox); - } - - return 0; -} - -static int sdio_al_wait_for_bootloader_comp(struct sdio_al_device *sdio_al_dev) -{ - int ret = 0; - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - /* - * Enable function 0 interrupt mask to allow 9k to raise this interrupt - * in power-up. When sdio_downloader will notify its completion - * we will poll on this interrupt to wait for 9k power-up - */ - ret = enable_mask_irq(sdio_al_dev, 0, 1, 0); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": Enable_mask_irq for card %d failed, " - "ret=%d\n", - sdio_al_dev->host->index, ret); - sdio_al_release_mutex(sdio_al_dev, __func__); - return ret; - } - - sdio_al_release_mutex(sdio_al_dev, __func__); - - /* - * Start bootloader worker that will wait for the bootloader - * completion - */ - sdio_al_dev->boot_work.sdio_al_dev = sdio_al_dev; - INIT_WORK(&sdio_al_dev->boot_work.work, boot_worker); - sdio_al_dev->bootloader_done = 0; - queue_work(sdio_al_dev->workqueue, &sdio_al_dev->boot_work.work); - - return 0; -} - -static int sdio_al_bootloader_setup(void) -{ - int ret = 0; - struct sdio_al_device *bootloader_dev = sdio_al->bootloader_dev; - struct sdio_func *func1 = NULL; - - if (sdio_al_claim_mutex_and_verify_dev(bootloader_dev, __func__)) - return -ENODEV; - - if (bootloader_dev->flashless_boot_on) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME ":Already " - "in boot process.\n"); - sdio_al_release_mutex(bootloader_dev, __func__); - return 0; - } - - bootloader_dev->sdioc_boot_sw_header - = kzalloc(sizeof(*bootloader_dev->sdioc_boot_sw_header), - GFP_KERNEL); - if (bootloader_dev->sdioc_boot_sw_header == NULL) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME ":fail to " - "allocate sdioc boot sw header.\n"); - sdio_al_release_mutex(bootloader_dev, __func__); - return -ENOMEM; - } - - if (sdio_al_verify_func1(bootloader_dev, __func__)) { - sdio_al_release_mutex(bootloader_dev, __func__); - goto exit_err; - } - func1 = bootloader_dev->card->sdio_func[0]; - - ret = sdio_memcpy_fromio(func1, - bootloader_dev->sdioc_boot_sw_header, - SDIOC_SW_HEADER_ADDR, - sizeof(struct peer_sdioc_boot_sw_header)); - if (ret) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME ":fail to " - "read sdioc boot sw header.\n"); - sdio_al_release_mutex(bootloader_dev, __func__); - goto exit_err; - } - - if (bootloader_dev->sdioc_boot_sw_header->signature != - (u32) PEER_SDIOC_SW_MAILBOX_BOOT_SIGNATURE) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME ":invalid " - "mailbox signature 0x%x.\n", - bootloader_dev->sdioc_boot_sw_header->signature); - sdio_al_release_mutex(bootloader_dev, __func__); - ret = -EINVAL; - goto exit_err; - } - - /* Upper byte has to be equal - no backward compatibility for unequal */ - if ((bootloader_dev->sdioc_boot_sw_header->version >> 16) != - (sdio_al->pdata->peer_sdioc_boot_version_major)) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME ": HOST(0x%x)" - " and CLIENT(0x%x) SDIO_AL BOOT VERSION don't match\n", - ((sdio_al->pdata->peer_sdioc_boot_version_major<<16)+ - sdio_al->pdata->peer_sdioc_boot_version_minor), - bootloader_dev->sdioc_boot_sw_header->version); - sdio_al_release_mutex(bootloader_dev, __func__); - ret = -EIO; - goto exit_err; - } - - sdio_al_logi(bootloader_dev->dev_log, MODULE_NAME ": SDIOC BOOT SW " - "version 0x%x\n", - bootloader_dev->sdioc_boot_sw_header->version); - - bootloader_dev->flashless_boot_on = true; - - sdio_al_release_mutex(bootloader_dev, __func__); - - ret = sdio_al_wait_for_bootloader_comp(bootloader_dev); - if (ret) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME - ": sdio_al_wait_for_bootloader_comp failed, " - "err=%d\n", ret); - goto exit_err; - } - - ret = sdio_downloader_setup(bootloader_dev->card, 1, - bootloader_dev->sdioc_boot_sw_header->boot_ch_num, - sdio_al_bootloader_completed); - - if (ret) { - sdio_al_loge(bootloader_dev->dev_log, MODULE_NAME - ": sdio_downloader_setup failed, err=%d\n", ret); - goto exit_err; - } - - sdio_al_logi(bootloader_dev->dev_log, MODULE_NAME ":In Flashless boot," - " waiting for its completion\n"); - - -exit_err: - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":free " - "sdioc_boot_sw_header.\n"); - kfree(bootloader_dev->sdioc_boot_sw_header); - bootloader_dev->sdioc_boot_sw_header = NULL; - bootloader_dev = NULL; - - return ret; -} - - -/** - * Read SDIO-Client software header - * - */ -static int read_sdioc_software_header(struct sdio_al_device *sdio_al_dev, - struct peer_sdioc_sw_header *header) -{ - int ret; - int i; - int test_version = 0; - int sdioc_test_version = 0; - struct sdio_func *func1 = NULL; - - pr_debug(MODULE_NAME ":reading sdioc sw header.\n"); - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return -ENODEV; - - func1 = sdio_al_dev->card->sdio_func[0]; - - ret = sdio_memcpy_fromio(func1, header, - SDIOC_SW_HEADER_ADDR, sizeof(*header)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":fail to read " - "sdioc sw header.\n"); - goto exit_err; - } - - if (header->signature == (u32)PEER_SDIOC_SW_MAILBOX_UT_SIGNATURE) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":SDIOC SW " - "unittest signature. 0x%x\n", - header->signature); - sdio_al->unittest_mode = true; - /* Verify test code compatibility with the modem */ - sdioc_test_version = (header->version & 0xFF00) >> 8; - test_version = sdio_al->pdata->peer_sdioc_version_minor >> 8; - if (test_version != sdioc_test_version) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": HOST(0x%x) and CLIENT(0x%x) " - "testing VERSION don't match\n", - test_version, - sdioc_test_version); - msleep(500); - BUG(); - } - } - - if ((header->signature != (u32) PEER_SDIOC_SW_MAILBOX_SIGNATURE) && - (header->signature != (u32) PEER_SDIOC_SW_MAILBOX_UT_SIGNATURE)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":SDIOC SW " - "invalid signature. 0x%x\n", header->signature); - goto exit_err; - } - /* Upper byte has to be equal - no backward compatibility for unequal */ - sdio_al->sdioc_major = header->version >> 16; - if (sdio_al->pdata->allow_sdioc_version_major_2) { - if ((sdio_al->sdioc_major != - sdio_al->pdata->peer_sdioc_version_major) && - (sdio_al->sdioc_major != PEER_SDIOC_OLD_VERSION_MAJOR)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": HOST(0x%x) and CLIENT(0x%x) " - "SDIO_AL VERSION don't match\n", - ((sdio_al->pdata->peer_sdioc_version_major<<16)+ - sdio_al->pdata->peer_sdioc_version_minor), - header->version); - goto exit_err; - } - } else { - if (sdio_al->sdioc_major != - sdio_al->pdata->peer_sdioc_version_major) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": HOST(0x%x) and CLIENT(0x%x) " - "SDIO_AL VERSION don't match\n", - ((sdio_al->pdata->peer_sdioc_version_major<<16)+ - sdio_al->pdata->peer_sdioc_version_minor), - header->version); - goto exit_err; - } - } - sdio_al_dev->ch_close_supported = (header->version & 0x000F) >= - (sdio_al->pdata->peer_sdioc_version_minor & 0xF); - - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":SDIOC SW version 0x%x," - " sdio_al major 0x%x minor 0x%x\n", header->version, - sdio_al->sdioc_major, - sdio_al->pdata->peer_sdioc_version_minor); - - sdio_al_dev->flashless_boot_on = false; - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - - /* Set default values */ - ch->read_threshold = DEFAULT_READ_THRESHOLD; - ch->write_threshold = DEFAULT_WRITE_THRESHOLD; - ch->min_write_avail = DEFAULT_MIN_WRITE_THRESHOLD; - ch->is_packet_mode = true; - ch->peer_tx_buf_size = DEFAULT_PEER_TX_BUF_SIZE; - ch->poll_delay_msec = 0; - - ch->num = i; - ch->func = NULL; - ch->rx_pipe_index = ch->num*2; - ch->tx_pipe_index = ch->num*2+1; - - memset(ch->name, 0, sizeof(ch->name)); - - if (header->channel_names[i][0]) { - memcpy(ch->name, SDIO_PREFIX, - strlen(SDIO_PREFIX)); - memcpy(ch->name + strlen(SDIO_PREFIX), - header->channel_names[i], - PEER_CHANNEL_NAME_SIZE); - - ch->state = SDIO_CHANNEL_STATE_IDLE; - ch->sdio_al_dev = sdio_al_dev; - if (sdio_al_dev->card->sdio_func[ch->num+1]) { - ch->func = - sdio_al_dev->card->sdio_func[ch->num+1]; - } else { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": NULL func for channel %s\n", - ch->name); - goto exit_err; - } - } else { - ch->state = SDIO_CHANNEL_STATE_INVALID; - } - - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":Channel=%s, " - "state=%d\n", ch->name, ch->state); - } - - return 0; - -exit_err: - sdio_al_get_into_err_state(sdio_al_dev); - memset(header, 0, sizeof(*header)); - - return -EIO; -} - -/** - * Read SDIO-Client channel configuration - * - */ -static int read_sdioc_channel_config(struct sdio_channel *ch) -{ - int ret; - struct peer_sdioc_sw_mailbox *sw_mailbox = NULL; - struct peer_sdioc_channel_config *ch_config = NULL; - struct sdio_al_device *sdio_al_dev = ch->sdio_al_dev; - - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": NULL sdio_al_dev" - " for channel %s\n", ch->name); - return -EINVAL; - } - - if (sdio_al_dev->sdioc_sw_header->version == 0) - return -1; - - pr_debug(MODULE_NAME ":reading sw mailbox %s channel.\n", ch->name); - - sw_mailbox = kzalloc(sizeof(*sw_mailbox), GFP_KERNEL); - if (sw_mailbox == NULL) - return -ENOMEM; - - ret = sdio_memcpy_fromio(ch->func, sw_mailbox, - SDIOC_SW_MAILBOX_ADDR, sizeof(*sw_mailbox)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":fail to read " - "sw mailbox.\n"); - goto exit_err; - } - - ch_config = &sw_mailbox->ch_config[ch->num]; - memcpy(&ch->ch_config, ch_config, - sizeof(struct peer_sdioc_channel_config)); - - if (!ch_config->is_ready) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":sw mailbox " - "channel not ready.\n"); - goto exit_err; - } - - ch->read_threshold = LOW_LATENCY_THRESHOLD; - ch->is_low_latency_ch = ch_config->is_low_latency_ch; - /* Threshold on 50% of the maximum size , sdioc uses double-buffer */ - ch->write_threshold = (ch_config->max_tx_threshold * 5) / 10; - ch->threshold_change_cnt = ch->ch_config.max_rx_threshold - - ch->read_threshold + THRESHOLD_CHANGE_EXTRA_BYTES; - - if (ch->is_low_latency_ch) - ch->def_read_threshold = LOW_LATENCY_THRESHOLD; - else /* Aggregation up to 90% of the maximum size */ - ch->def_read_threshold = (ch_config->max_rx_threshold * 9) / 10; - - ch->is_packet_mode = ch_config->is_packet_mode; - if (!ch->is_packet_mode) { - ch->poll_delay_msec = DEFAULT_POLL_DELAY_NOPACKET_MSEC; - ch->min_write_avail = DEFAULT_MIN_WRITE_THRESHOLD_STREAMING; - } - /* The max_packet_size is set by the modem in version 3 and on */ - if (sdio_al->sdioc_major > PEER_SDIOC_OLD_VERSION_MAJOR) - ch->min_write_avail = ch_config->max_packet_size; - - if (ch->min_write_avail > ch->write_threshold) - ch->min_write_avail = ch->write_threshold; - - CLOSE_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":ch %s " - "read_threshold=%d, write_threshold=%d," - " min_write_avail=%d, max_rx_threshold=%d," - " max_tx_threshold=%d\n", ch->name, ch->read_threshold, - ch->write_threshold, ch->min_write_avail, - ch_config->max_rx_threshold, - ch_config->max_tx_threshold); - - ch->peer_tx_buf_size = ch_config->tx_buf_size; - - kfree(sw_mailbox); - - return 0; - -exit_err: - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":Reading SW Mailbox " - "error.\n"); - kfree(sw_mailbox); - - return -1; -} - - -/** - * Enable/Disable EOT interrupt of a pipe. - * - */ -static int enable_eot_interrupt(struct sdio_al_device *sdio_al_dev, - int pipe_index, int enable) -{ - int ret = 0; - struct sdio_func *func1; - u32 mask; - u32 pipe_mask; - u32 addr; - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return -ENODEV; - func1 = sdio_al_dev->card->sdio_func[0]; - - if (pipe_index < 8) { - addr = PIPES_0_7_IRQ_MASK_ADDR; - pipe_mask = (1<card->sdio_func[0]; - - if (func_num < 4) { - addr = FUNC_1_4_MASK_IRQ_ADDR; - offset = func_num * 8 + bit_offset; - } else { - addr = FUNC_5_7_MASK_IRQ_ADDR; - offset = (func_num - 4) * 8 + bit_offset; - } - - func_mask = 1<dev_log, MODULE_NAME ": " - "enable_mask_irq fail\n"); - goto exit_err; - } - - if (enable) - mask &= (~func_mask); /* 0 = enable */ - else - mask |= (func_mask); /* 1 = disable */ - - pr_debug(MODULE_NAME ":enable_mask_irq, writing mask = 0x%x\n", mask); - - sdio_writel(func1, mask, addr, &ret); - -exit_err: - return ret; -} - -/** - * Enable/Disable Threshold interrupt of a pipe. - * - */ -static int enable_threshold_interrupt(struct sdio_al_device *sdio_al_dev, - int pipe_index, int enable) -{ - int ret = 0; - struct sdio_func *func1; - u32 mask; - u32 pipe_mask; - u32 addr; - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return -ENODEV; - func1 = sdio_al_dev->card->sdio_func[0]; - - if (pipe_index < 8) { - addr = PIPES_0_7_IRQ_MASK_ADDR; - pipe_mask = (1<card->sdio_func[0]; - - sdio_writel(func1, threshold, - PIPES_THRESHOLD_ADDR+pipe_index*4, &ret); - if (ret) - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": " - "set_pipe_threshold err=%d\n", -ret); - - return ret; -} - -/** - * Enable func w/ retries - * - */ -static int sdio_al_enable_func_retry(struct sdio_func *func, const char *name) -{ - int ret, i; - for (i = 0; i < 200; i++) { - ret = sdio_enable_func(func); - if (ret) { - pr_debug(MODULE_NAME ":retry enable %s func#%d " - "ret=%d\n", - name, func->num, ret); - msleep(10); - } else - break; - } - - return ret; -} - -/** - * Open Channel - * - * 1. Init Channel Context. - * 2. Init the Channel SDIO-Function. - * 3. Init the Channel Pipes on Mailbox. - */ -static int open_channel(struct sdio_channel *ch) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = ch->sdio_al_dev; - - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": NULL " - "sdio_al_dev for channel %s\n", ch->name); - return -EINVAL; - } - - /* Init channel Context */ - /** Func#1 is reserved for mailbox */ - ch->func = sdio_al_dev->card->sdio_func[ch->num+1]; - ch->rx_pipe_index = ch->num*2; - ch->tx_pipe_index = ch->num*2+1; - ch->signature = SDIO_AL_SIGNATURE; - - ch->total_rx_bytes = 0; - ch->total_tx_bytes = 0; - - ch->write_avail = 0; - ch->read_avail = 0; - ch->rx_pending_bytes = 0; - - mutex_init(&ch->ch_lock); - - pr_debug(MODULE_NAME ":open_channel %s func#%d\n", - ch->name, ch->func->num); - - INIT_LIST_HEAD(&(ch->rx_size_list_head)); - - /* Init SDIO Function */ - ret = sdio_al_enable_func_retry(ch->func, ch->name); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": " - "sdio_enable_func() err=%d\n", -ret); - goto exit_err; - } - - /* Note: Patch Func CIS tuple issue */ - ret = sdio_set_block_size(ch->func, SDIO_AL_BLOCK_SIZE); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": " - "sdio_set_block_size()failed, err=%d\n", -ret); - goto exit_err; - } - - ch->func->max_blksize = SDIO_AL_BLOCK_SIZE; - - sdio_set_drvdata(ch->func, ch); - - /* Get channel parameters from the peer SDIO-Client */ - read_sdioc_channel_config(ch); - - /* Set Pipes Threshold on Mailbox */ - ret = set_pipe_threshold(sdio_al_dev, - ch->rx_pipe_index, ch->read_threshold); - if (ret) - goto exit_err; - ret = set_pipe_threshold(sdio_al_dev, - ch->tx_pipe_index, ch->write_threshold); - if (ret) - goto exit_err; - - /* Set flag before interrupts are enabled to allow notify */ - ch->state = SDIO_CHANNEL_STATE_OPEN; - pr_debug(MODULE_NAME ":channel %s is in OPEN state now\n", ch->name); - - sdio_al_dev->poll_delay_msec = get_min_poll_time_msec(sdio_al_dev); - - /* lpm mechanism lives under the assumption there is always a timer */ - /* Check if need to start the timer */ - if ((sdio_al_dev->poll_delay_msec) && - (sdio_al_dev->is_timer_initialized == false)) { - - init_timer(&sdio_al_dev->timer); - sdio_al_dev->timer.data = (unsigned long) sdio_al_dev; - sdio_al_dev->timer.function = sdio_al_timer_handler; - sdio_al_dev->timer.expires = jiffies + - msecs_to_jiffies(sdio_al_dev->poll_delay_msec); - add_timer(&sdio_al_dev->timer); - sdio_al_dev->is_timer_initialized = true; - } - - /* Enable Pipes Interrupts */ - enable_eot_interrupt(sdio_al_dev, ch->rx_pipe_index, true); - enable_eot_interrupt(sdio_al_dev, ch->tx_pipe_index, true); - - enable_threshold_interrupt(sdio_al_dev, ch->rx_pipe_index, true); - enable_threshold_interrupt(sdio_al_dev, ch->tx_pipe_index, true); - -exit_err: - - return ret; -} - -/** - * Ask the worker to read the mailbox. - */ -static void ask_reading_mailbox(struct sdio_al_device *sdio_al_dev) -{ - if (!sdio_al_dev->ask_mbox) { - pr_debug(MODULE_NAME ":ask_reading_mailbox for card %d\n", - sdio_al_dev->host->index); - sdio_al_dev->ask_mbox = true; - wake_up(&sdio_al_dev->wait_mbox); - } -} - -/** - * Start the timer - */ -static void start_timer(struct sdio_al_device *sdio_al_dev) -{ - if ((sdio_al_dev->poll_delay_msec) && - (sdio_al_dev->state == CARD_INSERTED)) { - sdio_al_dev->timer.expires = jiffies + - msecs_to_jiffies(sdio_al_dev->poll_delay_msec); - add_timer(&sdio_al_dev->timer); - } -} - -/** - * Restart(postpone) the already working timer - */ -static void restart_timer(struct sdio_al_device *sdio_al_dev) -{ - if ((sdio_al_dev->poll_delay_msec) && - (sdio_al_dev->state == CARD_INSERTED)) { - ulong expires = jiffies + - msecs_to_jiffies(sdio_al_dev->poll_delay_msec); - mod_timer(&sdio_al_dev->timer, expires); - } -} - -/** - * Stop and delete the timer - */ -static void stop_and_del_timer(struct sdio_al_device *sdio_al_dev) -{ - if (sdio_al_dev->is_timer_initialized) { - sdio_al_dev->poll_delay_msec = 0; - del_timer_sync(&sdio_al_dev->timer); - } -} - -/** - * Do the wakup sequence. - * This function should be called after claiming the host! - * The caller is responsible for releasing the host. - * - * Wake up sequence - * 1. Get lock - * 2. Enable wake up function if needed - * 3. Mark NOT OK to sleep and write it - * 4. Restore default thresholds - * 5. Start the mailbox and inactivity timer again - */ -static int sdio_al_wake_up(struct sdio_al_device *sdio_al_dev, - u32 not_from_int, struct sdio_channel *ch) -{ - int ret = 0; - struct sdio_func *wk_func = NULL; - unsigned long time_to_wait; - struct mmc_host *host = sdio_al_dev->host; - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - return -ENODEV; - } - - if (!sdio_al_dev->is_ok_to_sleep) { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":card %d " - "already awake, no need to wake up\n", - sdio_al_dev->host->index); - return 0; - } - - /* Wake up sequence */ - if (not_from_int) { - if (ch) { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": Wake up" - " card %d (not by interrupt), ch %s", - sdio_al_dev->host->index, - ch->name); - } else { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": Wake up" - " card %d (not by interrupt)", - sdio_al_dev->host->index); - } - } else { - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": Wake up card " - "%d by interrupt", - sdio_al_dev->host->index); - sdio_al_dev->print_after_interrupt = 1; - } - - sdio_al_vote_for_sleep(sdio_al_dev, 0); - - msmsdcc_lpm_disable(host); - msmsdcc_set_pwrsave(host, 0); - /* Poll the GPIO */ - time_to_wait = jiffies + msecs_to_jiffies(1000); - while (time_before(jiffies, time_to_wait)) { - if (sdio_al->pdata->get_mdm2ap_status()) - break; - udelay(TIME_TO_WAIT_US); - } - - pr_debug(MODULE_NAME ":GPIO mdm2ap_status=%d\n", - sdio_al->pdata->get_mdm2ap_status()); - - /* Here get_mdm2ap_status() returning 0 is not an error condition */ - if (sdio_al->pdata->get_mdm2ap_status() == 0) - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ": " - "get_mdm2ap_status() is 0\n"); - - /* Enable Wake up Function */ - if (!sdio_al_dev->card || - !sdio_al_dev->card->sdio_func[SDIO_AL_WAKEUP_FUNC-1]) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": NULL card or wk_func\n"); - return -ENODEV; - } - wk_func = sdio_al_dev->card->sdio_func[SDIO_AL_WAKEUP_FUNC-1]; - ret = sdio_al_enable_func_retry(wk_func, "wakeup func"); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": " - "sdio_enable_func() err=%d\n", -ret); - goto error_exit; - } - /* Mark NOT OK_TOSLEEP */ - sdio_al_dev->is_ok_to_sleep = 0; - ret = write_lpm_info(sdio_al_dev); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": " - "write_lpm_info() failed, err=%d\n", -ret); - sdio_al_dev->is_ok_to_sleep = 1; - sdio_disable_func(wk_func); - goto error_exit; - } - sdio_disable_func(wk_func); - - /* Start the timer again*/ - restart_inactive_time(sdio_al_dev); - sdio_al_dev->poll_delay_msec = get_min_poll_time_msec(sdio_al_dev); - start_timer(sdio_al_dev); - - LPM_DEBUG(sdio_al_dev->dev_log, MODULE_NAME "Finished Wake up sequence" - " for card %d", sdio_al_dev->host->index); - - msmsdcc_set_pwrsave(host, 1); - pr_debug(MODULE_NAME ":Turn clock off\n"); - - return ret; -error_exit: - sdio_al_vote_for_sleep(sdio_al_dev, 1); - msmsdcc_set_pwrsave(host, 1); - WARN_ON(ret); - sdio_al_get_into_err_state(sdio_al_dev); - return ret; -} - - -/** - * SDIO Function Interrupt handler. - * - * Interrupt shall be triggered by SDIO-Client when: - * 1. End-Of-Transfer (EOT) detected in packet mode. - * 2. Bytes-available reached the threshold. - * - * Reading the mailbox clears the EOT/Threshold interrupt - * source. - * The interrupt source should be cleared before this ISR - * returns. This ISR is called from IRQ Thread and not - * interrupt, so it may sleep. - * - */ -static void sdio_func_irq(struct sdio_func *func) -{ - struct sdio_al_device *sdio_al_dev = sdio_get_drvdata(func); - - pr_debug(MODULE_NAME ":start %s.\n", __func__); - - if (sdio_al_dev == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": NULL device"); - return; - } - - if (sdio_al_dev->is_ok_to_sleep) - sdio_al_wake_up(sdio_al_dev, 0, NULL); - else - restart_timer(sdio_al_dev); - - read_mailbox(sdio_al_dev, true); - - pr_debug(MODULE_NAME ":end %s.\n", __func__); -} - -/** - * Timer Expire Handler - * - */ -static void sdio_al_timer_handler(unsigned long data) -{ - struct sdio_al_device *sdio_al_dev = (struct sdio_al_device *)data; - if (sdio_al_dev == NULL) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": NULL " - "sdio_al_dev for data %lu\n", data); - return; - } - if (sdio_al_dev->state != CARD_INSERTED) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": sdio_al_dev " - "is in invalid state %d\n", sdio_al_dev->state); - return; - } - pr_debug(MODULE_NAME " Timer Expired\n"); - - ask_reading_mailbox(sdio_al_dev); - - restart_timer(sdio_al_dev); -} - -/** - * Driver Setup. - * - */ -static int sdio_al_setup(struct sdio_al_device *sdio_al_dev) -{ - int ret = 0; - struct mmc_card *card = sdio_al_dev->card; - struct sdio_func *func1 = NULL; - int i = 0; - int fn = 0; - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - return -ENODEV; - func1 = card->sdio_func[0]; - - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":sdio_al_setup for " - "card %d\n", sdio_al_dev->host->index); - - ret = sdio_al->pdata->config_mdm2ap_status(1); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME "Could not " - "request GPIO\n"); - return ret; - } - - INIT_WORK(&sdio_al_dev->sdio_al_work.work, worker); - /* disable all pipes interrupts before claim irq. - since all are enabled by default. */ - for (i = 0 ; i < SDIO_AL_MAX_PIPES; i++) { - enable_eot_interrupt(sdio_al_dev, i, false); - enable_threshold_interrupt(sdio_al_dev, i, false); - } - - /* Disable all SDIO Functions before claim irq. */ - for (fn = 1 ; fn <= card->sdio_funcs; fn++) - sdio_disable_func(card->sdio_func[fn-1]); - - sdio_set_drvdata(func1, sdio_al_dev); - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":claim IRQ for card " - "%d\n", sdio_al_dev->host->index); - - ret = sdio_claim_irq(func1, sdio_func_irq); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to claim" - " IRQ for card %d\n", - sdio_al_dev->host->index); - return ret; - } - - sdio_al_dev->is_ready = true; - - /* Start worker before interrupt might happen */ - queue_work(sdio_al_dev->workqueue, &sdio_al_dev->sdio_al_work.work); - - start_inactive_time(sdio_al_dev); - - pr_debug(MODULE_NAME ":Ready.\n"); - - return 0; -} - -/** - * Driver Tear-Down. - * - */ -static void sdio_al_tear_down(void) -{ - int i, j; - struct sdio_al_device *sdio_al_dev = NULL; - struct sdio_func *func1; - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; ++i) { - if (sdio_al->devices[i] == NULL) - continue; - sdio_al_dev = sdio_al->devices[i]; - - if (sdio_al_dev->is_ready) { - sdio_al_dev->is_ready = false; /* Flag worker to exit */ - sdio_al_dev->ask_mbox = false; - ask_reading_mailbox(sdio_al_dev); /* Wakeup worker */ - /* allow gracefully exit of the worker thread */ - msleep(100); - - flush_workqueue(sdio_al_dev->workqueue); - destroy_workqueue(sdio_al_dev->workqueue); - - sdio_al_vote_for_sleep(sdio_al_dev, 1); - - if (!sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, - __func__)) { - if (!sdio_al_dev->card || - !sdio_al_dev->card->sdio_func[0]) { - sdio_al_loge(sdio_al_dev->dev_log, - MODULE_NAME - ": %s: Invalid func1", - __func__); - return; - } - func1 = sdio_al_dev->card->sdio_func[0]; - sdio_release_irq(func1); - sdio_disable_func(func1); - sdio_al_release_mutex(sdio_al_dev, __func__); - } - } - - for (j = 0; j < SDIO_AL_MAX_CHANNELS; j++) - sdio_al_dev->channel[j].signature = 0x0; - sdio_al_dev->signature = 0; - - kfree(sdio_al_dev->sdioc_sw_header); - kfree(sdio_al_dev->mailbox); - kfree(sdio_al_dev->rx_flush_buf); - kfree(sdio_al_dev); - } - - sdio_al->pdata->config_mdm2ap_status(0); -} - -/** - * Find channel by name. - * - */ -static struct sdio_channel *find_channel_by_name(const char *name) -{ - struct sdio_channel *ch = NULL; - int i, j; - struct sdio_al_device *sdio_al_dev = NULL; - - for (j = 0; j < MAX_NUM_OF_SDIO_DEVICES; ++j) { - if (sdio_al->devices[j] == NULL) - continue; - sdio_al_dev = sdio_al->devices[j]; - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - if (sdio_al_dev->channel[i].state == - SDIO_CHANNEL_STATE_INVALID) - continue; - if (strncmp(sdio_al_dev->channel[i].name, name, - CHANNEL_NAME_SIZE) == 0) { - ch = &sdio_al_dev->channel[i]; - break; - } - } - if (ch != NULL) - break; - } - - return ch; -} - -/** - * Find the minimal poll time. - * - */ -static int get_min_poll_time_msec(struct sdio_al_device *sdio_sl_dev) -{ - int i; - int poll_delay_msec = 0x0FFFFFFF; - - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) - if ((sdio_sl_dev->channel[i].state == - SDIO_CHANNEL_STATE_OPEN) && - (sdio_sl_dev->channel[i].poll_delay_msec > 0) && - (sdio_sl_dev->channel[i].poll_delay_msec < poll_delay_msec)) - poll_delay_msec = - sdio_sl_dev->channel[i].poll_delay_msec; - - if (poll_delay_msec == 0x0FFFFFFF) - poll_delay_msec = SDIO_AL_POLL_TIME_NO_STREAMING; - - pr_debug(MODULE_NAME ":poll delay time is %d msec\n", poll_delay_msec); - - return poll_delay_msec; -} - -/** - * Open SDIO Channel. - * - * Enable the channel. - * Set the channel context. - * Trigger reading the mailbox to check available bytes. - * - */ -int sdio_open(const char *name, struct sdio_channel **ret_ch, void *priv, - void (*notify)(void *priv, unsigned ch_event)) -{ - int ret = 0; - struct sdio_channel *ch = NULL; - struct sdio_al_device *sdio_al_dev = NULL; - - *ret_ch = NULL; /* default */ - - ch = find_channel_by_name(name); - if (ch == NULL) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":Can't find " - "channel name %s\n", name); - return -EINVAL; - } - - sdio_al_dev = ch->sdio_al_dev; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - if ((ch->state != SDIO_CHANNEL_STATE_IDLE) && - (ch->state != SDIO_CHANNEL_STATE_CLOSED)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Wrong ch %s " - "state %d\n", name, ch->state); - ret = -EPERM; - goto exit_err; - } - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - ret = -ENODEV; - goto exit_err; - } - - ret = sdio_al_wake_up(sdio_al_dev, 1, ch); - if (ret) - goto exit_err; - - ch->notify = notify; - ch->priv = priv; - - /* Note: Set caller returned context before interrupts are enabled */ - *ret_ch = ch; - - ret = open_channel(ch); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":sdio_open %s " - "err=%d\n", name, -ret); - goto exit_err; - } - - CLOSE_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":sdio_open %s " - "completed OK\n", name); - if (sdio_al_dev->lpm_chan == INVALID_SDIO_CHAN) { - if (sdio_al->sdioc_major == PEER_SDIOC_OLD_VERSION_MAJOR) { - if (!ch->is_packet_mode) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME - ":setting channel %s as " - "lpm_chan\n", name); - sdio_al_dev->lpm_chan = ch->num; - } - } else { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ": " - "setting channel %s as lpm_chan\n", - name); - sdio_al_dev->lpm_chan = ch->num; - } - } - -exit_err: - sdio_al_release_mutex(sdio_al_dev, __func__); - return ret; -} -EXPORT_SYMBOL(sdio_open); - -/** - * Request peer operation - * note: sanity checks of parameters done by caller - * called under bus locked - */ -static int peer_set_operation(u32 opcode, - struct sdio_al_device *sdio_al_dev, - struct sdio_channel *ch) -{ - int ret; - int offset; - struct sdio_func *wk_func = NULL; - u32 peer_operation; - int loop_count = 0; - - if (!sdio_al_dev->card || - !sdio_al_dev->card->sdio_func[SDIO_AL_WAKEUP_FUNC-1]) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": NULL card or wk_func\n"); - ret = -ENODEV; - goto exit; - } - wk_func = sdio_al_dev->card->sdio_func[SDIO_AL_WAKEUP_FUNC-1]; - - /* calculate offset of peer_operation field in sw mailbox struct */ - offset = offsetof(struct peer_sdioc_sw_mailbox, ch_config) + - sizeof(struct peer_sdioc_channel_config) * ch->num + - offsetof(struct peer_sdioc_channel_config, peer_operation); - - ret = sdio_al_wake_up(sdio_al_dev, 1, ch); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to " - "wake up\n"); - goto exit; - } - /* request operation from MDM peer */ - peer_operation = PEER_OPERATION(opcode, PEER_OP_STATE_INIT); - ret = sdio_memcpy_toio(ch->func, SDIOC_SW_MAILBOX_ADDR+offset, - &peer_operation, sizeof(u32)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":failed to " - "request close operation\n"); - goto exit; - } - ret = sdio_al_enable_func_retry(wk_func, "wk_func"); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to enable" - " Func#%d\n", wk_func->num); - goto exit; - } - pr_debug(MODULE_NAME ":%s: wk_func enabled on ch %s\n", - __func__, ch->name); - /* send "start" operation to MDM */ - peer_operation = PEER_OPERATION(opcode, PEER_OP_STATE_START); - ret = sdio_memcpy_toio(ch->func, SDIOC_SW_MAILBOX_ADDR+offset, - &peer_operation, sizeof(u32)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":failed to " - "send start close operation\n"); - goto exit; - } - ret = sdio_disable_func(wk_func); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to " - "disable Func#%d\n", wk_func->num); - goto exit; - } - /* poll for peer operation ack */ - while (peer_operation != 0) { - ret = sdio_memcpy_fromio(ch->func, - &peer_operation, - SDIOC_SW_MAILBOX_ADDR+offset, - sizeof(u32)); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":failed to request ack on close" - " operation, loop_count = %d\n", - loop_count); - goto exit; - } - loop_count++; - if (loop_count > 10) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":%s: " - "peer_operation=0x%x wait loop" - " %d on ch %s\n", __func__, - peer_operation, loop_count, ch->name); - } - } -exit: - return ret; -} - -static int channel_close(struct sdio_channel *ch, int flush_flag) -{ - int ret; - struct sdio_al_device *sdio_al_dev = NULL; - int flush_len; - ulong flush_expires; - - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - - if (!ch->func) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":%s: NULL func" - " on channel:%d\n", __func__, ch->num); - return -ENODEV; - } - - sdio_al_dev = ch->sdio_al_dev; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - if (!sdio_al_dev->ch_close_supported) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":%s: Not " - "supported by mdm, ch %s\n", - __func__, ch->name); - ret = -ENOTSUPP; - goto error_exit; - } - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - ret = -ENODEV; - goto error_exit; - } - if (ch->state != SDIO_CHANNEL_STATE_OPEN) { - sdio_al_loge(sdio_al_dev->dev_log, - MODULE_NAME ":%s: ch %s is not in " - "open state (%d)\n", - __func__, ch->name, ch->state); - ret = -ENODEV; - goto error_exit; - } - ch->state = SDIO_CHANNEL_STATE_CLOSING; - ret = peer_set_operation(PEER_OP_CODE_CLOSE, sdio_al_dev, ch); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":%s: " - "peer_set_operation() failed: %d\n", - __func__, ret); - ret = -ENODEV; - goto error_exit; - } - /* udate poll time for opened channels */ - if (ch->poll_delay_msec > 0) { - sdio_al_dev->poll_delay_msec = - get_min_poll_time_msec(sdio_al_dev); - } - sdio_al_release_mutex(ch->sdio_al_dev, __func__); - - flush_expires = jiffies + - msecs_to_jiffies(SDIO_CLOSE_FLUSH_TIMEOUT_MSEC); - /* flush rx packets of the channel */ - if (flush_flag) { - do { - while (ch->read_avail > 0) { - flush_len = ch->read_avail; - ret = sdio_read_internal(ch, - sdio_al_dev->rx_flush_buf, - flush_len); - if (ret) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":%s sdio_read" - " failed: %d, ch %s\n", - __func__, ret, - ch->name); - return ret; - } - - if (time_after(jiffies, flush_expires) != 0) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":%s flush rx " - "packets timeout: ch %s\n", - __func__, ch->name); - sdio_al_get_into_err_state(sdio_al_dev); - return -EBUSY; - } - } - msleep(100); - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":%s: after sleep," - " invalid signature" - " 0x%x\n", __func__, - ch->signature); - return -ENODEV; - } - if (sdio_al_claim_mutex_and_verify_dev(ch->sdio_al_dev, - __func__)) - return -ENODEV; - - ret = read_mailbox(sdio_al_dev, false); - if (ret) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":%s: failed to" - " read mailbox", __func__); - goto error_exit; - } - sdio_al_release_mutex(ch->sdio_al_dev, __func__); - } while (ch->read_avail > 0); - } - if (sdio_al_claim_mutex_and_verify_dev(ch->sdio_al_dev, - __func__)) - return -ENODEV; - /* disable function to be able to open the channel again */ - ret = sdio_disable_func(ch->func); - if (ret) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":Fail to disable Func#%d\n", - ch->func->num); - goto error_exit; - } - ch->state = SDIO_CHANNEL_STATE_CLOSED; - CLOSE_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":%s: Ch %s closed " - "successfully\n", __func__, ch->name); - -error_exit: - sdio_al_release_mutex(ch->sdio_al_dev, __func__); - - return ret; -} - -/** - * Close SDIO Channel. - * - */ -int sdio_close(struct sdio_channel *ch) -{ - return channel_close(ch, true); -} -EXPORT_SYMBOL(sdio_close); - -/** - * Get the number of available bytes to write. - * - */ -int sdio_write_avail(struct sdio_channel *ch) -{ - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: " - "Invalid signature 0x%x\n", __func__, - ch->signature); - return -ENODEV; - } - if (ch->state != SDIO_CHANNEL_STATE_OPEN) { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME ":%s: " - "channel %s state is not open (%d)\n", - __func__, ch->name, ch->state); - return -ENODEV; - } - pr_debug(MODULE_NAME ":sdio_write_avail %s 0x%x\n", - ch->name, ch->write_avail); - - return ch->write_avail; -} -EXPORT_SYMBOL(sdio_write_avail); - -/** - * Get the number of available bytes to read. - * - */ -int sdio_read_avail(struct sdio_channel *ch) -{ - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: " - "Invalid signature 0x%x\n", __func__, - ch->signature); - return -ENODEV; - } - if (ch->state != SDIO_CHANNEL_STATE_OPEN) { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME ":%s: " - "channel %s state is not open (%d)\n", - __func__, ch->name, ch->state); - return -ENODEV; - } - pr_debug(MODULE_NAME ":sdio_read_avail %s 0x%x\n", - ch->name, ch->read_avail); - - return ch->read_avail; -} -EXPORT_SYMBOL(sdio_read_avail); - -static int sdio_read_from_closed_ch(struct sdio_channel *ch, int len) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = NULL; - - if (!ch) { - sdio_al_loge(ch->sdio_al_dev->dev_log, - MODULE_NAME ":%s: NULL channel\n", __func__); - return -ENODEV; - } - - sdio_al_dev = ch->sdio_al_dev; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - ret = sdio_memcpy_fromio(ch->func, sdio_al_dev->rx_flush_buf, - PIPE_RX_FIFO_ADDR, len); - - if (ret) { - sdio_al_loge(ch->sdio_al_dev->dev_log, - MODULE_NAME ":ch %s: %s err=%d, len=%d\n", - ch->name, __func__, -ret, len); - sdio_al_dev->is_err = true; - sdio_al_release_mutex(sdio_al_dev, __func__); - return ret; - } - - restart_inactive_time(sdio_al_dev); - - sdio_al_release_mutex(sdio_al_dev, __func__); - - return 0; -} - -/** - * Internal read from SDIO Channel. - * - * Reading from the pipe will trigger interrupt if there are - * other pending packets on the SDIO-Client. - * - */ -static int sdio_read_internal(struct sdio_channel *ch, void *data, int len) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = NULL; - - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - if (!data) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL data\n", - __func__); - return -ENODEV; - } - if (len == 0) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":channel %s trying" - " to read 0 bytes\n", ch->name); - return -EINVAL; - } - - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: Invalid " - "signature 0x%x\n", __func__, ch->signature); - return -ENODEV; - } - - sdio_al_dev = ch->sdio_al_dev; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - ret = -ENODEV; - goto exit; - } - - /* lpm policy says we can't go to sleep when we have pending rx data, - so either we had rx interrupt and woken up, or we never went to - sleep */ - if (sdio_al_dev->is_ok_to_sleep) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":%s: called " - "when is_ok_to_sleep is set for ch %s, len=%d," - " last_any_read_avail=%d, last_read_avail=%d, " - "last_old_read_avail=%d", __func__, ch->name, - len, ch->statistics.last_any_read_avail, - ch->statistics.last_read_avail, - ch->statistics.last_old_read_avail); - } - BUG_ON(sdio_al_dev->is_ok_to_sleep); - - if ((ch->state != SDIO_CHANNEL_STATE_OPEN) && - (ch->state != SDIO_CHANNEL_STATE_CLOSING)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":%s wrong " - "channel %s state %d\n", - __func__, ch->name, ch->state); - ret = -EINVAL; - goto exit; - } - - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":start ch %s read %d " - "avail %d.\n", ch->name, len, ch->read_avail); - - restart_inactive_time(sdio_al_dev); - - if ((ch->is_packet_mode) && (len != ch->read_avail)) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":sdio_read ch " - "%s len != read_avail\n", ch->name); - ret = -EINVAL; - goto exit; - } - - if (len > ch->read_avail) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":ERR ch %s: " - "reading more bytes (%d) than the avail(%d).\n", - ch->name, len, ch->read_avail); - ret = -ENOMEM; - goto exit; - } - - ret = sdio_memcpy_fromio(ch->func, data, PIPE_RX_FIFO_ADDR, len); - - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":ch %s: " - "sdio_read err=%d, len=%d, read_avail=%d, " - "last_read_avail=%d, last_old_read_avail=%d\n", - ch->name, -ret, len, ch->read_avail, - ch->statistics.last_read_avail, - ch->statistics.last_old_read_avail); - sdio_al_get_into_err_state(sdio_al_dev); - goto exit; - } - - ch->statistics.total_read_times++; - - /* Remove handled packet from the list regardless if ret is ok */ - if (ch->is_packet_mode) - remove_handled_rx_packet(ch); - else - ch->read_avail -= len; - - ch->total_rx_bytes += len; - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":end ch %s read %d " - "avail %d total %d.\n", ch->name, len, - ch->read_avail, ch->total_rx_bytes); - - if ((ch->read_avail == 0) && !(ch->is_packet_mode)) - ask_reading_mailbox(sdio_al_dev); - -exit: - sdio_al_release_mutex(sdio_al_dev, __func__); - - return ret; -} - -/** - * Read from SDIO Channel. - * - * Reading from the pipe will trigger interrupt if there are - * other pending packets on the SDIO-Client. - * - */ -int sdio_read(struct sdio_channel *ch, void *data, int len) -{ - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: " - "Invalid signature 0x%x\n", __func__, ch->signature); - return -ENODEV; - } - if (ch->state == SDIO_CHANNEL_STATE_OPEN) { - return sdio_read_internal(ch, data, len); - } else { - sdio_al_loge(ch->sdio_al_dev->dev_log, MODULE_NAME - ":%s: Invalid channel %s state %d\n", - __func__, ch->name, ch->state); - } - return -ENODEV; -} -EXPORT_SYMBOL(sdio_read); - -/** - * Write to SDIO Channel. - * - */ -int sdio_write(struct sdio_channel *ch, const void *data, int len) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = NULL; - - if (!ch) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL " - "channel\n", __func__); - return -ENODEV; - } - if (!data) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: NULL data\n", - __func__); - return -ENODEV; - } - if (len == 0) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":channel %s trying" - " to write 0 bytes\n", ch->name); - return -EINVAL; - } - - if (ch->signature != SDIO_AL_SIGNATURE) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":%s: Invalid " - "signature 0x%x\n", __func__, ch->signature); - return -ENODEV; - } - - sdio_al_dev = ch->sdio_al_dev; - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - WARN_ON(len > ch->write_avail); - - if (sdio_al_dev->is_err) { - SDIO_AL_ERR(__func__); - ret = -ENODEV; - goto exit; - } - - if (ch->state != SDIO_CHANNEL_STATE_OPEN) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":writing to " - "closed channel %s\n", ch->name); - ret = -EINVAL; - goto exit; - } - - if (sdio_al_dev->is_ok_to_sleep) { - ret = sdio_al_wake_up(sdio_al_dev, 1, ch); - if (ret) - goto exit; - } else { - restart_inactive_time(sdio_al_dev); - } - - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":start ch %s write %d " - "avail %d.\n", ch->name, len, ch->write_avail); - - if (len > ch->write_avail) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":ERR ch %s: " - "write more bytes (%d) than available %d.\n", - ch->name, len, ch->write_avail); - ret = -ENOMEM; - goto exit; - } - - ret = sdio_ch_write(ch, data, len); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":sdio_write " - "on channel %s err=%d\n", ch->name, -ret); - goto exit; - } - - ch->total_tx_bytes += len; - DATA_DEBUG(sdio_al_dev->dev_log, MODULE_NAME ":end ch %s write %d " - "avail %d total %d.\n", ch->name, len, - ch->write_avail, ch->total_tx_bytes); - - /* Round up to whole buffer size */ - len = ROUND_UP(len, ch->peer_tx_buf_size); - /* Protect from wraparound */ - len = min(len, (int) ch->write_avail); - ch->write_avail -= len; - - if (ch->write_avail < ch->min_write_avail) - ask_reading_mailbox(sdio_al_dev); - -exit: - sdio_al_release_mutex(sdio_al_dev, __func__); - - return ret; -} -EXPORT_SYMBOL(sdio_write); - -static int msm_sdio_al_probe(struct platform_device *pdev) -{ - if (!sdio_al) { - pr_err(MODULE_NAME ": %s: NULL sdio_al\n", __func__); - return -ENODEV; - } - - sdio_al->pdata = pdev->dev.platform_data; - return 0; -} - -static int msm_sdio_al_remove(struct platform_device *pdev) -{ - return 0; -} - -static void sdio_al_close_all_channels(struct sdio_al_device *sdio_al_dev) -{ - int j; - int ret; - struct sdio_channel *ch = NULL; - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s", __func__); - - if (!sdio_al_dev) { - sdio_al_loge(sdio_al_dev->dev_log, - MODULE_NAME ": %s: NULL device", __func__); - return; - } - for (j = 0; j < SDIO_AL_MAX_CHANNELS; j++) { - ch = &sdio_al_dev->channel[j]; - - if (ch->state == SDIO_CHANNEL_STATE_OPEN) { - sdio_al_loge(sdio_al_dev->dev_log, - MODULE_NAME ": %s: Call to sdio_close() for" - " ch %s\n", __func__, ch->name); - ret = channel_close(ch, false); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, - MODULE_NAME ": %s: failed sdio_close()" - " for ch %s (%d)\n", - __func__, ch->name, ret); - } - } else { - pr_debug(MODULE_NAME ": %s: skip sdio_close() ch %s" - " (state=%d)\n", __func__, - ch->name, ch->state); - } - } -} - -static void sdio_al_invalidate_sdio_clients(struct sdio_al_device *sdio_al_dev, - struct platform_device **pdev_arr) -{ - int j; - - pr_debug(MODULE_NAME ": %s: Notifying SDIO clients for card %d", - __func__, sdio_al_dev->host->index); - for (j = 0; j < SDIO_AL_MAX_CHANNELS; ++j) { - if (sdio_al_dev->channel[j].state == - SDIO_CHANNEL_STATE_INVALID) - continue; - pdev_arr[j] = sdio_al_dev->channel[j].pdev; - sdio_al_dev->channel[j].signature = 0x0; - sdio_al_dev->channel[j].state = - SDIO_CHANNEL_STATE_INVALID; - } -} - -static void sdio_al_modem_reset_operations(struct sdio_al_device - *sdio_al_dev) -{ - int ret = 0; - struct platform_device *pdev_arr[SDIO_AL_MAX_CHANNELS]; - int j; - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s", __func__); - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return; - - if (sdio_al_dev->state == CARD_REMOVED) { - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: " - "card %d is already removed", __func__, - sdio_al_dev->host->index); - goto exit_err; - } - - if (sdio_al_dev->state == MODEM_RESTART) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ": %s: " - "card %d was already notified for modem reset", - __func__, sdio_al_dev->host->index); - goto exit_err; - } - - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ": %s: Set the " - "state to MODEM_RESTART for card %d", - __func__, sdio_al_dev->host->index); - sdio_al_dev->state = MODEM_RESTART; - sdio_al_dev->is_ready = false; - - /* Stop mailbox timer */ - stop_and_del_timer(sdio_al_dev); - - if ((sdio_al_dev->is_ok_to_sleep) && - (!sdio_al_dev->is_err)) { - pr_debug(MODULE_NAME ": %s: wakeup modem for " - "card %d", __func__, - sdio_al_dev->host->index); - ret = sdio_al_wake_up(sdio_al_dev, 1, NULL); - } - - if (!ret && (!sdio_al_dev->is_err) && sdio_al_dev->card && - sdio_al_dev->card->sdio_func[0]) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME - ": %s: sdio_release_irq for card %d", - __func__, - sdio_al_dev->host->index); - sdio_release_irq(sdio_al_dev->card->sdio_func[0]); - } - - memset(pdev_arr, 0, sizeof(pdev_arr)); - sdio_al_invalidate_sdio_clients(sdio_al_dev, pdev_arr); - - sdio_al_release_mutex(sdio_al_dev, __func__); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: Notifying SDIO " - "clients for card %d", - __func__, sdio_al_dev->host->index); - for (j = 0; j < SDIO_AL_MAX_CHANNELS; j++) { - if (!pdev_arr[j]) - continue; - platform_device_unregister(pdev_arr[j]); - } - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: Finished Notifying " - "SDIO clients for card %d", - __func__, sdio_al_dev->host->index); - - return; - -exit_err: - sdio_al_release_mutex(sdio_al_dev, __func__); - return; -} - -#ifdef CONFIG_MSM_SUBSYSTEM_RESTART -static void sdio_al_reset(void) -{ - int i; - struct sdio_al_device *sdio_al_dev; - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s", __func__); - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; i++) { - if (sdio_al->devices[i] == NULL) { - pr_debug(MODULE_NAME ": %s: NULL device in index %d", - __func__, i); - continue; - } - sdio_al_dev = sdio_al->devices[i]; - sdio_al_modem_reset_operations(sdio_al->devices[i]); - } - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s completed", __func__); -} -#endif - -static void msm_sdio_al_shutdown(struct platform_device *pdev) -{ - int i; - struct sdio_al_device *sdio_al_dev; - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME - "Initiating msm_sdio_al_shutdown..."); - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; i++) { - if (sdio_al->devices[i] == NULL) { - pr_debug(MODULE_NAME ": %s: NULL device in index %d", - __func__, i); - continue; - } - sdio_al_dev = sdio_al->devices[i]; - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return; - - if (sdio_al_dev->ch_close_supported) - sdio_al_close_all_channels(sdio_al_dev); - - sdio_al_release_mutex(sdio_al_dev, __func__); - - sdio_al_modem_reset_operations(sdio_al_dev); - } - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: " - "msm_sdio_al_shutdown complete.", __func__); -} - -static struct platform_driver msm_sdio_al_driver = { - .probe = msm_sdio_al_probe, - .remove = __exit_p(msm_sdio_al_remove), - .shutdown = msm_sdio_al_shutdown, - .driver = { - .name = "msm_sdio_al", - }, -}; - -/** - * Initialize SDIO_AL channels. - * - */ -static int init_channels(struct sdio_al_device *sdio_al_dev) -{ - int ret = 0; - int i; - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - ret = read_sdioc_software_header(sdio_al_dev, - sdio_al_dev->sdioc_sw_header); - if (ret) - goto exit; - - ret = sdio_al_setup(sdio_al_dev); - if (ret) - goto exit; - - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - int ch_name_size; - if (sdio_al_dev->channel[i].state == SDIO_CHANNEL_STATE_INVALID) - continue; - if (sdio_al->unittest_mode) { - memset(sdio_al_dev->channel[i].ch_test_name, 0, - sizeof(sdio_al_dev->channel[i].ch_test_name)); - ch_name_size = strnlen(sdio_al_dev->channel[i].name, - CHANNEL_NAME_SIZE); - strncpy(sdio_al_dev->channel[i].ch_test_name, - sdio_al_dev->channel[i].name, - ch_name_size); - strncat(sdio_al_dev->channel[i].ch_test_name + - ch_name_size, - SDIO_TEST_POSTFIX, - SDIO_TEST_POSTFIX_SIZE); - pr_debug(MODULE_NAME ":pdev.name = %s\n", - sdio_al_dev->channel[i].ch_test_name); - sdio_al_dev->channel[i].pdev = platform_device_alloc( - sdio_al_dev->channel[i].ch_test_name, -1); - } else { - pr_debug(MODULE_NAME ":pdev.name = %s\n", - sdio_al_dev->channel[i].name); - sdio_al_dev->channel[i].pdev = platform_device_alloc( - sdio_al_dev->channel[i].name, -1); - } - if (!sdio_al_dev->channel[i].pdev) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":NULL platform device for ch %s", - sdio_al_dev->channel[i].name); - sdio_al_dev->channel[i].state = - SDIO_CHANNEL_STATE_INVALID; - continue; - } - ret = platform_device_add(sdio_al_dev->channel[i].pdev); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ":platform_device_add failed, " - "ret=%d\n", ret); - sdio_al_dev->channel[i].state = - SDIO_CHANNEL_STATE_INVALID; - } - } - -exit: - sdio_al_release_mutex(sdio_al_dev, __func__); - return ret; -} - -/** - * Initialize SDIO_AL channels according to the client setup. - * This function also check if the client is in boot mode and - * flashless boot is required to be activated or the client is - * up and running. - * - */ -static int sdio_al_client_setup(struct sdio_al_device *sdio_al_dev) -{ - int ret = 0; - struct sdio_func *func1; - int signature = 0; - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - if (!sdio_al_dev->card || !sdio_al_dev->card->sdio_func[0]) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":NULL card or " - "func1\n"); - sdio_al_release_mutex(sdio_al_dev, __func__); - return -ENODEV; - } - func1 = sdio_al_dev->card->sdio_func[0]; - - /* Read the header signature to determine the status of the MDM - * SDIO Client - */ - signature = sdio_readl(func1, SDIOC_SW_HEADER_ADDR, &ret); - sdio_al_release_mutex(sdio_al_dev, __func__); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":fail to read " - "signature from sw header.\n"); - return ret; - } - - switch (signature) { - case PEER_SDIOC_SW_MAILBOX_BOOT_SIGNATURE: - if (sdio_al_dev == sdio_al->bootloader_dev) { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":setup " - "bootloader on card %d\n", - sdio_al_dev->host->index); - return sdio_al_bootloader_setup(); - } else { - sdio_al_logi(sdio_al_dev->dev_log, MODULE_NAME ":wait " - "for bootloader completion " - "on card %d\n", - sdio_al_dev->host->index); - return sdio_al_wait_for_bootloader_comp(sdio_al_dev); - } - case PEER_SDIOC_SW_MAILBOX_SIGNATURE: - case PEER_SDIOC_SW_MAILBOX_UT_SIGNATURE: - return init_channels(sdio_al_dev); - default: - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Invalid " - "signature 0x%x\n", signature); - return -EINVAL; - } - - return 0; -} - -static void clean_sdio_al_device_data(struct sdio_al_device *sdio_al_dev) -{ - sdio_al_dev->is_ready = 0; - sdio_al_dev->bootloader_done = 0; - sdio_al_dev->lpm_chan = 0; - sdio_al_dev->is_ok_to_sleep = 0; - sdio_al_dev->inactivity_time = 0; - sdio_al_dev->poll_delay_msec = 0; - sdio_al_dev->is_timer_initialized = 0; - sdio_al_dev->is_err = 0; - sdio_al_dev->is_suspended = 0; - sdio_al_dev->flashless_boot_on = 0; - sdio_al_dev->ch_close_supported = 0; - sdio_al_dev->print_after_interrupt = 0; - memset(sdio_al_dev->sdioc_sw_header, 0, - sizeof(*sdio_al_dev->sdioc_sw_header)); - memset(sdio_al_dev->mailbox, 0, sizeof(*sdio_al_dev->mailbox)); - memset(sdio_al_dev->rx_flush_buf, 0, - sizeof(*sdio_al_dev->rx_flush_buf)); -} - -/* - * SDIO driver functions - */ -static int sdio_al_sdio_probe(struct sdio_func *func, - const struct sdio_device_id *sdio_dev_id) -{ - int ret = 0; - struct sdio_al_device *sdio_al_dev = NULL; - int i; - struct mmc_card *card = NULL; - - if (!func) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL func\n", - __func__); - return -ENODEV; - } - card = func->card; - - if (!card) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL card\n", - __func__); - return -ENODEV; - } - - if (!card->sdio_func[0]) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "func1\n", - __func__); - return -ENODEV; - } - - if (card->sdio_funcs < SDIO_AL_MAX_FUNCS) { - dev_info(&card->dev, - "SDIO-functions# %d less than expected.\n", - card->sdio_funcs); - return -ENODEV; - } - - /* Check if there is already a device for this card */ - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; ++i) { - if (sdio_al->devices[i] == NULL) - continue; - if (sdio_al->devices[i]->host == card->host) { - sdio_al_dev = sdio_al->devices[i]; - if (sdio_al_dev->state == CARD_INSERTED) - return 0; - clean_sdio_al_device_data(sdio_al_dev); - break; - } - } - - if (!sdio_al_dev) { - sdio_al_dev = kzalloc(sizeof(struct sdio_al_device), - GFP_KERNEL); - if (sdio_al_dev == NULL) - return -ENOMEM; - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES ; ++i) - if (sdio_al->devices[i] == NULL) { - sdio_al->devices[i] = sdio_al_dev; - sdio_al_dev->dev_log = &sdio_al->device_log[i]; - spin_lock_init(&sdio_al_dev->dev_log->log_lock); - #ifdef CONFIG_DEBUG_FS - sdio_al_dbgfs_log[i].data = - sdio_al_dev->dev_log->buffer; - sdio_al_dbgfs_log[i].size = - SDIO_AL_DEBUG_LOG_SIZE; - #endif - break; - } - if (i == MAX_NUM_OF_SDIO_DEVICES) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ":No space " - "in devices array for the device\n"); - return -ENOMEM; - } - } - - dev_info(&card->dev, "SDIO Card claimed.\n"); - sdio_al->skip_print_info = 0; - - sdio_al_dev->state = CARD_INSERTED; - - if (card->host->index == SDIO_BOOTLOADER_CARD_INDEX) - sdio_al->bootloader_dev = sdio_al_dev; - - sdio_al_dev->is_ready = false; - - sdio_al_dev->signature = SDIO_AL_SIGNATURE; - - sdio_al_dev->is_suspended = 0; - sdio_al_dev->is_timer_initialized = false; - - sdio_al_dev->lpm_chan = INVALID_SDIO_CHAN; - - sdio_al_dev->card = card; - sdio_al_dev->host = card->host; - - if (!sdio_al_dev->mailbox) { - sdio_al_dev->mailbox = kzalloc(sizeof(struct sdio_mailbox), - GFP_KERNEL); - if (sdio_al_dev->mailbox == NULL) - return -ENOMEM; - } - - if (!sdio_al_dev->sdioc_sw_header) { - sdio_al_dev->sdioc_sw_header - = kzalloc(sizeof(*sdio_al_dev->sdioc_sw_header), - GFP_KERNEL); - if (sdio_al_dev->sdioc_sw_header == NULL) - return -ENOMEM; - } - - if (!sdio_al_dev->rx_flush_buf) { - sdio_al_dev->rx_flush_buf = kzalloc(RX_FLUSH_BUFFER_SIZE, - GFP_KERNEL); - if (sdio_al_dev->rx_flush_buf == NULL) { - sdio_al_loge(&sdio_al->gen_log, - MODULE_NAME ":Fail to allocate " - "rx_flush_buf for card %d\n", - card->host->index); - return -ENOMEM; - } - } - - sdio_al_dev->timer.data = (unsigned long)sdio_al_dev; - - wake_lock_init(&sdio_al_dev->wake_lock, WAKE_LOCK_SUSPEND, MODULE_NAME); - /* Don't allow sleep until all required clients register */ - sdio_al_vote_for_sleep(sdio_al_dev, 0); - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return -ENODEV; - - /* Init Func#1 */ - ret = sdio_al_enable_func_retry(card->sdio_func[0], "Init Func#1"); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to " - "enable Func#%d\n", card->sdio_func[0]->num); - goto exit; - } - - /* Patch Func CIS tuple issue */ - ret = sdio_set_block_size(card->sdio_func[0], SDIO_AL_BLOCK_SIZE); - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ":Fail to set " - "block size, Func#%d\n", card->sdio_func[0]->num); - goto exit; - } - sdio_al_dev->card->sdio_func[0]->max_blksize = SDIO_AL_BLOCK_SIZE; - - sdio_al_dev->workqueue = create_singlethread_workqueue("sdio_al_wq"); - sdio_al_dev->sdio_al_work.sdio_al_dev = sdio_al_dev; - init_waitqueue_head(&sdio_al_dev->wait_mbox); - - ret = sdio_al_client_setup(sdio_al_dev); - -exit: - sdio_al_release_mutex(sdio_al_dev, __func__); - return ret; -} - -static void sdio_al_sdio_remove(struct sdio_func *func) -{ - struct sdio_al_device *sdio_al_dev = NULL; - int i; - struct mmc_card *card = NULL; - struct platform_device *pdev_arr[SDIO_AL_MAX_CHANNELS]; - - if (!func) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL func\n", - __func__); - return; - } - card = func->card; - - if (!card) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL card\n", - __func__); - return; - } - - /* Find the sdio_al_device of this card */ - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES; ++i) { - if (sdio_al->devices[i] == NULL) - continue; - if (sdio_al->devices[i]->card == card) { - sdio_al_dev = sdio_al->devices[i]; - break; - } - } - if (sdio_al_dev == NULL) { - pr_debug(MODULE_NAME ":%s :NULL sdio_al_dev for card %d\n", - __func__, card->host->index); - return; - } - - if (sdio_al_claim_mutex(sdio_al_dev, __func__)) - return; - - if (sdio_al_dev->state == CARD_REMOVED) { - sdio_al_release_mutex(sdio_al_dev, __func__); - return; - } - - if (!card->sdio_func[0]) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: NULL " - "func1\n", __func__); - sdio_al_release_mutex(sdio_al_dev, __func__); - return; - } - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":%s for card %d\n", - __func__, card->host->index); - - sdio_al_dev->state = CARD_REMOVED; - - memset(pdev_arr, 0, sizeof(pdev_arr)); - sdio_al_invalidate_sdio_clients(sdio_al_dev, pdev_arr); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":%s: ask_reading_mailbox " - "for card %d\n", __func__, card->host->index); - sdio_al_dev->is_ready = false; /* Flag worker to exit */ - sdio_al_dev->ask_mbox = false; - ask_reading_mailbox(sdio_al_dev); /* Wakeup worker */ - - stop_and_del_timer(sdio_al_dev); - - sdio_al_release_mutex(sdio_al_dev, __func__); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: Notifying SDIO " - "clients for card %d", - __func__, sdio_al_dev->host->index); - for (i = 0; i < SDIO_AL_MAX_CHANNELS; i++) { - if (!pdev_arr[i]) - continue; - platform_device_unregister(pdev_arr[i]); - } - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: Finished Notifying " - "SDIO clients for card %d", - __func__, sdio_al_dev->host->index); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":%s: vote for sleep for " - "card %d\n", __func__, card->host->index); - sdio_al_vote_for_sleep(sdio_al_dev, 1); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":%s: flush_workqueue for " - "card %d\n", __func__, card->host->index); - flush_workqueue(sdio_al_dev->workqueue); - destroy_workqueue(sdio_al_dev->workqueue); - wake_lock_destroy(&sdio_al_dev->wake_lock); - - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ":%s: sdio card %d removed." - "\n", __func__, card->host->index); -} - -static void sdio_print_mailbox(char *prefix_str, struct sdio_mailbox *mailbox) -{ - int k = 0; - char buf[256]; - char buf1[10]; - - if (!mailbox) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": mailbox is " - "NULL\n"); - return; - } - - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s: pipes 0_7: eot=0x%x," - " thresh=0x%x, overflow=0x%x, " - "underflow=0x%x, mask_thresh=0x%x\n", - prefix_str, mailbox->eot_pipe_0_7, - mailbox->thresh_above_limit_pipe_0_7, - mailbox->overflow_pipe_0_7, - mailbox->underflow_pipe_0_7, - mailbox->mask_thresh_above_limit_pipe_0_7); - - memset(buf, 0, sizeof(buf)); - strncat(buf, ": bytes_avail:", sizeof(buf)); - - for (k = 0 ; k < SDIO_AL_ACTIVE_PIPES ; ++k) { - snprintf(buf1, sizeof(buf1), "%d, ", - mailbox->pipe_bytes_avail[k]); - strncat(buf, buf1, sizeof(buf)); - } - - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME "%s", buf); -} - -static void sdio_al_print_info(void) -{ - int i = 0; - int j = 0; - int ret = 0; - struct sdio_mailbox *mailbox = NULL; - struct sdio_mailbox *hw_mailbox = NULL; - struct peer_sdioc_channel_config *ch_config = NULL; - struct sdio_func *func1 = NULL; - struct sdio_func *lpm_func = NULL; - int offset = 0; - int is_ok_to_sleep = 0; - char buf[50]; - - if (sdio_al->skip_print_info == 1) - return; - - sdio_al->skip_print_info = 1; - - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s - SDIO DEBUG INFO\n", - __func__); - - if (!sdio_al) { - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": %s - ERROR - " - "sdio_al is NULL\n", __func__); - return; - } - - sdio_al_loge(&sdio_al->gen_log, MODULE_NAME ": GPIO mdm2ap_status=%d\n", - sdio_al->pdata->get_mdm2ap_status()); - - for (j = 0 ; j < MAX_NUM_OF_SDIO_DEVICES ; ++j) { - struct sdio_al_device *sdio_al_dev = sdio_al->devices[j]; - - if (sdio_al_dev == NULL) { - continue; - } - - if (!sdio_al_dev->host) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": Host" - " is NULL\n);"); - continue; - } - - snprintf(buf, sizeof(buf), "Card#%d: Shadow HW MB", - sdio_al_dev->host->index); - - /* printing Shadowing HW Mailbox*/ - mailbox = sdio_al_dev->mailbox; - sdio_print_mailbox(buf, mailbox); - - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": Card#%d: " - "is_ok_to_sleep=%d\n", - sdio_al_dev->host->index, - sdio_al_dev->is_ok_to_sleep); - - - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME ": Card#%d: " - "Shadow channels SW MB:", - sdio_al_dev->host->index); - - /* printing Shadowing SW Mailbox per channel*/ - for (i = 0 ; i < SDIO_AL_MAX_CHANNELS ; ++i) { - struct sdio_channel *ch = &sdio_al_dev->channel[i]; - - if (ch == NULL) { - continue; - } - - if (ch->state == SDIO_CHANNEL_STATE_INVALID) - continue; - - ch_config = &sdio_al_dev->channel[i].ch_config; - - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": Ch %s: max_rx_thres=0x%x, " - "max_tx_thres=0x%x, tx_buf=0x%x, " - "is_packet_mode=%d, " - "max_packet=0x%x, min_write=0x%x", - ch->name, ch_config->max_rx_threshold, - ch_config->max_tx_threshold, - ch_config->tx_buf_size, - ch_config->is_packet_mode, - ch_config->max_packet_size, - ch->min_write_avail); - - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": total_rx=0x%x, total_tx=0x%x, " - "read_avail=0x%x, write_avail=0x%x, " - "rx_pending=0x%x, num_reads=0x%x, " - "num_notifs=0x%x", ch->total_rx_bytes, - ch->total_tx_bytes, ch->read_avail, - ch->write_avail, ch->rx_pending_bytes, - ch->statistics.total_read_times, - ch->statistics.total_notifs); - } /* end loop over all channels */ - - } /* end loop over all devices */ - - /* reading from client and printing is_host_ok_to_sleep per device */ - for (j = 0 ; j < MAX_NUM_OF_SDIO_DEVICES ; ++j) { - struct sdio_al_device *sdio_al_dev = sdio_al->devices[j]; - - if (sdio_al_verify_func1(sdio_al_dev, __func__)) - continue; - - if (!sdio_al_dev->host) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": Host is NULL"); - continue; - } - - if (sdio_al_dev->lpm_chan == INVALID_SDIO_CHAN) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": %s - for Card#%d, is lpm_chan==" - "INVALID_SDIO_CHAN. continuing...", - __func__, sdio_al_dev->host->index); - continue; - } - - offset = offsetof(struct peer_sdioc_sw_mailbox, ch_config)+ - sizeof(struct peer_sdioc_channel_config) * - sdio_al_dev->lpm_chan+ - offsetof(struct peer_sdioc_channel_config, is_host_ok_to_sleep); - - lpm_func = sdio_al_dev->card->sdio_func[sdio_al_dev-> - lpm_chan+1]; - if (!lpm_func) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": %s - lpm_func is NULL for card#%d" - " continuing...\n", __func__, - sdio_al_dev->host->index); - continue; - } - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return; - ret = sdio_memcpy_fromio(lpm_func, - &is_ok_to_sleep, - SDIOC_SW_MAILBOX_ADDR+offset, - sizeof(int)); - sdio_al_release_mutex(sdio_al_dev, __func__); - - if (ret) - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": %s - fail to read " - "is_HOST_ok_to_sleep from mailbox for card %d", - __func__, sdio_al_dev->host->index); - else - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": Card#%d: " - "is_HOST_ok_to_sleep=%d\n", - sdio_al_dev->host->index, - is_ok_to_sleep); - } - - for (j = 0 ; j < MAX_NUM_OF_SDIO_DEVICES ; ++j) { - struct sdio_al_device *sdio_al_dev = sdio_al->devices[j]; - - if (!sdio_al_dev) - continue; - - /* Reading HW Mailbox */ - hw_mailbox = sdio_al_dev->mailbox; - - if (sdio_al_claim_mutex_and_verify_dev(sdio_al_dev, __func__)) - return; - - if (!sdio_al_dev->card || !sdio_al_dev->card->sdio_func[0]) { - sdio_al_release_mutex(sdio_al_dev, __func__); - return; - } - func1 = sdio_al_dev->card->sdio_func[0]; - ret = sdio_memcpy_fromio(func1, hw_mailbox, - HW_MAILBOX_ADDR, sizeof(*hw_mailbox)); - sdio_al_release_mutex(sdio_al_dev, __func__); - - if (ret) { - sdio_al_loge(sdio_al_dev->dev_log, MODULE_NAME - ": fail to read " - "mailbox for card#%d. " - "continuing...\n", - sdio_al_dev->host->index); - continue; - } - - snprintf(buf, sizeof(buf), "Card#%d: Current HW MB", - sdio_al_dev->host->index); - - /* Printing HW Mailbox */ - sdio_print_mailbox(buf, hw_mailbox); - } -} - -static struct sdio_device_id sdio_al_sdioid[] = { - {.class = 0, .vendor = 0x70, .device = 0x2460}, - {.class = 0, .vendor = 0x70, .device = 0x0460}, - {.class = 0, .vendor = 0x70, .device = 0x23F1}, - {.class = 0, .vendor = 0x70, .device = 0x23F0}, - {} -}; - -static struct sdio_driver sdio_al_sdiofn_driver = { - .name = "sdio_al_sdiofn", - .id_table = sdio_al_sdioid, - .probe = sdio_al_sdio_probe, - .remove = sdio_al_sdio_remove, -}; - -#ifdef CONFIG_MSM_SUBSYSTEM_RESTART -/* - * Callback for notifications from restart mudule. - * This function handles only the BEFORE_RESTART notification. - * Stop all the activity on the card and notify our clients. - */ -static int sdio_al_subsys_notifier_cb(struct notifier_block *this, - unsigned long notif_type, - void *data) -{ - if (notif_type != SUBSYS_BEFORE_SHUTDOWN) { - sdio_al_logi(&sdio_al->gen_log, MODULE_NAME ": %s: got " - "notification %ld", __func__, notif_type); - return NOTIFY_DONE; - } - - sdio_al_reset(); - return NOTIFY_OK; -} - -static struct notifier_block sdio_al_nb = { - .notifier_call = sdio_al_subsys_notifier_cb, -}; -#endif - -/** - * Module Init. - * - * @warn: allocate sdio_al context before registering driver. - * - */ -static int __init sdio_al_init(void) -{ - int ret = 0; - int i; - - pr_debug(MODULE_NAME ":sdio_al_init\n"); - - pr_info(MODULE_NAME ":SDIO-AL SW version %s\n", - DRV_VERSION); - - sdio_al = kzalloc(sizeof(struct sdio_al), GFP_KERNEL); - if (sdio_al == NULL) - return -ENOMEM; - - for (i = 0; i < MAX_NUM_OF_SDIO_DEVICES ; ++i) - sdio_al->devices[i] = NULL; - - sdio_al->unittest_mode = false; - - sdio_al->debug.debug_lpm_on = debug_lpm_on; - sdio_al->debug.debug_data_on = debug_data_on; - sdio_al->debug.debug_close_on = debug_close_on; - -#ifdef CONFIG_DEBUG_FS - sdio_al_debugfs_init(); -#endif - - -#ifdef CONFIG_MSM_SUBSYSTEM_RESTART - sdio_al->subsys_notif_handle = subsys_notif_register_notifier( - "external_modem", &sdio_al_nb); -#endif - - ret = platform_driver_register(&msm_sdio_al_driver); - if (ret) { - pr_err(MODULE_NAME ": platform_driver_register failed: %d\n", - ret); - goto exit; - } - - sdio_register_driver(&sdio_al_sdiofn_driver); - - spin_lock_init(&sdio_al->gen_log.log_lock); - -exit: - if (ret) - kfree(sdio_al); - return ret; -} - -/** - * Module Exit. - * - * Free allocated memory. - * Disable SDIO-Card. - * Unregister driver. - * - */ -static void __exit sdio_al_exit(void) -{ - if (sdio_al == NULL) - return; - - pr_debug(MODULE_NAME ":sdio_al_exit\n"); - -#ifdef CONFIG_MSM_SUBSYSTEM_RESTART - subsys_notif_unregister_notifier( - sdio_al->subsys_notif_handle, &sdio_al_nb); -#endif - - sdio_al_tear_down(); - - sdio_unregister_driver(&sdio_al_sdiofn_driver); - - kfree(sdio_al); - -#ifdef CONFIG_DEBUG_FS - sdio_al_debugfs_cleanup(); -#endif - - platform_driver_unregister(&msm_sdio_al_driver); - - pr_debug(MODULE_NAME ":sdio_al_exit complete\n"); -} - -module_init(sdio_al_init); -module_exit(sdio_al_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SDIO Abstraction Layer"); -MODULE_AUTHOR("Amir Samuelov "); -MODULE_VERSION(DRV_VERSION); - diff --git a/arch/arm/mach-msm/sdio_al_dloader.c b/arch/arm/mach-msm/sdio_al_dloader.c deleted file mode 100644 index f3effa8b25b9..000000000000 --- a/arch/arm/mach-msm/sdio_al_dloader.c +++ /dev/null @@ -1,2574 +0,0 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * SDIO-Downloader - * - * To be used with Qualcomm's SDIO-Client connected to this host. - */ - -/* INCLUDES */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "sdio_al_private.h" -#include -#include -#include -#include -#include -#include - -/* DEFINES AND MACROS */ -#define MAX_NUM_DEVICES 1 -#define TTY_SDIO_DEV "tty_sdio_0" -#define TTY_SDIO_DEV_TEST "tty_sdio_test_0" -#define SDIOC_MAILBOX_ADDRESS 0 -#define SDIO_DL_BLOCK_SIZE 512 -#define SDIO_DL_MAIN_THREAD_NAME "sdio_tty_main_thread" -#define SDIOC_DL_BUFF_ADDRESS 0 -#define SDIOC_UP_BUFF_ADDRESS 0x4 -#define SDIOC_DL_BUFF_SIZE_OFFSET 0x8 -#define SDIOC_UP_BUFF_SIZE_OFFSET 0xC -#define SDIOC_DL_WR_PTR 0x10 -#define SDIOC_DL_RD_PTR 0x14 -#define SDIOC_UL_WR_PTR 0x18 -#define SDIOC_UL_RD_PTR 0x1C -#define SDIOC_EXIT_PTR 0x20 -#define SDIOC_OP_MODE_PTR 0x24 -#define SDIOC_PTRS_OFFSET 0x10 -#define SDIOC_PTR_REGS_SIZE 0x10 -#define SDIOC_CFG_REGS_SIZE 0x10 -#define WRITE_RETRIES 0xFFFFFFFF -#define INPUT_SPEED 4800 -#define OUTPUT_SPEED 4800 -#define SDIOC_EXIT_CODE 0xDEADDEAD -#define SLEEP_MS 10 -#define PRINTING_GAP 200 -#define TIMER_DURATION 10 -#define PUSH_TIMER_DURATION 5000 -#define MULTIPLE_RATIO 1 -#define MS_IN_SEC 1000 -#define BITS_IN_BYTE 8 -#define BYTES_IN_KB 1024 -#define WRITE_TILL_END_RETRIES 5 -#define SDIO_DLD_NORMAL_MODE_NAME "SDIO DLD NORMAL MODE" -#define SDIO_DLD_BOOT_TEST_MODE_NAME "SDIO DLD BOOT TEST MODE" -#define SDIO_DLD_AMSS_TEST_MODE_NAME "SDIO DLD AMSS TEST MODE" -#define TEST_NAME_MAX_SIZE 30 -#define PUSH_STRING -#define SDIO_DLD_OUTGOING_BUFFER_SIZE (48*1024*MULTIPLE_RATIO) - -/* FORWARD DECLARATIONS */ -static int sdio_dld_open(struct tty_struct *tty, struct file *file); -static void sdio_dld_close(struct tty_struct *tty, struct file *file); -static int sdio_dld_write_callback(struct tty_struct *tty, - const unsigned char *buf, int count); -static int sdio_dld_write_room(struct tty_struct *tty); -static int sdio_dld_main_task(void *card); -static void sdio_dld_print_info(void); -#ifdef CONFIG_DEBUG_FS -static int sdio_dld_debug_info_open(struct inode *inode, struct file *file); -static ssize_t sdio_dld_debug_info_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -#endif - -static void sdio_dld_tear_down(struct work_struct *work); -DECLARE_WORK(cleanup, sdio_dld_tear_down); - -/* STRUCTURES AND TYPES */ -enum sdio_dld_op_mode { - SDIO_DLD_NO_MODE = 0, - SDIO_DLD_NORMAL_MODE = 1, - SDIO_DLD_BOOT_TEST_MODE = 2, - SDIO_DLD_AMSS_TEST_MODE = 3, - SDIO_DLD_NUM_OF_MODES, -}; - -struct sdioc_reg_sequential_chunk_ptrs { - unsigned int dl_wr_ptr; - unsigned int dl_rd_ptr; - unsigned int up_wr_ptr; - unsigned int up_rd_ptr; -}; - -struct sdioc_reg_sequential_chunk_cfg { - unsigned int dl_buff_address; - unsigned int up_buff_address; - unsigned int dl_buff_size; - unsigned int ul_buff_size; -}; - -struct sdioc_reg { - unsigned int reg_val; - unsigned int reg_offset; -}; - -struct sdioc_reg_chunk { - struct sdioc_reg dl_buff_address; - struct sdioc_reg up_buff_address; - struct sdioc_reg dl_buff_size; - struct sdioc_reg ul_buff_size; - struct sdioc_reg dl_wr_ptr; - struct sdioc_reg dl_rd_ptr; - struct sdioc_reg up_wr_ptr; - struct sdioc_reg up_rd_ptr; - struct sdioc_reg good_to_exit_ptr; -}; - -struct sdio_data { - char *data; - int offset_read_p; - int offset_write_p; - int buffer_size; - int num_of_bytes_in_use; -}; - -struct sdio_dld_data { - struct sdioc_reg_chunk sdioc_reg; - struct sdio_data incoming_data; - struct sdio_data outgoing_data; -}; - -struct sdio_dld_wait_event { - wait_queue_head_t wait_event; - int wake_up_signal; -}; - -struct sdio_dld_task { - struct task_struct *dld_task; - const char *task_name; - struct sdio_dld_wait_event exit_wait; - atomic_t please_close; -}; - -#ifdef CONFIG_DEBUG_FS -struct sdio_dloader_debug { - struct dentry *sdio_dld_debug_root; - struct dentry *sdio_al_dloader; -}; - -const struct file_operations sdio_dld_debug_info_ops = { - .open = sdio_dld_debug_info_open, - .write = sdio_dld_debug_info_write, -}; -#endif - -struct sdio_downloader { - int sdioc_boot_func; - struct sdio_dld_wait_event write_callback_event; - struct sdio_dld_task dld_main_thread; - struct tty_driver *tty_drv; - struct tty_struct *tty_str; - struct sdio_dld_data sdio_dloader_data; - struct mmc_card *card; - int(*done_callback)(void); - struct sdio_dld_wait_event main_loop_event; - struct timer_list timer; - unsigned int poll_ms; - struct timer_list push_timer; - unsigned int push_timer_ms; - enum sdio_dld_op_mode op_mode; - char op_mode_name[TEST_NAME_MAX_SIZE]; -}; - -struct sdio_dld_global_info { - int global_bytes_write_toio; - int global_bytes_write_tty; - int global_bytes_read_fromio; - int global_bytes_push_tty; - u64 start_time; - u64 end_time; - u64 delta_jiffies; - unsigned int time_msec; - unsigned int throughput; - int cl_dl_wr_ptr; - int cl_dl_rd_ptr; - int cl_up_wr_ptr; - int cl_up_rd_ptr; - int host_read_ptr; - int host_write_ptr; - int cl_dl_buffer_size; - int cl_up_buffer_size; - int host_outgoing_buffer_size; - int cl_dl_buffer_address; - int cl_up_buffer_address; -}; - -static const struct tty_operations sdio_dloader_tty_ops = { - .open = sdio_dld_open, - .close = sdio_dld_close, - .write = sdio_dld_write_callback, - .write_room = sdio_dld_write_room, -}; - -/* GLOBAL VARIABLES */ -struct sdio_downloader *sdio_dld; -struct sdio_dld_global_info sdio_dld_info; -static char outgoing_data_buffer[SDIO_DLD_OUTGOING_BUFFER_SIZE]; - -static DEFINE_SPINLOCK(lock1); -static unsigned long lock_flags1; -static DEFINE_SPINLOCK(lock2); -static unsigned long lock_flags2; - -static atomic_t sdio_dld_in_use = ATOMIC_INIT(0); -static atomic_t sdio_dld_setup_done = ATOMIC_INIT(0); - -/* - * sdio_op_mode sets the operation mode of the sdio_dloader - - * it may be in NORMAL_MODE, BOOT_TEST_MODE or AMSS_TEST_MODE - */ -static int sdio_op_mode = (int)SDIO_DLD_NORMAL_MODE; -module_param(sdio_op_mode, int, 0); - -#ifdef CONFIG_DEBUG_FS - -struct sdio_dloader_debug sdio_dld_debug; - -#define ARR_SIZE 30000 -#define SDIO_DLD_DEBUGFS_INIT_VALUE 87654321 -#define SDIO_DLD_DEBUGFS_CASE_1_CODE 11111111 -#define SDIO_DLD_DEBUGFS_CASE_2_CODE 22222222 -#define SDIO_DLD_DEBUGFS_CASE_3_CODE 33333333 -#define SDIO_DLD_DEBUGFS_CASE_4_CODE 44444444 -#define SDIO_DLD_DEBUGFS_CASE_5_CODE 55555555 -#define SDIO_DLD_DEBUGFS_CASE_6_CODE 66666666 -#define SDIO_DLD_DEBUGFS_CASE_7_CODE 77777777 -#define SDIO_DLD_DEBUGFS_CASE_8_CODE 88888888 -#define SDIO_DLD_DEBUGFS_CASE_9_CODE 99999999 -#define SDIO_DLD_DEBUGFS_CASE_10_CODE 10101010 -#define SDIO_DLD_DEBUGFS_CASE_11_CODE 11001100 -#define SDIO_DLD_DEBUGFS_CASE_12_CODE 12001200 -#define SDIO_DLD_DEBUGFS_LOOP_WAIT 7 -#define SDIO_DLD_DEBUGFS_LOOP_WAKEUP 8 -#define SDIO_DLD_DEBUGFS_CB_WAIT 3 -#define SDIO_DLD_DEBUGFS_CB_WAKEUP 4 - -static int curr_index; -struct ptrs { - int h_w_ptr; - int h_r_ptr; - int c_u_w_ptr; - int c_u_r_ptr; - int code; - int h_has_to_send; - int c_has_to_receive; - int min_of; - int reserve2; - int tty_count; - int write_tty; - int write_toio; - int loop_wait_wake; - int cb_wait_wake; - int c_d_w_ptr; - int c_d_r_ptr; - int to_read; - int push_to_tty; - int global_tty_send; - int global_sdio_send; - int global_tty_received; - int global_sdio_received; - int reserve22; - int reserve23; - int reserve24; - int reserve25; - int reserve26; - int reserve27; - int reserve28; - int reserve29; - int reserve30; - int reserve31; -}; - -struct global_data { - int curr_i; - int duration_ms; - int global_bytes_sent; - int throughput_Mbs; - int host_outgoing_buffer_size_KB; - int client_up_buffer_size_KB; - int client_dl_buffer_size_KB; - int client_dl_buffer_address; - int client_up_buffer_address; - int global_bytes_received; - int global_bytes_pushed; - int reserve11; - int reserve12; - int reserve13; - int reserve14; - int reserve15; - int reserve16; - int reserve17; - int reserve18; - int reserve19; - int reserve20; - int reserve21; - int reserve22; - int reserve23; - int reserve24; - int reserve25; - int reserve26; - int reserve27; - int reserve28; - int reserve29; - int reserve30; - int reserve31; - struct ptrs ptr_array[ARR_SIZE]; -}; - -static struct global_data gd; -static struct debugfs_blob_wrapper blob; -static struct dentry *root; -static struct dentry *dld; - -struct debugfs_global { - int global_8k_has; - int global_9k_has; - int global_min; - int global_count; - int global_write_tty; - int global_write_toio; - int global_bytes_cb_tty; - int global_to_read; - int global_push_to_tty; - int global_tty_send; - int global_sdio_send; - int global_sdio_received; - int global_tty_push; -}; - -static struct debugfs_global debugfs_glob; - -static void update_standard_fields(int index) -{ - - gd.ptr_array[index].global_tty_send = - sdio_dld_info.global_bytes_write_tty; - gd.ptr_array[index].global_sdio_send = - sdio_dld_info.global_bytes_write_toio; - gd.ptr_array[index].global_tty_received = - sdio_dld_info.global_bytes_push_tty; - gd.ptr_array[index].global_sdio_received = - sdio_dld_info.global_bytes_read_fromio; -} - -static void update_gd(int code) -{ - struct sdioc_reg_chunk *reg_str = - &sdio_dld->sdio_dloader_data.sdioc_reg; - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - int index = curr_index%ARR_SIZE; - - gd.curr_i = curr_index; - gd.duration_ms = 0; - gd.global_bytes_sent = 0; - gd.throughput_Mbs = 0; - gd.host_outgoing_buffer_size_KB = 0; - gd.client_up_buffer_size_KB = 0; - gd.client_dl_buffer_size_KB = 0; - gd.client_dl_buffer_address = 0; - gd.client_up_buffer_address = 0; - gd.global_bytes_received = 0; - gd.global_bytes_pushed = 0; - gd.reserve11 = 0; - gd.reserve12 = 0; - gd.reserve13 = 0; - gd.reserve14 = 0; - gd.reserve15 = 0; - gd.reserve16 = 0; - gd.reserve17 = 0; - gd.reserve18 = 0; - gd.reserve19 = 0; - gd.reserve20 = 0; - gd.reserve21 = 0; - gd.reserve22 = 0; - gd.reserve23 = 0; - gd.reserve24 = 0; - gd.reserve25 = 0; - gd.reserve26 = 0; - gd.reserve27 = 0; - gd.reserve28 = 0; - gd.reserve29 = 0; - gd.reserve30 = 0; - gd.reserve31 = 0; - - gd.ptr_array[index].h_w_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*0*/ - gd.ptr_array[index].h_r_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*1*/ - gd.ptr_array[index].c_u_w_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*2*/ - gd.ptr_array[index].c_u_r_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*3*/ - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_INIT_VALUE; /*4*/ - gd.ptr_array[index].h_has_to_send = SDIO_DLD_DEBUGFS_INIT_VALUE;/*5*/ - gd.ptr_array[index].c_has_to_receive = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*6*/ - gd.ptr_array[index].min_of = SDIO_DLD_DEBUGFS_INIT_VALUE; /*7*/ - gd.ptr_array[index].reserve2 = SDIO_DLD_DEBUGFS_INIT_VALUE; /*8*/ - gd.ptr_array[index].tty_count = SDIO_DLD_DEBUGFS_INIT_VALUE; /*9*/ - gd.ptr_array[index].write_tty = SDIO_DLD_DEBUGFS_INIT_VALUE; /*A*/ - gd.ptr_array[index].write_toio = SDIO_DLD_DEBUGFS_INIT_VALUE; /*B*/ - gd.ptr_array[index].loop_wait_wake = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*C*/ - gd.ptr_array[index].cb_wait_wake = SDIO_DLD_DEBUGFS_INIT_VALUE; /*D*/ - gd.ptr_array[index].c_d_w_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*E*/ - gd.ptr_array[index].c_d_r_ptr = SDIO_DLD_DEBUGFS_INIT_VALUE; /*F*/ - gd.ptr_array[index].to_read = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x10*/ - gd.ptr_array[index].push_to_tty = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x11*/ - gd.ptr_array[index].global_tty_send = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x12*/ - gd.ptr_array[index].global_sdio_send = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x13*/ - gd.ptr_array[index].global_tty_received = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x14*/ - gd.ptr_array[index].global_sdio_received = - SDIO_DLD_DEBUGFS_INIT_VALUE; /*0x15*/ - gd.ptr_array[index].reserve22 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve23 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve24 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve25 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve26 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve27 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve28 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve29 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve30 = SDIO_DLD_DEBUGFS_INIT_VALUE; - gd.ptr_array[index].reserve31 = SDIO_DLD_DEBUGFS_INIT_VALUE; - - switch (code) { - case SDIO_DLD_DEBUGFS_CASE_1_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_1_CODE; - gd.ptr_array[index].h_w_ptr = outgoing->offset_write_p; - gd.ptr_array[index].h_r_ptr = outgoing->offset_read_p; - gd.ptr_array[index].c_u_w_ptr = reg_str->up_wr_ptr.reg_val; - gd.ptr_array[index].c_u_r_ptr = reg_str->up_rd_ptr.reg_val; - gd.ptr_array[index].c_d_w_ptr = reg_str->dl_wr_ptr.reg_val; - gd.ptr_array[index].c_d_r_ptr = reg_str->dl_rd_ptr.reg_val; - break; - - case SDIO_DLD_DEBUGFS_CASE_2_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_2_CODE; - gd.ptr_array[index].c_u_r_ptr = reg_str->up_rd_ptr.reg_val; - gd.ptr_array[index].c_u_w_ptr = reg_str->up_wr_ptr.reg_val; - gd.ptr_array[index].h_has_to_send = debugfs_glob.global_8k_has; - gd.ptr_array[index].c_has_to_receive = - debugfs_glob.global_9k_has; - gd.ptr_array[index].min_of = debugfs_glob.global_min; - break; - - case SDIO_DLD_DEBUGFS_CASE_3_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_3_CODE; - gd.ptr_array[index].h_w_ptr = outgoing->offset_write_p; - gd.ptr_array[index].h_r_ptr = outgoing->offset_read_p; - gd.ptr_array[index].write_tty = debugfs_glob.global_write_tty; - break; - - case SDIO_DLD_DEBUGFS_CASE_4_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_4_CODE; - gd.ptr_array[index].h_w_ptr = outgoing->offset_write_p; - gd.ptr_array[index].h_r_ptr = outgoing->offset_read_p; - gd.ptr_array[index].c_u_r_ptr = reg_str->up_rd_ptr.reg_val; - gd.ptr_array[index].c_u_w_ptr = reg_str->up_wr_ptr.reg_val; - gd.ptr_array[index].write_toio = - debugfs_glob.global_write_toio; - break; - - case SDIO_DLD_DEBUGFS_CASE_5_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_5_CODE; - gd.ptr_array[index].tty_count = debugfs_glob.global_count; - break; - - case SDIO_DLD_DEBUGFS_CASE_6_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_6_CODE; - gd.ptr_array[index].loop_wait_wake = 7; - break; - - case SDIO_DLD_DEBUGFS_CASE_7_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_7_CODE; - gd.ptr_array[index].loop_wait_wake = 8; - break; - - case SDIO_DLD_DEBUGFS_CASE_8_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_8_CODE; - gd.ptr_array[index].cb_wait_wake = 3; - break; - - case SDIO_DLD_DEBUGFS_CASE_9_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_9_CODE; - gd.ptr_array[index].cb_wait_wake = 4; - break; - - case SDIO_DLD_DEBUGFS_CASE_10_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_10_CODE; - gd.ptr_array[index].cb_wait_wake = - debugfs_glob.global_bytes_cb_tty; - break; - - case SDIO_DLD_DEBUGFS_CASE_11_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_11_CODE; - gd.ptr_array[index].to_read = debugfs_glob.global_to_read; - break; - - case SDIO_DLD_DEBUGFS_CASE_12_CODE: - gd.ptr_array[index].code = SDIO_DLD_DEBUGFS_CASE_12_CODE; - gd.ptr_array[index].push_to_tty = - debugfs_glob.global_push_to_tty; - break; - - default: - break; - } - update_standard_fields(index); - curr_index++; -} - -static int bootloader_debugfs_init(void) -{ - /* /sys/kernel/debug/bootloader there will be dld_arr file */ - root = debugfs_create_dir("bootloader", NULL); - if (!root) { - pr_info(MODULE_NAME ": %s - creating root dir " - "failed\n", __func__); - return -ENODEV; - } - - blob.data = &gd; - blob.size = sizeof(struct global_data); - dld = debugfs_create_blob("dld_arr", S_IRUGO, root, &blob); - if (!dld) { - debugfs_remove_recursive(root); - pr_err(MODULE_NAME ": %s, failed to create debugfs entry\n", - __func__); - return -ENODEV; - } - - return 0; -} - -/* -* for triggering the sdio_dld info use: -* echo 1 > /sys/kernel/debug/sdio_al_dld/sdio_al_dloader_info -*/ -static int sdio_dld_debug_init(void) -{ - sdio_dld_debug.sdio_dld_debug_root = - debugfs_create_dir("sdio_al_dld", NULL); - if (!sdio_dld_debug.sdio_dld_debug_root) { - pr_err(MODULE_NAME ": %s - Failed to create folder. " - "sdio_dld_debug_root is NULL", - __func__); - return -ENOENT; - } - - sdio_dld_debug.sdio_al_dloader = debugfs_create_file( - "sdio_al_dloader_info", - S_IRUGO | S_IWUGO, - sdio_dld_debug.sdio_dld_debug_root, - NULL, - &sdio_dld_debug_info_ops); - - if (!sdio_dld_debug.sdio_al_dloader) { - pr_err(MODULE_NAME ": %s - Failed to create a file. " - "sdio_al_dloader is NULL", - __func__); - debugfs_remove(sdio_dld_debug.sdio_dld_debug_root); - sdio_dld_debug.sdio_dld_debug_root = NULL; - return -ENOENT; - } - - return 0; -} - -static int sdio_dld_debug_info_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t sdio_dld_debug_info_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - sdio_dld_print_info(); - return count; -} -#endif /* CONFIG_DEBUG_FS */ - -static void sdio_dld_print_info(void) -{ - - sdio_dld_info.end_time = get_jiffies_64(); /* read the current time */ - sdio_dld_info.delta_jiffies = - sdio_dld_info.end_time - sdio_dld_info.start_time; - sdio_dld_info.time_msec = jiffies_to_msecs(sdio_dld_info.delta_jiffies); - - sdio_dld_info.throughput = sdio_dld_info.global_bytes_write_toio * - BITS_IN_BYTE / sdio_dld_info.time_msec; - sdio_dld_info.throughput /= MS_IN_SEC; - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - DURATION IN MSEC = %d\n", - __func__, - sdio_dld_info.time_msec); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - BYTES WRITTEN ON SDIO BUS " - "= %d...BYTES SENT BY TTY = %d", - __func__, - sdio_dld_info.global_bytes_write_toio, - sdio_dld_info.global_bytes_write_tty); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - BYTES RECEIVED ON SDIO BUS " - "= %d...BYTES SENT TO TTY = %d", - __func__, - sdio_dld_info.global_bytes_read_fromio, - sdio_dld_info.global_bytes_push_tty); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - THROUGHPUT=%d Mbit/Sec", - __func__, sdio_dld_info.throughput); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT DL_BUFFER_SIZE=%d" - " KB..CLIENT UL_BUFFER=%d KB\n", - __func__, - sdio_dld_info.cl_dl_buffer_size/BYTES_IN_KB, - sdio_dld_info.cl_up_buffer_size/BYTES_IN_KB); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - HOST OUTGOING BUFFER_SIZE" - "=%d KB", - __func__, - sdio_dld_info.host_outgoing_buffer_size/BYTES_IN_KB); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT DL BUFFER " - "ADDRESS = 0x%x", __func__, - sdio_dld_info.cl_dl_buffer_address); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT UP BUFFER " - "ADDRESS = 0x%x", - __func__, - sdio_dld_info.cl_up_buffer_address); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT - UPLINK BUFFER - " - "READ POINTER = %d", __func__, - sdio_dld_info.cl_up_rd_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT - UPLINK BUFFER - " - "WRITE POINTER = %d", __func__, - sdio_dld_info.cl_up_wr_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT - DOWNLINK BUFFER - " - "READ POINTER = %d", __func__, - sdio_dld_info.cl_dl_rd_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - CLIENT - DOWNLINK BUFFER - " - "WRITE POINTER = %d", __func__, - sdio_dld_info.cl_dl_wr_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - HOST - OUTGOING BUFFER - " - "READ POINTER = %d", __func__, - sdio_dld_info.host_read_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - HOST - OUTGOING BUFFER - " - "WRITE POINTER = %d", __func__, - sdio_dld_info.host_write_ptr); - - pr_info(MODULE_NAME ": %s, FLASHLESS BOOT - END DEBUG INFO", __func__); -} - -/** - * sdio_dld_set_op_mode - * sets the op_mode and the name of the op_mode. Also, in case - * it's invalid mode sets op_mode to SDIO_DLD_NORMAL_MODE - * - * @op_mode: the operation mode to be set - * @return NONE - */ -static void sdio_dld_set_op_mode(enum sdio_dld_op_mode op_mode) -{ - sdio_dld->op_mode = op_mode; - - switch (op_mode) { - case SDIO_DLD_NORMAL_MODE: - memcpy(sdio_dld->op_mode_name, - SDIO_DLD_NORMAL_MODE_NAME, TEST_NAME_MAX_SIZE); - break; - case SDIO_DLD_BOOT_TEST_MODE: - memcpy(sdio_dld->op_mode_name, - SDIO_DLD_BOOT_TEST_MODE_NAME, TEST_NAME_MAX_SIZE); - break; - case SDIO_DLD_AMSS_TEST_MODE: - memcpy(sdio_dld->op_mode_name, - SDIO_DLD_AMSS_TEST_MODE_NAME, TEST_NAME_MAX_SIZE); - break; - default: - sdio_dld->op_mode = SDIO_DLD_NORMAL_MODE; - pr_err(MODULE_NAME ": %s - Invalid Op_Mode = %d. Settings " - "Op_Mode to default - NORMAL_MODE\n", - __func__, op_mode); - memcpy(sdio_dld->op_mode_name, - SDIO_DLD_NORMAL_MODE_NAME, TEST_NAME_MAX_SIZE); - break; - } - - if (sdio_dld->op_mode_name != NULL) { - pr_info(MODULE_NAME ": %s - FLASHLESS BOOT - Op_Mode is set to " - "%s\n", __func__, sdio_dld->op_mode_name); - } else { - pr_info(MODULE_NAME ": %s - FLASHLESS BOOT - op_mode_name is " - "NULL\n", __func__); - } -} - -/** - * sdio_dld_allocate_local_buffers - * allocates local outgoing and incoming buffers and also sets - * threshold for outgoing data. - * - * @return 0 on success or negative value on error. - */ -static int sdio_dld_allocate_local_buffers(void) -{ - struct sdioc_reg_chunk *reg_str = &sdio_dld->sdio_dloader_data. - sdioc_reg; - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - struct sdio_data *incoming = &sdio_dld->sdio_dloader_data.incoming_data; - - incoming->data = - kzalloc(reg_str->dl_buff_size.reg_val, GFP_KERNEL); - - if (!incoming->data) { - pr_err(MODULE_NAME ": %s - param ""incoming->data"" is NULL. " - "Couldn't allocate incoming_data local buffer\n", - __func__); - return -ENOMEM; - } - - incoming->buffer_size = reg_str->dl_buff_size.reg_val; - - outgoing->data = outgoing_data_buffer; - - outgoing->buffer_size = SDIO_DLD_OUTGOING_BUFFER_SIZE; - - if (outgoing->buffer_size != - reg_str->ul_buff_size.reg_val*MULTIPLE_RATIO) { - pr_err(MODULE_NAME ": %s - HOST outgoing buffer size (%d bytes)" - "must be a multiple of ClIENT uplink buffer size (%d " - "bytes). HOST_SIZE == n*CLIENT_SIZE.(n=1,2,3...)\n", - __func__, - SDIO_DLD_OUTGOING_BUFFER_SIZE, - reg_str->ul_buff_size.reg_val); - kfree(incoming->data); - return -EINVAL; - } - - /* keep sdio_dld_info up to date */ - sdio_dld_info.host_outgoing_buffer_size = outgoing->buffer_size; - - return 0; -} - -/** - * sdio_dld_dealloc_local_buffers frees incoming and outgoing - * buffers. - * - * @return None. - */ -static void sdio_dld_dealloc_local_buffers(void) -{ - kfree((void *)sdio_dld->sdio_dloader_data.incoming_data.data); -} - -/** - * mailbox_to_seq_chunk_read_cfg - * reads 4 configuration registers of mailbox from str_func, as - * a sequentail chunk in memory, and updates global struct - * accordingly. - * - * @str_func: a pointer to func struct. - * @return 0 on success or negative value on error. - */ -static int mailbox_to_seq_chunk_read_cfg(struct sdio_func *str_func) -{ - struct sdioc_reg_sequential_chunk_cfg seq_chunk; - struct sdioc_reg_chunk *reg = &sdio_dld->sdio_dloader_data.sdioc_reg; - int status = 0; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_claim_host(str_func); - - /* reading SDIOC_MAILBOX_SIZE bytes from SDIOC_MAILBOX_ADDRESS */ - status = sdio_memcpy_fromio(str_func, - (void *)&seq_chunk, - SDIOC_MAILBOX_ADDRESS, - SDIOC_CFG_REGS_SIZE); - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_fromio()" - " READING CFG MAILBOX failed. status=%d.\n", - __func__, status); - } - - sdio_release_host(str_func); - - reg->dl_buff_address.reg_val = seq_chunk.dl_buff_address; - reg->up_buff_address.reg_val = seq_chunk.up_buff_address; - reg->dl_buff_size.reg_val = seq_chunk.dl_buff_size; - reg->ul_buff_size.reg_val = seq_chunk.ul_buff_size; - - /* keep sdio_dld_info up to date */ - sdio_dld_info.cl_dl_buffer_size = seq_chunk.dl_buff_size; - sdio_dld_info.cl_up_buffer_size = seq_chunk.ul_buff_size; - sdio_dld_info.cl_dl_buffer_address = seq_chunk.dl_buff_address; - sdio_dld_info.cl_up_buffer_address = seq_chunk.up_buff_address; - - return status; -} - -/** - * mailbox_to_seq_chunk_read_ptrs - * reads 4 pointers registers of mailbox from str_func, as a - * sequentail chunk in memory, and updates global struct - * accordingly. - * - * @str_func: a pointer to func struct. - * @return 0 on success or negative value on error. - */ -static int mailbox_to_seq_chunk_read_ptrs(struct sdio_func *str_func) -{ - struct sdioc_reg_sequential_chunk_ptrs seq_chunk; - struct sdioc_reg_chunk *reg = &sdio_dld->sdio_dloader_data.sdioc_reg; - int status = 0; - - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - static int counter = 1; - static int offset_write_p; - static int offset_read_p; - static int up_wr_ptr; - static int up_rd_ptr; - static int dl_wr_ptr; - static int dl_rd_ptr; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_claim_host(str_func); - - /* reading SDIOC_MAILBOX_SIZE bytes from SDIOC_MAILBOX_ADDRESS */ - status = sdio_memcpy_fromio(str_func, - (void *)&seq_chunk, - SDIOC_PTRS_OFFSET, - SDIOC_PTR_REGS_SIZE); - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_fromio()" - " READING PTRS MAILBOX failed. status=%d.\n", - __func__, status); - } - - sdio_release_host(str_func); - - reg->dl_rd_ptr.reg_val = seq_chunk.dl_rd_ptr; - reg->dl_wr_ptr.reg_val = seq_chunk.dl_wr_ptr; - reg->up_rd_ptr.reg_val = seq_chunk.up_rd_ptr; - reg->up_wr_ptr.reg_val = seq_chunk.up_wr_ptr; - - /* keeping sdio_dld_info up to date */ - sdio_dld_info.cl_dl_rd_ptr = seq_chunk.dl_rd_ptr; - sdio_dld_info.cl_dl_wr_ptr = seq_chunk.dl_wr_ptr; - sdio_dld_info.cl_up_rd_ptr = seq_chunk.up_rd_ptr; - sdio_dld_info.cl_up_wr_ptr = seq_chunk.up_wr_ptr; - - - /* DEBUG - if there was a change in value */ - if ((offset_write_p != outgoing->offset_write_p) || - (offset_read_p != outgoing->offset_read_p) || - (up_wr_ptr != reg->up_wr_ptr.reg_val) || - (up_rd_ptr != reg->up_rd_ptr.reg_val) || - (dl_wr_ptr != reg->dl_wr_ptr.reg_val) || - (dl_rd_ptr != reg->dl_rd_ptr.reg_val) || - (counter % PRINTING_GAP == 0)) { - counter = 1; - pr_debug(MODULE_NAME ": %s MailBox pointers: BLOCK_SIZE=%d, " - "hw=%d, hr=%d, cuw=%d, cur=%d, cdw=%d, cdr=%d\n", - __func__, - SDIO_DL_BLOCK_SIZE, - outgoing->offset_write_p, - outgoing->offset_read_p, - reg->up_wr_ptr.reg_val, - reg->up_rd_ptr.reg_val, - reg->dl_wr_ptr.reg_val, - reg->dl_rd_ptr.reg_val); - -#ifdef CONFIG_DEBUG_FS - update_gd(SDIO_DLD_DEBUGFS_CASE_1_CODE); -#endif - /* update static variables */ - offset_write_p = outgoing->offset_write_p; - offset_read_p = outgoing->offset_read_p; - up_wr_ptr = reg->up_wr_ptr.reg_val; - up_rd_ptr = reg->up_rd_ptr.reg_val; - dl_wr_ptr = reg->dl_wr_ptr.reg_val; - dl_rd_ptr = reg->dl_rd_ptr.reg_val; - } else { - counter++; - } - return status; -} - -/** - * sdio_dld_init_func - * enables the sdio func, and sets the func block size. - * - * @str_func: a pointer to func struct. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_init_func(struct sdio_func *str_func) -{ - int status1 = 0; - int status2 = 0; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_claim_host(str_func); - - status1 = sdio_enable_func(str_func); - if (status1) { - sdio_release_host(str_func); - pr_err(MODULE_NAME ": %s - sdio_enable_func() failed. " - "status=%d\n", __func__, status1); - return status1; - } - - status2 = sdio_set_block_size(str_func, SDIO_DL_BLOCK_SIZE); - if (status2) { - pr_err(MODULE_NAME ": %s - sdio_set_block_size() failed. " - "status=%d\n", __func__, status2); - status1 = sdio_disable_func(str_func); - if (status1) { - pr_err(MODULE_NAME ": %s - sdio_disable_func() " - "failed. status=%d\n", __func__, status1); - } - sdio_release_host(str_func); - return status2; - } - - sdio_release_host(str_func); - str_func->max_blksize = SDIO_DL_BLOCK_SIZE; - return 0; -} - -/** - * sdio_dld_allocate_buffers - * initializes the sdio func, and then reads the mailbox, in - * order to allocate incoming and outgoing buffers according to - * the size that was read from the mailbox. - * - * @str_func: a pointer to func struct. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_allocate_buffers(struct sdio_func *str_func) -{ - int status = 0; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - status = mailbox_to_seq_chunk_read_cfg(str_func); - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "mailbox_to_seq_chunk_read_cfg(). status=%d\n", - __func__, status); - return status; - } - - status = sdio_dld_allocate_local_buffers(); - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_dld_allocate_local_buffers(). status=%d\n", - __func__, status); - return status; - } - return 0; -} - -/** - * sdio_dld_create_thread - * creates thread and wakes it up. - * - * @return 0 on success or negative value on error. - */ -static int sdio_dld_create_thread(void) -{ - sdio_dld->dld_main_thread.task_name = SDIO_DL_MAIN_THREAD_NAME; - - sdio_dld->dld_main_thread.dld_task = - kthread_create(sdio_dld_main_task, - (void *)(sdio_dld->card), - sdio_dld->dld_main_thread.task_name); - - if (IS_ERR(sdio_dld->dld_main_thread.dld_task)) { - pr_err(MODULE_NAME ": %s - kthread_create() failed\n", - __func__); - return -ENOMEM; - } - wake_up_process(sdio_dld->dld_main_thread.dld_task); - return 0; -} - -/** - * start_timer - * sets the timer and starts. - * - * @timer: the timer to configure and add - * @ms: the ms until it expires - * @return None. - */ -static void start_timer(struct timer_list *timer, unsigned int ms) -{ - if ((ms == 0) || (timer == NULL)) { - pr_err(MODULE_NAME ": %s - invalid parameter", __func__); - } else { - timer->expires = jiffies + - msecs_to_jiffies(ms); - add_timer(timer); - } -} - -/** - * sdio_dld_timer_handler - * this is the timer handler. whenever it is invoked, it wakes - * up the main loop task, and the write callback, and starts - * the timer again. - * - * @data: a pointer to the tty device driver structure. - * @return None. - */ - -static void sdio_dld_timer_handler(unsigned long data) -{ - pr_debug(MODULE_NAME " Timer Expired\n"); - spin_lock_irqsave(&lock2, lock_flags2); - if (sdio_dld->main_loop_event.wake_up_signal == 0) { - sdio_dld->main_loop_event.wake_up_signal = 1; - wake_up(&sdio_dld->main_loop_event.wait_event); - } - spin_unlock_irqrestore(&lock2, lock_flags2); - - sdio_dld->write_callback_event.wake_up_signal = 1; - wake_up(&sdio_dld->write_callback_event.wait_event); - - start_timer(&sdio_dld->timer, sdio_dld->poll_ms); -} - -/** - * sdio_dld_push_timer_handler - * this is a timer handler of the push_timer. - * - * @data: a pointer to the tty device driver structure. - * @return None. - */ -static void sdio_dld_push_timer_handler(unsigned long data) -{ - pr_err(MODULE_NAME " %s - Push Timer Expired... Trying to " - "push data to TTY Core for over then %d ms.\n", - __func__, sdio_dld->push_timer_ms); -} - -/** - * sdio_dld_open - * this is the open callback of the tty driver. - * it initializes the sdio func, allocates the buffers, and - * creates the main thread. - * - * @tty: a pointer to the tty struct. - * @file: file descriptor. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_open(struct tty_struct *tty, struct file *file) -{ - int status = 0; - int func_in_array = - REAL_FUNC_TO_FUNC_IN_ARRAY(sdio_dld->sdioc_boot_func); - struct sdio_func *str_func = sdio_dld->card->sdio_func[func_in_array]; - - if (atomic_read(&sdio_dld_in_use) == 1) - return -EBUSY; - - atomic_set(&sdio_dld_in_use, 1); - sdio_dld->tty_str = tty; - sdio_dld->tty_str->low_latency = 1; - sdio_dld->tty_str->icanon = 0; - set_bit(TTY_NO_WRITE_SPLIT, &sdio_dld->tty_str->flags); - - pr_info(MODULE_NAME ": %s, TTY DEVICE FOR FLASHLESS BOOT OPENED\n", - __func__); - sdio_dld_info.start_time = get_jiffies_64(); /* read the current time */ - - if (!tty) { - pr_err(MODULE_NAME ": %s - param ""tty"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - atomic_set(&sdio_dld->dld_main_thread.please_close, 0); - sdio_dld->dld_main_thread.exit_wait.wake_up_signal = 0; - - status = sdio_dld_allocate_buffers(str_func); - if (status) { - pr_err(MODULE_NAME ": %s, failed in " - "sdio_dld_allocate_buffers(). status=%d\n", - __func__, status); - return status; - } - - /* init waiting event of the write callback */ - init_waitqueue_head(&sdio_dld->write_callback_event.wait_event); - - /* init waiting event of the main loop */ - init_waitqueue_head(&sdio_dld->main_loop_event.wait_event); - - /* configure and init the timer */ - sdio_dld->poll_ms = TIMER_DURATION; - init_timer(&sdio_dld->timer); - sdio_dld->timer.data = (unsigned long) sdio_dld; - sdio_dld->timer.function = sdio_dld_timer_handler; - sdio_dld->timer.expires = jiffies + - msecs_to_jiffies(sdio_dld->poll_ms); - add_timer(&sdio_dld->timer); - - sdio_dld->push_timer_ms = PUSH_TIMER_DURATION; - init_timer(&sdio_dld->push_timer); - sdio_dld->push_timer.data = (unsigned long) sdio_dld; - sdio_dld->push_timer.function = sdio_dld_push_timer_handler; - - status = sdio_dld_create_thread(); - if (status) { - del_timer_sync(&sdio_dld->timer); - del_timer_sync(&sdio_dld->push_timer); - sdio_dld_dealloc_local_buffers(); - pr_err(MODULE_NAME ": %s, failed in sdio_dld_create_thread()." - "status=%d\n", __func__, status); - return status; - } - return 0; -} - -/** - * sdio_dld_close - * this is the close callback of the tty driver. it requests - * the main thread to exit, and waits for notification of it. - * it also de-allocates the buffers, and unregisters the tty - * driver and device. - * - * @tty: a pointer to the tty struct. - * @file: file descriptor. - * @return None. - */ -static void sdio_dld_close(struct tty_struct *tty, struct file *file) -{ - struct sdioc_reg_chunk *reg = &sdio_dld->sdio_dloader_data.sdioc_reg; - - /* informing the SDIOC that it can exit boot phase */ - sdio_dld->sdio_dloader_data.sdioc_reg.good_to_exit_ptr.reg_val = - SDIOC_EXIT_CODE; - - atomic_set(&sdio_dld->dld_main_thread.please_close, 1); - - pr_debug(MODULE_NAME ": %s - CLOSING - WAITING...", __func__); - - wait_event(sdio_dld->dld_main_thread.exit_wait.wait_event, - sdio_dld->dld_main_thread.exit_wait.wake_up_signal); - pr_debug(MODULE_NAME ": %s - CLOSING - WOKE UP...", __func__); - -#ifdef CONFIG_DEBUG_FS - gd.curr_i = curr_index; - gd.duration_ms = sdio_dld_info.time_msec; - gd.global_bytes_sent = sdio_dld_info.global_bytes_write_toio; - gd.global_bytes_received = 0; - gd.throughput_Mbs = sdio_dld_info.throughput; - gd.host_outgoing_buffer_size_KB = sdio_dld->sdio_dloader_data. - outgoing_data.buffer_size/BYTES_IN_KB; - gd.client_up_buffer_size_KB = reg->ul_buff_size.reg_val/BYTES_IN_KB; - gd.client_dl_buffer_size_KB = reg->dl_buff_size.reg_val/BYTES_IN_KB; - gd.client_dl_buffer_address = reg->dl_buff_address.reg_val; - gd.client_up_buffer_address = reg->up_buff_address.reg_val; - gd.global_bytes_received = sdio_dld_info.global_bytes_read_fromio; - gd.global_bytes_pushed = sdio_dld_info.global_bytes_push_tty; -#endif - - /* saving register values before deallocating sdio_dld - in order to use it in sdio_dld_print_info() through shell command */ - sdio_dld_info.cl_dl_rd_ptr = reg->dl_rd_ptr.reg_val; - sdio_dld_info.cl_dl_wr_ptr = reg->dl_wr_ptr.reg_val; - sdio_dld_info.cl_up_rd_ptr = reg->up_rd_ptr.reg_val; - sdio_dld_info.cl_up_wr_ptr = reg->up_wr_ptr.reg_val; - - sdio_dld_info.host_read_ptr = - sdio_dld->sdio_dloader_data.outgoing_data.offset_read_p; - - sdio_dld_info.host_write_ptr = - sdio_dld->sdio_dloader_data.outgoing_data.offset_write_p; - - sdio_dld_info.cl_dl_buffer_size = - sdio_dld->sdio_dloader_data.sdioc_reg.dl_buff_size.reg_val; - - sdio_dld_info.cl_up_buffer_size = - sdio_dld->sdio_dloader_data.sdioc_reg.ul_buff_size.reg_val; - - sdio_dld_info.host_outgoing_buffer_size = - sdio_dld->sdio_dloader_data.outgoing_data.buffer_size; - - sdio_dld_info.cl_dl_buffer_address = - sdio_dld->sdio_dloader_data.sdioc_reg.dl_buff_address.reg_val; - - sdio_dld_info.cl_up_buffer_address = - sdio_dld->sdio_dloader_data.sdioc_reg.up_buff_address.reg_val; - - sdio_dld_print_info(); - - if (sdio_dld->done_callback) - sdio_dld->done_callback(); - - schedule_work(&cleanup); - pr_info(MODULE_NAME ": %s - Bootloader done, returning...", __func__); -} - -/** - * writing_size_to_buf - * writes from src buffer into dest buffer. if dest buffer - * reaches its end, rollover happens. - * - * @dest: destination buffer. - * @src: source buffer. - * @dest_wr_ptr: writing pointer in destination buffer. - * @dest_size: destination buffer size. - * @dest_rd_ptr: reading pointer in destination buffer. - * @size_to_write: size of bytes to write. - * @return -how many bytes actually written to destination - * buffer. - * - * ONLY destination buffer is treated as cyclic buffer. - */ -static int writing_size_to_buf(char *dest, - const unsigned char *src, - int *dest_wr_ptr, - int dest_size, - int dest_rd_ptr, - int size_to_write) -{ - int actually_written = 0; - int size_to_add = *dest_wr_ptr; - - if (!dest) { - pr_err(MODULE_NAME ": %s - param ""dest"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!src) { - pr_err(MODULE_NAME ": %s - param ""src"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!dest_wr_ptr) { - pr_err(MODULE_NAME ": %s - param ""dest_wr_ptr"" is NULL.\n", - __func__); - return -EINVAL; - } - - for (actually_written = 0 ; - actually_written < size_to_write ; ++actually_written) { - /* checking if buffer is full */ - if (((size_to_add + 1) % dest_size) == dest_rd_ptr) { - *dest_wr_ptr = size_to_add; - return actually_written; - } - - dest[size_to_add] = src[actually_written]; - size_to_add = (size_to_add+1)%dest_size; - } - - *dest_wr_ptr = size_to_add; - - return actually_written; -} - -/** - * sdioc_bytes_till_end_of_buffer - this routine calculates how many bytes are - * empty/in use. if calculation requires rap around - it will ignore the rap - * around and will do the calculation untill the end of the buffer - * - * @write_ptr: writing pointer. - * @read_ptr: reading pointer. - * @total_size: buffer size. - * @free_bytes: return value-how many free bytes. - * @bytes_in_use: return value-how many bytes in use. - * @return 0 on success or negative value on error. - * - * buffer is treated as a cyclic buffer. - */ -static int sdioc_bytes_till_end_of_buffer(int write_ptr, - int read_ptr, - int total_size, - int *free_bytes, - int *bytes_in_use) -{ - if (!free_bytes) { - pr_err(MODULE_NAME ": %s - param ""free_bytes"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!bytes_in_use) { - pr_err(MODULE_NAME ": %s - param ""bytes_in_use"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (write_ptr >= read_ptr) { - if (read_ptr == 0) - *free_bytes = total_size - write_ptr - 1; - else - *free_bytes = total_size - write_ptr; - *bytes_in_use = write_ptr - read_ptr; - } else { - *bytes_in_use = total_size - read_ptr; - *free_bytes = read_ptr - write_ptr - 1; - } - - return 0; -} - -/** - * sdioc_bytes_free_in_buffer - * this routine calculates how many bytes are free in a buffer - * and how many are in use, according to its reading and - * writing pointer offsets. - * - * @write_ptr: writing pointer. - * @read_ptr: reading pointer. - * @total_size: buffer size. - * @free_bytes: return value-how many free bytes in buffer. - * @bytes_in_use: return value-how many bytes in use in buffer. - * @return 0 on success or negative value on error. - * - * buffer is treated as a cyclic buffer. - */ -static int sdioc_bytes_free_in_buffer(int write_ptr, - int read_ptr, - int total_size, - int *free_bytes, - int *bytes_in_use) -{ - if (!free_bytes) { - pr_err(MODULE_NAME ": %s - param ""free_bytes"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!bytes_in_use) { - pr_err(MODULE_NAME ": %s - param ""bytes_in_use"" is NULL.\n", - __func__); - return -EINVAL; - } - - /* if pointers equel - buffers are empty. nothing to read/write */ - - if (write_ptr >= read_ptr) - *bytes_in_use = write_ptr - read_ptr; - else - *bytes_in_use = total_size - (read_ptr - write_ptr); - - *free_bytes = total_size - *bytes_in_use - 1; - - return 0; -} - -/* -* sdio_dld_write_room -* -* This is the write_room function of the tty driver. -* -* @tty: pointer to tty struct. -* @return free bytes for write. -* -*/ -static int sdio_dld_write_room(struct tty_struct *tty) -{ - return sdio_dld->sdio_dloader_data.outgoing_data.buffer_size; -} - -/** - * sdio_dld_write_callback - * this is the write callback of the tty driver. - * - * @tty: pointer to tty struct. - * @buf: buffer to write from. - * @count: number of bytes to write. - * @return bytes written or negative value on error. - * - * if destination buffer has not enough room for the incoming - * data, returns an error. - */ -static int sdio_dld_write_callback(struct tty_struct *tty, - const unsigned char *buf, int count) -{ - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - int dst_free_bytes = 0; - int dummy = 0; - int status = 0; - int bytes_written = 0; - int total_written = 0; - static int write_retry; - int pending_to_write = count; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_count = count; - update_gd(SDIO_DLD_DEBUGFS_CASE_5_CODE); -#endif - - pr_debug(MODULE_NAME ": %s - WRITING CALLBACK CALLED WITH %d bytes\n", - __func__, count); - - if (!outgoing->data) { - pr_err(MODULE_NAME ": %s - param ""outgoing->data"" is NULL.\n", - __func__); - return -EINVAL; - } - - pr_debug(MODULE_NAME ": %s - WRITE CALLBACK size to write to outgoing" - " buffer %d\n", __func__, count); - - /* as long as there is something to write to outgoing buffer */ - do { - int bytes_to_write = 0; - status = sdioc_bytes_free_in_buffer( - outgoing->offset_write_p, - outgoing->offset_read_p, - outgoing->buffer_size, - &dst_free_bytes, - &dummy); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdioc_bytes_free_in_buffer(). status=%d\n", - __func__, status); - return status; - } - - /* - * if there is free room in outgoing buffer - * lock mutex and request trigger notification from the main - * task. unlock mutex, and wait for sinal - */ - if (dst_free_bytes > 0) { - write_retry = 0; - /* - * if there is more data to write to outgoing buffer - * than it can receive, wait for signal from main task - */ - if (pending_to_write > dst_free_bytes) { - - /* sampling updated dst_free_bytes */ - status = sdioc_bytes_free_in_buffer( - outgoing->offset_write_p, - outgoing->offset_read_p, - outgoing->buffer_size, - &dst_free_bytes, - &dummy); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in " - "Function " - "sdioc_bytes_free_in_buffer(). " - "status=%d\n", __func__, status); - return status; - } - } - - bytes_to_write = min(pending_to_write, dst_free_bytes); - bytes_written = - writing_size_to_buf(outgoing->data, - buf+total_written, - &outgoing->offset_write_p, - outgoing->buffer_size, - outgoing->offset_read_p, - bytes_to_write); - - /* keeping sdio_dld_info up to date */ - sdio_dld_info.host_write_ptr = - sdio_dld->sdio_dloader_data. - outgoing_data.offset_write_p; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_write_tty = bytes_written; - update_gd(SDIO_DLD_DEBUGFS_CASE_3_CODE); -#endif - sdio_dld_info.global_bytes_write_tty += bytes_written; - - spin_lock_irqsave(&lock2, lock_flags2); - if (sdio_dld->main_loop_event.wake_up_signal == 0) { - sdio_dld->main_loop_event.wake_up_signal = 1; - wake_up(&sdio_dld->main_loop_event.wait_event); - } - spin_unlock_irqrestore(&lock2, lock_flags2); - - /* - * although outgoing buffer has enough room, writing - * failed - */ - if (bytes_written != bytes_to_write) { - pr_err(MODULE_NAME ": %s - couldn't write " - "%d bytes to " "outgoing buffer." - "bytes_written=%d\n", - __func__, bytes_to_write, - bytes_written); - return -EIO; - } - - total_written += bytes_written; - pending_to_write -= bytes_written; - outgoing->num_of_bytes_in_use += bytes_written; - - pr_debug(MODULE_NAME ": %s - WRITE CHUNK to outgoing " - "buffer. pending_to_write=%d, " - "outgoing_free_bytes=%d, " - "bytes_written=%d\n", - __func__, - pending_to_write, - dst_free_bytes, - bytes_written); - - } else { - write_retry++; - - pr_debug(MODULE_NAME ": %s - WRITE CALLBACK - NO ROOM." - " pending_to_write=%d, write_retry=%d\n", - __func__, - pending_to_write, - write_retry); - - spin_lock_irqsave(&lock1, lock_flags1); - sdio_dld->write_callback_event.wake_up_signal = 0; - spin_unlock_irqrestore(&lock1, lock_flags1); - - pr_debug(MODULE_NAME ": %s - WRITE CALLBACK - " - "WAITING...", __func__); -#ifdef CONFIG_DEBUG_FS - update_gd(SDIO_DLD_DEBUGFS_CASE_8_CODE); -#endif - wait_event(sdio_dld->write_callback_event.wait_event, - sdio_dld->write_callback_event. - wake_up_signal); -#ifdef CONFIG_DEBUG_FS - update_gd(SDIO_DLD_DEBUGFS_CASE_9_CODE); -#endif - pr_debug(MODULE_NAME ": %s - WRITE CALLBACK - " - "WOKE UP...", __func__); - } - } while (pending_to_write > 0 && write_retry < WRITE_RETRIES); - - if (pending_to_write > 0) { - - pr_err(MODULE_NAME ": %s - WRITE CALLBACK - pending data is " - "%d out of %d > 0. total written in this " - "callback = %d\n", - __func__, pending_to_write, count, total_written); - } - - if (write_retry == WRITE_RETRIES) { - pr_err(MODULE_NAME ": %s, write_retry=%d= max\n", - __func__, write_retry); - } - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_bytes_cb_tty = total_written; - update_gd(SDIO_DLD_DEBUGFS_CASE_10_CODE); -#endif - - return total_written; -} - -/** - * sdio_memcpy_fromio_wrapper - - * reads from sdioc, and updats the sdioc registers according - * to how many bytes were actually read. - * - * @str_func: a pointer to func struct. - * @client_rd_ptr: sdioc value of downlink read ptr. - * @client_wr_ptr: sdioc value of downlink write ptr. - * @buffer_to_store: buffer to store incoming data. - * @address_to_read: address to start reading from in sdioc. - * @size_to_read: size of bytes to read. - * @client_buffer_size: sdioc downlink buffer size. - * @return 0 on success or negative value on error. - */ -static int sdio_memcpy_fromio_wrapper(struct sdio_func *str_func, - unsigned int client_rd_ptr, - unsigned int client_wr_ptr, - void *buffer_to_store, - unsigned int address_to_read_from, - int size_to_read, - int client_buffer_size) -{ - int status = 0; - struct sdioc_reg_chunk *reg_str = - &sdio_dld->sdio_dloader_data.sdioc_reg; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!buffer_to_store) { - pr_err(MODULE_NAME ": %s - param ""buffer_to_store"" is " - "NULL.\n", - __func__); - return -EINVAL; - } - - if (size_to_read < 0) { - pr_err(MODULE_NAME ": %s - invalid size to read=%d\n", - __func__, size_to_read); - return -EINVAL; - } - - sdio_claim_host(str_func); - - pr_debug(MODULE_NAME ": %s, READING DATA - from add %d, " - "size_to_read=%d\n", - __func__, address_to_read_from, size_to_read); - - status = sdio_memcpy_fromio(str_func, - (void *)buffer_to_store, - address_to_read_from, - size_to_read); - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_fromio()" - " DATA failed. status=%d.\n", - __func__, status); - sdio_release_host(str_func); - return status; - } - - /* updating an offset according to cyclic buffer size */ - reg_str->dl_rd_ptr.reg_val = - (reg_str->dl_rd_ptr.reg_val + size_to_read) % - client_buffer_size; - /* keeping sdio_dld_info up to date */ - sdio_dld_info.cl_dl_rd_ptr = reg_str->dl_rd_ptr.reg_val; - - status = sdio_memcpy_toio(str_func, - reg_str->dl_rd_ptr.reg_offset, - (void *)®_str->dl_rd_ptr.reg_val, - sizeof(reg_str->dl_rd_ptr.reg_val)); - - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_toio() " - "UPDATE PTR failed. status=%d.\n", - __func__, status); - } - - sdio_release_host(str_func); - return status; -} - -/** - * sdio_memcpy_toio_wrapper - * writes to sdioc, and updats the sdioc registers according - * to how many bytes were actually read. - * - * @str_func: a pointer to func struct. - * @client_wr_ptr: sdioc downlink write ptr. - * @h_read_ptr: host incoming read ptrs - * @buf_write_from: buffer to write from. - * @bytes_to_write: number of bytes to write. - * @return 0 on success or negative value on error. - */ -static int sdio_memcpy_toio_wrapper(struct sdio_func *str_func, - unsigned int client_wr_ptr, - unsigned int h_read_ptr, - void *buf_write_from, - int bytes_to_write) -{ - int status = 0; - struct sdioc_reg_chunk *reg_str = - &sdio_dld->sdio_dloader_data.sdioc_reg; - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!buf_write_from) { - pr_err(MODULE_NAME ": %s - param ""buf_write_from"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_claim_host(str_func); - - pr_debug(MODULE_NAME ": %s, WRITING DATA TOIO to address 0x%x, " - "bytes_to_write=%d\n", - __func__, - reg_str->up_buff_address.reg_val + reg_str->up_wr_ptr.reg_val, - bytes_to_write); - - status = sdio_memcpy_toio(str_func, - reg_str->up_buff_address.reg_val + - reg_str->up_wr_ptr.reg_val, - (void *) (outgoing->data + h_read_ptr), - bytes_to_write); - - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_toio() " - "DATA failed. status=%d.\n", __func__, status); - sdio_release_host(str_func); - return status; - } - - sdio_dld_info.global_bytes_write_toio += bytes_to_write; - outgoing->num_of_bytes_in_use -= bytes_to_write; - - /* - * if writing to client succeeded, then - * 1. update the client up_wr_ptr - * 2. update the host outgoing rd ptr - **/ - reg_str->up_wr_ptr.reg_val = - ((reg_str->up_wr_ptr.reg_val + bytes_to_write) % - reg_str->ul_buff_size.reg_val); - - /* keeping sdio_dld_info up to date */ - sdio_dld_info.cl_up_wr_ptr = reg_str->up_wr_ptr.reg_val; - - outgoing->offset_read_p = - ((outgoing->offset_read_p + bytes_to_write) % - outgoing->buffer_size); - - /* keeping sdio_dld_info up to date*/ - sdio_dld_info.host_read_ptr = outgoing->offset_read_p; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_write_toio = bytes_to_write; - update_gd(SDIO_DLD_DEBUGFS_CASE_4_CODE); -#endif - - /* updating uplink write pointer according to size that was written */ - status = sdio_memcpy_toio(str_func, - reg_str->up_wr_ptr.reg_offset, - (void *)(®_str->up_wr_ptr.reg_val), - sizeof(reg_str->up_wr_ptr.reg_val)); - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_toio() " - "UPDATE PTR failed. status=%d.\n", - __func__, status); - } - - sdio_release_host(str_func); - return status; -} - -/** - * sdio_dld_read - * reads from sdioc - * - * @client_rd_ptr: sdioc downlink read ptr. - * @client_wr_ptr: sdioc downlink write ptr. - * @reg_str: sdioc register shadowing struct. - * @str_func: a pointer to func struct. - * @bytes_read:how many bytes read. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_read(unsigned int client_rd_ptr, - unsigned int client_wr_ptr, - struct sdioc_reg_chunk *reg_str, - struct sdio_func *str_func, - int *bytes_read) -{ - int status = 0; - struct sdio_data *incoming = &sdio_dld->sdio_dloader_data.incoming_data; - - if (!reg_str) { - pr_err(MODULE_NAME ": %s - param ""reg_str"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!bytes_read) { - pr_err(MODULE_NAME ": %s - param ""bytes_read"" is NULL.\n", - __func__); - return -EINVAL; - } - - /* there is data to read in ONE chunk */ - if (client_wr_ptr > client_rd_ptr) { - status = sdio_memcpy_fromio_wrapper( - str_func, - client_rd_ptr, - client_wr_ptr, - (void *)incoming->data, - reg_str->dl_buff_address.reg_val + client_rd_ptr, - client_wr_ptr - client_rd_ptr, - reg_str->dl_buff_size.reg_val); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_memcpy_fromio_wrapper(). " - "SINGLE CHUNK READ. status=%d\n", - __func__, status); - return status; - } - - incoming->num_of_bytes_in_use += client_wr_ptr - client_rd_ptr; - *bytes_read = client_wr_ptr - client_rd_ptr; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_to_read = - client_wr_ptr - client_rd_ptr; - update_gd(SDIO_DLD_DEBUGFS_CASE_11_CODE); -#endif - } - - /* there is data to read in TWO chunks */ - else { - int dl_buf_size = reg_str->dl_buff_size.reg_val; - int tail_size = dl_buf_size - client_rd_ptr; - - /* reading chunk#1: from rd_ptr to the end of the buffer */ - status = sdio_memcpy_fromio_wrapper( - str_func, - client_rd_ptr, - dl_buf_size, - (void *)incoming->data, - reg_str->dl_buff_address.reg_val + client_rd_ptr, - tail_size, - dl_buf_size); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_memcpy_fromio_wrapper(). " - "1 of 2 CHUNKS READ. status=%d\n", - __func__, status); - return status; - } - - incoming->num_of_bytes_in_use += tail_size; - *bytes_read = tail_size; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_to_read = tail_size; - update_gd(SDIO_DLD_DEBUGFS_CASE_11_CODE); -#endif - - /* reading chunk#2: reading from beginning buffer */ - status = sdio_memcpy_fromio_wrapper( - str_func, - client_rd_ptr, - client_wr_ptr, - (void *)(incoming->data + tail_size), - reg_str->dl_buff_address.reg_val, - client_wr_ptr, - reg_str->dl_buff_size.reg_val); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_memcpy_fromio_wrapper(). " - "2 of 2 CHUNKS READ. status=%d\n", - __func__, status); - return status; - } - - incoming->num_of_bytes_in_use += client_wr_ptr; - *bytes_read += client_wr_ptr; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_to_read = client_wr_ptr; - update_gd(SDIO_DLD_DEBUGFS_CASE_11_CODE); -#endif - } - return 0; -} - -/** - * sdio_dld_main_task - * sdio downloader main task. reads mailboxf checks if there is - * anything to read, checks if host has anything to - * write. - * - * @card: a pointer to mmc_card. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_main_task(void *card) -{ - int status = 0; - struct tty_struct *tty = sdio_dld->tty_str; - struct sdioc_reg_chunk *reg_str = - &sdio_dld->sdio_dloader_data.sdioc_reg; - int func = sdio_dld->sdioc_boot_func; - struct sdio_func *str_func = NULL; - struct sdio_data *outgoing = &sdio_dld->sdio_dloader_data.outgoing_data; - struct sdio_data *incoming = &sdio_dld->sdio_dloader_data.incoming_data; - struct sdio_dld_task *task = &sdio_dld->dld_main_thread; - int retries = 0; -#ifdef PUSH_STRING - int bytes_pushed = 0; -#endif - - msleep(SLEEP_MS); - - if (!card) { - pr_err(MODULE_NAME ": %s - param ""card"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!tty) { - pr_err(MODULE_NAME ": %s - param ""tty"" is NULL.\n", - __func__); - return -EINVAL; - } - - str_func = ((struct mmc_card *)card)-> - sdio_func[REAL_FUNC_TO_FUNC_IN_ARRAY(func)]; - - if (!str_func) { - pr_err(MODULE_NAME ": %s - param ""str_func"" is NULL.\n", - __func__); - return -EINVAL; - } - - while (true) { - /* client pointers for both buffers */ - int client_ul_wr_ptr = 0; - int client_ul_rd_ptr = 0; - int client_dl_wr_ptr = 0; - int client_dl_rd_ptr = 0; - - /* host pointer for outgoing buffer */ - int h_out_wr_ptr = 0; - int h_out_rd_ptr = 0; - - int h_bytes_rdy_wr = 0; - int c_bytes_rdy_rcve = 0; - - int need_to_write = 0; - int need_to_read = 0; - - /* - * forever, checking for signal to die, then read MailBox. - * if nothing to read or nothing to write to client, sleep, - * and again read MailBox - */ - do { - int dummy = 0; - - /* checking if a signal to die was sent */ - if (atomic_read(&task->please_close) == 1) { - - pr_debug(MODULE_NAME ": %s - 0x%x was written " - "to 9K\n", __func__, SDIOC_EXIT_CODE); - - sdio_claim_host(str_func); - - /* returned value is not checked on purpose */ - sdio_memcpy_toio( - str_func, - reg_str->good_to_exit_ptr.reg_offset, - (void *)®_str->good_to_exit_ptr. - reg_val, - sizeof(reg_str->good_to_exit_ptr. - reg_val)); - - sdio_release_host(str_func); - - task->exit_wait.wake_up_signal = 1; - wake_up(&task->exit_wait.wait_event); - return 0; - } - - status = mailbox_to_seq_chunk_read_ptrs(str_func); - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "mailbox_to_seq_chunk_read_ptrs(). " - "status=%d\n", __func__, status); - return status; - } - - /* calculate how many bytes the host has send */ - h_out_wr_ptr = outgoing->offset_write_p; - h_out_rd_ptr = outgoing->offset_read_p; - - status = sdioc_bytes_till_end_of_buffer( - h_out_wr_ptr, - h_out_rd_ptr, - outgoing->buffer_size, - &dummy, - &h_bytes_rdy_wr); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdioc_bytes_till_end_of_buffer(). " - "status=%d\n", __func__, status); - return status; - } - - /* is there something to read from client */ - client_dl_wr_ptr = reg_str->dl_wr_ptr.reg_val; - client_dl_rd_ptr = reg_str->dl_rd_ptr.reg_val; - - if (client_dl_rd_ptr != client_dl_wr_ptr) - need_to_read = 1; - - /* - * calculate how many bytes the client can receive - * from host - */ - client_ul_wr_ptr = reg_str->up_wr_ptr.reg_val; - client_ul_rd_ptr = reg_str->up_rd_ptr.reg_val; - - status = sdioc_bytes_till_end_of_buffer( - client_ul_wr_ptr, - client_ul_rd_ptr, - reg_str->ul_buff_size.reg_val, - &c_bytes_rdy_rcve, - &dummy); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdioc_bytes_till_end_of_buffer(). " - "status=%d\n", __func__, status); - return status; - } - - /* if host has anything to write */ - if (h_bytes_rdy_wr > 0) - need_to_write = 1; - - if (need_to_write || need_to_read) - break; - - spin_lock_irqsave(&lock2, lock_flags2); - sdio_dld->main_loop_event.wake_up_signal = 0; - spin_unlock_irqrestore(&lock2, lock_flags2); - - pr_debug(MODULE_NAME ": %s - MAIN LOOP - WAITING...\n", - __func__); -#ifdef CONFIG_DEBUG_FS - update_gd(SDIO_DLD_DEBUGFS_CASE_6_CODE); -#endif - wait_event(sdio_dld->main_loop_event.wait_event, - sdio_dld->main_loop_event.wake_up_signal); -#ifdef CONFIG_DEBUG_FS - update_gd(SDIO_DLD_DEBUGFS_CASE_7_CODE); -#endif - - pr_debug(MODULE_NAME ": %s - MAIN LOOP - WOKE UP...\n", - __func__); - - } while (1); - - /* CHECK IF THERE IS ANYTHING TO READ IN CLIENT */ - if (need_to_read) { -#ifdef PUSH_STRING - int num_push = 0; - int left = 0; - int bytes_read; -#else - int i; -#endif - need_to_read = 0; - - status = sdio_dld_read(client_dl_rd_ptr, - client_dl_wr_ptr, - reg_str, - str_func, - &bytes_read); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_dld_read(). status=%d\n", - __func__, status); - return status; - } - - sdio_dld_info.global_bytes_read_fromio += - bytes_read; - - bytes_pushed = 0; -#ifdef PUSH_STRING - left = incoming->num_of_bytes_in_use; - start_timer(&sdio_dld->push_timer, - sdio_dld->push_timer_ms); - do { - num_push = tty_insert_flip_string( - tty, - incoming->data+bytes_pushed, - left); - - bytes_pushed += num_push; - left -= num_push; - tty_flip_buffer_push(tty); - } while (left != 0); - - del_timer(&sdio_dld->push_timer); - - if (bytes_pushed != incoming->num_of_bytes_in_use) { - pr_err(MODULE_NAME ": %s - failed\n", - __func__); - } -#else - pr_debug(MODULE_NAME ": %s - NEED TO READ %d\n", - __func__, incoming->num_of_bytes_in_use); - - for (i = 0 ; i < incoming->num_of_bytes_in_use ; ++i) { - int err = 0; - err = tty_insert_flip_char(tty, - incoming->data[i], - TTY_NORMAL); - tty_flip_buffer_push(tty); - } - - pr_debug(MODULE_NAME ": %s - JUST READ\n", __func__); -#endif /*PUSH_STRING*/ - sdio_dld_info.global_bytes_push_tty += - incoming->num_of_bytes_in_use; -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_push_to_tty = bytes_read; - update_gd(SDIO_DLD_DEBUGFS_CASE_12_CODE); -#endif - incoming->num_of_bytes_in_use = 0; - tty_flip_buffer_push(tty); - } - - /* CHECK IF THERE IS ANYTHING TO WRITE IN HOST AND HOW MUCH */ - if (need_to_write) { - int dummy = 0; - - do { - int bytes_to_write = min(c_bytes_rdy_rcve, - h_bytes_rdy_wr); - - /* - * in case nothing to send or no room to - * receive - */ - if (bytes_to_write == 0) - break; - - if (client_ul_rd_ptr == 0 && - (client_ul_rd_ptr != client_ul_wr_ptr)) - break; - - /* - * if client_rd_ptr points to start, but there - * is data to read wait until WRITE_TILL_END - * before writing a chunk of data, to avoid - * writing until (BUF_SIZE - 1), because it will - * yield an extra write of "1" bytes - */ - if (client_ul_rd_ptr == 0 && - (client_ul_rd_ptr != client_ul_wr_ptr) && - retries < WRITE_TILL_END_RETRIES) { - retries++; - break; - } - retries = 0; - -#ifdef CONFIG_DEBUG_FS - debugfs_glob.global_8k_has = h_bytes_rdy_wr; - debugfs_glob.global_9k_has = c_bytes_rdy_rcve; - debugfs_glob.global_min = bytes_to_write; - update_gd(SDIO_DLD_DEBUGFS_CASE_2_CODE); -#endif - need_to_write = 0; - - pr_debug(MODULE_NAME ": %s - NEED TO WRITE " - "TOIO %d\n", - __func__, bytes_to_write); - - status = sdio_memcpy_toio_wrapper( - str_func, - reg_str->up_wr_ptr.reg_val, - outgoing->offset_read_p, - (void *)((char *)outgoing->data + - outgoing->offset_read_p), - bytes_to_write); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in " - "Function " - "sdio_memcpy_toio_wrapper(). " - "SINGLE CHUNK WRITE. " - "status=%d\n", - __func__, status); - return status; - } - - sdio_claim_host(str_func); - - status = sdio_memcpy_fromio( - str_func, - (void *)®_str->up_rd_ptr.reg_val, - SDIOC_UL_RD_PTR, - sizeof(reg_str->up_rd_ptr.reg_val)); - - if (status) { - pr_err(MODULE_NAME ": %s - " - "sdio_memcpy_fromio() " - "failed. status=%d\n", - __func__, status); - sdio_release_host(str_func); - - return status; - } - - sdio_release_host(str_func); - - spin_lock_irqsave(&lock1, lock_flags1); - if (sdio_dld->write_callback_event. - wake_up_signal == 0) { - sdio_dld->write_callback_event. - wake_up_signal = 1; - wake_up(&sdio_dld-> - write_callback_event. - wait_event); - } - - spin_unlock_irqrestore(&lock1, lock_flags1); - client_ul_wr_ptr = reg_str->up_wr_ptr.reg_val; - client_ul_rd_ptr = reg_str->up_rd_ptr.reg_val; - - status = sdioc_bytes_till_end_of_buffer( - client_ul_wr_ptr, - client_ul_rd_ptr, - reg_str->ul_buff_size.reg_val, - &c_bytes_rdy_rcve, - &dummy); - - /* calculate how many bytes host has to send */ - h_out_wr_ptr = outgoing->offset_write_p; - h_out_rd_ptr = outgoing->offset_read_p; - - status = sdioc_bytes_till_end_of_buffer( - h_out_wr_ptr, - h_out_rd_ptr, - outgoing->buffer_size, - &dummy, - &h_bytes_rdy_wr); - - } while (h_out_wr_ptr != h_out_rd_ptr); - } - } - return 0; -} - -/** - * sdio_dld_init_global - * initialization of sdio_dld global struct - * - * @card: a pointer to mmc_card. - * @return 0 on success or negative value on error. - */ -static int sdio_dld_init_global(struct mmc_card *card, - int(*done)(void)) -{ - if (!card) { - pr_err(MODULE_NAME ": %s - param ""card"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!done) { - pr_err(MODULE_NAME ": %s - param ""done"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_dld->done_callback = done; - sdio_dld->card = card; - init_waitqueue_head(&sdio_dld->dld_main_thread.exit_wait.wait_event); - sdio_dld->write_callback_event.wake_up_signal = 1; - sdio_dld->main_loop_event.wake_up_signal = 1; - - sdio_dld->sdio_dloader_data.sdioc_reg.dl_buff_size.reg_offset = - SDIOC_DL_BUFF_SIZE_OFFSET; - - sdio_dld->sdio_dloader_data.sdioc_reg.dl_rd_ptr.reg_offset = - SDIOC_DL_RD_PTR; - - sdio_dld->sdio_dloader_data.sdioc_reg.dl_wr_ptr.reg_offset = - SDIOC_DL_WR_PTR; - - sdio_dld->sdio_dloader_data.sdioc_reg.ul_buff_size.reg_offset = - SDIOC_UP_BUFF_SIZE_OFFSET; - - sdio_dld->sdio_dloader_data.sdioc_reg.up_rd_ptr.reg_offset = - SDIOC_UL_RD_PTR; - - sdio_dld->sdio_dloader_data.sdioc_reg.up_wr_ptr.reg_offset = - SDIOC_UL_WR_PTR; - - sdio_dld->sdio_dloader_data.sdioc_reg.good_to_exit_ptr.reg_offset = - SDIOC_EXIT_PTR; - - sdio_dld->sdio_dloader_data.sdioc_reg.dl_buff_address.reg_offset = - SDIOC_DL_BUFF_ADDRESS; - - sdio_dld->sdio_dloader_data.sdioc_reg.up_buff_address.reg_offset = - SDIOC_UP_BUFF_ADDRESS; - - sdio_dld_set_op_mode(SDIO_DLD_NORMAL_MODE); - - return 0; -} - -/** - * sdio_downloader_setup - * initializes the TTY driver - * - * @card: a pointer to mmc_card. - * @num_of_devices: number of devices. - * @channel_number: channel number. - * @return 0 on success or negative value on error. - * - * The TTY stack needs to know in advance how many devices it should - * plan to manage. Use this call to set up the ports that will - * be exported through SDIO. - */ -int sdio_downloader_setup(struct mmc_card *card, - unsigned int num_of_devices, - int channel_number, - int(*done)(void)) -{ - int status = 0; - int result = 0; - int func_in_array = 0; - struct sdio_func *str_func = NULL; - struct device *tty_dev; - - if (atomic_read(&sdio_dld_in_use) == 1) - return -EBUSY; - - /* - * If the setup is already complete tear down the existing - * one and reinitialize. This might happen during modem restarts - * in boot phase. - */ - if (atomic_read(&sdio_dld_setup_done) == 1) - sdio_dld_tear_down(NULL); - - if (num_of_devices == 0 || num_of_devices > MAX_NUM_DEVICES) { - pr_err(MODULE_NAME ": %s - invalid number of devices\n", - __func__); - return -EINVAL; - } - - if (!card) { - pr_err(MODULE_NAME ": %s - param ""card"" is NULL.\n", - __func__); - return -EINVAL; - } - - if (!done) { - pr_err(MODULE_NAME ": %s - param ""done"" is NULL.\n", - __func__); - return -EINVAL; - } - - sdio_dld = kzalloc(sizeof(struct sdio_downloader), GFP_KERNEL); - if (!sdio_dld) { - pr_err(MODULE_NAME ": %s - couldn't allocate sdio_dld data " - "structure.", __func__); - return -ENOMEM; - } - -#ifdef CONFIG_DEBUG_FS - bootloader_debugfs_init(); -#endif /* CONFIG_DEBUG_FS */ - - status = sdio_dld_init_global(card, done); - - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_dld_init_global(). status=%d\n", - __func__, status); - kfree(sdio_dld); - return status; - } - - sdio_dld->tty_drv = alloc_tty_driver(num_of_devices); - - if (!sdio_dld->tty_drv) { - pr_err(MODULE_NAME ": %s - param ""sdio_dld->tty_drv"" is " - "NULL.\n", __func__); - kfree(sdio_dld); - return -EINVAL; - } - - sdio_dld_set_op_mode((enum sdio_dld_op_mode)sdio_op_mode); - - /* according to op_mode, a different tty device is created */ - if (sdio_dld->op_mode == SDIO_DLD_BOOT_TEST_MODE) - sdio_dld->tty_drv->name = TTY_SDIO_DEV_TEST; - else - sdio_dld->tty_drv->name = TTY_SDIO_DEV; - - sdio_dld->tty_drv->owner = THIS_MODULE; - sdio_dld->tty_drv->driver_name = "SDIO_Dloader"; - - /* uses dynamically assigned dev_t values */ - sdio_dld->tty_drv->type = TTY_DRIVER_TYPE_SERIAL; - sdio_dld->tty_drv->subtype = SERIAL_TYPE_NORMAL; - sdio_dld->tty_drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV - | TTY_DRIVER_RESET_TERMIOS; - - /* initializing the tty driver */ - sdio_dld->tty_drv->init_termios = tty_std_termios; - sdio_dld->tty_drv->init_termios.c_cflag = - B4800 | CS8 | CREAD | HUPCL | CLOCAL; - sdio_dld->tty_drv->init_termios.c_ispeed = INPUT_SPEED; - sdio_dld->tty_drv->init_termios.c_ospeed = OUTPUT_SPEED; - - tty_set_operations(sdio_dld->tty_drv, &sdio_dloader_tty_ops); - - status = tty_register_driver(sdio_dld->tty_drv); - if (status) { - put_tty_driver(sdio_dld->tty_drv); - pr_err(MODULE_NAME ": %s - tty_register_driver() failed\n", - __func__); - - sdio_dld->tty_drv = NULL; - kfree(sdio_dld); - return status; - } - - tty_dev = tty_register_device(sdio_dld->tty_drv, 0, NULL); - if (IS_ERR(tty_dev)) { - pr_err(MODULE_NAME ": %s - tty_register_device() " - "failed\n", __func__); - tty_unregister_driver(sdio_dld->tty_drv); - put_tty_driver(sdio_dld->tty_drv); - kfree(sdio_dld); - return PTR_ERR(tty_dev); - } - - sdio_dld->sdioc_boot_func = SDIOC_CHAN_TO_FUNC_NUM(channel_number); - func_in_array = REAL_FUNC_TO_FUNC_IN_ARRAY(sdio_dld->sdioc_boot_func); - str_func = sdio_dld->card->sdio_func[func_in_array]; - status = sdio_dld_init_func(str_func); - if (status) { - pr_err(MODULE_NAME ": %s - Failure in Function " - "sdio_dld_init_func(). status=%d\n", - __func__, status); - goto exit_err; - } - -#ifdef CONFIG_DEBUG_FS - sdio_dld_debug_init(); -#endif - - sdio_claim_host(str_func); - - /* - * notifing the client by writing what mode we are by writing - * to a special register - */ - status = sdio_memcpy_toio(str_func, - SDIOC_OP_MODE_PTR, - (void *)&sdio_dld->op_mode, - sizeof(sdio_dld->op_mode)); - - sdio_release_host(str_func); - - if (status) { - pr_err(MODULE_NAME ": %s - sdio_memcpy_toio() " - "writing to OP_MODE_REGISTER failed. " - "status=%d.\n", - __func__, status); - goto exit_err; - } - - atomic_set(&sdio_dld_setup_done, 1); - return 0; - -exit_err: - tty_unregister_device(sdio_dld->tty_drv, 0); - result = tty_unregister_driver(sdio_dld->tty_drv); - if (result) - pr_err(MODULE_NAME ": %s - tty_unregister_driver() " - "failed. result=%d\n", __func__, -result); - put_tty_driver(sdio_dld->tty_drv); - kfree(sdio_dld); - atomic_set(&sdio_dld_setup_done, 0); - return status; -} - -static void sdio_dld_tear_down(struct work_struct *work) -{ - int status = 0; - - if (atomic_read(&sdio_dld_in_use) == 1) { - del_timer_sync(&sdio_dld->timer); - del_timer_sync(&sdio_dld->push_timer); - sdio_dld_dealloc_local_buffers(); - } - - tty_unregister_device(sdio_dld->tty_drv, 0); - - status = tty_unregister_driver(sdio_dld->tty_drv); - if (status) { - pr_err(MODULE_NAME ": %s - tty_unregister_driver() failed\n", - __func__); - } - - put_tty_driver(sdio_dld->tty_drv); - kfree(sdio_dld); - atomic_set(&sdio_dld_in_use, 0); - atomic_set(&sdio_dld_setup_done, 0); -} - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SDIO Downloader"); -MODULE_AUTHOR("Yaniv Gardi "); -MODULE_VERSION(DRV_VERSION); - diff --git a/arch/arm/mach-msm/sdio_al_private.h b/arch/arm/mach-msm/sdio_al_private.h deleted file mode 100644 index 3a5ab79baf98..000000000000 --- a/arch/arm/mach-msm/sdio_al_private.h +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * SDIO-Abstraction-Layer internal interface. - */ - -#ifndef __SDIO_AL_PRIVATE__ -#define __SDIO_AL_PRIVATE__ - -#include -#include -#include - -#define DRV_VERSION "1.30" -#define MODULE_NAME "sdio_al" -#define SDIOC_CHAN_TO_FUNC_NUM(x) ((x)+2) -#define REAL_FUNC_TO_FUNC_IN_ARRAY(x) ((x)-1) -#define SDIO_PREFIX "SDIO_" -#define PEER_CHANNEL_NAME_SIZE 4 -#define CHANNEL_NAME_SIZE (sizeof(SDIO_PREFIX) + PEER_CHANNEL_NAME_SIZE) -#define SDIO_TEST_POSTFIX_SIZE 5 -#define MAX_NUM_OF_SDIO_DEVICES 2 -#define TEST_CH_NAME_SIZE (CHANNEL_NAME_SIZE + SDIO_TEST_POSTFIX_SIZE) - -struct sdio_al_device; /* Forward Declaration */ - -enum sdio_channel_state { - SDIO_CHANNEL_STATE_INVALID, /* before reading software header */ - SDIO_CHANNEL_STATE_IDLE, /* channel valid, not opened */ - SDIO_CHANNEL_STATE_CLOSED, /* was closed */ - SDIO_CHANNEL_STATE_OPEN, /* opened */ - SDIO_CHANNEL_STATE_CLOSING, /* during flush, when closing */ -}; -/** - * Peer SDIO-Client channel configuration. - * - * @is_ready - channel is ready and the data is valid. - * - * @max_rx_threshold - maximum rx threshold, according to the - * total buffers size on the peer pipe. - * @max_tx_threshold - maximum tx threshold, according to the - * total buffers size on the peer pipe. - * @tx_buf_size - size of a single buffer on the peer pipe; a - * transfer smaller than the buffer size still - * make the buffer unusable for the next transfer. - * @max_packet_size - * @is_host_ok_to_sleep - Host marks this bit when it's okay to - * sleep (no pending transactions) - */ -struct peer_sdioc_channel_config { - u32 is_ready; - u32 max_rx_threshold; /* Downlink */ - u32 max_tx_threshold; /* Uplink */ - u32 tx_buf_size; - u32 max_packet_size; - u32 is_host_ok_to_sleep; - u32 is_packet_mode; - u32 peer_operation; - u32 is_low_latency_ch; - u32 reserved[23]; -}; - - -/** - * Peer SDIO-Client channel statsitics. - * - * @last_any_read_avail - the last read avail in all the - * channels including this channel. - * @last_read_avail - the last read_avail that was read from HW - * mailbox. - * @last_old_read_avail - the last read_avail channel shadow. - * @total_notifs - the total number of read notifications sent - * to this channel client - * @total_read_times - the total number of successful sdio_read - * calls for this channel - */ -struct sdio_channel_statistics { - int last_any_read_avail; - int last_read_avail; - int last_old_read_avail; - int total_notifs; - int total_read_times; -}; - -/** - * SDIO Channel context. - * - * @name - channel name. Used by the caller to open the - * channel. - * - * @read_threshold - Threshold on SDIO-Client mailbox for Rx - * Data available bytes. When the limit exceed - * the SDIO-Client generates an interrupt to the - * host. - * - * @write_threshold - Threshold on SDIO-Client mailbox for Tx - * Data available bytes. When the limit exceed - * the SDIO-Client generates an interrupt to the - * host. - * - * @def_read_threshold - Default theshold on SDIO-Client for Rx - * - * @min_write_avail - Threshold of minimal available bytes - * to write. Below that threshold the host - * will initiate reading the mailbox. - * - * @poll_delay_msec - Delay between polling the mailbox. When - * the SDIO-Client doesn't generates EOT - * interrupt for Rx Available bytes, the host - * should poll the SDIO-Client mailbox. - * - * @is_packet_mode - The host get interrupt when a packet is - * available at the SDIO-client (pipe EOT - * indication). - * - * @num - channel number. - * - * @notify - Client's callback. Should not call sdio read/write. - * - * @priv - Client's private context, provided to callback. - * - * @is_valid - Channel is used (we have a list of - * SDIO_AL_MAX_CHANNELS and not all of them are in - * use). - * - * @is_open - Channel is open. - * - * @func - SDIO Function handle. - * - * @rx_pipe_index - SDIO-Client Pipe Index for Rx Data. - * - * @tx_pipe_index - SDIO-Client Pipe Index for Tx Data. - * - * @ch_lock - Channel lock to protect channel specific Data - * - * @rx_pending_bytes - Total number of Rx pending bytes, at Rx - * packet list. Maximum of 16KB-1 limited by - * SDIO-Client specification. - * - * @read_avail - Available bytes to read. - * - * @write_avail - Available bytes to write. - * - * @rx_size_list_head - The head of Rx Pending Packets List. - * - * @pdev - platform device - clients to probe for the sdio-al. - * - * @signature - Context Validity check. - * - * @sdio_al_dev - a pointer to the sdio_al_device instance of - * this channel - * - * @statistics - channel statistics - * - */ -struct sdio_channel { - /* Channel Configuration Parameters*/ - char name[CHANNEL_NAME_SIZE]; - char ch_test_name[TEST_CH_NAME_SIZE]; - int read_threshold; - int write_threshold; - int def_read_threshold; - int threshold_change_cnt; - int min_write_avail; - int poll_delay_msec; - int is_packet_mode; - int is_low_latency_ch; - - struct peer_sdioc_channel_config ch_config; - - /* Channel Info */ - int num; - - void (*notify)(void *priv, unsigned channel_event); - void *priv; - - int state; - - struct sdio_func *func; - - int rx_pipe_index; - int tx_pipe_index; - - struct mutex ch_lock; - - u32 read_avail; - u32 write_avail; - - u32 peer_tx_buf_size; - - u16 rx_pending_bytes; - - struct list_head rx_size_list_head; - - struct platform_device *pdev; - - u32 total_rx_bytes; - u32 total_tx_bytes; - - u32 signature; - - struct sdio_al_device *sdio_al_dev; - - struct sdio_channel_statistics statistics; -}; - -/** - * sdio_downloader_setup - * initializes the TTY driver - * - * @card: a pointer to mmc_card. - * @num_of_devices: number of devices. - * @channel_number: channel number. - * @return 0 on success or negative value on error. - * - * The TTY stack needs to know in advance how many devices it should - * plan to manage. Use this call to set up the ports that will - * be exported through SDIO. - */ -int sdio_downloader_setup(struct mmc_card *card, - unsigned int num_of_devices, - int func_number, - int(*func)(void)); - -/** - * test_channel_init - * initializes a test channel - * - * @name: the channel name. - * @return 0 on success or negative value on error. - * - */ -int test_channel_init(char *name); - -/** - * sdio_al_register_lpm_cb - * Allow the sdio_al test to register for lpm voting - * notifications - * - * @device_handle: the device handle. - * @wakeup_callback: callback function to be called when voting. - * - */ -void sdio_al_register_lpm_cb(void *device_handle, - int(*lpm_callback)(void *, int)); - -/** - * sdio_al_unregister_lpm_cb - * Allow the sdio_al test to unregister for lpm voting - * notifications - * - * @device_handle: the device handle. - * - */ -void sdio_al_unregister_lpm_cb(void *device_handle); - -#endif /* __SDIO_AL_PRIVATE__ */ diff --git a/arch/arm/mach-msm/sdio_al_test.c b/arch/arm/mach-msm/sdio_al_test.c deleted file mode 100644 index 2c9f675e201a..000000000000 --- a/arch/arm/mach-msm/sdio_al_test.c +++ /dev/null @@ -1,6500 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * SDIO-Abstraction-Layer Test Module. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "sdio_al_private.h" -#include - -#include -enum lpm_test_msg_type { - LPM_NO_MSG, /* 0 */ - LPM_MSG_SEND, /* 1 */ - LPM_MSG_REC, /* 2 */ - LPM_SLEEP, /* 3 */ - LPM_WAKEUP, /* 4 */ - LPM_NOTIFY /* 5 */ -}; - -#define LPM_NO_MSG_NAME "LPM No Event" -#define LPM_MSG_SEND_NAME "LPM Send Msg Event" -#define LPM_MSG_REC_NAME "LPM Receive Msg Event" -#define LPM_SLEEP_NAME "LPM Sleep Event" -#define LPM_WAKEUP_NAME "LPM Wakeup Event" - -/** Module name string */ -#define TEST_MODULE_NAME "sdio_al_test" - -#define TEST_SIGNATURE 0x12345678 -#define TEST_CONFIG_SIGNATURE 0xBEEFCAFE - -#define MAX_XFER_SIZE (16*1024) -#define SMEM_MAX_XFER_SIZE 0xBC000 -#define A2_MIN_PACKET_SIZE 5 -#define RMNT_PACKET_SIZE (4*1024) -#define DUN_PACKET_SIZE (2*1024) -#define CSVT_PACKET_SIZE 1700 - -#define TEST_DBG(x...) if (test_ctx->runtime_debug) pr_info(x) - -#define LPM_TEST_NUM_OF_PACKETS 100 -#define LPM_MAX_OPEN_CHAN_PER_DEV 4 -#define LPM_ARRAY_SIZE (7*LPM_TEST_NUM_OF_PACKETS*LPM_MAX_OPEN_CHAN_PER_DEV) -#define SDIO_LPM_TEST "sdio_lpm_test_reading_task" -#define LPM_TEST_CONFIG_SIGNATURE 0xDEADBABE -#define LPM_MSG_NAME_SIZE 20 -#define MAX_STR_SIZE 10 -#define MAX_AVG_RTT_TIME_USEC 2500 -#define SDIO_RMNT_RTT_PACKET_SIZE 32 -#define SDIO_CSVT_RTT_PACKET_SIZE 1900 - -#define A2_HEADER_OVERHEAD 8 - -enum rx_process_state { - RX_PROCESS_PACKET_INIT, - RX_PROCESS_A2_HEADER, - RX_PROCESS_PACKET_DATA, -}; - -enum sdio_test_case_type { - SDIO_TEST_LOOPBACK_HOST, - SDIO_TEST_LOOPBACK_CLIENT, - SDIO_TEST_LPM_HOST_WAKER, - SDIO_TEST_LPM_CLIENT_WAKER, - SDIO_TEST_LPM_RANDOM, - SDIO_TEST_HOST_SENDER_NO_LP, - SDIO_TEST_CLOSE_CHANNEL, - SDIO_TEST_A2_VALIDATION, - /* The following tests are not part of the 9k tests and should be - * kept last in case new tests are added - */ - SDIO_TEST_PERF, - SDIO_TEST_RTT, - SDIO_TEST_MODEM_RESET, -}; - -struct lpm_task { - struct task_struct *lpm_task; - const char *task_name; -}; - -struct lpm_entry_type { - enum lpm_test_msg_type msg_type; - char msg_name[LPM_MSG_NAME_SIZE]; - u32 counter; - u32 current_ms; - u32 read_avail_mask; - char chan_name[CHANNEL_NAME_SIZE]; -}; - -struct lpm_msg { - u32 signature; - u32 counter; - u32 reserve1; - u32 reserve2; -}; - -struct test_config_msg { - u32 signature; - u32 test_case; - u32 test_param; - u32 num_packets; - u32 num_iterations; -}; - -struct test_result_msg { - u32 signature; - u32 is_successful; -}; - -struct test_work { - struct work_struct work; - struct test_channel *test_ch; -}; - -enum sdio_channels_ids { - SDIO_RPC, - SDIO_QMI, - SDIO_RMNT, - SDIO_DIAG, - SDIO_DUN, - SDIO_SMEM, - SDIO_CSVT, - SDIO_MAX_CHANNELS -}; - -enum sdio_test_results { - TEST_NO_RESULT, - TEST_FAILED, - TEST_PASSED -}; - -enum sdio_lpm_vote_state { - SDIO_NO_VOTE, - SDIO_VOTE_FOR_SLEEP, - SDIO_VOTE_AGAINST_SLEEP -}; - -struct sdio_test_device { - int open_channels_counter_to_recv; - int open_channels_counter_to_send; - struct lpm_entry_type *lpm_arr; - int array_size; - void *sdio_al_device; - spinlock_t lpm_array_lock; - unsigned long lpm_array_lock_flags; - u32 next_avail_entry_in_array; - struct lpm_task lpm_test_task; - u32 next_mask_id; - u32 read_avail_mask; - int modem_result_per_dev; - int final_result_per_dev; -}; - -struct test_channel { - struct sdio_channel *ch; - - char name[CHANNEL_NAME_SIZE]; - int ch_id; - - struct sdio_test_device *test_device; - - u32 *buf; - u32 buf_size; - - struct workqueue_struct *workqueue; - struct test_work test_work; - - u32 rx_bytes; - u32 tx_bytes; - - wait_queue_head_t wait_q; - atomic_t rx_notify_count; - atomic_t tx_notify_count; - atomic_t any_notify_count; - atomic_t wakeup_client; - atomic_t card_detected_event; - - int wait_counter; - - int is_used; - int test_type; - int ch_ready; - - struct test_config_msg config_msg; - - int test_completed; - int test_result; - struct timer_list timer; - int timer_interval_ms; - - struct timer_list timeout_timer; - int timeout_ms; - void *sdio_al_device; - int is_ok_to_sleep; - unsigned int packet_length; - int random_packet_size; - int next_index_in_sent_msg_per_chan; - int channel_mask_id; - int modem_result_per_chan; - int notify_counter_per_chan; - int max_burst_size; /* number of writes before close/open */ - int card_removed; -}; - -struct sdio_al_test_debug { - u32 dun_throughput; - u32 rmnt_throughput; - struct dentry *debug_root; - struct dentry *debug_test_result; - struct dentry *debug_dun_throughput; - struct dentry *debug_rmnt_throughput; - struct dentry *rpc_sender_test; - struct dentry *rpc_qmi_diag_sender_test; - struct dentry *smem_test; - struct dentry *smem_rpc_test; - struct dentry *rmnet_a2_validation_test; - struct dentry *dun_a2_validation_test; - struct dentry *rmnet_a2_perf_test; - struct dentry *dun_a2_perf_test; - struct dentry *csvt_a2_perf_test; - struct dentry *rmnet_dun_a2_perf_test; - struct dentry *rpc_sender_rmnet_a2_perf_test; - struct dentry *all_channels_test; - struct dentry *host_sender_no_lp_diag_test; - struct dentry *host_sender_no_lp_diag_rpc_test; - struct dentry *rmnet_small_packets_test; - struct dentry *rmnet_rtt_test; - struct dentry *csvt_rtt_test; - struct dentry *modem_reset_rpc_test; - struct dentry *modem_reset_rmnet_test; - struct dentry *modem_reset_channels_4bit_dev_test; - struct dentry *modem_reset_channels_8bit_dev_test; - struct dentry *modem_reset_all_channels_test; - struct dentry *open_close_test; - struct dentry *open_close_dun_rmnet_test; - struct dentry *close_chan_lpm_test; - struct dentry *lpm_test_client_wakes_host_test; - struct dentry *lpm_test_host_wakes_client_test; - struct dentry *lpm_test_random_single_channel_test; - struct dentry *lpm_test_random_multi_channel_test; -}; - -struct test_context { - dev_t dev_num; - struct device *dev; - struct cdev *cdev; - int number_of_active_devices; - int max_number_of_devices; - - struct sdio_test_device test_dev_arr[MAX_NUM_OF_SDIO_DEVICES]; - - struct test_channel *test_ch; - - struct test_channel *test_ch_arr[SDIO_MAX_CHANNELS]; - - long testcase; - - const char *name; - - int exit_flag; - - u32 signature; - - int runtime_debug; - - struct platform_device *smem_pdev; - struct sdio_smem_client *sdio_smem; - int smem_was_init; - u8 *smem_buf; - uint32_t smem_counter; - - struct platform_device *csvt_app_pdev; - - wait_queue_head_t wait_q; - int test_completed; - int test_result; - struct sdio_al_test_debug debug; - - struct wake_lock wake_lock; - - unsigned int lpm_pseudo_random_seed; -}; - -/* FORWARD DECLARATIONS */ -static int set_params_loopback_9k(struct test_channel *tch); -static int set_params_smem_test(struct test_channel *tch); -static int set_params_a2_validation(struct test_channel *tch); -static int set_params_a2_perf(struct test_channel *tch); -static int set_params_8k_sender_no_lp(struct test_channel *tch); -static int set_params_a2_small_pkts(struct test_channel *tch); -static int set_params_rtt(struct test_channel *tch); -static int set_params_loopback_9k_close(struct test_channel *tch); -static int close_channel_lpm_test(int channel_num); -static int set_params_lpm_test(struct test_channel *tch, - enum sdio_test_case_type test, - int timer_interval_ms); -static void set_pseudo_random_seed(void); -static int set_params_modem_reset(struct test_channel *tch); -static int test_start(void); -static void rx_cleanup(struct test_channel *test_ch, int *rx_packet_count); -static void sdio_al_test_cleanup_channels(void); -static void notify(void *priv, unsigned channel_event); -#ifdef CONFIG_MSM_SDIO_SMEM -static int sdio_smem_open(struct sdio_smem_client *sdio_smem); -#endif - -/* - * Seed for pseudo random time sleeping in Random LPM test. - * If not set, current time in jiffies is used. - */ -static unsigned int seed; -module_param(seed, int, 0); -static struct test_context *test_ctx; - -static void sdio_al_test_initial_dev_and_chan(struct test_context *test_ctx) -{ - int i = 0; - - if (!test_ctx) { - pr_err(TEST_MODULE_NAME ":%s - test_ctx is NULL.\n", __func__); - return; - } - - for (i = 0 ; i < MAX_NUM_OF_SDIO_DEVICES ; ++i) - test_ctx->test_dev_arr[i].sdio_al_device = NULL; - - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - if (!tch) - continue; - tch->is_used = 0; - } - - sdio_al_test_cleanup_channels(); -} - -#ifdef CONFIG_DEBUG_FS - -static int message_repeat; - -static int sdio_al_test_extract_number(const char __user *buf, - size_t count) -{ - int ret = 0; - int number = -1; - char local_buf[MAX_STR_SIZE] = {0}; - char *start = NULL; - - if (count > MAX_STR_SIZE) { - pr_err(TEST_MODULE_NAME ": %s - MAX_STR_SIZE(%d) < count(%d). " - "Please choose smaller number\n", - __func__, MAX_STR_SIZE, (int)count); - return -EINVAL; - } - - if (copy_from_user(local_buf, buf, count)) { - pr_err(TEST_MODULE_NAME ": %s - copy_from_user() failed\n", - __func__); - return -EINVAL; - } - - /* adding null termination to the string */ - local_buf[count] = '\0'; - - /* stripping leading and trailing white spaces */ - start = strstrip(local_buf); - - ret = kstrtoint(start, 10, &number); - - if (ret) { - pr_err(TEST_MODULE_NAME " : %s - kstrtoint() failed\n", - __func__); - return ret; - } - - return number; -} - -static int sdio_al_test_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - message_repeat = 1; - return 0; -} - -static void sdio_al_test_cleanup_channels(void) -{ - int channel_num; - int dummy = 0; - - for (channel_num = 0 ; channel_num < SDIO_MAX_CHANNELS ; - ++channel_num) { - if (channel_num == SDIO_SMEM) - continue; - - rx_cleanup(test_ctx->test_ch_arr[channel_num], &dummy); - } - - return; -} - -/* RPC SENDER TEST */ -static ssize_t rpc_sender_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RPC SENDER TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_RPC]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rpc_sender_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRPC_SENDER_TEST\n" - "===============\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rpc_sender_test_ops = { - .open = sdio_al_test_open, - .write = rpc_sender_test_write, - .read = rpc_sender_test_read, -}; - -/* RPC, QMI & DIAG SENDER TEST */ -static ssize_t rpc_qmi_diag_sender_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RPC, QMI AND DIAG SENDER TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_QMI]); - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_DIAG]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rpc_qmi_diag_sender_test_read(struct file *file, - char __user - *buffer, size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRPC_QMI_DIAG_SENDER_TEST\n" - "========================\n" - "Description:\n" - "TBD\n"); - - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rpc_qmi_diag_sender_test_ops = { - .open = sdio_al_test_open, - .write = rpc_qmi_diag_sender_test_write, - .read = rpc_qmi_diag_sender_test_read, -}; - -/* SMEM TEST */ -static ssize_t smem_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- SMEM TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_smem_test(test_ctx->test_ch_arr[SDIO_SMEM]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t smem_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nSMEM_TEST\n" - "=========\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations smem_test_ops = { - .open = sdio_al_test_open, - .write = smem_test_write, - .read = smem_test_read, -}; - -/* SMEM & RPC TEST */ -static ssize_t smem_rpc_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- SMEM AND RPC TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_smem_test(test_ctx->test_ch_arr[SDIO_SMEM]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t smem_rpc_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nSMEM_RPC_TEST\n" - "=============\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations smem_rpc_test_ops = { - .open = sdio_al_test_open, - .write = smem_rpc_test_write, - .read = smem_rpc_test_read, -}; - -/* RMNET A2 VALIDATION TEST */ -static ssize_t rmnet_a2_validation_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RMNET A2 VALIDATION TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_validation(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rmnet_a2_validation_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRMNET_A2_VALIDATION_TEST\n" - "=========================\n" - "Description:\n" - "In this test, the HOST sends multiple packets to the\n" - "CLIENT and validates the packets loop backed from A2\n" - "for the RMNET channel.\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rmnet_a2_validation_test_ops = { - .open = sdio_al_test_open, - .write = rmnet_a2_validation_test_write, - .read = rmnet_a2_validation_test_read, -}; - -/* DUN A2 VALIDATION TEST */ -static ssize_t dun_a2_validation_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- DUN A2 VALIDATION TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_validation(test_ctx->test_ch_arr[SDIO_DUN]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t dun_a2_validation_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nDUN_A2_VALIDATION_TEST\n" - "=========================\n" - "Description:\n" - "In this test, the HOST sends multiple packets to the\n" - "CLIENT and validates the packets loop backed from A2\n" - "for the DUN channel.\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations dun_a2_validation_test_ops = { - .open = sdio_al_test_open, - .write = dun_a2_validation_test_write, - .read = dun_a2_validation_test_read, -}; - -/* RMNET A2 PERFORMANCE TEST */ -static ssize_t rmnet_a2_perf_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RMNET A2 PERFORMANCE TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rmnet_a2_perf_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRMNET_A2_PERFORMANCE_TEST\n" - "=========================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rmnet_a2_perf_test_ops = { - .open = sdio_al_test_open, - .write = rmnet_a2_perf_test_write, - .read = rmnet_a2_perf_test_read, -}; - -/* DUN A2 PERFORMANCE TEST */ -static ssize_t dun_a2_perf_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- DUN A2 PERFORMANCE TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_DUN]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t dun_a2_perf_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nDUN_A2_PERFORMANCE_TEST\n" - "=======================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations dun_a2_perf_test_ops = { - .open = sdio_al_test_open, - .write = dun_a2_perf_test_write, - .read = dun_a2_perf_test_read, -}; - -/* CSVT A2 PERFORMANCE TEST */ -static ssize_t csvt_a2_perf_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- CSVT A2 PERFORMANCE TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_CSVT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t csvt_a2_perf_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nCSVT_A2_PERFORMANCE_TEST\n" - "========================\n" - "Description:\n" - "Loopback test on the CSVT Channel, in order to check " - "throughput performance.\n" - "Packet size that are sent on the CSVT channel in this " - "test is %d.bytes\n\n" - "END OF DESCRIPTION\n", CSVT_PACKET_SIZE); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations csvt_a2_perf_test_ops = { - .open = sdio_al_test_open, - .write = csvt_a2_perf_test_write, - .read = csvt_a2_perf_test_read, -}; - -/* RMNET DUN A2 PERFORMANCE TEST */ -static ssize_t rmnet_dun_a2_perf_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RMNET AND DUN A2 PERFORMANCE TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_RMNT]); - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_DUN]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rmnet_dun_a2_perf_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRMNET_DUN_A2_PERFORMANCE_TEST\n" - "=============================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rmnet_dun_a2_perf_test_ops = { - .open = sdio_al_test_open, - .write = rmnet_dun_a2_perf_test_write, - .read = rmnet_dun_a2_perf_test_read, -}; - -/* RPC SENDER & RMNET A2 PERFORMANCE TEST */ -static ssize_t rpc_sender_rmnet_a2_perf_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "--RPC SENDER AND RMNET A2 " - "PERFORMANCE --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rpc_sender_rmnet_a2_perf_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRPC_SENDER_RMNET_A2_PERFORMANCE_TEST\n" - "====================================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rpc_sender_rmnet_a2_perf_test_ops = { - .open = sdio_al_test_open, - .write = rpc_sender_rmnet_a2_perf_test_write, - .read = rpc_sender_rmnet_a2_perf_test_read, -}; - -/* ALL CHANNELS TEST */ -static ssize_t all_channels_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- ALL THE CHANNELS TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_QMI]); - set_params_loopback_9k(test_ctx->test_ch_arr[SDIO_DIAG]); - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_RMNT]); - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_DUN]); - set_params_smem_test(test_ctx->test_ch_arr[SDIO_SMEM]); - set_params_a2_perf(test_ctx->test_ch_arr[SDIO_CSVT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t all_channels_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nALL_CHANNELS_TEST\n" - "=================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations all_channels_test_ops = { - .open = sdio_al_test_open, - .write = all_channels_test_write, - .read = all_channels_test_read, -}; - -/* HOST SENDER NO LP DIAG TEST */ -static ssize_t host_sender_no_lp_diag_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- HOST SENDER NO LP FOR DIAG TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_8k_sender_no_lp(test_ctx->test_ch_arr[SDIO_DIAG]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t host_sender_no_lp_diag_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nHOST_SENDER_NO_LP_DIAG_TEST\n" - "===========================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations host_sender_no_lp_diag_test_ops = { - .open = sdio_al_test_open, - .write = host_sender_no_lp_diag_test_write, - .read = host_sender_no_lp_diag_test_read, -}; - -/* HOST SENDER NO LP DIAG, RPC TEST */ -static ssize_t host_sender_no_lp_diag_rpc_test_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- HOST SENDER NO LP FOR DIAG, RPC " - "TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_8k_sender_no_lp(test_ctx->test_ch_arr[SDIO_DIAG]); - set_params_8k_sender_no_lp(test_ctx->test_ch_arr[SDIO_RPC]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t host_sender_no_lp_diag_rpc_test_read( - struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nHOST_SENDER_NO_LP_DIAG_RPC_TEST\n" - "===================================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations host_sender_no_lp_diag_rpc_test_ops = { - .open = sdio_al_test_open, - .write = host_sender_no_lp_diag_rpc_test_write, - .read = host_sender_no_lp_diag_rpc_test_read, -}; - -/* RMNET SMALL PACKETS TEST */ -static ssize_t rmnet_small_packets_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RMNET SMALL PACKETS (5-128) TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_a2_small_pkts(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rmnet_small_packets_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRMNET_SMALL_PACKETS_TEST\n" - "========================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rmnet_small_packets_test_ops = { - .open = sdio_al_test_open, - .write = rmnet_small_packets_test_write, - .read = rmnet_small_packets_test_read, -}; - -/* RMNET RTT TEST */ -static ssize_t rmnet_rtt_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- RMNET RTT TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_rtt(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t rmnet_rtt_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nRMNET_RTT_TEST\n" - "==============\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations rmnet_rtt_test_ops = { - .open = sdio_al_test_open, - .write = rmnet_rtt_test_write, - .read = rmnet_rtt_test_read, -}; - -/* CSVT RTT TEST */ -static ssize_t csvt_rtt_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- CSVT RTT TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_rtt(test_ctx->test_ch_arr[SDIO_CSVT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t csvt_rtt_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nCSVT_RTT_TEST\n" - "==============\n" - "Description:\n" - "In this test the HOST send a message of %d bytes " - "to the CLIENT\n\n" - "END OF DESCRIPTION\n", SDIO_CSVT_RTT_PACKET_SIZE); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations csvt_rtt_test_ops = { - .open = sdio_al_test_open, - .write = csvt_rtt_test_write, - .read = csvt_rtt_test_read, -}; - -/* MODEM RESET RPC TEST */ -static ssize_t modem_reset_rpc_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- MODEM RESET - RPC CHANNEL TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RPC]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t modem_reset_rpc_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nMODEM_RESET_RPC_TEST\n" - "====================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations modem_reset_rpc_test_ops = { - .open = sdio_al_test_open, - .write = modem_reset_rpc_test_write, - .read = modem_reset_rpc_test_read, -}; - -/* MODEM RESET RMNET TEST */ -static ssize_t modem_reset_rmnet_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- MODEM RESET - RMNT CHANNEL TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t modem_reset_rmnet_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nMODEM_RESET_RMNET_TEST\n" - "======================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations modem_reset_rmnet_test_ops = { - .open = sdio_al_test_open, - .write = modem_reset_rmnet_test_write, - .read = modem_reset_rmnet_test_read, -}; - -/* MODEM RESET - CHANNELS IN 4BIT DEVICE TEST */ -static ssize_t modem_reset_channels_4bit_dev_test_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- MODEM RESET - ALL CHANNELS IN " - "4BIT DEVICE TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_QMI]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_DIAG]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t modem_reset_channels_4bit_dev_test_read( - struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nMODEM_RESET_CHANNELS_4BIT_DEV_TEST\n" - "==================================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations modem_reset_channels_4bit_dev_test_ops = { - .open = sdio_al_test_open, - .write = modem_reset_channels_4bit_dev_test_write, - .read = modem_reset_channels_4bit_dev_test_read, -}; - -/* MODEM RESET - CHANNELS IN 8BIT DEVICE TEST */ -static ssize_t modem_reset_channels_8bit_dev_test_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- MODEM RESET - ALL CHANNELS IN " - "8BIT DEVICE TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RMNT]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_DUN]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t modem_reset_channels_8bit_dev_test_read( - struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nMODEM_RESET_CHANNELS_8BIT_DEV_TEST\n" - "==================================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations modem_reset_channels_8bit_dev_test_ops = { - .open = sdio_al_test_open, - .write = modem_reset_channels_8bit_dev_test_write, - .read = modem_reset_channels_8bit_dev_test_read, -}; - -/* MODEM RESET - ALL CHANNELS TEST */ -static ssize_t modem_reset_all_channels_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- MODEM RESET - ALL CHANNELS TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RPC]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_QMI]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_DIAG]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_RMNT]); - set_params_modem_reset(test_ctx->test_ch_arr[SDIO_DUN]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t modem_reset_all_channels_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nMODEM_RESET_ALL_CHANNELS_TEST\n" - "=============================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations modem_reset_all_channels_test_ops = { - .open = sdio_al_test_open, - .write = modem_reset_all_channels_test_write, - .read = modem_reset_all_channels_test_read, -}; - -/* HOST SENDER WITH OPEN/CLOSE TEST */ -static ssize_t open_close_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - struct test_channel **ch_arr = test_ctx->test_ch_arr; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- HOST SENDER WITH OPEN/CLOSE TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k_close(ch_arr[SDIO_DIAG]); - set_params_loopback_9k_close(ch_arr[SDIO_RPC]); - set_params_loopback_9k_close(ch_arr[SDIO_SMEM]); - set_params_loopback_9k_close(ch_arr[SDIO_QMI]); - set_params_loopback_9k_close(ch_arr[SDIO_RMNT]); - set_params_loopback_9k_close(ch_arr[SDIO_DUN]); - set_params_loopback_9k_close(ch_arr[SDIO_CSVT]); - - ret = test_start(); - - if (ret) - break; - - pr_info(TEST_MODULE_NAME " -- correctness test for" - "DIAG "); - set_params_loopback_9k(ch_arr[SDIO_DIAG]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t open_close_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nOPEN_CLOSE_TEST\n" - "============================\n" - "Description:\n" - "In this test the host sends 5k packets to the modem in the " - "following sequence: Send a random burst of packets on " - "Diag and Rmnet channels, read 0 or a random number " - "of packets, close and re-open the channel. At the end of the " - "test, the channel is verified by running a loopback test\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations open_close_test_ops = { - .open = sdio_al_test_open, - .write = open_close_test_write, - .read = open_close_test_read, -}; - -/* HOST SENDER WITH OPEN/CLOSE FOR DUN & RMNET TEST */ -static ssize_t open_close_dun_rmnet_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - struct test_channel **ch_arr = test_ctx->test_ch_arr; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- HOST SENDER WITH OPEN/CLOSE FOR " - "DUN AND RMNET TEST --"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_loopback_9k_close(ch_arr[SDIO_DUN]); - set_params_loopback_9k_close(ch_arr[SDIO_RMNT]); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t open_close_dun_rmnet_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nOPEN_CLOSE_DUN_RMNET_TEST\n" - "============================\n" - "Description:\n" - "In this test the host sends 5k packets to the modem in the " - "following sequence: Send a random burst of packets on " - "DUN and Rmnet channels, read 0 or a random number " - "of packets, close and re-open the channel.\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations open_close_dun_rmnet_test_ops = { - .open = sdio_al_test_open, - .write = open_close_dun_rmnet_test_write, - .read = open_close_dun_rmnet_test_read, -}; - -/* CLOSE CHANNEL & LPM TEST HOST WAKES THE CLIENT TEST */ -static ssize_t close_chan_lpm_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int channel_num = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- CLOSE CHANNEL & LPM TEST " - "HOST WAKES THE CLIENT TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - for (channel_num = 0 ; channel_num < SDIO_MAX_CHANNELS ; - channel_num++) { - - ret = close_channel_lpm_test(channel_num); - - if (ret) - break; - - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_RPC], - SDIO_TEST_LPM_HOST_WAKER, 120); - - ret = test_start(); - - if (ret) - break; - } - - if (ret) { - pr_err(TEST_MODULE_NAME " -- Close channel & LPM Test " - "FAILED: %d --\n", ret); - } else { - pr_err(TEST_MODULE_NAME " -- Close channel & LPM Test " - "PASSED\n"); - } - } - - return count; -} - -static ssize_t close_chan_lpm_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nCLOSE_CHAN_LPM_TEST\n" - "===================\n" - "Description:\n" - "TBD\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations close_chan_lpm_test_ops = { - .open = sdio_al_test_open, - .write = close_chan_lpm_test_write, - .read = close_chan_lpm_test_read, -}; - -/* LPM TEST FOR DEVICE 1. CLIENT WAKES THE HOST TEST */ -static ssize_t lpm_test_client_wakes_host_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- LPM TEST FOR DEVICE 1. CLIENT " - "WAKES THE HOST TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_RPC], - SDIO_TEST_LPM_CLIENT_WAKER, 90); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t lpm_test_client_wakes_host_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nLPM_TEST_CLIENT_WAKES_HOST_TEST\n" - "===============================\n" - "Description:\n" - "In this test, the HOST is going into LPM mode,\n" - "and the CLIENT is responsible to send it a message\n" - "in order to wake it up\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations lpm_test_client_wakes_host_test_ops = { - .open = sdio_al_test_open, - .write = lpm_test_client_wakes_host_test_write, - .read = lpm_test_client_wakes_host_test_read, -}; - -/* LPM TEST FOR DEVICE 1. HOST WAKES THE CLIENT TEST */ -static ssize_t lpm_test_host_wakes_client_test_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- LPM TEST FOR DEVICE 1. HOST " - "WAKES THE CLIENT TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_RPC], - SDIO_TEST_LPM_HOST_WAKER, 120); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t lpm_test_host_wakes_client_test_read(struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nLPM_TEST_HOST_WAKES_CLIENT_TEST\n" - "===============================\n" - "Description:\n" - "In this test, the CLIENT goes into LPM mode, and the\n" - "HOST is responsible to send it a message\n" - "in order to wake it up\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations lpm_test_host_wakes_client_test_ops = { - .open = sdio_al_test_open, - .write = lpm_test_host_wakes_client_test_write, - .read = lpm_test_host_wakes_client_test_read, -}; - -/* LPM TEST RANDOM, SINGLE CHANNEL TEST */ -static ssize_t lpm_test_random_single_channel_test_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- LPM TEST RANDOM SINGLE " - "CHANNEL TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_pseudo_random_seed(); - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_RPC], - SDIO_TEST_LPM_RANDOM, 0); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t lpm_test_random_single_channel_test_read( - struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nLPM_TEST_RANDOM_SINGLE_CHANNEL_TEST\n" - "===================================\n" - "Description:\n" - "In this test, the HOST and CLIENT " - "send messages to each other,\n" - "random in time, over RPC channel only.\n" - "All events are being recorded, and later on,\n" - "they are being analysed by the HOST and by the CLIENT\n," - "in order to check if the LPM mechanism worked properly,\n" - "meaning:" - " When all the relevant conditions are met, a device should:\n" - "1. Go to sleep\n" - "2. Wake up\n" - "3. Stay awake\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations lpm_test_random_single_channel_test_ops = { - .open = sdio_al_test_open, - .write = lpm_test_random_single_channel_test_write, - .read = lpm_test_random_single_channel_test_read, -}; - -/* LPM TEST RANDOM, MULTI CHANNEL TEST */ -static ssize_t lpm_test_random_multi_channel_test_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int ret = 0; - int i = 0; - int number = -1; - - pr_info(TEST_MODULE_NAME "-- LPM TEST RANDOM MULTI CHANNEL TEST --\n"); - - number = sdio_al_test_extract_number(buf, count); - - if (number < 0) { - pr_err(TEST_MODULE_NAME " : %s - sdio_al_test_extract_number() " - "failed. number = %d\n", __func__, number); - return count; - } - - for (i = 0 ; i < number ; ++i) { - pr_info(TEST_MODULE_NAME " - Cycle # %d / %d\n", i+1, number); - pr_info(TEST_MODULE_NAME " ==================="); - - sdio_al_test_initial_dev_and_chan(test_ctx); - - set_pseudo_random_seed(); - - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_RPC], - SDIO_TEST_LPM_RANDOM, 0); - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_DIAG], - SDIO_TEST_LPM_RANDOM, 0); - set_params_lpm_test(test_ctx->test_ch_arr[SDIO_QMI], - SDIO_TEST_LPM_RANDOM, 0); - - ret = test_start(); - - if (ret) - break; - } - - return count; -} - -static ssize_t lpm_test_random_multi_channel_test_read( - struct file *file, - char __user *buffer, - size_t count, - loff_t *offset) -{ - memset((void *)buffer, 0, count); - - snprintf(buffer, count, - "\nLPM_TEST_RANDOM_MULTI_CHANNEL_TEST\n" - "==================================\n" - "Description:\n" - "In this test, the HOST and CLIENT " - "send messages to each other,\n" - "random in time, over RPC, QMI AND DIAG channels\n" - "(i.e, on both SDIO devices).\n" - "All events are being recorded, and later on,\n" - "they are being analysed by the HOST and by the CLIENT,\n" - "in order to check if the LPM mechanism worked properly,\n" - "meaning:" - " When all the relevant conditions are met, a device should:\n" - "1. Go to sleep\n" - "2. Wake up\n" - "3. Stay awake\n\n" - "END OF DESCRIPTION\n"); - - if (message_repeat == 1) { - message_repeat = 0; - return strnlen(buffer, count); - } else { - return 0; - } -} - -const struct file_operations lpm_test_random_multi_channel_test_ops = { - .open = sdio_al_test_open, - .write = lpm_test_random_multi_channel_test_write, - .read = lpm_test_random_multi_channel_test_read, -}; - -static int sdio_al_test_debugfs_init(void) -{ - test_ctx->debug.debug_root = debugfs_create_dir("sdio_al_test", - NULL); - if (!test_ctx->debug.debug_root) - return -ENOENT; - - test_ctx->debug.debug_test_result = debugfs_create_u32( - "test_result", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - &test_ctx->test_result); - - test_ctx->debug.debug_dun_throughput = debugfs_create_u32( - "dun_throughput", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - &test_ctx->debug.dun_throughput); - - test_ctx->debug.debug_rmnt_throughput = debugfs_create_u32( - "rmnt_throughput", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - &test_ctx->debug.rmnt_throughput); - - test_ctx->debug.rpc_sender_test = - debugfs_create_file("10_rpc_sender_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rpc_sender_test_ops); - - test_ctx->debug.rpc_qmi_diag_sender_test = - debugfs_create_file("20_rpc_qmi_diag_sender_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rpc_qmi_diag_sender_test_ops); - - test_ctx->debug.rmnet_a2_validation_test = - debugfs_create_file("30_rmnet_a2_validation_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rmnet_a2_validation_test_ops); - - test_ctx->debug.dun_a2_validation_test = - debugfs_create_file("40_dun_a2_validation_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &dun_a2_validation_test_ops); - - test_ctx->debug.rmnet_a2_perf_test = - debugfs_create_file("50_rmnet_a2_perf_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rmnet_a2_perf_test_ops); - - test_ctx->debug.dun_a2_perf_test = - debugfs_create_file("60_dun_a2_perf_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &dun_a2_perf_test_ops); - - test_ctx->debug.csvt_a2_perf_test = - debugfs_create_file("71_csvt_a2_perf_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &csvt_a2_perf_test_ops); - - test_ctx->debug.rmnet_dun_a2_perf_test = - debugfs_create_file("70_rmnet_dun_a2_perf_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rmnet_dun_a2_perf_test_ops); - - test_ctx->debug.rpc_sender_rmnet_a2_perf_test = - debugfs_create_file("80_rpc_sender_rmnet_a2_perf_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rpc_sender_rmnet_a2_perf_test_ops); - - test_ctx->debug.smem_test = - debugfs_create_file("90_smem_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &smem_test_ops); - - test_ctx->debug.smem_rpc_test = - debugfs_create_file("100_smem_rpc_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &smem_rpc_test_ops); - - test_ctx->debug.all_channels_test = - debugfs_create_file("150_all_channels_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &all_channels_test_ops); - - test_ctx->debug.host_sender_no_lp_diag_test = - debugfs_create_file("160_host_sender_no_lp_diag_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &host_sender_no_lp_diag_test_ops); - - test_ctx->debug.host_sender_no_lp_diag_rpc_test = - debugfs_create_file("170_host_sender_no_lp_diag_rpc_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &host_sender_no_lp_diag_rpc_test_ops); - - test_ctx->debug.rmnet_small_packets_test = - debugfs_create_file("180_rmnet_small_packets_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rmnet_small_packets_test_ops); - - test_ctx->debug.rmnet_rtt_test = - debugfs_create_file("190_rmnet_rtt_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &rmnet_rtt_test_ops); - - test_ctx->debug.csvt_rtt_test = - debugfs_create_file("191_csvt_rtt_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &csvt_rtt_test_ops); - - test_ctx->debug.modem_reset_rpc_test = - debugfs_create_file("220_modem_reset_rpc_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &modem_reset_rpc_test_ops); - - test_ctx->debug.modem_reset_rmnet_test = - debugfs_create_file("230_modem_reset_rmnet_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &modem_reset_rmnet_test_ops); - - test_ctx->debug.modem_reset_channels_4bit_dev_test = - debugfs_create_file("240_modem_reset_channels_4bit_dev_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &modem_reset_channels_4bit_dev_test_ops); - - test_ctx->debug.modem_reset_channels_8bit_dev_test = - debugfs_create_file("250_modem_reset_channels_8bit_dev_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &modem_reset_channels_8bit_dev_test_ops); - - test_ctx->debug.modem_reset_all_channels_test = - debugfs_create_file("260_modem_reset_all_channels_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &modem_reset_all_channels_test_ops); - - test_ctx->debug.open_close_test = - debugfs_create_file("270_open_close_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &open_close_test_ops); - - test_ctx->debug.open_close_dun_rmnet_test = - debugfs_create_file("271_open_close_dun_rmnet_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &open_close_dun_rmnet_test_ops); - - test_ctx->debug.close_chan_lpm_test = - debugfs_create_file("280_close_chan_lpm_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &close_chan_lpm_test_ops); - - test_ctx->debug.lpm_test_client_wakes_host_test = - debugfs_create_file("600_lpm_test_client_wakes_host_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &lpm_test_client_wakes_host_test_ops); - - test_ctx->debug.lpm_test_host_wakes_client_test = - debugfs_create_file("610_lpm_test_host_wakes_client_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &lpm_test_host_wakes_client_test_ops); - - test_ctx->debug.lpm_test_random_single_channel_test = - debugfs_create_file("620_lpm_test_random_single_channel_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &lpm_test_random_single_channel_test_ops); - - test_ctx->debug.lpm_test_random_multi_channel_test = - debugfs_create_file("630_lpm_test_random_multi_channel_test", - S_IRUGO | S_IWUGO, - test_ctx->debug.debug_root, - NULL, - &lpm_test_random_multi_channel_test_ops); - - if ((!test_ctx->debug.debug_dun_throughput) && - (!test_ctx->debug.debug_rmnt_throughput)) { - debugfs_remove_recursive(test_ctx->debug.debug_root); - test_ctx->debug.debug_root = NULL; - return -ENOENT; - } - return 0; -} - -static void sdio_al_test_debugfs_cleanup(void) -{ - debugfs_remove(test_ctx->debug.debug_dun_throughput); - debugfs_remove(test_ctx->debug.debug_rmnt_throughput); - debugfs_remove(test_ctx->debug.debug_root); -} -#endif - -static int channel_name_to_id(char *name) -{ - pr_info(TEST_MODULE_NAME "%s: channel name %s\n", - __func__, name); - - if (!strncmp(name, "SDIO_RPC_TEST", - strnlen("SDIO_RPC_TEST", CHANNEL_NAME_SIZE))) - return SDIO_RPC; - else if (!strncmp(name, "SDIO_QMI_TEST", - strnlen("SDIO_QMI_TEST", TEST_CH_NAME_SIZE))) - return SDIO_QMI; - else if (!strncmp(name, "SDIO_RMNT_TEST", - strnlen("SDIO_RMNT_TEST", TEST_CH_NAME_SIZE))) - return SDIO_RMNT; - else if (!strncmp(name, "SDIO_DIAG_TEST", - strnlen("SDIO_DIAG", TEST_CH_NAME_SIZE))) - return SDIO_DIAG; - else if (!strncmp(name, "SDIO_DUN_TEST", - strnlen("SDIO_DUN_TEST", TEST_CH_NAME_SIZE))) - return SDIO_DUN; - else if (!strncmp(name, "SDIO_SMEM_TEST", - strnlen("SDIO_SMEM_TEST", TEST_CH_NAME_SIZE))) - return SDIO_SMEM; - else if (!strncmp(name, "SDIO_CSVT_TEST", - strnlen("SDIO_CSVT_TEST", TEST_CH_NAME_SIZE))) - return SDIO_CSVT; - else - return SDIO_MAX_CHANNELS; - - return SDIO_MAX_CHANNELS; -} - -/** - * Allocate and add SDIO_SMEM platform device - */ -#ifdef CONFIG_MSM_SDIO_SMEM -static int add_sdio_smem(void) -{ - int ret = 0; - - test_ctx->smem_pdev = platform_device_alloc("SDIO_SMEM", -1); - ret = platform_device_add(test_ctx->smem_pdev); - if (ret) { - pr_err(TEST_MODULE_NAME ": platform_device_add failed, " - "ret=%d\n", ret); - return ret; - } - return 0; -} -#endif - -static int open_sdio_ch(struct test_channel *tch) -{ - int ret = 0; - - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s NULL tch\n", __func__); - return -EINVAL; - } - - if (!tch->ch_ready) { - TEST_DBG(TEST_MODULE_NAME ":openning channel %s\n", - tch->name); - if (tch->ch_id == SDIO_SMEM) { -#ifdef CONFIG_MSM_SDIO_SMEM - if (!test_ctx->smem_pdev) - ret = add_sdio_smem(); - else - ret = sdio_smem_open(test_ctx->sdio_smem); - if (ret) { - pr_err(TEST_MODULE_NAME - ":openning channel %s failed\n", - tch->name); - tch->ch_ready = false; - return -EINVAL; - } -#endif - } else { - tch->ch_ready = true; - ret = sdio_open(tch->name , &tch->ch, tch, - notify); - if (ret) { - pr_err(TEST_MODULE_NAME - ":openning channel %s failed\n", - tch->name); - tch->ch_ready = false; - return -EINVAL; - } - } - } - return ret; -} - -static int close_sdio_ch(struct test_channel *tch) -{ - int ret = 0; - - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s NULL tch\n", __func__); - return -EINVAL; - } - - if (tch->ch_id == SDIO_SMEM) { -#ifdef CONFIG_MSM_SDIO_SMEM - TEST_DBG(TEST_MODULE_NAME":%s closing channel %s", - __func__, tch->name); - ret = sdio_smem_unregister_client(); - test_ctx->smem_counter = 0; -#endif - } else { - ret = sdio_close(tch->ch); - } - - if (ret) { - pr_err(TEST_MODULE_NAME":%s close channel %s" - " failed\n", __func__, tch->name); - } else { - TEST_DBG(TEST_MODULE_NAME":%s close channel %s" - " success\n", __func__, tch->name); - tch->ch_ready = false; - } - return ret; -} - -/** - * Config message - */ - -static void send_config_msg(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 write_avail = 0; - int size = sizeof(test_ch->config_msg); - - pr_debug(TEST_MODULE_NAME "%s\n", __func__); - - memcpy(test_ch->buf, (void *)&test_ch->config_msg, size); - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - pr_info(TEST_MODULE_NAME ":Sending the config message.\n"); - - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - pr_debug(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - - write_avail = sdio_write_avail(test_ch->ch); - pr_debug(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - pr_info(TEST_MODULE_NAME ":not enough write avail.\n"); - return; - } - - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) - pr_err(TEST_MODULE_NAME ":%s sdio_write err=%d.\n", - __func__, -ret); - else - pr_info(TEST_MODULE_NAME ":%s sent config_msg successfully.\n", - __func__); -} - -/** - * Loopback Test - */ -static void loopback_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - - while (1) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - TEST_DBG(TEST_MODULE_NAME "--LOOPBACK WAIT FOR EVENT--.\n"); - /* wait for data ready event */ - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail == 0) - continue; - - - write_avail = sdio_write_avail(test_ch->ch); - if (write_avail < read_avail) { - pr_info(TEST_MODULE_NAME - ":not enough write avail.\n"); - continue; - } - - ret = sdio_read(test_ch->ch, test_ch->buf, read_avail); - if (ret) { - pr_info(TEST_MODULE_NAME - ":worker, sdio_read err=%d.\n", -ret); - continue; - } - test_ch->rx_bytes += read_avail; - - TEST_DBG(TEST_MODULE_NAME ":worker total rx bytes = 0x%x.\n", - test_ch->rx_bytes); - - - ret = sdio_write(test_ch->ch, - test_ch->buf, read_avail); - if (ret) { - pr_info(TEST_MODULE_NAME - ":loopback sdio_write err=%d.\n", - -ret); - continue; - } - test_ch->tx_bytes += read_avail; - - TEST_DBG(TEST_MODULE_NAME - ":loopback total tx bytes = 0x%x.\n", - test_ch->tx_bytes); - } /* end of while */ -} - -/** - * Check if all tests completed - */ -static void check_test_completion(void) -{ - int i; - - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used) || (!tch->ch_ready)) - continue; - if (!tch->test_completed) { - pr_info(TEST_MODULE_NAME ": %s - Channel %s test is " - "not completed", __func__, tch->name); - return; - } - } - pr_info(TEST_MODULE_NAME ": %s - Test is completed", __func__); - test_ctx->test_completed = 1; - wake_up(&test_ctx->wait_q); -} - -static int pseudo_random_seed(unsigned int *seed_number) -{ - if (!seed_number) - return 0; - - *seed_number = (unsigned int)(((unsigned long)*seed_number * - (unsigned long)1103515367) + 35757); - return (int)((*seed_number / (64*1024)) % 500); -} - -/* this function must be locked before accessing it */ -static void lpm_test_update_entry(struct test_channel *tch, - enum lpm_test_msg_type msg_type, - char *msg_name, - int counter) -{ - u32 index = 0; - static int print_full = 1; - struct sdio_test_device *test_device; - - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s - NULL test channel\n", __func__); - return; - } - - test_device = tch->test_device; - - if (!test_device) { - pr_err(TEST_MODULE_NAME ": %s - NULL test device\n", __func__); - return; - } - - if (!test_device->lpm_arr) { - pr_err(TEST_MODULE_NAME ": %s - NULL lpm_arr\n", __func__); - return; - } - - if (test_device->next_avail_entry_in_array >= - test_device->array_size) { - pr_err(TEST_MODULE_NAME ": %s - lpm array is full", - __func__); - - if (print_full) { - print_hex_dump(KERN_INFO, TEST_MODULE_NAME ": lpm_arr:", - 0, 32, 2, - (void *)test_device->lpm_arr, - sizeof(test_device->lpm_arr), false); - print_full = 0; - } - return; - } - - index = test_device->next_avail_entry_in_array; - if ((msg_type == LPM_MSG_SEND) || (msg_type == LPM_MSG_REC)) - test_device->lpm_arr[index].counter = counter; - else - test_device->lpm_arr[index].counter = 0; - - test_device->lpm_arr[index].msg_type = msg_type; - memcpy(test_device->lpm_arr[index].msg_name, msg_name, - LPM_MSG_NAME_SIZE); - test_device->lpm_arr[index].current_ms = - jiffies_to_msecs(get_jiffies_64()); - - test_device->lpm_arr[index].read_avail_mask = - test_device->read_avail_mask; - - if ((msg_type == LPM_SLEEP) || (msg_type == LPM_WAKEUP)) - memcpy(test_device->lpm_arr[index].chan_name, "DEVICE ", - CHANNEL_NAME_SIZE); - else - memcpy(test_device->lpm_arr[index].chan_name, tch->name, - CHANNEL_NAME_SIZE); - - test_device->next_avail_entry_in_array++; -} - -static int wait_for_result_msg(struct test_channel *test_ch) -{ - u32 read_avail = 0; - int ret = 0; - - pr_info(TEST_MODULE_NAME ": %s - START, channel %s\n", - __func__, test_ch->name); - - while (1) { - read_avail = sdio_read_avail(test_ch->ch); - - if (read_avail == 0) { - pr_info(TEST_MODULE_NAME - ": read_avail is 0 for chan %s\n", - test_ch->name); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - continue; - } - - memset(test_ch->buf, 0x00, test_ch->buf_size); - - ret = sdio_read(test_ch->ch, test_ch->buf, read_avail); - if (ret) { - pr_info(TEST_MODULE_NAME ": sdio_read for chan" - "%s failed, err=%d.\n", - test_ch->name, -ret); - goto exit_err; - } - - if (test_ch->buf[0] != TEST_CONFIG_SIGNATURE) { - pr_info(TEST_MODULE_NAME ": Not a test_result " - "signature. expected 0x%x. received 0x%x " - "for chan %s\n", - TEST_CONFIG_SIGNATURE, - test_ch->buf[0], - test_ch->name); - continue; - } else { - pr_info(TEST_MODULE_NAME ": Signature is " - "TEST_CONFIG_SIGNATURE as expected for" - "channel %s\n", test_ch->name); - break; - } - } - - return test_ch->buf[1]; - -exit_err: - return 0; -} - -static void print_random_lpm_test_array(struct sdio_test_device *test_dev) -{ - int i; - - if (!test_dev) { - pr_err(TEST_MODULE_NAME ": %s - NULL test device\n", __func__); - return; - } - - for (i = 0 ; i < test_dev->next_avail_entry_in_array ; ++i) { - if (i == 0) - pr_err(TEST_MODULE_NAME ": index %4d, chan=%2s, " - "code=%1d=%4s, msg#%1d, ms from before=-1, " - "read_mask=0x%d, ms=%2u", - i, - test_dev->lpm_arr[i].chan_name, - test_dev->lpm_arr[i].msg_type, - test_dev->lpm_arr[i].msg_name, - test_dev->lpm_arr[i].counter, - test_dev->lpm_arr[i].read_avail_mask, - test_dev->lpm_arr[i].current_ms); - else - pr_err(TEST_MODULE_NAME ": index " - "%4d, %2s, code=%1d=%4s, msg#%1d, ms from " - "before=%2u, read_mask=0x%d, ms=%2u", - i, - test_dev->lpm_arr[i].chan_name, - test_dev->lpm_arr[i].msg_type, - test_dev->lpm_arr[i].msg_name, - test_dev->lpm_arr[i].counter, - test_dev->lpm_arr[i].current_ms - - test_dev->lpm_arr[i-1].current_ms, - test_dev->lpm_arr[i].read_avail_mask, - test_dev->lpm_arr[i].current_ms); - - udelay(1000); - } -} - -static int check_random_lpm_test_array(struct sdio_test_device *test_dev) -{ - int i = 0, j = 0; - unsigned int delta_ms = 0; - int arr_ind = 0; - int ret = 0; - int notify_counter = 0; - int sleep_counter = 0; - int wakeup_counter = 0; - int lpm_activity_counter = 0; - - if (!test_dev) { - pr_err(TEST_MODULE_NAME ": %s - NULL test device\n", __func__); - return -ENODEV; - } - - for (i = 0; i < test_dev->next_avail_entry_in_array; i++) { - notify_counter = 0; - sleep_counter = 0; - wakeup_counter = 0; - - if ((test_dev->lpm_arr[i].msg_type == LPM_MSG_SEND) || - (test_dev->lpm_arr[i].msg_type == LPM_MSG_REC)) { - /* find the next message in the array */ - arr_ind = test_dev->next_avail_entry_in_array; - for (j = i+1; j < arr_ind; j++) { - if ((test_dev->lpm_arr[j].msg_type == - LPM_MSG_SEND) || - (test_dev->lpm_arr[j].msg_type == - LPM_MSG_REC) || - (test_dev->lpm_arr[j].msg_type == - LPM_NOTIFY)) - break; - if (test_dev->lpm_arr[j].msg_type == - LPM_SLEEP) - sleep_counter++; - if (test_dev->lpm_arr[j].msg_type == - LPM_WAKEUP) - wakeup_counter++; - } - if (j == arr_ind) { - ret = 0; - break; - } - - delta_ms = test_dev->lpm_arr[j].current_ms - - test_dev->lpm_arr[i].current_ms; - if (delta_ms < 30) { - if ((sleep_counter == 0) - && (wakeup_counter == 0)) { - continue; - } else { - pr_err(TEST_MODULE_NAME "%s: lpm " - "activity while delta is less " - "than 30, i=%d, j=%d, " - "sleep_counter=%d, " - "wakeup_counter=%d", - __func__, i, j, - sleep_counter, wakeup_counter); - ret = -ENODEV; - break; - } - } else { - if ((delta_ms > 90) && - (test_dev->lpm_arr[i]. - read_avail_mask == 0)) { - if (j != i+3) { - pr_err(TEST_MODULE_NAME - "%s: unexpected " - "lpm activity " - "while delta is " - "bigger than " - "90, i=%d, " - "j=%d, " - "notify_counter" - "=%d", - __func__, i, j, - notify_counter); - ret = -ENODEV; - break; - } - lpm_activity_counter++; - } - } - } - } - - pr_info(TEST_MODULE_NAME ": %s - lpm_activity_counter=%d", - __func__, lpm_activity_counter); - - return ret; -} - -static int lpm_test_main_task(void *ptr) -{ - u32 read_avail = 0; - int last_msg_index = 0; - struct test_channel *test_ch = (struct test_channel *)ptr; - struct sdio_test_device *test_dev; - struct lpm_msg lpm_msg; - int ret = 0; - int host_result = 0; - - if (!test_ch) { - pr_err(TEST_MODULE_NAME ": %s - NULL channel\n", __func__); - return -ENODEV; - } - - pr_err(TEST_MODULE_NAME ": %s - STARTED. channel %s\n", - __func__, test_ch->name); - - test_dev = test_ch->test_device; - - if (!test_dev) { - pr_err(TEST_MODULE_NAME ": %s - NULL Test Device\n", __func__); - return -ENODEV; - } - - while (last_msg_index < test_ch->config_msg.num_packets - 1) { - - TEST_DBG(TEST_MODULE_NAME ": %s - " - "IN LOOP last_msg_index=%d\n", - __func__, last_msg_index); - - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail == 0) { - TEST_DBG(TEST_MODULE_NAME - ":read_avail 0 for chan %s, " - "wait for event\n", - test_ch->name); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail == 0) { - pr_err(TEST_MODULE_NAME - ":read_avail size %d for chan %s not as" - " expected\n", - read_avail, test_ch->name); - continue; - } - } - - memset(test_ch->buf, 0x00, sizeof(test_ch->buf)); - - ret = sdio_read(test_ch->ch, test_ch->buf, read_avail); - if (ret) { - pr_info(TEST_MODULE_NAME ":sdio_read for chan %s" - " err=%d.\n", test_ch->name, -ret); - goto exit_err; - } - - memcpy((void *)&lpm_msg, test_ch->buf, sizeof(lpm_msg)); - - /* - * when reading from channel, we want to turn off the bit - * mask that implies that there is pending data on that channel - */ - if (test_ch->test_device != NULL) { - spin_lock_irqsave(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - - test_ch->notify_counter_per_chan--; - - /* - * if the channel has no pending data, turn off the - * pending data bit mask of the channel - */ - if (test_ch->notify_counter_per_chan == 0) { - test_ch->test_device->read_avail_mask = - test_ch->test_device->read_avail_mask & - ~test_ch->channel_mask_id; - } - - last_msg_index = lpm_msg.counter; - lpm_test_update_entry(test_ch, - LPM_MSG_REC, - "RECEIVE", - last_msg_index); - - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - } - } - - pr_info(TEST_MODULE_NAME ":%s: Finished to recieve all (%d) " - "packets from the modem %s. Waiting for result_msg", - __func__, test_ch->config_msg.num_packets, test_ch->name); - - /* Wait for the resault message from the modem */ - test_ch->modem_result_per_chan = wait_for_result_msg(test_ch); - - /* - * the DEVICE modem result is a failure if one of the channels on - * that device, got modem_result = 0. this is why we bitwise "AND" each - * time another channel completes its task - */ - test_dev->modem_result_per_dev &= test_ch->modem_result_per_chan; - - /* - * when reading from channel, we want to turn off the bit - * mask that implies that there is pending data on that channel - */ - spin_lock_irqsave(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - - test_dev->open_channels_counter_to_recv--; - - /* turning off the read_avail bit of the channel */ - test_ch->test_device->read_avail_mask = - test_ch->test_device->read_avail_mask & - ~test_ch->channel_mask_id; - - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - - /* Wait for all the packets to be sent to the modem */ - while (1) { - spin_lock_irqsave(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - - if (test_ch->next_index_in_sent_msg_per_chan >= - test_ch->config_msg.num_packets - 1) { - - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - break; - } else { - pr_info(TEST_MODULE_NAME ":%s: Didn't finished to send " - "all packets, " - "next_index_in_sent_msg_per_chan = %d ", - __func__, - test_ch->next_index_in_sent_msg_per_chan); - } - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - msleep(60); - } - - /* - * if device has still open channels to test, then the test on the - * device is still running but the test on current channel is completed - */ - if (test_dev->open_channels_counter_to_recv != 0 || - test_dev->open_channels_counter_to_send != 0) { - test_ch->test_completed = 1; - return 0; - } else { - test_ctx->number_of_active_devices--; - sdio_al_unregister_lpm_cb(test_ch->sdio_al_device); - - if (test_ch->test_type == SDIO_TEST_LPM_RANDOM) - host_result = check_random_lpm_test_array(test_dev); - - if (host_result || - !test_dev->modem_result_per_dev || - test_ctx->runtime_debug) - print_random_lpm_test_array(test_dev); - - pr_info(TEST_MODULE_NAME ": %s - host_result=%d.(0 for " - "SUCCESS) device_modem_result=%d (1 for SUCCESS)", - __func__, host_result, test_dev->modem_result_per_dev); - - test_ch->test_completed = 1; - if (test_dev->modem_result_per_dev && !host_result) { - pr_info(TEST_MODULE_NAME ": %s - Random LPM " - "TEST_PASSED for device %d of %d\n", - __func__, - (test_ctx->max_number_of_devices- - test_ctx->number_of_active_devices), - test_ctx->max_number_of_devices); - test_dev->final_result_per_dev = 1; /* PASSED */ - } else { - pr_info(TEST_MODULE_NAME ": %s - Random LPM " - "TEST_FAILED for device %d of %d\n", - __func__, - (test_ctx->max_number_of_devices- - test_ctx->number_of_active_devices), - test_ctx->max_number_of_devices); - test_dev->final_result_per_dev = 0; /* FAILED */ - } - - check_test_completion(); - - kfree(test_ch->test_device->lpm_arr); - - return 0; - } - -exit_err: - pr_info(TEST_MODULE_NAME ": TEST FAIL for chan %s.\n", - test_ch->name); - test_ch->test_completed = 1; - test_dev->open_channels_counter_to_recv--; - test_dev->next_avail_entry_in_array = 0; - test_ch->next_index_in_sent_msg_per_chan = 0; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return -ENODEV; -} - -static int lpm_test_create_read_thread(struct test_channel *test_ch) -{ - struct sdio_test_device *test_dev; - - pr_info(TEST_MODULE_NAME ": %s - STARTED channel %s\n", - __func__, test_ch->name); - - if (!test_ch) { - pr_err(TEST_MODULE_NAME ": %s - NULL test channel\n", __func__); - return -ENODEV; - } - - test_dev = test_ch->test_device; - - if (!test_dev) { - pr_err(TEST_MODULE_NAME ": %s - NULL test device\n", __func__); - return -ENODEV; - } - - test_dev->lpm_test_task.task_name = SDIO_LPM_TEST; - - test_dev->lpm_test_task.lpm_task = - kthread_create(lpm_test_main_task, - (void *)(test_ch), - test_dev->lpm_test_task.task_name); - - if (IS_ERR(test_dev->lpm_test_task.lpm_task)) { - pr_err(TEST_MODULE_NAME ": %s - kthread_create() failed\n", - __func__); - return -ENOMEM; - } - - wake_up_process(test_dev->lpm_test_task.lpm_task); - - return 0; -} - -static void lpm_continuous_rand_test(struct test_channel *test_ch) -{ - unsigned int local_ms = 0; - int ret = 0; - unsigned int write_avail = 0; - struct sdio_test_device *test_dev; - - pr_info(MODULE_NAME ": %s - STARTED\n", __func__); - - if (!test_ch) { - pr_err(TEST_MODULE_NAME ": %s - NULL channel\n", __func__); - return; - } - - test_dev = test_ch->test_device; - - if (!test_dev) { - pr_err(TEST_MODULE_NAME ": %s - NULL Test Device\n", __func__); - return; - } - - ret = lpm_test_create_read_thread(test_ch); - if (ret != 0) { - pr_err(TEST_MODULE_NAME ": %s - failed to create lpm reading " - "thread", __func__); - } - - while (1) { - - struct lpm_msg msg; - u32 ret = 0; - - /* sleeping period is dependent on number of open channels */ - test_ch->config_msg.test_param = - test_ctx->lpm_pseudo_random_seed; - - local_ms = test_dev->open_channels_counter_to_send * - test_ctx->lpm_pseudo_random_seed; - TEST_DBG(TEST_MODULE_NAME ":%s: SLEEPING for %d ms", - __func__, local_ms); - msleep(local_ms); - - msg.counter = test_ch->next_index_in_sent_msg_per_chan; - msg.signature = LPM_TEST_CONFIG_SIGNATURE; - msg.reserve1 = 0; - msg.reserve2 = 0; - - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - pr_debug(TEST_MODULE_NAME ": %s: write_avail=%d\n", - __func__, write_avail); - if (write_avail < sizeof(msg)) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - - write_avail = sdio_write_avail(test_ch->ch); - if (write_avail < sizeof(msg)) { - pr_info(TEST_MODULE_NAME ": %s: not enough write " - "avail.\n", __func__); - break; - } - - ret = sdio_write(test_ch->ch, (u32 *)&msg, sizeof(msg)); - if (ret) - pr_err(TEST_MODULE_NAME ":%s: sdio_write err=%d.\n", - __func__, -ret); - - TEST_DBG(TEST_MODULE_NAME ": %s: for chan %s, write, " - "msg # %d\n", - __func__, - test_ch->name, - test_ch->next_index_in_sent_msg_per_chan); - - if (test_ch->test_type == SDIO_TEST_LPM_RANDOM) { - spin_lock_irqsave(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - lpm_test_update_entry(test_ch, LPM_MSG_SEND, - "SEND ", - test_ch-> - next_index_in_sent_msg_per_chan); - - test_ch->next_index_in_sent_msg_per_chan++; - - if (test_ch->next_index_in_sent_msg_per_chan == - test_ch->config_msg.num_packets) { - spin_unlock_irqrestore( - &test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - break; - } - - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - } - } - - spin_lock_irqsave(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - test_dev->open_channels_counter_to_send--; - spin_unlock_irqrestore(&test_dev->lpm_array_lock, - test_dev->lpm_array_lock_flags); - - pr_info(TEST_MODULE_NAME ": %s: - Finished to send all (%d) " - "packets to the modem on channel %s", - __func__, test_ch->config_msg.num_packets, test_ch->name); - - return; -} - -static void lpm_test(struct test_channel *test_ch) -{ - pr_info(TEST_MODULE_NAME ": %s - START channel %s\n", __func__, - test_ch->name); - - if (!test_ch) { - pr_err(TEST_MODULE_NAME ": %s - NULL test channel\n", __func__); - return; - } - - test_ch->modem_result_per_chan = wait_for_result_msg(test_ch); - pr_debug(TEST_MODULE_NAME ": %s - delete the timeout timer\n", - __func__); - del_timer_sync(&test_ch->timeout_timer); - - if (test_ch->modem_result_per_chan == 0) { - pr_err(TEST_MODULE_NAME ": LPM TEST - Client didn't sleep. " - "Result Msg - is_successful=%d\n", test_ch->buf[1]); - goto exit_err; - } else { - pr_info(TEST_MODULE_NAME ": %s -" - "LPM 9K WAS SLEEPING - PASS\n", __func__); - if (test_ch->test_result == TEST_PASSED) { - pr_info(TEST_MODULE_NAME ": LPM TEST_PASSED\n"); - test_ch->test_completed = 1; - check_test_completion(); - } else { - pr_err(TEST_MODULE_NAME ": LPM TEST - Host didn't " - "sleep. Client slept\n"); - goto exit_err; - } - } - - return; - -exit_err: - pr_info(TEST_MODULE_NAME ": TEST FAIL for chan %s.\n", - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - - -/** - * LPM Test while the host wakes up the modem - */ -static void lpm_test_host_waker(struct test_channel *test_ch) -{ - pr_info(TEST_MODULE_NAME ": %s - START\n", __func__); - wait_event(test_ch->wait_q, atomic_read(&test_ch->wakeup_client)); - atomic_set(&test_ch->wakeup_client, 0); - - pr_info(TEST_MODULE_NAME ": %s - Sending the config_msg to wakeup " - " the client\n", __func__); - send_config_msg(test_ch); - - lpm_test(test_ch); -} - -/** - * Writes number of packets into test channel - * @test_ch: test channel control struct - * @burst_size: number of packets to send - */ -static int write_packet_burst(struct test_channel *test_ch, - int burst_size) -{ - int ret = 0; - int packet_count = 0; - unsigned int random_num = 0; - int size = test_ch->packet_length; /* first packet size */ - u32 write_avail = 0; - - while (packet_count < burst_size) { - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":%s write_avail=%d,size=%d on chan" - " %s\n", __func__, - write_avail, size, test_ch->name); - if (write_avail < size) { - TEST_DBG(TEST_MODULE_NAME ":%s wait for event on" - " chan %s\n", __func__, test_ch->name); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - write_avail = sdio_write_avail(test_ch->ch); - if (write_avail < size) { - pr_info(TEST_MODULE_NAME ":%s not enough write" - " avail %d, need %d on chan %s\n", - __func__, write_avail, size, - test_ch->name); - continue; - } - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s sdio_write " - "failed (%d) on chan %s\n", __func__, - ret, test_ch->name); - break; - } - udelay(1000); /*low bus usage while running number of channels*/ - TEST_DBG(TEST_MODULE_NAME ":%s() successfully write %d bytes" - ", packet_count=%d on chan %s\n", __func__, - size, packet_count, test_ch->name); - test_ch->tx_bytes += size; - packet_count++; - /* get next packet size */ - random_num = get_random_int(); - size = (random_num % test_ch->packet_length) + 1; - } - return ret; -} - -/** - * Reads packet from test channel and checks that packet number - * encoded into the packet is equal to packet_counter - * This function is applicable for packet mode channels only - * - * @test_ch: test channel - * @size: expected packet size - * @packet_counter: number to validate readed packet - */ -static int read_data_from_packet_ch(struct test_channel *test_ch, - unsigned int size, - int packet_counter) -{ - u32 read_avail = 0; - int ret = 0; - - if (!test_ch || !test_ch->ch) { - pr_err(TEST_MODULE_NAME - ":%s: NULL channel\n", __func__); - return -EINVAL; - } - - if (!test_ch->ch->is_packet_mode) { - pr_err(TEST_MODULE_NAME - ":%s:not packet mode ch %s\n", - __func__, test_ch->name); - return -EINVAL; - } - read_avail = sdio_read_avail(test_ch->ch); - /* wait for read data ready event */ - if (read_avail < size) { - TEST_DBG(TEST_MODULE_NAME ":%s() wait for rx data on " - "chan %s\n", __func__, test_ch->name); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - } - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":%s read_avail=%d bytes on chan %s\n", - __func__, read_avail, test_ch->name); - - if (read_avail != size) { - pr_err(TEST_MODULE_NAME - ":read_avail size %d for chan %s not as " - "expected size %d\n", - read_avail, test_ch->name, size); - return -EINVAL; - } - - ret = sdio_read(test_ch->ch, test_ch->buf, read_avail); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s() sdio_read for chan %s (%d)\n", - __func__, test_ch->name, -ret); - return ret; - } - if ((test_ch->buf[0] != packet_counter) && (size != 1)) { - pr_err(TEST_MODULE_NAME ":Read WRONG DATA" - " for chan %s, size=%d\n", - test_ch->name, size); - return -EINVAL; - } - return 0; -} - - -/** - * Reads packet from test channel and checks that packet number - * encoded into the packet is equal to packet_counter - * This function is applicable for streaming mode channels only - * - * @test_ch: test channel - * @size: expected packet size - * @packet_counter: number to validate readed packet - */ -static int read_data_from_stream_ch(struct test_channel *test_ch, - unsigned int size, - int packet_counter) -{ - u32 read_avail = 0; - int ret = 0; - - if (!test_ch || !test_ch->ch) { - pr_err(TEST_MODULE_NAME - ":%s: NULL channel\n", __func__); - return -EINVAL; - } - - if (test_ch->ch->is_packet_mode) { - pr_err(TEST_MODULE_NAME - ":%s:not streaming mode ch %s\n", - __func__, test_ch->name); - return -EINVAL; - } - read_avail = sdio_read_avail(test_ch->ch); - /* wait for read data ready event */ - if (read_avail < size) { - TEST_DBG(TEST_MODULE_NAME ":%s() wait for rx data on " - "chan %s\n", __func__, test_ch->name); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - } - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":%s read_avail=%d bytes on chan %s\n", - __func__, read_avail, test_ch->name); - - if (read_avail < size) { - pr_err(TEST_MODULE_NAME - ":read_avail size %d for chan %s not as " - "expected size %d\n", - read_avail, test_ch->name, size); - return -EINVAL; - } - - ret = sdio_read(test_ch->ch, test_ch->buf, size + A2_HEADER_OVERHEAD); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s() sdio_read for chan %s (%d)\n", - __func__, test_ch->name, -ret); - return ret; - } - if ((test_ch->buf[A2_HEADER_OVERHEAD/4] != packet_counter) && - (size != 1)) { - pr_err(TEST_MODULE_NAME ":Read WRONG DATA" - " for chan %s, size=%d, packet_counter=%d\n", - test_ch->name, size, packet_counter); - print_hex_dump(KERN_INFO, TEST_MODULE_NAME ": rmnet:", - 0, 32, 2, - (void *)test_ch->buf, - size + A2_HEADER_OVERHEAD, false); - return -EINVAL; - } - return 0; -} - -/** - * Test close channel feature for SDIO_SMEM channel: - * close && re-open the SDIO_SMEM channel. - */ -#ifdef CONFIG_MSM_SDIO_SMEM -static void open_close_smem_test(struct test_channel *test_ch) -{ - int i = 0; - int ret = 0; - - pr_info(TEST_MODULE_NAME ":%s\n", __func__); - - for (i = 0; i < 100 ; ++i) { - ret = close_sdio_ch(test_ch); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s close_sdio_ch for ch %s" - " failed\n", - __func__, test_ch->name); - goto exit_err; - } - ret = open_sdio_ch(test_ch); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s open_sdio_ch for ch %s " - " failed\n", - __func__, test_ch->name); - goto exit_err; - } - } - - pr_info(TEST_MODULE_NAME ":%s TEST PASS for chan %s.\n", __func__, - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; -exit_err: - pr_info(TEST_MODULE_NAME ":%s TEST FAIL for chan %s.\n", __func__, - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} -#endif - -/** - * Test close channel feature: - * 1. write random packet number into channel - * 2. read some data from channel (do this only for second half of - * requested packets to send). - * 3. close && re-open then repeat 1. - * - * Total packets to send: test_ch->config_msg.num_packets. - * Burst size is random in [1..test_ch->max_burst_size] range - * Packet size is random in [1..test_ch->packet_length] - */ -static void open_close_test(struct test_channel *test_ch) -{ - int ret = 0; - u32 read_avail = 0; - int total_packet_count = 0; - int size = 0; - u16 *buf16 = NULL; - int i; - int max_packet_count = 0; - unsigned int random_num = 0; - int curr_burst_size = 0; - - if (!test_ch || !test_ch->ch) { - pr_err(TEST_MODULE_NAME ":%s NULL channel\n", - __func__); - return; - } - - curr_burst_size = test_ch->max_burst_size; - size = test_ch->packet_length; - buf16 = (u16 *) test_ch->buf; - - /* the test sends configured number of packets in - 2 portions: first without reading between write bursts, - second with it */ - max_packet_count = test_ch->config_msg.num_packets / 2; - - pr_info(TEST_MODULE_NAME ":%s channel %s, total packets:%d," - " max packet size %d, max burst size:%d\n", - __func__, test_ch->name, - test_ch->config_msg.num_packets, test_ch->packet_length, - test_ch->max_burst_size); - for (i = 0 ; i < size / 2 ; i++) - buf16[i] = (u16) (i & 0xFFFF); - - for (i = 0; i < 2 ; i++) { - total_packet_count = 0; - while (total_packet_count < max_packet_count) { - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":%s exit test\n", - __func__); - return; - } - test_ch->buf[0] = total_packet_count; - random_num = get_random_int(); - curr_burst_size = (random_num % - test_ch->max_burst_size) + 1; - - /* limit burst size to send - * no more than configured packets */ - if (curr_burst_size + total_packet_count > - max_packet_count) { - curr_burst_size = max_packet_count - - total_packet_count; - } - TEST_DBG(TEST_MODULE_NAME ":%s Current burst size:%d" - " on chan %s\n", __func__, - curr_burst_size, test_ch->name); - ret = write_packet_burst(test_ch, curr_burst_size); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s write burst failed (%d), ch %s\n", - __func__, ret, test_ch->name); - goto exit_err; - } - if (i > 0) { - /* read from channel */ - if (test_ch->ch->is_packet_mode) - ret = read_data_from_packet_ch(test_ch, - size, - total_packet_count); - else - ret = read_data_from_stream_ch(test_ch, - size, - total_packet_count); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s read" - " failed:%d, chan %s\n", - __func__, ret, - test_ch->name); - goto exit_err; - } - } - TEST_DBG(TEST_MODULE_NAME ":%s before close, ch %s\n", - __func__, test_ch->name); - ret = close_sdio_ch(test_ch); - if (ret) { - pr_err(TEST_MODULE_NAME":%s close channel %s" - " failed (%d)\n", - __func__, test_ch->name, ret); - goto exit_err; - } else { - TEST_DBG(TEST_MODULE_NAME":%s close channel %s" - " success\n", __func__, - test_ch->name); - total_packet_count += curr_burst_size; - atomic_set(&test_ch->rx_notify_count, 0); - atomic_set(&test_ch->tx_notify_count, 0); - atomic_set(&test_ch->any_notify_count, 0); - } - TEST_DBG(TEST_MODULE_NAME ":%s before open, ch %s\n", - __func__, test_ch->name); - ret = open_sdio_ch(test_ch); - if (ret) { - pr_err(TEST_MODULE_NAME":%s open channel %s" - " failed (%d)\n", - __func__, test_ch->name, ret); - goto exit_err; - } else { - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail > 0) { - pr_err(TEST_MODULE_NAME": after open" - " ch %s read_availis not zero" - " (%d bytes)\n", - test_ch->name, read_avail); - goto exit_err; - } - } - TEST_DBG(TEST_MODULE_NAME ":%s total tx = %d," - " packet# = %d, size = %d for ch %s\n", - __func__, test_ch->tx_bytes, - total_packet_count, size, - test_ch->name); - } /* end of while */ - } - pr_info(TEST_MODULE_NAME ":%s Test end: total rx bytes = 0x%x," - " total tx bytes = 0x%x for chan %s\n", __func__, - test_ch->rx_bytes, test_ch->tx_bytes, test_ch->name); - pr_info(TEST_MODULE_NAME ":%s TEST PASS for chan %s.\n", __func__, - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; -exit_err: - pr_info(TEST_MODULE_NAME ":%s TEST FAIL for chan %s.\n", __func__, - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -/** - * sender Test - */ -static void sender_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - int packet_count = 0; - int size = 512; - u16 *buf16 = (u16 *) test_ch->buf; - int i; - int max_packet_count = 10000; - int random_num = 0; - - max_packet_count = test_ch->config_msg.num_packets; - - for (i = 0 ; i < size / 2 ; i++) - buf16[i] = (u16) (i & 0xFFFF); - - - pr_info(TEST_MODULE_NAME - ":SENDER TEST START for chan %s\n", test_ch->name); - - while (packet_count < max_packet_count) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - random_num = get_random_int(); - size = (random_num % test_ch->packet_length) + 1; - - TEST_DBG(TEST_MODULE_NAME "SENDER WAIT FOR EVENT for chan %s\n", - test_ch->name); - - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - pr_info(TEST_MODULE_NAME ":not enough write avail.\n"); - continue; - } - - test_ch->buf[0] = packet_count; - - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ":sender sdio_write err=%d.\n", - -ret); - goto exit_err; - } - - /* wait for read data ready event */ - TEST_DBG(TEST_MODULE_NAME ":sender wait for rx data for " - "chan %s\n", - test_ch->name); - read_avail = sdio_read_avail(test_ch->ch); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->rx_notify_count)); - atomic_dec(&test_ch->rx_notify_count); - - read_avail = sdio_read_avail(test_ch->ch); - - if (read_avail != size) { - pr_info(TEST_MODULE_NAME - ":read_avail size %d for chan %s not as " - "expected size %d.\n", - read_avail, test_ch->name, size); - goto exit_err; - } - - memset(test_ch->buf, 0x00, size); - - ret = sdio_read(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ":sender sdio_read for chan %s" - " err=%d.\n", - test_ch->name, -ret); - goto exit_err; - } - - - if ((test_ch->buf[0] != packet_count) && (size != 1)) { - pr_info(TEST_MODULE_NAME ":sender sdio_read WRONG DATA" - " for chan %s, size=%d\n", - test_ch->name, size); - goto exit_err; - } - - test_ch->tx_bytes += size; - test_ch->rx_bytes += size; - packet_count++; - - TEST_DBG(TEST_MODULE_NAME - ":sender total rx bytes = 0x%x , packet#=%d, size=%d" - " for chan %s\n", - test_ch->rx_bytes, packet_count, size, test_ch->name); - TEST_DBG(TEST_MODULE_NAME - ":sender total tx bytes = 0x%x , packet#=%d, size=%d" - " for chan %s\n", - test_ch->tx_bytes, packet_count, size, test_ch->name); - - } /* end of while */ - - pr_info(TEST_MODULE_NAME - ":SENDER TEST END: total rx bytes = 0x%x, " - " total tx bytes = 0x%x for chan %s\n", - test_ch->rx_bytes, test_ch->tx_bytes, test_ch->name); - - pr_info(TEST_MODULE_NAME ": TEST PASS for chan %s.\n", - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; - -exit_err: - pr_info(TEST_MODULE_NAME ": TEST FAIL for chan %s.\n", - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -/** - * A2 Perf Test - */ -static void a2_performance_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - int tx_packet_count = 0; - int rx_packet_count = 0; - int size = 0; - u16 *buf16 = (u16 *) test_ch->buf; - int i; - int total_bytes = 0; - int max_packets = 10000; - u32 packet_size = test_ch->buf_size; - int rand_size = 0; - - u64 start_jiffy, end_jiffy, delta_jiffies; - unsigned int time_msec = 0; - u32 throughput = 0; - - max_packets = test_ch->config_msg.num_packets; - packet_size = test_ch->packet_length; - - for (i = 0; i < packet_size / 2; i++) - buf16[i] = (u16) (i & 0xFFFF); - - pr_info(TEST_MODULE_NAME ": A2 PERFORMANCE TEST START for chan %s\n", - test_ch->name); - - start_jiffy = get_jiffies_64(); /* read the current time */ - - while (tx_packet_count < max_packets) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - if (test_ch->random_packet_size) { - rand_size = get_random_int(); - packet_size = (rand_size % test_ch->packet_length) + 1; - if (packet_size < A2_MIN_PACKET_SIZE) - packet_size = A2_MIN_PACKET_SIZE; - } - - /* wait for data ready event */ - /* use a func to avoid compiler optimizations */ - write_avail = sdio_write_avail(test_ch->ch); - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, write_avail=%d, " - "read_avail=%d for chan %s\n", - test_ch->name, write_avail, read_avail, - test_ch->name); - if ((write_avail == 0) && (read_avail == 0)) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->any_notify_count)); - atomic_set(&test_ch->any_notify_count, 0); - } - - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, write_avail=%d\n", - test_ch->name, write_avail); - if (write_avail > 0) { - size = min(packet_size, write_avail) ; - TEST_DBG(TEST_MODULE_NAME ":tx size = %d for chan %s\n", - size, test_ch->name); - test_ch->buf[0] = tx_packet_count; - test_ch->buf[(size/4)-1] = tx_packet_count; - - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ":sdio_write err=%d" - " for chan %s\n", - -ret, test_ch->name); - goto exit_err; - } - tx_packet_count++; - test_ch->tx_bytes += size; - } - - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, read_avail=%d\n", - test_ch->name, read_avail); - if (read_avail > 0) { - size = min(packet_size, read_avail); - pr_debug(TEST_MODULE_NAME ":rx size = %d.\n", size); - ret = sdio_read(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ": sdio_read size %d " - " err=%d" - " for chan %s\n", - size, -ret, test_ch->name); - goto exit_err; - } - rx_packet_count++; - test_ch->rx_bytes += size; - } - - TEST_DBG(TEST_MODULE_NAME - ":total rx bytes = %d , rx_packet#=%d" - " for chan %s\n", - test_ch->rx_bytes, rx_packet_count, test_ch->name); - TEST_DBG(TEST_MODULE_NAME - ":total tx bytes = %d , tx_packet#=%d" - " for chan %s\n", - test_ch->tx_bytes, tx_packet_count, test_ch->name); - - } /* while (tx_packet_count < max_packets ) */ - - end_jiffy = get_jiffies_64(); /* read the current time */ - - delta_jiffies = end_jiffy - start_jiffy; - time_msec = jiffies_to_msecs(delta_jiffies); - - pr_info(TEST_MODULE_NAME ":total rx bytes = 0x%x , rx_packet#=%d for" - " chan %s.\n", - test_ch->rx_bytes, rx_packet_count, test_ch->name); - pr_info(TEST_MODULE_NAME ":total tx bytes = 0x%x , tx_packet#=%d" - " for chan %s.\n", - test_ch->tx_bytes, tx_packet_count, test_ch->name); - - total_bytes = (test_ch->tx_bytes + test_ch->rx_bytes); - pr_err(TEST_MODULE_NAME ":total bytes = %d, time msec = %d" - " for chan %s\n", - total_bytes , (int) time_msec, test_ch->name); - - if (!test_ch->random_packet_size) { - if (time_msec) { - throughput = (total_bytes / time_msec) * 8 / 1000; - pr_err(TEST_MODULE_NAME ": %s - Performance = " - "%d Mbit/sec for chan %s\n", - __func__, throughput, test_ch->name); - } else { - pr_err(TEST_MODULE_NAME ": %s - time_msec = 0 Couldn't " - "calculate performence for chan %s\n", - __func__, test_ch->name); - } - - } - -#ifdef CONFIG_DEBUG_FS - switch (test_ch->ch_id) { - case SDIO_DUN: - test_ctx->debug.dun_throughput = throughput; - break; - case SDIO_RMNT: - test_ctx->debug.rmnt_throughput = throughput; - break; - default: - pr_err(TEST_MODULE_NAME "No debugfs for this channel " - "throughput"); - } -#endif - - pr_err(TEST_MODULE_NAME ": A2 PERFORMANCE TEST END for chan %s.\n", - test_ch->name); - - pr_err(TEST_MODULE_NAME ": TEST PASS for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; - -exit_err: - pr_err(TEST_MODULE_NAME ": TEST FAIL for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -/** - * rx_cleanup - * This function reads all the messages sent by the modem until - * the read_avail is 0 after 1 second of sleep. - * The function returns the number of packets that was received. - */ -static void rx_cleanup(struct test_channel *test_ch, int *rx_packet_count) -{ - int read_avail = 0; - int ret = 0; - int counter = 0; - - if (!test_ch || !test_ch->ch) { - pr_err(TEST_MODULE_NAME ":%s NULL channel\n", - __func__); - return; - } - - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, read_avail=%d\n", - test_ch->name, read_avail); - - /* If no pending messages, wait to see if the modem sends data */ - if (read_avail == 0) { - msleep(1000); - read_avail = sdio_read_avail(test_ch->ch); - } - - while ((read_avail > 0) && (counter < 10)) { - TEST_DBG(TEST_MODULE_NAME ": read_avail=%d for ch %s\n", - read_avail, test_ch->name); - - ret = sdio_read(test_ch->ch, test_ch->buf, read_avail); - if (ret) { - pr_info(TEST_MODULE_NAME ": sdio_read size %d " - " err=%d for chan %s\n", - read_avail, -ret, test_ch->name); - break; - } - (*rx_packet_count)++; - test_ch->rx_bytes += read_avail; - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail == 0) { - msleep(1000); - counter++; - read_avail = sdio_read_avail(test_ch->ch); - } - } - pr_info(TEST_MODULE_NAME ": finished cleanup for ch %s, " - "rx_packet_count=%d, total rx bytes=%d\n", - test_ch->name, *rx_packet_count, test_ch->rx_bytes); -} - - -/** - * A2 RTT Test - * This function sends a packet and calculate the RTT time of - * this packet. - * The test also calculte Min, Max and Average RTT - */ -static void a2_rtt_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - int tx_packet_count = 0; - int rx_packet_count = 0; - u16 *buf16 = NULL; - int i; - int max_packets = 0; - u32 packet_size = 0; - s64 start_time, end_time; - int delta_usec = 0; - int time_average = 0; - int min_delta_usec = 0xFFFF; - int max_delta_usec = 0; - int total_time = 0; - int expected_read_size = 0; - int delay_ms = 0; - int slow_rtt_counter = 0; - int read_avail_so_far = 0; - - if (test_ch) { - /* - * Cleanup the pending RX data (such as loopback of the - * config msg) - */ - rx_cleanup(test_ch, &rx_packet_count); - rx_packet_count = 0; - } else { - return; - } - - max_packets = test_ch->config_msg.num_packets; - packet_size = test_ch->packet_length; - buf16 = (u16 *) test_ch->buf; - - for (i = 0; i < packet_size / 2; i++) - buf16[i] = (u16) (i & 0xFFFF); - - pr_info(TEST_MODULE_NAME ": A2 RTT TEST START for chan %s\n", - test_ch->name); - - switch (test_ch->ch_id) { - case SDIO_RMNT: - delay_ms = 100; - break; - case SDIO_CSVT: - delay_ms = 0; - break; - default: - pr_err(TEST_MODULE_NAME ": %s - ch_id invalid.\n", - __func__); - return; - } - - while (tx_packet_count < max_packets) { - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - start_time = 0; - end_time = 0; - read_avail_so_far = 0; - - if (delay_ms) - msleep(delay_ms); - - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":ch %s: write_avail=%d\n", - test_ch->name, write_avail); - if (write_avail == 0) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, write_avail=%d\n", - test_ch->name, write_avail); - if (write_avail > 0) { - TEST_DBG(TEST_MODULE_NAME ":tx size = %d for chan %s\n", - packet_size, test_ch->name); - test_ch->buf[0] = tx_packet_count; - - start_time = ktime_to_us(ktime_get()); - ret = sdio_write(test_ch->ch, test_ch->buf, - packet_size); - if (ret) { - pr_err(TEST_MODULE_NAME ":sdio_write err=%d" - " for chan %s\n", - -ret, test_ch->name); - goto exit_err; - } - tx_packet_count++; - test_ch->tx_bytes += packet_size; - } else { - pr_err(TEST_MODULE_NAME ": Invalid write_avail" - " %d for chan %s\n", - write_avail, test_ch->name); - goto exit_err; - } - - expected_read_size = packet_size + A2_HEADER_OVERHEAD; - - while (read_avail_so_far < expected_read_size) { - - read_avail = sdio_read_avail(test_ch->ch); - - if (!read_avail) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch-> - rx_notify_count)); - - atomic_dec(&test_ch->rx_notify_count); - continue; - } - - read_avail_so_far += read_avail; - - if (read_avail_so_far > expected_read_size) { - pr_err(TEST_MODULE_NAME ": %s - Invalid " - "read_avail(%d) read_avail_so_far(%d) " - "can't be larger than " - "expected_read_size(%d).", - __func__, - read_avail, - read_avail_so_far, - expected_read_size); - goto exit_err; - } - - /* - * must read entire pending bytes, so later, we will - * get a notification when more data arrives - */ - ret = sdio_read(test_ch->ch, test_ch->buf, - read_avail); - - if (ret) { - pr_info(TEST_MODULE_NAME ": sdio_read size %d " - " err=%d for chan %s\n", - read_avail, -ret, - test_ch->name); - goto exit_err; - } - } - - end_time = ktime_to_us(ktime_get()); - rx_packet_count++; - test_ch->rx_bytes += expected_read_size; - - delta_usec = (int)(end_time - start_time); - total_time += delta_usec; - if (delta_usec < min_delta_usec) - min_delta_usec = delta_usec; - if (delta_usec > max_delta_usec) - max_delta_usec = delta_usec; - - /* checking the RTT per channel criteria */ - if (delta_usec > MAX_AVG_RTT_TIME_USEC) { - pr_err(TEST_MODULE_NAME ": %s - " - "msg # %d - rtt time (%d usec) is " - "longer than %d usec\n", - __func__, - tx_packet_count, - delta_usec, - MAX_AVG_RTT_TIME_USEC); - slow_rtt_counter++; - } - - TEST_DBG(TEST_MODULE_NAME - ":RTT time=%d for packet #%d for chan %s\n", - delta_usec, tx_packet_count, test_ch->name); - } /* while (tx_packet_count < max_packets ) */ - - pr_info(TEST_MODULE_NAME ": %s - tx_packet_count = %d\n", - __func__, tx_packet_count); - - pr_info(TEST_MODULE_NAME ": %s - total rx bytes = 0x%x, " - "rx_packet# = %d for chan %s.\n", - __func__, test_ch->rx_bytes, rx_packet_count, test_ch->name); - - pr_info(TEST_MODULE_NAME ": %s - total tx bytes = 0x%x, " - "tx_packet# = %d for chan %s.\n", - __func__, test_ch->tx_bytes, tx_packet_count, test_ch->name); - - pr_info(TEST_MODULE_NAME ": %s - slow_rtt_counter = %d for " - "chan %s.\n", - __func__, slow_rtt_counter, test_ch->name); - - if (tx_packet_count) { - time_average = total_time / tx_packet_count; - pr_info(TEST_MODULE_NAME ":Average RTT time = %d for chan %s\n", - time_average, test_ch->name); - } else { - pr_err(TEST_MODULE_NAME ": %s - tx_packet_count=0. couldn't " - "calculate average rtt time", __func__); - } - - pr_info(TEST_MODULE_NAME ":MIN RTT time = %d for chan %s\n", - min_delta_usec, test_ch->name); - pr_info(TEST_MODULE_NAME ":MAX RTT time = %d for chan %s\n", - max_delta_usec, test_ch->name); - - pr_info(TEST_MODULE_NAME ": A2 RTT TEST END for chan %s.\n", - test_ch->name); - - if (ret) - goto exit_err; - - if (time_average == 0 || time_average > MAX_AVG_RTT_TIME_USEC) { - pr_err(TEST_MODULE_NAME ": %s - average_time = %d. Invalid " - "value", - __func__, time_average); - goto exit_err; - - } - - pr_info(TEST_MODULE_NAME ": TEST PASS for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; - -exit_err: - pr_err(TEST_MODULE_NAME ": TEST FAIL for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -/** - * Process Rx Data - Helper for A2 Validation Test - * @test_ch(in/out) : Test channel that contains Rx data buffer to process. - * - * @rx_unprocessed_bytes(in) : Number of bytes to process in the buffer. - * - * @rx_process_packet_state(in/out) : - * Current processing state (used to identify what to process - * next in a partial packet) - * - * @rx_packet_size(in/out) : - * Number of bytes remaining in the packet to be processed. - * - * @rx_packet_count(in/out) : - * Number of packets processed. - */ -static int process_rx_data(struct test_channel *test_ch, - u32 rx_unprocessed_bytes, - int *rx_process_packet_state, - u16 *rx_packet_size, - int *rx_packet_count) -{ - u8 *buf = (u8 *)test_ch->buf; - int eop = 0; - int i = 0; - int ret = 0; - u32 *ptr = 0; - u16 size = 0; - - /* process rx data */ - while (rx_unprocessed_bytes) { - TEST_DBG(TEST_MODULE_NAME ": unprocessed bytes : %u\n", - rx_unprocessed_bytes); - - switch (*rx_process_packet_state) { - case RX_PROCESS_PACKET_INIT: - /* process the A2 header */ - TEST_DBG(TEST_MODULE_NAME ": " - "RX_PROCESS_PACKET_INIT\n"); - *rx_process_packet_state = RX_PROCESS_PACKET_INIT; - if (rx_unprocessed_bytes < 4) - break; - - i += 4; - rx_unprocessed_bytes -= 4; - - case RX_PROCESS_A2_HEADER: - /* process the rest of A2 header */ - TEST_DBG(TEST_MODULE_NAME ": RX_PROCESS_A2_HEADER\n"); - *rx_process_packet_state = RX_PROCESS_A2_HEADER; - if (rx_unprocessed_bytes < 4) - break; - - ptr = (u32 *)&buf[i]; - /* - * upper 2 bytes of the last 4 bytes of A2 header - * contains the size of the packet - */ - *rx_packet_size = *ptr >> 0x10; - - i += 4; - rx_unprocessed_bytes -= 4; - - case RX_PROCESS_PACKET_DATA: - /* process the2_2_ packet data */ - TEST_DBG(TEST_MODULE_NAME ": RX_PROCESS_PACKET_DATA " - "- packet size - %u\n", *rx_packet_size); - *rx_process_packet_state = RX_PROCESS_PACKET_DATA; - - size = *rx_packet_size; - if (*rx_packet_size <= rx_unprocessed_bytes) { - eop = *rx_packet_size; - *rx_packet_size = 0; - } else { - eop = rx_unprocessed_bytes; - *rx_packet_size = *rx_packet_size - - rx_unprocessed_bytes; - } - - /* no more bytes available to process */ - if (!eop) - break; - /* - * end of packet is starting from - * the current position - */ - eop = eop + i; - TEST_DBG(TEST_MODULE_NAME ": size - %u, " - "packet size - %u eop - %d\n", - size, *rx_packet_size, eop); - - /* validate the data */ - for (; i < eop; i++) { - if (buf[i] != (test_ch->rx_bytes % 256)) { - pr_err(TEST_MODULE_NAME ": " - "Corrupt data. buf:%u, " - "data:%u\n", buf[i], - test_ch->rx_bytes % 256); - ret = -EINVAL; - goto err; - } - rx_unprocessed_bytes--; - test_ch->rx_bytes++; - } - - /* have more data to be processed */ - if (*rx_packet_size) - break; - - /* - * A2 sends data in 4 byte alignment, - * skip the padding - */ - if (size % 4) { - i += 4 - (size % 4); - rx_unprocessed_bytes -= 4 - (size % 4); - } - *rx_packet_count = *rx_packet_count + 1; - - /* re init the state to process new packet */ - *rx_process_packet_state = RX_PROCESS_PACKET_INIT; - break; - default: - pr_err(TEST_MODULE_NAME ": Invalid case: %d\n", - *rx_process_packet_state); - ret = -EINVAL; - goto err; - } - TEST_DBG(TEST_MODULE_NAME ": Continue processing " - "if more data is available\n"); - } - -err: - return ret; -} - -/** - * A2 Validation Test - * Send packets and validate the returned packets. - * Transmit one packet at a time, while process multiple rx - * packets in a single transaction. - * A transaction is of size min(random number, write_avail). - * A packet consists of a min of 1 byte to channel supported max. - */ -static void a2_validation_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - int tx_packet_count = 0; - int rx_packet_count = 0; - int initial_rx_packet_count = 0; - u32 size = 0; - u8 *buf8 = (u8 *)test_ch->buf; - int i = 0; - int max_packets = test_ch->config_msg.num_packets; - u16 tx_packet_size = 0; - u16 rx_packet_size = 0; - u32 random_num = 0; - int rx_process_packet_state = RX_PROCESS_PACKET_INIT; - - pr_info(TEST_MODULE_NAME ": A2 VALIDATION TEST START for chan %s\n", - test_ch->name); - - /* Wait for the initial rx messages before starting the test. */ - rx_cleanup(test_ch, &initial_rx_packet_count); - - test_ch->tx_bytes = 0; - test_ch->rx_bytes = 0; - - /* Continue till we have transmitted and received all packets */ - while ((tx_packet_count < max_packets) || - (rx_packet_count < max_packets)) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - random_num = get_random_int(); - size = (random_num % test_ch->packet_length) + 1; - TEST_DBG(TEST_MODULE_NAME ": Random tx packet size =%u", size); - - /* - * wait for data ready event - * use a func to avoid compiler optimizations - */ - write_avail = sdio_write_avail(test_ch->ch); - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ": write_avail=%d, " - "read_avail=%d for chan %s\n", - write_avail, read_avail, test_ch->name); - - if ((write_avail == 0) && (read_avail == 0)) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->any_notify_count)); - atomic_set(&test_ch->any_notify_count, 0); - } - - /* Transmit data */ - write_avail = sdio_write_avail(test_ch->ch); - if ((tx_packet_count < max_packets) && (write_avail > 0)) { - tx_packet_size = min(size, write_avail) ; - TEST_DBG(TEST_MODULE_NAME ": tx size = %u, " - "write_avail = %u tx_packet# = %d\n", - tx_packet_size, write_avail, - tx_packet_count); - memset(test_ch->buf, 0, test_ch->buf_size); - /* populate the buffer */ - for (i = 0; i < tx_packet_size; i++) { - buf8[i] = test_ch->tx_bytes % 256; - test_ch->tx_bytes++; - } - - ret = sdio_write(test_ch->ch, test_ch->buf, - tx_packet_size); - if (ret) { - pr_err(TEST_MODULE_NAME ":sdio_write err=%d" - " for chan %s\n", - -ret, test_ch->name); - goto exit_err; - } - tx_packet_count++; - } - - /* Receive data */ - read_avail = sdio_read_avail(test_ch->ch); - if (read_avail > 0) { - TEST_DBG(TEST_MODULE_NAME ": rx size = %u, " - "rx_packet#=%d.\n", - read_avail, rx_packet_count); - memset(test_ch->buf, 0, test_ch->buf_size); - - ret = sdio_read(test_ch->ch, test_ch->buf, - read_avail); - if (ret) { - pr_err(TEST_MODULE_NAME ": sdio_read " - "size %d err=%d for chan %s\n", - size, -ret, test_ch->name); - goto exit_err; - } - - /* Process data */ - ret = process_rx_data(test_ch, read_avail, - &rx_process_packet_state, - &rx_packet_size, - &rx_packet_count); - - if (ret != 0) - goto exit_err; - } - TEST_DBG(TEST_MODULE_NAME ": Continue loop ...\n"); - } - - if (test_ch->tx_bytes != test_ch->rx_bytes) { - pr_err(TEST_MODULE_NAME ": Total number of bytes " - "transmitted (%u) does not match the total " - "number of bytes received (%u).", test_ch->tx_bytes, - test_ch->rx_bytes); - goto exit_err; - } - - pr_info(TEST_MODULE_NAME ": A2 VALIDATION TEST END for chan %s.\n", - test_ch->name); - - pr_info(TEST_MODULE_NAME ": TEST PASS for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; - -exit_err: - pr_info(TEST_MODULE_NAME ": TEST FAIL for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -/** - * sender No loopback Test - */ -static void sender_no_loopback_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 write_avail = 0; - int packet_count = 0; - int size = 512; - u16 *buf16 = (u16 *) test_ch->buf; - int i; - int max_packet_count = 10000; - unsigned int random_num = 0; - - max_packet_count = test_ch->config_msg.num_packets; - - for (i = 0 ; i < size / 2 ; i++) - buf16[i] = (u16) (i & 0xFFFF); - - pr_info(TEST_MODULE_NAME - ":SENDER NO LP TEST START for chan %s\n", test_ch->name); - - while (packet_count < max_packet_count) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - random_num = get_random_int(); - size = (random_num % test_ch->packet_length) + 1; - - TEST_DBG(TEST_MODULE_NAME ":SENDER WAIT FOR EVENT " - "for chan %s\n", - test_ch->name); - - /* wait for data ready event */ - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->tx_notify_count)); - atomic_dec(&test_ch->tx_notify_count); - } - - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":write_avail=%d\n", write_avail); - if (write_avail < size) { - pr_info(TEST_MODULE_NAME ":not enough write avail.\n"); - continue; - } - - test_ch->buf[0] = packet_count; - - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ":sender sdio_write err=%d.\n", - -ret); - goto exit_err; - } - - test_ch->tx_bytes += size; - packet_count++; - - TEST_DBG(TEST_MODULE_NAME - ":sender total tx bytes = 0x%x , packet#=%d, size=%d" - " for chan %s\n", - test_ch->tx_bytes, packet_count, size, test_ch->name); - - } /* end of while */ - - pr_info(TEST_MODULE_NAME - ":SENDER TEST END: total tx bytes = 0x%x, " - " for chan %s\n", - test_ch->tx_bytes, test_ch->name); - - test_ch->modem_result_per_chan = wait_for_result_msg(test_ch); - - if (test_ch->modem_result_per_chan) { - pr_info(TEST_MODULE_NAME ": TEST PASS for chan %s.\n", - test_ch->name); - test_ch->test_result = TEST_PASSED; - } else { - pr_info(TEST_MODULE_NAME ": TEST FAILURE for chan %s.\n", - test_ch->name); - test_ch->test_result = TEST_FAILED; - } - test_ch->test_completed = 1; - check_test_completion(); - return; - -exit_err: - pr_info(TEST_MODULE_NAME ": TEST FAIL for chan %s.\n", - test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - - -/** - * Modem reset Test - * The test verifies that it finished sending all the packets - * while there might be modem reset in the middle - */ -static void modem_reset_test(struct test_channel *test_ch) -{ - int ret = 0 ; - u32 read_avail = 0; - u32 write_avail = 0; - int tx_packet_count = 0; - int rx_packet_count = 0; - int size = 0; - u16 *buf16 = (u16 *) test_ch->buf; - int i; - int max_packets = 10000; - u32 packet_size = test_ch->buf_size; - int is_err = 0; - - max_packets = test_ch->config_msg.num_packets; - packet_size = test_ch->packet_length; - - for (i = 0; i < packet_size / 2; i++) - buf16[i] = (u16) (i & 0xFFFF); - - pr_info(TEST_MODULE_NAME ": Modem Reset TEST START for chan %s\n", - test_ch->name); - - while (tx_packet_count < max_packets) { - - if (test_ctx->exit_flag) { - pr_info(TEST_MODULE_NAME ":Exit Test.\n"); - return; - } - - if (test_ch->card_removed) { - pr_info(TEST_MODULE_NAME ": card removal was detected " - "for chan %s, tx_total=0x%x\n", - test_ch->name, test_ch->tx_bytes); - wait_event(test_ch->wait_q, - atomic_read(&test_ch->card_detected_event)); - atomic_set(&test_ch->card_detected_event, 0); - pr_info(TEST_MODULE_NAME ": card_detected_event " - "for chan %s\n", test_ch->name); - if (test_ch->card_removed) - continue; - is_err = 0; - /* Need to wait for the modem to be ready */ - msleep(5000); - pr_info(TEST_MODULE_NAME ": sending the config message " - "for chan %s\n", test_ch->name); - send_config_msg(test_ch); - } - - /* wait for data ready event */ - /* use a func to avoid compiler optimizations */ - write_avail = sdio_write_avail(test_ch->ch); - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, write_avail=%d, " - "read_avail=%d for chan %s\n", - test_ch->name, write_avail, read_avail, - test_ch->name); - if ((write_avail == 0) && (read_avail == 0)) { - wait_event(test_ch->wait_q, - atomic_read(&test_ch->any_notify_count)); - atomic_set(&test_ch->any_notify_count, 0); - } - if (atomic_read(&test_ch->card_detected_event)) { - atomic_set(&test_ch->card_detected_event, 0); - pr_info(TEST_MODULE_NAME ": card_detected_event " - "for chan %s, tx_total=0x%x\n", - test_ch->name, test_ch->tx_bytes); - if (test_ch->card_removed) - continue; - /* Need to wait for the modem to be ready */ - msleep(5000); - is_err = 0; - pr_info(TEST_MODULE_NAME ": sending the config message " - "for chan %s\n", test_ch->name); - send_config_msg(test_ch); - } - - write_avail = sdio_write_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, write_avail=%d\n", - test_ch->name, write_avail); - if (write_avail > 0) { - size = min(packet_size, write_avail) ; - pr_debug(TEST_MODULE_NAME ":tx size = %d for chan %s\n", - size, test_ch->name); - test_ch->buf[0] = tx_packet_count; - test_ch->buf[(size/4)-1] = tx_packet_count; - - TEST_DBG(TEST_MODULE_NAME ":channel %s, sdio_write, " - "size=%d\n", test_ch->name, size); - if (is_err) { - msleep(100); - continue; - } - ret = sdio_write(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ":sdio_write err=%d" - " for chan %s\n", - -ret, test_ch->name); - is_err = 1; - msleep(20); - continue; - } - tx_packet_count++; - test_ch->tx_bytes += size; - test_ch->config_msg.num_packets--; - } - - read_avail = sdio_read_avail(test_ch->ch); - TEST_DBG(TEST_MODULE_NAME ":channel %s, read_avail=%d\n", - test_ch->name, read_avail); - if (read_avail > 0) { - size = min(packet_size, read_avail); - pr_debug(TEST_MODULE_NAME ":rx size = %d.\n", size); - TEST_DBG(TEST_MODULE_NAME ":channel %s, sdio_read, " - "size=%d\n", test_ch->name, size); - if (is_err) { - msleep(100); - continue; - } - ret = sdio_read(test_ch->ch, test_ch->buf, size); - if (ret) { - pr_info(TEST_MODULE_NAME ": sdio_read size %d " - " err=%d" - " for chan %s\n", - size, -ret, test_ch->name); - is_err = 1; - msleep(20); - continue; - } - rx_packet_count++; - test_ch->rx_bytes += size; - } - - TEST_DBG(TEST_MODULE_NAME - ":total rx bytes = %d , rx_packet#=%d" - " for chan %s\n", - test_ch->rx_bytes, rx_packet_count, test_ch->name); - TEST_DBG(TEST_MODULE_NAME - ":total tx bytes = %d , tx_packet#=%d" - " for chan %s\n", - test_ch->tx_bytes, tx_packet_count, test_ch->name); - - udelay(500); - - } /* while (tx_packet_count < max_packets ) */ - - pr_info(TEST_MODULE_NAME ":total rx bytes = 0x%x , rx_packet#=%d for" - " chan %s.\n", - test_ch->rx_bytes, rx_packet_count, test_ch->name); - pr_info(TEST_MODULE_NAME ":total tx bytes = 0x%x , tx_packet#=%d" - " for chan %s.\n", - test_ch->tx_bytes, tx_packet_count, test_ch->name); - - pr_err(TEST_MODULE_NAME ": Modem Reset TEST END for chan %s.\n", - test_ch->name); - - pr_err(TEST_MODULE_NAME ": TEST PASS for chan %s\n", test_ch->name); - test_ch->test_completed = 1; - test_ch->test_result = TEST_PASSED; - check_test_completion(); - return; -} - -/** - * Worker thread to handle the tests types - */ -static void worker(struct work_struct *work) -{ - struct test_channel *test_ch = NULL; - struct test_work *test_work = container_of(work, - struct test_work, - work); - int test_type = 0; - - test_ch = test_work->test_ch; - - if (test_ch == NULL) { - pr_err(TEST_MODULE_NAME ":NULL test_ch\n"); - return; - } - - test_type = test_ch->test_type; - - switch (test_type) { - case SDIO_TEST_LOOPBACK_HOST: - loopback_test(test_ch); - break; - case SDIO_TEST_LOOPBACK_CLIENT: - sender_test(test_ch); - break; - case SDIO_TEST_PERF: - a2_performance_test(test_ch); - break; - case SDIO_TEST_LPM_CLIENT_WAKER: - lpm_test(test_ch); - break; - case SDIO_TEST_LPM_HOST_WAKER: - lpm_test_host_waker(test_ch); - break; - case SDIO_TEST_HOST_SENDER_NO_LP: - sender_no_loopback_test(test_ch); - break; - case SDIO_TEST_LPM_RANDOM: - lpm_continuous_rand_test(test_ch); - break; - case SDIO_TEST_RTT: - a2_rtt_test(test_ch); - break; - case SDIO_TEST_CLOSE_CHANNEL: - if (test_ch->ch_id != SDIO_SMEM) - open_close_test(test_ch); - break; - case SDIO_TEST_MODEM_RESET: - modem_reset_test(test_ch); - break; - case SDIO_TEST_A2_VALIDATION: - a2_validation_test(test_ch); - break; - default: - pr_err(TEST_MODULE_NAME ":Bad Test type = %d.\n", - (int) test_type); - } -} - - -/** - * Notification Callback - * - * Notify the worker - * - */ -static void notify(void *priv, unsigned channel_event) -{ - struct test_channel *test_ch = (struct test_channel *) priv; - - pr_debug(TEST_MODULE_NAME ": %s - notify event=%d.\n", - __func__, channel_event); - - if (test_ch->ch == NULL) { - pr_info(TEST_MODULE_NAME ": %s - notify before ch ready.\n", - __func__); - return; - } - - switch (channel_event) { - case SDIO_EVENT_DATA_READ_AVAIL: - atomic_inc(&test_ch->rx_notify_count); - atomic_set(&test_ch->any_notify_count, 1); - TEST_DBG(TEST_MODULE_NAME ": %s - SDIO_EVENT_DATA_READ_AVAIL, " - "any_notify_count=%d, rx_notify_count=%d\n", - __func__, - atomic_read(&test_ch->any_notify_count), - atomic_read(&test_ch->rx_notify_count)); - /* - * when there is pending data on a channel we would like to - * turn on the bit mask that implies that there is pending - * data for that channel on that deivce - */ - if (test_ch->test_device != NULL && - test_ch->test_type == SDIO_TEST_LPM_RANDOM) { - spin_lock_irqsave(&test_ch->test_device->lpm_array_lock, - test_ch->test_device-> - lpm_array_lock_flags); - test_ch->test_device->read_avail_mask |= - test_ch->channel_mask_id; - test_ch->notify_counter_per_chan++; - - lpm_test_update_entry(test_ch, LPM_NOTIFY, "NOTIFY", 0); - spin_unlock_irqrestore(&test_ch->test_device-> - lpm_array_lock, - test_ch->test_device-> - lpm_array_lock_flags); - } - break; - - case SDIO_EVENT_DATA_WRITE_AVAIL: - atomic_inc(&test_ch->tx_notify_count); - atomic_set(&test_ch->any_notify_count, 1); - TEST_DBG(TEST_MODULE_NAME ": %s - SDIO_EVENT_DATA_WRITE_AVAIL, " - "any_notify_count=%d, tx_notify_count=%d\n", - __func__, - atomic_read(&test_ch->any_notify_count), - atomic_read(&test_ch->tx_notify_count)); - break; - - default: - BUG(); - } - wake_up(&test_ch->wait_q); - -} - -#ifdef CONFIG_MSM_SDIO_SMEM -static int sdio_smem_test_cb(int event) -{ - struct test_channel *tch = test_ctx->test_ch_arr[SDIO_SMEM]; - int i; - int *smem_buf = (int *)test_ctx->smem_buf; - uint32_t val = 0; - int ret = 0; - - pr_debug(TEST_MODULE_NAME ":%s: Received event %d\n", __func__, event); - - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s NULL tch\n", __func__); - return -EINVAL; - } - - switch (event) { - case SDIO_SMEM_EVENT_READ_DONE: - tch->rx_bytes += SMEM_MAX_XFER_SIZE; - for (i = 0; i < SMEM_MAX_XFER_SIZE;) { - val = (int)*smem_buf; - if ((val != test_ctx->smem_counter) && tch->is_used) { - pr_err(TEST_MODULE_NAME ":%s: Invalid value %d " - "expected %d in smem arr", - __func__, val, test_ctx->smem_counter); - pr_err(TEST_MODULE_NAME ":SMEM test FAILED\n"); - tch->test_completed = 1; - tch->test_result = TEST_FAILED; - check_test_completion(); - ret = -EINVAL; - goto exit; - } - i += 4; - smem_buf++; - test_ctx->smem_counter++; - } - if (tch->rx_bytes >= 40000000) { - if ((!tch->test_completed) && tch->is_used) { - pr_info(TEST_MODULE_NAME ":SMEM test PASSED\n"); - tch->test_completed = 1; - tch->test_result = TEST_PASSED; - check_test_completion(); - } - } - break; - case SDIO_SMEM_EVENT_READ_ERR: - if (tch->is_used) { - pr_err(TEST_MODULE_NAME ":Read overflow, " - "SMEM test FAILED\n"); - tch->test_completed = 1; - tch->test_result = TEST_FAILED; - ret = -EIO; - } - break; - default: - if (tch->is_used) { - pr_err(TEST_MODULE_NAME ":Unhandled event %d\n", event); - ret = -EINVAL; - } - break; - } -exit: - return ret; -} - -static int sdio_smem_open(struct sdio_smem_client *sdio_smem) -{ - int ret = 0; - - if (!sdio_smem) { - pr_info(TEST_MODULE_NAME "%s: NULL sdio_smem_client\n", - __func__); - return -EINVAL; - } - - if (test_ctx->test_ch_arr[SDIO_SMEM]->ch_ready) { - pr_info(TEST_MODULE_NAME "%s: SDIO_SMEM channel is already opened\n", - __func__); - return 0; - } - - test_ctx->test_ch_arr[SDIO_SMEM]->ch_ready = 1; - sdio_smem->buf = test_ctx->smem_buf; - sdio_smem->size = SMEM_MAX_XFER_SIZE; - sdio_smem->cb_func = sdio_smem_test_cb; - ret = sdio_smem_register_client(); - if (ret) - pr_info(TEST_MODULE_NAME "%s: Error (%d) registering sdio_smem " - "test client\n", - __func__, ret); - - return ret; -} - -static int sdio_smem_test_probe(struct platform_device *pdev) -{ - test_ctx->sdio_smem = container_of(pdev, struct sdio_smem_client, - plat_dev); - - return sdio_smem_open(test_ctx->sdio_smem); -} - -static struct platform_driver sdio_smem_client_drv = { - .probe = sdio_smem_test_probe, - .driver = { - .name = "SDIO_SMEM_CLIENT", - .owner = THIS_MODULE, - }, -}; -#endif - -static void sdio_test_lpm_timeout_handler(unsigned long data) -{ - struct test_channel *tch = (struct test_channel *)data; - - pr_info(TEST_MODULE_NAME ": %s - LPM TEST TIMEOUT Expired after " - "%d ms\n", __func__, tch->timeout_ms); - tch->test_completed = 1; - pr_info(TEST_MODULE_NAME ": %s - tch->test_result = TEST_FAILED\n", - __func__); - tch->test_completed = 1; - tch->test_result = TEST_FAILED; - check_test_completion(); - return; -} - -static void sdio_test_lpm_timer_handler(unsigned long data) -{ - struct test_channel *tch = (struct test_channel *)data; - - pr_info(TEST_MODULE_NAME ": %s - LPM TEST Timer Expired after " - "%d ms\n", __func__, tch->timer_interval_ms); - - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s - LPM TEST FAILED. " - "tch is NULL\n", __func__); - return; - } - - if (!tch->ch) { - pr_err(TEST_MODULE_NAME ": %s - LPM TEST FAILED. tch->ch " - "is NULL\n", __func__); - tch->test_result = TEST_FAILED; - return; - } - - /* Verfiy that we voted for sleep */ - if (tch->is_ok_to_sleep) { - tch->test_result = TEST_PASSED; - pr_info(TEST_MODULE_NAME ": %s - 8K voted for sleep\n", - __func__); - } else { - tch->test_result = TEST_FAILED; - pr_info(TEST_MODULE_NAME ": %s - 8K voted against sleep\n", - __func__); - - } - - sdio_al_unregister_lpm_cb(tch->sdio_al_device); - - if (tch->test_type == SDIO_TEST_LPM_HOST_WAKER) { - atomic_set(&tch->wakeup_client, 1); - wake_up(&tch->wait_q); - } -} - -int sdio_test_wakeup_callback(void *device_handle, int is_vote_for_sleep) -{ - int i = 0; - - TEST_DBG(TEST_MODULE_NAME ": %s is_vote_for_sleep=%d!!!", - __func__, is_vote_for_sleep); - - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used) || (!tch->ch_ready)) - continue; - if (tch->sdio_al_device == device_handle) { - tch->is_ok_to_sleep = is_vote_for_sleep; - - if (tch->test_type == SDIO_TEST_LPM_RANDOM) { - spin_lock_irqsave(&tch->test_device-> - lpm_array_lock, - tch->test_device-> - lpm_array_lock_flags); - if (is_vote_for_sleep == 1) - lpm_test_update_entry(tch, - LPM_SLEEP, - "SLEEP ", 0); - else - lpm_test_update_entry(tch, - LPM_WAKEUP, - "WAKEUP", 0); - - spin_unlock_irqrestore(&tch->test_device-> - lpm_array_lock, - tch->test_device-> - lpm_array_lock_flags); - break; - } - } - } - - return 0; -} - -static int sdio_test_find_dev(struct test_channel *tch) -{ - int j; - int null_index = -1; - - for (j = 0 ; j < MAX_NUM_OF_SDIO_DEVICES; ++j) { - - struct sdio_test_device *test_dev = - &test_ctx->test_dev_arr[j]; - - if (test_dev->sdio_al_device == NULL) { - if (null_index == -1) - null_index = j; - continue; - } - - if (test_dev->sdio_al_device == - tch->ch->sdio_al_dev) { - test_dev->open_channels_counter_to_recv++; - test_dev->open_channels_counter_to_send++; - tch->test_device = test_dev; - /* setting mask id for pending data for - this channel */ - tch->channel_mask_id = test_dev->next_mask_id; - test_dev->next_mask_id *= 2; - pr_info(TEST_MODULE_NAME ": %s - channel %s " - "got read_mask_id = 0x%x. device " - "next_mask_id=0x%x", - __func__, tch->name, tch->channel_mask_id, - test_dev->next_mask_id); - break; - } - } - - /* - * happens ones a new device is "discovered" while testing. i.e - * if testing a few channels, a new deivce will be "discovered" once - * the first channel of a device is being tested - */ - if (j == MAX_NUM_OF_SDIO_DEVICES) { - - struct sdio_test_device *test_dev = - &test_ctx-> - test_dev_arr[null_index]; - test_dev->sdio_al_device = - tch->ch->sdio_al_dev; - - test_ctx->number_of_active_devices++; - test_ctx->max_number_of_devices++; - test_dev->open_channels_counter_to_recv++; - test_dev->open_channels_counter_to_send++; - test_dev->next_avail_entry_in_array = 0; - tch->test_device = test_dev; - tch->test_device->array_size = - LPM_ARRAY_SIZE; - test_dev->modem_result_per_dev = 1; - tch->modem_result_per_chan = 0; - test_dev->next_avail_entry_in_array = 0; - - spin_lock_init(&test_dev-> - lpm_array_lock); - - if (tch->test_type == SDIO_TEST_LPM_RANDOM) { - pr_err(MODULE_NAME ": %s - " - "Allocating Msg Array for " - "Maximum open channels for device (%d) " - "Channels. Array has %d entries", - __func__, - LPM_MAX_OPEN_CHAN_PER_DEV, - test_dev->array_size); - - test_dev->lpm_arr = - kzalloc(sizeof( - struct lpm_entry_type) * - tch-> - test_device->array_size, - GFP_KERNEL); - - if (!test_dev->lpm_arr) { - pr_err(MODULE_NAME ": %s - " - "lpm_arr is NULL", - __func__); - return -ENOMEM; - } - } - - /* - * in new device, initialize next_mask_id, and setting - * mask_id to the channel - */ - test_dev->next_mask_id = 0x1; - tch->channel_mask_id = test_dev->next_mask_id; - test_dev->next_mask_id *= 2; - pr_info(TEST_MODULE_NAME ": %s - channel %s got " - "read_mask_id = 0x%x. device next_mask_id=0x%x", - __func__, - tch->name, - tch->channel_mask_id, - test_dev->next_mask_id); - } - - return 0; -} - -static void check_test_result(void) -{ - int result = 1; - int i = 0; - - test_ctx->max_number_of_devices = 0; - - pr_info(TEST_MODULE_NAME ": %s - Woke Up\n", __func__); - - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used) || (!tch->ch_ready)) - continue; - - if (tch->test_type == SDIO_TEST_LPM_RANDOM) - result &= tch->test_device->final_result_per_dev; - else - if (tch->test_result == TEST_FAILED) { - pr_info(TEST_MODULE_NAME ": %s - " - "Test FAILED\n", __func__); - test_ctx->test_result = TEST_FAILED; - pr_err(TEST_MODULE_NAME ": %s - " - "test_result %d", - __func__, test_ctx->test_result); - return; - } - } - - if (result == 0) { - pr_info(TEST_MODULE_NAME ": %s - Test FAILED\n", __func__); - test_ctx->test_result = TEST_FAILED; - pr_err(TEST_MODULE_NAME ": %s - " - "test_result %d", - __func__, test_ctx->test_result); - return; - } - - pr_info(TEST_MODULE_NAME ": %s - Test PASSED", __func__); - test_ctx->test_result = TEST_PASSED; - pr_err(TEST_MODULE_NAME ": %s - " - "test_result %d", - __func__, test_ctx->test_result); - return; -} - -/** - * Test Main - */ -static int test_start(void) -{ - int ret = -ENOMEM; - int i; - - pr_debug(TEST_MODULE_NAME ":Starting Test ....\n"); - - test_ctx->test_completed = 0; - test_ctx->test_result = TEST_NO_RESULT; - test_ctx->debug.dun_throughput = 0; - test_ctx->debug.rmnt_throughput = 0; - test_ctx->number_of_active_devices = 0; - - pr_err(TEST_MODULE_NAME ": %s - test_result %d", - __func__, test_ctx->test_result); - - memset(test_ctx->test_dev_arr, 0, - sizeof(struct sdio_test_device)*MAX_NUM_OF_SDIO_DEVICES); - - /* Open The Channels */ - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used)) - continue; - - tch->rx_bytes = 0; - tch->tx_bytes = 0; - - atomic_set(&tch->tx_notify_count, 0); - atomic_set(&tch->rx_notify_count, 0); - atomic_set(&tch->any_notify_count, 0); - atomic_set(&tch->wakeup_client, 0); - - /* in case there are values left from previous tests */ - tch->notify_counter_per_chan = 0; - tch->next_index_in_sent_msg_per_chan = 0; - - memset(tch->buf, 0x00, tch->buf_size); - tch->test_result = TEST_NO_RESULT; - - tch->test_completed = 0; - - ret = open_sdio_ch(tch); - if (ret) - continue; - - if (tch->ch_id != SDIO_SMEM) { - ret = sdio_test_find_dev(tch); - - if (ret) { - pr_err(TEST_MODULE_NAME ": %s - " - "sdio_test_find_dev() returned with " - "error", __func__); - return -ENODEV; - } - - tch->sdio_al_device = tch->ch->sdio_al_dev; - } - - if ((tch->test_type == SDIO_TEST_LPM_HOST_WAKER) || - (tch->test_type == SDIO_TEST_LPM_CLIENT_WAKER) || - (tch->test_type == SDIO_TEST_LPM_RANDOM)) - sdio_al_register_lpm_cb(tch->sdio_al_device, - sdio_test_wakeup_callback); - } - - /* - * make some space between opening the channels and sending the - * config messages - */ - msleep(100); - - /* - * try to delay send_config_msg of all channels to after the point - * when we open them all - */ - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used)) - continue; - - if ((tch->ch_ready) && (tch->ch_id != SDIO_SMEM)) - send_config_msg(tch); - - if ((tch->test_type == SDIO_TEST_LPM_HOST_WAKER) || - (tch->test_type == SDIO_TEST_LPM_CLIENT_WAKER) || - (tch->test_type == SDIO_TEST_LPM_RANDOM)) { - if (tch->timer_interval_ms > 0) { - pr_info(TEST_MODULE_NAME ": %s - init timer, " - "ms=%d\n", - __func__, tch->timer_interval_ms); - init_timer(&tch->timer); - tch->timer.data = (unsigned long)tch; - tch->timer.function = - sdio_test_lpm_timer_handler; - tch->timer.expires = jiffies + - msecs_to_jiffies(tch->timer_interval_ms); - add_timer(&tch->timer); - } - } - } - - pr_debug(TEST_MODULE_NAME ":queue_work..\n"); - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used) || (!tch->ch_ready)) - continue; - - if (tch->ch_id == SDIO_SMEM) { -#ifdef CONFIG_MSM_SDIO_SMEM - if (tch->test_type == SDIO_TEST_CLOSE_CHANNEL) - open_close_smem_test(tch); -#endif - } else { - queue_work(tch->workqueue, &tch->test_work.work); - } - - } - - pr_info(TEST_MODULE_NAME ": %s - Waiting for the test completion\n", - __func__); - - wait_event(test_ctx->wait_q, test_ctx->test_completed); - check_test_result(); - - /* - * Close the channels and zero the is_used flag so that if the modem - * will be reset after the test completion we won't re-open - * the channels - */ - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - - if ((!tch) || (!tch->is_used)) - continue; - if (!tch->ch_ready) { - tch->is_used = 0; - continue; - } - - close_sdio_ch(tch); - tch->is_used = 0; - } - - if (test_ctx->test_result == TEST_PASSED) - return 0; - else - return -EINVAL; -} - -static int set_params_loopback_9k(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_LOOPBACK_CLIENT; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - tch->config_msg.num_packets = 10000; - tch->config_msg.num_iterations = 1; - - tch->packet_length = 512; - if (tch->ch_id == SDIO_RPC) - tch->packet_length = 128; - tch->timer_interval_ms = 0; - - return 0; -} -static int set_params_loopback_9k_close(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_CLOSE_CHANNEL; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - tch->config_msg.num_packets = 5000; - tch->config_msg.num_iterations = 1; - tch->max_burst_size = 10; - switch (tch->ch_id) { - case SDIO_DUN: - case SDIO_RPC: - tch->packet_length = 128; /* max is 2K*/ - break; - case SDIO_DIAG: - case SDIO_RMNT: - default: - tch->packet_length = 512; /* max is 4k */ - } - tch->timer_interval_ms = 0; - return 0; -} -static int set_params_a2_perf(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_PERF; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - - switch (tch->ch_id) { - case SDIO_DIAG: - tch->packet_length = 512; - break; - case SDIO_DUN: - tch->packet_length = DUN_PACKET_SIZE; - break; - case SDIO_CSVT: - tch->packet_length = CSVT_PACKET_SIZE; - break; - default: - tch->packet_length = MAX_XFER_SIZE; - break; - } - - pr_info(TEST_MODULE_NAME ": %s: packet_length=%d", __func__, - tch->packet_length); - - tch->config_msg.num_packets = 10000; - tch->config_msg.num_iterations = 1; - tch->random_packet_size = 0; - - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_rtt(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_RTT; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - - switch (tch->ch_id) { - case SDIO_RMNT: - tch->packet_length = SDIO_RMNT_RTT_PACKET_SIZE; - break; - case SDIO_CSVT: - tch->packet_length = SDIO_CSVT_RTT_PACKET_SIZE; - break; - default: - pr_err(TEST_MODULE_NAME ": %s - ch_id invalid.\n", __func__); - return -EINVAL; - } - - pr_info(TEST_MODULE_NAME ": %s: packet_length=%d", __func__, - tch->packet_length); - - tch->config_msg.num_packets = 200; - tch->config_msg.num_iterations = 1; - tch->random_packet_size = 0; - - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_a2_small_pkts(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_PERF; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - tch->packet_length = 128; - - tch->config_msg.num_packets = 1000000; - tch->config_msg.num_iterations = 1; - tch->random_packet_size = 1; - - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_modem_reset(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_MODEM_RESET; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - tch->packet_length = 512; - if (tch->ch_id == SDIO_RPC) - tch->packet_length = 128; - else if ((tch->ch_id == SDIO_RMNT) || (tch->ch_id == SDIO_DUN)) - tch->packet_length = MAX_XFER_SIZE; - - tch->config_msg.num_packets = 50000; - tch->config_msg.num_iterations = 1; - - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_a2_validation(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_A2_VALIDATION; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_LOOPBACK_CLIENT; - - if (tch->ch_id == SDIO_RMNT) - tch->packet_length = RMNT_PACKET_SIZE; - else if (tch->ch_id == SDIO_DUN) - tch->packet_length = DUN_PACKET_SIZE; - else - tch->packet_length = MAX_XFER_SIZE; - - tch->config_msg.num_packets = 10000; - tch->config_msg.num_iterations = 1; - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_smem_test(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->timer_interval_ms = 0; - - return 0; -} - -static int set_params_lpm_test(struct test_channel *tch, - enum sdio_test_case_type test, - int timer_interval_ms) -{ - static int first_time = 1; - if (!tch) { - pr_err(TEST_MODULE_NAME ": %s - NULL channel\n", __func__); - return -EINVAL; - } - - tch->is_used = 1; - tch->test_type = test; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = test; - tch->config_msg.num_packets = LPM_TEST_NUM_OF_PACKETS; - tch->config_msg.num_iterations = 1; - tch->timer_interval_ms = timer_interval_ms; - tch->timeout_ms = 10000; - - tch->packet_length = 0; - if (test != SDIO_TEST_LPM_RANDOM) { - init_timer(&tch->timeout_timer); - tch->timeout_timer.data = (unsigned long)tch; - tch->timeout_timer.function = sdio_test_lpm_timeout_handler; - tch->timeout_timer.expires = jiffies + - msecs_to_jiffies(tch->timeout_ms); - add_timer(&tch->timeout_timer); - pr_info(TEST_MODULE_NAME ": %s - Initiated LPM TIMEOUT TIMER." - "set to %d ms\n", - __func__, tch->timeout_ms); - } - - if (first_time) { - pr_info(TEST_MODULE_NAME ": %s - wake_lock_init() called\n", - __func__); - wake_lock_init(&test_ctx->wake_lock, - WAKE_LOCK_SUSPEND, TEST_MODULE_NAME); - first_time = 0; - } - - pr_info(TEST_MODULE_NAME ": %s - wake_lock() for the TEST is " - "called channel %s. to prevent real sleeping\n", - __func__, tch->name); - wake_lock(&test_ctx->wake_lock); - - return 0; -} - -static int set_params_8k_sender_no_lp(struct test_channel *tch) -{ - if (!tch) { - pr_err(TEST_MODULE_NAME ":NULL channel\n"); - return -EINVAL; - } - tch->is_used = 1; - tch->test_type = SDIO_TEST_HOST_SENDER_NO_LP; - tch->config_msg.signature = TEST_CONFIG_SIGNATURE; - tch->config_msg.test_case = SDIO_TEST_HOST_SENDER_NO_LP; - tch->config_msg.num_packets = 1000; - tch->config_msg.num_iterations = 1; - - tch->packet_length = 512; - if (tch->ch_id == SDIO_RPC) - tch->packet_length = 128; - tch->timer_interval_ms = 0; - - return 0; -} - -static void set_pseudo_random_seed(void) -{ - /* Set the seed accoring to the kernel command parameters if any or - get a random value */ - if (seed != 0) { - test_ctx->lpm_pseudo_random_seed = seed; - } else { - test_ctx->lpm_pseudo_random_seed = - (unsigned int)(get_jiffies_64() & 0xFFFF); - test_ctx->lpm_pseudo_random_seed = - pseudo_random_seed(&test_ctx->lpm_pseudo_random_seed); - } - - pr_info(TEST_MODULE_NAME ":%s: seed is %u", - __func__, test_ctx->lpm_pseudo_random_seed); -} - -/* - for each channel - 1. open channel - 2. close channel -*/ -static int close_channel_lpm_test(int channel_num) -{ - int ret = 0; - struct test_channel *tch = NULL; - tch = test_ctx->test_ch_arr[channel_num]; - - if (!tch) { - pr_info(TEST_MODULE_NAME ":%s ch#%d is NULL\n", - __func__, channel_num); - return 0; - } - - ret = open_sdio_ch(tch); - if (ret) { - pr_err(TEST_MODULE_NAME":%s open channel %s" - " failed\n", __func__, tch->name); - return ret; - } else { - pr_info(TEST_MODULE_NAME":%s open channel %s" - " success\n", __func__, tch->name); - } - ret = close_sdio_ch(tch); - if (ret) { - pr_err(TEST_MODULE_NAME":%s close channel %s" - " failed\n", __func__, tch->name); - return ret; - } else { - pr_info(TEST_MODULE_NAME":%s close channel %s" - " success\n", __func__, tch->name); - } - - tch->is_used = 0; - - return ret; -} - -/** - * Write File. - * - * @note Trigger the test from user space by: - * echo 1 > /dev/sdio_al_test - * - */ -ssize_t test_write(struct file *filp, const char __user *buf, size_t size, - loff_t *f_pos) -{ - sdio_al_test_initial_dev_and_chan(test_ctx); - - if (strict_strtol(buf, 10, &test_ctx->testcase)) - return -EINVAL; - - switch (test_ctx->testcase) { - case 98: - pr_info(TEST_MODULE_NAME " set runtime debug on"); - test_ctx->runtime_debug = 1; - return size; - case 99: - pr_info(TEST_MODULE_NAME " set runtime debug off"); - test_ctx->runtime_debug = 0; - return size; - default: - pr_info(TEST_MODULE_NAME ":Bad Test number = %d.\n", - (int)test_ctx->testcase); - return size; - } - - return size; -} - -/** - * Test Channel Init. - */ -int test_channel_init(char *name) -{ - struct test_channel *test_ch; - int ch_id = 0; - int ret; - - pr_debug(TEST_MODULE_NAME ":%s.\n", __func__); - pr_info(TEST_MODULE_NAME ": init test channel %s.\n", name); - - ch_id = channel_name_to_id(name); - pr_debug(TEST_MODULE_NAME ":id = %d.\n", ch_id); - if (test_ctx->test_ch_arr[ch_id] == NULL) { - test_ch = kzalloc(sizeof(*test_ch), GFP_KERNEL); - if (test_ch == NULL) { - pr_err(TEST_MODULE_NAME ":kzalloc err for allocating " - "test_ch %s.\n", - name); - return -ENOMEM; - } - test_ctx->test_ch_arr[ch_id] = test_ch; - - test_ch->ch_id = ch_id; - - strncpy(test_ch->name, name, - strnlen(name, TEST_CH_NAME_SIZE)-SDIO_TEST_POSTFIX_SIZE); - - test_ch->buf_size = MAX_XFER_SIZE; - - test_ch->buf = kzalloc(test_ch->buf_size, GFP_KERNEL); - if (test_ch->buf == NULL) { - kfree(test_ch); - test_ctx->test_ch = NULL; - return -ENOMEM; - } - - if (test_ch->ch_id == SDIO_SMEM) { - test_ctx->smem_buf = kzalloc(SMEM_MAX_XFER_SIZE, - GFP_KERNEL); - if (test_ctx->smem_buf == NULL) { - pr_err(TEST_MODULE_NAME ":%s: Unable to " - "allocate smem buf\n", - __func__); - kfree(test_ch); - test_ctx->test_ch = NULL; - return -ENOMEM; - } - -#ifdef CONFIG_MSM_SDIO_SMEM - ret = platform_driver_register(&sdio_smem_client_drv); - if (ret) { - pr_err(TEST_MODULE_NAME ":%s: Unable to " - "register sdio smem " - "test client\n", - __func__); - return ret; - } -#endif - } else { - test_ch->workqueue = - create_singlethread_workqueue(test_ch->name); - test_ch->test_work.test_ch = test_ch; - INIT_WORK(&test_ch->test_work.work, worker); - - init_waitqueue_head(&test_ch->wait_q); - } - } else { - test_ch = test_ctx->test_ch_arr[ch_id]; - pr_info(TEST_MODULE_NAME ":%s: ch %s was detected again\n", - __func__, test_ch->name); - test_ch->card_removed = 0; - if ((test_ch->is_used) && - (test_ch->test_type == SDIO_TEST_MODEM_RESET)) { - if (test_ch->ch_id == SDIO_SMEM) { -#ifdef CONFIG_MSM_SDIO_SMEM - ret = add_sdio_smem(); - if (ret) { - test_ch->ch_ready = false; - return 0; - } -#endif - } else { - ret = open_sdio_ch(test_ch); - if (ret) { - pr_info(TEST_MODULE_NAME - ":%s: open channel %s failed\n", - __func__, test_ch->name); - return 0; - } - ret = sdio_test_find_dev(test_ch); - - if (ret) { - pr_err(TEST_MODULE_NAME ": %s - " - "sdio_test_find_dev() returned " - "with error", __func__); - return -ENODEV; - } - - test_ch->sdio_al_device = - test_ch->ch->sdio_al_dev; - } - atomic_set(&test_ch->card_detected_event, 1); - wake_up(&test_ch->wait_q); - } - } - - return 0; -} - -static int sdio_test_channel_probe(struct platform_device *pdev) -{ - if (!pdev) - return -EIO; - return test_channel_init((char *)pdev->name); -} - -static int sdio_test_channel_remove(struct platform_device *pdev) -{ - int ch_id; - - if (!pdev) - return -EIO; - - ch_id = channel_name_to_id((char *)pdev->name); - if (test_ctx->test_ch_arr[ch_id] == NULL) - return 0; - - pr_info(TEST_MODULE_NAME "%s: remove ch %s\n", - __func__, test_ctx->test_ch_arr[ch_id]->name); - - if ((ch_id == SDIO_SMEM) && (test_ctx->smem_pdev)) { - platform_device_unregister(test_ctx->smem_pdev); - test_ctx->smem_pdev = NULL; - } - - test_ctx->test_ch_arr[ch_id]->ch_ready = 0; - test_ctx->test_ch_arr[ch_id]->card_removed = 1; - - return 0; - -} - -static int sdio_test_channel_csvt_probe(struct platform_device *pdev) -{ - int ret = 0; - - if (!pdev) - return -ENODEV; - - test_ctx->csvt_app_pdev = platform_device_alloc("SDIO_CSVT_TEST_APP", - -1); - ret = platform_device_add(test_ctx->csvt_app_pdev); - if (ret) { - pr_err(MODULE_NAME ":platform_device_add failed, " - "ret=%d\n", ret); - return ret; - } - - return sdio_test_channel_probe(pdev); -} - -static int sdio_test_channel_csvt_remove(struct platform_device *pdev) -{ - if (!pdev) - return -ENODEV; - - platform_device_unregister(test_ctx->csvt_app_pdev); - - return sdio_test_channel_remove(pdev); -} - -static struct platform_driver sdio_rpc_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_RPC_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_qmi_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_QMI_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_diag_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_DIAG_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_smem_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_SMEM_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_rmnt_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_RMNT_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_dun_drv = { - .probe = sdio_test_channel_probe, - .remove = sdio_test_channel_remove, - .driver = { - .name = "SDIO_DUN_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sdio_csvt_drv = { - .probe = sdio_test_channel_csvt_probe, - .remove = sdio_test_channel_csvt_remove, - .driver = { - .name = "SDIO_CSVT_TEST", - .owner = THIS_MODULE, - }, -}; - -static struct class *test_class; - -const struct file_operations test_fops = { - .owner = THIS_MODULE, - .write = test_write, -}; - -/** - * Module Init. - */ -static int __init test_init(void) -{ - int ret; - - pr_debug(TEST_MODULE_NAME ":test_init.\n"); - - test_ctx = kzalloc(sizeof(struct test_context), GFP_KERNEL); - - if (test_ctx == NULL) { - pr_err(TEST_MODULE_NAME ":kzalloc err.\n"); - return -ENOMEM; - } - test_ctx->test_ch = NULL; - test_ctx->signature = TEST_SIGNATURE; - - test_ctx->name = "UNKNOWN"; - - init_waitqueue_head(&test_ctx->wait_q); - -#ifdef CONFIG_DEBUG_FS - sdio_al_test_debugfs_init(); -#endif - - test_class = class_create(THIS_MODULE, TEST_MODULE_NAME); - - ret = alloc_chrdev_region(&test_ctx->dev_num, 0, 1, TEST_MODULE_NAME); - if (ret) { - pr_err(TEST_MODULE_NAME "alloc_chrdev_region err.\n"); - return -ENODEV; - } - - test_ctx->dev = device_create(test_class, NULL, test_ctx->dev_num, - test_ctx, TEST_MODULE_NAME); - if (IS_ERR(test_ctx->dev)) { - pr_err(TEST_MODULE_NAME ":device_create err.\n"); - return -ENODEV; - } - - test_ctx->cdev = cdev_alloc(); - if (test_ctx->cdev == NULL) { - pr_err(TEST_MODULE_NAME ":cdev_alloc err.\n"); - return -ENODEV; - } - cdev_init(test_ctx->cdev, &test_fops); - test_ctx->cdev->owner = THIS_MODULE; - - ret = cdev_add(test_ctx->cdev, test_ctx->dev_num, 1); - if (ret) - pr_err(TEST_MODULE_NAME ":cdev_add err=%d\n", -ret); - else - pr_debug(TEST_MODULE_NAME ":SDIO-AL-Test init OK..\n"); - - platform_driver_register(&sdio_rpc_drv); - platform_driver_register(&sdio_qmi_drv); - platform_driver_register(&sdio_diag_drv); - platform_driver_register(&sdio_smem_drv); - platform_driver_register(&sdio_rmnt_drv); - platform_driver_register(&sdio_dun_drv); - platform_driver_register(&sdio_csvt_drv); - - return ret; -} - -/** - * Module Exit. - */ -static void __exit test_exit(void) -{ - int i; - - pr_debug(TEST_MODULE_NAME ":test_exit.\n"); - - test_ctx->exit_flag = true; - - msleep(100); /* allow gracefully exit of the worker thread */ - - cdev_del(test_ctx->cdev); - device_destroy(test_class, test_ctx->dev_num); - unregister_chrdev_region(test_ctx->dev_num, 1); - - platform_driver_unregister(&sdio_rpc_drv); - platform_driver_unregister(&sdio_qmi_drv); - platform_driver_unregister(&sdio_diag_drv); - platform_driver_unregister(&sdio_smem_drv); - platform_driver_unregister(&sdio_rmnt_drv); - platform_driver_unregister(&sdio_dun_drv); - platform_driver_unregister(&sdio_csvt_drv); - - for (i = 0; i < SDIO_MAX_CHANNELS; i++) { - struct test_channel *tch = test_ctx->test_ch_arr[i]; - if (!tch) - continue; - kfree(tch->buf); - kfree(tch); - } - -#ifdef CONFIG_DEBUG_FS - sdio_al_test_debugfs_cleanup(); -#endif - - kfree(test_ctx); - - pr_debug(TEST_MODULE_NAME ":test_exit complete.\n"); -} - -module_init(test_init); -module_exit(test_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("SDIO_AL Test"); -MODULE_AUTHOR("Amir Samuelov "); - - diff --git a/arch/arm/mach-msm/sdio_cmux.c b/arch/arm/mach-msm/sdio_cmux.c deleted file mode 100644 index 48ca6b7a67db..000000000000 --- a/arch/arm/mach-msm/sdio_cmux.c +++ /dev/null @@ -1,901 +0,0 @@ -/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "modem_notifier.h" - -#define MAX_WRITE_RETRY 5 -#define MAGIC_NO_V1 0x33FC - -static int msm_sdio_cmux_debug_mask; -module_param_named(debug_mask, msm_sdio_cmux_debug_mask, - int, S_IRUGO | S_IWUSR | S_IWGRP); - -enum cmd_type { - DATA = 0, - OPEN, - CLOSE, - STATUS, - NUM_CMDS -}; - -#define DSR_POS 0x1 -#define CTS_POS 0x2 -#define RI_POS 0x4 -#define CD_POS 0x8 - -struct sdio_cmux_ch { - int lc_id; - - struct mutex lc_lock; - wait_queue_head_t open_wait_queue; - int is_remote_open; - int is_local_open; - int is_channel_reset; - - char local_status; - char remote_status; - - struct mutex tx_lock; - struct list_head tx_list; - - void *priv; - struct mutex rx_cb_lock; - void (*receive_cb)(void *, int, void *); - void (*write_done)(void *, int, void *); - void (*status_callback)(int, void *); -} logical_ch[SDIO_CMUX_NUM_CHANNELS]; - -struct sdio_cmux_hdr { - uint16_t magic_no; - uint8_t status; /* This field is reserved for commands other - * than STATUS */ - uint8_t cmd; - uint8_t pad_bytes; - uint8_t lc_id; - uint16_t pkt_len; -}; - -struct sdio_cmux_pkt { - struct sdio_cmux_hdr *hdr; - void *data; -}; - -struct sdio_cmux_list_elem { - struct list_head list; - struct sdio_cmux_pkt cmux_pkt; -}; - -#define logical_ch_is_local_open(x) \ - (logical_ch[(x)].is_local_open) - -#define logical_ch_is_remote_open(x) \ - (logical_ch[(x)].is_remote_open) - -static void sdio_cdemux_fn(struct work_struct *work); -static DECLARE_WORK(sdio_cdemux_work, sdio_cdemux_fn); -static struct workqueue_struct *sdio_cdemux_wq; - -static DEFINE_MUTEX(write_lock); -static uint32_t bytes_to_write; -static DEFINE_MUTEX(temp_rx_lock); -static LIST_HEAD(temp_rx_list); - -static void sdio_cmux_fn(struct work_struct *work); -static DECLARE_WORK(sdio_cmux_work, sdio_cmux_fn); -static struct workqueue_struct *sdio_cmux_wq; - -static struct sdio_channel *sdio_qmi_chl; -static uint32_t sdio_cmux_inited; - -static uint32_t abort_tx; -static DEFINE_MUTEX(modem_reset_lock); - -static DEFINE_MUTEX(probe_lock); - -enum { - MSM_SDIO_CMUX_DEBUG = 1U << 0, - MSM_SDIO_CMUX_DUMP_BUFFER = 1U << 1, -}; - -static struct platform_device sdio_ctl_dev = { - .name = "SDIO_CTL", - .id = -1, -}; - -#if defined(DEBUG) -#define D_DUMP_BUFFER(prestr, cnt, buf) \ -do { \ - if (msm_sdio_cmux_debug_mask & MSM_SDIO_CMUX_DUMP_BUFFER) { \ - int i; \ - pr_debug("%s", prestr); \ - for (i = 0; i < cnt; i++) \ - pr_info("%.2x", buf[i]); \ - pr_debug("\n"); \ - } \ -} while (0) - -#define D(x...) \ -do { \ - if (msm_sdio_cmux_debug_mask & MSM_SDIO_CMUX_DEBUG) \ - pr_debug(x); \ -} while (0) - -#else -#define D_DUMP_BUFFER(prestr, cnt, buf) do {} while (0) -#define D(x...) do {} while (0) -#endif - -static int sdio_cmux_ch_alloc(int id) -{ - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid lc_id - %d\n", __func__, id); - return -EINVAL; - } - - logical_ch[id].lc_id = id; - mutex_init(&logical_ch[id].lc_lock); - init_waitqueue_head(&logical_ch[id].open_wait_queue); - logical_ch[id].is_remote_open = 0; - logical_ch[id].is_local_open = 0; - logical_ch[id].is_channel_reset = 0; - - INIT_LIST_HEAD(&logical_ch[id].tx_list); - mutex_init(&logical_ch[id].tx_lock); - - logical_ch[id].priv = NULL; - mutex_init(&logical_ch[id].rx_cb_lock); - logical_ch[id].receive_cb = NULL; - logical_ch[id].write_done = NULL; - return 0; -} - -static int sdio_cmux_ch_clear_and_signal(int id) -{ - struct sdio_cmux_list_elem *list_elem; - - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid lc_id - %d\n", __func__, id); - return -EINVAL; - } - - mutex_lock(&logical_ch[id].lc_lock); - logical_ch[id].is_remote_open = 0; - mutex_lock(&logical_ch[id].tx_lock); - while (!list_empty(&logical_ch[id].tx_list)) { - list_elem = list_first_entry(&logical_ch[id].tx_list, - struct sdio_cmux_list_elem, - list); - list_del(&list_elem->list); - kfree(list_elem->cmux_pkt.hdr); - kfree(list_elem); - } - mutex_unlock(&logical_ch[id].tx_lock); - mutex_lock(&logical_ch[id].rx_cb_lock); - if (logical_ch[id].receive_cb) - logical_ch[id].receive_cb(NULL, 0, logical_ch[id].priv); - mutex_unlock(&logical_ch[id].rx_cb_lock); - if (logical_ch[id].write_done) - logical_ch[id].write_done(NULL, 0, logical_ch[id].priv); - mutex_unlock(&logical_ch[id].lc_lock); - wake_up(&logical_ch[id].open_wait_queue); - return 0; -} - -static int sdio_cmux_write_cmd(const int id, enum cmd_type type) -{ - int write_size = 0; - void *write_data = NULL; - struct sdio_cmux_list_elem *list_elem; - - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid lc_id - %d\n", __func__, id); - return -EINVAL; - } - - if (type < 0 || type > NUM_CMDS) { - pr_err("%s: Invalid cmd - %d\n", __func__, type); - return -EINVAL; - } - - write_size = sizeof(struct sdio_cmux_hdr); - list_elem = kmalloc(sizeof(struct sdio_cmux_list_elem), GFP_KERNEL); - if (!list_elem) { - pr_err("%s: list_elem alloc failed\n", __func__); - return -ENOMEM; - } - - write_data = kmalloc(write_size, GFP_KERNEL); - if (!write_data) { - pr_err("%s: write_data alloc failed\n", __func__); - kfree(list_elem); - return -ENOMEM; - } - - list_elem->cmux_pkt.hdr = (struct sdio_cmux_hdr *)write_data; - list_elem->cmux_pkt.data = NULL; - - list_elem->cmux_pkt.hdr->lc_id = (uint8_t)id; - list_elem->cmux_pkt.hdr->pkt_len = (uint16_t)0; - list_elem->cmux_pkt.hdr->cmd = (uint8_t)type; - list_elem->cmux_pkt.hdr->status = (uint8_t)0; - if (type == STATUS) - list_elem->cmux_pkt.hdr->status = logical_ch[id].local_status; - list_elem->cmux_pkt.hdr->pad_bytes = (uint8_t)0; - list_elem->cmux_pkt.hdr->magic_no = (uint16_t)MAGIC_NO_V1; - - mutex_lock(&logical_ch[id].tx_lock); - list_add_tail(&list_elem->list, &logical_ch[id].tx_list); - mutex_unlock(&logical_ch[id].tx_lock); - - mutex_lock(&write_lock); - bytes_to_write += write_size; - mutex_unlock(&write_lock); - queue_work(sdio_cmux_wq, &sdio_cmux_work); - - return 0; -} - -int sdio_cmux_open(const int id, - void (*receive_cb)(void *, int, void *), - void (*write_done)(void *, int, void *), - void (*status_callback)(int, void *), - void *priv) -{ - int r; - struct sdio_cmux_list_elem *list_elem, *list_elem_tmp; - - if (!sdio_cmux_inited) - return -ENODEV; - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid id - %d\n", __func__, id); - return -EINVAL; - } - - r = wait_event_timeout(logical_ch[id].open_wait_queue, - logical_ch[id].is_remote_open, (1 * HZ)); - if (r < 0) { - pr_err("ERROR %s: wait_event_timeout() failed for" - " ch%d with rc %d\n", __func__, id, r); - return r; - } - if (r == 0) { - pr_err("ERROR %s: Wait Timed Out for ch%d\n", __func__, id); - return -ETIMEDOUT; - } - - mutex_lock(&logical_ch[id].lc_lock); - if (!logical_ch[id].is_remote_open) { - pr_err("%s: Remote ch%d not opened\n", __func__, id); - mutex_unlock(&logical_ch[id].lc_lock); - return -EINVAL; - } - if (logical_ch[id].is_local_open) { - mutex_unlock(&logical_ch[id].lc_lock); - return 0; - } - logical_ch[id].is_local_open = 1; - logical_ch[id].priv = priv; - logical_ch[id].write_done = write_done; - logical_ch[id].status_callback = status_callback; - mutex_lock(&logical_ch[id].rx_cb_lock); - logical_ch[id].receive_cb = receive_cb; - if (logical_ch[id].receive_cb) { - mutex_lock(&temp_rx_lock); - list_for_each_entry_safe(list_elem, list_elem_tmp, - &temp_rx_list, list) { - if ((int)list_elem->cmux_pkt.hdr->lc_id == id) { - logical_ch[id].receive_cb( - list_elem->cmux_pkt.data, - (int)list_elem->cmux_pkt.hdr->pkt_len, - logical_ch[id].priv); - list_del(&list_elem->list); - kfree(list_elem->cmux_pkt.hdr); - kfree(list_elem); - } - } - mutex_unlock(&temp_rx_lock); - } - mutex_unlock(&logical_ch[id].rx_cb_lock); - mutex_unlock(&logical_ch[id].lc_lock); - sdio_cmux_write_cmd(id, OPEN); - return 0; -} -EXPORT_SYMBOL(sdio_cmux_open); - -int sdio_cmux_close(int id) -{ - struct sdio_cmux_ch *ch; - - if (!sdio_cmux_inited) - return -ENODEV; - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid channel close\n", __func__); - return -EINVAL; - } - - ch = &logical_ch[id]; - mutex_lock(&ch->lc_lock); - mutex_lock(&logical_ch[id].rx_cb_lock); - ch->receive_cb = NULL; - mutex_unlock(&logical_ch[id].rx_cb_lock); - mutex_lock(&ch->tx_lock); - ch->write_done = NULL; - mutex_unlock(&ch->tx_lock); - ch->is_local_open = 0; - ch->priv = NULL; - mutex_unlock(&ch->lc_lock); - sdio_cmux_write_cmd(ch->lc_id, CLOSE); - return 0; -} -EXPORT_SYMBOL(sdio_cmux_close); - -int sdio_cmux_write_avail(int id) -{ - int write_avail; - - mutex_lock(&logical_ch[id].lc_lock); - if (logical_ch[id].is_channel_reset) { - mutex_unlock(&logical_ch[id].lc_lock); - return -ENETRESET; - } - mutex_unlock(&logical_ch[id].lc_lock); - write_avail = sdio_write_avail(sdio_qmi_chl); - return write_avail - bytes_to_write; -} -EXPORT_SYMBOL(sdio_cmux_write_avail); - -int sdio_cmux_write(int id, void *data, int len) -{ - struct sdio_cmux_list_elem *list_elem; - uint32_t write_size; - void *write_data = NULL; - struct sdio_cmux_ch *ch; - int ret; - - if (!sdio_cmux_inited) - return -ENODEV; - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) { - pr_err("%s: Invalid channel id %d\n", __func__, id); - return -ENODEV; - } - - ch = &logical_ch[id]; - if (len <= 0) { - pr_err("%s: Invalid len %d bytes to write\n", - __func__, len); - return -EINVAL; - } - - write_size = sizeof(struct sdio_cmux_hdr) + len; - list_elem = kmalloc(sizeof(struct sdio_cmux_list_elem), GFP_KERNEL); - if (!list_elem) { - pr_err("%s: list_elem alloc failed\n", __func__); - return -ENOMEM; - } - - write_data = kmalloc(write_size, GFP_KERNEL); - if (!write_data) { - pr_err("%s: write_data alloc failed\n", __func__); - kfree(list_elem); - return -ENOMEM; - } - - list_elem->cmux_pkt.hdr = (struct sdio_cmux_hdr *)write_data; - list_elem->cmux_pkt.data = (void *)((char *)write_data + - sizeof(struct sdio_cmux_hdr)); - memcpy(list_elem->cmux_pkt.data, data, len); - - list_elem->cmux_pkt.hdr->lc_id = (uint8_t)ch->lc_id; - list_elem->cmux_pkt.hdr->pkt_len = (uint16_t)len; - list_elem->cmux_pkt.hdr->cmd = (uint8_t)DATA; - list_elem->cmux_pkt.hdr->status = (uint8_t)0; - list_elem->cmux_pkt.hdr->pad_bytes = (uint8_t)0; - list_elem->cmux_pkt.hdr->magic_no = (uint16_t)MAGIC_NO_V1; - - mutex_lock(&ch->lc_lock); - if (!ch->is_remote_open || !ch->is_local_open) { - pr_err("%s: Local ch%d sending data before sending/receiving" - " OPEN command\n", __func__, ch->lc_id); - if (ch->is_channel_reset) - ret = -ENETRESET; - else - ret = -ENODEV; - mutex_unlock(&ch->lc_lock); - kfree(write_data); - kfree(list_elem); - return ret; - } - mutex_lock(&ch->tx_lock); - list_add_tail(&list_elem->list, &ch->tx_list); - mutex_unlock(&ch->tx_lock); - mutex_unlock(&ch->lc_lock); - - mutex_lock(&write_lock); - bytes_to_write += write_size; - mutex_unlock(&write_lock); - queue_work(sdio_cmux_wq, &sdio_cmux_work); - - return len; -} -EXPORT_SYMBOL(sdio_cmux_write); - -int is_remote_open(int id) -{ - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) - return -ENODEV; - - return logical_ch_is_remote_open(id); -} -EXPORT_SYMBOL(is_remote_open); - -int sdio_cmux_is_channel_reset(int id) -{ - int ret; - if (id < 0 || id >= SDIO_CMUX_NUM_CHANNELS) - return -ENODEV; - - mutex_lock(&logical_ch[id].lc_lock); - ret = logical_ch[id].is_channel_reset; - mutex_unlock(&logical_ch[id].lc_lock); - return ret; -} -EXPORT_SYMBOL(sdio_cmux_is_channel_reset); - -int sdio_cmux_tiocmget(int id) -{ - int ret = (logical_ch[id].remote_status & DSR_POS ? TIOCM_DSR : 0) | - (logical_ch[id].remote_status & CTS_POS ? TIOCM_CTS : 0) | - (logical_ch[id].remote_status & CD_POS ? TIOCM_CD : 0) | - (logical_ch[id].remote_status & RI_POS ? TIOCM_RI : 0) | - (logical_ch[id].local_status & CTS_POS ? TIOCM_RTS : 0) | - (logical_ch[id].local_status & DSR_POS ? TIOCM_DTR : 0); - return ret; -} -EXPORT_SYMBOL(sdio_cmux_tiocmget); - -int sdio_cmux_tiocmset(int id, unsigned int set, unsigned int clear) -{ - if (set & TIOCM_DTR) - logical_ch[id].local_status |= DSR_POS; - - if (set & TIOCM_RTS) - logical_ch[id].local_status |= CTS_POS; - - if (clear & TIOCM_DTR) - logical_ch[id].local_status &= ~DSR_POS; - - if (clear & TIOCM_RTS) - logical_ch[id].local_status &= ~CTS_POS; - - sdio_cmux_write_cmd(id, STATUS); - return 0; -} -EXPORT_SYMBOL(sdio_cmux_tiocmset); - -static int copy_packet(void *pkt, int size) -{ - struct sdio_cmux_list_elem *list_elem = NULL; - void *temp_pkt = NULL; - - list_elem = kmalloc(sizeof(struct sdio_cmux_list_elem), GFP_KERNEL); - if (!list_elem) { - pr_err("%s: list_elem alloc failed\n", __func__); - return -ENOMEM; - } - temp_pkt = kmalloc(size, GFP_KERNEL); - if (!temp_pkt) { - pr_err("%s: temp_pkt alloc failed\n", __func__); - kfree(list_elem); - return -ENOMEM; - } - - memcpy(temp_pkt, pkt, size); - list_elem->cmux_pkt.hdr = temp_pkt; - list_elem->cmux_pkt.data = (void *)((char *)temp_pkt + - sizeof(struct sdio_cmux_hdr)); - mutex_lock(&temp_rx_lock); - list_add_tail(&list_elem->list, &temp_rx_list); - mutex_unlock(&temp_rx_lock); - return 0; -} - -static int process_cmux_pkt(void *pkt, int size) -{ - struct sdio_cmux_hdr *mux_hdr; - uint32_t id, data_size; - void *data; - char *dump_buf = (char *)pkt; - - D_DUMP_BUFFER("process_cmux_pkt:", size, dump_buf); - mux_hdr = (struct sdio_cmux_hdr *)pkt; - switch (mux_hdr->cmd) { - case OPEN: - id = (uint32_t)(mux_hdr->lc_id); - D("%s: Received OPEN command for ch%d\n", __func__, id); - mutex_lock(&logical_ch[id].lc_lock); - logical_ch[id].is_remote_open = 1; - if (logical_ch[id].is_channel_reset) { - sdio_cmux_write_cmd(id, OPEN); - logical_ch[id].is_channel_reset = 0; - } - mutex_unlock(&logical_ch[id].lc_lock); - wake_up(&logical_ch[id].open_wait_queue); - break; - - case CLOSE: - id = (uint32_t)(mux_hdr->lc_id); - D("%s: Received CLOSE command for ch%d\n", __func__, id); - sdio_cmux_ch_clear_and_signal(id); - break; - - case DATA: - id = (uint32_t)(mux_hdr->lc_id); - D("%s: Received DATA for ch%d\n", __func__, id); - /*Channel is not locally open & if single packet received - then drop it*/ - mutex_lock(&logical_ch[id].lc_lock); - if (!logical_ch[id].is_remote_open) { - mutex_unlock(&logical_ch[id].lc_lock); - pr_err("%s: Remote Ch%d sent data before sending/" - "receiving OPEN command\n", __func__, id); - return -ENODEV; - } - - data = (void *)((char *)pkt + sizeof(struct sdio_cmux_hdr)); - data_size = (int)(((struct sdio_cmux_hdr *)pkt)->pkt_len); - mutex_unlock(&logical_ch[id].lc_lock); - /* - * The lc_lock is released before the call to receive_cb - * to avoid a dead lock where in the receive_cb would call a - * function that tries to acquire a rx_lock which is already - * acquired by a Thread that is waiting on lc_lock. - */ - mutex_lock(&logical_ch[id].rx_cb_lock); - if (logical_ch[id].receive_cb) - logical_ch[id].receive_cb(data, data_size, - logical_ch[id].priv); - else - copy_packet(pkt, size); - mutex_unlock(&logical_ch[id].rx_cb_lock); - break; - - case STATUS: - id = (uint32_t)(mux_hdr->lc_id); - D("%s: Received STATUS command for ch%d\n", __func__, id); - if (logical_ch[id].remote_status != mux_hdr->status) { - mutex_lock(&logical_ch[id].lc_lock); - logical_ch[id].remote_status = mux_hdr->status; - mutex_unlock(&logical_ch[id].lc_lock); - if (logical_ch[id].status_callback) - logical_ch[id].status_callback( - sdio_cmux_tiocmget(id), - logical_ch[id].priv); - } - break; - } - return 0; -} - -static void parse_cmux_data(void *data, int size) -{ - int data_parsed = 0, pkt_size; - char *temp_ptr; - - D("Entered %s\n", __func__); - temp_ptr = (char *)data; - while (data_parsed < size) { - pkt_size = sizeof(struct sdio_cmux_hdr) + - (int)(((struct sdio_cmux_hdr *)temp_ptr)->pkt_len); - D("Parsed %d bytes, Current Pkt Size %d bytes," - " Total size %d bytes\n", data_parsed, pkt_size, size); - process_cmux_pkt((void *)temp_ptr, pkt_size); - data_parsed += pkt_size; - temp_ptr += pkt_size; - } - - kfree(data); -} - -static void sdio_cdemux_fn(struct work_struct *work) -{ - int r = 0, read_avail = 0; - void *cmux_data; - - while (1) { - read_avail = sdio_read_avail(sdio_qmi_chl); - if (read_avail < 0) { - pr_err("%s: sdio_read_avail failed with rc %d\n", - __func__, read_avail); - return; - } - - if (read_avail == 0) { - D("%s: Nothing to read\n", __func__); - return; - } - - D("%s: kmalloc %d bytes\n", __func__, read_avail); - cmux_data = kmalloc(read_avail, GFP_KERNEL); - if (!cmux_data) { - pr_err("%s: kmalloc Failed\n", __func__); - return; - } - - D("%s: sdio_read %d bytes\n", __func__, read_avail); - r = sdio_read(sdio_qmi_chl, cmux_data, read_avail); - if (r < 0) { - pr_err("%s: sdio_read failed with rc %d\n", - __func__, r); - kfree(cmux_data); - return; - } - - parse_cmux_data(cmux_data, read_avail); - } - return; -} - -static void sdio_cmux_fn(struct work_struct *work) -{ - int i, r = 0; - void *write_data; - uint32_t write_size, write_avail, write_retry = 0; - int bytes_written; - struct sdio_cmux_list_elem *list_elem = NULL; - struct sdio_cmux_ch *ch; - - for (i = 0; i < SDIO_CMUX_NUM_CHANNELS; ++i) { - ch = &logical_ch[i]; - bytes_written = 0; - mutex_lock(&ch->tx_lock); - while (!list_empty(&ch->tx_list)) { - list_elem = list_first_entry(&ch->tx_list, - struct sdio_cmux_list_elem, - list); - list_del(&list_elem->list); - mutex_unlock(&ch->tx_lock); - - write_data = (void *)list_elem->cmux_pkt.hdr; - write_size = sizeof(struct sdio_cmux_hdr) + - (uint32_t)list_elem->cmux_pkt.hdr->pkt_len; - - mutex_lock(&modem_reset_lock); - while (!(abort_tx) && - ((write_avail = sdio_write_avail(sdio_qmi_chl)) - < write_size)) { - mutex_unlock(&modem_reset_lock); - pr_err("%s: sdio_write_avail %d bytes, " - "write size %d bytes. Waiting...\n", - __func__, write_avail, write_size); - msleep(250); - mutex_lock(&modem_reset_lock); - } - while (!(abort_tx) && - ((r = sdio_write(sdio_qmi_chl, - write_data, write_size)) < 0) - && (r != -ENODEV) - && (write_retry++ < MAX_WRITE_RETRY)) { - mutex_unlock(&modem_reset_lock); - pr_err("%s: sdio_write failed with rc %d." - "Retrying...", __func__, r); - msleep(250); - mutex_lock(&modem_reset_lock); - } - if (!r && !abort_tx) { - D("%s: sdio_write_completed %dbytes\n", - __func__, write_size); - bytes_written += write_size; - } else if (r == -ENODEV) { - pr_err("%s: aborting_tx because sdio_write" - " returned %d\n", __func__, r); - r = 0; - abort_tx = 1; - } - mutex_unlock(&modem_reset_lock); - kfree(list_elem->cmux_pkt.hdr); - kfree(list_elem); - mutex_lock(&write_lock); - bytes_to_write -= write_size; - mutex_unlock(&write_lock); - mutex_lock(&ch->tx_lock); - } - if (ch->write_done) - ch->write_done(NULL, bytes_written, ch->priv); - mutex_unlock(&ch->tx_lock); - } - return; -} - -static void sdio_qmi_chl_notify(void *priv, unsigned event) -{ - if (event == SDIO_EVENT_DATA_READ_AVAIL) { - D("%s: Received SDIO_EVENT_DATA_READ_AVAIL\n", __func__); - queue_work(sdio_cdemux_wq, &sdio_cdemux_work); - } -} - -#ifdef CONFIG_DEBUG_FS - -static int debug_tbl(char *buf, int max) -{ - int i = 0; - int j; - - for (j = 0; j < SDIO_CMUX_NUM_CHANNELS; ++j) { - i += scnprintf(buf + i, max - i, - "ch%02d local open=%s remote open=%s\n", - j, logical_ch_is_local_open(j) ? "Y" : "N", - logical_ch_is_remote_open(j) ? "Y" : "N"); - } - - return i; -} - -#define DEBUG_BUFMAX 4096 -static char debug_buffer[DEBUG_BUFMAX]; - -static ssize_t debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - int (*fill)(char *buf, int max) = file->private_data; - int bsize = fill(debug_buffer, DEBUG_BUFMAX); - return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); -} - -static int debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - - -static const struct file_operations debug_ops = { - .read = debug_read, - .open = debug_open, -}; - -static void debug_create(const char *name, mode_t mode, - struct dentry *dent, - int (*fill)(char *buf, int max)) -{ - debugfs_create_file(name, mode, dent, fill, &debug_ops); -} - -#endif - -static int sdio_cmux_probe(struct platform_device *pdev) -{ - int i, r; - - mutex_lock(&probe_lock); - D("%s Begins\n", __func__); - if (sdio_cmux_inited) { - mutex_lock(&modem_reset_lock); - r = sdio_open("SDIO_QMI", &sdio_qmi_chl, NULL, - sdio_qmi_chl_notify); - if (r < 0) { - mutex_unlock(&modem_reset_lock); - pr_err("%s: sdio_open() failed\n", __func__); - goto error0; - } - abort_tx = 0; - mutex_unlock(&modem_reset_lock); - mutex_unlock(&probe_lock); - return 0; - } - - for (i = 0; i < SDIO_CMUX_NUM_CHANNELS; ++i) - sdio_cmux_ch_alloc(i); - INIT_LIST_HEAD(&temp_rx_list); - - sdio_cmux_wq = create_singlethread_workqueue("sdio_cmux"); - if (IS_ERR(sdio_cmux_wq)) { - pr_err("%s: create_singlethread_workqueue() ENOMEM\n", - __func__); - r = -ENOMEM; - goto error0; - } - - sdio_cdemux_wq = create_singlethread_workqueue("sdio_cdemux"); - if (IS_ERR(sdio_cdemux_wq)) { - pr_err("%s: create_singlethread_workqueue() ENOMEM\n", - __func__); - r = -ENOMEM; - goto error1; - } - - r = sdio_open("SDIO_QMI", &sdio_qmi_chl, NULL, sdio_qmi_chl_notify); - if (r < 0) { - pr_err("%s: sdio_open() failed\n", __func__); - goto error2; - } - - platform_device_register(&sdio_ctl_dev); - sdio_cmux_inited = 1; - D("SDIO Control MUX Driver Initialized.\n"); - mutex_unlock(&probe_lock); - return 0; - -error2: - destroy_workqueue(sdio_cdemux_wq); -error1: - destroy_workqueue(sdio_cmux_wq); -error0: - mutex_unlock(&probe_lock); - return r; -} - -static int sdio_cmux_remove(struct platform_device *pdev) -{ - int i; - - mutex_lock(&modem_reset_lock); - abort_tx = 1; - - for (i = 0; i < SDIO_CMUX_NUM_CHANNELS; ++i) { - mutex_lock(&logical_ch[i].lc_lock); - logical_ch[i].is_channel_reset = 1; - mutex_unlock(&logical_ch[i].lc_lock); - sdio_cmux_ch_clear_and_signal(i); - } - sdio_qmi_chl = NULL; - mutex_unlock(&modem_reset_lock); - - return 0; -} - -static struct platform_driver sdio_cmux_driver = { - .probe = sdio_cmux_probe, - .remove = sdio_cmux_remove, - .driver = { - .name = "SDIO_QMI", - .owner = THIS_MODULE, - }, -}; - -static int __init sdio_cmux_init(void) -{ -#ifdef CONFIG_DEBUG_FS - struct dentry *dent; - - dent = debugfs_create_dir("sdio_cmux", 0); - if (!IS_ERR(dent)) - debug_create("tbl", 0444, dent, debug_tbl); -#endif - - msm_sdio_cmux_debug_mask = 0; - return platform_driver_register(&sdio_cmux_driver); -} - -module_init(sdio_cmux_init); -MODULE_DESCRIPTION("MSM SDIO Control MUX"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/sdio_ctl.c b/arch/arm/mach-msm/sdio_ctl.c deleted file mode 100644 index cacdce98bfc0..000000000000 --- a/arch/arm/mach-msm/sdio_ctl.c +++ /dev/null @@ -1,575 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * SDIO Control Driver -- Provides a binary SDIO muxed control port - * interface. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "modem_notifier.h" -#include - -#define MAX_WRITE_RETRY 5 -#define MAGIC_NO_V1 0x33FC -#define NUM_SDIO_CTL_PORTS 10 -#define DEVICE_NAME "sdioctl" -#define MAX_BUF_SIZE 2048 -#define DEBUG - -static int msm_sdio_ctl_debug_mask; -module_param_named(debug_mask, msm_sdio_ctl_debug_mask, - int, S_IRUGO | S_IWUSR | S_IWGRP); - -struct sdio_ctl_dev { - int id; - char name[9]; - struct cdev cdev; - struct device *devicep; - struct mutex dev_lock; - int ref_count; - - struct mutex rx_lock; - uint32_t read_avail; - struct list_head rx_list; - - wait_queue_head_t read_wait_queue; - wait_queue_head_t write_wait_queue; -} *sdio_ctl_devp[NUM_SDIO_CTL_PORTS]; - -struct sdio_ctl_pkt { - int data_size; - void *data; -}; - -struct sdio_ctl_list_elem { - struct list_head list; - struct sdio_ctl_pkt ctl_pkt; -}; - -struct class *sdio_ctl_classp; -static dev_t sdio_ctl_number; -static uint32_t sdio_ctl_inited; - -enum { - MSM_SDIO_CTL_DEBUG = 1U << 0, - MSM_SDIO_CTL_DUMP_BUFFER = 1U << 1, -}; - -#if defined(DEBUG) -#define D_DUMP_BUFFER(prestr, cnt, buf) \ -do { \ - if (msm_sdio_ctl_debug_mask & MSM_SDIO_CTL_DUMP_BUFFER) { \ - int i; \ - pr_info("%s", prestr); \ - for (i = 0; i < cnt; i++) \ - pr_info("%.2x", buf[i]); \ - pr_info("\n"); \ - } \ -} while (0) - -#define D(x...) \ -do { \ - if (msm_sdio_ctl_debug_mask & MSM_SDIO_CTL_DEBUG) \ - pr_info(x); \ -} while (0) - -#else -#define D_DUMP_BUFFER(prestr, cnt, buf) do {} while (0) -#define D(x...) do {} while (0) -#endif - -static uint32_t cmux_ch_id[] = { - SDIO_CMUX_DATA_CTL_0, - SDIO_CMUX_DATA_CTL_1, - SDIO_CMUX_DATA_CTL_2, - SDIO_CMUX_DATA_CTL_3, - SDIO_CMUX_DATA_CTL_4, - SDIO_CMUX_DATA_CTL_5, - SDIO_CMUX_DATA_CTL_6, - SDIO_CMUX_DATA_CTL_7, - SDIO_CMUX_USB_CTL_0, - SDIO_CMUX_CSVT_CTL_0 -}; - -static int get_ctl_dev_index(int id) -{ - int dev_index; - for (dev_index = 0; dev_index < NUM_SDIO_CTL_PORTS; dev_index++) { - if (cmux_ch_id[dev_index] == id) - return dev_index; - } - return -ENODEV; -} - -static void sdio_ctl_receive_cb(void *data, int size, void *priv) -{ - struct sdio_ctl_list_elem *list_elem = NULL; - int id = ((struct sdio_ctl_dev *)(priv))->id; - int dev_index; - - if (id < 0 || id > cmux_ch_id[NUM_SDIO_CTL_PORTS - 1]) - return; - dev_index = get_ctl_dev_index(id); - if (dev_index < 0) { - pr_err("%s: Ch%d is not exported to user-space\n", - __func__, id); - return; - } - - if (!data || size <= 0) { - wake_up(&sdio_ctl_devp[dev_index]->read_wait_queue); - return; - } - - list_elem = kmalloc(sizeof(struct sdio_ctl_list_elem), GFP_KERNEL); - if (!list_elem) { - pr_err("%s: list_elem alloc failed\n", __func__); - return; - } - - list_elem->ctl_pkt.data = kmalloc(size, GFP_KERNEL); - if (!list_elem->ctl_pkt.data) { - pr_err("%s: list_elem->data alloc failed\n", __func__); - kfree(list_elem); - return; - } - memcpy(list_elem->ctl_pkt.data, data, size); - list_elem->ctl_pkt.data_size = size; - mutex_lock(&sdio_ctl_devp[dev_index]->rx_lock); - list_add_tail(&list_elem->list, &sdio_ctl_devp[dev_index]->rx_list); - sdio_ctl_devp[dev_index]->read_avail += size; - mutex_unlock(&sdio_ctl_devp[dev_index]->rx_lock); - wake_up(&sdio_ctl_devp[dev_index]->read_wait_queue); -} - -static void sdio_ctl_write_done(void *data, int size, void *priv) -{ - int id = ((struct sdio_ctl_dev *)(priv))->id; - int dev_index; - if (id < 0 || id > cmux_ch_id[NUM_SDIO_CTL_PORTS - 1]) - return; - - dev_index = get_ctl_dev_index(id); - if (dev_index < 0) { - pr_err("%s: Ch%d is not exported to user-space\n", - __func__, id); - return; - } - wake_up(&sdio_ctl_devp[dev_index]->write_wait_queue); -} - -static long sdio_ctl_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - int ret; - struct sdio_ctl_dev *sdio_ctl_devp; - - sdio_ctl_devp = file->private_data; - if (!sdio_ctl_devp) - return -ENODEV; - - switch (cmd) { - case TIOCMGET: - ret = sdio_cmux_tiocmget(sdio_ctl_devp->id); - break; - case TIOCMSET: - ret = sdio_cmux_tiocmset(sdio_ctl_devp->id, arg, ~arg); - break; - default: - ret = -EINVAL; - } - - return ret; -} - -static unsigned int sdio_ctl_poll(struct file *file, poll_table *wait) -{ - struct sdio_ctl_dev *sdio_ctl_devp; - unsigned int mask = 0; - - sdio_ctl_devp = file->private_data; - if (!sdio_ctl_devp) { - pr_err("%s: on a NULL device\n", __func__); - return POLLERR; - } - - poll_wait(file, &sdio_ctl_devp->read_wait_queue, wait); - mutex_lock(&sdio_ctl_devp->rx_lock); - if (sdio_cmux_is_channel_reset(sdio_ctl_devp->id)) { - mutex_unlock(&sdio_ctl_devp->rx_lock); - pr_err("%s notifying reset for sdio_ctl_dev id:%d\n", - __func__, sdio_ctl_devp->id); - return POLLERR; - } - - if (sdio_ctl_devp->read_avail > 0) - mask |= POLLIN | POLLRDNORM; - - mutex_unlock(&sdio_ctl_devp->rx_lock); - - return mask; -} - -ssize_t sdio_ctl_read(struct file *file, - char __user *buf, - size_t count, - loff_t *ppos) -{ - int r = 0, id, bytes_to_read; - struct sdio_ctl_dev *sdio_ctl_devp; - struct sdio_ctl_list_elem *list_elem = NULL; - - sdio_ctl_devp = file->private_data; - - if (!sdio_ctl_devp) - return -ENODEV; - - D("%s: read from ch%d\n", __func__, sdio_ctl_devp->id); - - id = sdio_ctl_devp->id; - mutex_lock(&sdio_ctl_devp->rx_lock); - while (sdio_ctl_devp->read_avail <= 0) { - mutex_unlock(&sdio_ctl_devp->rx_lock); - r = wait_event_interruptible(sdio_ctl_devp->read_wait_queue, - sdio_ctl_devp->read_avail > 0 || - !is_remote_open(id)); - if (sdio_cmux_is_channel_reset(id)) - return -ENETRESET; - - if (!is_remote_open(id)) - return -ENODEV; - - if (r < 0) { - /* qualify error message */ - /* we get this anytime a signal comes in */ - if (r != -ERESTARTSYS) - pr_err("ERROR:%s: wait_event_interruptible " - "ret %i\n", __func__, r); - return r; - } - mutex_lock(&sdio_ctl_devp->rx_lock); - } - - if (list_empty(&sdio_ctl_devp->rx_list)) { - mutex_unlock(&sdio_ctl_devp->rx_lock); - D("%s: Nothing in ch%d's rx_list\n", __func__, - sdio_ctl_devp->id); - return -EAGAIN; - } - - list_elem = list_first_entry(&sdio_ctl_devp->rx_list, - struct sdio_ctl_list_elem, list); - bytes_to_read = (uint32_t)(list_elem->ctl_pkt.data_size); - if (bytes_to_read > count) { - mutex_unlock(&sdio_ctl_devp->rx_lock); - pr_err("%s: Packet size %d > buf size %d\n", __func__, - bytes_to_read, count); - return -ENOMEM; - } - - if (copy_to_user(buf, list_elem->ctl_pkt.data, bytes_to_read)) { - mutex_unlock(&sdio_ctl_devp->rx_lock); - pr_err("%s: copy_to_user failed for ch%d\n", __func__, - sdio_ctl_devp->id); - return -EFAULT; - } - sdio_ctl_devp->read_avail -= bytes_to_read; - list_del(&list_elem->list); - kfree(list_elem->ctl_pkt.data); - kfree(list_elem); - mutex_unlock(&sdio_ctl_devp->rx_lock); - D("%s: Returning %d bytes to ch%d\n", __func__, - bytes_to_read, sdio_ctl_devp->id); - return bytes_to_read; -} - - -ssize_t sdio_ctl_write(struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - int r = 0, id; - char *temp_buf; - struct sdio_ctl_dev *sdio_ctl_devp; - - if (count <= 0) - return -EINVAL; - - sdio_ctl_devp = file->private_data; - if (!sdio_ctl_devp) - return -ENODEV; - - D("%s: writing %i bytes on ch%d\n", - __func__, count, sdio_ctl_devp->id); - id = sdio_ctl_devp->id; - mutex_lock(&sdio_ctl_devp->dev_lock); - while (sdio_cmux_write_avail(id) < count) { - mutex_unlock(&sdio_ctl_devp->dev_lock); - r = wait_event_interruptible(sdio_ctl_devp->write_wait_queue, - sdio_cmux_write_avail(id) >= count - || !is_remote_open(id)); - - if (sdio_cmux_is_channel_reset(id)) - return -ENETRESET; - - if (!is_remote_open(id)) - return -ENODEV; - - if (r < 0) { - /* qualify error message */ - /* we get this anytime a signal comes in */ - if (r != -ERESTARTSYS) - pr_err("ERROR:%s: wait_event_interruptible " - "ret %i\n", __func__, r); - return r; - } - mutex_lock(&sdio_ctl_devp->dev_lock); - } - - temp_buf = kmalloc(count, GFP_KERNEL); - if (!temp_buf) { - mutex_unlock(&sdio_ctl_devp->dev_lock); - pr_err("%s: temp_buf alloc failed\n", __func__); - return -ENOMEM; - } - - if (copy_from_user(temp_buf, buf, count)) { - mutex_unlock(&sdio_ctl_devp->dev_lock); - pr_err("%s: copy_from_user failed\n", __func__); - kfree(temp_buf); - return -EFAULT; - } - - r = sdio_cmux_write(id, (void *)temp_buf, count); - kfree(temp_buf); - mutex_unlock(&sdio_ctl_devp->dev_lock); - return r; -} - - -int sdio_ctl_open(struct inode *inode, struct file *file) -{ - int r = 0; - struct sdio_ctl_dev *sdio_ctl_devp; - - if (!sdio_ctl_inited) - return -EIO; - - sdio_ctl_devp = container_of(inode->i_cdev, struct sdio_ctl_dev, cdev); - - if (!sdio_ctl_devp) - return -ENODEV; - - D("%s called on sdioctl%d device\n", __func__, sdio_ctl_devp->id); - r = sdio_cmux_open(sdio_ctl_devp->id, sdio_ctl_receive_cb, - sdio_ctl_write_done, NULL, - sdio_ctl_devp); - if (r < 0) { - pr_err("ERROR %s: sdio_cmux_open failed with rc %d\n", - __func__, r); - return r; - } - - mutex_lock(&sdio_ctl_devp->dev_lock); - sdio_ctl_devp->ref_count++; - mutex_unlock(&sdio_ctl_devp->dev_lock); - - file->private_data = sdio_ctl_devp; - return 0; -} - -int sdio_ctl_release(struct inode *inode, struct file *file) -{ - struct sdio_ctl_dev *sdio_ctl_devp; - struct sdio_ctl_list_elem *list_elem = NULL; - - sdio_ctl_devp = file->private_data; - if (!sdio_ctl_devp) - return -EINVAL; - - D("%s called on sdioctl%d device\n", __func__, sdio_ctl_devp->id); - - mutex_lock(&sdio_ctl_devp->dev_lock); - if (sdio_ctl_devp->ref_count > 0) { - sdio_ctl_devp->ref_count--; - if (!sdio_ctl_devp->ref_count) { - mutex_lock(&sdio_ctl_devp->rx_lock); - while (!list_empty(&sdio_ctl_devp->rx_list)) { - list_elem = list_first_entry( - &sdio_ctl_devp->rx_list, - struct sdio_ctl_list_elem, - list); - list_del(&list_elem->list); - kfree(list_elem->ctl_pkt.data); - kfree(list_elem); - } - sdio_ctl_devp->read_avail = 0; - mutex_unlock(&sdio_ctl_devp->rx_lock); - sdio_cmux_close(sdio_ctl_devp->id); - } - } - mutex_unlock(&sdio_ctl_devp->dev_lock); - - file->private_data = NULL; - return 0; -} - -static const struct file_operations sdio_ctl_fops = { - .owner = THIS_MODULE, - .open = sdio_ctl_open, - .release = sdio_ctl_release, - .read = sdio_ctl_read, - .write = sdio_ctl_write, - .poll = sdio_ctl_poll, - .unlocked_ioctl = sdio_ctl_ioctl, -}; - -static int sdio_ctl_probe(struct platform_device *pdev) -{ - int i; - int r; - - pr_info("%s Begins\n", __func__); - for (i = 0; i < NUM_SDIO_CTL_PORTS; ++i) { - sdio_ctl_devp[i] = kzalloc(sizeof(struct sdio_ctl_dev), - GFP_KERNEL); - if (IS_ERR(sdio_ctl_devp[i])) { - pr_err("ERROR:%s kmalloc() ENOMEM\n", __func__); - r = -ENOMEM; - goto error0; - } - - sdio_ctl_devp[i]->id = cmux_ch_id[i]; - sdio_ctl_devp[i]->ref_count = 0; - - mutex_init(&sdio_ctl_devp[i]->dev_lock); - init_waitqueue_head(&sdio_ctl_devp[i]->read_wait_queue); - init_waitqueue_head(&sdio_ctl_devp[i]->write_wait_queue); - mutex_init(&sdio_ctl_devp[i]->rx_lock); - INIT_LIST_HEAD(&sdio_ctl_devp[i]->rx_list); - sdio_ctl_devp[i]->read_avail = 0; - } - - r = alloc_chrdev_region(&sdio_ctl_number, 0, NUM_SDIO_CTL_PORTS, - DEVICE_NAME); - if (IS_ERR_VALUE(r)) { - pr_err("ERROR:%s: alloc_chrdev_region() ret %i.\n", - __func__, r); - goto error0; - } - - sdio_ctl_classp = class_create(THIS_MODULE, DEVICE_NAME); - if (IS_ERR(sdio_ctl_classp)) { - pr_err("ERROR:%s: class_create() ENOMEM\n", __func__); - r = -ENOMEM; - goto error1; - } - - for (i = 0; i < NUM_SDIO_CTL_PORTS; ++i) { - cdev_init(&sdio_ctl_devp[i]->cdev, &sdio_ctl_fops); - sdio_ctl_devp[i]->cdev.owner = THIS_MODULE; - - r = cdev_add(&sdio_ctl_devp[i]->cdev, (sdio_ctl_number + i), - 1); - - if (IS_ERR_VALUE(r)) { - pr_err("%s: cdev_add() ret %i\n", __func__, r); - kfree(sdio_ctl_devp[i]); - goto error2; - } - - sdio_ctl_devp[i]->devicep = - device_create(sdio_ctl_classp, NULL, - (sdio_ctl_number + i), NULL, - DEVICE_NAME "%d", cmux_ch_id[i]); - - if (IS_ERR(sdio_ctl_devp[i]->devicep)) { - pr_err("%s: device_create() ENOMEM\n", __func__); - r = -ENOMEM; - cdev_del(&sdio_ctl_devp[i]->cdev); - kfree(sdio_ctl_devp[i]); - goto error2; - } - } - - sdio_ctl_inited = 1; - D("SDIO Control Port Driver Initialized.\n"); - return 0; - -error2: - while (--i >= 0) { - cdev_del(&sdio_ctl_devp[i]->cdev); - device_destroy(sdio_ctl_classp, - MKDEV(MAJOR(sdio_ctl_number), i)); - } - - class_destroy(sdio_ctl_classp); - i = NUM_SDIO_CTL_PORTS; -error1: - unregister_chrdev_region(MAJOR(sdio_ctl_number), NUM_SDIO_CTL_PORTS); -error0: - while (--i >= 0) - kfree(sdio_ctl_devp[i]); - return r; -} - -static int sdio_ctl_remove(struct platform_device *pdev) -{ - int i; - - for (i = 0; i < NUM_SDIO_CTL_PORTS; ++i) { - cdev_del(&sdio_ctl_devp[i]->cdev); - kfree(sdio_ctl_devp[i]); - device_destroy(sdio_ctl_classp, - MKDEV(MAJOR(sdio_ctl_number), i)); - } - class_destroy(sdio_ctl_classp); - unregister_chrdev_region(MAJOR(sdio_ctl_number), NUM_SDIO_CTL_PORTS); - - return 0; -} - -static struct platform_driver sdio_ctl_driver = { - .probe = sdio_ctl_probe, - .remove = sdio_ctl_remove, - .driver = { - .name = "SDIO_CTL", - .owner = THIS_MODULE, - }, -}; - -static int __init sdio_ctl_init(void) -{ - msm_sdio_ctl_debug_mask = 0; - return platform_driver_register(&sdio_ctl_driver); -} - -module_init(sdio_ctl_init); -MODULE_DESCRIPTION("MSM SDIO Control Port"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/sdio_dmux.c b/arch/arm/mach-msm/sdio_dmux.c deleted file mode 100644 index c6d665d9473f..000000000000 --- a/arch/arm/mach-msm/sdio_dmux.c +++ /dev/null @@ -1,925 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -/* - * SDIO DMUX module. - */ - -#define DEBUG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define SDIO_CH_LOCAL_OPEN 0x1 -#define SDIO_CH_REMOTE_OPEN 0x2 -#define SDIO_CH_IN_RESET 0x4 - -#define SDIO_MUX_HDR_MAGIC_NO 0x33fc - -#define SDIO_MUX_HDR_CMD_DATA 0 -#define SDIO_MUX_HDR_CMD_OPEN 1 -#define SDIO_MUX_HDR_CMD_CLOSE 2 - -#define LOW_WATERMARK 2 -#define HIGH_WATERMARK 4 - -static int msm_sdio_dmux_debug_enable; -module_param_named(debug_enable, msm_sdio_dmux_debug_enable, - int, S_IRUGO | S_IWUSR | S_IWGRP); - -#if defined(DEBUG) -static uint32_t sdio_dmux_read_cnt; -static uint32_t sdio_dmux_write_cnt; -static uint32_t sdio_dmux_write_cpy_cnt; -static uint32_t sdio_dmux_write_cpy_bytes; - -#define DBG(x...) do { \ - if (msm_sdio_dmux_debug_enable) \ - pr_debug(x); \ - } while (0) - -#define DBG_INC_READ_CNT(x) do { \ - sdio_dmux_read_cnt += (x); \ - if (msm_sdio_dmux_debug_enable) \ - pr_debug("%s: total read bytes %u\n", \ - __func__, sdio_dmux_read_cnt); \ - } while (0) - -#define DBG_INC_WRITE_CNT(x) do { \ - sdio_dmux_write_cnt += (x); \ - if (msm_sdio_dmux_debug_enable) \ - pr_debug("%s: total written bytes %u\n", \ - __func__, sdio_dmux_write_cnt); \ - } while (0) - -#define DBG_INC_WRITE_CPY(x) do { \ - sdio_dmux_write_cpy_bytes += (x); \ - sdio_dmux_write_cpy_cnt++; \ - if (msm_sdio_dmux_debug_enable) \ - pr_debug("%s: total write copy cnt %u, bytes %u\n", \ - __func__, sdio_dmux_write_cpy_cnt, \ - sdio_dmux_write_cpy_bytes); \ - } while (0) -#else -#define DBG(x...) do { } while (0) -#define DBG_INC_READ_CNT(x...) do { } while (0) -#define DBG_INC_WRITE_CNT(x...) do { } while (0) -#define DBG_INC_WRITE_CPY(x...) do { } while (0) -#endif - -struct sdio_ch_info { - uint32_t status; - void (*receive_cb)(void *, struct sk_buff *); - void (*write_done)(void *, struct sk_buff *); - void *priv; - spinlock_t lock; - int num_tx_pkts; - int use_wm; -}; - -static struct sk_buff_head sdio_mux_write_pool; -static spinlock_t sdio_mux_write_lock; - -static struct sdio_channel *sdio_mux_ch; -static struct sdio_ch_info sdio_ch[SDIO_DMUX_NUM_CHANNELS]; -struct wake_lock sdio_mux_ch_wakelock; -static int sdio_mux_initialized; -static int fatal_error; - -struct sdio_mux_hdr { - uint16_t magic_num; - uint8_t reserved; - uint8_t cmd; - uint8_t pad_len; - uint8_t ch_id; - uint16_t pkt_len; -}; - -struct sdio_partial_pkt_info { - uint32_t valid; - struct sk_buff *skb; - struct sdio_mux_hdr *hdr; -}; - -static void sdio_mux_read_data(struct work_struct *work); -static void sdio_mux_write_data(struct work_struct *work); -static void sdio_mux_send_open_cmd(uint32_t id); - -static DEFINE_MUTEX(sdio_mux_lock); -static DECLARE_WORK(work_sdio_mux_read, sdio_mux_read_data); -static DECLARE_WORK(work_sdio_mux_write, sdio_mux_write_data); -static DECLARE_DELAYED_WORK(delayed_work_sdio_mux_write, sdio_mux_write_data); - -static struct workqueue_struct *sdio_mux_workqueue; -static struct sdio_partial_pkt_info sdio_partial_pkt; - -#define sdio_ch_is_open(x) \ - (sdio_ch[(x)].status == (SDIO_CH_LOCAL_OPEN | SDIO_CH_REMOTE_OPEN)) - -#define sdio_ch_is_local_open(x) \ - (sdio_ch[(x)].status & SDIO_CH_LOCAL_OPEN) - -#define sdio_ch_is_remote_open(x) \ - (sdio_ch[(x)].status & SDIO_CH_REMOTE_OPEN) - -#define sdio_ch_is_in_reset(x) \ - (sdio_ch[(x)].status & SDIO_CH_IN_RESET) - -static inline void skb_set_data(struct sk_buff *skb, - unsigned char *data, - unsigned int len) -{ - /* panic if tail > end */ - skb->data = data; - skb->tail = skb->data + len; - skb->len = len; - skb->truesize = len + sizeof(struct sk_buff); -} - -static void sdio_mux_save_partial_pkt(struct sdio_mux_hdr *hdr, - struct sk_buff *skb_mux) -{ - struct sk_buff *skb; - - /* i think we can avoid cloning here */ - skb = skb_clone(skb_mux, GFP_KERNEL); - if (!skb) { - pr_err("%s: cannot clone skb\n", __func__); - return; - } - - /* protect? */ - skb_set_data(skb, (unsigned char *)hdr, - skb->tail - (unsigned char *)hdr); - sdio_partial_pkt.skb = skb; - sdio_partial_pkt.valid = 1; - DBG("%s: head %p data %p tail %p end %p len %d\n", __func__, - skb->head, skb->data, skb->tail, skb->end, skb->len); - return; -} - -static void *handle_sdio_mux_data(struct sdio_mux_hdr *hdr, - struct sk_buff *skb_mux) -{ - struct sk_buff *skb; - void *rp = (void *)hdr; - unsigned long flags; - - /* protect? */ - rp += sizeof(*hdr); - if (rp < (void *)skb_mux->tail) - rp += (hdr->pkt_len + hdr->pad_len); - - if (rp > (void *)skb_mux->tail) { - /* partial packet */ - sdio_mux_save_partial_pkt(hdr, skb_mux); - goto packet_done; - } - - DBG("%s: hdr %p next %p tail %p pkt_size %d\n", - __func__, hdr, rp, skb_mux->tail, hdr->pkt_len + hdr->pad_len); - - skb = skb_clone(skb_mux, GFP_KERNEL); - if (!skb) { - pr_err("%s: cannot clone skb\n", __func__); - goto packet_done; - } - - skb_set_data(skb, (unsigned char *)(hdr + 1), hdr->pkt_len); - DBG("%s: head %p data %p tail %p end %p len %d\n", - __func__, skb->head, skb->data, skb->tail, skb->end, skb->len); - - /* probably we should check channel status */ - /* discard packet early if local side not open */ - spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags); - if (sdio_ch[hdr->ch_id].receive_cb) - sdio_ch[hdr->ch_id].receive_cb(sdio_ch[hdr->ch_id].priv, skb); - else - dev_kfree_skb_any(skb); - spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags); - -packet_done: - return rp; -} - -static void *handle_sdio_mux_command(struct sdio_mux_hdr *hdr, - struct sk_buff *skb_mux) -{ - void *rp; - unsigned long flags; - int send_open = 0; - - DBG("%s: cmd %d ch %d\n", __func__, hdr->cmd, hdr->ch_id); - switch (hdr->cmd) { - case SDIO_MUX_HDR_CMD_DATA: - rp = handle_sdio_mux_data(hdr, skb_mux); - break; - case SDIO_MUX_HDR_CMD_OPEN: - spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags); - sdio_ch[hdr->ch_id].status |= SDIO_CH_REMOTE_OPEN; - sdio_ch[hdr->ch_id].num_tx_pkts = 0; - - if (sdio_ch_is_in_reset(hdr->ch_id)) { - DBG("%s: in reset - sending open cmd\n", __func__); - sdio_ch[hdr->ch_id].status &= ~SDIO_CH_IN_RESET; - send_open = 1; - } - - /* notify client so it can update its status */ - if (sdio_ch[hdr->ch_id].receive_cb) - sdio_ch[hdr->ch_id].receive_cb( - sdio_ch[hdr->ch_id].priv, NULL); - - if (sdio_ch[hdr->ch_id].write_done) - sdio_ch[hdr->ch_id].write_done( - sdio_ch[hdr->ch_id].priv, NULL); - spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags); - rp = hdr + 1; - if (send_open) - sdio_mux_send_open_cmd(hdr->ch_id); - - break; - case SDIO_MUX_HDR_CMD_CLOSE: - /* probably should drop pending write */ - spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags); - sdio_ch[hdr->ch_id].status &= ~SDIO_CH_REMOTE_OPEN; - spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags); - rp = hdr + 1; - break; - default: - rp = hdr + 1; - } - - return rp; -} - -static void *handle_sdio_partial_pkt(struct sk_buff *skb_mux) -{ - struct sk_buff *p_skb; - struct sdio_mux_hdr *p_hdr; - void *ptr, *rp = skb_mux->data; - - /* protoect? */ - if (sdio_partial_pkt.valid) { - p_skb = sdio_partial_pkt.skb; - - ptr = skb_push(skb_mux, p_skb->len); - memcpy(ptr, p_skb->data, p_skb->len); - sdio_partial_pkt.skb = NULL; - sdio_partial_pkt.valid = 0; - dev_kfree_skb_any(p_skb); - - DBG("%s: head %p data %p tail %p end %p len %d\n", __func__, - skb_mux->head, skb_mux->data, skb_mux->tail, - skb_mux->end, skb_mux->len); - - p_hdr = (struct sdio_mux_hdr *)skb_mux->data; - rp = handle_sdio_mux_command(p_hdr, skb_mux); - } - return rp; -} - -static void sdio_mux_read_data(struct work_struct *work) -{ - struct sk_buff *skb_mux; - void *ptr = 0; - int sz, rc, len = 0; - struct sdio_mux_hdr *hdr; - static int workqueue_pinned; - - if (!workqueue_pinned) { - struct cpumask cpus; - - cpumask_clear(&cpus); - cpumask_set_cpu(0, &cpus); - - if (sched_setaffinity(current->pid, &cpus)) - pr_err("%s: sdio_dmux set CPU affinity failed\n", - __func__); - workqueue_pinned = 1; - } - - DBG("%s: reading\n", __func__); - /* should probably have a separate read lock */ - mutex_lock(&sdio_mux_lock); - sz = sdio_read_avail(sdio_mux_ch); - DBG("%s: read avail %d\n", __func__, sz); - if (sz <= 0) { - if (sz) - pr_err("%s: read avail failed %d\n", __func__, sz); - mutex_unlock(&sdio_mux_lock); - return; - } - - /* net_ip_aling is probably not required */ - if (sdio_partial_pkt.valid) - len = sdio_partial_pkt.skb->len; - - /* If allocation fails attempt to get a smaller chunk of mem */ - do { - skb_mux = __dev_alloc_skb(sz + NET_IP_ALIGN + len, GFP_KERNEL); - if (skb_mux) - break; - - pr_err("%s: cannot allocate skb of size:%d + " - "%d (NET_SKB_PAD)\n", __func__, - sz + NET_IP_ALIGN + len, NET_SKB_PAD); - /* the skb structure adds NET_SKB_PAD bytes to the memory - * request, which may push the actual request above PAGE_SIZE - * in that case, we need to iterate one more time to make sure - * we get the memory request under PAGE_SIZE - */ - if (sz + NET_IP_ALIGN + len + NET_SKB_PAD <= PAGE_SIZE) { - pr_err("%s: allocation failed\n", __func__); - mutex_unlock(&sdio_mux_lock); - return; - } - sz /= 2; - } while (1); - - skb_reserve(skb_mux, NET_IP_ALIGN + len); - ptr = skb_put(skb_mux, sz); - - /* half second wakelock is fine? */ - wake_lock_timeout(&sdio_mux_ch_wakelock, HZ / 2); - rc = sdio_read(sdio_mux_ch, ptr, sz); - DBG("%s: read %d\n", __func__, rc); - if (rc) { - pr_err("%s: sdio read failed %d\n", __func__, rc); - dev_kfree_skb_any(skb_mux); - mutex_unlock(&sdio_mux_lock); - queue_work(sdio_mux_workqueue, &work_sdio_mux_read); - return; - } - mutex_unlock(&sdio_mux_lock); - - DBG_INC_READ_CNT(sz); - DBG("%s: head %p data %p tail %p end %p len %d\n", __func__, - skb_mux->head, skb_mux->data, skb_mux->tail, - skb_mux->end, skb_mux->len); - - /* move to a separate function */ - /* probably do skb_pull instead of pointer adjustment */ - hdr = handle_sdio_partial_pkt(skb_mux); - while ((void *)hdr < (void *)skb_mux->tail) { - - if (((void *)hdr + sizeof(*hdr)) > (void *)skb_mux->tail) { - /* handle partial header */ - sdio_mux_save_partial_pkt(hdr, skb_mux); - break; - } - - if (hdr->magic_num != SDIO_MUX_HDR_MAGIC_NO) { - pr_err("%s: packet error\n", __func__); - break; - } - - hdr = handle_sdio_mux_command(hdr, skb_mux); - } - dev_kfree_skb_any(skb_mux); - - DBG("%s: read done\n", __func__); - queue_work(sdio_mux_workqueue, &work_sdio_mux_read); -} - -static int sdio_mux_write(struct sk_buff *skb) -{ - int rc, sz; - - mutex_lock(&sdio_mux_lock); - sz = sdio_write_avail(sdio_mux_ch); - DBG("%s: avail %d len %d\n", __func__, sz, skb->len); - if (skb->len <= sz) { - rc = sdio_write(sdio_mux_ch, skb->data, skb->len); - DBG("%s: write returned %d\n", __func__, rc); - if (rc == 0) - DBG_INC_WRITE_CNT(skb->len); - } else - rc = -ENOMEM; - - mutex_unlock(&sdio_mux_lock); - return rc; -} - -static int sdio_mux_write_cmd(void *data, uint32_t len) -{ - int avail, rc; - for (;;) { - mutex_lock(&sdio_mux_lock); - avail = sdio_write_avail(sdio_mux_ch); - DBG("%s: avail %d len %d\n", __func__, avail, len); - if (avail >= len) { - rc = sdio_write(sdio_mux_ch, data, len); - DBG("%s: write returned %d\n", __func__, rc); - if (!rc) { - DBG_INC_WRITE_CNT(len); - break; - } - } - mutex_unlock(&sdio_mux_lock); - msleep(250); - } - mutex_unlock(&sdio_mux_lock); - return 0; -} - -static void sdio_mux_send_open_cmd(uint32_t id) -{ - struct sdio_mux_hdr hdr = { - .magic_num = SDIO_MUX_HDR_MAGIC_NO, - .cmd = SDIO_MUX_HDR_CMD_OPEN, - .reserved = 0, - .ch_id = id, - .pkt_len = 0, - .pad_len = 0 - }; - - sdio_mux_write_cmd((void *)&hdr, sizeof(hdr)); -} - -static void sdio_mux_write_data(struct work_struct *work) -{ - int rc, reschedule = 0; - int notify = 0; - struct sk_buff *skb; - unsigned long flags; - int avail; - int ch_id; - - spin_lock_irqsave(&sdio_mux_write_lock, flags); - while ((skb = __skb_dequeue(&sdio_mux_write_pool))) { - ch_id = ((struct sdio_mux_hdr *)skb->data)->ch_id; - - avail = sdio_write_avail(sdio_mux_ch); - if (avail < skb->len) { - /* we may have to wait for write avail - * notification from sdio al - */ - DBG("%s: sdio_write_avail(%d) < skb->len(%d)\n", - __func__, avail, skb->len); - - reschedule = 1; - break; - } - spin_unlock_irqrestore(&sdio_mux_write_lock, flags); - rc = sdio_mux_write(skb); - spin_lock_irqsave(&sdio_mux_write_lock, flags); - if (rc == 0) { - - spin_lock(&sdio_ch[ch_id].lock); - sdio_ch[ch_id].num_tx_pkts--; - spin_unlock(&sdio_ch[ch_id].lock); - - if (sdio_ch[ch_id].write_done) - sdio_ch[ch_id].write_done( - sdio_ch[ch_id].priv, skb); - else - dev_kfree_skb_any(skb); - } else if (rc == -EAGAIN || rc == -ENOMEM) { - /* recoverable error - retry again later */ - reschedule = 1; - break; - } else if (rc == -ENODEV) { - /* - * sdio_al suffered some kind of fatal error - * prevent future writes and clean up pending ones - */ - fatal_error = 1; - do { - ch_id = ((struct sdio_mux_hdr *) - skb->data)->ch_id; - spin_lock(&sdio_ch[ch_id].lock); - sdio_ch[ch_id].num_tx_pkts--; - spin_unlock(&sdio_ch[ch_id].lock); - dev_kfree_skb_any(skb); - } while ((skb = __skb_dequeue(&sdio_mux_write_pool))); - spin_unlock_irqrestore(&sdio_mux_write_lock, flags); - return; - } else { - /* unknown error condition - drop the - * skb and reschedule for the - * other skb's - */ - pr_err("%s: sdio_mux_write error %d" - " for ch %d, skb=%p\n", - __func__, rc, ch_id, skb); - notify = 1; - break; - } - } - - if (reschedule) { - if (sdio_ch_is_in_reset(ch_id)) { - notify = 1; - } else { - __skb_queue_head(&sdio_mux_write_pool, skb); - queue_delayed_work(sdio_mux_workqueue, - &delayed_work_sdio_mux_write, - msecs_to_jiffies(250) - ); - } - } - - if (notify) { - spin_lock(&sdio_ch[ch_id].lock); - sdio_ch[ch_id].num_tx_pkts--; - spin_unlock(&sdio_ch[ch_id].lock); - - if (sdio_ch[ch_id].write_done) - sdio_ch[ch_id].write_done( - sdio_ch[ch_id].priv, skb); - else - dev_kfree_skb_any(skb); - } - spin_unlock_irqrestore(&sdio_mux_write_lock, flags); -} - -int msm_sdio_is_channel_in_reset(uint32_t id) -{ - int rc = 0; - - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - - if (sdio_ch_is_in_reset(id)) - rc = 1; - - return rc; -} - -int msm_sdio_dmux_write(uint32_t id, struct sk_buff *skb) -{ - int rc = 0; - struct sdio_mux_hdr *hdr; - unsigned long flags; - struct sk_buff *new_skb; - - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - if (!skb) - return -EINVAL; - if (!sdio_mux_initialized) - return -ENODEV; - if (fatal_error) - return -ENODEV; - - DBG("%s: writing to ch %d len %d\n", __func__, id, skb->len); - spin_lock_irqsave(&sdio_ch[id].lock, flags); - if (sdio_ch_is_in_reset(id)) { - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - pr_err("%s: port is in reset: %d\n", __func__, - sdio_ch[id].status); - return -ENETRESET; - } - if (!sdio_ch_is_local_open(id)) { - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - pr_err("%s: port not open: %d\n", __func__, sdio_ch[id].status); - return -ENODEV; - } - if (sdio_ch[id].use_wm && - (sdio_ch[id].num_tx_pkts >= HIGH_WATERMARK)) { - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - pr_err("%s: watermark exceeded: %d\n", __func__, id); - return -EAGAIN; - } - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - - spin_lock_irqsave(&sdio_mux_write_lock, flags); - /* if skb do not have any tailroom for padding, - copy the skb into a new expanded skb */ - if ((skb->len & 0x3) && (skb_tailroom(skb) < (4 - (skb->len & 0x3)))) { - /* revisit, probably dev_alloc_skb and memcpy is effecient */ - new_skb = skb_copy_expand(skb, skb_headroom(skb), - 4 - (skb->len & 0x3), GFP_ATOMIC); - if (new_skb == NULL) { - pr_err("%s: cannot allocate skb\n", __func__); - rc = -ENOMEM; - goto write_done; - } - dev_kfree_skb_any(skb); - skb = new_skb; - DBG_INC_WRITE_CPY(skb->len); - } - - hdr = (struct sdio_mux_hdr *)skb_push(skb, sizeof(struct sdio_mux_hdr)); - - /* caller should allocate for hdr and padding - hdr is fine, padding is tricky */ - hdr->magic_num = SDIO_MUX_HDR_MAGIC_NO; - hdr->cmd = SDIO_MUX_HDR_CMD_DATA; - hdr->reserved = 0; - hdr->ch_id = id; - hdr->pkt_len = skb->len - sizeof(struct sdio_mux_hdr); - if (skb->len & 0x3) - skb_put(skb, 4 - (skb->len & 0x3)); - - hdr->pad_len = skb->len - (sizeof(struct sdio_mux_hdr) + hdr->pkt_len); - - DBG("%s: data %p, tail %p skb len %d pkt len %d pad len %d\n", - __func__, skb->data, skb->tail, skb->len, - hdr->pkt_len, hdr->pad_len); - __skb_queue_tail(&sdio_mux_write_pool, skb); - - spin_lock(&sdio_ch[id].lock); - sdio_ch[id].num_tx_pkts++; - spin_unlock(&sdio_ch[id].lock); - - queue_work(sdio_mux_workqueue, &work_sdio_mux_write); - -write_done: - spin_unlock_irqrestore(&sdio_mux_write_lock, flags); - return rc; -} - -int msm_sdio_dmux_open(uint32_t id, void *priv, - void (*receive_cb)(void *, struct sk_buff *), - void (*write_done)(void *, struct sk_buff *)) -{ - unsigned long flags; - - DBG("%s: opening ch %d\n", __func__, id); - if (!sdio_mux_initialized) - return -ENODEV; - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - - spin_lock_irqsave(&sdio_ch[id].lock, flags); - if (sdio_ch_is_local_open(id)) { - pr_info("%s: Already opened %d\n", __func__, id); - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - goto open_done; - } - - sdio_ch[id].receive_cb = receive_cb; - sdio_ch[id].write_done = write_done; - sdio_ch[id].priv = priv; - sdio_ch[id].status |= SDIO_CH_LOCAL_OPEN; - sdio_ch[id].num_tx_pkts = 0; - sdio_ch[id].use_wm = 0; - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - - sdio_mux_send_open_cmd(id); - -open_done: - pr_info("%s: opened ch %d\n", __func__, id); - return 0; -} - -int msm_sdio_dmux_close(uint32_t id) -{ - struct sdio_mux_hdr hdr; - unsigned long flags; - - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - DBG("%s: closing ch %d\n", __func__, id); - if (!sdio_mux_initialized) - return -ENODEV; - spin_lock_irqsave(&sdio_ch[id].lock, flags); - - sdio_ch[id].receive_cb = NULL; - sdio_ch[id].priv = NULL; - sdio_ch[id].status &= ~SDIO_CH_LOCAL_OPEN; - sdio_ch[id].status &= ~SDIO_CH_IN_RESET; - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - - hdr.magic_num = SDIO_MUX_HDR_MAGIC_NO; - hdr.cmd = SDIO_MUX_HDR_CMD_CLOSE; - hdr.reserved = 0; - hdr.ch_id = id; - hdr.pkt_len = 0; - hdr.pad_len = 0; - - sdio_mux_write_cmd((void *)&hdr, sizeof(hdr)); - - pr_info("%s: closed ch %d\n", __func__, id); - return 0; -} - -static void sdio_mux_notify(void *_dev, unsigned event) -{ - DBG("%s: event %d notified\n", __func__, event); - - /* write avail may not be enouogh for a packet, but should be fine */ - if ((event == SDIO_EVENT_DATA_WRITE_AVAIL) && - sdio_write_avail(sdio_mux_ch)) - queue_work(sdio_mux_workqueue, &work_sdio_mux_write); - - if ((event == SDIO_EVENT_DATA_READ_AVAIL) && - sdio_read_avail(sdio_mux_ch)) - queue_work(sdio_mux_workqueue, &work_sdio_mux_read); -} - -int msm_sdio_dmux_is_ch_full(uint32_t id) -{ - unsigned long flags; - int ret; - - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - - spin_lock_irqsave(&sdio_ch[id].lock, flags); - sdio_ch[id].use_wm = 1; - ret = sdio_ch[id].num_tx_pkts >= HIGH_WATERMARK; - DBG("%s: ch %d num tx pkts=%d, HWM=%d\n", __func__, - id, sdio_ch[id].num_tx_pkts, ret); - if (!sdio_ch_is_local_open(id)) { - ret = -ENODEV; - pr_err("%s: port not open: %d\n", __func__, sdio_ch[id].status); - } - spin_unlock_irqrestore(&sdio_ch[id].lock, flags); - - return ret; -} - -int msm_sdio_dmux_is_ch_low(uint32_t id) -{ - int ret; - - if (id >= SDIO_DMUX_NUM_CHANNELS) - return -EINVAL; - - sdio_ch[id].use_wm = 1; - ret = sdio_ch[id].num_tx_pkts <= LOW_WATERMARK; - DBG("%s: ch %d num tx pkts=%d, LWM=%d\n", __func__, - id, sdio_ch[id].num_tx_pkts, ret); - if (!sdio_ch_is_local_open(id)) { - ret = -ENODEV; - pr_err("%s: port not open: %d\n", __func__, sdio_ch[id].status); - } - - return ret; -} - -#ifdef CONFIG_DEBUG_FS - -static int debug_tbl(char *buf, int max) -{ - int i = 0; - int j; - - for (j = 0; j < SDIO_DMUX_NUM_CHANNELS; ++j) { - i += scnprintf(buf + i, max - i, - "ch%02d local open=%s remote open=%s\n", - j, sdio_ch_is_local_open(j) ? "Y" : "N", - sdio_ch_is_remote_open(j) ? "Y" : "N"); - } - - return i; -} - -#define DEBUG_BUFMAX 4096 -static char debug_buffer[DEBUG_BUFMAX]; - -static ssize_t debug_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - int (*fill)(char *buf, int max) = file->private_data; - int bsize = fill(debug_buffer, DEBUG_BUFMAX); - return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); -} - -static int debug_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - - -static const struct file_operations debug_ops = { - .read = debug_read, - .open = debug_open, -}; - -static void debug_create(const char *name, mode_t mode, - struct dentry *dent, - int (*fill)(char *buf, int max)) -{ - debugfs_create_file(name, mode, dent, fill, &debug_ops); -} - -#endif - -static int sdio_dmux_probe(struct platform_device *pdev) -{ - int rc; - - DBG("%s probe called\n", __func__); - - if (!sdio_mux_initialized) { - sdio_mux_workqueue = create_singlethread_workqueue("sdio_dmux"); - if (!sdio_mux_workqueue) - return -ENOMEM; - - skb_queue_head_init(&sdio_mux_write_pool); - spin_lock_init(&sdio_mux_write_lock); - - for (rc = 0; rc < SDIO_DMUX_NUM_CHANNELS; ++rc) - spin_lock_init(&sdio_ch[rc].lock); - - - wake_lock_init(&sdio_mux_ch_wakelock, WAKE_LOCK_SUSPEND, - "sdio_dmux"); - } - - rc = sdio_open("SDIO_RMNT", &sdio_mux_ch, NULL, sdio_mux_notify); - if (rc < 0) { - pr_err("%s: sido open failed %d\n", __func__, rc); - wake_lock_destroy(&sdio_mux_ch_wakelock); - destroy_workqueue(sdio_mux_workqueue); - sdio_mux_initialized = 0; - return rc; - } - - fatal_error = 0; - sdio_mux_initialized = 1; - return 0; -} - -static int sdio_dmux_remove(struct platform_device *pdev) -{ - int i; - unsigned long ch_lock_flags; - unsigned long write_lock_flags; - struct sk_buff *skb; - - DBG("%s remove called\n", __func__); - if (!sdio_mux_initialized) - return 0; - - /* set reset state for any open channels */ - for (i = 0; i < SDIO_DMUX_NUM_CHANNELS; ++i) { - spin_lock_irqsave(&sdio_ch[i].lock, ch_lock_flags); - if (sdio_ch_is_open(i)) { - sdio_ch[i].status |= SDIO_CH_IN_RESET; - sdio_ch[i].status &= ~SDIO_CH_REMOTE_OPEN; - - /* notify client so it can update its status */ - if (sdio_ch[i].receive_cb) - sdio_ch[i].receive_cb( - sdio_ch[i].priv, NULL); - } - spin_unlock_irqrestore(&sdio_ch[i].lock, ch_lock_flags); - } - - /* cancel any pending writes */ - spin_lock_irqsave(&sdio_mux_write_lock, write_lock_flags); - while ((skb = __skb_dequeue(&sdio_mux_write_pool))) { - i = ((struct sdio_mux_hdr *)skb->data)->ch_id; - if (sdio_ch[i].write_done) - sdio_ch[i].write_done( - sdio_ch[i].priv, skb); - else - dev_kfree_skb_any(skb); - } - spin_unlock_irqrestore(&sdio_mux_write_lock, - write_lock_flags); - - return 0; -} - -static struct platform_driver sdio_dmux_driver = { - .probe = sdio_dmux_probe, - .remove = sdio_dmux_remove, - .driver = { - .name = "SDIO_RMNT", - .owner = THIS_MODULE, - }, -}; - -static int __init sdio_dmux_init(void) -{ -#ifdef CONFIG_DEBUG_FS - struct dentry *dent; - - dent = debugfs_create_dir("sdio_dmux", 0); - if (!IS_ERR(dent)) - debug_create("tbl", 0444, dent, debug_tbl); -#endif - return platform_driver_register(&sdio_dmux_driver); -} - -module_init(sdio_dmux_init); -MODULE_DESCRIPTION("MSM SDIO DMUX"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/sdio_smem.c b/arch/arm/mach-msm/sdio_smem.c deleted file mode 100644 index edc0d23e43b4..000000000000 --- a/arch/arm/mach-msm/sdio_smem.c +++ /dev/null @@ -1,175 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include - -static void sdio_smem_read(struct work_struct *work); - -static struct sdio_channel *channel; -static struct workqueue_struct *workq; -static DECLARE_WORK(work_read, sdio_smem_read); -static DECLARE_WAIT_QUEUE_HEAD(waitq); -static int bytes_avail; -static int sdio_ch_opened; - -static void sdio_smem_release(struct device *dev) -{ - pr_debug("sdio smem released\n"); -} - -static struct sdio_smem_client client; - -static void sdio_smem_read(struct work_struct *work) -{ - int err; - int read_avail; - char *data = client.buf; - - if (!sdio_ch_opened) - return; - - read_avail = sdio_read_avail(channel); - if (read_avail > bytes_avail || - read_avail < 0) { - pr_err("Error: read_avail=%d bytes_avail=%d\n", - read_avail, bytes_avail); - goto read_err; - } - - if (read_avail == 0) - return; - - err = sdio_read(channel, - &data[client.size - bytes_avail], - read_avail); - if (err) { - pr_err("sdio_read error (%d)", err); - goto read_err; - } - - bytes_avail -= read_avail; - pr_debug("read %d bytes (bytes_avail = %d)\n", - read_avail, bytes_avail); - - if (!bytes_avail) { - bytes_avail = client.size; - err = client.cb_func(SDIO_SMEM_EVENT_READ_DONE); - } - if (err) - pr_err("error (%d) on callback\n", err); - - return; - -read_err: - if (sdio_ch_opened) - client.cb_func(SDIO_SMEM_EVENT_READ_ERR); - return; -} - -static void sdio_smem_notify(void *priv, unsigned event) -{ - pr_debug("%d event received\n", event); - - if (event == SDIO_EVENT_DATA_READ_AVAIL || - event == SDIO_EVENT_DATA_WRITE_AVAIL) - queue_work(workq, &work_read); -} - -int sdio_smem_register_client(void) -{ - int err = 0; - - if (!client.buf || !client.size || !client.cb_func) - return -EINVAL; - - pr_debug("buf = %p\n", client.buf); - pr_debug("size = 0x%x\n", client.size); - - bytes_avail = client.size; - workq = create_singlethread_workqueue("sdio_smem"); - if (!workq) - return -ENOMEM; - - sdio_ch_opened = 1; - err = sdio_open("SDIO_SMEM", &channel, NULL, sdio_smem_notify); - if (err) { - sdio_ch_opened = 0; - pr_err("sdio_open error (%d)\n", err); - destroy_workqueue(workq); - return err; - } - pr_debug("SDIO SMEM channel opened\n"); - return err; -} - -int sdio_smem_unregister_client(void) -{ - int err = 0; - - sdio_ch_opened = 0; - err = sdio_close(channel); - if (err) { - pr_err("sdio_close error (%d)\n", err); - return err; - } - pr_debug("SDIO SMEM channel closed\n"); - flush_workqueue(workq); - destroy_workqueue(workq); - bytes_avail = 0; - client.buf = NULL; - client.cb_func = NULL; - client.size = 0; - - return 0; -} - -static int sdio_smem_probe(struct platform_device *pdev) -{ - client.plat_dev.name = "SDIO_SMEM_CLIENT"; - client.plat_dev.id = -1; - client.plat_dev.dev.release = sdio_smem_release; - - return platform_device_register(&client.plat_dev); -} - -static int sdio_smem_remove(struct platform_device *pdev) -{ - platform_device_unregister(&client.plat_dev); - memset(&client, 0, sizeof(client)); - sdio_ch_opened = 0; - return 0; -} -static struct platform_driver sdio_smem_drv = { - .probe = sdio_smem_probe, - .remove = sdio_smem_remove, - .driver = { - .name = "SDIO_SMEM", - .owner = THIS_MODULE, - }, -}; - -static int __init sdio_smem_init(void) -{ - return platform_driver_register(&sdio_smem_drv); -}; - -module_init(sdio_smem_init); - -MODULE_DESCRIPTION("SDIO SMEM"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/sdio_tty.c b/arch/arm/mach-msm/sdio_tty.c deleted file mode 100644 index c4b76733b5e2..000000000000 --- a/arch/arm/mach-msm/sdio_tty.c +++ /dev/null @@ -1,824 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define INPUT_SPEED 4800 -#define OUTPUT_SPEED 4800 -#define SDIO_TTY_MODULE_NAME "sdio_tty" -#define SDIO_TTY_MAX_PACKET_SIZE 4096 -#define MAX_SDIO_TTY_DRV 1 -#define MAX_SDIO_TTY_DEVS 2 -#define MAX_SDIO_TTY_DEV_NAME_SIZE 25 - -/* Configurations per channel device */ -/* CSVT */ -#define SDIO_TTY_CSVT_DEV "sdio_tty_csvt_0" -#define SDIO_TTY_CSVT_TEST_DEV "sdio_tty_csvt_test_0" -#define SDIO_TTY_CH_CSVT "SDIO_CSVT" - -enum sdio_tty_state { - TTY_INITIAL = 0, - TTY_REGISTERED = 1, - TTY_OPENED = 2, - TTY_CLOSED = 3, -}; - -enum sdio_tty_devices { - SDIO_CSVT, - SDIO_CSVT_TEST_APP, -}; - -static const struct platform_device_id sdio_tty_id_table[] = { - { "SDIO_CSVT", SDIO_CSVT }, - { "SDIO_CSVT_TEST_APP", SDIO_CSVT_TEST_APP }, - { }, -}; -MODULE_DEVICE_TABLE(platform, sdio_tty_id_table); - -struct sdio_tty { - struct sdio_channel *ch; - char *sdio_ch_name; - char tty_dev_name[MAX_SDIO_TTY_DEV_NAME_SIZE]; - int device_id; - struct workqueue_struct *workq; - struct work_struct work_read; - wait_queue_head_t waitq; - struct tty_driver *tty_drv; - struct tty_struct *tty_str; - int debug_msg_on; - char *read_buf; - enum sdio_tty_state sdio_tty_state; - int is_sdio_open; - int tty_open_count; - int total_rx; - int total_tx; -}; - -static struct sdio_tty *sdio_tty[MAX_SDIO_TTY_DEVS]; - -#ifdef CONFIG_DEBUG_FS -struct dentry *sdio_tty_debug_root; -struct dentry *sdio_tty_debug_info; -#endif - -#define DEBUG_MSG(sdio_tty_drv, x...) if (sdio_tty_drv->debug_msg_on) pr_info(x) - -/* - * Enable sdio_tty debug messages - * By default the sdio_tty debug messages are turned off - */ -static int csvt_debug_msg_on; -module_param(csvt_debug_msg_on, int, 0); - -static void sdio_tty_read(struct work_struct *work) -{ - int ret = 0; - int read_avail = 0; - int left = 0; - int total_push = 0; - int num_push = 0; - struct sdio_tty *sdio_tty_drv = NULL; - - sdio_tty_drv = container_of(work, struct sdio_tty, work_read); - - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty", __func__); - return ; - } - - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_state = %d", - __func__, sdio_tty_drv->sdio_tty_state); - return; - } - - if (!sdio_tty_drv->read_buf) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL read_buf for dev %s", - __func__, sdio_tty_drv->tty_dev_name); - return; - } - - /* Read the data from the SDIO channel as long as there is available - data */ - while (1) { - if (test_bit(TTY_THROTTLED, &sdio_tty_drv->tty_str->flags)) { - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME - ": %s: TTY_THROTTLED bit is set for " - "dev %s, exit", __func__, - sdio_tty_drv->tty_dev_name); - return; - } - - total_push = 0; - read_avail = sdio_read_avail(sdio_tty_drv->ch); - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME - ": %s: read_avail is %d for dev %s", __func__, - read_avail, sdio_tty_drv->tty_dev_name); - - if (read_avail == 0) { - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME - ": %s: read_avail is 0 for dev %s", - __func__, sdio_tty_drv->tty_dev_name); - return; - } - - if (read_avail > SDIO_TTY_MAX_PACKET_SIZE) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: read_avail(%d) is " - "bigger than SDIO_TTY_MAX_PACKET_SIZE(%d) " - "for dev %s", __func__, read_avail, - SDIO_TTY_MAX_PACKET_SIZE, - sdio_tty_drv->tty_dev_name); - return; - } - - ret = sdio_read(sdio_tty_drv->ch, - sdio_tty_drv->read_buf, - read_avail); - if (ret < 0) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_read error(%d) " - "for dev %s", __func__, ret, - sdio_tty_drv->tty_dev_name); - return; - } - - left = read_avail; - do { - num_push = tty_insert_flip_string( - sdio_tty_drv->tty_str, - sdio_tty_drv->read_buf+total_push, - left); - total_push += num_push; - left -= num_push; - tty_flip_buffer_push(sdio_tty_drv->tty_str); - } while (left != 0); - - if (total_push != read_avail) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: failed, total_push" - "(%d) != read_avail(%d) for dev %s\n", - __func__, total_push, read_avail, - sdio_tty_drv->tty_dev_name); - } - - tty_flip_buffer_push(sdio_tty_drv->tty_str); - sdio_tty_drv->total_rx += read_avail; - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: Rx: %d, " - "Total Rx = %d bytes for dev %s", __func__, - read_avail, sdio_tty_drv->total_rx, - sdio_tty_drv->tty_dev_name); - } -} - -/** - * sdio_tty_write_room - * - * This is the write_room function of the tty driver. - * - * @tty: pointer to tty struct. - * @return free bytes for write. - * - */ -static int sdio_tty_write_room(struct tty_struct *tty) -{ - int write_avail = 0; - struct sdio_tty *sdio_tty_drv = NULL; - - if (!tty) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL tty", __func__); - return -ENODEV; - } - sdio_tty_drv = tty->driver_data; - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return -ENODEV; - } - - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_state = %d", - __func__, sdio_tty_drv->sdio_tty_state); - return -EPERM; - } - - write_avail = sdio_write_avail(sdio_tty_drv->ch); - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: write_avail=%d " - "for dev %s", __func__, write_avail, - sdio_tty_drv->tty_dev_name); - - return write_avail; -} - -/** - * sdio_tty_write_callback - * this is the write callback of the tty driver. - * - * @tty: pointer to tty struct. - * @buf: buffer to write from. - * @count: number of bytes to write. - * @return bytes written or negative value on error. - * - * if destination buffer has not enough room for the incoming - * data, writes the possible amount of bytes . - */ -static int sdio_tty_write_callback(struct tty_struct *tty, - const unsigned char *buf, int count) -{ - int write_avail = 0; - int len = count; - int ret = 0; - struct sdio_tty *sdio_tty_drv = NULL; - - if (!tty) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL tty", __func__); - return -ENODEV; - } - sdio_tty_drv = tty->driver_data; - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return -ENODEV; - } - - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_state = %d", - __func__, sdio_tty_drv->sdio_tty_state); - return -EPERM; - } - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: Write Callback " - "called with %d bytes for dev %s\n", __func__, count, - sdio_tty_drv->tty_dev_name); - write_avail = sdio_write_avail(sdio_tty_drv->ch); - if (write_avail == 0) { - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: " - "write_avail is 0 for dev %s\n", - __func__, sdio_tty_drv->tty_dev_name); - return 0; - } - if (write_avail > SDIO_TTY_MAX_PACKET_SIZE) { - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: " - "write_avail(%d) is bigger than max packet " - "size(%d) for dev %s, setting to " - "max_packet_size\n", __func__, write_avail, - SDIO_TTY_MAX_PACKET_SIZE, - sdio_tty_drv->tty_dev_name); - write_avail = SDIO_TTY_MAX_PACKET_SIZE; - } - if (write_avail < count) { - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: " - "write_avail(%d) is smaller than required(%d) " - "for dev %s, writing only %d bytes\n", - __func__, write_avail, count, - sdio_tty_drv->tty_dev_name, write_avail); - len = write_avail; - } - ret = sdio_write(sdio_tty_drv->ch, buf, len); - if (ret) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_write failed for " - "dev %s, ret=%d\n", __func__, - sdio_tty_drv->tty_dev_name, ret); - return 0; - } - - sdio_tty_drv->total_tx += len; - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: Tx: %d, " - "Total Tx = %d for dev %s", __func__, len, - sdio_tty_drv->total_tx, sdio_tty_drv->tty_dev_name); - return len; -} - -static void sdio_tty_notify(void *priv, unsigned event) -{ - struct sdio_tty *sdio_tty_drv = priv; - - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - } - - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_state = %d", - __func__, sdio_tty_drv->sdio_tty_state); - return; - } - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: event %d " - "received for dev %s\n", __func__, event, - sdio_tty_drv->tty_dev_name); - - if (event == SDIO_EVENT_DATA_READ_AVAIL) - queue_work(sdio_tty_drv->workq, &sdio_tty_drv->work_read); -} - -/** - * sdio_tty_open - * This is the open callback of the tty driver. it opens - * the sdio channel, and creates the workqueue. - * - * @tty: a pointer to the tty struct. - * @file: file descriptor. - * @return 0 on success or negative value on error. - */ -static int sdio_tty_open(struct tty_struct *tty, struct file *file) -{ - int ret = 0; - int i = 0; - struct sdio_tty *sdio_tty_drv = NULL; - - if (!tty) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL tty", __func__); - return -ENODEV; - } - - for (i = 0; i < MAX_SDIO_TTY_DEVS; i++) { - if (sdio_tty[i] == NULL) - continue; - if (!strncmp(sdio_tty[i]->tty_dev_name, tty->name, - MAX_SDIO_TTY_DEV_NAME_SIZE)) { - sdio_tty_drv = sdio_tty[i]; - break; - } - } - - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return -ENODEV; - } - - sdio_tty_drv->tty_open_count++; - if (sdio_tty_drv->sdio_tty_state == TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: tty dev(%s) is already open", - __func__, sdio_tty_drv->tty_dev_name); - return -EBUSY; - } - - tty->driver_data = sdio_tty_drv; - - sdio_tty_drv->tty_str = tty; - sdio_tty_drv->tty_str->low_latency = 1; - sdio_tty_drv->tty_str->icanon = 0; - set_bit(TTY_NO_WRITE_SPLIT, &sdio_tty_drv->tty_str->flags); - - sdio_tty_drv->read_buf = kzalloc(SDIO_TTY_MAX_PACKET_SIZE, GFP_KERNEL); - if (sdio_tty_drv->read_buf == NULL) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: failed to allocate read_buf " - "for dev %s", __func__, sdio_tty_drv->tty_dev_name); - return -ENOMEM; - } - - sdio_tty_drv->workq = create_singlethread_workqueue("sdio_tty_read"); - if (!sdio_tty_drv->workq) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: failed to create workq " - "for dev %s", __func__, sdio_tty_drv->tty_dev_name); - return -ENOMEM; - } - - if (!sdio_tty_drv->is_sdio_open) { - ret = sdio_open(sdio_tty_drv->sdio_ch_name, &sdio_tty_drv->ch, - sdio_tty_drv, sdio_tty_notify); - if (ret < 0) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_open err=%d " - "for dev %s\n", __func__, ret, - sdio_tty_drv->tty_dev_name); - destroy_workqueue(sdio_tty_drv->workq); - return ret; - } - - pr_info(SDIO_TTY_MODULE_NAME ": %s: SDIO_TTY channel(%s) " - "opened\n", __func__, sdio_tty_drv->sdio_ch_name); - - sdio_tty_drv->is_sdio_open = 1; - } else { - /* If SDIO channel is already open try to read the data - * from the modem - */ - queue_work(sdio_tty_drv->workq, &sdio_tty_drv->work_read); - - } - - sdio_tty_drv->sdio_tty_state = TTY_OPENED; - - pr_info(SDIO_TTY_MODULE_NAME ": %s: TTY device(%s) opened\n", - __func__, sdio_tty_drv->tty_dev_name); - - return ret; -} - -/** - * sdio_tty_close - * This is the close callback of the tty driver. it requests - * the main thread to exit, and waits for notification of it. - * it also de-allocates the buffers, and unregisters the tty - * driver and device. - * - * @tty: a pointer to the tty struct. - * @file: file descriptor. - * @return None. - */ -static void sdio_tty_close(struct tty_struct *tty, struct file *file) -{ - struct sdio_tty *sdio_tty_drv = NULL; - - if (!tty) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL tty", __func__); - return; - } - sdio_tty_drv = tty->driver_data; - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return; - } - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: trying to close a " - "TTY device that was not opened\n", __func__); - return; - } - if (--sdio_tty_drv->tty_open_count != 0) - return; - - flush_workqueue(sdio_tty_drv->workq); - destroy_workqueue(sdio_tty_drv->workq); - - kfree(sdio_tty_drv->read_buf); - sdio_tty_drv->read_buf = NULL; - - sdio_tty_drv->sdio_tty_state = TTY_CLOSED; - - pr_info(SDIO_TTY_MODULE_NAME ": %s: SDIO_TTY device(%s) closed\n", - __func__, sdio_tty_drv->tty_dev_name); -} - -static void sdio_tty_unthrottle(struct tty_struct *tty) -{ - struct sdio_tty *sdio_tty_drv = NULL; - - if (!tty) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL tty", __func__); - return; - } - sdio_tty_drv = tty->driver_data; - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return; - } - - if (sdio_tty_drv->sdio_tty_state != TTY_OPENED) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_state = %d", - __func__, sdio_tty_drv->sdio_tty_state); - return; - } - - queue_work(sdio_tty_drv->workq, &sdio_tty_drv->work_read); - return; -} - -static const struct tty_operations sdio_tty_ops = { - .open = sdio_tty_open, - .close = sdio_tty_close, - .write = sdio_tty_write_callback, - .write_room = sdio_tty_write_room, - .unthrottle = sdio_tty_unthrottle, -}; - -int sdio_tty_init_tty(char *tty_name, char *sdio_ch_name, - enum sdio_tty_devices device_id, int debug_msg_on) -{ - int ret = 0; - int i = 0; - struct device *tty_dev = NULL; - struct sdio_tty *sdio_tty_drv = NULL; - - sdio_tty_drv = kzalloc(sizeof(struct sdio_tty), GFP_KERNEL); - if (sdio_tty_drv == NULL) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: failed to allocate sdio_tty " - "for dev %s", __func__, tty_name); - return -ENOMEM; - } - - for (i = 0; i < MAX_SDIO_TTY_DEVS; i++) { - if (sdio_tty[i] == NULL) { - sdio_tty[i] = sdio_tty_drv; - break; - } - } - - if (i == MAX_SDIO_TTY_DEVS) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: tty dev(%s) creation failed," - " max limit(%d) reached.", __func__, tty_name, - MAX_SDIO_TTY_DEVS); - kfree(sdio_tty_drv); - return -ENODEV; - } - - snprintf(sdio_tty_drv->tty_dev_name, MAX_SDIO_TTY_DEV_NAME_SIZE, - "%s%d", tty_name, 0); - sdio_tty_drv->sdio_ch_name = sdio_ch_name; - sdio_tty_drv->device_id = device_id; - pr_info(SDIO_TTY_MODULE_NAME ": %s: dev=%s, id=%d, channel=%s\n", - __func__, sdio_tty_drv->tty_dev_name, sdio_tty_drv->device_id, - sdio_tty_drv->sdio_ch_name); - - INIT_WORK(&sdio_tty_drv->work_read, sdio_tty_read); - - sdio_tty_drv->tty_drv = alloc_tty_driver(MAX_SDIO_TTY_DRV); - - if (!sdio_tty_drv->tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s - tty_drv is NULL for dev %s", - __func__, sdio_tty_drv->tty_dev_name); - kfree(sdio_tty_drv); - return -ENODEV; - } - - sdio_tty_drv->tty_drv->name = tty_name; - sdio_tty_drv->tty_drv->owner = THIS_MODULE; - sdio_tty_drv->tty_drv->driver_name = "SDIO_tty"; - /* uses dynamically assigned dev_t values */ - sdio_tty_drv->tty_drv->type = TTY_DRIVER_TYPE_SERIAL; - sdio_tty_drv->tty_drv->subtype = SERIAL_TYPE_NORMAL; - sdio_tty_drv->tty_drv->flags = TTY_DRIVER_REAL_RAW - | TTY_DRIVER_DYNAMIC_DEV - | TTY_DRIVER_RESET_TERMIOS; - - /* initializing the tty driver */ - sdio_tty_drv->tty_drv->init_termios = tty_std_termios; - sdio_tty_drv->tty_drv->init_termios.c_cflag = - B4800 | CS8 | CREAD | HUPCL | CLOCAL; - sdio_tty_drv->tty_drv->init_termios.c_ispeed = INPUT_SPEED; - sdio_tty_drv->tty_drv->init_termios.c_ospeed = OUTPUT_SPEED; - - tty_set_operations(sdio_tty_drv->tty_drv, &sdio_tty_ops); - - ret = tty_register_driver(sdio_tty_drv->tty_drv); - if (ret) { - put_tty_driver(sdio_tty_drv->tty_drv); - pr_err(SDIO_TTY_MODULE_NAME ": %s: tty_register_driver() " - "failed for dev %s\n", __func__, - sdio_tty_drv->tty_dev_name); - - sdio_tty_drv->tty_drv = NULL; - kfree(sdio_tty_drv); - return -ENODEV; - } - - tty_dev = tty_register_device(sdio_tty_drv->tty_drv, 0, NULL); - if (IS_ERR(tty_dev)) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: tty_register_device() " - "failed for dev %s\n", __func__, - sdio_tty_drv->tty_dev_name); - tty_unregister_driver(sdio_tty_drv->tty_drv); - put_tty_driver(sdio_tty_drv->tty_drv); - kfree(sdio_tty_drv); - return -ENODEV; - } - - sdio_tty_drv->sdio_tty_state = TTY_REGISTERED; - if (debug_msg_on) { - pr_info(SDIO_TTY_MODULE_NAME ": %s: turn on debug msg for %s", - __func__, sdio_tty_drv->tty_dev_name); - sdio_tty_drv->debug_msg_on = debug_msg_on; - } - return 0; -} - -int sdio_tty_uninit_tty(void *sdio_tty_handle) -{ - int ret = 0; - int i = 0; - struct sdio_tty *sdio_tty_drv = sdio_tty_handle; - - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return -ENODEV; - } - if (sdio_tty_drv->sdio_tty_state == TTY_OPENED) { - flush_workqueue(sdio_tty_drv->workq); - destroy_workqueue(sdio_tty_drv->workq); - - kfree(sdio_tty_drv->read_buf); - sdio_tty_drv->read_buf = NULL; - } - - if (sdio_tty_drv->sdio_tty_state != TTY_INITIAL) { - tty_unregister_device(sdio_tty_drv->tty_drv, 0); - - ret = tty_unregister_driver(sdio_tty_drv->tty_drv); - if (ret) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: " - "tty_unregister_driver() failed for dev %s\n", - __func__, sdio_tty_drv->tty_dev_name); - } - put_tty_driver(sdio_tty_drv->tty_drv); - sdio_tty_drv->sdio_tty_state = TTY_INITIAL; - sdio_tty_drv->tty_drv = NULL; - } - - for (i = 0; i < MAX_SDIO_TTY_DEVS; i++) { - if (sdio_tty[i] == NULL) - continue; - if (sdio_tty[i]->device_id == sdio_tty_drv->device_id) { - sdio_tty[i] = NULL; - break; - } - } - - DEBUG_MSG(sdio_tty_drv, SDIO_TTY_MODULE_NAME ": %s: Freeing sdio_tty " - "structure, dev=%s", __func__, - sdio_tty_drv->tty_dev_name); - kfree(sdio_tty_drv); - - return 0; -} - -static int sdio_tty_probe(struct platform_device *pdev) -{ - const struct platform_device_id *id = platform_get_device_id(pdev); - enum sdio_tty_devices device_id = id->driver_data; - char *device_name = NULL; - char *channel_name = NULL; - int debug_msg_on = 0; - int ret = 0; - - pr_debug(SDIO_TTY_MODULE_NAME ": %s for %s", __func__, pdev->name); - - switch (device_id) { - case SDIO_CSVT: - device_name = SDIO_TTY_CSVT_DEV; - channel_name = SDIO_TTY_CH_CSVT; - debug_msg_on = csvt_debug_msg_on; - break; - case SDIO_CSVT_TEST_APP: - device_name = SDIO_TTY_CSVT_TEST_DEV; - channel_name = SDIO_TTY_CH_CSVT; - debug_msg_on = csvt_debug_msg_on; - break; - default: - pr_err(SDIO_TTY_MODULE_NAME ": %s Invalid device:%s, id:%d", - __func__, pdev->name, device_id); - ret = -ENODEV; - break; - } - - if (device_name) { - ret = sdio_tty_init_tty(device_name, channel_name, - device_id, debug_msg_on); - if (ret) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_init_tty " - "failed for dev:%s", __func__, device_name); - } - } - return ret; -} - -static int sdio_tty_remove(struct platform_device *pdev) -{ - const struct platform_device_id *id = platform_get_device_id(pdev); - enum sdio_tty_devices device_id = id->driver_data; - struct sdio_tty *sdio_tty_drv = NULL; - int i = 0; - int ret = 0; - - pr_debug(SDIO_TTY_MODULE_NAME ": %s for %s", __func__, pdev->name); - - for (i = 0; i < MAX_SDIO_TTY_DEVS; i++) { - if (sdio_tty[i] == NULL) - continue; - if (sdio_tty[i]->device_id == device_id) { - sdio_tty_drv = sdio_tty[i]; - break; - } - } - - if (!sdio_tty_drv) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: NULL sdio_tty_drv", - __func__); - return -ENODEV; - } - - ret = sdio_tty_uninit_tty(sdio_tty_drv); - if (ret) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: sdio_tty_uninit_tty " - "failed for %s", __func__, pdev->name); - } - return ret; -} - -static struct platform_driver sdio_tty_pdrv = { - .probe = sdio_tty_probe, - .remove = sdio_tty_remove, - .id_table = sdio_tty_id_table, - .driver = { - .name = "SDIO_TTY", - .owner = THIS_MODULE, - }, -}; - -#ifdef CONFIG_DEBUG_FS -void sdio_tty_print_info(void) -{ - int i = 0; - - for (i = 0; i < MAX_SDIO_TTY_DEVS; i++) { - if (sdio_tty[i] == NULL) - continue; - pr_info(SDIO_TTY_MODULE_NAME ": %s: Total Rx=%d, Tx = %d " - "for dev %s", __func__, sdio_tty[i]->total_rx, - sdio_tty[i]->total_tx, sdio_tty[i]->tty_dev_name); - } -} - -static int tty_debug_info_open(struct inode *inode, struct file *file) -{ - file->private_data = inode->i_private; - return 0; -} - -static ssize_t tty_debug_info_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - sdio_tty_print_info(); - return count; -} - -const struct file_operations tty_debug_info_ops = { - .open = tty_debug_info_open, - .write = tty_debug_info_write, -}; -#endif - -/* - * Module Init. - * - * Register SDIO TTY driver. - * - */ -static int __init sdio_tty_init(void) -{ - int ret = 0; - - ret = platform_driver_register(&sdio_tty_pdrv); - if (ret) { - pr_err(SDIO_TTY_MODULE_NAME ": %s: platform_driver_register " - "failed", __func__); - } -#ifdef CONFIG_DEBUG_FS - else { - sdio_tty_debug_root = debugfs_create_dir("sdio_tty", NULL); - if (sdio_tty_debug_root) { - sdio_tty_debug_info = debugfs_create_file( - "sdio_tty_debug", - S_IRUGO | S_IWUGO, - sdio_tty_debug_root, - NULL, - &tty_debug_info_ops); - } - } -#endif - return ret; -}; - -/* - * Module Exit. - * - * Unregister SDIO TTY driver. - * - */ -static void __exit sdio_tty_exit(void) -{ -#ifdef CONFIG_DEBUG_FS - debugfs_remove(sdio_tty_debug_info); - debugfs_remove(sdio_tty_debug_root); -#endif - platform_driver_unregister(&sdio_tty_pdrv); -} - -module_init(sdio_tty_init); -module_exit(sdio_tty_exit); - -MODULE_DESCRIPTION("SDIO TTY"); -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Maya Erez "); diff --git a/arch/arm/mach-msm/sirc-fsm9xxx.c b/arch/arm/mach-msm/sirc-fsm9xxx.c deleted file mode 100644 index 2bd347a530a9..000000000000 --- a/arch/arm/mach-msm/sirc-fsm9xxx.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include - -#include "sirc.h" - -static unsigned int sirc_int_enable[2]; - -static struct sirc_regs_t sirc_regs = { - .int_enable = SPSS_SIRC_INT_ENABLE, - .int_type = SPSS_SIRC_INT_TYPE, - .int_polarity = SPSS_SIRC_INT_POLARITY, - .int_clear = SPSS_SIRC_INT_CLEAR, -}; - -static inline void sirc_get_group_offset_mask(unsigned int irq, - unsigned int *group, unsigned int *offset, unsigned int *mask) -{ - *group = 0; - *offset = irq - FIRST_SIRC_IRQ; - if (*offset >= NR_SIRC_IRQS_GROUPA) { - *group = 1; - *offset -= NR_SIRC_IRQS_GROUPA; - } - *mask = 1 << *offset; -} - -static void sirc_irq_mask(struct irq_data *d) -{ - void *reg_enable; - unsigned int group, offset, mask; - unsigned int val; - - sirc_get_group_offset_mask(d->irq, &group, &offset, &mask); - - reg_enable = sirc_regs.int_enable + group * 4; - val = __raw_readl(reg_enable); - __raw_writel(val & ~mask, reg_enable); - sirc_int_enable[group] &= ~mask; - mb(); -} - -static void sirc_irq_unmask(struct irq_data *d) -{ - void *reg_enable; - void *reg_clear; - unsigned int group, offset, mask; - unsigned int val; - - sirc_get_group_offset_mask(d->irq, &group, &offset, &mask); - - if (irq_desc[d->irq].handle_irq == handle_level_irq) { - reg_clear = sirc_regs.int_clear + group * 4; - __raw_writel(mask, reg_clear); - } - - reg_enable = sirc_regs.int_enable + group * 4; - val = __raw_readl(reg_enable); - __raw_writel(val | mask, reg_enable); - sirc_int_enable[group] |= mask; - mb(); -} - -static void sirc_irq_ack(struct irq_data *d) -{ - void *reg_clear; - unsigned int group, offset, mask; - - sirc_get_group_offset_mask(d->irq, &group, &offset, &mask); - - reg_clear = sirc_regs.int_clear + group * 4; - __raw_writel(mask, reg_clear); -} - -static int sirc_irq_set_wake(struct irq_data *d, unsigned int on) -{ - return 0; -} - -static int sirc_irq_set_type(struct irq_data *d, unsigned int flow_type) -{ - void *reg_polarity, *reg_type; - unsigned int group, offset, mask; - unsigned int val; - - sirc_get_group_offset_mask(d->irq, &group, &offset, &mask); - - reg_polarity = sirc_regs.int_polarity + group * 4; - val = __raw_readl(reg_polarity); - - if (flow_type & (IRQF_TRIGGER_LOW | IRQF_TRIGGER_FALLING)) - val &= ~mask; - else - val |= mask; - - __raw_writel(val, reg_polarity); - - reg_type = sirc_regs.int_type + group * 4; - val = __raw_readl(reg_type); - - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { - val |= mask; - irq_desc[d->irq].handle_irq = handle_edge_irq; - } else { - val &= ~mask; - irq_desc[d->irq].handle_irq = handle_level_irq; - } - - __raw_writel(val, reg_type); - - return 0; -} - -/* Finds the pending interrupt on the passed cascade irq and redrives it */ -static void sirc_irq_handler(unsigned int irq, struct irq_desc *desc) -{ - unsigned int sirq; - - for (;;) { - sirq = __raw_readl(SPSS_SIRC_VEC_INDEX_RD); - if (sirq >= NR_SIRC_IRQS) - break; - - generic_handle_irq(sirq + FIRST_SIRC_IRQ); - } - - irq_desc_get_chip(desc)->irq_ack(irq_get_irq_data(irq)); -} - -static struct irq_chip sirc_irq_chip = { - .name = "sirc", - .irq_ack = sirc_irq_ack, - .irq_mask = sirc_irq_mask, - .irq_unmask = sirc_irq_unmask, - .irq_set_wake = sirc_irq_set_wake, - .irq_set_type = sirc_irq_set_type, -}; - -void __init msm_init_sirc(void) -{ - int i; - - sirc_int_enable[0] = 0; - sirc_int_enable[1] = 0; - - for (i = FIRST_SIRC_IRQ; i <= LAST_SIRC_IRQ; i++) { - irq_set_chip_and_handler(i, &sirc_irq_chip, handle_edge_irq); - set_irq_flags(i, IRQF_VALID); - } - - irq_set_chained_handler(INT_SIRC_0, sirc_irq_handler); - irq_set_irq_wake(INT_SIRC_0, 1); -} diff --git a/arch/arm/mach-msm/sirc.c b/arch/arm/mach-msm/sirc.c deleted file mode 100644 index 6008619a6bee..000000000000 --- a/arch/arm/mach-msm/sirc.c +++ /dev/null @@ -1,229 +0,0 @@ -/* linux/arch/arm/mach-msm/irq.c - * - * Copyright (c) 2009-2011 The Linux Foundation. All rights reserved. - * Copyright (C) 2009 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "sirc.h" - -static unsigned int int_enable; -static unsigned int wake_enable; - -static struct sirc_regs_t sirc_regs = { - .int_enable = SPSS_SIRC_INT_ENABLE, - .int_enable_clear = SPSS_SIRC_INT_ENABLE_CLEAR, - .int_enable_set = SPSS_SIRC_INT_ENABLE_SET, - .int_type = SPSS_SIRC_INT_TYPE, - .int_polarity = SPSS_SIRC_INT_POLARITY, - .int_clear = SPSS_SIRC_INT_CLEAR, -}; - -static struct sirc_cascade_regs sirc_reg_table[] = { - { - .int_status = SPSS_SIRC_IRQ_STATUS, - .cascade_irq = INT_SIRC_0, - .cascade_fiq = INT_SIRC_1, - } -}; - -static unsigned int save_type; -static unsigned int save_polarity; - -/* Mask off the given interrupt. Keep the int_enable mask in sync with - the enable reg, so it can be restored after power collapse. */ -static void sirc_irq_mask(struct irq_data *d) -{ - unsigned int mask; - - mask = 1 << (d->irq - FIRST_SIRC_IRQ); - writel(mask, sirc_regs.int_enable_clear); - int_enable &= ~mask; - mb(); - return; -} - -/* Unmask the given interrupt. Keep the int_enable mask in sync with - the enable reg, so it can be restored after power collapse. */ -static void sirc_irq_unmask(struct irq_data *d) -{ - unsigned int mask; - - mask = 1 << (d->irq - FIRST_SIRC_IRQ); - writel(mask, sirc_regs.int_enable_set); - mb(); - int_enable |= mask; - return; -} - -static void sirc_irq_ack(struct irq_data *d) -{ - unsigned int mask; - - mask = 1 << (d->irq - FIRST_SIRC_IRQ); - writel(mask, sirc_regs.int_clear); - mb(); - return; -} - -static int sirc_irq_set_wake(struct irq_data *d, unsigned int on) -{ - unsigned int mask; - - /* Used to set the interrupt enable mask during power collapse. */ - mask = 1 << (d->irq - FIRST_SIRC_IRQ); - if (on) - wake_enable |= mask; - else - wake_enable &= ~mask; - - return 0; -} - -static int sirc_irq_set_type(struct irq_data *d, unsigned int flow_type) -{ - unsigned int mask; - unsigned int val; - - mask = 1 << (d->irq - FIRST_SIRC_IRQ); - val = readl(sirc_regs.int_polarity); - - if (flow_type & (IRQF_TRIGGER_LOW | IRQF_TRIGGER_FALLING)) - val |= mask; - else - val &= ~mask; - - writel(val, sirc_regs.int_polarity); - - val = readl(sirc_regs.int_type); - if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { - val |= mask; - } else { - val &= ~mask; - } - - writel(val, sirc_regs.int_type); - mb(); - - return 0; -} - -#if defined(CONFIG_MSM_FIQ_SUPPORT) -void sirc_fiq_select(int irq, bool enable) -{ - uint32_t mask = 1 << (irq - FIRST_SIRC_IRQ); - uint32_t val; - unsigned long flags; - - local_irq_save(flags); - val = readl(SPSS_SIRC_INT_SELECT); - if (enable) - val |= mask; - else - val &= ~mask; - writel(val, SPSS_SIRC_INT_SELECT); - mb(); - local_irq_restore(flags); -} -#endif - -/* Finds the pending interrupt on the passed cascade irq and redrives it */ -static void sirc_irq_handler(unsigned int irq, struct irq_desc *desc) -{ - unsigned int reg = 0; - unsigned int sirq; - unsigned int status; - - while ((reg < ARRAY_SIZE(sirc_reg_table)) && - (sirc_reg_table[reg].cascade_irq != irq)) - reg++; - - if (reg == ARRAY_SIZE(sirc_reg_table)) { - printk(KERN_ERR "%s: incorrect irq %d called\n", - __func__, irq); - return; - } - - status = readl(sirc_reg_table[reg].int_status); - status &= SIRC_MASK; - if (status == 0) - return; - - for (sirq = 0; - (sirq < NR_SIRC_IRQS) && ((status & (1U << sirq)) == 0); - sirq++) - ; - generic_handle_irq(sirq+FIRST_SIRC_IRQ); - - irq_desc_get_chip(desc)->irq_ack(irq_get_irq_data(irq)); -} - -void msm_sirc_enter_sleep(void) -{ - save_type = readl(sirc_regs.int_type); - save_polarity = readl(sirc_regs.int_polarity); - writel(wake_enable, sirc_regs.int_enable); - mb(); - return; -} - -void msm_sirc_exit_sleep(void) -{ - writel(save_type, sirc_regs.int_type); - writel(save_polarity, sirc_regs.int_polarity); - writel(int_enable, sirc_regs.int_enable); - mb(); - return; -} - -static struct irq_chip sirc_irq_chip = { - .name = "sirc", - .irq_ack = sirc_irq_ack, - .irq_mask = sirc_irq_mask, - .irq_unmask = sirc_irq_unmask, - .irq_set_wake = sirc_irq_set_wake, - .irq_set_type = sirc_irq_set_type, -}; - -void __init msm_init_sirc(void) -{ - int i; - - int_enable = 0; - wake_enable = 0; - - for (i = FIRST_SIRC_IRQ; i < LAST_SIRC_IRQ; i++) { - irq_set_chip_and_handler(i, &sirc_irq_chip, handle_edge_irq); - set_irq_flags(i, IRQF_VALID); - } - - for (i = 0; i < ARRAY_SIZE(sirc_reg_table); i++) { - irq_set_chained_handler(sirc_reg_table[i].cascade_irq, - sirc_irq_handler); - irq_set_irq_wake(sirc_reg_table[i].cascade_irq, 1); -#if defined(CONFIG_MSM_FIQ_SUPPORT) - msm_fiq_select(sirc_reg_table[i].cascade_fiq); - msm_fiq_enable(sirc_reg_table[i].cascade_fiq); -#endif - } - return; -} - diff --git a/arch/arm/mach-msm/spm.c b/arch/arm/mach-msm/spm.c deleted file mode 100644 index ea0b56c6a89a..000000000000 --- a/arch/arm/mach-msm/spm.c +++ /dev/null @@ -1,308 +0,0 @@ -/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include - -#include "spm.h" - - -enum { - MSM_SPM_DEBUG_SHADOW = 1U << 0, - MSM_SPM_DEBUG_VCTL = 1U << 1, -}; - -static int msm_spm_debug_mask; -module_param_named( - debug_mask, msm_spm_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP -); - -#define MSM_SPM_PMIC_STATE_IDLE 0 - -static uint32_t msm_spm_reg_offsets[MSM_SPM_REG_NR] = { - [MSM_SPM_REG_SAW_AVS_CTL] = 0x04, - - [MSM_SPM_REG_SAW_VCTL] = 0x08, - [MSM_SPM_REG_SAW_STS] = 0x0C, - [MSM_SPM_REG_SAW_CFG] = 0x10, - - [MSM_SPM_REG_SAW_SPM_CTL] = 0x14, - [MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x18, - [MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0x1C, - - [MSM_SPM_REG_SAW_SPM_PMIC_CTL] = 0x20, - [MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x24, - [MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x28, - [MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x2C, - - [MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x30, - [MSM_SPM_REG_SAW_SLP_RST_EN] = 0x34, - [MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x38, -}; - -struct msm_spm_device { - void __iomem *reg_base_addr; - uint32_t reg_shadow[MSM_SPM_REG_NR]; - - uint8_t awake_vlevel; - uint8_t retention_vlevel; - uint8_t collapse_vlevel; - uint8_t retention_mid_vlevel; - uint8_t collapse_mid_vlevel; - - uint32_t vctl_timeout_us; - - unsigned int low_power_mode; - bool notify_rpm; - bool dirty; -}; - -static DEFINE_PER_CPU_SHARED_ALIGNED(struct msm_spm_device, msm_spm_devices); -/****************************************************************************** - * Internal helper functions - *****************************************************************************/ - -static inline void msm_spm_set_vctl( - struct msm_spm_device *dev, uint32_t vlevel) -{ - dev->reg_shadow[MSM_SPM_REG_SAW_VCTL] &= ~0xFF; - dev->reg_shadow[MSM_SPM_REG_SAW_VCTL] |= vlevel; -} - -static inline void msm_spm_set_spm_ctl(struct msm_spm_device *dev, - uint32_t rpm_bypass, uint32_t mode_encoding) -{ - dev->reg_shadow[MSM_SPM_REG_SAW_SPM_CTL] &= ~0x0F; - dev->reg_shadow[MSM_SPM_REG_SAW_SPM_CTL] |= rpm_bypass << 3; - dev->reg_shadow[MSM_SPM_REG_SAW_SPM_CTL] |= mode_encoding; -} - -static inline void msm_spm_set_pmic_ctl(struct msm_spm_device *dev, - uint32_t awake_vlevel, uint32_t mid_vlevel, uint32_t sleep_vlevel) -{ - dev->reg_shadow[MSM_SPM_REG_SAW_SPM_PMIC_CTL] = - (mid_vlevel << 16) | (awake_vlevel << 8) | (sleep_vlevel); -} - -static inline void msm_spm_set_slp_rst_en( - struct msm_spm_device *dev, uint32_t slp_rst_en) -{ - dev->reg_shadow[MSM_SPM_REG_SAW_SLP_RST_EN] = slp_rst_en; -} - -static inline void msm_spm_flush_shadow( - struct msm_spm_device *dev, unsigned int reg_index) -{ - __raw_writel(dev->reg_shadow[reg_index], - dev->reg_base_addr + msm_spm_reg_offsets[reg_index]); -} - -static inline void msm_spm_load_shadow( - struct msm_spm_device *dev, unsigned int reg_index) -{ - dev->reg_shadow[reg_index] = __raw_readl(dev->reg_base_addr + - msm_spm_reg_offsets[reg_index]); -} - -static inline uint32_t msm_spm_get_sts_pmic_state(struct msm_spm_device *dev) -{ - return (dev->reg_shadow[MSM_SPM_REG_SAW_STS] >> 20) & 0x03; -} - -static inline uint32_t msm_spm_get_sts_curr_pmic_data( - struct msm_spm_device *dev) -{ - return (dev->reg_shadow[MSM_SPM_REG_SAW_STS] >> 10) & 0xFF; -} - -/****************************************************************************** - * Public functions - *****************************************************************************/ -/** - * msm_spm_set_low_power_mode() - Configure SPM start address for low power mode - * @mode: SPM LPM mode to enter - * @notify_rpm: Notify RPM in this mode - */ -int msm_spm_set_low_power_mode(unsigned int mode, bool notify_rpm) -{ - struct msm_spm_device *dev = &__get_cpu_var(msm_spm_devices); - uint32_t rpm_bypass = notify_rpm ? 0x00 : 0x01; - - if (mode == dev->low_power_mode && notify_rpm == dev->notify_rpm - && !dev->dirty) - return 0; - - switch (mode) { - case MSM_SPM_MODE_CLOCK_GATING: - msm_spm_set_spm_ctl(dev, rpm_bypass, 0x00); - msm_spm_set_slp_rst_en(dev, 0x00); - break; - - case MSM_SPM_MODE_POWER_RETENTION: - msm_spm_set_spm_ctl(dev, rpm_bypass, 0x02); - msm_spm_set_pmic_ctl(dev, dev->awake_vlevel, - dev->retention_mid_vlevel, dev->retention_vlevel); - msm_spm_set_slp_rst_en(dev, 0x00); - break; - - case MSM_SPM_MODE_POWER_COLLAPSE: - msm_spm_set_spm_ctl(dev, rpm_bypass, 0x02); - msm_spm_set_pmic_ctl(dev, dev->awake_vlevel, - dev->collapse_mid_vlevel, dev->collapse_vlevel); - msm_spm_set_slp_rst_en(dev, 0x01); - break; - - default: - BUG(); - } - - msm_spm_flush_shadow(dev, MSM_SPM_REG_SAW_SPM_CTL); - msm_spm_flush_shadow(dev, MSM_SPM_REG_SAW_SPM_PMIC_CTL); - msm_spm_flush_shadow(dev, MSM_SPM_REG_SAW_SLP_RST_EN); - /* Ensure that the registers are written before returning */ - mb(); - - dev->low_power_mode = mode; - dev->notify_rpm = notify_rpm; - dev->dirty = false; - - if (msm_spm_debug_mask & MSM_SPM_DEBUG_SHADOW) { - int i; - for (i = 0; i < MSM_SPM_REG_NR; i++) - pr_info("%s: reg %02x = 0x%08x\n", __func__, - msm_spm_reg_offsets[i], dev->reg_shadow[i]); - } - - return 0; -} - -/** - * msm_spm_set_vdd(): Set core voltage - * @cpu: core id - * @vlevel: Encoded PMIC data. - */ -int msm_spm_set_vdd(unsigned int cpu, unsigned int vlevel) -{ - struct msm_spm_device *dev; - uint32_t timeout_us; - - dev = &per_cpu(msm_spm_devices, cpu); - - if (msm_spm_debug_mask & MSM_SPM_DEBUG_VCTL) - pr_info("%s: requesting cpu %u vlevel 0x%x\n", - __func__, cpu, vlevel); - - msm_spm_set_vctl(dev, vlevel); - msm_spm_flush_shadow(dev, MSM_SPM_REG_SAW_VCTL); - - /* Wait for PMIC state to return to idle or until timeout */ - timeout_us = dev->vctl_timeout_us; - msm_spm_load_shadow(dev, MSM_SPM_REG_SAW_STS); - while (msm_spm_get_sts_pmic_state(dev) != MSM_SPM_PMIC_STATE_IDLE) { - if (!timeout_us) - goto set_vdd_bail; - - if (timeout_us > 10) { - udelay(10); - timeout_us -= 10; - } else { - udelay(timeout_us); - timeout_us = 0; - } - msm_spm_load_shadow(dev, MSM_SPM_REG_SAW_STS); - } - - if (msm_spm_get_sts_curr_pmic_data(dev) != vlevel) - goto set_vdd_bail; - - dev->awake_vlevel = vlevel; - dev->dirty = true; - - if (msm_spm_debug_mask & MSM_SPM_DEBUG_VCTL) - pr_info("%s: cpu %u done, remaining timeout %uus\n", - __func__, cpu, timeout_us); - - return 0; - -set_vdd_bail: - pr_err("%s: cpu %u failed, remaining timeout %uus, vlevel 0x%x\n", - __func__, cpu, timeout_us, msm_spm_get_sts_curr_pmic_data(dev)); - - return -EIO; -} - -/** - * msm_spm_get_vdd(): Get core voltage - * @cpu: core id - * @return: Returns encoded PMIC data. - */ -unsigned int msm_spm_get_vdd(unsigned int cpu) -{ - struct msm_spm_device *dev = &per_cpu(msm_spm_devices, cpu); - return dev->reg_shadow[MSM_SPM_REG_SAW_VCTL]; -} - -void msm_spm_reinit(void) -{ - struct msm_spm_device *dev = &__get_cpu_var(msm_spm_devices); - int i; - - for (i = 0; i < MSM_SPM_REG_NR_INITIALIZE; i++) - msm_spm_flush_shadow(dev, i); - - /* Ensure that the registers are written before returning */ - mb(); -} - -/** - * msm_spm_init(): Board initalization function - * @data: platform specific SPM register configuration data - * @nr_devs: Number of SPM devices being initialized - */ -int __init msm_spm_init(struct msm_spm_platform_data *data, int nr_devs) -{ - unsigned int cpu; - - BUG_ON(nr_devs < num_possible_cpus()); - for_each_possible_cpu(cpu) { - struct msm_spm_device *dev = &per_cpu(msm_spm_devices, cpu); - int i; - - dev->reg_base_addr = data[cpu].reg_base_addr; - memcpy(dev->reg_shadow, data[cpu].reg_init_values, - sizeof(data[cpu].reg_init_values)); - - dev->awake_vlevel = data[cpu].awake_vlevel; - dev->retention_vlevel = data[cpu].retention_vlevel; - dev->collapse_vlevel = data[cpu].collapse_vlevel; - dev->retention_mid_vlevel = data[cpu].retention_mid_vlevel; - dev->collapse_mid_vlevel = data[cpu].collapse_mid_vlevel; - dev->vctl_timeout_us = data[cpu].vctl_timeout_us; - - for (i = 0; i < MSM_SPM_REG_NR_INITIALIZE; i++) - msm_spm_flush_shadow(dev, i); - - /* Ensure that the registers are written before returning */ - mb(); - - dev->low_power_mode = MSM_SPM_MODE_CLOCK_GATING; - dev->notify_rpm = false; - dev->dirty = true; - } - - return 0; -} diff --git a/arch/arm/mach-msm/timer_page.c b/arch/arm/mach-msm/timer_page.c deleted file mode 100644 index 24d2a35ecbb9..000000000000 --- a/arch/arm/mach-msm/timer_page.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include "mach/socinfo.h" -#include "mach/msm_iomap.h" - -#include "timer.h" - -inline int get_timer_page_address(void) -{ - if (!use_user_accessible_timers()) - return ARM_USER_ACCESSIBLE_TIMERS_INVALID_PAGE; - - if (cpu_is_msm8960()) - return MSM8960_TMR0_PHYS; - else if (cpu_is_msm8930()) - return MSM8930_TMR0_PHYS; - else if (cpu_is_apq8064()) - return APQ8064_TMR0_PHYS; - else - return ARM_USER_ACCESSIBLE_TIMERS_INVALID_PAGE; -} -EXPORT_SYMBOL(get_timer_page_address); - diff --git a/arch/arm/mach-msm/vreg.c b/arch/arm/mach-msm/vreg.c deleted file mode 100644 index 11cfd5dca266..000000000000 --- a/arch/arm/mach-msm/vreg.c +++ /dev/null @@ -1,325 +0,0 @@ -/* arch/arm/mach-msm/vreg.c - * - * Copyright (C) 2008 Google, Inc. - * Copyright (c) 2009-2012 The Linux Foundation. All rights reserved. - * Author: Brian Swetland - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_MSM_VREG_SWITCH_INVERTED) -#define VREG_SWITCH_ENABLE 0 -#define VREG_SWITCH_DISABLE 1 -#else -#define VREG_SWITCH_ENABLE 1 -#define VREG_SWITCH_DISABLE 0 -#endif - -struct vreg { - struct list_head list; - struct mutex lock; - const char *name; - u64 refcnt; - unsigned mv; - struct regulator *reg; -}; - -static LIST_HEAD(vreg_list); -static DEFINE_MUTEX(vreg_lock); - -#ifdef CONFIG_DEBUG_FS -static void vreg_add_debugfs(struct vreg *vreg); -#else -static inline void vreg_add_debugfs(struct vreg *vreg) { } -#endif - -static struct vreg *vreg_create(const char *id) -{ - int rc; - struct vreg *vreg; - - vreg = kzalloc(sizeof(*vreg), GFP_KERNEL); - if (!vreg) { - rc = -ENOMEM; - goto error; - } - - INIT_LIST_HEAD(&vreg->list); - mutex_init(&vreg->lock); - - vreg->reg = regulator_get(NULL, id); - if (IS_ERR(vreg->reg)) { - rc = PTR_ERR(vreg->reg); - goto free_vreg; - } - - vreg->name = kstrdup(id, GFP_KERNEL); - if (!vreg->name) { - rc = -ENOMEM; - goto put_reg; - } - - list_add_tail(&vreg->list, &vreg_list); - vreg_add_debugfs(vreg); - - return vreg; - -put_reg: - regulator_put(vreg->reg); -free_vreg: - kfree(vreg); -error: - return ERR_PTR(rc); -} - -static void vreg_destroy(struct vreg *vreg) -{ - if (!vreg) - return; - - if (vreg->refcnt) - regulator_disable(vreg->reg); - - kfree(vreg->name); - regulator_put(vreg->reg); - kfree(vreg); -} - -struct vreg *vreg_get(struct device *dev, const char *id) -{ - struct vreg *vreg = NULL; - - if (!id) - return ERR_PTR(-EINVAL); - - mutex_lock(&vreg_lock); - list_for_each_entry(vreg, &vreg_list, list) { - if (!strncmp(vreg->name, id, 10)) - goto ret; - } - - vreg = vreg_create(id); - -ret: - mutex_unlock(&vreg_lock); - return vreg; -} -EXPORT_SYMBOL(vreg_get); - -void vreg_put(struct vreg *vreg) -{ - kfree(vreg->name); - regulator_put(vreg->reg); - list_del(&vreg->list); - kfree(vreg); -} - -int vreg_enable(struct vreg *vreg) -{ - int rc = 0; - if (!vreg) - return -ENODEV; - - mutex_lock(&vreg->lock); - if (vreg->refcnt == 0) { - rc = regulator_enable(vreg->reg); - if (!rc) - vreg->refcnt++; - } else { - rc = 0; - if (vreg->refcnt < UINT_MAX) - vreg->refcnt++; - } - mutex_unlock(&vreg->lock); - - return rc; -} -EXPORT_SYMBOL(vreg_enable); - -int vreg_disable(struct vreg *vreg) -{ - int rc = 0; - if (!vreg) - return -ENODEV; - - mutex_lock(&vreg->lock); - if (vreg->refcnt == 0) { - pr_warn("%s: unbalanced disables for vreg %s\n", - __func__, vreg->name); - rc = -EINVAL; - } else if (vreg->refcnt == 1) { - rc = regulator_disable(vreg->reg); - if (!rc) - vreg->refcnt--; - } else { - rc = 0; - vreg->refcnt--; - } - mutex_unlock(&vreg->lock); - - return rc; -} -EXPORT_SYMBOL(vreg_disable); - -int vreg_set_level(struct vreg *vreg, unsigned mv) -{ - unsigned uv; - int rc; - - if (!vreg) - return -EINVAL; - - if (mv > (UINT_MAX / 1000)) - return -ERANGE; - - uv = mv * 1000; - - mutex_lock(&vreg->lock); - rc = regulator_set_voltage(vreg->reg, uv, uv); - if (!rc) - vreg->mv = mv; - mutex_unlock(&vreg->lock); - - return rc; -} -EXPORT_SYMBOL(vreg_set_level); - -#if defined(CONFIG_DEBUG_FS) - -static int vreg_debug_enabled_set(void *data, u64 val) -{ - struct vreg *vreg = data; - - if (val == 0) - return vreg_disable(vreg); - else if (val == 1) - return vreg_enable(vreg); - else - return -EINVAL; -} - -static int vreg_debug_enabled_get(void *data, u64 *val) -{ - struct vreg *vreg = data; - - *val = vreg->refcnt; - - return 0; -} - -static int vreg_debug_voltage_set(void *data, u64 val) -{ - struct vreg *vreg = data; - return vreg_set_level(vreg, val); -} - -static int vreg_debug_voltage_get(void *data, u64 *val) -{ - struct vreg *vreg = data; - *val = vreg->mv; - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(vreg_debug_enabled, vreg_debug_enabled_get, - vreg_debug_enabled_set, "%llu"); -DEFINE_SIMPLE_ATTRIBUTE(vreg_debug_voltage, vreg_debug_voltage_get, - vreg_debug_voltage_set, "%llu"); - -static struct dentry *root; - -static void vreg_add_debugfs(struct vreg *vreg) -{ - struct dentry *dir; - - if (!root) - return; - - dir = debugfs_create_dir(vreg->name, root); - - if (IS_ERR_OR_NULL(dir)) - goto err; - - if (IS_ERR_OR_NULL(debugfs_create_file("enabled", 0644, dir, vreg, - &vreg_debug_enabled))) - goto destroy; - - if (IS_ERR_OR_NULL(debugfs_create_file("voltage", 0644, dir, vreg, - &vreg_debug_voltage))) - goto destroy; - - return; - -destroy: - debugfs_remove_recursive(dir); -err: - pr_warn("%s: could not create debugfs for vreg %s\n", - __func__, vreg->name); -} - -static int vreg_debug_init(void) -{ - root = debugfs_create_dir("vreg", NULL); - - if (IS_ERR_OR_NULL(root)) { - pr_debug("%s: error initializing debugfs: %ld - " - "disabling debugfs\n", - __func__, root ? PTR_ERR(root) : 0); - root = NULL; - } - - return 0; -} -static void vreg_debug_exit(void) -{ - if (root) - debugfs_remove_recursive(root); - root = NULL; -} -#else -static inline int __init vreg_debug_init(void) { return 0; } -static inline void __exit vreg_debug_exit(void) { return 0; } -#endif - -static int __init vreg_init(void) -{ - return vreg_debug_init(); -} -module_init(vreg_init); - -static void __exit vreg_exit(void) -{ - struct vreg *vreg, *next; - vreg_debug_exit(); - - mutex_lock(&vreg_lock); - list_for_each_entry_safe(vreg, next, &vreg_list, list) - vreg_destroy(vreg); - mutex_unlock(&vreg_lock); -} -module_exit(vreg_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("vreg.c regulator shim"); -MODULE_VERSION("1.0"); diff --git a/arch/arm/mach-msm/wallclk.c b/arch/arm/mach-msm/wallclk.c deleted file mode 100644 index 96247951ca18..000000000000 --- a/arch/arm/mach-msm/wallclk.c +++ /dev/null @@ -1,475 +0,0 @@ -/* Copyright (c) 2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "wallclk.h" - -#define WALLCLK_MODULE_NAME "wallclk" -#define WALLCLK_MODULE_NAME_LEN 10 - -#define FLAG_WALLCLK_INITED 0x1 -#define FLAG_WALLCLK_SFN_REF_SET 0x2 -#define FLAG_WALLCLK_ENABLED 0x4 - -#define WALLCLK_TIMER_INTERVAL_NS 100000 - -#define WALLCLK_SHARED_MEM_SIZE 1024 -#define ALIGN_64(addr) (((addr) + 7) & ~0x7) - -#define GPS_EPOCH_DIFF 315964800 - -struct wallclk_cnt { - u32 pulse; - u32 clk; -}; - -struct wallclk_reg { - u32 ctrl; - u32 pulse_cnt; - u32 snapshot_clock_cnt; - u32 clock_cnt; - u32 __unused__[5]; - u32 base_time0; - u32 base_time1; -}; - -struct wallclk_sm { - struct wallclk_reg reg; - u32 sfn_ref; -}; - -struct wallclk_cfg { - u32 ppns; - u32 clk_rate; - u32 clk_rate_v; /* clk_rate = clk_rate_v x clk_rate_p */ - u32 clk_rate_p; /* power of 10 */ - u32 ns_per_clk_rate_v; -}; - -struct wallclk { - struct wallclk_sm *shm; - - struct wallclk_cfg cfg; - - struct timespec tv; - - struct hrtimer timer; - ktime_t interval; - - spinlock_t lock; - u32 flags; - - char name[WALLCLK_MODULE_NAME_LEN]; -}; - -static struct wallclk wall_clk; - -static inline int is_valid_register(u32 offset) -{ - int rc = 0; - - switch (offset) { - case CTRL_REG_OFFSET: - case PULSE_CNT_REG_OFFSET: - case CLK_CNT_SNAPSHOT_REG_OFFSET: - case CLK_CNT_REG_OFFSET: - case CLK_BASE_TIME0_OFFSET: - case CLK_BASE_TIME1_OFFSET: - rc = 1; - break; - default: - break; - } - return rc; -} - -static inline void wallclk_ctrl_reg_set(struct wallclk *wclk, u32 v) -{ - struct wallclk_reg *reg = &wclk->shm->reg; - - if (v & CTRL_ENABLE_MASK) { - if (!(wclk->flags & FLAG_WALLCLK_ENABLED)) { - getnstimeofday(&wclk->tv); - __raw_writel(0, ®->snapshot_clock_cnt); - __raw_writel(0, ®->clock_cnt); - __raw_writel(0, ®->pulse_cnt); - hrtimer_start(&wclk->timer, - wclk->interval, - HRTIMER_MODE_REL); - wclk->flags |= FLAG_WALLCLK_ENABLED; - } - } else { - if (wclk->flags & FLAG_WALLCLK_ENABLED) { - hrtimer_cancel(&wclk->timer); - wclk->flags &= ~FLAG_WALLCLK_ENABLED; - } - } - - __raw_writel(v, ®->ctrl); -} - -static inline void wallclk_cfg_init(struct wallclk_cfg *cfg, - u32 ppns, - u32 clk_rate) -{ - cfg->ppns = ppns; - cfg->clk_rate = clk_rate; - cfg->clk_rate_v = clk_rate; - cfg->clk_rate_p = 1; - cfg->ns_per_clk_rate_v = 1000000000; - - while (!(cfg->clk_rate_v % 10)) { - cfg->clk_rate_v /= 10; - cfg->clk_rate_p *= 10; - cfg->ns_per_clk_rate_v /= 10; - } -} - -static inline struct timespec timestamp_convert(const struct timespec *tv) -{ - struct timespec rc; - - rc.tv_sec = tv->tv_sec - GPS_EPOCH_DIFF; - rc.tv_nsec = tv->tv_nsec; - - return rc; -} - -static inline void timespec_delta_to_wclk_cnt(const struct timespec *tv, - const struct wallclk_cfg *cfg, - struct wallclk_cnt *wclk_cnt) -{ - long ns; - - wclk_cnt->pulse = tv->tv_sec / cfg->ppns; - wclk_cnt->clk = (tv->tv_sec % cfg->ppns) * cfg->clk_rate; - - ns = tv->tv_nsec; - while (ns >= cfg->ns_per_clk_rate_v) { - ns -= cfg->ns_per_clk_rate_v; - wclk_cnt->clk += cfg->clk_rate_v; - } - - wclk_cnt->clk += (ns * cfg->clk_rate_v)/cfg->ns_per_clk_rate_v; -} - -static inline u32 wallclk_cnt_to_sfn(const struct wallclk_cnt *cnt, - const struct wallclk_cfg *cfg) -{ - u32 sfn; - u32 delta, p; - - sfn = SFN_PER_SECOND * cnt->pulse * cfg->ppns; - if (cfg->clk_rate_p > 100) { - p = cfg->clk_rate_p/100; - delta = cnt->clk/(cfg->clk_rate_v * p); - } else { - p = 100/cfg->clk_rate_p; - delta = (cnt->clk * p)/cfg->clk_rate_v; - } - sfn += delta; - - return sfn; -} - -static void update_wallclk(struct wallclk *wclk) -{ - struct timespec tv; - struct timespec delta_tv; - struct wallclk_cnt cnt; - struct wallclk_reg *reg = &wclk->shm->reg; - - spin_lock(&wclk->lock); - getnstimeofday(&tv); - delta_tv = timespec_sub(tv, wclk->tv); - timespec_delta_to_wclk_cnt(&delta_tv, &wclk->cfg, &cnt); - __raw_writel(cnt.pulse, ®->pulse_cnt); - __raw_writel(cnt.clk, ®->clock_cnt); - __raw_writel(cnt.clk, ®->snapshot_clock_cnt); - - spin_unlock(&wclk->lock); -} - -static int set_sfn(struct wallclk *wclk, u16 sfn) -{ - int rc = 0; - struct wallclk_reg *reg = &wclk->shm->reg; - u32 v; - struct timespec ts; - - if (sfn > MAX_SFN) { - rc = -EINVAL; - goto out; - } - - if (!(wclk->flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - spin_lock_bh(&wclk->lock); - - v = __raw_readl(®->ctrl); - wallclk_ctrl_reg_set(wclk, v & ~CTRL_ENABLE_MASK); - - getnstimeofday(&wclk->tv); - ts = timestamp_convert(&wclk->tv); - __raw_writel(ts.tv_sec, ®->base_time0); - __raw_writel(ts.tv_nsec, ®->base_time1); - - wclk->shm->sfn_ref = sfn; - wclk->flags |= FLAG_WALLCLK_SFN_REF_SET; - - __raw_writel(0, ®->pulse_cnt); - __raw_writel(0, ®->clock_cnt); - __raw_writel(0, ®->snapshot_clock_cnt); - hrtimer_start(&wclk->timer, wclk->interval, HRTIMER_MODE_REL); - wclk->flags |= FLAG_WALLCLK_ENABLED; - __raw_writel(v | CTRL_ENABLE_MASK, ®->ctrl); - - spin_unlock_bh(&wclk->lock); - -out: - return rc; -} - -static int get_sfn(struct wallclk *wclk) -{ - struct wallclk_cnt cnt; - int rc = 0; - u32 sfn; - - if (!(wclk->flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - spin_lock_bh(&wclk->lock); - - if (!(wclk->flags & FLAG_WALLCLK_ENABLED) || - !(wclk->flags & FLAG_WALLCLK_SFN_REF_SET)) { - rc = -EIO; - goto unlock; - } - - cnt.pulse = __raw_readl(&(wclk->shm->reg.pulse_cnt)); - cnt.clk = __raw_readl(&(wclk->shm->reg.clock_cnt)); - sfn = wallclk_cnt_to_sfn(&cnt, &wclk->cfg); - - sfn += wclk->shm->sfn_ref; - rc = sfn & MAX_SFN; - -unlock: - spin_unlock_bh(&wclk->lock); -out: - return rc; -} - -enum hrtimer_restart wallclk_timer_cb(struct hrtimer *timer) -{ - update_wallclk(&wall_clk); - hrtimer_forward_now(timer, wall_clk.interval); - return HRTIMER_RESTART; -} - -int wallclk_set_sfn(u16 sfn) -{ - return set_sfn(&wall_clk, sfn); -} -EXPORT_SYMBOL_GPL(wallclk_set_sfn); - -int wallclk_get_sfn(void) -{ - return get_sfn(&wall_clk); -} -EXPORT_SYMBOL_GPL(wallclk_get_sfn); - -int wallclk_set_sfn_ref(u16 sfn) -{ - int rc = 0; - - if (sfn > MAX_SFN) { - rc = -EINVAL; - goto out; - } - - if (!(wall_clk.flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - spin_lock_bh(&wall_clk.lock); - - wall_clk.shm->sfn_ref = sfn; - wall_clk.flags |= FLAG_WALLCLK_SFN_REF_SET; - - spin_unlock_bh(&wall_clk.lock); - -out: - return rc; -} -EXPORT_SYMBOL_GPL(wallclk_set_sfn_ref); - -int wallclk_get_sfn_ref(void) -{ - int rc = 0; - - if (!(wall_clk.flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - spin_lock_bh(&wall_clk.lock); - - if (!(wall_clk.flags & FLAG_WALLCLK_SFN_REF_SET)) { - rc = -EAGAIN; - goto unlock; - } - rc = wall_clk.shm->sfn_ref; - -unlock: - spin_unlock_bh(&wall_clk.lock); -out: - return rc; -} -EXPORT_SYMBOL_GPL(wallclk_get_sfn_ref); - -int wallclk_reg_read(u32 offset, u32 *p) -{ - int rc = 0; - - if (!(wall_clk.flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - if (!is_valid_register(offset)) { - rc = -EINVAL; - goto out; - } - - spin_lock_bh(&wall_clk.lock); - *p = __raw_readl((char *)&wall_clk.shm->reg + offset); - spin_unlock_bh(&wall_clk.lock); -out: - return rc; -} -EXPORT_SYMBOL_GPL(wallclk_reg_read); - -int wallclk_reg_write(u32 offset, u32 val) -{ - int rc = 0; - char *p; - - if (!(wall_clk.flags & FLAG_WALLCLK_INITED)) { - rc = -EIO; - goto out; - } - - p = (char *)&wall_clk.shm->reg; - - spin_lock_bh(&wall_clk.lock); - switch (offset) { - case CTRL_REG_OFFSET: - wallclk_ctrl_reg_set(&wall_clk, val); - break; - case PULSE_CNT_REG_OFFSET: - case CLK_BASE_TIME0_OFFSET: - case CLK_BASE_TIME1_OFFSET: - __raw_writel(val, p + offset); - break; - case CLK_CNT_REG_OFFSET: - __raw_writel(val, p + CLK_CNT_REG_OFFSET); - __raw_writel(val, p + CLK_CNT_SNAPSHOT_REG_OFFSET); - break; - case CLK_CNT_SNAPSHOT_REG_OFFSET: - rc = -EIO; - break; - default: - rc = -EINVAL; - break; - } - - spin_unlock_bh(&wall_clk.lock); -out: - return rc; -} -EXPORT_SYMBOL_GPL(wallclk_reg_write); - -static int __init wallclk_init(void) -{ - int rc = 0; - u32 addr; - - memset(&wall_clk, 0, sizeof(wall_clk)); - - addr = (u32)MSM_SHARED_RAM_BASE + MSM_SHARED_RAM_SIZE - - WALLCLK_SHARED_MEM_SIZE; - wall_clk.shm = (struct wallclk_sm *)ALIGN_64(addr); - - __raw_writel(0, &(wall_clk.shm->reg.ctrl)); - __raw_writel(0, &(wall_clk.shm->reg.pulse_cnt)); - __raw_writel(0, &(wall_clk.shm->reg.snapshot_clock_cnt)); - __raw_writel(0, &(wall_clk.shm->reg.clock_cnt)); - __raw_writel(0, &(wall_clk.shm->reg.clock_cnt)); - __raw_writel(0, &(wall_clk.shm->reg.base_time0)); - __raw_writel(0, &(wall_clk.shm->reg.base_time1)); - - wall_clk.shm->sfn_ref = 0; - - wallclk_cfg_init(&wall_clk.cfg, PPNS_PULSE, CLK_RATE); - - strlcpy(wall_clk.name, WALLCLK_MODULE_NAME, WALLCLK_MODULE_NAME_LEN); - - hrtimer_init(&wall_clk.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - wall_clk.timer.function = wallclk_timer_cb; - wall_clk.interval = ns_to_ktime(WALLCLK_TIMER_INTERVAL_NS); - spin_lock_init(&wall_clk.lock); - - wall_clk.flags |= FLAG_WALLCLK_INITED; - - printk(KERN_INFO "%s: clk_rate=%u ppns=%u clk_reg_addr=0x%x\n", - wall_clk.name, wall_clk.cfg.clk_rate, wall_clk.cfg.ppns, - (int)(&wall_clk.shm->reg)); - return rc; -} - -static void __exit wallclk_exit(void) -{ - if (wall_clk.flags & FLAG_WALLCLK_INITED) { - spin_lock_bh(&wall_clk.lock); - wallclk_ctrl_reg_set(&wall_clk, 0); - wall_clk.flags = 0; - spin_unlock_bh(&wall_clk.lock); - } -} - -module_init(wallclk_init); -module_exit(wallclk_exit); - -MODULE_DESCRIPTION("Wall clock"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/wallclk.h b/arch/arm/mach-msm/wallclk.h deleted file mode 100644 index 1794395da96a..000000000000 --- a/arch/arm/mach-msm/wallclk.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#ifndef _WALLCLK_H -#define _WALLCLK_H - -/* wallclock register offset */ -#define CTRL_REG_OFFSET 0x0 -#define PULSE_CNT_REG_OFFSET 0x4 -#define CLK_CNT_SNAPSHOT_REG_OFFSET 0x8 -#define CLK_CNT_REG_OFFSET 0xC -#define CLK_BASE_TIME0_OFFSET 0x24 -#define CLK_BASE_TIME1_OFFSET 0x28 - -/* ctrl register bitmap */ -#define CTRL_TIME_SRC_POS 0 -#define CTRL_TIME_SRC_MASK 0x0000000F -#define CTRL_SW_BITS_POS 4 -#define CTRL_SW_BITS_MASK 0x7FFFFFF0 -#define CTRL_ENA_DIS_POS 31 -#define CTRL_ENABLE_MASK 0x80000000 - -/* clock rate from time source */ -#define CLK_RATE 122880000 /* 122.88 Mhz */ -#define PPNS_PULSE 2 /* PP2S */ - -#define MAX_SFN 1023 -#define SFN_PER_SECOND 100 - -extern int wallclk_set_sfn(u16 sfn); -extern int wallclk_get_sfn(void); -extern int wallclk_set_sfn_ref(u16 sfn); -extern int wallclk_get_sfn_ref(void); -extern int wallclk_reg_read(u32 offset, u32 *p); -extern int wallclk_reg_write(u32 offset, u32 value); - -#endif /* _WALLCLK_H */ diff --git a/arch/arm/mach-msm/wallclk_sysfs.c b/arch/arm/mach-msm/wallclk_sysfs.c deleted file mode 100644 index 92741379785f..000000000000 --- a/arch/arm/mach-msm/wallclk_sysfs.c +++ /dev/null @@ -1,308 +0,0 @@ -/* Copyright (c) 2013, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wallclk.h" - -#define WALLCLK_SYSFS_MODULE_NAME "wallclk_sysfs" - -static struct kobject *wallclk_kobj; - -static ssize_t sfn_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - int rc; - - rc = wallclk_get_sfn(); - if (rc < 0) - return rc; - return snprintf(buf, 10, "%d\n", rc); -} - -static ssize_t sfn_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - u16 sfn; - int rc; - - if (kstrtou16(buf, 0, &sfn)) { - printk(KERN_ERR "%s: sfn input is not a valid u16 value\n", - WALLCLK_SYSFS_MODULE_NAME); - rc = -EINVAL; - goto out; - } - - rc = wallclk_set_sfn(sfn); - - if (rc) { - printk(KERN_ERR "%s: fail to set sfn\n", - WALLCLK_SYSFS_MODULE_NAME); - goto out; - } - rc = count; - -out: - return rc; -} - -static struct kobj_attribute sfn_attribute = - __ATTR(sfn, 0666, sfn_show, sfn_store); - -static ssize_t sfn_ref_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - int rc; - - rc = wallclk_get_sfn_ref(); - if (rc < 0) - return rc; - return snprintf(buf, 10, "%d\n", rc); -} - -static ssize_t sfn_ref_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - u16 sfn_ref; - int rc; - - if (kstrtou16(buf, 0, &sfn_ref)) { - printk(KERN_ERR "%s: sfn_ref input is not a valid u16 value\n", - WALLCLK_SYSFS_MODULE_NAME); - rc = -EINVAL; - goto out; - } - - rc = wallclk_set_sfn_ref(sfn_ref); - - if (rc) { - printk(KERN_ERR "%s: fail to set sfn_ref\n", - WALLCLK_SYSFS_MODULE_NAME); - goto out; - } - rc = count; - -out: - return rc; -} - -static struct kobj_attribute sfn_ref_attribute = - __ATTR(sfn_ref, 0666, sfn_ref_show, sfn_ref_store); - -static ssize_t reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf, - u32 offset) -{ - int rc; - u32 val; - - rc = wallclk_reg_read(offset, &val); - if (rc) - return rc; - - return snprintf(buf, 20, "%08x\n", val); -} - -static ssize_t reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - const size_t count, - u32 offset) -{ - u32 v; - int rc; - - if (kstrtou32(buf, 0, &v)) { - printk(KERN_ERR "%s: input is not a valid u32 value\n", - WALLCLK_SYSFS_MODULE_NAME); - rc = -EINVAL; - goto out; - } - - rc = wallclk_reg_write(offset, v); - - if (rc) { - printk(KERN_ERR "%s: fail to set register(offset=0x%x)\n", - WALLCLK_SYSFS_MODULE_NAME, offset); - goto out; - } - rc = count; - -out: - return rc; -} - -static ssize_t ctrl_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, CTRL_REG_OFFSET); -} - -static ssize_t ctrl_reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - const size_t count) -{ - return reg_store(kobj, attr, buf, count, CTRL_REG_OFFSET); -} - -static struct kobj_attribute ctrl_reg_attribute = - __ATTR(ctrl_reg, 0666, ctrl_reg_show, ctrl_reg_store); - -static ssize_t basetime0_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, CLK_BASE_TIME0_OFFSET); -} - -static ssize_t basetime0_reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - return reg_store(kobj, attr, buf, count, CLK_BASE_TIME0_OFFSET); -} - -static struct kobj_attribute basetime0_reg_attribute = - __ATTR(base_time0_reg, 0666, basetime0_reg_show, basetime0_reg_store); - -static ssize_t basetime1_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, CLK_BASE_TIME1_OFFSET); -} - -static ssize_t basetime1_reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - return reg_store(kobj, attr, buf, count, CLK_BASE_TIME1_OFFSET); -} - -static struct kobj_attribute basetime1_reg_attribute = - __ATTR(base_time1_reg, 0666, basetime1_reg_show, basetime1_reg_store); - -static ssize_t pulse_cnt_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, PULSE_CNT_REG_OFFSET); -} - -static ssize_t pulse_cnt_reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - return reg_store(kobj, attr, buf, count, PULSE_CNT_REG_OFFSET); -} - -static struct kobj_attribute pulse_cnt_reg_attribute = - __ATTR(pulse_cnt_reg, 0666, pulse_cnt_reg_show, pulse_cnt_reg_store); - -static ssize_t clk_cnt_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, CLK_CNT_REG_OFFSET); -} - -static ssize_t clk_cnt_reg_store(struct kobject *kobj, - struct kobj_attribute *attr, - const char *buf, - size_t count) -{ - return reg_store(kobj, attr, buf, count, CLK_CNT_REG_OFFSET); -} - -static struct kobj_attribute clk_cnt_reg_attribute = - __ATTR(clock_cnt_reg, 0666, clk_cnt_reg_show, clk_cnt_reg_store); - -static ssize_t clk_cnt_snapshot_reg_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -{ - return reg_show(kobj, attr, buf, CLK_CNT_SNAPSHOT_REG_OFFSET); -} - -static struct kobj_attribute clk_cnt_snapshot_reg_attribute = - __ATTR(clock_cnt_snapshot_reg, 0444, clk_cnt_snapshot_reg_show, NULL); - -static struct attribute *wallclk_attrs[] = { - &sfn_attribute.attr, - &sfn_ref_attribute.attr, - &ctrl_reg_attribute.attr, - &pulse_cnt_reg_attribute.attr, - &clk_cnt_snapshot_reg_attribute.attr, - &clk_cnt_reg_attribute.attr, - &basetime0_reg_attribute.attr, - &basetime1_reg_attribute.attr, - NULL -}; - -static struct attribute_group wallclk_attr_group = { - .attrs = wallclk_attrs, -}; - -static int __init wallclk_sysfs_init(void) -{ - int rc; - - wallclk_kobj = kobject_create_and_add("wallclk", kernel_kobj); - if (!wallclk_kobj) { - printk(KERN_ERR "%s: failed to create kobject\n", - WALLCLK_SYSFS_MODULE_NAME); - rc = -ENOMEM; - goto out; - } - - rc = sysfs_create_group(wallclk_kobj, &wallclk_attr_group); - if (rc) { - kobject_put(wallclk_kobj); - printk(KERN_ERR "%s: failed to create sysfs group\n", - WALLCLK_SYSFS_MODULE_NAME); - } - -out: - return rc; -} - -static void __exit wallclk_sysfs_exit(void) -{ - kobject_put(wallclk_kobj); -} - -module_init(wallclk_sysfs_init); -module_exit(wallclk_sysfs_exit); - -MODULE_DESCRIPTION("Wall clock SysFS"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/mach-msm/xo-fsm9xxx.c b/arch/arm/mach-msm/xo-fsm9xxx.c deleted file mode 100644 index fc9f9a1f9d26..000000000000 --- a/arch/arm/mach-msm/xo-fsm9xxx.c +++ /dev/null @@ -1,289 +0,0 @@ -/* Copyright (c) 2011, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "%s: " fmt, __func__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define FSM_XO_IOC_MAGIC 0x93 -#define FSM_XO_IOC_CLKBUF _IO(FSM_XO_IOC_MAGIC, 1) - -#define FSM_XO_DEVICE_READY 0x01 -#define FSM_XO_DEVICE_OFF 0x00 - -/* enum for TCXO clock output buffer definition */ -enum clk_buffer_type { - XO_BUFFER_A0 = 0, - XO_BUFFER_A1 = 1, - XO_BUFFER_LAST -}; - -/* - * This user request structure is used to exchange the pmic device data - * requested to user space applications. The pointer to this structure is - * passed to the the ioctl function. -*/ -struct fsm_xo_req { - enum clk_buffer_type clkBuffer; - u8 clkBufEnable; -}; - -struct fsm_xo_priv_t { - struct mutex lock; - struct regulator *a0; - struct regulator *a1; - u8 a0_enabled; - u8 a1_enabled; -}; - -static struct fsm_xo_priv_t *fsm_xo_priv; - -static int fsm_xo_open(struct inode *inode, struct file *filp) -{ - if (fsm_xo_priv == NULL) - return -ENODEV; - - filp->private_data = fsm_xo_priv; - - return 0; -} - -static int fsm_xo_release(struct inode *inode, struct file *filp) -{ - filp->private_data = NULL; - - return 0; -} - -static inline int fsm_xo_enable_a0(void) -{ - int err = 0; - - if (!fsm_xo_priv->a0_enabled) { - err = regulator_enable(fsm_xo_priv->a0); - if (err != 0) - pr_err("Error = %d enabling xo buffer a0\n", err); - else - fsm_xo_priv->a0_enabled = 1; - } - return err; -} - -static inline int fsm_xo_disable_a0(void) -{ - int err = 0; - - if (fsm_xo_priv->a0_enabled) { - err = regulator_disable(fsm_xo_priv->a0); - if (err != 0) - pr_err("Error = %d disabling xo buffer a0\n", err); - else - fsm_xo_priv->a0_enabled = 0; - } - return err; -} - -static inline int fsm_xo_enable_a1(void) -{ - int err = 0; - - if (!fsm_xo_priv->a1_enabled) { - err = regulator_enable(fsm_xo_priv->a1); - if (err != 0) - pr_err("Error = %d enabling xo buffer a1\n", err); - else - fsm_xo_priv->a1_enabled = 1; - } - return err; -} - -static inline int fsm_xo_disable_a1(void) -{ - int err = 0; - - if (fsm_xo_priv->a1_enabled) { - err = regulator_disable(fsm_xo_priv->a1); - if (err != 0) - pr_err("Error = %d disabling xo buffer a1\n", err); - else - fsm_xo_priv->a1_enabled = 0; - } - return err; -} -static long -fsm_xo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - int err = 0; - struct fsm_xo_req req; - - /* Verify user arguments. */ - if (_IOC_TYPE(cmd) != FSM_XO_IOC_MAGIC) - return -ENOTTY; - - /* Lock for access */ - if (mutex_lock_interruptible(&fsm_xo_priv->lock)) - return -ERESTARTSYS; - - switch (cmd) { - case FSM_XO_IOC_CLKBUF: - if (arg == 0) { - pr_err("user space arg not supplied\n"); - err = -EFAULT; - break; - } - - if (copy_from_user(&req, (void __user *)arg, - sizeof(req))) { - pr_err("Error copying from user space\n"); - err = -EFAULT; - break; - } - - if (req.clkBuffer == XO_BUFFER_A0) { - if (req.clkBufEnable) - err = fsm_xo_enable_a0(); - else - err = fsm_xo_disable_a0(); - } else if (req.clkBuffer == XO_BUFFER_A1) { - if (req.clkBufEnable) - err = fsm_xo_enable_a1(); - else - err = fsm_xo_disable_a1(); - } else { - pr_err("Invalid ioctl argument.\n"); - err = -ENOTTY; - } - break; - default: - pr_err("Invalid ioctl command.\n"); - err = -ENOTTY; - break; - } - - mutex_unlock(&fsm_xo_priv->lock); - return err; -} - -static const struct file_operations fsm_xo_fops = { - .owner = THIS_MODULE, - .unlocked_ioctl = fsm_xo_ioctl, - .open = fsm_xo_open, - .release = fsm_xo_release -}; - -static struct miscdevice fsm_xo_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "fsm_xo", - .fops = &fsm_xo_fops -}; - -static int fsm_xo_probe(struct platform_device *pdev) -{ - int ret = 0; - - /* Initialize */ - fsm_xo_priv = kzalloc(sizeof(struct fsm_xo_priv_t), GFP_KERNEL); - - if (fsm_xo_priv == NULL) { - pr_alert("Not enough memory to initialize device\n"); - return -ENOMEM; - } - - fsm_xo_priv->a0 = regulator_get(&pdev->dev, "a0_clk_buffer"); - if (IS_ERR(fsm_xo_priv->a0)) { - pr_err("Error getting a0_clk_buffer\n"); - ret = PTR_ERR(fsm_xo_priv->a0); - fsm_xo_priv->a0 = NULL; - goto err; - } - fsm_xo_priv->a1 = regulator_get(&pdev->dev, "a1_clk_buffer"); - if (IS_ERR(fsm_xo_priv->a1)) { - pr_err("Error getting a1_clk_buffer\n"); - ret = PTR_ERR(fsm_xo_priv->a1); - fsm_xo_priv->a1 = NULL; - goto err; - } - - fsm_xo_priv->a0_enabled = 0; - fsm_xo_priv->a1_enabled = 0; - - /* Enable the clock buffers. AMSS depends on this on the FSM. */ - fsm_xo_enable_a0(); - fsm_xo_enable_a1(); - - mutex_init(&fsm_xo_priv->lock); - - ret = misc_register(&fsm_xo_dev); - if (ret < 0) - goto err; - - return 0; - -err: - if (fsm_xo_priv->a0) - regulator_put(fsm_xo_priv->a0); - if (fsm_xo_priv->a1) - regulator_put(fsm_xo_priv->a1); - - kfree(fsm_xo_priv); - fsm_xo_priv = NULL; - - return ret; -} - -static int fsm_xo_remove(struct platform_device *pdev) -{ - if (fsm_xo_priv && fsm_xo_priv->a0) - regulator_put(fsm_xo_priv->a0); - if (fsm_xo_priv && fsm_xo_priv->a1) - regulator_put(fsm_xo_priv->a1); - - kfree(fsm_xo_priv); - fsm_xo_priv = NULL; - - misc_deregister(&fsm_xo_dev); - return 0; -} - -static struct platform_driver fsm_xo_driver = { - .probe = fsm_xo_probe, - .remove = fsm_xo_remove, - .driver = { - .name = "fsm_xo_driver", - } -}; - -static int __init fsm_xo_init(void) -{ - return platform_driver_register(&fsm_xo_driver); -} - -static void __exit fsm_xo_exit(void) -{ - platform_driver_unregister(&fsm_xo_driver); -} - -module_init(fsm_xo_init); -module_exit(fsm_xo_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Provide userspace access to XO buffers in PMIC8058."); -MODULE_VERSION("1.00"); -- GitLab